# HG changeset patch # User Matt Harbison # Date 2018-10-10 01:53:21 # Node ID 9d5ddf55415b4f008da1e902cc0eeca3a4126028 # Parent ab04ce6f0674b7c1042ef780d2bcbe1d79f1c65e 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. diff --git a/mercurial/localrepo.py b/mercurial/localrepo.py --- a/mercurial/localrepo.py +++ b/mercurial/localrepo.py @@ -708,6 +708,7 @@ def resolverevlogstorevfsoptions(ui, req """Resolve opener options specific to revlogs.""" options = {} + options[b'flagprocessors'] = {} if b'revlogv1' in requirements: options[b'revlogv1'] = True diff --git a/mercurial/revlog.py b/mercurial/revlog.py --- a/mercurial/revlog.py +++ b/mercurial/revlog.py @@ -151,16 +151,19 @@ def addflagprocessor(flag, processor): 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 @@ class revlog(object): 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) diff --git a/tests/test-flagprocessor.t b/tests/test-flagprocessor.t --- a/tests/test-flagprocessor.t +++ b/tests/test-flagprocessor.t @@ -206,6 +206,8 @@ Ensure the data got to the server OK 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'.