hgext3rd/evolve/stablesort.py
author Pulkit Goyal <7895pulkit@gmail.com>
Tue, 12 Jun 2018 19:00:12 +0530
changeset 3843 f0096db2a7b1
parent 3504 5dc34b857114
child 3857 9672de8055cd
permissions -rw-r--r--
evolve: improve error messages when conflicts occur This patch improves the error messages when conflicts occur. First, we drop the line 'evolution failed', that is not the best line we can show and evolution didn't failed, it's just interrupted by the conflicts and when user will run `hg evolve --continue`, things will be fine. I still remember when I first saw 'evolution failed', I got a bit scare as am I in a recoverable position or not. So let's drop this scary line. Second, we replace the error messages to say `resolve conflicts and see help-topic`. The help topic was added recently and documents all the three flags very well. Addition of tests also showed that all the three flags works fine with all the three instability type. So we should advertise them more. Third, we now raise the error with our error message rather than raising MergeFailure and having evolution related text in hint or stderr above. This increase the focus on the error message we want to show. After this patch, I think error messages by evolve in case of conflicts will be same in every case.
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
3338
3f049353d733 stablesort: expose the cache through the repository
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3337
diff changeset
    13
import weakref
3243
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    14
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    15
from mercurial import (
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    16
    commands,
3338
3f049353d733 stablesort: expose the cache through the repository
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3337
diff changeset
    17
    localrepo,
3246
543708c3f754 stablesort: add a 'method' argument to the debugstablesort command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3245
diff changeset
    18
    error,
3243
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    19
    node as nodemod,
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    20
    scmutil,
3338
3f049353d733 stablesort: expose the cache through the repository
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3337
diff changeset
    21
    util,
3243
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    22
)
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 mercurial.i18n import _
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
from . import (
3408
f4ea9652661d cachevfs: use a compatibility later for all access
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3366
diff changeset
    27
    compat,
3243
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    28
    depthcache,
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    29
    exthelper,
3311
df399e00c10b stablesort: use the filtered parents utility
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3300
diff changeset
    30
    utility,
3337
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
    31
    genericcaches,
3243
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    32
)
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    33
3311
df399e00c10b stablesort: use the filtered parents utility
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3300
diff changeset
    34
filterparents = utility.filterparents
df399e00c10b stablesort: use the filtered parents utility
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3300
diff changeset
    35
3243
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    36
eh = exthelper.exthelper()
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    37
eh.merge(depthcache.eh)
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    38
3254
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
    39
def _mergepoint_tie_breaker(repo):
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
    40
    """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
    41
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
    42
    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
    43
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
    44
    Possible other factor are:
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
    45
        * depth of node,
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
    46
        * number of exclusive merges,
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
    47
        * number of jump points.
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
    48
        * <insert-your-idea>
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
    49
    """
3322
20b6dae466a7 stablesort: use 'depth' in mergepoint tie breaker
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3321
diff changeset
    50
    node = repo.changelog.node
20b6dae466a7 stablesort: use 'depth' in mergepoint tie breaker
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3321
diff changeset
    51
    depth = repo.depthcache.get
20b6dae466a7 stablesort: use 'depth' in mergepoint tie breaker
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3321
diff changeset
    52
20b6dae466a7 stablesort: use 'depth' in mergepoint tie breaker
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3321
diff changeset
    53
    def key(rev):
20b6dae466a7 stablesort: use 'depth' in mergepoint tie breaker
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3321
diff changeset
    54
        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
    55
    return key
3254
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
    56
3243
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    57
@eh.command(
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    58
    'debugstablesort',
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    59
    [
3246
543708c3f754 stablesort: add a 'method' argument to the debugstablesort command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3245
diff changeset
    60
        ('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
    61
        ('', '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
    62
         "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
    63
        ('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
    64
    ] + commands.formatteropts,
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
def debugstablesort(ui, repo, **opts):
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    67
    """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
    68
    """
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    69
    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
    70
543708c3f754 stablesort: add a 'method' argument to the debugstablesort command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3245
diff changeset
    71
    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
    72
    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
    73
    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
    74
        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
    75
        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
    76
                          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
    77
3483
f03845bfd015 compat: add wrapper for logcmdutil functions
Yuya Nishihara <yuya@tcha.org>
parents: 3408
diff changeset
    78
    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
    79
    kwargs = {}
c82a2632327e stablesort: add a --limit argument
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3255
diff changeset
    80
    if opts['limit']:
c82a2632327e stablesort: add a --limit argument
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3255
diff changeset
    81
        kwargs['limit'] = int(opts['limit'])
c82a2632327e stablesort: add a --limit argument
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3255
diff changeset
    82
    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
    83
        ctx = repo[r]
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    84
        displayer.show(ctx)
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    85
        displayer.flush(ctx)
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    86
    displayer.close()
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    87
3245
63d58f7db120 stablesort: rename function to stablesort_branchpoint
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3243
diff changeset
    88
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
    89
    """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
    90
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    91
    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
    92
    tie breaker.
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    93
    """
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    94
    # Various notes:
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    95
    #
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    96
    # * 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
    97
    #
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    98
    # * 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
    99
    #   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
   100
    #
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   101
    #  - highest (stablesort-wise) common ancestors,
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   102
    #  - order of parents (tablesort-wise)
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   103
    cl = repo.changelog
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   104
    parents = cl.parentrevs
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   105
    nullrev = nodemod.nullrev
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   106
    n = cl.node
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   107
    # 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
   108
    #
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   109
    # * 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
   110
    #
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   111
    # * we need to detect branching
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   112
    children = collections.defaultdict(list)
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   113
    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
   114
        ps = filterparents(parents(r))
df399e00c10b stablesort: use the filtered parents utility
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3300
diff changeset
   115
        if not ps:
df399e00c10b stablesort: use the filtered parents utility
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3300
diff changeset
   116
            children[nullrev].append(r)
df399e00c10b stablesort: use the filtered parents utility
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3300
diff changeset
   117
        for p in ps:
df399e00c10b stablesort: use the filtered parents utility
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3300
diff changeset
   118
            children[p].append(r)
3243
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   119
    # step two: walk back up
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   120
    # * 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
   121
    # * stack disregarded part of the branching
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   122
    # * 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
   123
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   124
    # track what changeset has been
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   125
    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
   126
    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
   127
    # starts from repository roots
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   128
    # 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
   129
    stack = children[nullrev]
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   130
    if not stack:
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   131
        return []
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   132
    if 1 < len(stack):
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   133
        stack.sort(key=n, reverse=True)
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
    # 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
   136
    result = []
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   137
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   138
    current = stack.pop()
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   139
    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
   140
        if current is None:
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   141
            # 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
   142
            current = stack.pop()
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   143
            if seen[current]:
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   144
                current = None
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   145
                continue
3311
df399e00c10b stablesort: use the filtered parents utility
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3300
diff changeset
   146
        ps = filterparents(parents(current))
df399e00c10b stablesort: use the filtered parents utility
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3300
diff changeset
   147
        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
   148
            # 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
   149
            # 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
   150
            # 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
   151
            current = None
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   152
            continue
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   153
        assert not seen[current]
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   154
        seen[current] = True
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   155
        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
   156
        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
   157
            mergecallback(result, current)
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   158
        cs = children[current]
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   159
        if not cs:
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   160
            current = None
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   161
        elif 1 == len(cs):
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   162
            current = cs[0]
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   163
        else:
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   164
            cs.sort(key=n, reverse=True)
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   165
            current = cs.pop() # proceed on smallest
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   166
            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
   167
    assert len(result) == len(set(result))
556316fe4b4f stablesort: extract in its own module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   168
    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
   169
3254
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   170
def stablesort_mergepoint_multirevs(repo, revs):
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   171
    """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
   172
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   173
    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
   174
    tie breaker.
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   175
    """
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   176
    cl = repo.changelog
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   177
    tiebreaker = _mergepoint_tie_breaker(repo)
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   178
    if not revs:
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   179
        return []
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   180
    elif len(revs) == 1:
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   181
        heads = list(revs)
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   182
    else:
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   183
        # keeps heads only
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   184
        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
   185
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   186
    results = []
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   187
    while heads:
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   188
        h = heads.pop()
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   189
        if revs:
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   190
            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
   191
        else:
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   192
            bound = cl.ancestors([h], inclusive=True)
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   193
        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
   194
    if len(results) == 1:
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   195
        return results[0]
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   196
    finalresults = []
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   197
    for r in results[::-1]:
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   198
        finalresults.extend(r)
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   199
    return finalresults
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
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
   202
    """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
   203
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   204
    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
   205
    """
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   206
    # Various notes:
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   207
    #
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   208
    # * 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
   209
    cl = repo.changelog
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   210
    parents = cl.parentrevs
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   211
    nullrev = nodemod.nullrev
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   212
    tiebreaker = _mergepoint_tie_breaker(repo)
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   213
    # 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
   214
    children = collections.defaultdict(set)
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   215
    parentmap = {}
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   216
    for r in revs:
3311
df399e00c10b stablesort: use the filtered parents utility
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3300
diff changeset
   217
        ps = filterparents(parents(r))
df399e00c10b stablesort: use the filtered parents utility
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3300
diff changeset
   218
        if 2 <= len(ps):
df399e00c10b stablesort: use the filtered parents utility
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3300
diff changeset
   219
            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
   220
        parentmap[r] = ps
df399e00c10b stablesort: use the filtered parents utility
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3300
diff changeset
   221
        for p in ps:
df399e00c10b stablesort: use the filtered parents utility
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3300
diff changeset
   222
            children[p].add(r)
df399e00c10b stablesort: use the filtered parents utility
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3300
diff changeset
   223
        if not ps:
df399e00c10b stablesort: use the filtered parents utility
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3300
diff changeset
   224
            children[nullrev].add(r)
3254
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   225
    # step two: walk again,
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   226
    stack = [head]
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   227
    resultset = set()
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   228
    result = []
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   229
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   230
    def add(current):
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   231
        resultset.add(current)
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   232
        result.append(current)
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   233
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   234
    while stack:
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   235
        current = stack.pop()
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   236
        add(current)
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   237
        parents = parentmap[current]
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   238
        for p in parents:
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   239
            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
   240
                # 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
   241
                continue
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   242
            if p in revs:
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   243
                stack.append(p)
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   244
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   245
    result.reverse()
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   246
    assert len(result) == len(resultset)
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   247
    return result
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   248
3256
c82a2632327e stablesort: add a --limit argument
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3255
diff changeset
   249
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
   250
    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
   251
    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
   252
        return []
bb3f8c8c1232 stablesort: introduce a mergepoint based method focused on head
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3254
diff changeset
   253
    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
   254
        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
   255
                          % len(heads))
bb3f8c8c1232 stablesort: introduce a mergepoint based method focused on head
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3254
diff changeset
   256
    head = heads.first()
3256
c82a2632327e stablesort: add a --limit argument
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3255
diff changeset
   257
    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
   258
    if limit is None:
c82a2632327e stablesort: add a --limit argument
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3255
diff changeset
   259
        return revs
c82a2632327e stablesort: add a --limit argument
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3255
diff changeset
   260
    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
   261
3262
774f69d74ec2 stablesort: start implementing more advanced version of headstart sorting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3256
diff changeset
   262
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
   263
    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
   264
    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
   265
        return []
774f69d74ec2 stablesort: start implementing more advanced version of headstart sorting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3256
diff changeset
   266
    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
   267
        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
   268
                          % len(heads))
774f69d74ec2 stablesort: start implementing more advanced version of headstart sorting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3256
diff changeset
   269
    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
   270
    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
   271
    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
   272
        return revs
774f69d74ec2 stablesort: start implementing more advanced version of headstart sorting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3256
diff changeset
   273
    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
   274
774f69d74ec2 stablesort: start implementing more advanced version of headstart sorting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3256
diff changeset
   275
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
   276
    """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
   277
774f69d74ec2 stablesort: start implementing more advanced version of headstart sorting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3256
diff changeset
   278
    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
   279
    tie breaker.
774f69d74ec2 stablesort: start implementing more advanced version of headstart sorting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3256
diff changeset
   280
    """
774f69d74ec2 stablesort: start implementing more advanced version of headstart sorting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3256
diff changeset
   281
    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
   282
    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
   283
    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
   284
774f69d74ec2 stablesort: start implementing more advanced version of headstart sorting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3256
diff changeset
   285
    top = [head]
774f69d74ec2 stablesort: start implementing more advanced version of headstart sorting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3256
diff changeset
   286
    mid = []
774f69d74ec2 stablesort: start implementing more advanced version of headstart sorting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3256
diff changeset
   287
    bottom = []
774f69d74ec2 stablesort: start implementing more advanced version of headstart sorting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3256
diff changeset
   288
3311
df399e00c10b stablesort: use the filtered parents utility
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3300
diff changeset
   289
    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
   290
    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
   291
        top.append(ps[0])
3311
df399e00c10b stablesort: use the filtered parents utility
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3300
diff changeset
   292
        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
   293
    top.reverse()
774f69d74ec2 stablesort: start implementing more advanced version of headstart sorting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3256
diff changeset
   294
    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
   295
        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
   296
774f69d74ec2 stablesort: start implementing more advanced version of headstart sorting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3256
diff changeset
   297
        # 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
   298
        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
   299
        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
   300
            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
   301
774f69d74ec2 stablesort: start implementing more advanced version of headstart sorting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3256
diff changeset
   302
        # 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
   303
        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
   304
774f69d74ec2 stablesort: start implementing more advanced version of headstart sorting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3256
diff changeset
   305
    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
   306
3263
07678f7a4481 stablesort: introduce a cache object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3262
diff changeset
   307
def stablesort_mergepoint_head_cached(repo, revs, limit=None):
07678f7a4481 stablesort: introduce a cache object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3262
diff changeset
   308
    heads = repo.revs('heads(%ld)', revs)
07678f7a4481 stablesort: introduce a cache object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3262
diff changeset
   309
    if not heads:
07678f7a4481 stablesort: introduce a cache object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3262
diff changeset
   310
        return []
07678f7a4481 stablesort: introduce a cache object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3262
diff changeset
   311
    elif 2 < len(heads):
07678f7a4481 stablesort: introduce a cache object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3262
diff changeset
   312
        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
   313
                          % len(heads))
07678f7a4481 stablesort: introduce a cache object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3262
diff changeset
   314
    head = heads.first()
07678f7a4481 stablesort: introduce a cache object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3262
diff changeset
   315
    cache = stablesortcache()
3315
c153441cdc0e stablesort: record, cache and reuse jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3314
diff changeset
   316
    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
   317
    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
   318
    if first != second:
c153441cdc0e stablesort: record, cache and reuse jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3314
diff changeset
   319
        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
   320
                     '    %s\n'
c153441cdc0e stablesort: record, cache and reuse jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3314
diff changeset
   321
                     '    %s\n' % (first, second))
c153441cdc0e stablesort: record, cache and reuse jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3314
diff changeset
   322
    return second
c153441cdc0e stablesort: record, cache and reuse jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3314
diff changeset
   323
3263
07678f7a4481 stablesort: introduce a cache object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3262
diff changeset
   324
class stablesortcache(object):
07678f7a4481 stablesort: introduce a cache object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3262
diff changeset
   325
3315
c153441cdc0e stablesort: record, cache and reuse jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3314
diff changeset
   326
    def __init__(self):
3325
83d2a2f3dc8f stablesort: use a regular dict for jumps
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3323
diff changeset
   327
        self._jumps = {}
3337
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   328
        super(stablesortcache, self).__init__()
3315
c153441cdc0e stablesort: record, cache and reuse jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3314
diff changeset
   329
3263
07678f7a4481 stablesort: introduce a cache object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3262
diff changeset
   330
    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
   331
        result = []
3300
2d49773a378b stablesort: make the iteration from head available to all
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3267
diff changeset
   332
        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
   333
            result.append(r)
70b5bc95efbe stablesort: extract a '_revsfrom' method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3263
diff changeset
   334
            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
   335
                break
70b5bc95efbe stablesort: extract a '_revsfrom' method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3263
diff changeset
   336
        result.reverse()
70b5bc95efbe stablesort: extract a '_revsfrom' method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3263
diff changeset
   337
        return result
70b5bc95efbe stablesort: extract a '_revsfrom' method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3263
diff changeset
   338
3323
4a84947010a1 stablesort: expose the jumps sequence to other code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3322
diff changeset
   339
    def getjumps(self, repo, rev):
3334
db8feb404792 stablesort: abstract all cache access
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3329
diff changeset
   340
        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
   341
            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
   342
            if len(parents) <= 1:
3334
db8feb404792 stablesort: abstract all cache access
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3329
diff changeset
   343
                self._setjumps(rev, None)
3326
8ebd31af1452 stablesort: warm jump cache more efficiently
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3325
diff changeset
   344
            else:
8ebd31af1452 stablesort: warm jump cache more efficiently
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3325
diff changeset
   345
                # merge ! warn the cache
8ebd31af1452 stablesort: warm jump cache more efficiently
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3325
diff changeset
   346
                tiebreaker = _mergepoint_tie_breaker(repo)
8ebd31af1452 stablesort: warm jump cache more efficiently
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3325
diff changeset
   347
                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
   348
                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
   349
                    if r == minparent:
8ebd31af1452 stablesort: warm jump cache more efficiently
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3325
diff changeset
   350
                        break
3334
db8feb404792 stablesort: abstract all cache access
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3329
diff changeset
   351
        return self._getjumps(rev)
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 _hasjumpsdata(self, rev):
db8feb404792 stablesort: abstract all cache access
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3329
diff changeset
   354
        return rev in self._jumps
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 _getjumps(self, rev):
db8feb404792 stablesort: abstract all cache access
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3329
diff changeset
   357
        return self._jumps.get(rev)
db8feb404792 stablesort: abstract all cache access
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3329
diff changeset
   358
db8feb404792 stablesort: abstract all cache access
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3329
diff changeset
   359
    def _setjumps(self, rev, jumps):
db8feb404792 stablesort: abstract all cache access
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3329
diff changeset
   360
        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
   361
3300
2d49773a378b stablesort: make the iteration from head available to all
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3267
diff changeset
   362
    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
   363
        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
   364
        cl = repo.changelog
f9206b009f48 stablesort: write a flat version of the algorithm
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3266
diff changeset
   365
        parentsfunc = cl.parentrevs
3266
bc173e7f3b6f stablesort: simplify processing of non-merge changesets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3265
diff changeset
   366
bc173e7f3b6f stablesort: simplify processing of non-merge changesets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3265
diff changeset
   367
        def parents(rev):
3311
df399e00c10b stablesort: use the filtered parents utility
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3300
diff changeset
   368
            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
   369
3315
c153441cdc0e stablesort: record, cache and reuse jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3314
diff changeset
   370
        def oneparent(rev):
c153441cdc0e stablesort: record, cache and reuse jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3314
diff changeset
   371
            ps = parents(rev)
c153441cdc0e stablesort: record, cache and reuse jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3314
diff changeset
   372
            if not ps:
c153441cdc0e stablesort: record, cache and reuse jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3314
diff changeset
   373
                return None
c153441cdc0e stablesort: record, cache and reuse jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3314
diff changeset
   374
            if len(ps) == 1:
c153441cdc0e stablesort: record, cache and reuse jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3314
diff changeset
   375
                return ps[0]
c153441cdc0e stablesort: record, cache and reuse jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3314
diff changeset
   376
            return max(ps, key=tiebreaker)
c153441cdc0e stablesort: record, cache and reuse jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3314
diff changeset
   377
3266
bc173e7f3b6f stablesort: simplify processing of non-merge changesets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3265
diff changeset
   378
        current = head
3315
c153441cdc0e stablesort: record, cache and reuse jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3314
diff changeset
   379
        previous_current_1 = object()
c153441cdc0e stablesort: record, cache and reuse jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3314
diff changeset
   380
        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
   381
f9206b009f48 stablesort: write a flat version of the algorithm
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3266
diff changeset
   382
        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
   383
            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
   384
            previous_current_1 = current
c153441cdc0e stablesort: record, cache and reuse jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3314
diff changeset
   385
            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
   386
3334
db8feb404792 stablesort: abstract all cache access
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3329
diff changeset
   387
            jumps = self._getjumps(current)
3315
c153441cdc0e stablesort: record, cache and reuse jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3314
diff changeset
   388
            if jumps is not None:
c153441cdc0e stablesort: record, cache and reuse jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3314
diff changeset
   389
                # 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
   390
                # the exclusive size.
c153441cdc0e stablesort: record, cache and reuse jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3314
diff changeset
   391
                for j in jumps:
c153441cdc0e stablesort: record, cache and reuse jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3314
diff changeset
   392
                    jump_point = j[0]
c153441cdc0e stablesort: record, cache and reuse jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3314
diff changeset
   393
                    jump_dest = j[1]
c153441cdc0e stablesort: record, cache and reuse jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3314
diff changeset
   394
                    if 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
                    else:
c153441cdc0e stablesort: record, cache and reuse jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3314
diff changeset
   397
                        while current != jump_point:
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 = oneparent(current)
3321
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   400
                            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
   401
                        yield current
c153441cdc0e stablesort: record, cache and reuse jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3314
diff changeset
   402
                    current = jump_dest
3336
c42158efb64e stablesort: realign a misaligned continue
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3335
diff changeset
   403
                continue
3315
c153441cdc0e stablesort: record, cache and reuse jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3314
diff changeset
   404
3266
bc173e7f3b6f stablesort: simplify processing of non-merge changesets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3265
diff changeset
   405
            yield current
3267
f9206b009f48 stablesort: write a flat version of the algorithm
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3266
diff changeset
   406
f9206b009f48 stablesort: write a flat version of the algorithm
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3266
diff changeset
   407
            ps = parents(current)
f9206b009f48 stablesort: write a flat version of the algorithm
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3266
diff changeset
   408
            if not ps:
f9206b009f48 stablesort: write a flat version of the algorithm
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3266
diff changeset
   409
                current = None # break
f9206b009f48 stablesort: write a flat version of the algorithm
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3266
diff changeset
   410
            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
   411
                current = ps[0]
f9206b009f48 stablesort: write a flat version of the algorithm
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3266
diff changeset
   412
            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
   413
                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
   414
3315
c153441cdc0e stablesort: record, cache and reuse jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3314
diff changeset
   415
                rev = current
c153441cdc0e stablesort: record, cache and reuse jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3314
diff changeset
   416
                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
   417
3329
c056f125e17d stablesort: record previous segment size in the jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3328
diff changeset
   418
                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
   419
                    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
   420
                    jumps.append(jump)
3317
a950e6cc5e9e stablesort: clarify subcall to the exclusive side
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3315
diff changeset
   421
                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
   422
                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
   423
                                   tiebreaker, recordjump):
3267
f9206b009f48 stablesort: write a flat version of the algorithm
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3266
diff changeset
   424
                    yield rev
f9206b009f48 stablesort: write a flat version of the algorithm
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3266
diff changeset
   425
3328
ff262ae59541 stablesort: move jump recording inside the exclusive function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3326
diff changeset
   426
                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
   427
                    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
   428
3334
db8feb404792 stablesort: abstract all cache access
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3329
diff changeset
   429
                self._setjumps(current, jumps)
3315
c153441cdc0e stablesort: record, cache and reuse jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3314
diff changeset
   430
3267
f9206b009f48 stablesort: write a flat version of the algorithm
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3266
diff changeset
   431
                current = lower_parent
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
    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
   434
                                recordjump):
3267
f9206b009f48 stablesort: write a flat version of the algorithm
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3266
diff changeset
   435
3317
a950e6cc5e9e stablesort: clarify subcall to the exclusive side
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3315
diff changeset
   436
        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
   437
3321
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   438
        def popready(stack):
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   439
            """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
   440
            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
   441
                if children[stack[idx]].issubset(seen):
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   442
                    return stack.pop(idx)
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   443
            return None
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   444
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   445
        hardstack = []
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   446
        previous = None
3267
f9206b009f48 stablesort: write a flat version of the algorithm
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3266
diff changeset
   447
        seen = set()
3321
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   448
        current = higher
3267
f9206b009f48 stablesort: write a flat version of the algorithm
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3266
diff changeset
   449
        children = collections.defaultdict(set)
3321
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   450
        bound = set(exclusive)
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   451
        if exclusive:
3267
f9206b009f48 stablesort: write a flat version of the algorithm
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3266
diff changeset
   452
            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
   453
                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
   454
                    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
   455
3321
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   456
            hardstack.append(higher)
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   457
        nextjump = False
3329
c056f125e17d stablesort: record previous segment size in the jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3328
diff changeset
   458
        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
   459
        while hardstack:
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   460
            current = popready(hardstack)
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   461
            if current in seen:
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   462
                continue
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   463
            softstack = []
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   464
            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
   465
                if nextjump:
3329
c056f125e17d stablesort: record previous segment size in the jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3328
diff changeset
   466
                    recordjump(previous, current, size)
3321
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   467
                    nextjump = False
3329
c056f125e17d stablesort: record previous segment size in the jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3328
diff changeset
   468
                    size = 0
3321
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   469
                yield current
3329
c056f125e17d stablesort: record previous segment size in the jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3328
diff changeset
   470
                size += 1
3321
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   471
                previous = current
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   472
                seen.add(current)
3315
c153441cdc0e stablesort: record, cache and reuse jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3314
diff changeset
   473
3321
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   474
                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
   475
3321
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   476
                # search or next parent to walk through
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   477
                fallback, next = None, None
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   478
                if 1 == len(all_parents):
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   479
                    next = all_parents[0]
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   480
                elif 2 <= len(all_parents):
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   481
                    fallback, next = sorted(all_parents, key=tiebreaker)
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   482
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   483
                # filter parent not ready (children not emitted)
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   484
                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
   485
                    nextjump = True
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   486
                    next = fallback
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   487
                    fallback = None
3315
c153441cdc0e stablesort: record, cache and reuse jump
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3314
diff changeset
   488
3321
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   489
                # stack management
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   490
                if next is None:
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   491
                    next = popready(softstack)
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   492
                    if next is not None:
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   493
                        nextjump = True
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   494
                elif fallback is not None:
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   495
                    softstack.append(fallback)
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
                # get ready for next iteration
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   498
                current = next
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   499
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   500
            # 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
   501
            nextjump = True
14024940f369 stablesort: rework jump gathering
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3320
diff changeset
   502
            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
   503
3328
ff262ae59541 stablesort: move jump recording inside the exclusive function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3326
diff changeset
   504
        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
   505
            recordjump(previous, lower, size)
3263
07678f7a4481 stablesort: introduce a cache object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3262
diff changeset
   506
3337
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   507
def stablesort_mergepoint_head_ondisk(repo, revs, limit=None):
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   508
    heads = repo.revs('heads(%ld)', revs)
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   509
    if not heads:
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   510
        return []
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   511
    elif 2 < len(heads):
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   512
        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
   513
                          % len(heads))
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   514
    head = heads.first()
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   515
    unfi = repo.unfiltered()
3338
3f049353d733 stablesort: expose the cache through the repository
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3337
diff changeset
   516
    cache = unfi.stablesort
3337
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   517
    cache.save(unfi)
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   518
    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
   519
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   520
S_INDEXSIZE = struct.Struct('>I')
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   521
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   522
class ondiskstablesortcache(stablesortcache, genericcaches.changelogsourcebase):
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
    _filepath = 'evoext-stablesortcache-00'
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   525
    _cachename = 'evo-ext-stablesort'
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   526
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   527
    def __init__(self):
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   528
        super(ondiskstablesortcache, self).__init__()
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   529
        self._index = array.array('l')
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   530
        self._data = array.array('l')
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   531
        del self._jumps
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   532
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   533
    def getjumps(self, repo, rev):
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   534
        if len(self._index) < rev:
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   535
            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
   536
            msg %= (len(self._index), rev)
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   537
            raise error.ProgrammingError(msg)
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   538
        return self._getjumps(rev)
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   539
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   540
    def _getjumps(self, rev):
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   541
        # very first revision
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   542
        if rev == 0:
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
        # no data yet
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   545
        if len(self._index) <= rev:
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   546
            return None
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   547
        index = self._index
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   548
        # non merge revision
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   549
        if index[rev] == index[rev - 1]:
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   550
            return None
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   551
        data = self._data
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   552
        # merge revision
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   553
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   554
        def jumps():
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   555
            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
   556
                i = idx * 3
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   557
                yield tuple(data[i:i + 3])
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   558
        return jumps()
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   559
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   560
    def _setjumps(self, rev, jumps):
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   561
        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
   562
        if rev == 0:
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   563
            self._index.append(0)
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   564
            return
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   565
        end = self._index[rev - 1]
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   566
        if jumps is None:
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   567
            self._index.append(end)
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   568
            return
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   569
        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
   570
        for j in jumps:
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   571
            self._data.append(j[0])
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   572
            self._data.append(j[1])
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   573
            self._data.append(j[2])
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   574
            end += 1
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   575
        self._index.append(end)
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
    def _updatefrom(self, repo, data):
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   578
        repo = repo.unfiltered()
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   579
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   580
        total = len(data)
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   581
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   582
        def progress(pos, rev):
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   583
            repo.ui.progress('updating stablesort cache',
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   584
                             pos, 'rev %s' % rev, unit='revision', total=total)
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   585
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   586
        progress(0, '')
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   587
        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
   588
            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
   589
            if len(parents) <= 1:
3337
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   590
                self._setjumps(rev, None)
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   591
            else:
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   592
                # merge! warn the cache
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   593
                tiebreaker = _mergepoint_tie_breaker(repo)
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   594
                minparent = sorted(parents, key=tiebreaker)[0]
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   595
                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
   596
                    if r == minparent:
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   597
                        break
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   598
            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
   599
                progress(idx, rev)
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   600
        progress(None, '')
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   601
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   602
    def clear(self, reset=False):
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   603
        super(ondiskstablesortcache, self).clear()
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   604
        self._index = array.array('l')
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   605
        self._data = array.array('l')
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
    def load(self, repo):
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   608
        """load data from disk
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   609
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   610
        (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
   611
        """
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   612
        assert repo.filtername is None
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   613
3408
f4ea9652661d cachevfs: use a compatibility later for all access
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3366
diff changeset
   614
        cachevfs = compat.getcachevfs(repo)
f4ea9652661d cachevfs: use a compatibility later for all access
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3366
diff changeset
   615
        data = cachevfs.tryread(self._filepath)
3337
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   616
        self._index = array.array('l')
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   617
        self._data = array.array('l')
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   618
        if not data:
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   619
            self._cachekey = self.emptykey
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   620
        else:
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   621
            headerdata = data[:self._cachekeysize]
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   622
            self._cachekey = self._deserializecachekey(headerdata)
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   623
            offset = self._cachekeysize
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   624
            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
   625
            indexsize = S_INDEXSIZE.unpack(indexsizedata)[0]
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   626
            offset += S_INDEXSIZE.size
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   627
            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
   628
            offset += indexsize
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   629
            self._data.fromstring(data[offset:])
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   630
        self._ondiskkey = self._cachekey
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   631
        pass
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   632
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   633
    def save(self, repo):
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   634
        """save the data to disk
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   635
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   636
        (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
   637
        """
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   638
        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
   639
            return
3408
f4ea9652661d cachevfs: use a compatibility later for all access
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3366
diff changeset
   640
        cachevfs = compat.getcachevfs(repo)
f4ea9652661d cachevfs: use a compatibility later for all access
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3366
diff changeset
   641
        cachefile = 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
   642
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   643
        # data to write
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   644
        headerdata = self._serializecachekey()
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   645
        indexdata = self._index.tostring()
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   646
        data = self._data.tostring()
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   647
        indexsize = S_INDEXSIZE.pack(len(indexdata))
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   648
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   649
        # writing
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   650
        cachefile.write(headerdata)
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   651
        cachefile.write(indexsize)
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   652
        cachefile.write(indexdata)
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   653
        cachefile.write(data)
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   654
        cachefile.close()
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
3f049353d733 stablesort: expose the cache through the repository
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3337
diff changeset
   673
        if util.safehasattr(repo, 'updatecaches'):
3f049353d733 stablesort: expose the cache through the repository
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3337
diff changeset
   674
            @localrepo.unfilteredmethod
3504
5dc34b857114 updatecaches: handle any new parameters to the method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3483
diff changeset
   675
            def updatecaches(self, tr=None, **kwargs):
3366
83b372eceb81 caches: pass the transaction to the "shouldwarncache" logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3358
diff changeset
   676
                if utility.shouldwarmcache(self, tr):
3352
0370c8503e2f stablesort: cleanup the update logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3340
diff changeset
   677
                    self.stablesort.update(self)
0370c8503e2f stablesort: cleanup the update logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3340
diff changeset
   678
                    self.stablesort.save(self)
3504
5dc34b857114 updatecaches: handle any new parameters to the method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3483
diff changeset
   679
                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
   680
3f049353d733 stablesort: expose the cache through the repository
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3337
diff changeset
   681
        else:
3f049353d733 stablesort: expose the cache through the repository
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3337
diff changeset
   682
            def transaction(self, *args, **kwargs):
3f049353d733 stablesort: expose the cache through the repository
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3337
diff changeset
   683
                tr = super(stablesortrepo, self).transaction(*args, **kwargs)
3f049353d733 stablesort: expose the cache through the repository
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3337
diff changeset
   684
                reporef = weakref.ref(self)
3f049353d733 stablesort: expose the cache through the repository
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3337
diff changeset
   685
3f049353d733 stablesort: expose the cache through the repository
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3337
diff changeset
   686
                def _warmcache(tr):
3f049353d733 stablesort: expose the cache through the repository
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3337
diff changeset
   687
                    repo = reporef()
3f049353d733 stablesort: expose the cache through the repository
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3337
diff changeset
   688
                    if repo is None:
3f049353d733 stablesort: expose the cache through the repository
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3337
diff changeset
   689
                        return
3f049353d733 stablesort: expose the cache through the repository
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3337
diff changeset
   690
                    repo = repo.unfiltered()
3352
0370c8503e2f stablesort: cleanup the update logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3340
diff changeset
   691
                    repo.stablesort.update(repo)
0370c8503e2f stablesort: cleanup the update logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3340
diff changeset
   692
                    repo.stablesort.save(repo)
3338
3f049353d733 stablesort: expose the cache through the repository
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3337
diff changeset
   693
3366
83b372eceb81 caches: pass the transaction to the "shouldwarncache" logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3358
diff changeset
   694
                if utility.shouldwarmcache(self, tr):
3338
3f049353d733 stablesort: expose the cache through the repository
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3337
diff changeset
   695
                    tr.addpostclose('warmcache-02stablesort', _warmcache)
3f049353d733 stablesort: expose the cache through the repository
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3337
diff changeset
   696
                return tr
3f049353d733 stablesort: expose the cache through the repository
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3337
diff changeset
   697
3f049353d733 stablesort: expose the cache through the repository
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3337
diff changeset
   698
    repo.__class__ = stablesortrepo
3f049353d733 stablesort: expose the cache through the repository
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3337
diff changeset
   699
3246
543708c3f754 stablesort: add a 'method' argument to the debugstablesort command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3245
diff changeset
   700
_methodmap = {
543708c3f754 stablesort: add a 'method' argument to the debugstablesort command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3245
diff changeset
   701
    'branchpoint': stablesort_branchpoint,
3254
00e20077bccf stablesort: introduce a "mergepoint" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3246
diff changeset
   702
    '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
   703
    '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
   704
    'headstart': stablesort_mergepoint_head_debug,
3263
07678f7a4481 stablesort: introduce a cache object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3262
diff changeset
   705
    'headcached': stablesort_mergepoint_head_cached,
3337
94788616fbeb stablesort: implement an ondisk cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3336
diff changeset
   706
    '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
   707
}