##// END OF EJS Templates
upgrade: split actual upgrade code away from the main module...
upgrade: split actual upgrade code away from the main module The main module is getting big and hard to follow. So we are splitting all the logic to actually run an upgrade in a sub module. It nicely highlight that there are very few actual call point to the code we just moved. Differential Revision: https://phab.mercurial-scm.org/D9476

File last commit:

r46661:f105c49e default
r46661:f105c49e default
Show More
ext-sidedata.py
84 lines | 2.7 KiB | text/x-python | PythonLexer
sidedata: test we can successfully write sidedata...
r43308 # ext-sidedata.py - small extension to test the sidedata logic
#
# Copyright 2019 Pierre-Yves David <pierre-yves.david@octobus.net)
#
# This software may be used and distributed according to the terms of the
# GNU General Public License version 2 or any later version.
from __future__ import absolute_import
import hashlib
import struct
from mercurial import (
extensions,
sidedata: check that the sidedata safely roundtrip...
r43310 node,
Pulkit Goyal
localrepo: move requirements constant to requirements module...
r45933 requirements,
sidedata: test we can successfully write sidedata...
r43308 revlog,
)
upgrade: split actual upgrade code away from the main module...
r46661 from mercurial.upgrade_utils import engine as upgrade_engine
Augie Fackler
formatting: blacken the codebase...
r43346 from mercurial.revlogutils import sidedata
sidedata: test we can successfully write sidedata...
r43308
Augie Fackler
formatting: blacken the codebase...
r43346 def wrapaddrevision(
orig, self, text, transaction, link, p1, p2, *args, **kwargs
):
sidedata: test we can successfully write sidedata...
r43308 if kwargs.get('sidedata') is None:
kwargs['sidedata'] = {}
sd = kwargs['sidedata']
## let's store some arbitrary data just for testing
# text length
sd[sidedata.SD_TEST1] = struct.pack('>I', len(text))
# and sha2 hashes
sha256 = hashlib.sha256(text).digest()
sd[sidedata.SD_TEST2] = struct.pack('>32s', sha256)
return orig(self, text, transaction, link, p1, p2, *args, **kwargs)
Augie Fackler
formatting: blacken the codebase...
r43346
sidedata: check that the sidedata safely roundtrip...
r43310 def wraprevision(orig, self, nodeorrev, *args, **kwargs):
text = orig(self, nodeorrev, *args, **kwargs)
upgrade: allow upgrade to repository using sidedata...
r43404 if getattr(self, 'sidedatanocheck', False):
return text
sidedata: check that the sidedata safely roundtrip...
r43310 if nodeorrev != node.nullrev and nodeorrev != node.nullid:
sd = self.sidedata(nodeorrev)
if len(text) != struct.unpack('>I', sd[sidedata.SD_TEST1])[0]:
raise RuntimeError('text size mismatch')
expected = sd[sidedata.SD_TEST2]
got = hashlib.sha256(text).digest()
if got != expected:
raise RuntimeError('sha256 mismatch')
return text
Augie Fackler
formatting: blacken the codebase...
r43346
upgrade: allow upgrade to repository using sidedata...
r43404 def wrapgetsidedatacompanion(orig, srcrepo, dstrepo):
sidedatacompanion = orig(srcrepo, dstrepo)
addedreqs = dstrepo.requirements - srcrepo.requirements
Pulkit Goyal
localrepo: move requirements constant to requirements module...
r45933 if requirements.SIDEDATA_REQUIREMENT in addedreqs:
upgrade: allow upgrade to repository using sidedata...
r43404 assert sidedatacompanion is None # deal with composition later
def sidedatacompanion(revlog, rev):
update = {}
revlog.sidedatanocheck = True
try:
text = revlog.revision(rev)
finally:
del revlog.sidedatanocheck
## let's store some arbitrary data just for testing
# text length
update[sidedata.SD_TEST1] = struct.pack('>I', len(text))
# and sha2 hashes
sha256 = hashlib.sha256(text).digest()
update[sidedata.SD_TEST2] = struct.pack('>32s', sha256)
upgrade: allow sidedata upgrade to modify revision flag...
r46327 return False, (), update, 0, 0
upgrade: allow upgrade to repository using sidedata...
r43404
return sidedatacompanion
sidedata: test we can successfully write sidedata...
r43308 def extsetup(ui):
extensions.wrapfunction(revlog.revlog, 'addrevision', wrapaddrevision)
sidedata: check that the sidedata safely roundtrip...
r43310 extensions.wrapfunction(revlog.revlog, 'revision', wraprevision)
upgrade: allow upgrade to repository using sidedata...
r43404 extensions.wrapfunction(
upgrade: split actual upgrade code away from the main module...
r46661 upgrade_engine, 'getsidedatacompanion', wrapgetsidedatacompanion
upgrade: allow upgrade to repository using sidedata...
r43404 )