hgext3rd/evolve/stablesort.py
author Pierre-Yves David <pierre-yves.david@octobus.net>
Wed, 17 Apr 2019 20:54:28 +0200
branchstable
changeset 4524 f6099a171a9d
parent 4488 6c0992ce05f7
child 4715 12c8b24757f4
permissions -rw-r--r--
branching: merge 8.5.0 expected output in stable Upstream stable is now for mercurial 5.0
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
3243
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
     1
# Code dedicated to the computation of stable sorting
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
     2
#
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
     3
# These stable sorting are used stable ranges
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
     4
#
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
     5
# Copyright 2017 Pierre-Yves David <pierre-yves.david@ens-lyon.org>
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
     6
#
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
     7
# This software may be used and distributed according to the terms of the
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
     8
# GNU General Public License version 2 or any later version.
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
     9
3337
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
    10
import array
3243
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    11
import collections
3337
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
    12
import struct
3243
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    13
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    14
from mercurial import (
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    15
    commands,
3338
3f049353d733 stablesort: expose the cache through the repository
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3337
diff changeset
    16
    localrepo,
3246
543708c3f754 stablesort: add a 'method' argument to the debugstablesort command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3245
diff changeset
    17
    error,
3243
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    18
    node as nodemod,
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    19
    scmutil,
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    20
)
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    21
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    22
from mercurial.i18n import _
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    23
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    24
from . import (
3408
f4ea9652661d cachevfs: use a compatibility later for all access
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3366
diff changeset
    25
    compat,
3243
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    26
    depthcache,
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    27
    exthelper,
3311
df399e00c10b stablesort: use the filtered parents utility
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3300
diff changeset
    28
    utility,
3337
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
    29
    genericcaches,
3243
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    30
)
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    31
3311
df399e00c10b stablesort: use the filtered parents utility
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3300
diff changeset
    32
filterparents = utility.filterparents
df399e00c10b stablesort: use the filtered parents utility
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3300
diff changeset
    33
3243
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    34
eh = exthelper.exthelper()
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    35
3254
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
    36
def _mergepoint_tie_breaker(repo):
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
    37
    """the key use to tie break merge parent
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
    38
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
    39
    Exists as a function to help playing with different approaches.
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
    40
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
    41
    Possible other factor are:
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
    42
        * depth of node,
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
    43
        * number of exclusive merges,
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
    44
        * number of jump points.
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
    45
        * <insert-your-idea>
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
    46
    """
3322
20b6dae466a7 stablesort: use 'depth' in mergepoint tie breaker
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3321
diff changeset
    47
    node = repo.changelog.node
20b6dae466a7 stablesort: use 'depth' in mergepoint tie breaker
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3321
diff changeset
    48
    depth = repo.depthcache.get
20b6dae466a7 stablesort: use 'depth' in mergepoint tie breaker
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3321
diff changeset
    49
20b6dae466a7 stablesort: use 'depth' in mergepoint tie breaker
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3321
diff changeset
    50
    def key(rev):
20b6dae466a7 stablesort: use 'depth' in mergepoint tie breaker
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3321
diff changeset
    51
        return (-depth(rev), node(rev))
20b6dae466a7 stablesort: use 'depth' in mergepoint tie breaker
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3321
diff changeset
    52
    return key
3254
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
    53
3243
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    54
@eh.command(
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    55
    'debugstablesort',
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    56
    [
3246
543708c3f754 stablesort: add a 'method' argument to the debugstablesort command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3245
diff changeset
    57
        ('r', 'rev', [], 'heads to start from'),
3255
bb3f8c8c1232 stablesort: introduce a mergepoint based method focused on head
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3254
diff changeset
    58
        ('', 'method', 'branchpoint', "method used for sorting, one of: "
bb3f8c8c1232 stablesort: introduce a mergepoint based method focused on head
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3254
diff changeset
    59
         "branchpoint, basic-mergepoint and basic-headstart"),
3256
c82a2632327e stablesort: add a --limit argument
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3255
diff changeset
    60
        ('l', 'limit', '', 'number of revision display (default to all)')
3243
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    61
    ] + commands.formatteropts,
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    62
    _(''))
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    63
def debugstablesort(ui, repo, **opts):
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    64
    """display the ::REVS set topologically sorted in a stable way
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    65
    """
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    66
    revs = scmutil.revrange(repo, opts['rev'])
3246
543708c3f754 stablesort: add a 'method' argument to the debugstablesort command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3245
diff changeset
    67
543708c3f754 stablesort: add a 'method' argument to the debugstablesort command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3245
diff changeset
    68
    method = opts['method']
543708c3f754 stablesort: add a 'method' argument to the debugstablesort command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3245
diff changeset
    69
    sorting = _methodmap.get(method)
543708c3f754 stablesort: add a 'method' argument to the debugstablesort command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3245
diff changeset
    70
    if sorting is None:
543708c3f754 stablesort: add a 'method' argument to the debugstablesort command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3245
diff changeset
    71
        valid_method = ', '.join(sorted(_methodmap))
543708c3f754 stablesort: add a 'method' argument to the debugstablesort command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3245
diff changeset
    72
        raise error.Abort('unknown sorting method: "%s"' % method,
543708c3f754 stablesort: add a 'method' argument to the debugstablesort command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3245
diff changeset
    73
                          hint='pick one of: %s' % valid_method)
543708c3f754 stablesort: add a 'method' argument to the debugstablesort command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3245
diff changeset
    74
3483
f03845bfd015 compat: add wrapper for logcmdutil functions
Yuya Nishihara <yuya@tcha.org>
parents: 3408
diff changeset
    75
    displayer = compat.changesetdisplayer(ui, repo, opts, buffered=True)
3256
c82a2632327e stablesort: add a --limit argument
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3255
diff changeset
    76
    kwargs = {}
c82a2632327e stablesort: add a --limit argument
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3255
diff changeset
    77
    if opts['limit']:
c82a2632327e stablesort: add a --limit argument
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3255
diff changeset
    78
        kwargs['limit'] = int(opts['limit'])
c82a2632327e stablesort: add a --limit argument
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3255
diff changeset
    79
    for r in sorting(repo, revs, **kwargs):
3243
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    80
        ctx = repo[r]
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    81
        displayer.show(ctx)
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    82
        displayer.flush(ctx)
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    83
    displayer.close()
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    84
3245
63d58f7db120 stablesort: rename function to stablesort_branchpoint
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3243
diff changeset
    85
def stablesort_branchpoint(repo, revs, mergecallback=None):
3243
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    86
    """return '::revs' topologically sorted in "stable" order
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    87
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    88
    This is a depth first traversal starting from 'nullrev', using node as a
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    89
    tie breaker.
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    90
    """
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    91
    # Various notes:
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    92
    #
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    93
    # * Bitbucket is used dates as tie breaker, that might be a good idea.
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    94
    #
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    95
    # * It seemds we can traverse in the same order from (one) head to bottom,
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    96
    #   if we the following record data for each merge:
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    97
    #
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    98
    #  - highest (stablesort-wise) common ancestors,
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    99
    #  - order of parents (tablesort-wise)
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   100
    cl = repo.changelog
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   101
    parents = cl.parentrevs
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   102
    nullrev = nodemod.nullrev
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   103
    n = cl.node
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   104
    # step 1: We need a parents -> children mapping for 2 reasons.
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   105
    #
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   106
    # * we build the order from nullrev to tip
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   107
    #
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   108
    # * we need to detect branching
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   109
    children = collections.defaultdict(list)
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   110
    for r in cl.ancestors(revs, inclusive=True):
3311
df399e00c10b stablesort: use the filtered parents utility
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3300
diff changeset
   111
        ps = filterparents(parents(r))
df399e00c10b stablesort: use the filtered parents utility
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3300
diff changeset
   112
        if not ps:
df399e00c10b stablesort: use the filtered parents utility
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3300
diff changeset
   113
            children[nullrev].append(r)
df399e00c10b stablesort: use the filtered parents utility
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3300
diff changeset
   114
        for p in ps:
df399e00c10b stablesort: use the filtered parents utility
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3300
diff changeset
   115
            children[p].append(r)
3243
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   116
    # step two: walk back up
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   117
    # * pick lowest node in case of branching
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   118
    # * stack disregarded part of the branching
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   119
    # * process merge when both parents are yielded
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   120
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   121
    # track what changeset has been
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   122
    seen = [0] * (max(revs) + 2)
3311
df399e00c10b stablesort: use the filtered parents utility
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3300
diff changeset
   123
    seen[nullrev] = True # nullrev is known
3243
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   124
    # starts from repository roots
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   125
    # reuse the list form the mapping as we won't need it again anyway
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   126
    stack = children[nullrev]
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   127
    if not stack:
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   128
        return []
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   129
    if 1 < len(stack):
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   130
        stack.sort(key=n, reverse=True)
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   131
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   132
    # list of rev, maybe we should yield, but since we built a children mapping we are 'O(N)' already
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   133
    result = []
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   134
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   135
    current = stack.pop()
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   136
    while current is not None or stack:
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   137
        if current is None:
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   138
            # previous iteration reached a merge or an unready merge,
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   139
            current = stack.pop()
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   140
            if seen[current]:
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   141
                current = None
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   142
                continue
3311
df399e00c10b stablesort: use the filtered parents utility
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3300
diff changeset
   143
        ps = filterparents(parents(current))
df399e00c10b stablesort: use the filtered parents utility
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3300
diff changeset
   144
        if not all(seen[p] for p in ps):
3243
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   145
            # we can't iterate on this merge yet because other child is not
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   146
            # yielded yet (and we are topo sorting) we can discard it for now
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   147
            # because it will be reached from the other child.
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   148
            current = None
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   149
            continue
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   150
        assert not seen[current]
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   151
        seen[current] = True
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   152
        result.append(current) # could be yield, cf earlier comment
3311
df399e00c10b stablesort: use the filtered parents utility
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3300
diff changeset
   153
        if mergecallback is not None and 2 <= len(ps):
3243
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   154
            mergecallback(result, current)
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   155
        cs = children[current]
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   156
        if not cs:
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   157
            current = None
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   158
        elif 1 == len(cs):
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   159
            current = cs[0]
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   160
        else:
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   161
            cs.sort(key=n, reverse=True)
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   162
            current = cs.pop() # proceed on smallest
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   163
            stack.extend(cs)   # stack the rest for later
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   164
    assert len(result) == len(set(result))
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   165
    return result
3246
543708c3f754 stablesort: add a 'method' argument to the debugstablesort command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3245
diff changeset
   166
3254
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   167
def stablesort_mergepoint_multirevs(repo, revs):
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   168
    """return '::revs' topologically sorted in "stable" order
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   169
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   170
    This is a depth first traversal starting from 'revs' (toward root), using node as a
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   171
    tie breaker.
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   172
    """
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   173
    cl = repo.changelog
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   174
    tiebreaker = _mergepoint_tie_breaker(repo)
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   175
    if not revs:
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   176
        return []
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   177
    elif len(revs) == 1:
3857
9672de8055cd stablesort: make sure heads are processed in sorted order
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3504
diff changeset
   178
        heads = list(sorted(revs))
3254
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   179
    else:
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   180
        # keeps heads only
3857
9672de8055cd stablesort: make sure heads are processed in sorted order
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3504
diff changeset
   181
        heads = sorted(repo.revs('sort(heads(%ld::%ld))', revs, revs), key=tiebreaker)
3254
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   182
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   183
    results = []
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   184
    while heads:
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   185
        h = heads.pop()
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   186
        if revs:
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   187
            bound = cl.findmissingrevs(common=heads, heads=[h])
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   188
        else:
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   189
            bound = cl.ancestors([h], inclusive=True)
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   190
        results.append(stablesort_mergepoint_bounded(repo, h, bound))
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   191
    if len(results) == 1:
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   192
        return results[0]
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   193
    finalresults = []
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   194
    for r in results[::-1]:
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   195
        finalresults.extend(r)
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   196
    return finalresults
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   197
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   198
def stablesort_mergepoint_bounded(repo, head, revs):
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   199
    """return 'revs' topologically sorted in "stable" order.
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   200
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   201
    The 'revs' set MUST have 'head' as its one and unique head.
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   202
    """
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   203
    # Various notes:
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   204
    #
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   205
    # * Bitbucket is using dates as tie breaker, that might be a good idea.
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   206
    cl = repo.changelog
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   207
    parents = cl.parentrevs
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   208
    nullrev = nodemod.nullrev
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   209
    tiebreaker = _mergepoint_tie_breaker(repo)
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   210
    # step 1: We need a parents -> children mapping to detect dependencies
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   211
    children = collections.defaultdict(set)
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   212
    parentmap = {}
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   213
    for r in revs:
3311
df399e00c10b stablesort: use the filtered parents utility
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3300
diff changeset
   214
        ps = filterparents(parents(r))
df399e00c10b stablesort: use the filtered parents utility
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3300
diff changeset
   215
        if 2 <= len(ps):
df399e00c10b stablesort: use the filtered parents utility
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3300
diff changeset
   216
            ps = tuple(sorted(ps, key=tiebreaker))
df399e00c10b stablesort: use the filtered parents utility
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3300
diff changeset
   217
        parentmap[r] = ps
df399e00c10b stablesort: use the filtered parents utility
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3300
diff changeset
   218
        for p in ps:
df399e00c10b stablesort: use the filtered parents utility
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3300
diff changeset
   219
            children[p].add(r)
df399e00c10b stablesort: use the filtered parents utility
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3300
diff changeset
   220
        if not ps:
df399e00c10b stablesort: use the filtered parents utility
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3300
diff changeset
   221
            children[nullrev].add(r)
3254
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   222
    # step two: walk again,
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   223
    stack = [head]
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   224
    resultset = set()
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   225
    result = []
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   226
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   227
    def add(current):
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   228
        resultset.add(current)
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   229
        result.append(current)
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   230
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   231
    while stack:
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   232
        current = stack.pop()
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   233
        add(current)
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   234
        parents = parentmap[current]
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   235
        for p in parents:
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   236
            if 1 < len(children[p]) and not children[p].issubset(resultset):
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   237
                # we need other children to be yield first
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   238
                continue
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   239
            if p in revs:
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   240
                stack.append(p)
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   241
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   242
    result.reverse()
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   243
    assert len(result) == len(resultset)
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   244
    return result
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   245
3256
c82a2632327e stablesort: add a --limit argument
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3255
diff changeset
   246
def stablesort_mergepoint_head_basic(repo, revs, limit=None):
3857
9672de8055cd stablesort: make sure heads are processed in sorted order
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3504
diff changeset
   247
    heads = repo.revs('sort(heads(%ld))', revs)
3255
bb3f8c8c1232 stablesort: introduce a mergepoint based method focused on head
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3254
diff changeset
   248
    if not heads:
bb3f8c8c1232 stablesort: introduce a mergepoint based method focused on head
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3254
diff changeset
   249
        return []
bb3f8c8c1232 stablesort: introduce a mergepoint based method focused on head
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3254
diff changeset
   250
    elif 2 < len(heads):
bb3f8c8c1232 stablesort: introduce a mergepoint based method focused on head
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3254
diff changeset
   251
        raise error.Abort('cannot use head based merging, %d heads found'
bb3f8c8c1232 stablesort: introduce a mergepoint based method focused on head
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3254
diff changeset
   252
                          % len(heads))
bb3f8c8c1232 stablesort: introduce a mergepoint based method focused on head
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3254
diff changeset
   253
    head = heads.first()
3256
c82a2632327e stablesort: add a --limit argument
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3255
diff changeset
   254
    revs = stablesort_mergepoint_bounded(repo, head, repo.revs('::%d', head))
c82a2632327e stablesort: add a --limit argument
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3255
diff changeset
   255
    if limit is None:
c82a2632327e stablesort: add a --limit argument
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3255
diff changeset
   256
        return revs
c82a2632327e stablesort: add a --limit argument
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3255
diff changeset
   257
    return revs[-limit:]
3255
bb3f8c8c1232 stablesort: introduce a mergepoint based method focused on head
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3254
diff changeset
   258
3262
774f69d74ec2 stablesort: start implementing more advanced version of headstart sorting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3256
diff changeset
   259
def stablesort_mergepoint_head_debug(repo, revs, limit=None):
3857
9672de8055cd stablesort: make sure heads are processed in sorted order
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3504
diff changeset
   260
    heads = repo.revs('sort(heads(%ld))', revs)
3262
774f69d74ec2 stablesort: start implementing more advanced version of headstart sorting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3256
diff changeset
   261
    if not heads:
774f69d74ec2 stablesort: start implementing more advanced version of headstart sorting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3256
diff changeset
   262
        return []
774f69d74ec2 stablesort: start implementing more advanced version of headstart sorting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3256
diff changeset
   263
    elif 2 < len(heads):
774f69d74ec2 stablesort: start implementing more advanced version of headstart sorting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3256
diff changeset
   264
        raise error.Abort('cannot use head based merging, %d heads found'
774f69d74ec2 stablesort: start implementing more advanced version of headstart sorting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3256
diff changeset
   265
                          % len(heads))
774f69d74ec2 stablesort: start implementing more advanced version of headstart sorting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3256
diff changeset
   266
    head = heads.first()
774f69d74ec2 stablesort: start implementing more advanced version of headstart sorting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3256
diff changeset
   267
    revs = stablesort_mergepoint_head(repo, head)
774f69d74ec2 stablesort: start implementing more advanced version of headstart sorting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3256
diff changeset
   268
    if limit is None:
774f69d74ec2 stablesort: start implementing more advanced version of headstart sorting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3256
diff changeset
   269
        return revs
774f69d74ec2 stablesort: start implementing more advanced version of headstart sorting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3256
diff changeset
   270
    return revs[-limit:]
774f69d74ec2 stablesort: start implementing more advanced version of headstart sorting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3256
diff changeset
   271
774f69d74ec2 stablesort: start implementing more advanced version of headstart sorting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3256
diff changeset
   272
def stablesort_mergepoint_head(repo, head):
774f69d74ec2 stablesort: start implementing more advanced version of headstart sorting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3256
diff changeset
   273
    """return '::rev' topologically sorted in "stable" order
774f69d74ec2 stablesort: start implementing more advanced version of headstart sorting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3256
diff changeset
   274
774f69d74ec2 stablesort: start implementing more advanced version of headstart sorting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3256
diff changeset
   275
    This is a depth first traversal starting from 'rev' (toward root), using node as a
774f69d74ec2 stablesort: start implementing more advanced version of headstart sorting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3256
diff changeset
   276
    tie breaker.
774f69d74ec2 stablesort: start implementing more advanced version of headstart sorting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3256
diff changeset
   277
    """
774f69d74ec2 stablesort: start implementing more advanced version of headstart sorting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3256
diff changeset
   278
    cl = repo.changelog
774f69d74ec2 stablesort: start implementing more advanced version of headstart sorting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3256
diff changeset
   279
    parents = cl.parentrevs
774f69d74ec2 stablesort: start implementing more advanced version of headstart sorting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3256
diff changeset
   280
    tiebreaker = _mergepoint_tie_breaker(repo)
774f69d74ec2 stablesort: start implementing more advanced version of headstart sorting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3256
diff changeset
   281
774f69d74ec2 stablesort: start implementing more advanced version of headstart sorting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3256
diff changeset
   282
    top = [head]
774f69d74ec2 stablesort: start implementing more advanced version of headstart sorting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3256
diff changeset
   283
    mid = []
774f69d74ec2 stablesort: start implementing more advanced version of headstart sorting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3256
diff changeset
   284
    bottom = []
774f69d74ec2 stablesort: start implementing more advanced version of headstart sorting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3256
diff changeset
   285
3311
df399e00c10b stablesort: use the filtered parents utility
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3300
diff changeset
   286
    ps = filterparents(parents(head))
3262
774f69d74ec2 stablesort: start implementing more advanced version of headstart sorting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3256
diff changeset
   287
    while len(ps) == 1:
774f69d74ec2 stablesort: start implementing more advanced version of headstart sorting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3256
diff changeset
   288
        top.append(ps[0])
3311
df399e00c10b stablesort: use the filtered parents utility
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3300
diff changeset
   289
        ps = filterparents(parents(ps[0]))
3262
774f69d74ec2 stablesort: start implementing more advanced version of headstart sorting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3256
diff changeset
   290
    top.reverse()
774f69d74ec2 stablesort: start implementing more advanced version of headstart sorting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3256
diff changeset
   291
    if len(ps) == 2:
3313
efceae0bfa35 stablesort: avoid attempting to sort a tuple
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3311
diff changeset
   292
        ps = sorted(ps, key=tiebreaker)
3262
774f69d74ec2 stablesort: start implementing more advanced version of headstart sorting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3256
diff changeset
   293
774f69d74ec2 stablesort: start implementing more advanced version of headstart sorting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3256
diff changeset
   294
        # get the part from the highest parent. This is the part that changes
774f69d74ec2 stablesort: start implementing more advanced version of headstart sorting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3256
diff changeset
   295
        mid_revs = repo.revs('only(%d, %d)', ps[1], ps[0])
774f69d74ec2 stablesort: start implementing more advanced version of headstart sorting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3256
diff changeset
   296
        if mid_revs:
774f69d74ec2 stablesort: start implementing more advanced version of headstart sorting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3256
diff changeset
   297
            mid = stablesort_mergepoint_bounded(repo, ps[1], mid_revs)
774f69d74ec2 stablesort: start implementing more advanced version of headstart sorting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3256
diff changeset
   298
774f69d74ec2 stablesort: start implementing more advanced version of headstart sorting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3256
diff changeset
   299
        # And follow up with part othe parent we can inherit from
3314
110202a00de2 stablesort: fix head start computation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3313
diff changeset
   300
        bottom = stablesort_mergepoint_head(repo, ps[0])
3262
774f69d74ec2 stablesort: start implementing more advanced version of headstart sorting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3256
diff changeset
   301
774f69d74ec2 stablesort: start implementing more advanced version of headstart sorting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3256
diff changeset
   302
    return bottom + mid + top
774f69d74ec2 stablesort: start implementing more advanced version of headstart sorting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3256
diff changeset
   303
3263
07678f7a4481 stablesort: introduce a cache object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3262
diff changeset
   304
def stablesort_mergepoint_head_cached(repo, revs, limit=None):
3857
9672de8055cd stablesort: make sure heads are processed in sorted order
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3504
diff changeset
   305
    heads = repo.revs('sort(heads(%ld))', revs)
3263
07678f7a4481 stablesort: introduce a cache object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3262
diff changeset
   306
    if not heads:
07678f7a4481 stablesort: introduce a cache object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3262
diff changeset
   307
        return []
07678f7a4481 stablesort: introduce a cache object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3262
diff changeset
   308
    elif 2 < len(heads):
07678f7a4481 stablesort: introduce a cache object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3262
diff changeset
   309
        raise error.Abort('cannot use head based merging, %d heads found'
07678f7a4481 stablesort: introduce a cache object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3262
diff changeset
   310
                          % len(heads))
07678f7a4481 stablesort: introduce a cache object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3262
diff changeset
   311
    head = heads.first()
07678f7a4481 stablesort: introduce a cache object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3262
diff changeset
   312
    cache = stablesortcache()
3315
c153441cdc0e stablesort: record, cache and reuse jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3314
diff changeset
   313
    first = list(cache.get(repo, head, limit=limit))
c153441cdc0e stablesort: record, cache and reuse jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3314
diff changeset
   314
    second = list(cache.get(repo, head, limit=limit))
c153441cdc0e stablesort: record, cache and reuse jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3314
diff changeset
   315
    if first != second:
c153441cdc0e stablesort: record, cache and reuse jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3314
diff changeset
   316
        repo.ui.warn('stablesort-cache: initial run different from re-run:\n'
c153441cdc0e stablesort: record, cache and reuse jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3314
diff changeset
   317
                     '    %s\n'
c153441cdc0e stablesort: record, cache and reuse jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3314
diff changeset
   318
                     '    %s\n' % (first, second))
c153441cdc0e stablesort: record, cache and reuse jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3314
diff changeset
   319
    return second
c153441cdc0e stablesort: record, cache and reuse jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3314
diff changeset
   320
3263
07678f7a4481 stablesort: introduce a cache object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3262
diff changeset
   321
class stablesortcache(object):
07678f7a4481 stablesort: introduce a cache object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3262
diff changeset
   322
3315
c153441cdc0e stablesort: record, cache and reuse jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3314
diff changeset
   323
    def __init__(self):
3325
83d2a2f3dc8f stablesort: use a regular dict for jumps
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3323
diff changeset
   324
        self._jumps = {}
3337
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   325
        super(stablesortcache, self).__init__()
3315
c153441cdc0e stablesort: record, cache and reuse jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3314
diff changeset
   326
3263
07678f7a4481 stablesort: introduce a cache object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3262
diff changeset
   327
    def get(self, repo, rev, limit=None):
3265
70b5bc95efbe stablesort: extract a '_revsfrom' method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3263
diff changeset
   328
        result = []
3300
2d49773a378b stablesort: make the iteration from head available to all
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3267
diff changeset
   329
        for r in self.walkfrom(repo, rev):
3265
70b5bc95efbe stablesort: extract a '_revsfrom' method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3263
diff changeset
   330
            result.append(r)
70b5bc95efbe stablesort: extract a '_revsfrom' method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3263
diff changeset
   331
            if limit is not None and limit <= len(result):
70b5bc95efbe stablesort: extract a '_revsfrom' method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3263
diff changeset
   332
                break
70b5bc95efbe stablesort: extract a '_revsfrom' method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3263
diff changeset
   333
        result.reverse()
70b5bc95efbe stablesort: extract a '_revsfrom' method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3263
diff changeset
   334
        return result
70b5bc95efbe stablesort: extract a '_revsfrom' method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3263
diff changeset
   335
3323
4a84947010a1 stablesort: expose the jumps sequence to other code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3322
diff changeset
   336
    def getjumps(self, repo, rev):
3334
db8feb404792 stablesort: abstract all cache access
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3329
diff changeset
   337
        if not self._hasjumpsdata(rev):
3358
81aae43ee0f1 stablesort: use parent filtering in a place we forgot to
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3352
diff changeset
   338
            parents = filterparents(repo.changelog.parentrevs(rev))
81aae43ee0f1 stablesort: use parent filtering in a place we forgot to
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3352
diff changeset
   339
            if len(parents) <= 1:
3334
db8feb404792 stablesort: abstract all cache access
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3329
diff changeset
   340
                self._setjumps(rev, None)
3326
8ebd31af1452 stablesort: warm jump cache more efficiently
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3325
diff changeset
   341
            else:
8ebd31af1452 stablesort: warm jump cache more efficiently
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3325
diff changeset
   342
                # merge ! warn the cache
8ebd31af1452 stablesort: warm jump cache more efficiently
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3325
diff changeset
   343
                tiebreaker = _mergepoint_tie_breaker(repo)
8ebd31af1452 stablesort: warm jump cache more efficiently
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3325
diff changeset
   344
                minparent = sorted(parents, key=tiebreaker)[0]
8ebd31af1452 stablesort: warm jump cache more efficiently
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3325
diff changeset
   345
                for r in self.walkfrom(repo, rev):
8ebd31af1452 stablesort: warm jump cache more efficiently
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3325
diff changeset
   346
                    if r == minparent:
8ebd31af1452 stablesort: warm jump cache more efficiently
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3325
diff changeset
   347
                        break
3334
db8feb404792 stablesort: abstract all cache access
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3329
diff changeset
   348
        return self._getjumps(rev)
db8feb404792 stablesort: abstract all cache access
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3329
diff changeset
   349
db8feb404792 stablesort: abstract all cache access
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3329
diff changeset
   350
    def _hasjumpsdata(self, rev):
db8feb404792 stablesort: abstract all cache access
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3329
diff changeset
   351
        return rev in self._jumps
db8feb404792 stablesort: abstract all cache access
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3329
diff changeset
   352
db8feb404792 stablesort: abstract all cache access
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3329
diff changeset
   353
    def _getjumps(self, rev):
db8feb404792 stablesort: abstract all cache access
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3329
diff changeset
   354
        return self._jumps.get(rev)
db8feb404792 stablesort: abstract all cache access
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3329
diff changeset
   355
db8feb404792 stablesort: abstract all cache access
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3329
diff changeset
   356
    def _setjumps(self, rev, jumps):
db8feb404792 stablesort: abstract all cache access
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3329
diff changeset
   357
        self._jumps[rev] = jumps
3323
4a84947010a1 stablesort: expose the jumps sequence to other code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3322
diff changeset
   358
3300
2d49773a378b stablesort: make the iteration from head available to all
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3267
diff changeset
   359
    def walkfrom(self, repo, head):
3267
f9206b009f48 stablesort: write a flat version of the algorithm
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3266
diff changeset
   360
        tiebreaker = _mergepoint_tie_breaker(repo)
f9206b009f48 stablesort: write a flat version of the algorithm
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3266
diff changeset
   361
        cl = repo.changelog
f9206b009f48 stablesort: write a flat version of the algorithm
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3266
diff changeset
   362
        parentsfunc = cl.parentrevs
3266
bc173e7f3b6f stablesort: simplify processing of non-merge changesets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3265
diff changeset
   363
bc173e7f3b6f stablesort: simplify processing of non-merge changesets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3265
diff changeset
   364
        def parents(rev):
3311
df399e00c10b stablesort: use the filtered parents utility
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3300
diff changeset
   365
            return filterparents(parentsfunc(rev))
3266
bc173e7f3b6f stablesort: simplify processing of non-merge changesets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3265
diff changeset
   366
3315
c153441cdc0e stablesort: record, cache and reuse jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3314
diff changeset
   367
        def oneparent(rev):
c153441cdc0e stablesort: record, cache and reuse jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3314
diff changeset
   368
            ps = parents(rev)
c153441cdc0e stablesort: record, cache and reuse jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3314
diff changeset
   369
            if not ps:
c153441cdc0e stablesort: record, cache and reuse jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3314
diff changeset
   370
                return None
c153441cdc0e stablesort: record, cache and reuse jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3314
diff changeset
   371
            if len(ps) == 1:
c153441cdc0e stablesort: record, cache and reuse jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3314
diff changeset
   372
                return ps[0]
c153441cdc0e stablesort: record, cache and reuse jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3314
diff changeset
   373
            return max(ps, key=tiebreaker)
c153441cdc0e stablesort: record, cache and reuse jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3314
diff changeset
   374
3266
bc173e7f3b6f stablesort: simplify processing of non-merge changesets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3265
diff changeset
   375
        current = head
3315
c153441cdc0e stablesort: record, cache and reuse jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3314
diff changeset
   376
        previous_current_1 = object()
c153441cdc0e stablesort: record, cache and reuse jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3314
diff changeset
   377
        previous_current_2 = object()
3267
f9206b009f48 stablesort: write a flat version of the algorithm
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3266
diff changeset
   378
f9206b009f48 stablesort: write a flat version of the algorithm
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3266
diff changeset
   379
        while current is not None:
3315
c153441cdc0e stablesort: record, cache and reuse jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3314
diff changeset
   380
            previous_current_2 = previous_current_1
c153441cdc0e stablesort: record, cache and reuse jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3314
diff changeset
   381
            previous_current_1 = current
c153441cdc0e stablesort: record, cache and reuse jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3314
diff changeset
   382
            assert previous_current_1 is not previous_current_2
c153441cdc0e stablesort: record, cache and reuse jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3314
diff changeset
   383
3334
db8feb404792 stablesort: abstract all cache access
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3329
diff changeset
   384
            jumps = self._getjumps(current)
3315
c153441cdc0e stablesort: record, cache and reuse jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3314
diff changeset
   385
            if jumps is not None:
c153441cdc0e stablesort: record, cache and reuse jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3314
diff changeset
   386
                # we have enough cached information to directly iterate over
c153441cdc0e stablesort: record, cache and reuse jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3314
diff changeset
   387
                # the exclusive size.
c153441cdc0e stablesort: record, cache and reuse jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3314
diff changeset
   388
                for j in jumps:
c153441cdc0e stablesort: record, cache and reuse jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3314
diff changeset
   389
                    jump_point = j[0]
c153441cdc0e stablesort: record, cache and reuse jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3314
diff changeset
   390
                    jump_dest = j[1]
c153441cdc0e stablesort: record, cache and reuse jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3314
diff changeset
   391
                    if current == jump_point:
c153441cdc0e stablesort: record, cache and reuse jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3314
diff changeset
   392
                        yield current
c153441cdc0e stablesort: record, cache and reuse jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3314
diff changeset
   393
                    else:
c153441cdc0e stablesort: record, cache and reuse jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3314
diff changeset
   394
                        while current != jump_point:
c153441cdc0e stablesort: record, cache and reuse jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3314
diff changeset
   395
                            yield current
c153441cdc0e stablesort: record, cache and reuse jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3314
diff changeset
   396
                            current = oneparent(current)
3321
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   397
                            assert current is not None
3315
c153441cdc0e stablesort: record, cache and reuse jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3314
diff changeset
   398
                        yield current
c153441cdc0e stablesort: record, cache and reuse jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3314
diff changeset
   399
                    current = jump_dest
3336
c42158efb64e stablesort: realign a misaligned continue
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3335
diff changeset
   400
                continue
3315
c153441cdc0e stablesort: record, cache and reuse jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3314
diff changeset
   401
3266
bc173e7f3b6f stablesort: simplify processing of non-merge changesets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3265
diff changeset
   402
            yield current
3267
f9206b009f48 stablesort: write a flat version of the algorithm
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3266
diff changeset
   403
f9206b009f48 stablesort: write a flat version of the algorithm
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3266
diff changeset
   404
            ps = parents(current)
f9206b009f48 stablesort: write a flat version of the algorithm
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3266
diff changeset
   405
            if not ps:
f9206b009f48 stablesort: write a flat version of the algorithm
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3266
diff changeset
   406
                current = None # break
f9206b009f48 stablesort: write a flat version of the algorithm
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3266
diff changeset
   407
            if len(ps) == 1:
f9206b009f48 stablesort: write a flat version of the algorithm
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3266
diff changeset
   408
                current = ps[0]
f9206b009f48 stablesort: write a flat version of the algorithm
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3266
diff changeset
   409
            elif len(ps) == 2:
f9206b009f48 stablesort: write a flat version of the algorithm
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3266
diff changeset
   410
                lower_parent, higher_parent = sorted(ps, key=tiebreaker)
f9206b009f48 stablesort: write a flat version of the algorithm
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3266
diff changeset
   411
3315
c153441cdc0e stablesort: record, cache and reuse jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3314
diff changeset
   412
                rev = current
c153441cdc0e stablesort: record, cache and reuse jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3314
diff changeset
   413
                jumps = []
3319
bacb44f4f33e stablesort: pass a jump recording function instead of a list
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3318
diff changeset
   414
3329
c056f125e17d stablesort: record previous segment size in the jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3328
diff changeset
   415
                def recordjump(source, destination, size):
c056f125e17d stablesort: record previous segment size in the jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3328
diff changeset
   416
                    jump = (source, destination, size)
3319
bacb44f4f33e stablesort: pass a jump recording function instead of a list
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3318
diff changeset
   417
                    jumps.append(jump)
3317
a950e6cc5e9e stablesort: clarify subcall to the exclusive side
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3315
diff changeset
   418
                process = self._process_exclusive_side
a950e6cc5e9e stablesort: clarify subcall to the exclusive side
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3315
diff changeset
   419
                for rev in process(lower_parent, higher_parent, cl, parents,
3319
bacb44f4f33e stablesort: pass a jump recording function instead of a list
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3318
diff changeset
   420
                                   tiebreaker, recordjump):
3267
f9206b009f48 stablesort: write a flat version of the algorithm
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3266
diff changeset
   421
                    yield rev
f9206b009f48 stablesort: write a flat version of the algorithm
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3266
diff changeset
   422
3328
ff262ae59541 stablesort: move jump recording inside the exclusive function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3326
diff changeset
   423
                if rev == current:
3329
c056f125e17d stablesort: record previous segment size in the jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3328
diff changeset
   424
                    recordjump(rev, lower_parent, 1)
3315
c153441cdc0e stablesort: record, cache and reuse jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3314
diff changeset
   425
3334
db8feb404792 stablesort: abstract all cache access
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3329
diff changeset
   426
                self._setjumps(current, jumps)
3315
c153441cdc0e stablesort: record, cache and reuse jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3314
diff changeset
   427
3267
f9206b009f48 stablesort: write a flat version of the algorithm
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3266
diff changeset
   428
                current = lower_parent
f9206b009f48 stablesort: write a flat version of the algorithm
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3266
diff changeset
   429
3317
a950e6cc5e9e stablesort: clarify subcall to the exclusive side
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3315
diff changeset
   430
    def _process_exclusive_side(self, lower, higher, cl, parents, tiebreaker,
3319
bacb44f4f33e stablesort: pass a jump recording function instead of a list
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3318
diff changeset
   431
                                recordjump):
3267
f9206b009f48 stablesort: write a flat version of the algorithm
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3266
diff changeset
   432
3317
a950e6cc5e9e stablesort: clarify subcall to the exclusive side
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3315
diff changeset
   433
        exclusive = cl.findmissingrevs(common=[lower], heads=[higher])
3267
f9206b009f48 stablesort: write a flat version of the algorithm
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3266
diff changeset
   434
3321
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   435
        def popready(stack):
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   436
            """pop the top most ready item in the list"""
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   437
            for idx in xrange(len(stack) - 1, -1, -1):
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   438
                if children[stack[idx]].issubset(seen):
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   439
                    return stack.pop(idx)
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   440
            return None
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   441
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   442
        hardstack = []
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   443
        previous = None
3267
f9206b009f48 stablesort: write a flat version of the algorithm
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3266
diff changeset
   444
        seen = set()
3321
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   445
        current = higher
3267
f9206b009f48 stablesort: write a flat version of the algorithm
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3266
diff changeset
   446
        children = collections.defaultdict(set)
3321
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   447
        bound = set(exclusive)
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   448
        if exclusive:
3267
f9206b009f48 stablesort: write a flat version of the algorithm
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3266
diff changeset
   449
            for r in exclusive:
f9206b009f48 stablesort: write a flat version of the algorithm
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3266
diff changeset
   450
                for p in parents(r):
f9206b009f48 stablesort: write a flat version of the algorithm
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3266
diff changeset
   451
                    children[p].add(r)
f9206b009f48 stablesort: write a flat version of the algorithm
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3266
diff changeset
   452
3321
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   453
            hardstack.append(higher)
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   454
        nextjump = False
3329
c056f125e17d stablesort: record previous segment size in the jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3328
diff changeset
   455
        size = 1 # take the merge point into account
3321
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   456
        while hardstack:
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   457
            current = popready(hardstack)
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   458
            if current in seen:
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   459
                continue
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   460
            softstack = []
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   461
            while current in bound and current not in seen:
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   462
                if nextjump:
3329
c056f125e17d stablesort: record previous segment size in the jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3328
diff changeset
   463
                    recordjump(previous, current, size)
3321
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   464
                    nextjump = False
3329
c056f125e17d stablesort: record previous segment size in the jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3328
diff changeset
   465
                    size = 0
3321
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   466
                yield current
3329
c056f125e17d stablesort: record previous segment size in the jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3328
diff changeset
   467
                size += 1
3321
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   468
                previous = current
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   469
                seen.add(current)
3315
c153441cdc0e stablesort: record, cache and reuse jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3314
diff changeset
   470
3321
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   471
                all_parents = parents(current)
3266
bc173e7f3b6f stablesort: simplify processing of non-merge changesets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3265
diff changeset
   472
3321
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   473
                # search or next parent to walk through
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   474
                fallback, next = None, None
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   475
                if 1 == len(all_parents):
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   476
                    next = all_parents[0]
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   477
                elif 2 <= len(all_parents):
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   478
                    fallback, next = sorted(all_parents, key=tiebreaker)
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   479
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   480
                # filter parent not ready (children not emitted)
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   481
                while next is not None and not children[next].issubset(seen):
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   482
                    nextjump = True
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   483
                    next = fallback
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   484
                    fallback = None
3315
c153441cdc0e stablesort: record, cache and reuse jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3314
diff changeset
   485
3321
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   486
                # stack management
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   487
                if next is None:
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   488
                    next = popready(softstack)
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   489
                    if next is not None:
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   490
                        nextjump = True
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   491
                elif fallback is not None:
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   492
                    softstack.append(fallback)
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   493
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   494
                # get ready for next iteration
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   495
                current = next
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   496
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   497
            # any in processed head has to go in the hard stack
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   498
            nextjump = True
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   499
            hardstack.extend(softstack)
3329
c056f125e17d stablesort: record previous segment size in the jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3328
diff changeset
   500
3328
ff262ae59541 stablesort: move jump recording inside the exclusive function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3326
diff changeset
   501
        if previous is not None:
3329
c056f125e17d stablesort: record previous segment size in the jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3328
diff changeset
   502
            recordjump(previous, lower, size)
3263
07678f7a4481 stablesort: introduce a cache object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3262
diff changeset
   503
3337
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   504
def stablesort_mergepoint_head_ondisk(repo, revs, limit=None):
3857
9672de8055cd stablesort: make sure heads are processed in sorted order
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3504
diff changeset
   505
    heads = repo.revs('sort(heads(%ld))', revs)
3337
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   506
    if not heads:
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   507
        return []
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   508
    elif 2 < len(heads):
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   509
        raise error.Abort('cannot use head based merging, %d heads found'
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   510
                          % len(heads))
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   511
    head = heads.first()
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   512
    unfi = repo.unfiltered()
3338
3f049353d733 stablesort: expose the cache through the repository
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3337
diff changeset
   513
    cache = unfi.stablesort
3337
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   514
    cache.save(unfi)
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   515
    return cache.get(repo, head, limit=limit)
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   516
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   517
S_INDEXSIZE = struct.Struct('>I')
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   518
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   519
class ondiskstablesortcache(stablesortcache, genericcaches.changelogsourcebase):
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   520
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   521
    _filepath = 'evoext-stablesortcache-00'
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   522
    _cachename = 'evo-ext-stablesort'
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   523
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   524
    def __init__(self):
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   525
        super(ondiskstablesortcache, self).__init__()
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   526
        self._index = array.array('l')
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   527
        self._data = array.array('l')
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   528
        del self._jumps
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   529
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   530
    def getjumps(self, repo, rev):
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   531
        if len(self._index) < rev:
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   532
            msg = 'stablesortcache must be warmed before use (%d < %d)'
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   533
            msg %= (len(self._index), rev)
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   534
            raise error.ProgrammingError(msg)
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   535
        return self._getjumps(rev)
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   536
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   537
    def _getjumps(self, rev):
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   538
        # very first revision
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   539
        if rev == 0:
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   540
            return None
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   541
        # no data yet
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   542
        if len(self._index) <= rev:
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   543
            return None
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   544
        index = self._index
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   545
        # non merge revision
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   546
        if index[rev] == index[rev - 1]:
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   547
            return None
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   548
        data = self._data
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   549
        # merge revision
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   550
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   551
        def jumps():
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   552
            for idx in xrange(index[rev - 1], index[rev]):
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   553
                i = idx * 3
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   554
                yield tuple(data[i:i + 3])
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   555
        return jumps()
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   556
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   557
    def _setjumps(self, rev, jumps):
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   558
        assert len(self._index) == rev, (len(self._index), rev)
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   559
        if rev == 0:
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   560
            self._index.append(0)
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   561
            return
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   562
        end = self._index[rev - 1]
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   563
        if jumps is None:
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   564
            self._index.append(end)
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   565
            return
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   566
        assert len(self._data) == end * 3, (len(self._data), end)
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   567
        for j in jumps:
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   568
            self._data.append(j[0])
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   569
            self._data.append(j[1])
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   570
            self._data.append(j[2])
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   571
            end += 1
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   572
        self._index.append(end)
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   573
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   574
    def _updatefrom(self, repo, data):
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   575
        repo = repo.unfiltered()
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   576
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   577
        total = len(data)
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   578
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   579
        def progress(pos, rev):
4341
d1aab9d82f5b evolve: adapt for deprecated ui.progress()
Martin von Zweigbergk <martinvonz@google.com>
parents: 4109
diff changeset
   580
            compat.progress(repo.ui, 'updating stablesort cache',
d1aab9d82f5b evolve: adapt for deprecated ui.progress()
Martin von Zweigbergk <martinvonz@google.com>
parents: 4109
diff changeset
   581
                            pos, 'rev %s' % rev, unit='revision', total=total)
3337
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   582
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   583
        progress(0, '')
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   584
        for idx, rev in enumerate(data):
3358
81aae43ee0f1 stablesort: use parent filtering in a place we forgot to
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3352
diff changeset
   585
            parents = filterparents(repo.changelog.parentrevs(rev))
81aae43ee0f1 stablesort: use parent filtering in a place we forgot to
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3352
diff changeset
   586
            if len(parents) <= 1:
3337
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   587
                self._setjumps(rev, None)
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   588
            else:
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   589
                # merge! warn the cache
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   590
                tiebreaker = _mergepoint_tie_breaker(repo)
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   591
                minparent = sorted(parents, key=tiebreaker)[0]
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   592
                for r in self.walkfrom(repo, rev):
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   593
                    if r == minparent:
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   594
                        break
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   595
            if not (idx % 1000): # progress as a too high performance impact
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   596
                progress(idx, rev)
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   597
        progress(None, '')
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   598
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   599
    def clear(self, reset=False):
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   600
        super(ondiskstablesortcache, self).clear()
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   601
        self._index = array.array('l')
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   602
        self._data = array.array('l')
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   603
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   604
    def load(self, repo):
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   605
        """load data from disk
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   606
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   607
        (crude version, read everything all the time)
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   608
        """
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   609
        assert repo.filtername is None
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   610
4488
6c0992ce05f7 compat: drop getcachevfs, repo.cachevfs is supported in hg 4.4
Joerg Sonnenberger <joerg@bec.de>
parents: 4341
diff changeset
   611
        data = repo.cachevfs.tryread(self._filepath)
3337
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   612
        self._index = array.array('l')
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   613
        self._data = array.array('l')
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   614
        if not data:
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   615
            self._cachekey = self.emptykey
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   616
        else:
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   617
            headerdata = data[:self._cachekeysize]
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   618
            self._cachekey = self._deserializecachekey(headerdata)
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   619
            offset = self._cachekeysize
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   620
            indexsizedata = data[offset:offset + S_INDEXSIZE.size]
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   621
            indexsize = S_INDEXSIZE.unpack(indexsizedata)[0]
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   622
            offset += S_INDEXSIZE.size
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   623
            self._index.fromstring(data[offset:offset + indexsize])
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   624
            offset += indexsize
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   625
            self._data.fromstring(data[offset:])
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   626
        self._ondiskkey = self._cachekey
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   627
        pass
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   628
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   629
    def save(self, repo):
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   630
        """save the data to disk
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   631
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   632
        (crude version, rewrite everything all the time)
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   633
        """
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   634
        if self._cachekey is None or self._cachekey == self._ondiskkey:
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   635
            return
4103
1c0a09668709 stablesortcache: ignore permission and OS errors when writing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3975
diff changeset
   636
        try:
4488
6c0992ce05f7 compat: drop getcachevfs, repo.cachevfs is supported in hg 4.4
Joerg Sonnenberger <joerg@bec.de>
parents: 4341
diff changeset
   637
            cachefile = repo.cachevfs(self._filepath, 'w', atomictemp=True)
3337
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   638
4103
1c0a09668709 stablesortcache: ignore permission and OS errors when writing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3975
diff changeset
   639
            # data to write
1c0a09668709 stablesortcache: ignore permission and OS errors when writing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3975
diff changeset
   640
            headerdata = self._serializecachekey()
1c0a09668709 stablesortcache: ignore permission and OS errors when writing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3975
diff changeset
   641
            indexdata = self._index.tostring()
1c0a09668709 stablesortcache: ignore permission and OS errors when writing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3975
diff changeset
   642
            data = self._data.tostring()
1c0a09668709 stablesortcache: ignore permission and OS errors when writing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3975
diff changeset
   643
            indexsize = S_INDEXSIZE.pack(len(indexdata))
3337
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   644
4103
1c0a09668709 stablesortcache: ignore permission and OS errors when writing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3975
diff changeset
   645
            # writing
1c0a09668709 stablesortcache: ignore permission and OS errors when writing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3975
diff changeset
   646
            cachefile.write(headerdata)
1c0a09668709 stablesortcache: ignore permission and OS errors when writing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3975
diff changeset
   647
            cachefile.write(indexsize)
1c0a09668709 stablesortcache: ignore permission and OS errors when writing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3975
diff changeset
   648
            cachefile.write(indexdata)
1c0a09668709 stablesortcache: ignore permission and OS errors when writing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3975
diff changeset
   649
            cachefile.write(data)
1c0a09668709 stablesortcache: ignore permission and OS errors when writing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3975
diff changeset
   650
            cachefile.close()
4104
a023abd12f3b stablesortcache: update the variable tracking on-disk state after write
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4103
diff changeset
   651
            self._ondiskkey = self._cachekey
4103
1c0a09668709 stablesortcache: ignore permission and OS errors when writing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3975
diff changeset
   652
        except (IOError, OSError) as exc:
4109
d562316c548f caches: issue both debug and blackbox log message
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4104
diff changeset
   653
            repo.ui.log('stablesortcache', 'could not write update %s\n' % exc)
4103
1c0a09668709 stablesortcache: ignore permission and OS errors when writing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3975
diff changeset
   654
            repo.ui.debug('stablesortcache: could not write update %s\n' % exc)
3337
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   655
3338
3f049353d733 stablesort: expose the cache through the repository
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3337
diff changeset
   656
@eh.reposetup
3f049353d733 stablesort: expose the cache through the repository
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3337
diff changeset
   657
def setupcache(ui, repo):
3f049353d733 stablesort: expose the cache through the repository
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3337
diff changeset
   658
3f049353d733 stablesort: expose the cache through the repository
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3337
diff changeset
   659
    class stablesortrepo(repo.__class__):
3f049353d733 stablesort: expose the cache through the repository
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3337
diff changeset
   660
3f049353d733 stablesort: expose the cache through the repository
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3337
diff changeset
   661
        @localrepo.unfilteredpropertycache
3f049353d733 stablesort: expose the cache through the repository
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3337
diff changeset
   662
        def stablesort(self):
3f049353d733 stablesort: expose the cache through the repository
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3337
diff changeset
   663
            cache = ondiskstablesortcache()
3f049353d733 stablesort: expose the cache through the repository
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3337
diff changeset
   664
            cache.update(self)
3f049353d733 stablesort: expose the cache through the repository
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3337
diff changeset
   665
            return cache
3f049353d733 stablesort: expose the cache through the repository
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3337
diff changeset
   666
3f049353d733 stablesort: expose the cache through the repository
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3337
diff changeset
   667
        @localrepo.unfilteredmethod
3f049353d733 stablesort: expose the cache through the repository
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3337
diff changeset
   668
        def destroyed(self):
3f049353d733 stablesort: expose the cache through the repository
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3337
diff changeset
   669
            if 'stablesort' in vars(self):
3f049353d733 stablesort: expose the cache through the repository
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3337
diff changeset
   670
                self.stablesort.clear()
3f049353d733 stablesort: expose the cache through the repository
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3337
diff changeset
   671
            super(stablesortrepo, self).destroyed()
3f049353d733 stablesort: expose the cache through the repository
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3337
diff changeset
   672
3968
37178a2d3557 compat: drop compatibility layer for updatecaches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3952
diff changeset
   673
        @localrepo.unfilteredmethod
37178a2d3557 compat: drop compatibility layer for updatecaches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3952
diff changeset
   674
        def updatecaches(self, tr=None, **kwargs):
37178a2d3557 compat: drop compatibility layer for updatecaches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3952
diff changeset
   675
            if utility.shouldwarmcache(self, tr):
37178a2d3557 compat: drop compatibility layer for updatecaches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3952
diff changeset
   676
                self.stablesort.update(self)
37178a2d3557 compat: drop compatibility layer for updatecaches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3952
diff changeset
   677
                self.stablesort.save(self)
37178a2d3557 compat: drop compatibility layer for updatecaches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3952
diff changeset
   678
            super(stablesortrepo, self).updatecaches(tr, **kwargs)
3338
3f049353d733 stablesort: expose the cache through the repository
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3337
diff changeset
   679
3f049353d733 stablesort: expose the cache through the repository
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3337
diff changeset
   680
    repo.__class__ = stablesortrepo
3f049353d733 stablesort: expose the cache through the repository
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3337
diff changeset
   681
3246
543708c3f754 stablesort: add a 'method' argument to the debugstablesort command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3245
diff changeset
   682
_methodmap = {
543708c3f754 stablesort: add a 'method' argument to the debugstablesort command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3245
diff changeset
   683
    'branchpoint': stablesort_branchpoint,
3254
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   684
    'basic-mergepoint': stablesort_mergepoint_multirevs,
3255
bb3f8c8c1232 stablesort: introduce a mergepoint based method focused on head
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3254
diff changeset
   685
    'basic-headstart': stablesort_mergepoint_head_basic,
3262
774f69d74ec2 stablesort: start implementing more advanced version of headstart sorting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3256
diff changeset
   686
    'headstart': stablesort_mergepoint_head_debug,
3263
07678f7a4481 stablesort: introduce a cache object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3262
diff changeset
   687
    'headcached': stablesort_mergepoint_head_cached,
3337
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   688
    'headondisk': stablesort_mergepoint_head_ondisk,
3246
543708c3f754 stablesort: add a 'method' argument to the debugstablesort command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3245
diff changeset
   689
}
3952
a7794f5abacd discovery: make sure repository wrapping happens in the right order
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3857
diff changeset
   690
a7794f5abacd discovery: make sure repository wrapping happens in the right order
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3857
diff changeset
   691
# merge last so that repo setup wrap after that one.
a7794f5abacd discovery: make sure repository wrapping happens in the right order
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3857
diff changeset
   692
eh.merge(depthcache.eh)