revlog: allow flag processors to be applied via store options
This allows flag processors to be registered to specific repos in an extension
by wrapping localrepo.resolverevlogstorevfsoptions(). I wanted to add the
processors via a function on localrepo, but some of the places where the
processors are globally registered don't have a repository available. This
makes targeting specific repos in the wrapper awkward, but still manageable.
--- a/mercurial/localrepo.py Fri Oct 12 17:34:45 2018 -0400
+++ b/mercurial/localrepo.py Tue Oct 09 21:53:21 2018 -0400
@@ -708,6 +708,7 @@
"""Resolve opener options specific to revlogs."""
options = {}
+ options[b'flagprocessors'] = {}
if b'revlogv1' in requirements:
options[b'revlogv1'] = True
--- a/mercurial/revlog.py Fri Oct 12 17:34:45 2018 -0400
+++ b/mercurial/revlog.py Tue Oct 09 21:53:21 2018 -0400
@@ -151,16 +151,19 @@
debug commands. In this case the transform only indicates whether the
contents can be used for hash integrity checks.
"""
+ _insertflagprocessor(flag, processor, _flagprocessors)
+
+def _insertflagprocessor(flag, processor, flagprocessors):
if not flag & REVIDX_KNOWN_FLAGS:
msg = _("cannot register processor on unknown flag '%#x'.") % (flag)
raise error.ProgrammingError(msg)
if flag not in REVIDX_FLAGS_ORDER:
msg = _("flag '%#x' undefined in REVIDX_FLAGS_ORDER.") % (flag)
raise error.ProgrammingError(msg)
- if flag in _flagprocessors:
+ if flag in flagprocessors:
msg = _("cannot register multiple processors on flag '%#x'.") % (flag)
raise error.Abort(msg)
- _flagprocessors[flag] = processor
+ flagprocessors[flag] = processor
def getoffset(q):
return int(q >> 16)
@@ -408,6 +411,10 @@
if opts.get('enableellipsis'):
self._flagprocessors[REVIDX_ELLIPSIS] = ellipsisprocessor
+ # revlog v0 doesn't have flag processors
+ for flag, processor in opts.get(b'flagprocessors', {}).iteritems():
+ _insertflagprocessor(flag, processor, self._flagprocessors)
+
if self._chunkcachesize <= 0:
raise error.RevlogError(_('revlog chunk cache size %r is not '
'greater than 0') % self._chunkcachesize)
--- a/tests/test-flagprocessor.t Fri Oct 12 17:34:45 2018 -0400
+++ b/tests/test-flagprocessor.t Tue Oct 09 21:53:21 2018 -0400
@@ -206,6 +206,8 @@
File "*/tests/flagprocessorext.py", line *, in extsetup (glob)
validatehash,
File "*/mercurial/revlog.py", line *, in addflagprocessor (glob)
+ _insertflagprocessor(flag, processor, _flagprocessors)
+ File "*/mercurial/revlog.py", line *, in _insertflagprocessor (glob)
raise error.Abort(msg)
Abort: cannot register multiple processors on flag '0x8'.
*** failed to set up extension duplicate: cannot register multiple processors on flag '0x8'.