comparison mercurial/bundlerepo.py @ 51908:cfd30df0f8e4

bundlerepo: fix mismatches with repository and revlog classes Both pytype and PyCharm complained that `write()` and `_write()` in the bundlephasecache class aren't proper overrides- indeed they seem to be missing an argument that the base class has. PyCharm and pytype also complained that the `revlog.revlog` class doesn't have a `_chunk()` method. That looks like it was moved from revlog to `_InnerRevlog` back in e8ad6d8de8b8, and wasn't caught because this module wasn't type checked. However, I couldn't figure out a syntax with `revlog.revlog._inner._chunk(self, rev)`, as it complained about passing too many args. `bundlerevlog._rawtext()` uses this `super(...)` style to call the super class, so hopefully that works, even with the wonky dynamic subclassing. The revlog class needed the `_InnerRevlog` field typed because it isn't set in the constructor. Finally, the vfs type hints look broken. This initially failed with: File "/mnt/c/Users/Matt/hg/mercurial/bundlerepo.py", line 65, in __init__: Function readonlyvfs.__init__ was called with the wrong arguments [wrong-arg-types] Expected: (self, vfs: mercurial.vfs.vfs) Actually passed: (self, vfs: Callable) Called from (traceback): line 232, in dirlog line 214, in __init__ I don't see a raw Callable, but I tried changing some of the vfs args to be typed as `vfsmod.abstractvfs`, but that class doesn't have `options`, so it failed elsewhere. `readonlyvfs` isn't a subclass of `vfs` (it's a subclass of `abstractvfs`), so I'm not sure how to handle that. It would be a shame to have to make a union of vfs subclasses (but not all of them have `options` either).
author Matt Harbison <matt_harbison@yahoo.com>
date Sat, 03 Aug 2024 01:33:13 -0400
parents 9d4ad05bc91c
children 5cc8deb96b48
comparison
equal deleted inserted replaced
51907:9d4ad05bc91c 51908:cfd30df0f8e4
53 constants as revlog_constants, 53 constants as revlog_constants,
54 ) 54 )
55 55
56 56
57 class bundlerevlog(revlog.revlog): 57 class bundlerevlog(revlog.revlog):
58 def __init__(self, opener, target, radix, cgunpacker, linkmapper): 58 def __init__(
59 self, opener: typing.Any, target, radix, cgunpacker, linkmapper
60 ):
61 # TODO: figure out real type of opener
62 #
59 # How it works: 63 # How it works:
60 # To retrieve a revision, we need to know the offset of the revision in 64 # To retrieve a revision, we need to know the offset of the revision in
61 # the bundle (an unbundle object). We store this offset in the index 65 # the bundle (an unbundle object). We store this offset in the index
62 # (start). The base of the delta is stored in the base field. 66 # (start). The base of the delta is stored in the base field.
63 # 67 #
122 def _chunk(self, rev): 126 def _chunk(self, rev):
123 # Warning: in case of bundle, the diff is against what we stored as 127 # Warning: in case of bundle, the diff is against what we stored as
124 # delta base, not against rev - 1 128 # delta base, not against rev - 1
125 # XXX: could use some caching 129 # XXX: could use some caching
126 if rev <= self.repotiprev: 130 if rev <= self.repotiprev:
127 return revlog.revlog._chunk(self, rev) 131 return super(bundlerevlog, self)._inner._chunk(rev)
128 self.bundle.seek(self.start(rev)) 132 self.bundle.seek(self.start(rev))
129 return self.bundle.read(self.length(rev)) 133 return self.bundle.read(self.length(rev))
130 134
131 def revdiff(self, rev1, rev2): 135 def revdiff(self, rev1, rev2):
132 """return or calculate a delta between two revisions""" 136 """return or calculate a delta between two revisions"""
263 def __init__(self, *args, **kwargs): 267 def __init__(self, *args, **kwargs):
264 super(bundlephasecache, self).__init__(*args, **kwargs) 268 super(bundlephasecache, self).__init__(*args, **kwargs)
265 if hasattr(self, 'opener'): 269 if hasattr(self, 'opener'):
266 self.opener = vfsmod.readonlyvfs(self.opener) 270 self.opener = vfsmod.readonlyvfs(self.opener)
267 271
268 def write(self): 272 def write(self, repo):
269 raise NotImplementedError 273 raise NotImplementedError
270 274
271 def _write(self, fp): 275 def _write(self, repo, fp):
272 raise NotImplementedError 276 raise NotImplementedError
273 277
274 def _updateroots(self, repo, phase, newroots, tr, invalidate=True): 278 def _updateroots(self, repo, phase, newroots, tr, invalidate=True):
275 self._phaseroots[phase] = newroots 279 self._phaseroots[phase] = newroots
276 if invalidate: 280 if invalidate: