hgext3rd/evolve/stablesort.py
author Pierre-Yves David <pierre-yves.david@octobus.net>
Sat, 25 Nov 2017 16:05:09 -0500
changeset 3262 774f69d74ec2
parent 3256 c82a2632327e
child 3263 07678f7a4481
permissions -rw-r--r--
stablesort: start implementing more advanced version of headstart sorting Now that we can validate the sort with a basic implementation, we can start implementing a version that will support caching and other goodies.
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
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    10
import collections
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    11
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    12
from mercurial import (
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    13
    commands,
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    14
    cmdutil,
3246
543708c3f754 stablesort: add a 'method' argument to the debugstablesort command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3245
diff changeset
    15
    error,
3243
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    16
    node as nodemod,
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    17
    scmutil,
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    18
)
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    19
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    20
from mercurial.i18n import _
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 . import (
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    23
    depthcache,
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    24
    exthelper,
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    25
)
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    26
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    27
eh = exthelper.exthelper()
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    28
eh.merge(depthcache.eh)
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    29
3254
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
    30
def _mergepoint_tie_breaker(repo):
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
    31
    """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
    32
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
    33
    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
    34
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
    35
    Possible other factor are:
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
    36
        * depth of node,
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
    37
        * number of exclusive merges,
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
    38
        * number of jump points.
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
    39
        * <insert-your-idea>
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
    return repo.changelog.node
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
    42
3243
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    43
@eh.command(
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    44
    'debugstablesort',
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    45
    [
3246
543708c3f754 stablesort: add a 'method' argument to the debugstablesort command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3245
diff changeset
    46
        ('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
    47
        ('', '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
    48
         "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
    49
        ('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
    50
    ] + commands.formatteropts,
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    51
    _(''))
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    52
def debugstablesort(ui, repo, **opts):
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    53
    """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
    54
    """
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    55
    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
    56
543708c3f754 stablesort: add a 'method' argument to the debugstablesort command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3245
diff changeset
    57
    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
    58
    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
    59
    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
    60
        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
    61
        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
    62
                          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
    63
3243
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    64
    displayer = cmdutil.show_changeset(ui, repo, opts, buffered=True)
3256
c82a2632327e stablesort: add a --limit argument
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3255
diff changeset
    65
    kwargs = {}
c82a2632327e stablesort: add a --limit argument
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3255
diff changeset
    66
    if opts['limit']:
c82a2632327e stablesort: add a --limit argument
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3255
diff changeset
    67
        kwargs['limit'] = int(opts['limit'])
c82a2632327e stablesort: add a --limit argument
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3255
diff changeset
    68
    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
    69
        ctx = repo[r]
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    70
        displayer.show(ctx)
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    71
        displayer.flush(ctx)
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    72
    displayer.close()
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    73
3245
63d58f7db120 stablesort: rename function to stablesort_branchpoint
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3243
diff changeset
    74
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
    75
    """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
    76
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    77
    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
    78
    tie breaker.
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    79
    """
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    80
    # Various notes:
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    81
    #
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    82
    # * 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
    83
    #
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    84
    # * 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
    85
    #   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
    86
    #
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    87
    #  - highest (stablesort-wise) common ancestors,
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    88
    #  - order of parents (tablesort-wise)
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    89
    cl = repo.changelog
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    90
    parents = cl.parentrevs
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    91
    nullrev = nodemod.nullrev
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    92
    n = cl.node
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    93
    # 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
    94
    #
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    95
    # * 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
    96
    #
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    97
    # * we need to detect branching
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    98
    children = collections.defaultdict(list)
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    99
    for r in cl.ancestors(revs, inclusive=True):
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   100
        p1, p2 = parents(r)
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   101
        children[p1].append(r)
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   102
        if p2 != nullrev:
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   103
            children[p2].append(r)
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   104
    # step two: walk back up
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   105
    # * 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
   106
    # * stack disregarded part of the branching
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   107
    # * 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
   108
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   109
    # track what changeset has been
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   110
    seen = [0] * (max(revs) + 2)
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   111
    seen[-1] = True # nullrev is known
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   112
    # starts from repository roots
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   113
    # 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
   114
    stack = children[nullrev]
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   115
    if not stack:
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   116
        return []
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   117
    if 1 < len(stack):
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   118
        stack.sort(key=n, reverse=True)
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   119
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   120
    # 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
   121
    result = []
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   122
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   123
    current = stack.pop()
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   124
    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
   125
        if current is None:
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   126
            # 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
   127
            current = stack.pop()
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   128
            if seen[current]:
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   129
                current = None
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   130
                continue
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   131
        p1, p2 = parents(current)
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   132
        if not (seen[p1] and seen[p2]):
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   133
            # 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
   134
            # 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
   135
            # 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
   136
            current = None
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   137
            continue
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   138
        assert not seen[current]
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   139
        seen[current] = True
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   140
        result.append(current) # could be yield, cf earlier comment
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   141
        if mergecallback is not None and p2 != nullrev:
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   142
            mergecallback(result, current)
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   143
        cs = children[current]
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   144
        if not cs:
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   145
            current = None
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   146
        elif 1 == len(cs):
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   147
            current = cs[0]
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   148
        else:
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   149
            cs.sort(key=n, reverse=True)
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   150
            current = cs.pop() # proceed on smallest
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   151
            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
   152
    assert len(result) == len(set(result))
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   153
    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
   154
3254
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   155
def stablesort_mergepoint_multirevs(repo, revs):
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   156
    """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
   157
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   158
    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
   159
    tie breaker.
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   160
    """
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   161
    cl = repo.changelog
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   162
    tiebreaker = _mergepoint_tie_breaker(repo)
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   163
    if not revs:
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   164
        return []
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   165
    elif len(revs) == 1:
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   166
        heads = list(revs)
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   167
    else:
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   168
        # keeps heads only
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   169
        heads = sorted(repo.revs('heads(%ld::%ld)', revs, revs), key=tiebreaker)
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   170
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   171
    results = []
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   172
    while heads:
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   173
        h = heads.pop()
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   174
        if revs:
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   175
            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
   176
        else:
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   177
            bound = cl.ancestors([h], inclusive=True)
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   178
        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
   179
    if len(results) == 1:
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   180
        return results[0]
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   181
    finalresults = []
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   182
    for r in results[::-1]:
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   183
        finalresults.extend(r)
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   184
    return finalresults
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   185
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   186
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
   187
    """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
   188
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   189
    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
   190
    """
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   191
    # Various notes:
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   192
    #
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   193
    # * 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
   194
    cl = repo.changelog
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   195
    parents = cl.parentrevs
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   196
    nullrev = nodemod.nullrev
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   197
    tiebreaker = _mergepoint_tie_breaker(repo)
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   198
    # 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
   199
    children = collections.defaultdict(set)
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   200
    parentmap = {}
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   201
    for r in revs:
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   202
        p1, p2 = parents(r)
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   203
        children[p1].add(r)
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   204
        if p2 != nullrev:
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   205
            children[p2].add(r)
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   206
            parentmap[r] = tuple(sorted((p1, p2), key=tiebreaker))
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   207
        elif p1 != nullrev:
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   208
            parentmap[r] = (p1,)
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   209
        else:
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   210
            parentmap[r] = ()
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   211
    # step two: walk again,
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   212
    stack = [head]
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   213
    resultset = set()
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   214
    result = []
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   215
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   216
    def add(current):
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   217
        resultset.add(current)
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   218
        result.append(current)
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   219
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   220
    while stack:
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   221
        current = stack.pop()
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   222
        add(current)
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   223
        parents = parentmap[current]
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   224
        for p in parents:
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   225
            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
   226
                # 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
   227
                continue
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   228
            if p in revs:
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   229
                stack.append(p)
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
    result.reverse()
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   232
    assert len(result) == len(resultset)
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   233
    return result
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   234
3256
c82a2632327e stablesort: add a --limit argument
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3255
diff changeset
   235
def stablesort_mergepoint_head_basic(repo, revs, limit=None):
3255
bb3f8c8c1232 stablesort: introduce a mergepoint based method focused on head
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3254
diff changeset
   236
    heads = repo.revs('heads(%ld)', revs)
bb3f8c8c1232 stablesort: introduce a mergepoint based method focused on head
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3254
diff changeset
   237
    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
   238
        return []
bb3f8c8c1232 stablesort: introduce a mergepoint based method focused on head
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3254
diff changeset
   239
    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
   240
        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
   241
                          % len(heads))
bb3f8c8c1232 stablesort: introduce a mergepoint based method focused on head
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3254
diff changeset
   242
    head = heads.first()
3256
c82a2632327e stablesort: add a --limit argument
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3255
diff changeset
   243
    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
   244
    if limit is None:
c82a2632327e stablesort: add a --limit argument
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3255
diff changeset
   245
        return revs
c82a2632327e stablesort: add a --limit argument
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3255
diff changeset
   246
    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
   247
3262
774f69d74ec2 stablesort: start implementing more advanced version of headstart sorting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3256
diff changeset
   248
def stablesort_mergepoint_head_debug(repo, revs, limit=None):
774f69d74ec2 stablesort: start implementing more advanced version of headstart sorting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3256
diff changeset
   249
    heads = repo.revs('heads(%ld)', revs)
774f69d74ec2 stablesort: start implementing more advanced version of headstart sorting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3256
diff changeset
   250
    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
   251
        return []
774f69d74ec2 stablesort: start implementing more advanced version of headstart sorting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3256
diff changeset
   252
    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
   253
        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
   254
                          % len(heads))
774f69d74ec2 stablesort: start implementing more advanced version of headstart sorting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3256
diff changeset
   255
    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
   256
    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
   257
    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
   258
        return revs
774f69d74ec2 stablesort: start implementing more advanced version of headstart sorting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3256
diff changeset
   259
    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
   260
774f69d74ec2 stablesort: start implementing more advanced version of headstart sorting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3256
diff changeset
   261
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
   262
    """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
   263
774f69d74ec2 stablesort: start implementing more advanced version of headstart sorting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3256
diff changeset
   264
    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
   265
    tie breaker.
774f69d74ec2 stablesort: start implementing more advanced version of headstart sorting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3256
diff changeset
   266
    """
774f69d74ec2 stablesort: start implementing more advanced version of headstart sorting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3256
diff changeset
   267
    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
   268
    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
   269
    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
   270
774f69d74ec2 stablesort: start implementing more advanced version of headstart sorting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3256
diff changeset
   271
    top = [head]
774f69d74ec2 stablesort: start implementing more advanced version of headstart sorting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3256
diff changeset
   272
    mid = []
774f69d74ec2 stablesort: start implementing more advanced version of headstart sorting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3256
diff changeset
   273
    bottom = []
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
    ps = [p for p in parents(head) if p is not nodemod.nullrev]
774f69d74ec2 stablesort: start implementing more advanced version of headstart sorting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3256
diff changeset
   276
    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
   277
        top.append(ps[0])
774f69d74ec2 stablesort: start implementing more advanced version of headstart sorting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3256
diff changeset
   278
        ps = [p for p in parents(ps[0]) if p is not nodemod.nullrev]
774f69d74ec2 stablesort: start implementing more advanced version of headstart sorting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3256
diff changeset
   279
    top.reverse()
774f69d74ec2 stablesort: start implementing more advanced version of headstart sorting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3256
diff changeset
   280
    if len(ps) == 2:
774f69d74ec2 stablesort: start implementing more advanced version of headstart sorting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3256
diff changeset
   281
        ps.sort(key=tiebreaker)
774f69d74ec2 stablesort: start implementing more advanced version of headstart sorting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3256
diff changeset
   282
774f69d74ec2 stablesort: start implementing more advanced version of headstart sorting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3256
diff changeset
   283
        # 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
   284
        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
   285
        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
   286
            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
   287
774f69d74ec2 stablesort: start implementing more advanced version of headstart sorting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3256
diff changeset
   288
        # And follow up with part othe parent we can inherit from
774f69d74ec2 stablesort: start implementing more advanced version of headstart sorting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3256
diff changeset
   289
        bottom_revs = cl.ancestors([ps[0]], inclusive=True)
774f69d74ec2 stablesort: start implementing more advanced version of headstart sorting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3256
diff changeset
   290
        bottom = stablesort_mergepoint_bounded(repo, ps[0], bottom_revs)
774f69d74ec2 stablesort: start implementing more advanced version of headstart sorting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3256
diff changeset
   291
774f69d74ec2 stablesort: start implementing more advanced version of headstart sorting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3256
diff changeset
   292
    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
   293
3246
543708c3f754 stablesort: add a 'method' argument to the debugstablesort command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3245
diff changeset
   294
_methodmap = {
543708c3f754 stablesort: add a 'method' argument to the debugstablesort command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3245
diff changeset
   295
    'branchpoint': stablesort_branchpoint,
3254
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   296
    '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
   297
    '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
   298
    'headstart': stablesort_mergepoint_head_debug,
3246
543708c3f754 stablesort: add a 'method' argument to the debugstablesort command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3245
diff changeset
   299
}