comparison mercurial/unionrepo.py @ 47164:8d3c2f9d4af7

revlog: use a "radix" to address revlog Instead of pointing to the index directly and to derive the other file from that, we directly provide the radix and let the revlog determine the associated file path internally. This is more robust and will give us more flexibility for picking this file name in the future. Differential Revision: https://phab.mercurial-scm.org/D10576
author Pierre-Yves David <pierre-yves.david@octobus.net>
date Mon, 03 May 2021 12:22:36 +0200
parents a07d5cb03a85
children 130c9f7ed914
comparison
equal deleted inserted replaced
47163:396442cd7e6a 47164:8d3c2f9d4af7
31 vfs as vfsmod, 31 vfs as vfsmod,
32 ) 32 )
33 33
34 34
35 class unionrevlog(revlog.revlog): 35 class unionrevlog(revlog.revlog):
36 def __init__(self, opener, indexfile, revlog2, linkmapper): 36 def __init__(self, opener, radix, revlog2, linkmapper):
37 # How it works: 37 # How it works:
38 # To retrieve a revision, we just need to know the node id so we can 38 # To retrieve a revision, we just need to know the node id so we can
39 # look it up in revlog2. 39 # look it up in revlog2.
40 # 40 #
41 # To differentiate a rev in the second revlog from a rev in the revlog, 41 # To differentiate a rev in the second revlog from a rev in the revlog,
43 opener = vfsmod.readonlyvfs(opener) 43 opener = vfsmod.readonlyvfs(opener)
44 target = getattr(revlog2, 'target', None) 44 target = getattr(revlog2, 'target', None)
45 if target is None: 45 if target is None:
46 # a revlog wrapper, eg: the manifestlog that is not an actual revlog 46 # a revlog wrapper, eg: the manifestlog that is not an actual revlog
47 target = revlog2._revlog.target 47 target = revlog2._revlog.target
48 revlog.revlog.__init__(self, opener, target=target, indexfile=indexfile) 48 revlog.revlog.__init__(self, opener, target=target, radix=radix)
49 self.revlog2 = revlog2 49 self.revlog2 = revlog2
50 50
51 n = len(self) 51 n = len(self)
52 self.repotiprev = n - 1 52 self.repotiprev = n - 1
53 self.bundlerevs = set() # used by 'bundle()' revset expression 53 self.bundlerevs = set() # used by 'bundle()' revset expression
162 class unionchangelog(unionrevlog, changelog.changelog): 162 class unionchangelog(unionrevlog, changelog.changelog):
163 def __init__(self, opener, opener2): 163 def __init__(self, opener, opener2):
164 changelog.changelog.__init__(self, opener) 164 changelog.changelog.__init__(self, opener)
165 linkmapper = None 165 linkmapper = None
166 changelog2 = changelog.changelog(opener2) 166 changelog2 = changelog.changelog(opener2)
167 unionrevlog.__init__( 167 unionrevlog.__init__(self, opener, self.radix, changelog2, linkmapper)
168 self, opener, self._indexfile, changelog2, linkmapper
169 )
170 168
171 169
172 class unionmanifest(unionrevlog, manifest.manifestrevlog): 170 class unionmanifest(unionrevlog, manifest.manifestrevlog):
173 def __init__(self, nodeconstants, opener, opener2, linkmapper): 171 def __init__(self, nodeconstants, opener, opener2, linkmapper):
174 manifest.manifestrevlog.__init__(self, nodeconstants, opener) 172 manifest.manifestrevlog.__init__(self, nodeconstants, opener)
175 manifest2 = manifest.manifestrevlog(nodeconstants, opener2) 173 manifest2 = manifest.manifestrevlog(nodeconstants, opener2)
176 unionrevlog.__init__( 174 unionrevlog.__init__(
177 self, opener, self._revlog._indexfile, manifest2, linkmapper 175 self, opener, self._revlog.radix, manifest2, linkmapper
178 ) 176 )
179 177
180 178
181 class unionfilelog(filelog.filelog): 179 class unionfilelog(filelog.filelog):
182 def __init__(self, opener, path, opener2, linkmapper, repo): 180 def __init__(self, opener, path, opener2, linkmapper, repo):
183 filelog.filelog.__init__(self, opener, path) 181 filelog.filelog.__init__(self, opener, path)
184 filelog2 = filelog.filelog(opener2, path) 182 filelog2 = filelog.filelog(opener2, path)
185 self._revlog = unionrevlog( 183 self._revlog = unionrevlog(
186 opener, self._revlog._indexfile, filelog2._revlog, linkmapper 184 opener, self._revlog.radix, filelog2._revlog, linkmapper
187 ) 185 )
188 self._repo = repo 186 self._repo = repo
189 self.repotiprev = self._revlog.repotiprev 187 self.repotiprev = self._revlog.repotiprev
190 self.revlog2 = self._revlog.revlog2 188 self.revlog2 = self._revlog.revlog2
191 189