annotate hgext3rd/topic/topicmap.py @ 6935:954d7ea5cd67 stable tip

stack: when stack base is obsolete, pick any successor, even if at random There are situations when s0 is obsolete and we also cannot pick just one successor for it to use in stack. In such a case, let's pick the "latest" successor from the first set. We're assuming that obsutil.successorssets() returns data in the same order (it should, since it makes sure to sort data internally). Keeping that in mind, while the successor picked for s0 by this code is not based on any sort of sophisticated logic, it should nonetheless be the same every time. This patch is probably not going to completely break anything that was previously working fine, because the previous behavior was to just abort with an exception.
author Anton Shestakov <av6@dwimlabs.net>
date Sat, 16 Nov 2024 17:01:02 +0400
parents 1b59ddda3242
children ed00ed185249
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
6794
68f7ba35ea83 topic: bring back oldbranchmap context manager for hg 4.9
Anton Shestakov <av6@dwimlabs.net>
parents: 6790
diff changeset
1 import contextlib
1968
08cbfeb15a1a compat: mercurial dropped alias for hashlib.sha1
timeless@gmail.com
parents: 1953
diff changeset
2 import hashlib
1949
79c08d17a3d7 topicmap: move the 'usetopicmap' context manager into the topicmap module
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1937
diff changeset
3
3397
f7129e3d5a38 topic: suggest using topic when user creates a new head on branch
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2655
diff changeset
4 from mercurial.i18n import _
2653
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
5 from mercurial.node import nullid
1937
60b7de2b3dd1 topicmap: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1928
diff changeset
6 from mercurial import (
60b7de2b3dd1 topicmap: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1928
diff changeset
7 branchmap,
1950
99c1a26abf3f topicmap: move 'cgapply' wrapping into the topicmap module
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1949
diff changeset
8 changegroup,
99c1a26abf3f topicmap: move 'cgapply' wrapping into the topicmap module
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1949
diff changeset
9 extensions,
2653
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
10 repoview,
4450
9b0cde5efbc9 topicmap: add compatibility for branchcache that now uses self._entries
Anton Shestakov <av6@dwimlabs.net>
parents: 4187
diff changeset
11 util,
1937
60b7de2b3dd1 topicmap: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1928
diff changeset
12 )
1885
d49f75eab6a3 topic: take topic in account for all branch head computation
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
13
4536
9837e8d378de topic: only wrap gettopicrepo for repo with topic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4464
diff changeset
14 from . import (
9837e8d378de topic: only wrap gettopicrepo for repo with topic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4464
diff changeset
15 common,
4929
bb2b4f6c99dc compat: compatibility for cl.nodemap.get vs cl.index.get_rev
Anton Shestakov <av6@dwimlabs.net>
parents: 4814
diff changeset
16 compat,
6376
5c8196a550b6 topic: make hg stack work for branches with double slashes in them
Anton Shestakov <av6@dwimlabs.net>
parents: 6369
diff changeset
17 discovery,
4536
9837e8d378de topic: only wrap gettopicrepo for repo with topic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4464
diff changeset
18 )
9837e8d378de topic: only wrap gettopicrepo for repo with topic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4464
diff changeset
19
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4803
diff changeset
20 basefilter = set([b'base', b'immutable'])
2653
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
21 def topicfilter(name):
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
22 """return a "topic" version of a filter level"""
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
23 if name in basefilter:
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
24 return name
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
25 elif name is None:
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
26 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
27 elif name.endswith(b'-topic'):
2653
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
28 return name
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
29 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
30 return name + b'-topic'
2653
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 istopicfilter(filtername):
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
33 if filtername is None:
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
34 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
35 return filtername.endswith(b'-topic')
2653
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
36
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
37 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
38 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
39 return repo
2653
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
40 filtername = topicfilter(repo.filtername)
6790
38a845d432e9 topic: make sure filtername is not None
Anton Shestakov <av6@dwimlabs.net>
parents: 6789
diff changeset
41 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
42 return repo
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
43 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
44
2653
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
45 def _setuptopicfilter(ui):
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
46 """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
47 funcmap = repoview.filtertable
6387
a87abe69a2f8 topic: branchmap already imports subsettable from repoviewutil
Anton Shestakov <av6@dwimlabs.net>
parents: 6363
diff changeset
48 # hg <= 4.9 (caebe5e7f4bd)
2653
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
49 partialmap = branchmap.subsettable
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
50
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
51 for plainname in list(funcmap):
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
52 newfilter = topicfilter(plainname)
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
53 if newfilter == plainname:
6790
38a845d432e9 topic: make sure filtername is not None
Anton Shestakov <av6@dwimlabs.net>
parents: 6789
diff changeset
54 # 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
55 continue
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
56
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
57 def revsfunc(repo, name=plainname):
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
58 return repoview.filterrevs(repo, name)
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
59
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
60 base = topicfilter(partialmap[plainname])
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
61
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
62 if newfilter not in funcmap:
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
63 funcmap[newfilter] = revsfunc
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
64 partialmap[newfilter] = base
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4803
diff changeset
65 funcmap[b'unfiltered-topic'] = lambda repo: frozenset()
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4803
diff changeset
66 partialmap[b'unfiltered-topic'] = b'visible-topic'
1885
d49f75eab6a3 topic: take topic in account for all branch head computation
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
67
1890
e846b8f402d0 topicmap: write and read format from disc
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1885
diff changeset
68 def _phaseshash(repo, maxrev):
2653
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
69 """uniq ID for a phase matching a set of rev"""
1890
e846b8f402d0 topicmap: write and read format from disc
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1885
diff changeset
70 cl = repo.changelog
e846b8f402d0 topicmap: write and read format from disc
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1885
diff changeset
71 fr = cl.filteredrevs
6704
3635782b0290 topic: compatibility for phase roots being revnums
Anton Shestakov <av6@dwimlabs.net>
parents: 6547
diff changeset
72 nppr = compat.nonpublicphaseroots(repo)
3635782b0290 topic: compatibility for phase roots being revnums
Anton Shestakov <av6@dwimlabs.net>
parents: 6547
diff changeset
73 # 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
74 # hg <= 6.6 (68289ed170c7)
3635782b0290 topic: compatibility for phase roots being revnums
Anton Shestakov <av6@dwimlabs.net>
parents: 6547
diff changeset
75 if not util.safehasattr(repo._phasecache, '_phaseroots'):
3635782b0290 topic: compatibility for phase roots being revnums
Anton Shestakov <av6@dwimlabs.net>
parents: 6547
diff changeset
76 getrev = compat.getgetrev(cl)
3635782b0290 topic: compatibility for phase roots being revnums
Anton Shestakov <av6@dwimlabs.net>
parents: 6547
diff changeset
77 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
78 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
79 key = nullid
e846b8f402d0 topicmap: write and read format from disc
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1885
diff changeset
80 if revs:
1968
08cbfeb15a1a compat: mercurial dropped alias for hashlib.sha1
timeless@gmail.com
parents: 1953
diff changeset
81 s = hashlib.sha1()
1890
e846b8f402d0 topicmap: write and read format from disc
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1885
diff changeset
82 for rev in revs:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4803
diff changeset
83 s.update(b'%d;' % rev)
1890
e846b8f402d0 topicmap: write and read format from disc
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1885
diff changeset
84 key = s.digest()
e846b8f402d0 topicmap: write and read format from disc
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1885
diff changeset
85 return key
e846b8f402d0 topicmap: write and read format from disc
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1885
diff changeset
86
2653
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
87 def modsetup(ui):
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
88 """call at uisetup time to install various wrappings"""
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
89 _setuptopicfilter(ui)
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
90 _wrapbmcache(ui)
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
91 extensions.wrapfunction(changegroup.cg1unpacker, 'apply', cgapply)
5665
dd9dba7c1d00 compat: make topics compatible across change to cmdutil.commitstatus()
Martin von Zweigbergk <martinvonz@google.com>
parents: 5426
diff changeset
92 compat.overridecommitstatus(commitstatus)
1949
79c08d17a3d7 topicmap: move the 'usetopicmap' context manager into the topicmap module
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1937
diff changeset
93
2653
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
94 def cgapply(orig, self, repo, *args, **kwargs):
1950
99c1a26abf3f topicmap: move 'cgapply' wrapping into the topicmap module
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1949
diff changeset
95 """make sure a topicmap is used when applying a changegroup"""
6790
38a845d432e9 topic: make sure filtername is not None
Anton Shestakov <av6@dwimlabs.net>
parents: 6789
diff changeset
96 newfilter = topicfilter(repo.filtername)
38a845d432e9 topic: make sure filtername is not None
Anton Shestakov <av6@dwimlabs.net>
parents: 6789
diff changeset
97 if newfilter is None:
38a845d432e9 topic: make sure filtername is not None
Anton Shestakov <av6@dwimlabs.net>
parents: 6789
diff changeset
98 other = repo
38a845d432e9 topic: make sure filtername is not None
Anton Shestakov <av6@dwimlabs.net>
parents: 6789
diff changeset
99 else:
38a845d432e9 topic: make sure filtername is not None
Anton Shestakov <av6@dwimlabs.net>
parents: 6789
diff changeset
100 other = repo.filtered(newfilter)
2653
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
101 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
102
6547
d13cfd9eb6c0 topic: compatibility for commitstatus(..., **opts)
Anton Shestakov <av6@dwimlabs.net>
parents: 6388
diff changeset
103 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
104 # 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
105 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
106 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
107 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
108 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
109
6376
5c8196a550b6 topic: make hg stack work for branches with double slashes in them
Anton Shestakov <av6@dwimlabs.net>
parents: 6369
diff changeset
110 with discovery.override_context_branch(repo) as repo:
6547
d13cfd9eb6c0 topic: compatibility for commitstatus(..., **opts)
Anton Shestakov <av6@dwimlabs.net>
parents: 6388
diff changeset
111 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
112
f7129e3d5a38 topic: suggest using topic when user creates a new head on branch
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2655
diff changeset
113 # 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
114 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
115 return ret
f7129e3d5a38 topic: suggest using topic when user creates a new head on branch
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2655
diff changeset
116 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
117
6547
d13cfd9eb6c0 topic: compatibility for commitstatus(..., **opts)
Anton Shestakov <av6@dwimlabs.net>
parents: 6388
diff changeset
118 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
119 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
120 for p in parents
6363
f168c0fdbde9 topic: copy parent branch check in commitstatus() from core
Anton Shestakov <av6@dwimlabs.net>
parents: 5847
diff changeset
121 )):
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4803
diff changeset
122 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
123 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
124
f7129e3d5a38 topic: suggest using topic when user creates a new head on branch
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2655
diff changeset
125 return ret
1953
bdc5bb223b50 commit: wrap "commitstatus" to take topic into account
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1950
diff changeset
126
2653
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
127 def _wrapbmcache(ui):
6789
cd8e1a697124 topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents: 6788
diff changeset
128 if util.safehasattr(branchmap, 'BranchCacheV2'):
cd8e1a697124 topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents: 6788
diff changeset
129 class TopicCache(_TopicCacheV2, branchmap.BranchCacheV2):
cd8e1a697124 topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents: 6788
diff changeset
130 pass
cd8e1a697124 topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents: 6788
diff changeset
131 branchmap.BranchCacheV2 = TopicCache
4459
d46360b8c0dc topic: make topics compatible with branchmap refactor
Martijn Pieters <mj@octobus.net>
parents: 4450
diff changeset
132
6789
cd8e1a697124 topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents: 6788
diff changeset
133 class remotetopiccache(_TopicCacheV2, branchmap.remotebranchcache):
4459
d46360b8c0dc topic: make topics compatible with branchmap refactor
Martijn Pieters <mj@octobus.net>
parents: 4450
diff changeset
134 pass
d46360b8c0dc topic: make topics compatible with branchmap refactor
Martijn Pieters <mj@octobus.net>
parents: 4450
diff changeset
135 branchmap.remotebranchcache = remotetopiccache
6789
cd8e1a697124 topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents: 6788
diff changeset
136 else:
cd8e1a697124 topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents: 6788
diff changeset
137 # hg <= 6.7 (ec640dc9cebd)
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
6789
cd8e1a697124 topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents: 6788
diff changeset
142 try:
cd8e1a697124 topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents: 6788
diff changeset
143 # Mercurial 5.0
cd8e1a697124 topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents: 6788
diff changeset
144 class remotetopiccache(_topiccache, branchmap.remotebranchcache):
cd8e1a697124 topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents: 6788
diff changeset
145 pass
cd8e1a697124 topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents: 6788
diff changeset
146 branchmap.remotebranchcache = remotetopiccache
cd8e1a697124 topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents: 6788
diff changeset
147
cd8e1a697124 topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents: 6788
diff changeset
148 def _wrapupdatebmcachemethod(orig, self, repo):
cd8e1a697124 topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents: 6788
diff changeset
149 # pass in the bound method as the original
cd8e1a697124 topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents: 6788
diff changeset
150 return _wrapupdatebmcache(orig.__get__(self), repo)
cd8e1a697124 topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents: 6788
diff changeset
151 extensions.wrapfunction(branchmap.BranchMapCache, 'updatecache', _wrapupdatebmcachemethod)
cd8e1a697124 topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents: 6788
diff changeset
152 except AttributeError:
cd8e1a697124 topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents: 6788
diff changeset
153 # hg <= 4.9 (3461814417f3)
cd8e1a697124 topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents: 6788
diff changeset
154 extensions.wrapfunction(branchmap, 'updatecache', _wrapupdatebmcache)
cd8e1a697124 topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents: 6788
diff changeset
155 # branchcache in hg <= 4.9 doesn't have load method, instead there's a
cd8e1a697124 topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents: 6788
diff changeset
156 # module-level function to read on-disk cache and return a branchcache
cd8e1a697124 topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents: 6788
diff changeset
157 extensions.wrapfunction(branchmap, 'read', _wrapbmread)
2653
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 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
160 previous = getattr(repo, '_autobranchmaptopic', False)
2653
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
161 try:
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
162 repo._autobranchmaptopic = False
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
163 return orig(repo)
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
164 finally:
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
165 repo._autobranchmaptopic = previous
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
166
6794
68f7ba35ea83 topic: bring back oldbranchmap context manager for hg 4.9
Anton Shestakov <av6@dwimlabs.net>
parents: 6790
diff changeset
167 if util.safehasattr(branchmap, 'branchcache') and dict in branchmap.branchcache.__mro__:
68f7ba35ea83 topic: bring back oldbranchmap context manager for hg 4.9
Anton Shestakov <av6@dwimlabs.net>
parents: 6790
diff changeset
168 # hg <= 4.9 (624d6683c705)
68f7ba35ea83 topic: bring back oldbranchmap context manager for hg 4.9
Anton Shestakov <av6@dwimlabs.net>
parents: 6790
diff changeset
169 # let's break infinite recursion in __init__() that uses super()
68f7ba35ea83 topic: bring back oldbranchmap context manager for hg 4.9
Anton Shestakov <av6@dwimlabs.net>
parents: 6790
diff changeset
170 orig = branchmap.branchcache
68f7ba35ea83 topic: bring back oldbranchmap context manager for hg 4.9
Anton Shestakov <av6@dwimlabs.net>
parents: 6790
diff changeset
171
68f7ba35ea83 topic: bring back oldbranchmap context manager for hg 4.9
Anton Shestakov <av6@dwimlabs.net>
parents: 6790
diff changeset
172 @contextlib.contextmanager
68f7ba35ea83 topic: bring back oldbranchmap context manager for hg 4.9
Anton Shestakov <av6@dwimlabs.net>
parents: 6790
diff changeset
173 def oldbranchmap():
68f7ba35ea83 topic: bring back oldbranchmap context manager for hg 4.9
Anton Shestakov <av6@dwimlabs.net>
parents: 6790
diff changeset
174 current = branchmap.branchcache
68f7ba35ea83 topic: bring back oldbranchmap context manager for hg 4.9
Anton Shestakov <av6@dwimlabs.net>
parents: 6790
diff changeset
175 try:
68f7ba35ea83 topic: bring back oldbranchmap context manager for hg 4.9
Anton Shestakov <av6@dwimlabs.net>
parents: 6790
diff changeset
176 branchmap.branchcache = orig
68f7ba35ea83 topic: bring back oldbranchmap context manager for hg 4.9
Anton Shestakov <av6@dwimlabs.net>
parents: 6790
diff changeset
177 yield
68f7ba35ea83 topic: bring back oldbranchmap context manager for hg 4.9
Anton Shestakov <av6@dwimlabs.net>
parents: 6790
diff changeset
178 finally:
68f7ba35ea83 topic: bring back oldbranchmap context manager for hg 4.9
Anton Shestakov <av6@dwimlabs.net>
parents: 6790
diff changeset
179 branchmap.branchcache = current
68f7ba35ea83 topic: bring back oldbranchmap context manager for hg 4.9
Anton Shestakov <av6@dwimlabs.net>
parents: 6790
diff changeset
180 else:
68f7ba35ea83 topic: bring back oldbranchmap context manager for hg 4.9
Anton Shestakov <av6@dwimlabs.net>
parents: 6790
diff changeset
181 oldbranchmap = util.nullcontextmanager
68f7ba35ea83 topic: bring back oldbranchmap context manager for hg 4.9
Anton Shestakov <av6@dwimlabs.net>
parents: 6790
diff changeset
182
6795
1b59ddda3242 topic: further "help pytype" by not mentioning remotebranchcache on hg 4.9
Anton Shestakov <av6@dwimlabs.net>
parents: 6794
diff changeset
183 if util.safehasattr(branchmap, 'branchcache'):
1b59ddda3242 topic: further "help pytype" by not mentioning remotebranchcache on hg 4.9
Anton Shestakov <av6@dwimlabs.net>
parents: 6794
diff changeset
184 allbccls = (branchmap.branchcache,)
1b59ddda3242 topic: further "help pytype" by not mentioning remotebranchcache on hg 4.9
Anton Shestakov <av6@dwimlabs.net>
parents: 6794
diff changeset
185 if util.safehasattr(branchmap, 'remotebranchcache'):
1b59ddda3242 topic: further "help pytype" by not mentioning remotebranchcache on hg 4.9
Anton Shestakov <av6@dwimlabs.net>
parents: 6794
diff changeset
186 # hg <= 4.9 (eb7ce452e0fb)
1b59ddda3242 topic: further "help pytype" by not mentioning remotebranchcache on hg 4.9
Anton Shestakov <av6@dwimlabs.net>
parents: 6794
diff changeset
187 allbccls = (branchmap.branchcache, branchmap.remotebranchcache)
1b59ddda3242 topic: further "help pytype" by not mentioning remotebranchcache on hg 4.9
Anton Shestakov <av6@dwimlabs.net>
parents: 6794
diff changeset
188
2653
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
189 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
190
d49f75eab6a3 topic: take topic in account for all branch head computation
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
191 def __init__(self, *args, **kwargs):
6794
68f7ba35ea83 topic: bring back oldbranchmap context manager for hg 4.9
Anton Shestakov <av6@dwimlabs.net>
parents: 6790
diff changeset
192 with oldbranchmap():
68f7ba35ea83 topic: bring back oldbranchmap context manager for hg 4.9
Anton Shestakov <av6@dwimlabs.net>
parents: 6790
diff changeset
193 super(_topiccache, self).__init__(*args, **kwargs)
2653
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
194 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
195
1890
e846b8f402d0 topicmap: write and read format from disc
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1885
diff changeset
196 def copy(self):
e846b8f402d0 topicmap: write and read format from disc
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1885
diff changeset
197 """return an deep copy of the branchcache object"""
6795
1b59ddda3242 topic: further "help pytype" by not mentioning remotebranchcache on hg 4.9
Anton Shestakov <av6@dwimlabs.net>
parents: 6794
diff changeset
198 assert isinstance(self, allbccls) # help pytype
6333
f4ffe1e67a9b topic: move compatibility for branchcache._entries to topic/compat.py
Anton Shestakov <av6@dwimlabs.net>
parents: 6271
diff changeset
199 entries = compat.bcentries(self)
f4ffe1e67a9b topic: move compatibility for branchcache._entries to topic/compat.py
Anton Shestakov <av6@dwimlabs.net>
parents: 6271
diff changeset
200 args = (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
201 self._closednodes)
ad7c9c0b7a63 topic: compatibility for branchcache having a repo argument in 5.8
Anton Shestakov <av6@dwimlabs.net>
parents: 5665
diff changeset
202 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
203 # 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
204 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
205 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
206 new.phaseshash = self.phaseshash
e846b8f402d0 topicmap: write and read format from disc
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1885
diff changeset
207 return new
e846b8f402d0 topicmap: write and read format from disc
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1885
diff changeset
208
6336
453861da6922 topic: use fully qualified branch name during exchange
Anton Shestakov <av6@dwimlabs.net>
parents: 6333
diff changeset
209 def load(self, repo, lineiter):
453861da6922 topic: use fully qualified branch name during exchange
Anton Shestakov <av6@dwimlabs.net>
parents: 6333
diff changeset
210 """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
211 new "//" format
453861da6922 topic: use fully qualified branch name during exchange
Anton Shestakov <av6@dwimlabs.net>
parents: 6333
diff changeset
212 """
6788
0674b56d3526 topic: drop oldbranchmap context manager, _topiccache is now a mixin
Anton Shestakov <av6@dwimlabs.net>
parents: 6704
diff changeset
213 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
214 super(_topiccache, self).load(repo, lineiter)
453861da6922 topic: use fully qualified branch name during exchange
Anton Shestakov <av6@dwimlabs.net>
parents: 6333
diff changeset
215 entries = compat.bcentries(self)
1885
d49f75eab6a3 topic: take topic in account for all branch head computation
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
216
6336
453861da6922 topic: use fully qualified branch name during exchange
Anton Shestakov <av6@dwimlabs.net>
parents: 6333
diff changeset
217 for branch in tuple(entries):
453861da6922 topic: use fully qualified branch name during exchange
Anton Shestakov <av6@dwimlabs.net>
parents: 6333
diff changeset
218 formatted = common.formatfqbn(branch=branch)
453861da6922 topic: use fully qualified branch name during exchange
Anton Shestakov <av6@dwimlabs.net>
parents: 6333
diff changeset
219 if branch != formatted:
453861da6922 topic: use fully qualified branch name during exchange
Anton Shestakov <av6@dwimlabs.net>
parents: 6333
diff changeset
220 entries[formatted] = 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
221
1890
e846b8f402d0 topicmap: write and read format from disc
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1885
diff changeset
222 def validfor(self, repo):
e846b8f402d0 topicmap: write and read format from disc
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1885
diff changeset
223 """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
224
e846b8f402d0 topicmap: write and read format from disc
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1885
diff changeset
225 - 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
226 - True when cache is up to date or a subset of current repo."""
6795
1b59ddda3242 topic: further "help pytype" by not mentioning remotebranchcache on hg 4.9
Anton Shestakov <av6@dwimlabs.net>
parents: 6794
diff changeset
227 assert isinstance(self, allbccls) # help pytype
2653
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
228 valid = super(_topiccache, self).validfor(repo)
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
229 if not valid:
1890
e846b8f402d0 topicmap: write and read format from disc
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1885
diff changeset
230 return False
2653
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
231 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
232 # phasehash at None means this is a branchmap
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
233 # come from non topic thing
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
234 return True
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
235 else:
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
236 try:
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
237 valid = self.phaseshash == _phaseshash(repo, self.tiprev)
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
238 return valid
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
239 except IndexError:
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
240 return False
1890
e846b8f402d0 topicmap: write and read format from disc
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1885
diff changeset
241
1885
d49f75eab6a3 topic: take topic in account for all branch head computation
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
242 def write(self, repo):
6336
453861da6922 topic: use fully qualified branch name during exchange
Anton Shestakov <av6@dwimlabs.net>
parents: 6333
diff changeset
243 """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
244 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
245 """
2653
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
246 # 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
247 # the time will be fast enough
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
248 if not istopicfilter(repo.filtername):
6336
453861da6922 topic: use fully qualified branch name during exchange
Anton Shestakov <av6@dwimlabs.net>
parents: 6333
diff changeset
249 cache = self.copy()
453861da6922 topic: use fully qualified branch name during exchange
Anton Shestakov <av6@dwimlabs.net>
parents: 6333
diff changeset
250 entries = compat.bcentries(cache)
453861da6922 topic: use fully qualified branch name during exchange
Anton Shestakov <av6@dwimlabs.net>
parents: 6333
diff changeset
251
453861da6922 topic: use fully qualified branch name during exchange
Anton Shestakov <av6@dwimlabs.net>
parents: 6333
diff changeset
252 for formatted in tuple(entries):
453861da6922 topic: use fully qualified branch name during exchange
Anton Shestakov <av6@dwimlabs.net>
parents: 6333
diff changeset
253 branch, tns, topic = common.parsefqbn(formatted)
453861da6922 topic: use fully qualified branch name during exchange
Anton Shestakov <av6@dwimlabs.net>
parents: 6333
diff changeset
254 if branch != formatted:
453861da6922 topic: use fully qualified branch name during exchange
Anton Shestakov <av6@dwimlabs.net>
parents: 6333
diff changeset
255 entries[branch] = entries.pop(formatted)
453861da6922 topic: use fully qualified branch name during exchange
Anton Shestakov <av6@dwimlabs.net>
parents: 6333
diff changeset
256
453861da6922 topic: use fully qualified branch name during exchange
Anton Shestakov <av6@dwimlabs.net>
parents: 6333
diff changeset
257 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
258
d49f75eab6a3 topic: take topic in account for all branch head computation
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
259 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
260 """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
261 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
262 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
263 """
6795
1b59ddda3242 topic: further "help pytype" by not mentioning remotebranchcache on hg 4.9
Anton Shestakov <av6@dwimlabs.net>
parents: 6794
diff changeset
264 assert isinstance(self, allbccls) # help pytype
2653
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
265 if not istopicfilter(repo.filtername):
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
266 return super(_topiccache, self).update(repo, revgen)
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2004
diff changeset
267
6336
453861da6922 topic: use fully qualified branch name during exchange
Anton Shestakov <av6@dwimlabs.net>
parents: 6333
diff changeset
268 # 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
269 # 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
270 # 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
271 # 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
272 # 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
273 # removed too.
453861da6922 topic: use fully qualified branch name during exchange
Anton Shestakov <av6@dwimlabs.net>
parents: 6333
diff changeset
274 repo.unfiltered().revbranchcache()
453861da6922 topic: use fully qualified branch name during exchange
Anton Shestakov <av6@dwimlabs.net>
parents: 6333
diff changeset
275
453861da6922 topic: use fully qualified branch name during exchange
Anton Shestakov <av6@dwimlabs.net>
parents: 6333
diff changeset
276 super(_topiccache, self).update(repo, revgen)
453861da6922 topic: use fully qualified branch name during exchange
Anton Shestakov <av6@dwimlabs.net>
parents: 6333
diff changeset
277 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
278
6789
cd8e1a697124 topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents: 6788
diff changeset
279 class _TopicCacheV2(object): # combine me with branchmap.BranchCacheV2
cd8e1a697124 topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents: 6788
diff changeset
280
cd8e1a697124 topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents: 6788
diff changeset
281 def __init__(self, *args, **kwargs):
cd8e1a697124 topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents: 6788
diff changeset
282 super(_TopicCacheV2, self).__init__(*args, **kwargs)
cd8e1a697124 topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents: 6788
diff changeset
283 self.phaseshash = None
cd8e1a697124 topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents: 6788
diff changeset
284
cd8e1a697124 topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents: 6788
diff changeset
285 def _load_heads(self, repo, lineiter):
cd8e1a697124 topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents: 6788
diff changeset
286 """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
287 be in the new "//" format
cd8e1a697124 topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents: 6788
diff changeset
288 """
cd8e1a697124 topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents: 6788
diff changeset
289 assert isinstance(self, branchmap.BranchCacheV2) # help pytype
cd8e1a697124 topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents: 6788
diff changeset
290 super(_TopicCacheV2, self)._load_heads(repo, lineiter)
cd8e1a697124 topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents: 6788
diff changeset
291
cd8e1a697124 topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents: 6788
diff changeset
292 for branch in tuple(self._entries):
cd8e1a697124 topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents: 6788
diff changeset
293 formatted = common.formatfqbn(branch=branch)
cd8e1a697124 topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents: 6788
diff changeset
294 if branch != formatted:
cd8e1a697124 topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents: 6788
diff changeset
295 self._entries[formatted] = self._entries.pop(branch)
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 def validfor(self, repo):
cd8e1a697124 topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents: 6788
diff changeset
298 """Is the cache content valid regarding a repo
cd8e1a697124 topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents: 6788
diff changeset
299
cd8e1a697124 topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents: 6788
diff changeset
300 - 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
301 - 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
302 assert isinstance(self, (branchmap.BranchCacheV2, branchmap.remotebranchcache)) # help pytype
cd8e1a697124 topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents: 6788
diff changeset
303 valid = super(_TopicCacheV2, self).validfor(repo)
cd8e1a697124 topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents: 6788
diff changeset
304 if not valid:
cd8e1a697124 topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents: 6788
diff changeset
305 return False
cd8e1a697124 topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents: 6788
diff changeset
306 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
307 # phasehash at None means this is a branchmap
cd8e1a697124 topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents: 6788
diff changeset
308 # come from non topic thing
cd8e1a697124 topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents: 6788
diff changeset
309 return True
cd8e1a697124 topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents: 6788
diff changeset
310 else:
cd8e1a697124 topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents: 6788
diff changeset
311 try:
cd8e1a697124 topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents: 6788
diff changeset
312 valid = self.phaseshash == _phaseshash(repo, self.tiprev)
cd8e1a697124 topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents: 6788
diff changeset
313 return valid
cd8e1a697124 topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents: 6788
diff changeset
314 except IndexError:
cd8e1a697124 topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents: 6788
diff changeset
315 return False
cd8e1a697124 topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents: 6788
diff changeset
316
cd8e1a697124 topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents: 6788
diff changeset
317 def write(self, repo):
cd8e1a697124 topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents: 6788
diff changeset
318 """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
319 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
320 """
cd8e1a697124 topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents: 6788
diff changeset
321 # 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
322 # the time will be fast enough
cd8e1a697124 topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents: 6788
diff changeset
323 if not istopicfilter(repo.filtername):
cd8e1a697124 topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents: 6788
diff changeset
324 entries = self._entries.copy()
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 for formatted in tuple(entries):
cd8e1a697124 topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents: 6788
diff changeset
327 branch, tns, topic = common.parsefqbn(formatted)
cd8e1a697124 topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents: 6788
diff changeset
328 if branch != formatted:
cd8e1a697124 topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents: 6788
diff changeset
329 entries[branch] = entries.pop(formatted)
cd8e1a697124 topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents: 6788
diff changeset
330
cd8e1a697124 topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents: 6788
diff changeset
331 oldentries = self._entries
cd8e1a697124 topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents: 6788
diff changeset
332 try:
cd8e1a697124 topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents: 6788
diff changeset
333 self._entries = entries
cd8e1a697124 topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents: 6788
diff changeset
334 super(_TopicCacheV2, self).write(repo)
cd8e1a697124 topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents: 6788
diff changeset
335 finally:
cd8e1a697124 topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents: 6788
diff changeset
336 self._entries = oldentries
cd8e1a697124 topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents: 6788
diff changeset
337
cd8e1a697124 topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents: 6788
diff changeset
338 def update(self, repo, revgen):
cd8e1a697124 topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents: 6788
diff changeset
339 """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
340 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
341 heads missing, this function updates self to be correct.
cd8e1a697124 topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents: 6788
diff changeset
342 """
cd8e1a697124 topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents: 6788
diff changeset
343 assert isinstance(self, (branchmap.BranchCacheV2, branchmap.remotebranchcache)) # help pytype
cd8e1a697124 topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents: 6788
diff changeset
344 if not istopicfilter(repo.filtername):
cd8e1a697124 topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents: 6788
diff changeset
345 return super(_TopicCacheV2, self).update(repo, revgen)
cd8e1a697124 topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents: 6788
diff changeset
346
cd8e1a697124 topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents: 6788
diff changeset
347 # See topic.discovery._headssummary(), where repo.unfiltered gets
cd8e1a697124 topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents: 6788
diff changeset
348 # overridden to return .filtered('unfiltered-topic'). revbranchcache
cd8e1a697124 topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents: 6788
diff changeset
349 # 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
350 # 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
351 # 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
352 # removed too.
cd8e1a697124 topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents: 6788
diff changeset
353 repo.unfiltered().revbranchcache()
cd8e1a697124 topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents: 6788
diff changeset
354
cd8e1a697124 topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents: 6788
diff changeset
355 super(_TopicCacheV2, self).update(repo, revgen)
cd8e1a697124 topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents: 6788
diff changeset
356 if util.safehasattr(self, 'tiprev'):
cd8e1a697124 topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents: 6788
diff changeset
357 # remotebranchcache doesn't have self.tiprev
cd8e1a697124 topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents: 6788
diff changeset
358 self.phaseshash = _phaseshash(repo, self.tiprev)
cd8e1a697124 topic: compatibility for branchmap.BranchCacheV2
Anton Shestakov <av6@dwimlabs.net>
parents: 6788
diff changeset
359
6385
0bc90758f613 topic: wrap branchmap.read() as well (compatibility for hg <= 4.9)
Anton Shestakov <av6@dwimlabs.net>
parents: 6376
diff changeset
360 def _wrapbmread(orig, repo):
0bc90758f613 topic: wrap branchmap.read() as well (compatibility for hg <= 4.9)
Anton Shestakov <av6@dwimlabs.net>
parents: 6376
diff changeset
361 """call branchmap.read(), and then transform branch names to be in the
0bc90758f613 topic: wrap branchmap.read() as well (compatibility for hg <= 4.9)
Anton Shestakov <av6@dwimlabs.net>
parents: 6376
diff changeset
362 new "//" format
0bc90758f613 topic: wrap branchmap.read() as well (compatibility for hg <= 4.9)
Anton Shestakov <av6@dwimlabs.net>
parents: 6376
diff changeset
363 """
0bc90758f613 topic: wrap branchmap.read() as well (compatibility for hg <= 4.9)
Anton Shestakov <av6@dwimlabs.net>
parents: 6376
diff changeset
364 partial = orig(repo)
0bc90758f613 topic: wrap branchmap.read() as well (compatibility for hg <= 4.9)
Anton Shestakov <av6@dwimlabs.net>
parents: 6376
diff changeset
365 if partial is None:
0bc90758f613 topic: wrap branchmap.read() as well (compatibility for hg <= 4.9)
Anton Shestakov <av6@dwimlabs.net>
parents: 6376
diff changeset
366 # because of IOError or OSError
0bc90758f613 topic: wrap branchmap.read() as well (compatibility for hg <= 4.9)
Anton Shestakov <av6@dwimlabs.net>
parents: 6376
diff changeset
367 return partial
0bc90758f613 topic: wrap branchmap.read() as well (compatibility for hg <= 4.9)
Anton Shestakov <av6@dwimlabs.net>
parents: 6376
diff changeset
368
0bc90758f613 topic: wrap branchmap.read() as well (compatibility for hg <= 4.9)
Anton Shestakov <av6@dwimlabs.net>
parents: 6376
diff changeset
369 entries = compat.bcentries(partial)
0bc90758f613 topic: wrap branchmap.read() as well (compatibility for hg <= 4.9)
Anton Shestakov <av6@dwimlabs.net>
parents: 6376
diff changeset
370
0bc90758f613 topic: wrap branchmap.read() as well (compatibility for hg <= 4.9)
Anton Shestakov <av6@dwimlabs.net>
parents: 6376
diff changeset
371 for branch in tuple(entries):
0bc90758f613 topic: wrap branchmap.read() as well (compatibility for hg <= 4.9)
Anton Shestakov <av6@dwimlabs.net>
parents: 6376
diff changeset
372 formatted = common.formatfqbn(branch=branch)
0bc90758f613 topic: wrap branchmap.read() as well (compatibility for hg <= 4.9)
Anton Shestakov <av6@dwimlabs.net>
parents: 6376
diff changeset
373 if branch != formatted:
0bc90758f613 topic: wrap branchmap.read() as well (compatibility for hg <= 4.9)
Anton Shestakov <av6@dwimlabs.net>
parents: 6376
diff changeset
374 entries[formatted] = entries.pop(branch)
0bc90758f613 topic: wrap branchmap.read() as well (compatibility for hg <= 4.9)
Anton Shestakov <av6@dwimlabs.net>
parents: 6376
diff changeset
375
0bc90758f613 topic: wrap branchmap.read() as well (compatibility for hg <= 4.9)
Anton Shestakov <av6@dwimlabs.net>
parents: 6376
diff changeset
376 return partial