comparison mercurial/bundlerepo.py @ 47150: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 96ee8ca99f5a
comparison
equal deleted inserted replaced
47149:396442cd7e6a 47150:8d3c2f9d4af7
50 constants as revlog_constants, 50 constants as revlog_constants,
51 ) 51 )
52 52
53 53
54 class bundlerevlog(revlog.revlog): 54 class bundlerevlog(revlog.revlog):
55 def __init__(self, opener, target, indexfile, cgunpacker, linkmapper): 55 def __init__(self, opener, target, radix, cgunpacker, linkmapper):
56 # How it works: 56 # How it works:
57 # To retrieve a revision, we need to know the offset of the revision in 57 # To retrieve a revision, we need to know the offset of the revision in
58 # the bundle (an unbundle object). We store this offset in the index 58 # the bundle (an unbundle object). We store this offset in the index
59 # (start). The base of the delta is stored in the base field. 59 # (start). The base of the delta is stored in the base field.
60 # 60 #
61 # To differentiate a rev in the bundle from a rev in the revlog, we 61 # To differentiate a rev in the bundle from a rev in the revlog, we
62 # check revision against repotiprev. 62 # check revision against repotiprev.
63 opener = vfsmod.readonlyvfs(opener) 63 opener = vfsmod.readonlyvfs(opener)
64 revlog.revlog.__init__(self, opener, target=target, indexfile=indexfile) 64 revlog.revlog.__init__(self, opener, target=target, radix=radix)
65 self.bundle = cgunpacker 65 self.bundle = cgunpacker
66 n = len(self) 66 n = len(self)
67 self.repotiprev = n - 1 67 self.repotiprev = n - 1
68 self.bundlerevs = set() # used by 'bundle()' revset expression 68 self.bundlerevs = set() # used by 'bundle()' revset expression
69 for deltadata in cgunpacker.deltaiter(): 69 for deltadata in cgunpacker.deltaiter():
178 linkmapper = lambda x: x 178 linkmapper = lambda x: x
179 bundlerevlog.__init__( 179 bundlerevlog.__init__(
180 self, 180 self,
181 opener, 181 opener,
182 (revlog_constants.KIND_CHANGELOG, None), 182 (revlog_constants.KIND_CHANGELOG, None),
183 self._indexfile, 183 self.radix,
184 cgunpacker, 184 cgunpacker,
185 linkmapper, 185 linkmapper,
186 ) 186 )
187 187
188 188
199 manifest.manifestrevlog.__init__(self, nodeconstants, opener, tree=dir) 199 manifest.manifestrevlog.__init__(self, nodeconstants, opener, tree=dir)
200 bundlerevlog.__init__( 200 bundlerevlog.__init__(
201 self, 201 self,
202 opener, 202 opener,
203 (revlog_constants.KIND_MANIFESTLOG, dir), 203 (revlog_constants.KIND_MANIFESTLOG, dir),
204 self._revlog._indexfile, 204 self._revlog.radix,
205 cgunpacker, 205 cgunpacker,
206 linkmapper, 206 linkmapper,
207 ) 207 )
208 if dirlogstarts is None: 208 if dirlogstarts is None:
209 dirlogstarts = {} 209 dirlogstarts = {}
231 filelog.filelog.__init__(self, opener, path) 231 filelog.filelog.__init__(self, opener, path)
232 self._revlog = bundlerevlog( 232 self._revlog = bundlerevlog(
233 opener, 233 opener,
234 # XXX should use the unencoded path 234 # XXX should use the unencoded path
235 target=(revlog_constants.KIND_FILELOG, path), 235 target=(revlog_constants.KIND_FILELOG, path),
236 indexfile=self._revlog._indexfile, 236 radix=self._revlog.radix,
237 cgunpacker=cgunpacker, 237 cgunpacker=cgunpacker,
238 linkmapper=linkmapper, 238 linkmapper=linkmapper,
239 ) 239 )
240 240
241 241