##// END OF EJS Templates
check-code: allow command substitution with $(command)...
check-code: allow command substitution with $(command) Both `command` and $(command) are specified by POSIX. The latter nests better. I don't see why we shouldn't allow both (or only the latter). Differential Revision: https://phab.mercurial-scm.org/D6789

File last commit:

r42958:6d61be15 default
r43139:4257c33e default
Show More
flagutil.py
80 lines | 2.9 KiB | text/x-python | PythonLexer
flagutil: create a `mercurial.revlogutils.flagutil` module...
r42954 # flagutils.py - code to deal with revlog flags and their processors
#
# Copyright 2016 Remi Chaintron <remi@fb.com>
# Copyright 2016-2019 Pierre-Yves David <pierre-yves.david@ens-lyon.org>
#
# 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
flagutil: move insertflagprocessor to the new module (API)
r42957 from ..i18n import _
flagutil: create a `mercurial.revlogutils.flagutil` module...
r42954 from .constants import (
REVIDX_DEFAULT_FLAGS,
REVIDX_ELLIPSIS,
REVIDX_EXTSTORED,
REVIDX_FLAGS_ORDER,
REVIDX_ISCENSORED,
REVIDX_RAWTEXT_CHANGING_FLAGS,
)
flagutil: move REVIDX_KNOWN_FLAGS source of truth in flagutil (API)...
r42956 from .. import (
flagutil: move insertflagprocessor to the new module (API)
r42957 error,
flagutil: move REVIDX_KNOWN_FLAGS source of truth in flagutil (API)...
r42956 util
)
flagutil: create a `mercurial.revlogutils.flagutil` module...
r42954 # blanked usage of all the name to prevent pyflakes constraints
# We need these name available in the module for extensions.
REVIDX_ISCENSORED
REVIDX_ELLIPSIS
REVIDX_EXTSTORED
REVIDX_DEFAULT_FLAGS
REVIDX_FLAGS_ORDER
REVIDX_RAWTEXT_CHANGING_FLAGS
flagutil: move REVIDX_KNOWN_FLAGS source of truth in flagutil (API)...
r42956 REVIDX_KNOWN_FLAGS = util.bitsfrom(REVIDX_FLAGS_ORDER)
flagutil: move the `flagprocessors` mapping in the new module...
r42955 # Store flag processors (cf. 'addflagprocessor()' to register)
flagprocessors = {
REVIDX_ISCENSORED: None,
}
flagutil: create a `mercurial.revlogutils.flagutil` module...
r42954
flagutil: move addflagprocessor to the new module (API)
r42958 def addflagprocessor(flag, processor):
"""Register a flag processor on a revision data flag.
Invariant:
- Flags need to be defined in REVIDX_KNOWN_FLAGS and REVIDX_FLAGS_ORDER,
and REVIDX_RAWTEXT_CHANGING_FLAGS if they can alter rawtext.
- Only one flag processor can be registered on a specific flag.
- flagprocessors must be 3-tuples of functions (read, write, raw) with the
following signatures:
- (read) f(self, rawtext) -> text, bool
- (write) f(self, text) -> rawtext, bool
- (raw) f(self, rawtext) -> bool
"text" is presented to the user. "rawtext" is stored in revlog data, not
directly visible to the user.
The boolean returned by these transforms is used to determine whether
the returned text can be used for hash integrity checking. For example,
if "write" returns False, then "text" is used to generate hash. If
"write" returns True, that basically means "rawtext" returned by "write"
should be used to generate hash. Usually, "write" and "read" return
different booleans. And "raw" returns a same boolean as "write".
Note: The 'raw' transform is used for changegroup generation and in some
debug commands. In this case the transform only indicates whether the
contents can be used for hash integrity checks.
"""
insertflagprocessor(flag, processor, flagprocessors)
flagutil: move insertflagprocessor to the new module (API)
r42957 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:
msg = _("cannot register multiple processors on flag '%#x'.") % (flag)
raise error.Abort(msg)
flagprocessors[flag] = processor