Mercurial > public > mercurial-scm > hg-stable
diff mercurial/revlogutils/flagutil.py @ 42877:5bb68fb72df2
flagutil: introduce a flagprocessorsmixin class
To avoid code duplication, we will provide a simple "ready to use" mixin that
carry the appropriate logic. First we use it in standard revlog, we'll remove
code duplication in later changesets.
Differential Revision: https://phab.mercurial-scm.org/D6796
author | Pierre-Yves David <pierre-yves.david@octobus.net> |
---|---|
date | Thu, 08 Aug 2019 01:12:48 +0200 |
parents | 6d61be152c55 |
children | 7907008a0bb5 |
line wrap: on
line diff
--- a/mercurial/revlogutils/flagutil.py Fri Sep 06 23:26:30 2019 -0700 +++ b/mercurial/revlogutils/flagutil.py Thu Aug 08 01:12:48 2019 +0200 @@ -78,3 +78,74 @@ msg = _("cannot register multiple processors on flag '%#x'.") % (flag) raise error.Abort(msg) flagprocessors[flag] = processor + +class flagprocessorsmixin(object): + """basic mixin to support revlog flag processing + + Make sure the `_flagprocessors` attribute is set at ``__init__`` time. + + See the documentation of the ``_processflags`` method for details. + """ + + def _processflags(self, text, flags, operation, raw=False): + """Inspect revision data flags and applies transforms defined by + registered flag processors. + + ``text`` - the revision data to process + ``flags`` - the revision flags + ``operation`` - the operation being performed (read or write) + ``raw`` - an optional argument describing if the raw transform should be + applied. + + This method processes the flags in the order (or reverse order if + ``operation`` is 'write') defined by REVIDX_FLAGS_ORDER, applying the + flag processors registered for present flags. The order of flags defined + in REVIDX_FLAGS_ORDER needs to be stable to allow non-commutativity. + + Returns a 2-tuple of ``(text, validatehash)`` where ``text`` is the + processed text and ``validatehash`` is a bool indicating whether the + returned text should be checked for hash integrity. + + Note: If the ``raw`` argument is set, it has precedence over the + operation and will only update the value of ``validatehash``. + """ + # fast path: no flag processors will run + if flags == 0: + return text, True + if not operation in ('read', 'write'): + raise error.ProgrammingError(_("invalid '%s' operation") % + operation) + # Check all flags are known. + if flags & ~REVIDX_KNOWN_FLAGS: + raise error.RevlogError(_("incompatible revision flag '%#x'") % + (flags & ~REVIDX_KNOWN_FLAGS)) + validatehash = True + # Depending on the operation (read or write), the order might be + # reversed due to non-commutative transforms. + orderedflags = REVIDX_FLAGS_ORDER + if operation == 'write': + orderedflags = reversed(orderedflags) + + for flag in orderedflags: + # If a flagprocessor has been registered for a known flag, apply the + # related operation transform and update result tuple. + if flag & flags: + vhash = True + + if flag not in self._flagprocessors: + message = _("missing processor for flag '%#x'") % (flag) + raise error.RevlogError(message) + + processor = self._flagprocessors[flag] + if processor is not None: + readtransform, writetransform, rawtransform = processor + + if raw: + vhash = rawtransform(self, text) + elif operation == 'read': + text, vhash = readtransform(self, text) + else: # write operation + text, vhash = writetransform(self, text) + validatehash = validatehash and vhash + + return text, validatehash