Mercurial > evolve
annotate hgext3rd/topic/topicmap.py @ 6880:906b5af0b2a6
topic: use FQBN for displaying topic name when it grows multiple changesets
author | Anton Shestakov <av6@dwimlabs.net> |
---|---|
date | Tue, 17 Sep 2024 21:17:56 +0400 |
parents | 417f775d3eee |
children |
rev | line source |
---|---|
6631
0f8dbea4458e
topic: use functools.partial() instead of using __get__ method-wrapper
Anton Shestakov <av6@dwimlabs.net>
parents:
6621
diff
changeset
|
1 import functools |
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 |
6747
61a356e23921
topic: drop repoviewutil.subsettable compatibility for hg 4.9
Anton Shestakov <av6@dwimlabs.net>
parents:
6746
diff
changeset
|
14 from mercurial.utils import repoviewutil |
61a356e23921
topic: drop repoviewutil.subsettable compatibility for hg 4.9
Anton Shestakov <av6@dwimlabs.net>
parents:
6746
diff
changeset
|
15 |
4536
9837e8d378de
topic: only wrap gettopicrepo for repo with topic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4464
diff
changeset
|
16 from . import ( |
9837e8d378de
topic: only wrap gettopicrepo for repo with topic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4464
diff
changeset
|
17 common, |
4929
bb2b4f6c99dc
compat: compatibility for cl.nodemap.get vs cl.index.get_rev
Anton Shestakov <av6@dwimlabs.net>
parents:
4814
diff
changeset
|
18 compat, |
6376
5c8196a550b6
topic: make hg stack work for branches with double slashes in them
Anton Shestakov <av6@dwimlabs.net>
parents:
6369
diff
changeset
|
19 discovery, |
4536
9837e8d378de
topic: only wrap gettopicrepo for repo with topic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4464
diff
changeset
|
20 ) |
9837e8d378de
topic: only wrap gettopicrepo for repo with topic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4464
diff
changeset
|
21 |
4814
48b30ff742cb
python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents:
4803
diff
changeset
|
22 basefilter = set([b'base', b'immutable']) |
2653
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
23 def topicfilter(name): |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
24 """return a "topic" version of a filter level""" |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
25 if name in basefilter: |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
26 return name |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
27 elif name is None: |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
28 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
|
29 elif name.endswith(b'-topic'): |
2653
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
30 return name |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
31 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
|
32 return name + b'-topic' |
2653
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
33 |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
34 def istopicfilter(filtername): |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
35 if filtername is None: |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
36 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
|
37 return filtername.endswith(b'-topic') |
2653
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
38 |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
39 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
|
40 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
|
41 return repo |
2653
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
42 filtername = topicfilter(repo.filtername) |
6790
38a845d432e9
topic: make sure filtername is not None
Anton Shestakov <av6@dwimlabs.net>
parents:
6789
diff
changeset
|
43 if filtername is None or filtername == repo.filtername: |
2653
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
44 return repo |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
45 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
|
46 |
2653
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
47 def _setuptopicfilter(ui): |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
48 """extend the filter related mapping with topic related one""" |
6747
61a356e23921
topic: drop repoviewutil.subsettable compatibility for hg 4.9
Anton Shestakov <av6@dwimlabs.net>
parents:
6746
diff
changeset
|
49 for plainname in list(repoview.filtertable): |
2653
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
50 newfilter = topicfilter(plainname) |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
51 if newfilter == plainname: |
6790
38a845d432e9
topic: make sure filtername is not None
Anton Shestakov <av6@dwimlabs.net>
parents:
6789
diff
changeset
|
52 # filter level not affected by topic that we should not override |
2653
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
53 continue |
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 def revsfunc(repo, name=plainname): |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
56 return repoview.filterrevs(repo, name) |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
57 |
6747
61a356e23921
topic: drop repoviewutil.subsettable compatibility for hg 4.9
Anton Shestakov <av6@dwimlabs.net>
parents:
6746
diff
changeset
|
58 base = topicfilter(repoviewutil.subsettable[plainname]) |
2653
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
59 |
6747
61a356e23921
topic: drop repoviewutil.subsettable compatibility for hg 4.9
Anton Shestakov <av6@dwimlabs.net>
parents:
6746
diff
changeset
|
60 if newfilter not in repoview.filtertable: |
61a356e23921
topic: drop repoviewutil.subsettable compatibility for hg 4.9
Anton Shestakov <av6@dwimlabs.net>
parents:
6746
diff
changeset
|
61 repoview.filtertable[newfilter] = revsfunc |
61a356e23921
topic: drop repoviewutil.subsettable compatibility for hg 4.9
Anton Shestakov <av6@dwimlabs.net>
parents:
6746
diff
changeset
|
62 repoviewutil.subsettable[newfilter] = base |
61a356e23921
topic: drop repoviewutil.subsettable compatibility for hg 4.9
Anton Shestakov <av6@dwimlabs.net>
parents:
6746
diff
changeset
|
63 repoview.filtertable[b'unfiltered-topic'] = lambda repo: frozenset() |
61a356e23921
topic: drop repoviewutil.subsettable compatibility for hg 4.9
Anton Shestakov <av6@dwimlabs.net>
parents:
6746
diff
changeset
|
64 repoviewutil.subsettable[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
|
65 |
1890
e846b8f402d0
topicmap: write and read format from disc
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1885
diff
changeset
|
66 def _phaseshash(repo, maxrev): |
2653
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
67 """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
|
68 cl = repo.changelog |
e846b8f402d0
topicmap: write and read format from disc
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1885
diff
changeset
|
69 fr = cl.filteredrevs |
6704
3635782b0290
topic: compatibility for phase roots being revnums
Anton Shestakov <av6@dwimlabs.net>
parents:
6547
diff
changeset
|
70 nppr = compat.nonpublicphaseroots(repo) |
3635782b0290
topic: compatibility for phase roots being revnums
Anton Shestakov <av6@dwimlabs.net>
parents:
6547
diff
changeset
|
71 # starting with hg 6.7rc0 phase roots are already revs instead of nodes |
3635782b0290
topic: compatibility for phase roots being revnums
Anton Shestakov <av6@dwimlabs.net>
parents:
6547
diff
changeset
|
72 # hg <= 6.6 (68289ed170c7) |
3635782b0290
topic: compatibility for phase roots being revnums
Anton Shestakov <av6@dwimlabs.net>
parents:
6547
diff
changeset
|
73 if not util.safehasattr(repo._phasecache, '_phaseroots'): |
3635782b0290
topic: compatibility for phase roots being revnums
Anton Shestakov <av6@dwimlabs.net>
parents:
6547
diff
changeset
|
74 getrev = compat.getgetrev(cl) |
3635782b0290
topic: compatibility for phase roots being revnums
Anton Shestakov <av6@dwimlabs.net>
parents:
6547
diff
changeset
|
75 nppr = set(getrev(n) for n in nppr) |
3635782b0290
topic: compatibility for phase roots being revnums
Anton Shestakov <av6@dwimlabs.net>
parents:
6547
diff
changeset
|
76 revs = sorted(set(r for r in nppr if r not in fr and r < maxrev)) |
1890
e846b8f402d0
topicmap: write and read format from disc
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1885
diff
changeset
|
77 key = nullid |
e846b8f402d0
topicmap: write and read format from disc
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1885
diff
changeset
|
78 if revs: |
1968
08cbfeb15a1a
compat: mercurial dropped alias for hashlib.sha1
timeless@gmail.com
parents:
1953
diff
changeset
|
79 s = hashlib.sha1() |
1890
e846b8f402d0
topicmap: write and read format from disc
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1885
diff
changeset
|
80 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
|
81 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
|
82 key = s.digest() |
e846b8f402d0
topicmap: write and read format from disc
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1885
diff
changeset
|
83 return key |
e846b8f402d0
topicmap: write and read format from disc
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1885
diff
changeset
|
84 |
2653
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
85 def modsetup(ui): |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
86 """call at uisetup time to install various wrappings""" |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
87 _setuptopicfilter(ui) |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
88 _wrapbmcache(ui) |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
89 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
|
90 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
|
91 |
2653
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
92 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
|
93 """make sure a topicmap is used when applying a changegroup""" |
6790
38a845d432e9
topic: make sure filtername is not None
Anton Shestakov <av6@dwimlabs.net>
parents:
6789
diff
changeset
|
94 newfilter = topicfilter(repo.filtername) |
38a845d432e9
topic: make sure filtername is not None
Anton Shestakov <av6@dwimlabs.net>
parents:
6789
diff
changeset
|
95 if newfilter is None: |
38a845d432e9
topic: make sure filtername is not None
Anton Shestakov <av6@dwimlabs.net>
parents:
6789
diff
changeset
|
96 other = repo |
38a845d432e9
topic: make sure filtername is not None
Anton Shestakov <av6@dwimlabs.net>
parents:
6789
diff
changeset
|
97 else: |
38a845d432e9
topic: make sure filtername is not None
Anton Shestakov <av6@dwimlabs.net>
parents:
6789
diff
changeset
|
98 other = repo.filtered(newfilter) |
2653
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
99 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
|
100 |
6547
d13cfd9eb6c0
topic: compatibility for commitstatus(..., **opts)
Anton Shestakov <av6@dwimlabs.net>
parents:
6388
diff
changeset
|
101 def commitstatus(orig, repo, node, branch, bheads=None, tip=None, **opts): |
1953
bdc5bb223b50
commit: wrap "commitstatus" to take topic into account
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1950
diff
changeset
|
102 # 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
|
103 ctx = repo[node] |
6376
5c8196a550b6
topic: make hg stack work for branches with double slashes in them
Anton Shestakov <av6@dwimlabs.net>
parents:
6369
diff
changeset
|
104 ctxbranch = common.formatfqbn(branch=ctx.branch()) |
5c8196a550b6
topic: make hg stack work for branches with double slashes in them
Anton Shestakov <av6@dwimlabs.net>
parents:
6369
diff
changeset
|
105 if ctx.topic() and ctxbranch == 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
|
106 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
|
107 |
6376
5c8196a550b6
topic: make hg stack work for branches with double slashes in them
Anton Shestakov <av6@dwimlabs.net>
parents:
6369
diff
changeset
|
108 with discovery.override_context_branch(repo) as repo: |
6547
d13cfd9eb6c0
topic: compatibility for commitstatus(..., **opts)
Anton Shestakov <av6@dwimlabs.net>
parents:
6388
diff
changeset
|
109 ret = orig(repo, node, branch, bheads=bheads, tip=tip, **opts) |
3397
f7129e3d5a38
topic: suggest using topic when user creates a new head on branch
Pulkit Goyal <7895pulkit@gmail.com>
parents:
2655
diff
changeset
|
110 |
f7129e3d5a38
topic: suggest using topic when user creates a new head on branch
Pulkit Goyal <7895pulkit@gmail.com>
parents:
2655
diff
changeset
|
111 # 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
|
112 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
|
113 return ret |
f7129e3d5a38
topic: suggest using topic when user creates a new head on branch
Pulkit Goyal <7895pulkit@gmail.com>
parents:
2655
diff
changeset
|
114 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
|
115 |
6547
d13cfd9eb6c0
topic: compatibility for commitstatus(..., **opts)
Anton Shestakov <av6@dwimlabs.net>
parents:
6388
diff
changeset
|
116 if (not opts.get('amend') and bheads and node not in bheads and not any( |
6376
5c8196a550b6
topic: make hg stack work for branches with double slashes in them
Anton Shestakov <av6@dwimlabs.net>
parents:
6369
diff
changeset
|
117 p.node() in bheads and common.formatfqbn(branch=p.branch()) == branch |
5c8196a550b6
topic: make hg stack work for branches with double slashes in them
Anton Shestakov <av6@dwimlabs.net>
parents:
6369
diff
changeset
|
118 for p in parents |
6363
f168c0fdbde9
topic: copy parent branch check in commitstatus() from core
Anton Shestakov <av6@dwimlabs.net>
parents:
5847
diff
changeset
|
119 )): |
4814
48b30ff742cb
python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents:
4803
diff
changeset
|
120 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
|
121 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
|
122 |
f7129e3d5a38
topic: suggest using topic when user creates a new head on branch
Pulkit Goyal <7895pulkit@gmail.com>
parents:
2655
diff
changeset
|
123 return ret |
1953
bdc5bb223b50
commit: wrap "commitstatus" to take topic into account
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1950
diff
changeset
|
124 |
2653
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
125 def _wrapbmcache(ui): |
6789
cd8e1a697124
topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents:
6788
diff
changeset
|
126 if util.safehasattr(branchmap, 'BranchCacheV2'): |
cd8e1a697124
topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents:
6788
diff
changeset
|
127 class TopicCache(_TopicCacheV2, branchmap.BranchCacheV2): |
cd8e1a697124
topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents:
6788
diff
changeset
|
128 pass |
cd8e1a697124
topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents:
6788
diff
changeset
|
129 branchmap.BranchCacheV2 = TopicCache |
4459
d46360b8c0dc
topic: make topics compatible with branchmap refactor
Martijn Pieters <mj@octobus.net>
parents:
4450
diff
changeset
|
130 |
6789
cd8e1a697124
topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents:
6788
diff
changeset
|
131 class remotetopiccache(_TopicCacheV2, branchmap.remotebranchcache): |
4459
d46360b8c0dc
topic: make topics compatible with branchmap refactor
Martijn Pieters <mj@octobus.net>
parents:
4450
diff
changeset
|
132 pass |
d46360b8c0dc
topic: make topics compatible with branchmap refactor
Martijn Pieters <mj@octobus.net>
parents:
4450
diff
changeset
|
133 branchmap.remotebranchcache = remotetopiccache |
6789
cd8e1a697124
topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents:
6788
diff
changeset
|
134 else: |
cd8e1a697124
topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents:
6788
diff
changeset
|
135 # hg <= 6.7 (ec640dc9cebd) |
6824
417f775d3eee
topic: we checked that branchmap.branchcache exists, let pytype know this
Anton Shestakov <av6@dwimlabs.net>
parents:
6822
diff
changeset
|
136 assert hasattr(branchmap, 'branchcache') # help pytype |
417f775d3eee
topic: we checked that branchmap.branchcache exists, let pytype know this
Anton Shestakov <av6@dwimlabs.net>
parents:
6822
diff
changeset
|
137 |
6789
cd8e1a697124
topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents:
6788
diff
changeset
|
138 class topiccache(_topiccache, branchmap.branchcache): |
cd8e1a697124
topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents:
6788
diff
changeset
|
139 pass |
cd8e1a697124
topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents:
6788
diff
changeset
|
140 branchmap.branchcache = topiccache |
4459
d46360b8c0dc
topic: make topics compatible with branchmap refactor
Martijn Pieters <mj@octobus.net>
parents:
4450
diff
changeset
|
141 |
6781
79c50e9635e1
topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents:
6748
diff
changeset
|
142 class remotetopiccache(_topiccache, branchmap.remotebranchcache): |
79c50e9635e1
topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents:
6748
diff
changeset
|
143 pass |
79c50e9635e1
topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents:
6748
diff
changeset
|
144 branchmap.remotebranchcache = remotetopiccache |
6789
cd8e1a697124
topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents:
6788
diff
changeset
|
145 |
6746
094fa826f60b
topic: drop branchmap.updatecache() compatibility for hg 4.9
Anton Shestakov <av6@dwimlabs.net>
parents:
6745
diff
changeset
|
146 def _wrapupdatebmcachemethod(orig, self, repo): |
094fa826f60b
topic: drop branchmap.updatecache() compatibility for hg 4.9
Anton Shestakov <av6@dwimlabs.net>
parents:
6745
diff
changeset
|
147 # pass in the bound method as the original |
094fa826f60b
topic: drop branchmap.updatecache() compatibility for hg 4.9
Anton Shestakov <av6@dwimlabs.net>
parents:
6745
diff
changeset
|
148 return _wrapupdatebmcache(functools.partial(orig, self), repo) |
094fa826f60b
topic: drop branchmap.updatecache() compatibility for hg 4.9
Anton Shestakov <av6@dwimlabs.net>
parents:
6745
diff
changeset
|
149 extensions.wrapfunction(branchmap.BranchMapCache, 'updatecache', _wrapupdatebmcachemethod) |
2653
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
150 |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
151 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
|
152 previous = getattr(repo, '_autobranchmaptopic', False) |
2653
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
153 try: |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
154 repo._autobranchmaptopic = False |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
155 return orig(repo) |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
156 finally: |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
157 repo._autobranchmaptopic = previous |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
158 |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
159 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
|
160 |
d49f75eab6a3
topic: take topic in account for all branch head computation
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff
changeset
|
161 def __init__(self, *args, **kwargs): |
6788
0674b56d3526
topic: drop oldbranchmap context manager, _topiccache is now a mixin
Anton Shestakov <av6@dwimlabs.net>
parents:
6704
diff
changeset
|
162 super(_topiccache, self).__init__(*args, **kwargs) |
2653
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
163 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
|
164 |
1890
e846b8f402d0
topicmap: write and read format from disc
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1885
diff
changeset
|
165 def copy(self): |
e846b8f402d0
topicmap: write and read format from disc
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1885
diff
changeset
|
166 """return an deep copy of the branchcache object""" |
6824
417f775d3eee
topic: we checked that branchmap.branchcache exists, let pytype know this
Anton Shestakov <av6@dwimlabs.net>
parents:
6822
diff
changeset
|
167 assert hasattr(branchmap, 'branchcache') # help pytype |
6788
0674b56d3526
topic: drop oldbranchmap context manager, _topiccache is now a mixin
Anton Shestakov <av6@dwimlabs.net>
parents:
6704
diff
changeset
|
168 assert isinstance(self, (branchmap.branchcache, branchmap.remotebranchcache)) # help pytype |
6745
71c4b6c2bcdc
topic: drop branchmap._entries compatibility for hg 4.9
Anton Shestakov <av6@dwimlabs.net>
parents:
6705
diff
changeset
|
169 args = (self._entries, self.tipnode, self.tiprev, self.filteredhash, |
5847
ad7c9c0b7a63
topic: compatibility for branchcache having a repo argument in 5.8
Anton Shestakov <av6@dwimlabs.net>
parents:
5665
diff
changeset
|
170 self._closednodes) |
ad7c9c0b7a63
topic: compatibility for branchcache having a repo argument in 5.8
Anton Shestakov <av6@dwimlabs.net>
parents:
5665
diff
changeset
|
171 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
|
172 # 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
|
173 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
|
174 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
|
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 |
6336
453861da6922
topic: use fully qualified branch name during exchange
Anton Shestakov <av6@dwimlabs.net>
parents:
6333
diff
changeset
|
178 def load(self, repo, lineiter): |
453861da6922
topic: use fully qualified branch name during exchange
Anton Shestakov <av6@dwimlabs.net>
parents:
6333
diff
changeset
|
179 """call branchmap.load(), and then transform branch names to be in the |
453861da6922
topic: use fully qualified branch name during exchange
Anton Shestakov <av6@dwimlabs.net>
parents:
6333
diff
changeset
|
180 new "//" format |
453861da6922
topic: use fully qualified branch name during exchange
Anton Shestakov <av6@dwimlabs.net>
parents:
6333
diff
changeset
|
181 """ |
6824
417f775d3eee
topic: we checked that branchmap.branchcache exists, let pytype know this
Anton Shestakov <av6@dwimlabs.net>
parents:
6822
diff
changeset
|
182 assert hasattr(branchmap, 'branchcache') # help pytype |
6788
0674b56d3526
topic: drop oldbranchmap context manager, _topiccache is now a mixin
Anton Shestakov <av6@dwimlabs.net>
parents:
6704
diff
changeset
|
183 assert isinstance(self, branchmap.branchcache) # help pytype |
6336
453861da6922
topic: use fully qualified branch name during exchange
Anton Shestakov <av6@dwimlabs.net>
parents:
6333
diff
changeset
|
184 super(_topiccache, self).load(repo, lineiter) |
1885
d49f75eab6a3
topic: take topic in account for all branch head computation
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff
changeset
|
185 |
6745
71c4b6c2bcdc
topic: drop branchmap._entries compatibility for hg 4.9
Anton Shestakov <av6@dwimlabs.net>
parents:
6705
diff
changeset
|
186 for branch in tuple(self._entries): |
6336
453861da6922
topic: use fully qualified branch name during exchange
Anton Shestakov <av6@dwimlabs.net>
parents:
6333
diff
changeset
|
187 formatted = common.formatfqbn(branch=branch) |
453861da6922
topic: use fully qualified branch name during exchange
Anton Shestakov <av6@dwimlabs.net>
parents:
6333
diff
changeset
|
188 if branch != formatted: |
6745
71c4b6c2bcdc
topic: drop branchmap._entries compatibility for hg 4.9
Anton Shestakov <av6@dwimlabs.net>
parents:
6705
diff
changeset
|
189 self._entries[formatted] = self._entries.pop(branch) |
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.""" |
6824
417f775d3eee
topic: we checked that branchmap.branchcache exists, let pytype know this
Anton Shestakov <av6@dwimlabs.net>
parents:
6822
diff
changeset
|
196 assert hasattr(branchmap, 'branchcache') # help pytype |
6788
0674b56d3526
topic: drop oldbranchmap context manager, _topiccache is now a mixin
Anton Shestakov <av6@dwimlabs.net>
parents:
6704
diff
changeset
|
197 assert isinstance(self, (branchmap.branchcache, branchmap.remotebranchcache)) # help pytype |
2653
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
198 valid = super(_topiccache, self).validfor(repo) |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
199 if not valid: |
1890
e846b8f402d0
topicmap: write and read format from disc
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1885
diff
changeset
|
200 return False |
2653
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
201 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
|
202 # phasehash at None means this is a branchmap |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
203 # come from non topic thing |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
204 return True |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
205 else: |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
206 try: |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
207 valid = self.phaseshash == _phaseshash(repo, self.tiprev) |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
208 return valid |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
209 except IndexError: |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
210 return False |
1890
e846b8f402d0
topicmap: write and read format from disc
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1885
diff
changeset
|
211 |
1885
d49f75eab6a3
topic: take topic in account for all branch head computation
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff
changeset
|
212 def write(self, repo): |
6336
453861da6922
topic: use fully qualified branch name during exchange
Anton Shestakov <av6@dwimlabs.net>
parents:
6333
diff
changeset
|
213 """write cache to disk if it's not topic-only, but first transform |
453861da6922
topic: use fully qualified branch name during exchange
Anton Shestakov <av6@dwimlabs.net>
parents:
6333
diff
changeset
|
214 cache keys from branches in "//" format into bare branch names |
453861da6922
topic: use fully qualified branch name during exchange
Anton Shestakov <av6@dwimlabs.net>
parents:
6333
diff
changeset
|
215 """ |
2653
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
216 # 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
|
217 # the time will be fast enough |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
218 if not istopicfilter(repo.filtername): |
6336
453861da6922
topic: use fully qualified branch name during exchange
Anton Shestakov <av6@dwimlabs.net>
parents:
6333
diff
changeset
|
219 cache = self.copy() |
453861da6922
topic: use fully qualified branch name during exchange
Anton Shestakov <av6@dwimlabs.net>
parents:
6333
diff
changeset
|
220 |
6745
71c4b6c2bcdc
topic: drop branchmap._entries compatibility for hg 4.9
Anton Shestakov <av6@dwimlabs.net>
parents:
6705
diff
changeset
|
221 for formatted in tuple(cache._entries): |
6336
453861da6922
topic: use fully qualified branch name during exchange
Anton Shestakov <av6@dwimlabs.net>
parents:
6333
diff
changeset
|
222 branch, tns, topic = common.parsefqbn(formatted) |
453861da6922
topic: use fully qualified branch name during exchange
Anton Shestakov <av6@dwimlabs.net>
parents:
6333
diff
changeset
|
223 if branch != formatted: |
6745
71c4b6c2bcdc
topic: drop branchmap._entries compatibility for hg 4.9
Anton Shestakov <av6@dwimlabs.net>
parents:
6705
diff
changeset
|
224 cache._entries[branch] = cache._entries.pop(formatted) |
6336
453861da6922
topic: use fully qualified branch name during exchange
Anton Shestakov <av6@dwimlabs.net>
parents:
6333
diff
changeset
|
225 |
453861da6922
topic: use fully qualified branch name during exchange
Anton Shestakov <av6@dwimlabs.net>
parents:
6333
diff
changeset
|
226 super(_topiccache, cache).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
|
227 |
d49f75eab6a3
topic: take topic in account for all branch head computation
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff
changeset
|
228 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
|
229 """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
|
230 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
|
231 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
|
232 """ |
6824
417f775d3eee
topic: we checked that branchmap.branchcache exists, let pytype know this
Anton Shestakov <av6@dwimlabs.net>
parents:
6822
diff
changeset
|
233 assert hasattr(branchmap, 'branchcache') # help pytype |
6788
0674b56d3526
topic: drop oldbranchmap context manager, _topiccache is now a mixin
Anton Shestakov <av6@dwimlabs.net>
parents:
6704
diff
changeset
|
234 assert isinstance(self, (branchmap.branchcache, branchmap.remotebranchcache)) # help pytype |
2653
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
235 if not istopicfilter(repo.filtername): |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
236 return super(_topiccache, self).update(repo, revgen) |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2004
diff
changeset
|
237 |
6336
453861da6922
topic: use fully qualified branch name during exchange
Anton Shestakov <av6@dwimlabs.net>
parents:
6333
diff
changeset
|
238 # See topic.discovery._headssummary(), where repo.unfiltered gets |
453861da6922
topic: use fully qualified branch name during exchange
Anton Shestakov <av6@dwimlabs.net>
parents:
6333
diff
changeset
|
239 # overridden to return .filtered('unfiltered-topic'). revbranchcache |
453861da6922
topic: use fully qualified branch name during exchange
Anton Shestakov <av6@dwimlabs.net>
parents:
6333
diff
changeset
|
240 # only can be created for unfiltered repo (filtername is None), so we |
453861da6922
topic: use fully qualified branch name during exchange
Anton Shestakov <av6@dwimlabs.net>
parents:
6333
diff
changeset
|
241 # do that here, and this revbranchcache will be cached inside repo. |
453861da6922
topic: use fully qualified branch name during exchange
Anton Shestakov <av6@dwimlabs.net>
parents:
6333
diff
changeset
|
242 # When we get rid of *-topic filters, then this workaround can be |
453861da6922
topic: use fully qualified branch name during exchange
Anton Shestakov <av6@dwimlabs.net>
parents:
6333
diff
changeset
|
243 # removed too. |
453861da6922
topic: use fully qualified branch name during exchange
Anton Shestakov <av6@dwimlabs.net>
parents:
6333
diff
changeset
|
244 repo.unfiltered().revbranchcache() |
453861da6922
topic: use fully qualified branch name during exchange
Anton Shestakov <av6@dwimlabs.net>
parents:
6333
diff
changeset
|
245 |
453861da6922
topic: use fully qualified branch name during exchange
Anton Shestakov <av6@dwimlabs.net>
parents:
6333
diff
changeset
|
246 super(_topiccache, self).update(repo, revgen) |
453861da6922
topic: use fully qualified branch name during exchange
Anton Shestakov <av6@dwimlabs.net>
parents:
6333
diff
changeset
|
247 self.phaseshash = _phaseshash(repo, self.tiprev) |
6385
0bc90758f613
topic: wrap branchmap.read() as well (compatibility for hg <= 4.9)
Anton Shestakov <av6@dwimlabs.net>
parents:
6376
diff
changeset
|
248 |
6789
cd8e1a697124
topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents:
6788
diff
changeset
|
249 class _TopicCacheV2(object): # combine me with branchmap.BranchCacheV2 |
cd8e1a697124
topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents:
6788
diff
changeset
|
250 |
cd8e1a697124
topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents:
6788
diff
changeset
|
251 def __init__(self, *args, **kwargs): |
cd8e1a697124
topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents:
6788
diff
changeset
|
252 super(_TopicCacheV2, self).__init__(*args, **kwargs) |
cd8e1a697124
topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents:
6788
diff
changeset
|
253 self.phaseshash = None |
cd8e1a697124
topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents:
6788
diff
changeset
|
254 |
cd8e1a697124
topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents:
6788
diff
changeset
|
255 def _load_heads(self, repo, lineiter): |
cd8e1a697124
topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents:
6788
diff
changeset
|
256 """call BranchCacheV2._load_heads(), and then transform branch names to |
cd8e1a697124
topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents:
6788
diff
changeset
|
257 be in the new "//" format |
cd8e1a697124
topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents:
6788
diff
changeset
|
258 """ |
cd8e1a697124
topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents:
6788
diff
changeset
|
259 assert isinstance(self, branchmap.BranchCacheV2) # help pytype |
cd8e1a697124
topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents:
6788
diff
changeset
|
260 super(_TopicCacheV2, self)._load_heads(repo, lineiter) |
cd8e1a697124
topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents:
6788
diff
changeset
|
261 |
cd8e1a697124
topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents:
6788
diff
changeset
|
262 for branch in tuple(self._entries): |
cd8e1a697124
topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents:
6788
diff
changeset
|
263 formatted = common.formatfqbn(branch=branch) |
cd8e1a697124
topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents:
6788
diff
changeset
|
264 if branch != formatted: |
cd8e1a697124
topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents:
6788
diff
changeset
|
265 self._entries[formatted] = self._entries.pop(branch) |
cd8e1a697124
topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents:
6788
diff
changeset
|
266 |
cd8e1a697124
topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents:
6788
diff
changeset
|
267 def validfor(self, repo): |
cd8e1a697124
topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents:
6788
diff
changeset
|
268 """Is the cache content valid regarding a repo |
cd8e1a697124
topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents:
6788
diff
changeset
|
269 |
cd8e1a697124
topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents:
6788
diff
changeset
|
270 - False when cached tipnode is unknown or if we detect a strip. |
cd8e1a697124
topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents:
6788
diff
changeset
|
271 - True when cache is up to date or a subset of current repo.""" |
cd8e1a697124
topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents:
6788
diff
changeset
|
272 assert isinstance(self, (branchmap.BranchCacheV2, branchmap.remotebranchcache)) # help pytype |
cd8e1a697124
topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents:
6788
diff
changeset
|
273 valid = super(_TopicCacheV2, self).validfor(repo) |
cd8e1a697124
topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents:
6788
diff
changeset
|
274 if not valid: |
cd8e1a697124
topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents:
6788
diff
changeset
|
275 return False |
cd8e1a697124
topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents:
6788
diff
changeset
|
276 elif not istopicfilter(repo.filtername) or self.phaseshash is None: |
cd8e1a697124
topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents:
6788
diff
changeset
|
277 # phasehash at None means this is a branchmap |
cd8e1a697124
topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents:
6788
diff
changeset
|
278 # come from non topic thing |
cd8e1a697124
topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents:
6788
diff
changeset
|
279 return True |
cd8e1a697124
topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents:
6788
diff
changeset
|
280 else: |
cd8e1a697124
topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents:
6788
diff
changeset
|
281 try: |
cd8e1a697124
topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents:
6788
diff
changeset
|
282 valid = self.phaseshash == _phaseshash(repo, self.tiprev) |
cd8e1a697124
topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents:
6788
diff
changeset
|
283 return valid |
cd8e1a697124
topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents:
6788
diff
changeset
|
284 except IndexError: |
cd8e1a697124
topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents:
6788
diff
changeset
|
285 return False |
cd8e1a697124
topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents:
6788
diff
changeset
|
286 |
cd8e1a697124
topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents:
6788
diff
changeset
|
287 def write(self, repo): |
cd8e1a697124
topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents:
6788
diff
changeset
|
288 """write cache to disk if it's not topic-only, but first transform |
cd8e1a697124
topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents:
6788
diff
changeset
|
289 cache keys from branches in "//" format into bare branch names |
cd8e1a697124
topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents:
6788
diff
changeset
|
290 """ |
cd8e1a697124
topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents:
6788
diff
changeset
|
291 # we expect mutable set to be small enough to be that computing it all |
cd8e1a697124
topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents:
6788
diff
changeset
|
292 # the time will be fast enough |
6824
417f775d3eee
topic: we checked that branchmap.branchcache exists, let pytype know this
Anton Shestakov <av6@dwimlabs.net>
parents:
6822
diff
changeset
|
293 assert isinstance(self, branchmap.BranchCacheV2) # help pytype |
6789
cd8e1a697124
topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents:
6788
diff
changeset
|
294 if not istopicfilter(repo.filtername): |
cd8e1a697124
topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents:
6788
diff
changeset
|
295 entries = self._entries.copy() |
cd8e1a697124
topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents:
6788
diff
changeset
|
296 |
cd8e1a697124
topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents:
6788
diff
changeset
|
297 for formatted in tuple(entries): |
cd8e1a697124
topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents:
6788
diff
changeset
|
298 branch, tns, topic = common.parsefqbn(formatted) |
cd8e1a697124
topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents:
6788
diff
changeset
|
299 if branch != formatted: |
cd8e1a697124
topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents:
6788
diff
changeset
|
300 entries[branch] = entries.pop(formatted) |
cd8e1a697124
topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents:
6788
diff
changeset
|
301 |
cd8e1a697124
topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents:
6788
diff
changeset
|
302 oldentries = self._entries |
cd8e1a697124
topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents:
6788
diff
changeset
|
303 try: |
cd8e1a697124
topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents:
6788
diff
changeset
|
304 self._entries = entries |
cd8e1a697124
topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents:
6788
diff
changeset
|
305 super(_TopicCacheV2, self).write(repo) |
cd8e1a697124
topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents:
6788
diff
changeset
|
306 finally: |
cd8e1a697124
topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents:
6788
diff
changeset
|
307 self._entries = oldentries |
cd8e1a697124
topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents:
6788
diff
changeset
|
308 |
cd8e1a697124
topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents:
6788
diff
changeset
|
309 def update(self, repo, revgen): |
cd8e1a697124
topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents:
6788
diff
changeset
|
310 """Given a branchhead cache, self, that may have extra nodes or be |
cd8e1a697124
topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents:
6788
diff
changeset
|
311 missing heads, and a generator of nodes that are strictly a superset of |
cd8e1a697124
topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents:
6788
diff
changeset
|
312 heads missing, this function updates self to be correct. |
cd8e1a697124
topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents:
6788
diff
changeset
|
313 """ |
cd8e1a697124
topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents:
6788
diff
changeset
|
314 assert isinstance(self, (branchmap.BranchCacheV2, branchmap.remotebranchcache)) # help pytype |
cd8e1a697124
topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents:
6788
diff
changeset
|
315 if not istopicfilter(repo.filtername): |
cd8e1a697124
topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents:
6788
diff
changeset
|
316 return super(_TopicCacheV2, self).update(repo, revgen) |
cd8e1a697124
topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents:
6788
diff
changeset
|
317 |
cd8e1a697124
topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents:
6788
diff
changeset
|
318 # See topic.discovery._headssummary(), where repo.unfiltered gets |
cd8e1a697124
topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents:
6788
diff
changeset
|
319 # overridden to return .filtered('unfiltered-topic'). revbranchcache |
cd8e1a697124
topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents:
6788
diff
changeset
|
320 # only can be created for unfiltered repo (filtername is None), so we |
cd8e1a697124
topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents:
6788
diff
changeset
|
321 # do that here, and this revbranchcache will be cached inside repo. |
cd8e1a697124
topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents:
6788
diff
changeset
|
322 # When we get rid of *-topic filters, then this workaround can be |
cd8e1a697124
topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents:
6788
diff
changeset
|
323 # removed too. |
cd8e1a697124
topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents:
6788
diff
changeset
|
324 repo.unfiltered().revbranchcache() |
cd8e1a697124
topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents:
6788
diff
changeset
|
325 |
cd8e1a697124
topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents:
6788
diff
changeset
|
326 super(_TopicCacheV2, self).update(repo, revgen) |
cd8e1a697124
topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents:
6788
diff
changeset
|
327 if util.safehasattr(self, 'tiprev'): |
cd8e1a697124
topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents:
6788
diff
changeset
|
328 # remotebranchcache doesn't have self.tiprev |
cd8e1a697124
topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents:
6788
diff
changeset
|
329 self.phaseshash = _phaseshash(repo, self.tiprev) |