##// END OF EJS Templates
revlog: introduce an explicit tracking of what the revlog is about...
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

File last commit:

r47758:07b9ebea default
r47838:4c041c71 default
Show More
ext-sidedata.py
93 lines | 3.1 KiB | text/x-python | PythonLexer
sidedata: test we can successfully write sidedata...
r43308 # ext-sidedata.py - small extension to test the sidedata logic
#
Raphaël Gomès
sidedata-exchange: rewrite sidedata on-the-fly whenever possible...
r47452 # Copyright 2019 Pierre-Yves David <pierre-yves.david@octobus.net>
sidedata: test we can successfully write sidedata...
r43308 #
# 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
Joerg Sonnenberger
node: replace nullid and friends with nodeconstants class...
r47771 from mercurial.node import nullrev
sidedata: test we can successfully write sidedata...
r43308 from mercurial import (
extensions,
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
Raphaël Gomès
sidedata: move to new sidedata storage in revlogv2...
r47443 def wrap_revisiondata(orig, self, nodeorrev, *args, **kwargs):
text, sd = orig(self, nodeorrev, *args, **kwargs)
upgrade: allow upgrade to repository using sidedata...
r43404 if getattr(self, 'sidedatanocheck', False):
Raphaël Gomès
sidedata: move to new sidedata storage in revlogv2...
r47443 return text, sd
if self.version & 0xFFFF != 2:
return text, sd
Joerg Sonnenberger
node: replace nullid and friends with nodeconstants class...
r47771 if nodeorrev != nullrev and nodeorrev != self.nullid:
Raphaël Gomès
sidedata-exchange: rewrite sidedata on-the-fly whenever possible...
r47452 cat1 = sd.get(sidedata.SD_TEST1)
if cat1 is not None and len(text) != struct.unpack('>I', cat1)[0]:
sidedata: check that the sidedata safely roundtrip...
r43310 raise RuntimeError('text size mismatch')
Raphaël Gomès
sidedata-exchange: rewrite sidedata on-the-fly whenever possible...
r47452 expected = sd.get(sidedata.SD_TEST2)
sidedata: check that the sidedata safely roundtrip...
r43310 got = hashlib.sha256(text).digest()
Raphaël Gomès
sidedata-exchange: rewrite sidedata on-the-fly whenever possible...
r47452 if expected is not None and got != expected:
sidedata: check that the sidedata safely roundtrip...
r43310 raise RuntimeError('sha256 mismatch')
Raphaël Gomès
sidedata: move to new sidedata storage in revlogv2...
r47443 return text, sd
sidedata: check that the sidedata safely roundtrip...
r43310
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)
Raphaël Gomès
sidedata: move to new sidedata storage in revlogv2...
r47443 extensions.wrapfunction(revlog.revlog, '_revisiondata', wrap_revisiondata)
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 )
Raphaël Gomès
sidedata-exchange: rewrite sidedata on-the-fly whenever possible...
r47452
def reposetup(ui, repo):
# We don't register sidedata computers because we don't care within these
# tests
repo.register_wanted_sidedata(sidedata.SD_TEST1)
repo.register_wanted_sidedata(sidedata.SD_TEST2)