D7840: nodemap: add a (python) index class for persistent nodemap testing
marmoute (Pierre-Yves David)
phabricator at mercurial-scm.org
Wed Feb 5 00:27:23 UTC 2020
marmoute added a comment.
marmoute updated this revision to Diff 19888.
rebase to latest default
REPOSITORY
rHG Mercurial
CHANGES SINCE LAST UPDATE
https://phab.mercurial-scm.org/D7840?vs=19756&id=19888
CHANGES SINCE LAST ACTION
https://phab.mercurial-scm.org/D7840/new/
REVISION DETAIL
https://phab.mercurial-scm.org/D7840
AFFECTED FILES
mercurial/configitems.py
mercurial/localrepo.py
mercurial/pure/parsers.py
mercurial/revlog.py
tests/test-persistent-nodemap.t
CHANGE DETAILS
diff --git a/tests/test-persistent-nodemap.t b/tests/test-persistent-nodemap.t
--- a/tests/test-persistent-nodemap.t
+++ b/tests/test-persistent-nodemap.t
@@ -8,6 +8,8 @@
$ cat << EOF >> .hg/hgrc
> [experimental]
> exp-persistent-nodemap=yes
+ > [devel]
+ > persistent-nodemap=yes
> EOF
$ hg debugbuilddag .+5000
$ f --size .hg/store/00changelog.n
diff --git a/mercurial/revlog.py b/mercurial/revlog.py
--- a/mercurial/revlog.py
+++ b/mercurial/revlog.py
@@ -352,6 +352,21 @@
return p
+NodemapRevlogIO = None
+
+if util.safehasattr(parsers, 'parse_index_devel_nodemap'):
+
+ class NodemapRevlogIO(revlogio):
+ """A debug oriented IO class that return a PersistentNodeMapIndexObject
+
+ The PersistentNodeMapIndexObject object is meant to test the persistent nodemap feature.
+ """
+
+ def parseindex(self, data, inline):
+ index, cache = parsers.parse_index_devel_nodemap(data, inline)
+ return index, cache
+
+
class rustrevlogio(revlogio):
def parseindex(self, data, inline):
index, cache = super(rustrevlogio, self).parseindex(data, inline)
@@ -596,9 +611,17 @@
self._storedeltachains = True
+ devel_nodemap = (
+ self.nodemap_file
+ and opts.get(b'devel-force-nodemap', False)
+ and NodemapRevlogIO is not None
+ )
+
self._io = revlogio()
if self.version == REVLOGV0:
self._io = revlogoldio()
+ elif devel_nodemap:
+ self._io = NodemapRevlogIO()
elif rustrevlog is not None and self.opener.options.get(b'rust.index'):
self._io = rustrevlogio()
try:
diff --git a/mercurial/pure/parsers.py b/mercurial/pure/parsers.py
--- a/mercurial/pure/parsers.py
+++ b/mercurial/pure/parsers.py
@@ -141,6 +141,15 @@
self._extra = self._extra[: i - self._lgt]
+class PersistentNodeMapIndexObject(IndexObject):
+ """a Debug oriented class to test persistent nodemap
+
+ We need a simple python object to test API and higher level behavior. See
+ the Rust implementation for more serious usage. This should be used only
+ through the dedicated `devel.persistent-nodemap` config.
+ """
+
+
class InlinedIndexObject(BaseIndexObject):
def __init__(self, data, inline=0):
self._data = data
@@ -188,6 +197,12 @@
return InlinedIndexObject(data, inline), (0, data)
+def parse_index_devel_nodemap(data, inline):
+ """like parse_index2, but alway return a PersistentNodeMapIndexObject
+ """
+ return PersistentNodeMapIndexObject(data), None
+
+
def parse_dirstate(dmap, copymap, st):
parents = [st[:20], st[20:40]]
# dereference fields so they will be local in loop
diff --git a/mercurial/localrepo.py b/mercurial/localrepo.py
--- a/mercurial/localrepo.py
+++ b/mercurial/localrepo.py
@@ -933,6 +933,8 @@
options[b'rust.index'] = True
if ui.configbool(b'experimental', b'exp-persistent-nodemap'):
options[b'exp-persistent-nodemap'] = True
+ if ui.configbool(b'devel', b'persistent-nodemap'):
+ options[b'devel-force-nodemap'] = True
return options
diff --git a/mercurial/configitems.py b/mercurial/configitems.py
--- a/mercurial/configitems.py
+++ b/mercurial/configitems.py
@@ -406,6 +406,9 @@
b'devel', b'legacy.exchange', default=list,
)
coreconfigitem(
+ b'devel', b'persistent-nodemap', default=False,
+)
+coreconfigitem(
b'devel', b'servercafile', default=b'',
)
coreconfigitem(
To: marmoute, indygreg, #hg-reviewers
Cc: mercurial-devel
More information about the Mercurial-devel
mailing list