comparison mercurial/bundlerepo.py @ 47072:4c041c71ec01

revlog: introduce an explicit tracking of what the revlog is about Since the dawn of time, people have been forced to rely to lossy introspection of the index filename to determine what the purpose and role of the revlog they encounter is. This is hacky, error prone, inflexible, abstraction-leaky, <insert-your-own-complaints-here>. In f63299ee7e4d Rapha?l introduced a new attribute to track this information: `revlog_kind`. However it is initialized in an odd place and various instances end up not having it set. In addition is only tracking some of the information we end up having to introspect in various pieces of code. So we add a new attribute that holds more data and is more strictly enforced. This work is done in collaboration with Rapha?l. The `revlog_kind` one will be removed/adapted in the next changeset. We expect to be able to clean up various existing piece of code and to simplify coming work around the newer revlog format. Differential Revision: https://phab.mercurial-scm.org/D10352
author Pierre-Yves David <pierre-yves.david@octobus.net>
date Tue, 06 Apr 2021 05:20:24 +0200
parents d55b71393907
children 47ffc754989a
comparison
equal deleted inserted replaced
47071:3e381eb557f3 47072:4c041c71ec01
44 ) 44 )
45 from .utils import ( 45 from .utils import (
46 urlutil, 46 urlutil,
47 ) 47 )
48 48
49 from .revlogutils import (
50 constants as revlog_constants,
51 )
52
49 53
50 class bundlerevlog(revlog.revlog): 54 class bundlerevlog(revlog.revlog):
51 def __init__(self, opener, indexfile, cgunpacker, linkmapper): 55 def __init__(self, opener, target, indexfile, cgunpacker, linkmapper):
52 # How it works: 56 # How it works:
53 # 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
54 # 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
55 # (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.
56 # 60 #
57 # 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
58 # check revision against repotiprev. 62 # check revision against repotiprev.
59 opener = vfsmod.readonlyvfs(opener) 63 opener = vfsmod.readonlyvfs(opener)
60 revlog.revlog.__init__(self, opener, indexfile) 64 revlog.revlog.__init__(self, opener, target=target, indexfile=indexfile)
61 self.bundle = cgunpacker 65 self.bundle = cgunpacker
62 n = len(self) 66 n = len(self)
63 self.repotiprev = n - 1 67 self.repotiprev = n - 1
64 self.bundlerevs = set() # used by 'bundle()' revset expression 68 self.bundlerevs = set() # used by 'bundle()' revset expression
65 for deltadata in cgunpacker.deltaiter(): 69 for deltadata in cgunpacker.deltaiter():
169 class bundlechangelog(bundlerevlog, changelog.changelog): 173 class bundlechangelog(bundlerevlog, changelog.changelog):
170 def __init__(self, opener, cgunpacker): 174 def __init__(self, opener, cgunpacker):
171 changelog.changelog.__init__(self, opener) 175 changelog.changelog.__init__(self, opener)
172 linkmapper = lambda x: x 176 linkmapper = lambda x: x
173 bundlerevlog.__init__( 177 bundlerevlog.__init__(
174 self, opener, self.indexfile, cgunpacker, linkmapper 178 self,
179 opener,
180 (revlog_constants.KIND_CHANGELOG, None),
181 self.indexfile,
182 cgunpacker,
183 linkmapper,
175 ) 184 )
176 185
177 186
178 class bundlemanifest(bundlerevlog, manifest.manifestrevlog): 187 class bundlemanifest(bundlerevlog, manifest.manifestrevlog):
179 def __init__( 188 def __init__(
185 dirlogstarts=None, 194 dirlogstarts=None,
186 dir=b'', 195 dir=b'',
187 ): 196 ):
188 manifest.manifestrevlog.__init__(self, nodeconstants, opener, tree=dir) 197 manifest.manifestrevlog.__init__(self, nodeconstants, opener, tree=dir)
189 bundlerevlog.__init__( 198 bundlerevlog.__init__(
190 self, opener, self.indexfile, cgunpacker, linkmapper 199 self,
200 opener,
201 (revlog_constants.KIND_MANIFESTLOG, dir),
202 self.indexfile,
203 cgunpacker,
204 linkmapper,
191 ) 205 )
192 if dirlogstarts is None: 206 if dirlogstarts is None:
193 dirlogstarts = {} 207 dirlogstarts = {}
194 if self.bundle.version == b"03": 208 if self.bundle.version == b"03":
195 dirlogstarts = _getfilestarts(self.bundle) 209 dirlogstarts = _getfilestarts(self.bundle)
212 226
213 class bundlefilelog(filelog.filelog): 227 class bundlefilelog(filelog.filelog):
214 def __init__(self, opener, path, cgunpacker, linkmapper): 228 def __init__(self, opener, path, cgunpacker, linkmapper):
215 filelog.filelog.__init__(self, opener, path) 229 filelog.filelog.__init__(self, opener, path)
216 self._revlog = bundlerevlog( 230 self._revlog = bundlerevlog(
217 opener, self.indexfile, cgunpacker, linkmapper 231 opener,
232 # XXX should use the unencoded path
233 target=(revlog_constants.KIND_FILELOG, path),
234 indexfile=self.indexfile,
235 cgunpacker=cgunpacker,
236 linkmapper=linkmapper,
218 ) 237 )
219 238
220 239
221 class bundlepeer(localrepo.localpeer): 240 class bundlepeer(localrepo.localpeer):
222 def canpush(self): 241 def canpush(self):