annotate hgext3rd/topic/topicmap.py @ 6387:a87abe69a2f8 stable

topic: branchmap already imports subsettable from repoviewutil Even on hg <= 4.9. But let's add a comment so that we can import from repoviewutil module directly when we drop compatibility with 4.9.
author Anton Shestakov <av6@dwimlabs.net>
date Sun, 05 Feb 2023 18:47:38 +0400
parents f168c0fdbde9
children 0baef8dde96b
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
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,
99c1a26abf3f topicmap: move 'cgapply' wrapping into the topicmap module
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1949
diff changeset
9 extensions,
2653
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
10 repoview,
4450
9b0cde5efbc9 topicmap: add compatibility for branchcache that now uses self._entries
Anton Shestakov <av6@dwimlabs.net>
parents: 4187
diff changeset
11 util,
1937
60b7de2b3dd1 topicmap: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1928
diff changeset
12 )
1885
d49f75eab6a3 topic: take topic in account for all branch head computation
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
13
4536
9837e8d378de topic: only wrap gettopicrepo for repo with topic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4464
diff changeset
14 from . import (
9837e8d378de topic: only wrap gettopicrepo for repo with topic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4464
diff changeset
15 common,
4929
bb2b4f6c99dc compat: compatibility for cl.nodemap.get vs cl.index.get_rev
Anton Shestakov <av6@dwimlabs.net>
parents: 4814
diff changeset
16 compat,
4536
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
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4803
diff changeset
19 basefilter = set([b'base', b'immutable'])
2653
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
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4803
diff changeset
26 elif name.endswith(b'-topic'):
2653
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:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4803
diff changeset
29 return name + b'-topic'
2653
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
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4803
diff changeset
34 return filtername.endswith(b'-topic')
2653
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
6387
a87abe69a2f8 topic: branchmap already imports subsettable from repoviewutil
Anton Shestakov <av6@dwimlabs.net>
parents: 6363
diff changeset
47 # hg <= 4.9 (caebe5e7f4bd)
2653
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
48 partialmap = branchmap.subsettable
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
49
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
50 # 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
51
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
52 for plainname in list(funcmap):
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
53 newfilter = topicfilter(plainname)
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
54 if newfilter == plainname:
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
55 continue
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
56
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
57 def revsfunc(repo, name=plainname):
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
58 return repoview.filterrevs(repo, name)
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
59
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
60 base = topicfilter(partialmap[plainname])
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
61
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
62 if newfilter not in funcmap:
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
63 funcmap[newfilter] = revsfunc
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
64 partialmap[newfilter] = base
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4803
diff changeset
65 funcmap[b'unfiltered-topic'] = lambda repo: frozenset()
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4803
diff changeset
66 partialmap[b'unfiltered-topic'] = b'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
67
1890
e846b8f402d0 topicmap: write and read format from disc
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1885
diff changeset
68 def _phaseshash(repo, maxrev):
2653
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
69 """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
70 revs = set()
e846b8f402d0 topicmap: write and read format from disc
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1885
diff changeset
71 cl = repo.changelog
e846b8f402d0 topicmap: write and read format from disc
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1885
diff changeset
72 fr = cl.filteredrevs
4929
bb2b4f6c99dc compat: compatibility for cl.nodemap.get vs cl.index.get_rev
Anton Shestakov <av6@dwimlabs.net>
parents: 4814
diff changeset
73 getrev = compat.getgetrev(cl)
5426
86736040b0ec topic: compatibility with sparse phaseroots and phasesets in 5.5
Joerg Sonnenberger <joerg@bec.de>
parents: 5193
diff changeset
74 for n in compat.nonpublicphaseroots(repo):
86736040b0ec topic: compatibility with sparse phaseroots and phasesets in 5.5
Joerg Sonnenberger <joerg@bec.de>
parents: 5193
diff changeset
75 r = getrev(n)
86736040b0ec topic: compatibility with sparse phaseroots and phasesets in 5.5
Joerg Sonnenberger <joerg@bec.de>
parents: 5193
diff changeset
76 if r not in fr and r < maxrev:
86736040b0ec topic: compatibility with sparse phaseroots and phasesets in 5.5
Joerg Sonnenberger <joerg@bec.de>
parents: 5193
diff changeset
77 revs.add(r)
1890
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:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4803
diff changeset
83 s.update(b'%d;' % rev)
1890
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)
5665
dd9dba7c1d00 compat: make topics compatible across change to cmdutil.commitstatus()
Martin von Zweigbergk <martinvonz@google.com>
parents: 5426
diff changeset
92 compat.overridecommitstatus(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
5665
dd9dba7c1d00 compat: make topics compatible across change to cmdutil.commitstatus()
Martin von Zweigbergk <martinvonz@google.com>
parents: 5426
diff changeset
99 def commitstatus(orig, repo, node, branch, bheads=None, tip=None, opts=None):
1953
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:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4803
diff changeset
103 bheads = repo.branchheads(b"%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
5665
dd9dba7c1d00 compat: make topics compatible across change to cmdutil.commitstatus()
Martin von Zweigbergk <martinvonz@google.com>
parents: 5426
diff changeset
105 ret = orig(repo, node, branch, bheads=bheads, tip=tip, opts=opts)
3397
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
6363
f168c0fdbde9 topic: copy parent branch check in commitstatus() from core
Anton Shestakov <av6@dwimlabs.net>
parents: 5847
diff changeset
114 if (not opts.get(b'amend') and bheads and node not in bheads and not any(
f168c0fdbde9 topic: copy parent branch check in commitstatus() from core
Anton Shestakov <av6@dwimlabs.net>
parents: 5847
diff changeset
115 p.node() in bheads and p.branch() == branch for p in parents
f168c0fdbde9 topic: copy parent branch check in commitstatus() from core
Anton Shestakov <av6@dwimlabs.net>
parents: 5847
diff changeset
116 )):
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4803
diff changeset
117 repo.ui.status(_(b"(consider using topic for lightweight branches."
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4803
diff changeset
118 b" See 'hg help topic')\n"))
3397
f7129e3d5a38 topic: suggest using topic when user creates a new head on branch
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2655
diff changeset
119
f7129e3d5a38 topic: suggest using topic when user creates a new head on branch
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2655
diff changeset
120 return ret
1953
bdc5bb223b50 commit: wrap "commitstatus" to take topic into account
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1950
diff changeset
121
2653
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
122 def _wrapbmcache(ui):
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
123 class topiccache(_topiccache, branchmap.branchcache):
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
124 pass
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
125 branchmap.branchcache = topiccache
4459
d46360b8c0dc topic: make topics compatible with branchmap refactor
Martijn Pieters <mj@octobus.net>
parents: 4450
diff changeset
126
d46360b8c0dc topic: make topics compatible with branchmap refactor
Martijn Pieters <mj@octobus.net>
parents: 4450
diff changeset
127 try:
5193
a4d081923c81 compat: update hg-X.Y compat comments and test them
Anton Shestakov <av6@dwimlabs.net>
parents: 4929
diff changeset
128 # Mercurial 5.0
4459
d46360b8c0dc topic: make topics compatible with branchmap refactor
Martijn Pieters <mj@octobus.net>
parents: 4450
diff changeset
129 class remotetopiccache(_topiccache, branchmap.remotebranchcache):
d46360b8c0dc topic: make topics compatible with branchmap refactor
Martijn Pieters <mj@octobus.net>
parents: 4450
diff changeset
130 pass
d46360b8c0dc topic: make topics compatible with branchmap refactor
Martijn Pieters <mj@octobus.net>
parents: 4450
diff changeset
131 branchmap.remotebranchcache = remotetopiccache
d46360b8c0dc topic: make topics compatible with branchmap refactor
Martijn Pieters <mj@octobus.net>
parents: 4450
diff changeset
132
d46360b8c0dc topic: make topics compatible with branchmap refactor
Martijn Pieters <mj@octobus.net>
parents: 4450
diff changeset
133 def _wrapupdatebmcachemethod(orig, self, repo):
d46360b8c0dc topic: make topics compatible with branchmap refactor
Martijn Pieters <mj@octobus.net>
parents: 4450
diff changeset
134 # 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
135 return _wrapupdatebmcache(orig.__get__(self), repo)
d46360b8c0dc topic: make topics compatible with branchmap refactor
Martijn Pieters <mj@octobus.net>
parents: 4450
diff changeset
136 extensions.wrapfunction(branchmap.BranchMapCache, 'updatecache', _wrapupdatebmcachemethod)
d46360b8c0dc topic: make topics compatible with branchmap refactor
Martijn Pieters <mj@octobus.net>
parents: 4450
diff changeset
137 except AttributeError:
5193
a4d081923c81 compat: update hg-X.Y compat comments and test them
Anton Shestakov <av6@dwimlabs.net>
parents: 4929
diff changeset
138 # hg <= 4.9 (3461814417f3)
4459
d46360b8c0dc topic: make topics compatible with branchmap refactor
Martijn Pieters <mj@octobus.net>
parents: 4450
diff changeset
139 extensions.wrapfunction(branchmap, 'updatecache', _wrapupdatebmcache)
d46360b8c0dc topic: make topics compatible with branchmap refactor
Martijn Pieters <mj@octobus.net>
parents: 4450
diff changeset
140
2653
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
141
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
142 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
143 previous = getattr(repo, '_autobranchmaptopic', False)
2653
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
144 try:
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
145 repo._autobranchmaptopic = False
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
146 return orig(repo)
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
147 finally:
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
148 repo._autobranchmaptopic = previous
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
149
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
150 # 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
151 # no go into cycle. (yes, URG)
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
152 _oldbranchmap = branchmap.branchcache
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
153
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
154 @contextlib.contextmanager
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
155 def oldbranchmap():
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
156 previous = branchmap.branchcache
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
157 try:
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
158 branchmap.branchcache = _oldbranchmap
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
159 yield
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
160 finally:
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
161 branchmap.branchcache = previous
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
162
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
163 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
164
d49f75eab6a3 topic: take topic in account for all branch head computation
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
165 def __init__(self, *args, **kwargs):
2653
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
166 # super() call may fail otherwise
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
167 with oldbranchmap():
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
168 super(_topiccache, self).__init__(*args, **kwargs)
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
169 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
170
1890
e846b8f402d0 topicmap: write and read format from disc
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1885
diff changeset
171 def copy(self):
e846b8f402d0 topicmap: write and read format from disc
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1885
diff changeset
172 """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
173 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
174 _entries = self._entries
9b0cde5efbc9 topicmap: add compatibility for branchcache that now uses self._entries
Anton Shestakov <av6@dwimlabs.net>
parents: 4187
diff changeset
175 else:
5193
a4d081923c81 compat: update hg-X.Y compat comments and test them
Anton Shestakov <av6@dwimlabs.net>
parents: 4929
diff changeset
176 # hg <= 4.9 (624d6683c705+b137a6793c51)
4450
9b0cde5efbc9 topicmap: add compatibility for branchcache that now uses self._entries
Anton Shestakov <av6@dwimlabs.net>
parents: 4187
diff changeset
177 _entries = self
5847
ad7c9c0b7a63 topic: compatibility for branchcache having a repo argument in 5.8
Anton Shestakov <av6@dwimlabs.net>
parents: 5665
diff changeset
178 args = (_entries, self.tipnode, self.tiprev, self.filteredhash,
ad7c9c0b7a63 topic: compatibility for branchcache having a repo argument in 5.8
Anton Shestakov <av6@dwimlabs.net>
parents: 5665
diff changeset
179 self._closednodes)
ad7c9c0b7a63 topic: compatibility for branchcache having a repo argument in 5.8
Anton Shestakov <av6@dwimlabs.net>
parents: 5665
diff changeset
180 if util.safehasattr(self, '_repo'):
ad7c9c0b7a63 topic: compatibility for branchcache having a repo argument in 5.8
Anton Shestakov <av6@dwimlabs.net>
parents: 5665
diff changeset
181 # hg <= 5.7 (6266d19556ad)
ad7c9c0b7a63 topic: compatibility for branchcache having a repo argument in 5.8
Anton Shestakov <av6@dwimlabs.net>
parents: 5665
diff changeset
182 args = (self._repo,) + args
ad7c9c0b7a63 topic: compatibility for branchcache having a repo argument in 5.8
Anton Shestakov <av6@dwimlabs.net>
parents: 5665
diff changeset
183 new = self.__class__(*args)
1890
e846b8f402d0 topicmap: write and read format from disc
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1885
diff changeset
184 new.phaseshash = self.phaseshash
e846b8f402d0 topicmap: write and read format from disc
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1885
diff changeset
185 return new
e846b8f402d0 topicmap: write and read format from disc
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1885
diff changeset
186
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4803
diff changeset
187 def branchtip(self, branch, topic=b''):
1885
d49f75eab6a3 topic: take topic in account for all branch head computation
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
188 '''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
189 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
190 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
191 if topic:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4803
diff changeset
192 branch = b'%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).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
194
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4803
diff changeset
195 def branchheads(self, branch, closed=False, topic=b''):
1885
d49f75eab6a3 topic: take topic in account for all branch head computation
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
196 if topic:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4803
diff changeset
197 branch = b'%s:%s' % (branch, topic)
2653
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
198 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
199
1890
e846b8f402d0 topicmap: write and read format from disc
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1885
diff changeset
200 def validfor(self, repo):
e846b8f402d0 topicmap: write and read format from disc
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1885
diff changeset
201 """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
202
e846b8f402d0 topicmap: write and read format from disc
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1885
diff changeset
203 - 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
204 - 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
205 valid = super(_topiccache, self).validfor(repo)
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
206 if not valid:
1890
e846b8f402d0 topicmap: write and read format from disc
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1885
diff changeset
207 return False
2653
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
208 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
209 # phasehash at None means this is a branchmap
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
210 # come from non topic thing
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
211 return True
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
212 else:
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
213 try:
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
214 valid = self.phaseshash == _phaseshash(repo, self.tiprev)
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
215 return valid
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
216 except IndexError:
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
217 return False
1890
e846b8f402d0 topicmap: write and read format from disc
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1885
diff changeset
218
1885
d49f75eab6a3 topic: take topic in account for all branch head computation
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
219 def write(self, repo):
2653
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
220 # 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
221 # the time will be fast enough
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
222 if not istopicfilter(repo.filtername):
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
223 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
224
d49f75eab6a3 topic: take topic in account for all branch head computation
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
225 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
226 """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
227 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
228 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
229 """
2653
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
230 if not istopicfilter(repo.filtername):
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
231 return super(_topiccache, self).update(repo, revgen)
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
232 unfi = repo.unfiltered()
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
233 oldgetbranchinfo = unfi.revbranchcache().branchinfo
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
234
4187
49d442a2207f topic: add the changelog argument to branchinfo()
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3397
diff changeset
235 def branchinfo(r, changelog=None):
2653
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
236 info = oldgetbranchinfo(r)
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4803
diff changeset
237 topic = b''
2653
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
238 ctx = unfi[r]
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
239 if ctx.mutable():
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
240 topic = ctx.topic()
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
241 branch = info[0]
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
242 if topic:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4803
diff changeset
243 branch = b'%s:%s' % (branch, topic)
2653
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
244 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
245 try:
2653
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
246 unfi.revbranchcache().branchinfo = branchinfo
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
247 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
248 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
249 finally:
2653
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
250 unfi.revbranchcache().branchinfo = oldgetbranchinfo