flagutil.py
80 lines
| 2.9 KiB
| text/x-python
|
PythonLexer
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 | ||||
r42957 | from ..i18n import _ | |||
r42954 | from .constants import ( | |||
REVIDX_DEFAULT_FLAGS, | ||||
REVIDX_ELLIPSIS, | ||||
REVIDX_EXTSTORED, | ||||
REVIDX_FLAGS_ORDER, | ||||
REVIDX_ISCENSORED, | ||||
REVIDX_RAWTEXT_CHANGING_FLAGS, | ||||
) | ||||
r42956 | from .. import ( | |||
r42957 | error, | |||
r42956 | util | |||
) | ||||
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 | ||||
r42956 | REVIDX_KNOWN_FLAGS = util.bitsfrom(REVIDX_FLAGS_ORDER) | |||
r42955 | # Store flag processors (cf. 'addflagprocessor()' to register) | |||
flagprocessors = { | ||||
REVIDX_ISCENSORED: None, | ||||
} | ||||
r42954 | ||||
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) | ||||
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 | ||||