Mercurial > public > mercurial-scm > evolve
annotate hgext3rd/topic/topicmap.py @ 4459:d46360b8c0dc stable
topic: make topics compatible with branchmap refactor
See https://phab.mercurial-scm.org/D5290
author | Martijn Pieters <mj@octobus.net> |
---|---|
date | Wed, 21 Nov 2018 12:00:46 +0000 |
parents | 9b0cde5efbc9 |
children | 05f8908df4ce |
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, |
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 |
2653
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
15 basefilter = set(['base', 'immutable']) |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
16 def topicfilter(name): |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
17 """return a "topic" version of a filter level""" |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
18 if name in basefilter: |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
19 return name |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
20 elif name is None: |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
21 return None |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
22 elif name.endswith('-topic'): |
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 else: |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
25 return name + '-topic' |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
26 |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
27 def istopicfilter(filtername): |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
28 if filtername is None: |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
29 return False |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
30 return filtername.endswith('-topic') |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
31 |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
32 def gettopicrepo(repo): |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
33 filtername = topicfilter(repo.filtername) |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
34 if filtername == repo.filtername: |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
35 return repo |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
36 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
|
37 |
2653
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
38 def _setuptopicfilter(ui): |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
39 """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
|
40 funcmap = repoview.filtertable |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
41 partialmap = branchmap.subsettable |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
42 |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
43 # 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
|
44 |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
45 for plainname in list(funcmap): |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
46 newfilter = topicfilter(plainname) |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
47 if newfilter == plainname: |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
48 continue |
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 def revsfunc(repo, name=plainname): |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
51 return repoview.filterrevs(repo, name) |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
52 |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
53 base = topicfilter(partialmap[plainname]) |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
54 |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
55 if newfilter not in funcmap: |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
56 funcmap[newfilter] = revsfunc |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
57 partialmap[newfilter] = base |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
58 funcmap['unfiltered-topic'] = lambda repo: frozenset() |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
59 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
|
60 |
1890
e846b8f402d0
topicmap: write and read format from disc
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1885
diff
changeset
|
61 def _phaseshash(repo, maxrev): |
2653
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
62 """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
|
63 revs = set() |
e846b8f402d0
topicmap: write and read format from disc
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1885
diff
changeset
|
64 cl = repo.changelog |
e846b8f402d0
topicmap: write and read format from disc
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1885
diff
changeset
|
65 fr = cl.filteredrevs |
e846b8f402d0
topicmap: write and read format from disc
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1885
diff
changeset
|
66 nm = cl.nodemap |
e846b8f402d0
topicmap: write and read format from disc
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1885
diff
changeset
|
67 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
|
68 for n in roots: |
e846b8f402d0
topicmap: write and read format from disc
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1885
diff
changeset
|
69 r = nm.get(n) |
e846b8f402d0
topicmap: write and read format from disc
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1885
diff
changeset
|
70 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
|
71 revs.add(r) |
e846b8f402d0
topicmap: write and read format from disc
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1885
diff
changeset
|
72 key = nullid |
e846b8f402d0
topicmap: write and read format from disc
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1885
diff
changeset
|
73 revs = sorted(revs) |
e846b8f402d0
topicmap: write and read format from disc
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1885
diff
changeset
|
74 if revs: |
1968
08cbfeb15a1a
compat: mercurial dropped alias for hashlib.sha1
timeless@gmail.com
parents:
1953
diff
changeset
|
75 s = hashlib.sha1() |
1890
e846b8f402d0
topicmap: write and read format from disc
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1885
diff
changeset
|
76 for rev in revs: |
e846b8f402d0
topicmap: write and read format from disc
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1885
diff
changeset
|
77 s.update('%s;' % rev) |
e846b8f402d0
topicmap: write and read format from disc
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1885
diff
changeset
|
78 key = s.digest() |
e846b8f402d0
topicmap: write and read format from disc
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1885
diff
changeset
|
79 return key |
e846b8f402d0
topicmap: write and read format from disc
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1885
diff
changeset
|
80 |
2653
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
81 def modsetup(ui): |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
82 """call at uisetup time to install various wrappings""" |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
83 _setuptopicfilter(ui) |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
84 _wrapbmcache(ui) |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
85 extensions.wrapfunction(changegroup.cg1unpacker, 'apply', cgapply) |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
86 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
|
87 |
2653
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
88 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
|
89 """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
|
90 other = repo.filtered(topicfilter(repo.filtername)) |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
91 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
|
92 |
1953
bdc5bb223b50
commit: wrap "commitstatus" to take topic into account
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1950
diff
changeset
|
93 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
|
94 # 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
|
95 ctx = repo[node] |
bdc5bb223b50
commit: wrap "commitstatus" to take topic into account
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1950
diff
changeset
|
96 if ctx.topic() and ctx.branch() == branch: |
2653
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
97 subbranch = "%s:%s" % (branch, ctx.topic()) |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
98 bheads = repo.branchheads("%s:%s" % (subbranch, 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
|
99 |
f7129e3d5a38
topic: suggest using topic when user creates a new head on branch
Pulkit Goyal <7895pulkit@gmail.com>
parents:
2655
diff
changeset
|
100 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
|
101 |
f7129e3d5a38
topic: suggest using topic when user creates a new head on branch
Pulkit Goyal <7895pulkit@gmail.com>
parents:
2655
diff
changeset
|
102 # 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
|
103 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
|
104 opts = {} |
f7129e3d5a38
topic: suggest using topic when user creates a new head on branch
Pulkit Goyal <7895pulkit@gmail.com>
parents:
2655
diff
changeset
|
105 ctx = repo[node] |
f7129e3d5a38
topic: suggest using topic when user creates a new head on branch
Pulkit Goyal <7895pulkit@gmail.com>
parents:
2655
diff
changeset
|
106 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
|
107 return ret |
f7129e3d5a38
topic: suggest using topic when user creates a new head on branch
Pulkit Goyal <7895pulkit@gmail.com>
parents:
2655
diff
changeset
|
108 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
|
109 |
f7129e3d5a38
topic: suggest using topic when user creates a new head on branch
Pulkit Goyal <7895pulkit@gmail.com>
parents:
2655
diff
changeset
|
110 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
|
111 [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
|
112 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
|
113 " 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
|
114 |
f7129e3d5a38
topic: suggest using topic when user creates a new head on branch
Pulkit Goyal <7895pulkit@gmail.com>
parents:
2655
diff
changeset
|
115 return ret |
1953
bdc5bb223b50
commit: wrap "commitstatus" to take topic into account
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1950
diff
changeset
|
116 |
2653
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
117 def _wrapbmcache(ui): |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
118 class topiccache(_topiccache, branchmap.branchcache): |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
119 pass |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
120 branchmap.branchcache = topiccache |
4459
d46360b8c0dc
topic: make topics compatible with branchmap refactor
Martijn Pieters <mj@octobus.net>
parents:
4450
diff
changeset
|
121 |
d46360b8c0dc
topic: make topics compatible with branchmap refactor
Martijn Pieters <mj@octobus.net>
parents:
4450
diff
changeset
|
122 try: |
d46360b8c0dc
topic: make topics compatible with branchmap refactor
Martijn Pieters <mj@octobus.net>
parents:
4450
diff
changeset
|
123 # Mercurial 4.9 |
d46360b8c0dc
topic: make topics compatible with branchmap refactor
Martijn Pieters <mj@octobus.net>
parents:
4450
diff
changeset
|
124 class remotetopiccache(_topiccache, branchmap.remotebranchcache): |
d46360b8c0dc
topic: make topics compatible with branchmap refactor
Martijn Pieters <mj@octobus.net>
parents:
4450
diff
changeset
|
125 pass |
d46360b8c0dc
topic: make topics compatible with branchmap refactor
Martijn Pieters <mj@octobus.net>
parents:
4450
diff
changeset
|
126 branchmap.remotebranchcache = remotetopiccache |
d46360b8c0dc
topic: make topics compatible with branchmap refactor
Martijn Pieters <mj@octobus.net>
parents:
4450
diff
changeset
|
127 |
d46360b8c0dc
topic: make topics compatible with branchmap refactor
Martijn Pieters <mj@octobus.net>
parents:
4450
diff
changeset
|
128 def _wrapupdatebmcachemethod(orig, self, repo): |
d46360b8c0dc
topic: make topics compatible with branchmap refactor
Martijn Pieters <mj@octobus.net>
parents:
4450
diff
changeset
|
129 # 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
|
130 return _wrapupdatebmcache(orig.__get__(self), repo) |
d46360b8c0dc
topic: make topics compatible with branchmap refactor
Martijn Pieters <mj@octobus.net>
parents:
4450
diff
changeset
|
131 extensions.wrapfunction(branchmap.BranchMapCache, 'updatecache', _wrapupdatebmcachemethod) |
d46360b8c0dc
topic: make topics compatible with branchmap refactor
Martijn Pieters <mj@octobus.net>
parents:
4450
diff
changeset
|
132 except AttributeError: |
d46360b8c0dc
topic: make topics compatible with branchmap refactor
Martijn Pieters <mj@octobus.net>
parents:
4450
diff
changeset
|
133 # Mercurial 4.8 and before |
d46360b8c0dc
topic: make topics compatible with branchmap refactor
Martijn Pieters <mj@octobus.net>
parents:
4450
diff
changeset
|
134 extensions.wrapfunction(branchmap, 'updatecache', _wrapupdatebmcache) |
d46360b8c0dc
topic: make topics compatible with branchmap refactor
Martijn Pieters <mj@octobus.net>
parents:
4450
diff
changeset
|
135 |
2653
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
136 |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
137 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
|
138 previous = getattr(repo, '_autobranchmaptopic', False) |
2653
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
139 try: |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
140 repo._autobranchmaptopic = False |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
141 return orig(repo) |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
142 finally: |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
143 repo._autobranchmaptopic = previous |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
144 |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
145 # 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
|
146 # no go into cycle. (yes, URG) |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
147 _oldbranchmap = branchmap.branchcache |
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 @contextlib.contextmanager |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
150 def oldbranchmap(): |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
151 previous = branchmap.branchcache |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
152 try: |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
153 branchmap.branchcache = _oldbranchmap |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
154 yield |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
155 finally: |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
156 branchmap.branchcache = previous |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
157 |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
158 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
|
159 |
d49f75eab6a3
topic: take topic in account for all branch head computation
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff
changeset
|
160 def __init__(self, *args, **kwargs): |
2653
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
161 # super() call may fail otherwise |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
162 with oldbranchmap(): |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
163 super(_topiccache, self).__init__(*args, **kwargs) |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
164 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
|
165 |
1890
e846b8f402d0
topicmap: write and read format from disc
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1885
diff
changeset
|
166 def copy(self): |
e846b8f402d0
topicmap: write and read format from disc
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1885
diff
changeset
|
167 """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
|
168 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
|
169 _entries = self._entries |
9b0cde5efbc9
topicmap: add compatibility for branchcache that now uses self._entries
Anton Shestakov <av6@dwimlabs.net>
parents:
4187
diff
changeset
|
170 else: |
9b0cde5efbc9
topicmap: add compatibility for branchcache that now uses self._entries
Anton Shestakov <av6@dwimlabs.net>
parents:
4187
diff
changeset
|
171 # 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
|
172 _entries = self |
9b0cde5efbc9
topicmap: add compatibility for branchcache that now uses self._entries
Anton Shestakov <av6@dwimlabs.net>
parents:
4187
diff
changeset
|
173 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
|
174 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
|
175 new.phaseshash = self.phaseshash |
e846b8f402d0
topicmap: write and read format from disc
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1885
diff
changeset
|
176 return new |
e846b8f402d0
topicmap: write and read format from disc
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1885
diff
changeset
|
177 |
1885
d49f75eab6a3
topic: take topic in account for all branch head computation
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff
changeset
|
178 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
|
179 '''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
|
180 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
|
181 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
|
182 if topic: |
d49f75eab6a3
topic: take topic in account for all branch head computation
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff
changeset
|
183 branch = '%s:%s' % (branch, topic) |
2653
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
184 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
|
185 |
d49f75eab6a3
topic: take topic in account for all branch head computation
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff
changeset
|
186 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
|
187 if topic: |
d49f75eab6a3
topic: take topic in account for all branch head computation
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff
changeset
|
188 branch = '%s:%s' % (branch, topic) |
2653
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
189 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
|
190 |
1890
e846b8f402d0
topicmap: write and read format from disc
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1885
diff
changeset
|
191 def validfor(self, repo): |
e846b8f402d0
topicmap: write and read format from disc
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1885
diff
changeset
|
192 """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
|
193 |
e846b8f402d0
topicmap: write and read format from disc
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1885
diff
changeset
|
194 - 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
|
195 - 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
|
196 valid = super(_topiccache, self).validfor(repo) |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
197 if not valid: |
1890
e846b8f402d0
topicmap: write and read format from disc
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1885
diff
changeset
|
198 return False |
2653
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
199 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
|
200 # phasehash at None means this is a branchmap |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
201 # come from non topic thing |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
202 return True |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
203 else: |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
204 try: |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
205 valid = self.phaseshash == _phaseshash(repo, self.tiprev) |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
206 return valid |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
207 except IndexError: |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
208 return False |
1890
e846b8f402d0
topicmap: write and read format from disc
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1885
diff
changeset
|
209 |
1885
d49f75eab6a3
topic: take topic in account for all branch head computation
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff
changeset
|
210 def write(self, repo): |
2653
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
211 # 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
|
212 # the time will be fast enough |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
213 if not istopicfilter(repo.filtername): |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
214 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
|
215 |
d49f75eab6a3
topic: take topic in account for all branch head computation
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff
changeset
|
216 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
|
217 """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
|
218 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
|
219 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
|
220 """ |
2653
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
221 if not istopicfilter(repo.filtername): |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
222 return super(_topiccache, self).update(repo, revgen) |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
223 unfi = repo.unfiltered() |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
224 oldgetbranchinfo = unfi.revbranchcache().branchinfo |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
225 |
4187
49d442a2207f
topic: add the changelog argument to branchinfo()
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
3397
diff
changeset
|
226 def branchinfo(r, changelog=None): |
2653
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
227 info = oldgetbranchinfo(r) |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
228 topic = '' |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
229 ctx = unfi[r] |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
230 if ctx.mutable(): |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
231 topic = ctx.topic() |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
232 branch = info[0] |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
233 if topic: |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
234 branch = '%s:%s' % (branch, topic) |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
235 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
|
236 try: |
2653
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
237 unfi.revbranchcache().branchinfo = branchinfo |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
238 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
|
239 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
|
240 finally: |
2653
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
241 unfi.revbranchcache().branchinfo = oldgetbranchinfo |