hgext3rd/topic/topicmap.py
author Martin von Zweigbergk <martinvonz@google.com>
Fri, 12 Jul 2019 23:24:04 -0700
changeset 4742 db3e7f6b5ceb
parent 4705 c63f47a4f5ec
child 4758 f0ecf2137824
permissions -rw-r--r--
py3: switch from iteritems() to items() in the topics extension The only remaining iteritems() call is on branchmap. That will be dealt with in the next patch.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1949
79c08d17a3d7 topicmap: move the 'usetopicmap' context manager into the topicmap module
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1937
diff changeset
     1
import contextlib
1968
08cbfeb15a1a compat: mercurial dropped alias for hashlib.sha1
timeless@gmail.com
parents: 1953
diff changeset
     2
import hashlib
1949
79c08d17a3d7 topicmap: move the 'usetopicmap' context manager into the topicmap module
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1937
diff changeset
     3
3397
f7129e3d5a38 topic: suggest using topic when user creates a new head on branch
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2655
diff changeset
     4
from mercurial.i18n import _
2653
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
     5
from mercurial.node import nullid
1937
60b7de2b3dd1 topicmap: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1928
diff changeset
     6
from mercurial import (
60b7de2b3dd1 topicmap: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1928
diff changeset
     7
    branchmap,
1950
99c1a26abf3f topicmap: move 'cgapply' wrapping into the topicmap module
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1949
diff changeset
     8
    changegroup,
1953
bdc5bb223b50 commit: wrap "commitstatus" to take topic into account
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1950
diff changeset
     9
    cmdutil,
1950
99c1a26abf3f topicmap: move 'cgapply' wrapping into the topicmap module
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1949
diff changeset
    10
    extensions,
2653
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
    11
    repoview,
4450
9b0cde5efbc9 topicmap: add compatibility for branchcache that now uses self._entries
Anton Shestakov <av6@dwimlabs.net>
parents: 4187
diff changeset
    12
    util,
1937
60b7de2b3dd1 topicmap: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1928
diff changeset
    13
)
1885
d49f75eab6a3 topic: take topic in account for all branch head computation
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
    14
4536
9837e8d378de topic: only wrap gettopicrepo for repo with topic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4464
diff changeset
    15
from . import (
9837e8d378de topic: only wrap gettopicrepo for repo with topic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4464
diff changeset
    16
    common,
9837e8d378de topic: only wrap gettopicrepo for repo with topic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4464
diff changeset
    17
)
9837e8d378de topic: only wrap gettopicrepo for repo with topic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4464
diff changeset
    18
2653
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
    19
basefilter = set(['base', 'immutable'])
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
    20
def topicfilter(name):
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
    21
    """return a "topic" version of a filter level"""
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
    22
    if name in basefilter:
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
    23
        return name
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
    24
    elif name is None:
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
    25
        return None
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
    26
    elif name.endswith('-topic'):
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
    27
        return name
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
    28
    else:
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
    29
        return name + '-topic'
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
    30
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
    31
def istopicfilter(filtername):
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
    32
    if filtername is None:
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
    33
        return False
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
    34
    return filtername.endswith('-topic')
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
    35
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
    36
def gettopicrepo(repo):
4536
9837e8d378de topic: only wrap gettopicrepo for repo with topic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4464
diff changeset
    37
    if not common.hastopicext(repo):
9837e8d378de topic: only wrap gettopicrepo for repo with topic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4464
diff changeset
    38
        return repo
2653
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
    39
    filtername = topicfilter(repo.filtername)
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
    40
    if filtername == repo.filtername:
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
    41
        return repo
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
    42
    return repo.filtered(filtername)
1885
d49f75eab6a3 topic: take topic in account for all branch head computation
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
    43
2653
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
    44
def _setuptopicfilter(ui):
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
    45
    """extend the filter related mapping with topic related one"""
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
    46
    funcmap = repoview.filtertable
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
    47
    partialmap = branchmap.subsettable
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
    48
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
    49
    # filter level not affected by topic that we should not override
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
    50
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
    51
    for plainname in list(funcmap):
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
    52
        newfilter = topicfilter(plainname)
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
    53
        if newfilter == plainname:
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
    54
            continue
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
    55
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
    56
        def revsfunc(repo, name=plainname):
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
    57
            return repoview.filterrevs(repo, name)
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
    58
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
    59
        base = topicfilter(partialmap[plainname])
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
    60
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
    61
        if newfilter not in funcmap:
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
    62
            funcmap[newfilter] = revsfunc
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
    63
            partialmap[newfilter] = base
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
    64
    funcmap['unfiltered-topic'] = lambda repo: frozenset()
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
    65
    partialmap['unfiltered-topic'] = 'visible-topic'
1885
d49f75eab6a3 topic: take topic in account for all branch head computation
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
    66
1890
e846b8f402d0 topicmap: write and read format from disc
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1885
diff changeset
    67
def _phaseshash(repo, maxrev):
2653
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
    68
    """uniq ID for a phase matching a set of rev"""
1890
e846b8f402d0 topicmap: write and read format from disc
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1885
diff changeset
    69
    revs = set()
e846b8f402d0 topicmap: write and read format from disc
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1885
diff changeset
    70
    cl = repo.changelog
e846b8f402d0 topicmap: write and read format from disc
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1885
diff changeset
    71
    fr = cl.filteredrevs
e846b8f402d0 topicmap: write and read format from disc
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1885
diff changeset
    72
    nm = cl.nodemap
e846b8f402d0 topicmap: write and read format from disc
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1885
diff changeset
    73
    for roots in repo._phasecache.phaseroots[1:]:
e846b8f402d0 topicmap: write and read format from disc
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1885
diff changeset
    74
        for n in roots:
e846b8f402d0 topicmap: write and read format from disc
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1885
diff changeset
    75
            r = nm.get(n)
e846b8f402d0 topicmap: write and read format from disc
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1885
diff changeset
    76
            if r not in fr and r < maxrev:
e846b8f402d0 topicmap: write and read format from disc
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1885
diff changeset
    77
                revs.add(r)
e846b8f402d0 topicmap: write and read format from disc
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1885
diff changeset
    78
    key = nullid
e846b8f402d0 topicmap: write and read format from disc
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1885
diff changeset
    79
    revs = sorted(revs)
e846b8f402d0 topicmap: write and read format from disc
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1885
diff changeset
    80
    if revs:
1968
08cbfeb15a1a compat: mercurial dropped alias for hashlib.sha1
timeless@gmail.com
parents: 1953
diff changeset
    81
        s = hashlib.sha1()
1890
e846b8f402d0 topicmap: write and read format from disc
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1885
diff changeset
    82
        for rev in revs:
e846b8f402d0 topicmap: write and read format from disc
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1885
diff changeset
    83
            s.update('%s;' % rev)
e846b8f402d0 topicmap: write and read format from disc
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1885
diff changeset
    84
        key = s.digest()
e846b8f402d0 topicmap: write and read format from disc
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1885
diff changeset
    85
    return key
e846b8f402d0 topicmap: write and read format from disc
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1885
diff changeset
    86
2653
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
    87
def modsetup(ui):
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
    88
    """call at uisetup time to install various wrappings"""
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
    89
    _setuptopicfilter(ui)
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
    90
    _wrapbmcache(ui)
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
    91
    extensions.wrapfunction(changegroup.cg1unpacker, 'apply', cgapply)
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
    92
    extensions.wrapfunction(cmdutil, 'commitstatus', commitstatus)
1949
79c08d17a3d7 topicmap: move the 'usetopicmap' context manager into the topicmap module
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1937
diff changeset
    93
2653
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
    94
def cgapply(orig, self, repo, *args, **kwargs):
1950
99c1a26abf3f topicmap: move 'cgapply' wrapping into the topicmap module
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1949
diff changeset
    95
    """make sure a topicmap is used when applying a changegroup"""
2653
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
    96
    other = repo.filtered(topicfilter(repo.filtername))
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
    97
    return orig(self, other, *args, **kwargs)
1950
99c1a26abf3f topicmap: move 'cgapply' wrapping into the topicmap module
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1949
diff changeset
    98
1953
bdc5bb223b50 commit: wrap "commitstatus" to take topic into account
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1950
diff changeset
    99
def commitstatus(orig, repo, node, branch, bheads=None, opts=None):
bdc5bb223b50 commit: wrap "commitstatus" to take topic into account
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1950
diff changeset
   100
    # wrap commit status use the topic branch heads
bdc5bb223b50 commit: wrap "commitstatus" to take topic into account
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1950
diff changeset
   101
    ctx = repo[node]
bdc5bb223b50 commit: wrap "commitstatus" to take topic into account
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1950
diff changeset
   102
    if ctx.topic() and ctx.branch() == branch:
4705
c63f47a4f5ec evolve: use right value for branch name when finding branch heads
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4563
diff changeset
   103
        bheads = repo.branchheads("%s:%s" % (branch, ctx.topic()))
3397
f7129e3d5a38 topic: suggest using topic when user creates a new head on branch
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2655
diff changeset
   104
f7129e3d5a38 topic: suggest using topic when user creates a new head on branch
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2655
diff changeset
   105
    ret = orig(repo, node, branch, bheads=bheads, opts=opts)
f7129e3d5a38 topic: suggest using topic when user creates a new head on branch
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2655
diff changeset
   106
f7129e3d5a38 topic: suggest using topic when user creates a new head on branch
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2655
diff changeset
   107
    # logic copy-pasted from cmdutil.commitstatus()
f7129e3d5a38 topic: suggest using topic when user creates a new head on branch
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2655
diff changeset
   108
    if opts is None:
f7129e3d5a38 topic: suggest using topic when user creates a new head on branch
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2655
diff changeset
   109
        opts = {}
f7129e3d5a38 topic: suggest using topic when user creates a new head on branch
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2655
diff changeset
   110
    if ctx.topic():
f7129e3d5a38 topic: suggest using topic when user creates a new head on branch
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2655
diff changeset
   111
        return ret
f7129e3d5a38 topic: suggest using topic when user creates a new head on branch
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2655
diff changeset
   112
    parents = ctx.parents()
f7129e3d5a38 topic: suggest using topic when user creates a new head on branch
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2655
diff changeset
   113
f7129e3d5a38 topic: suggest using topic when user creates a new head on branch
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2655
diff changeset
   114
    if (not opts.get('amend') and bheads and node not in bheads and not
f7129e3d5a38 topic: suggest using topic when user creates a new head on branch
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2655
diff changeset
   115
        [x for x in parents if x.node() in bheads and x.branch() == branch]):
f7129e3d5a38 topic: suggest using topic when user creates a new head on branch
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2655
diff changeset
   116
        repo.ui.status(_("(consider using topic for lightweight branches."
f7129e3d5a38 topic: suggest using topic when user creates a new head on branch
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2655
diff changeset
   117
                         " See 'hg help topic')\n"))
f7129e3d5a38 topic: suggest using topic when user creates a new head on branch
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2655
diff changeset
   118
f7129e3d5a38 topic: suggest using topic when user creates a new head on branch
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2655
diff changeset
   119
    return ret
1953
bdc5bb223b50 commit: wrap "commitstatus" to take topic into account
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1950
diff changeset
   120
2653
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
   121
def _wrapbmcache(ui):
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
   122
    class topiccache(_topiccache, branchmap.branchcache):
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
   123
        pass
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
   124
    branchmap.branchcache = topiccache
4459
d46360b8c0dc topic: make topics compatible with branchmap refactor
Martijn Pieters <mj@octobus.net>
parents: 4450
diff changeset
   125
d46360b8c0dc topic: make topics compatible with branchmap refactor
Martijn Pieters <mj@octobus.net>
parents: 4450
diff changeset
   126
    try:
d46360b8c0dc topic: make topics compatible with branchmap refactor
Martijn Pieters <mj@octobus.net>
parents: 4450
diff changeset
   127
        # Mercurial 4.9
d46360b8c0dc topic: make topics compatible with branchmap refactor
Martijn Pieters <mj@octobus.net>
parents: 4450
diff changeset
   128
        class remotetopiccache(_topiccache, branchmap.remotebranchcache):
d46360b8c0dc topic: make topics compatible with branchmap refactor
Martijn Pieters <mj@octobus.net>
parents: 4450
diff changeset
   129
            pass
d46360b8c0dc topic: make topics compatible with branchmap refactor
Martijn Pieters <mj@octobus.net>
parents: 4450
diff changeset
   130
        branchmap.remotebranchcache = remotetopiccache
d46360b8c0dc topic: make topics compatible with branchmap refactor
Martijn Pieters <mj@octobus.net>
parents: 4450
diff changeset
   131
d46360b8c0dc topic: make topics compatible with branchmap refactor
Martijn Pieters <mj@octobus.net>
parents: 4450
diff changeset
   132
        def _wrapupdatebmcachemethod(orig, self, repo):
d46360b8c0dc topic: make topics compatible with branchmap refactor
Martijn Pieters <mj@octobus.net>
parents: 4450
diff changeset
   133
            # pass in the bound method as the original
d46360b8c0dc topic: make topics compatible with branchmap refactor
Martijn Pieters <mj@octobus.net>
parents: 4450
diff changeset
   134
            return _wrapupdatebmcache(orig.__get__(self), repo)
d46360b8c0dc topic: make topics compatible with branchmap refactor
Martijn Pieters <mj@octobus.net>
parents: 4450
diff changeset
   135
        extensions.wrapfunction(branchmap.BranchMapCache, 'updatecache', _wrapupdatebmcachemethod)
d46360b8c0dc topic: make topics compatible with branchmap refactor
Martijn Pieters <mj@octobus.net>
parents: 4450
diff changeset
   136
    except AttributeError:
d46360b8c0dc topic: make topics compatible with branchmap refactor
Martijn Pieters <mj@octobus.net>
parents: 4450
diff changeset
   137
        # Mercurial 4.8 and before
d46360b8c0dc topic: make topics compatible with branchmap refactor
Martijn Pieters <mj@octobus.net>
parents: 4450
diff changeset
   138
        extensions.wrapfunction(branchmap, 'updatecache', _wrapupdatebmcache)
d46360b8c0dc topic: make topics compatible with branchmap refactor
Martijn Pieters <mj@octobus.net>
parents: 4450
diff changeset
   139
2653
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
   140
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
   141
def _wrapupdatebmcache(orig, repo):
2655
417490bdf28a topic: avoid crash when topic is loaded but not enabled for a repository
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2653
diff changeset
   142
    previous = getattr(repo, '_autobranchmaptopic', False)
2653
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
   143
    try:
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
   144
        repo._autobranchmaptopic = False
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
   145
        return orig(repo)
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
   146
    finally:
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
   147
        repo._autobranchmaptopic = previous
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
   148
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
   149
# needed to prevent reference used for 'super()' call using in branchmap.py to
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
   150
# no go into cycle. (yes, URG)
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
   151
_oldbranchmap = branchmap.branchcache
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
   152
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
   153
@contextlib.contextmanager
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
   154
def oldbranchmap():
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
   155
    previous = branchmap.branchcache
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
   156
    try:
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
   157
        branchmap.branchcache = _oldbranchmap
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
   158
        yield
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
   159
    finally:
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
   160
        branchmap.branchcache = previous
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
   161
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
   162
class _topiccache(object): # combine me with branchmap.branchcache
1885
d49f75eab6a3 topic: take topic in account for all branch head computation
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   163
d49f75eab6a3 topic: take topic in account for all branch head computation
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   164
    def __init__(self, *args, **kwargs):
2653
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
   165
        # super() call may fail otherwise
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
   166
        with oldbranchmap():
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
   167
            super(_topiccache, self).__init__(*args, **kwargs)
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
   168
        self.phaseshash = None
1885
d49f75eab6a3 topic: take topic in account for all branch head computation
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   169
1890
e846b8f402d0 topicmap: write and read format from disc
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1885
diff changeset
   170
    def copy(self):
e846b8f402d0 topicmap: write and read format from disc
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1885
diff changeset
   171
        """return an deep copy of the branchcache object"""
4450
9b0cde5efbc9 topicmap: add compatibility for branchcache that now uses self._entries
Anton Shestakov <av6@dwimlabs.net>
parents: 4187
diff changeset
   172
        if util.safehasattr(self, '_entries'):
9b0cde5efbc9 topicmap: add compatibility for branchcache that now uses self._entries
Anton Shestakov <av6@dwimlabs.net>
parents: 4187
diff changeset
   173
            _entries = self._entries
9b0cde5efbc9 topicmap: add compatibility for branchcache that now uses self._entries
Anton Shestakov <av6@dwimlabs.net>
parents: 4187
diff changeset
   174
        else:
9b0cde5efbc9 topicmap: add compatibility for branchcache that now uses self._entries
Anton Shestakov <av6@dwimlabs.net>
parents: 4187
diff changeset
   175
            # hg <= 4.9 (624d6683c705, b137a6793c51)
9b0cde5efbc9 topicmap: add compatibility for branchcache that now uses self._entries
Anton Shestakov <av6@dwimlabs.net>
parents: 4187
diff changeset
   176
            _entries = self
9b0cde5efbc9 topicmap: add compatibility for branchcache that now uses self._entries
Anton Shestakov <av6@dwimlabs.net>
parents: 4187
diff changeset
   177
        new = self.__class__(_entries, self.tipnode, self.tiprev,
9b0cde5efbc9 topicmap: add compatibility for branchcache that now uses self._entries
Anton Shestakov <av6@dwimlabs.net>
parents: 4187
diff changeset
   178
                             self.filteredhash, self._closednodes)
1890
e846b8f402d0 topicmap: write and read format from disc
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1885
diff changeset
   179
        new.phaseshash = self.phaseshash
e846b8f402d0 topicmap: write and read format from disc
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1885
diff changeset
   180
        return new
e846b8f402d0 topicmap: write and read format from disc
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1885
diff changeset
   181
1885
d49f75eab6a3 topic: take topic in account for all branch head computation
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   182
    def branchtip(self, branch, topic=''):
d49f75eab6a3 topic: take topic in account for all branch head computation
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   183
        '''Return the tipmost open head on branch head, otherwise return the
d49f75eab6a3 topic: take topic in account for all branch head computation
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   184
        tipmost closed head on branch.
d49f75eab6a3 topic: take topic in account for all branch head computation
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   185
        Raise KeyError for unknown branch.'''
d49f75eab6a3 topic: take topic in account for all branch head computation
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   186
        if topic:
d49f75eab6a3 topic: take topic in account for all branch head computation
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   187
            branch = '%s:%s' % (branch, topic)
2653
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
   188
        return super(_topiccache, self).branchtip(branch)
1885
d49f75eab6a3 topic: take topic in account for all branch head computation
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   189
d49f75eab6a3 topic: take topic in account for all branch head computation
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   190
    def branchheads(self, branch, closed=False, topic=''):
d49f75eab6a3 topic: take topic in account for all branch head computation
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   191
        if topic:
d49f75eab6a3 topic: take topic in account for all branch head computation
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   192
            branch = '%s:%s' % (branch, topic)
2653
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
   193
        return super(_topiccache, self).branchheads(branch, closed=closed)
1885
d49f75eab6a3 topic: take topic in account for all branch head computation
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   194
1890
e846b8f402d0 topicmap: write and read format from disc
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1885
diff changeset
   195
    def validfor(self, repo):
e846b8f402d0 topicmap: write and read format from disc
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1885
diff changeset
   196
        """Is the cache content valid regarding a repo
e846b8f402d0 topicmap: write and read format from disc
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1885
diff changeset
   197
e846b8f402d0 topicmap: write and read format from disc
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1885
diff changeset
   198
        - False when cached tipnode is unknown or if we detect a strip.
e846b8f402d0 topicmap: write and read format from disc
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1885
diff changeset
   199
        - True when cache is up to date or a subset of current repo."""
2653
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
   200
        valid = super(_topiccache, self).validfor(repo)
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
   201
        if not valid:
1890
e846b8f402d0 topicmap: write and read format from disc
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1885
diff changeset
   202
            return False
2653
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
   203
        elif not istopicfilter(repo.filtername) or self.phaseshash is None:
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
   204
            # phasehash at None means this is a branchmap
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
   205
            # come from non topic thing
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
   206
            return True
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
   207
        else:
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
   208
            try:
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
   209
                valid = self.phaseshash == _phaseshash(repo, self.tiprev)
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
   210
                return valid
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
   211
            except IndexError:
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
   212
                return False
1890
e846b8f402d0 topicmap: write and read format from disc
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1885
diff changeset
   213
1885
d49f75eab6a3 topic: take topic in account for all branch head computation
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   214
    def write(self, repo):
2653
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
   215
        # we expect mutable set to be small enough to be that computing it all
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
   216
        # the time will be fast enough
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
   217
        if not istopicfilter(repo.filtername):
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
   218
            super(_topiccache, self).write(repo)
1885
d49f75eab6a3 topic: take topic in account for all branch head computation
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   219
d49f75eab6a3 topic: take topic in account for all branch head computation
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   220
    def update(self, repo, revgen):
d49f75eab6a3 topic: take topic in account for all branch head computation
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   221
        """Given a branchhead cache, self, that may have extra nodes or be
d49f75eab6a3 topic: take topic in account for all branch head computation
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   222
        missing heads, and a generator of nodes that are strictly a superset of
d49f75eab6a3 topic: take topic in account for all branch head computation
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   223
        heads missing, this function updates self to be correct.
d49f75eab6a3 topic: take topic in account for all branch head computation
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   224
        """
2653
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
   225
        if not istopicfilter(repo.filtername):
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
   226
            return super(_topiccache, self).update(repo, revgen)
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
   227
        unfi = repo.unfiltered()
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
   228
        oldgetbranchinfo = unfi.revbranchcache().branchinfo
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
   229
4187
49d442a2207f topic: add the changelog argument to branchinfo()
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3397
diff changeset
   230
        def branchinfo(r, changelog=None):
2653
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
   231
            info = oldgetbranchinfo(r)
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
   232
            topic = ''
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
   233
            ctx = unfi[r]
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
   234
            if ctx.mutable():
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
   235
                topic = ctx.topic()
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
   236
            branch = info[0]
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
   237
            if topic:
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
   238
                branch = '%s:%s' % (branch, topic)
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
   239
            return (branch, info[1])
1885
d49f75eab6a3 topic: take topic in account for all branch head computation
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   240
        try:
2653
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
   241
            unfi.revbranchcache().branchinfo = branchinfo
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
   242
            super(_topiccache, self).update(repo, revgen)
1890
e846b8f402d0 topicmap: write and read format from disc
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1885
diff changeset
   243
            self.phaseshash = _phaseshash(repo, self.tiprev)
1885
d49f75eab6a3 topic: take topic in account for all branch head computation
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   244
        finally:
2653
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
   245
            unfi.revbranchcache().branchinfo = oldgetbranchinfo