annotate mercurial/revlogutils/flagutil.py @ 42990:a04b2c010d03

flagprocessors: make `processflagswrite` a module level function One more step towards removing the mixin. Differential Revision: https://phab.mercurial-scm.org/D6818
author Pierre-Yves David <pierre-yves.david@octobus.net>
date Fri, 06 Sep 2019 23:50:32 +0200
parents 50d9de61ce02
children eb5048f8c533
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
42728
ca5ca3badd3c flagutil: create a `mercurial.revlogutils.flagutil` module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
1 # flagutils.py - code to deal with revlog flags and their processors
ca5ca3badd3c flagutil: create a `mercurial.revlogutils.flagutil` module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
2 #
ca5ca3badd3c flagutil: create a `mercurial.revlogutils.flagutil` module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
3 # Copyright 2016 Remi Chaintron <remi@fb.com>
ca5ca3badd3c flagutil: create a `mercurial.revlogutils.flagutil` module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
4 # Copyright 2016-2019 Pierre-Yves David <pierre-yves.david@ens-lyon.org>
ca5ca3badd3c flagutil: create a `mercurial.revlogutils.flagutil` module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
5 #
ca5ca3badd3c flagutil: create a `mercurial.revlogutils.flagutil` module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
6 # This software may be used and distributed according to the terms of the
ca5ca3badd3c flagutil: create a `mercurial.revlogutils.flagutil` module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
7 # GNU General Public License version 2 or any later version.
ca5ca3badd3c flagutil: create a `mercurial.revlogutils.flagutil` module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
8
ca5ca3badd3c flagutil: create a `mercurial.revlogutils.flagutil` module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
9 from __future__ import absolute_import
ca5ca3badd3c flagutil: create a `mercurial.revlogutils.flagutil` module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
10
42731
5109217a9ab6 flagutil: move insertflagprocessor to the new module (API)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42730
diff changeset
11 from ..i18n import _
5109217a9ab6 flagutil: move insertflagprocessor to the new module (API)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42730
diff changeset
12
42728
ca5ca3badd3c flagutil: create a `mercurial.revlogutils.flagutil` module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
13 from .constants import (
ca5ca3badd3c flagutil: create a `mercurial.revlogutils.flagutil` module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
14 REVIDX_DEFAULT_FLAGS,
ca5ca3badd3c flagutil: create a `mercurial.revlogutils.flagutil` module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
15 REVIDX_ELLIPSIS,
ca5ca3badd3c flagutil: create a `mercurial.revlogutils.flagutil` module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
16 REVIDX_EXTSTORED,
ca5ca3badd3c flagutil: create a `mercurial.revlogutils.flagutil` module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
17 REVIDX_FLAGS_ORDER,
ca5ca3badd3c flagutil: create a `mercurial.revlogutils.flagutil` module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
18 REVIDX_ISCENSORED,
ca5ca3badd3c flagutil: create a `mercurial.revlogutils.flagutil` module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
19 REVIDX_RAWTEXT_CHANGING_FLAGS,
ca5ca3badd3c flagutil: create a `mercurial.revlogutils.flagutil` module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
20 )
ca5ca3badd3c flagutil: create a `mercurial.revlogutils.flagutil` module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
21
42730
92ac6b1697a7 flagutil: move REVIDX_KNOWN_FLAGS source of truth in flagutil (API)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42729
diff changeset
22 from .. import (
42731
5109217a9ab6 flagutil: move insertflagprocessor to the new module (API)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42730
diff changeset
23 error,
42730
92ac6b1697a7 flagutil: move REVIDX_KNOWN_FLAGS source of truth in flagutil (API)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42729
diff changeset
24 util
92ac6b1697a7 flagutil: move REVIDX_KNOWN_FLAGS source of truth in flagutil (API)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42729
diff changeset
25 )
92ac6b1697a7 flagutil: move REVIDX_KNOWN_FLAGS source of truth in flagutil (API)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42729
diff changeset
26
42728
ca5ca3badd3c flagutil: create a `mercurial.revlogutils.flagutil` module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
27 # blanked usage of all the name to prevent pyflakes constraints
ca5ca3badd3c flagutil: create a `mercurial.revlogutils.flagutil` module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
28 # We need these name available in the module for extensions.
ca5ca3badd3c flagutil: create a `mercurial.revlogutils.flagutil` module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
29 REVIDX_ISCENSORED
ca5ca3badd3c flagutil: create a `mercurial.revlogutils.flagutil` module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
30 REVIDX_ELLIPSIS
ca5ca3badd3c flagutil: create a `mercurial.revlogutils.flagutil` module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
31 REVIDX_EXTSTORED
ca5ca3badd3c flagutil: create a `mercurial.revlogutils.flagutil` module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
32 REVIDX_DEFAULT_FLAGS
ca5ca3badd3c flagutil: create a `mercurial.revlogutils.flagutil` module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
33 REVIDX_FLAGS_ORDER
ca5ca3badd3c flagutil: create a `mercurial.revlogutils.flagutil` module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
34 REVIDX_RAWTEXT_CHANGING_FLAGS
ca5ca3badd3c flagutil: create a `mercurial.revlogutils.flagutil` module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
35
42730
92ac6b1697a7 flagutil: move REVIDX_KNOWN_FLAGS source of truth in flagutil (API)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42729
diff changeset
36 REVIDX_KNOWN_FLAGS = util.bitsfrom(REVIDX_FLAGS_ORDER)
92ac6b1697a7 flagutil: move REVIDX_KNOWN_FLAGS source of truth in flagutil (API)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42729
diff changeset
37
42729
05c80f9ef100 flagutil: move the `flagprocessors` mapping in the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42728
diff changeset
38 # Store flag processors (cf. 'addflagprocessor()' to register)
05c80f9ef100 flagutil: move the `flagprocessors` mapping in the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42728
diff changeset
39 flagprocessors = {
05c80f9ef100 flagutil: move the `flagprocessors` mapping in the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42728
diff changeset
40 REVIDX_ISCENSORED: None,
05c80f9ef100 flagutil: move the `flagprocessors` mapping in the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42728
diff changeset
41 }
42728
ca5ca3badd3c flagutil: create a `mercurial.revlogutils.flagutil` module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
42
42732
6d61be152c55 flagutil: move addflagprocessor to the new module (API)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42731
diff changeset
43 def addflagprocessor(flag, processor):
6d61be152c55 flagutil: move addflagprocessor to the new module (API)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42731
diff changeset
44 """Register a flag processor on a revision data flag.
6d61be152c55 flagutil: move addflagprocessor to the new module (API)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42731
diff changeset
45
6d61be152c55 flagutil: move addflagprocessor to the new module (API)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42731
diff changeset
46 Invariant:
6d61be152c55 flagutil: move addflagprocessor to the new module (API)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42731
diff changeset
47 - Flags need to be defined in REVIDX_KNOWN_FLAGS and REVIDX_FLAGS_ORDER,
6d61be152c55 flagutil: move addflagprocessor to the new module (API)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42731
diff changeset
48 and REVIDX_RAWTEXT_CHANGING_FLAGS if they can alter rawtext.
6d61be152c55 flagutil: move addflagprocessor to the new module (API)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42731
diff changeset
49 - Only one flag processor can be registered on a specific flag.
6d61be152c55 flagutil: move addflagprocessor to the new module (API)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42731
diff changeset
50 - flagprocessors must be 3-tuples of functions (read, write, raw) with the
6d61be152c55 flagutil: move addflagprocessor to the new module (API)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42731
diff changeset
51 following signatures:
6d61be152c55 flagutil: move addflagprocessor to the new module (API)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42731
diff changeset
52 - (read) f(self, rawtext) -> text, bool
6d61be152c55 flagutil: move addflagprocessor to the new module (API)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42731
diff changeset
53 - (write) f(self, text) -> rawtext, bool
6d61be152c55 flagutil: move addflagprocessor to the new module (API)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42731
diff changeset
54 - (raw) f(self, rawtext) -> bool
6d61be152c55 flagutil: move addflagprocessor to the new module (API)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42731
diff changeset
55 "text" is presented to the user. "rawtext" is stored in revlog data, not
6d61be152c55 flagutil: move addflagprocessor to the new module (API)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42731
diff changeset
56 directly visible to the user.
6d61be152c55 flagutil: move addflagprocessor to the new module (API)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42731
diff changeset
57 The boolean returned by these transforms is used to determine whether
6d61be152c55 flagutil: move addflagprocessor to the new module (API)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42731
diff changeset
58 the returned text can be used for hash integrity checking. For example,
6d61be152c55 flagutil: move addflagprocessor to the new module (API)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42731
diff changeset
59 if "write" returns False, then "text" is used to generate hash. If
6d61be152c55 flagutil: move addflagprocessor to the new module (API)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42731
diff changeset
60 "write" returns True, that basically means "rawtext" returned by "write"
6d61be152c55 flagutil: move addflagprocessor to the new module (API)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42731
diff changeset
61 should be used to generate hash. Usually, "write" and "read" return
6d61be152c55 flagutil: move addflagprocessor to the new module (API)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42731
diff changeset
62 different booleans. And "raw" returns a same boolean as "write".
6d61be152c55 flagutil: move addflagprocessor to the new module (API)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42731
diff changeset
63
6d61be152c55 flagutil: move addflagprocessor to the new module (API)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42731
diff changeset
64 Note: The 'raw' transform is used for changegroup generation and in some
6d61be152c55 flagutil: move addflagprocessor to the new module (API)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42731
diff changeset
65 debug commands. In this case the transform only indicates whether the
6d61be152c55 flagutil: move addflagprocessor to the new module (API)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42731
diff changeset
66 contents can be used for hash integrity checks.
6d61be152c55 flagutil: move addflagprocessor to the new module (API)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42731
diff changeset
67 """
6d61be152c55 flagutil: move addflagprocessor to the new module (API)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42731
diff changeset
68 insertflagprocessor(flag, processor, flagprocessors)
6d61be152c55 flagutil: move addflagprocessor to the new module (API)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42731
diff changeset
69
42731
5109217a9ab6 flagutil: move insertflagprocessor to the new module (API)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42730
diff changeset
70 def insertflagprocessor(flag, processor, flagprocessors):
5109217a9ab6 flagutil: move insertflagprocessor to the new module (API)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42730
diff changeset
71 if not flag & REVIDX_KNOWN_FLAGS:
5109217a9ab6 flagutil: move insertflagprocessor to the new module (API)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42730
diff changeset
72 msg = _("cannot register processor on unknown flag '%#x'.") % (flag)
5109217a9ab6 flagutil: move insertflagprocessor to the new module (API)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42730
diff changeset
73 raise error.ProgrammingError(msg)
5109217a9ab6 flagutil: move insertflagprocessor to the new module (API)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42730
diff changeset
74 if flag not in REVIDX_FLAGS_ORDER:
5109217a9ab6 flagutil: move insertflagprocessor to the new module (API)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42730
diff changeset
75 msg = _("flag '%#x' undefined in REVIDX_FLAGS_ORDER.") % (flag)
5109217a9ab6 flagutil: move insertflagprocessor to the new module (API)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42730
diff changeset
76 raise error.ProgrammingError(msg)
5109217a9ab6 flagutil: move insertflagprocessor to the new module (API)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42730
diff changeset
77 if flag in flagprocessors:
5109217a9ab6 flagutil: move insertflagprocessor to the new module (API)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42730
diff changeset
78 msg = _("cannot register multiple processors on flag '%#x'.") % (flag)
5109217a9ab6 flagutil: move insertflagprocessor to the new module (API)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42730
diff changeset
79 raise error.Abort(msg)
5109217a9ab6 flagutil: move insertflagprocessor to the new module (API)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42730
diff changeset
80 flagprocessors[flag] = processor
42871
5bb68fb72df2 flagutil: introduce a flagprocessorsmixin class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42732
diff changeset
81
5bb68fb72df2 flagutil: introduce a flagprocessorsmixin class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42732
diff changeset
82 class flagprocessorsmixin(object):
5bb68fb72df2 flagutil: introduce a flagprocessorsmixin class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42732
diff changeset
83 """basic mixin to support revlog flag processing
5bb68fb72df2 flagutil: introduce a flagprocessorsmixin class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42732
diff changeset
84
5bb68fb72df2 flagutil: introduce a flagprocessorsmixin class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42732
diff changeset
85 Make sure the `_flagprocessors` attribute is set at ``__init__`` time.
5bb68fb72df2 flagutil: introduce a flagprocessorsmixin class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42732
diff changeset
86
5bb68fb72df2 flagutil: introduce a flagprocessorsmixin class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42732
diff changeset
87 See the documentation of the ``_processflags`` method for details.
5bb68fb72df2 flagutil: introduce a flagprocessorsmixin class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42732
diff changeset
88 """
5bb68fb72df2 flagutil: introduce a flagprocessorsmixin class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42732
diff changeset
89
42873
7907008a0bb5 flagutil: make the error class used by the mixin configurable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42871
diff changeset
90 _flagserrorclass = error.RevlogError
7907008a0bb5 flagutil: make the error class used by the mixin configurable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42871
diff changeset
91
42871
5bb68fb72df2 flagutil: introduce a flagprocessorsmixin class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42732
diff changeset
92 def _processflags(self, text, flags, operation, raw=False):
42875
87a934684c3b flagprocessors: introduce specialized functions
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42873
diff changeset
93 """deprecated entry point to access flag processors"""
42881
519b45603880 flagprocessors: deprecate _processflags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42875
diff changeset
94 msg = ('_processflag(...) use the specialized variant')
519b45603880 flagprocessors: deprecate _processflags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42875
diff changeset
95 util.nouideprecwarn(msg, '5.2', stacklevel=2)
42875
87a934684c3b flagprocessors: introduce specialized functions
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42873
diff changeset
96 if raw:
87a934684c3b flagprocessors: introduce specialized functions
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42873
diff changeset
97 return text, self._processflagsraw(text, flags)
87a934684c3b flagprocessors: introduce specialized functions
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42873
diff changeset
98 elif operation == 'read':
87a934684c3b flagprocessors: introduce specialized functions
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42873
diff changeset
99 return self._processflagsread(text, flags)
87a934684c3b flagprocessors: introduce specialized functions
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42873
diff changeset
100 else: # write operation
42990
a04b2c010d03 flagprocessors: make `processflagswrite` a module level function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42989
diff changeset
101 return processflagswrite(self, text, flags)
42875
87a934684c3b flagprocessors: introduce specialized functions
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42873
diff changeset
102
87a934684c3b flagprocessors: introduce specialized functions
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42873
diff changeset
103 def _processflagsread(self, text, flags):
87a934684c3b flagprocessors: introduce specialized functions
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42873
diff changeset
104 """Inspect revision data flags and applies read transformations defined
87a934684c3b flagprocessors: introduce specialized functions
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42873
diff changeset
105 by registered flag processors.
42871
5bb68fb72df2 flagutil: introduce a flagprocessorsmixin class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42732
diff changeset
106
5bb68fb72df2 flagutil: introduce a flagprocessorsmixin class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42732
diff changeset
107 ``text`` - the revision data to process
5bb68fb72df2 flagutil: introduce a flagprocessorsmixin class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42732
diff changeset
108 ``flags`` - the revision flags
5bb68fb72df2 flagutil: introduce a flagprocessorsmixin class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42732
diff changeset
109 ``raw`` - an optional argument describing if the raw transform should be
5bb68fb72df2 flagutil: introduce a flagprocessorsmixin class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42732
diff changeset
110 applied.
5bb68fb72df2 flagutil: introduce a flagprocessorsmixin class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42732
diff changeset
111
5bb68fb72df2 flagutil: introduce a flagprocessorsmixin class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42732
diff changeset
112 This method processes the flags in the order (or reverse order if
5bb68fb72df2 flagutil: introduce a flagprocessorsmixin class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42732
diff changeset
113 ``operation`` is 'write') defined by REVIDX_FLAGS_ORDER, applying the
5bb68fb72df2 flagutil: introduce a flagprocessorsmixin class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42732
diff changeset
114 flag processors registered for present flags. The order of flags defined
5bb68fb72df2 flagutil: introduce a flagprocessorsmixin class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42732
diff changeset
115 in REVIDX_FLAGS_ORDER needs to be stable to allow non-commutativity.
5bb68fb72df2 flagutil: introduce a flagprocessorsmixin class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42732
diff changeset
116
5bb68fb72df2 flagutil: introduce a flagprocessorsmixin class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42732
diff changeset
117 Returns a 2-tuple of ``(text, validatehash)`` where ``text`` is the
5bb68fb72df2 flagutil: introduce a flagprocessorsmixin class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42732
diff changeset
118 processed text and ``validatehash`` is a bool indicating whether the
5bb68fb72df2 flagutil: introduce a flagprocessorsmixin class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42732
diff changeset
119 returned text should be checked for hash integrity.
42875
87a934684c3b flagprocessors: introduce specialized functions
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42873
diff changeset
120 """
42989
50d9de61ce02 flagprocessors: make `_processflagsfunc` a module level function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42988
diff changeset
121 return _processflagsfunc(self, text, flags, 'read')
42871
5bb68fb72df2 flagutil: introduce a flagprocessorsmixin class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42732
diff changeset
122
42875
87a934684c3b flagprocessors: introduce specialized functions
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42873
diff changeset
123 def _processflagsraw(self, text, flags):
87a934684c3b flagprocessors: introduce specialized functions
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42873
diff changeset
124 """Inspect revision data flags to check is the content hash should be
87a934684c3b flagprocessors: introduce specialized functions
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42873
diff changeset
125 validated.
87a934684c3b flagprocessors: introduce specialized functions
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42873
diff changeset
126
87a934684c3b flagprocessors: introduce specialized functions
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42873
diff changeset
127 ``text`` - the revision data to process
87a934684c3b flagprocessors: introduce specialized functions
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42873
diff changeset
128 ``flags`` - the revision flags
87a934684c3b flagprocessors: introduce specialized functions
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42873
diff changeset
129
87a934684c3b flagprocessors: introduce specialized functions
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42873
diff changeset
130 This method processes the flags in the order (or reverse order if
87a934684c3b flagprocessors: introduce specialized functions
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42873
diff changeset
131 ``operation`` is 'write') defined by REVIDX_FLAGS_ORDER, applying the
87a934684c3b flagprocessors: introduce specialized functions
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42873
diff changeset
132 flag processors registered for present flags. The order of flags defined
87a934684c3b flagprocessors: introduce specialized functions
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42873
diff changeset
133 in REVIDX_FLAGS_ORDER needs to be stable to allow non-commutativity.
87a934684c3b flagprocessors: introduce specialized functions
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42873
diff changeset
134
87a934684c3b flagprocessors: introduce specialized functions
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42873
diff changeset
135 Returns a 2-tuple of ``(text, validatehash)`` where ``text`` is the
87a934684c3b flagprocessors: introduce specialized functions
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42873
diff changeset
136 processed text and ``validatehash`` is a bool indicating whether the
87a934684c3b flagprocessors: introduce specialized functions
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42873
diff changeset
137 returned text should be checked for hash integrity.
87a934684c3b flagprocessors: introduce specialized functions
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42873
diff changeset
138 """
42989
50d9de61ce02 flagprocessors: make `_processflagsfunc` a module level function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42988
diff changeset
139 return _processflagsfunc(self, text, flags, 'raw')[1]
50d9de61ce02 flagprocessors: make `_processflagsfunc` a module level function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42988
diff changeset
140
42990
a04b2c010d03 flagprocessors: make `processflagswrite` a module level function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42989
diff changeset
141 def processflagswrite(revlog, text, flags, sidedata):
a04b2c010d03 flagprocessors: make `processflagswrite` a module level function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42989
diff changeset
142 """Inspect revision data flags and applies write transformations defined
a04b2c010d03 flagprocessors: make `processflagswrite` a module level function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42989
diff changeset
143 by registered flag processors.
a04b2c010d03 flagprocessors: make `processflagswrite` a module level function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42989
diff changeset
144
a04b2c010d03 flagprocessors: make `processflagswrite` a module level function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42989
diff changeset
145 ``text`` - the revision data to process
a04b2c010d03 flagprocessors: make `processflagswrite` a module level function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42989
diff changeset
146 ``flags`` - the revision flags
a04b2c010d03 flagprocessors: make `processflagswrite` a module level function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42989
diff changeset
147
a04b2c010d03 flagprocessors: make `processflagswrite` a module level function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42989
diff changeset
148 This method processes the flags in the order (or reverse order if
a04b2c010d03 flagprocessors: make `processflagswrite` a module level function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42989
diff changeset
149 ``operation`` is 'write') defined by REVIDX_FLAGS_ORDER, applying the
a04b2c010d03 flagprocessors: make `processflagswrite` a module level function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42989
diff changeset
150 flag processors registered for present flags. The order of flags defined
a04b2c010d03 flagprocessors: make `processflagswrite` a module level function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42989
diff changeset
151 in REVIDX_FLAGS_ORDER needs to be stable to allow non-commutativity.
a04b2c010d03 flagprocessors: make `processflagswrite` a module level function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42989
diff changeset
152
a04b2c010d03 flagprocessors: make `processflagswrite` a module level function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42989
diff changeset
153 Returns a 2-tuple of ``(text, validatehash)`` where ``text`` is the
a04b2c010d03 flagprocessors: make `processflagswrite` a module level function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42989
diff changeset
154 processed text and ``validatehash`` is a bool indicating whether the
a04b2c010d03 flagprocessors: make `processflagswrite` a module level function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42989
diff changeset
155 returned text should be checked for hash integrity.
a04b2c010d03 flagprocessors: make `processflagswrite` a module level function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42989
diff changeset
156 """
a04b2c010d03 flagprocessors: make `processflagswrite` a module level function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42989
diff changeset
157 return _processflagsfunc(revlog, text, flags, 'write',
a04b2c010d03 flagprocessors: make `processflagswrite` a module level function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42989
diff changeset
158 sidedata=sidedata)[:2]
a04b2c010d03 flagprocessors: make `processflagswrite` a module level function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42989
diff changeset
159
42989
50d9de61ce02 flagprocessors: make `_processflagsfunc` a module level function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42988
diff changeset
160 def _processflagsfunc(revlog, text, flags, operation, sidedata=None):
50d9de61ce02 flagprocessors: make `_processflagsfunc` a module level function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42988
diff changeset
161 """internal function to process flag on a revlog
42875
87a934684c3b flagprocessors: introduce specialized functions
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42873
diff changeset
162
42989
50d9de61ce02 flagprocessors: make `_processflagsfunc` a module level function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42988
diff changeset
163 This function is private to this module, code should never needs to call it
50d9de61ce02 flagprocessors: make `_processflagsfunc` a module level function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42988
diff changeset
164 directly."""
50d9de61ce02 flagprocessors: make `_processflagsfunc` a module level function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42988
diff changeset
165 # fast path: no flag processors will run
50d9de61ce02 flagprocessors: make `_processflagsfunc` a module level function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42988
diff changeset
166 if flags == 0:
50d9de61ce02 flagprocessors: make `_processflagsfunc` a module level function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42988
diff changeset
167 return text, True, {}
50d9de61ce02 flagprocessors: make `_processflagsfunc` a module level function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42988
diff changeset
168 if operation not in ('read', 'write', 'raw'):
50d9de61ce02 flagprocessors: make `_processflagsfunc` a module level function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42988
diff changeset
169 raise error.ProgrammingError(_("invalid '%s' operation") %
50d9de61ce02 flagprocessors: make `_processflagsfunc` a module level function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42988
diff changeset
170 operation)
50d9de61ce02 flagprocessors: make `_processflagsfunc` a module level function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42988
diff changeset
171 # Check all flags are known.
50d9de61ce02 flagprocessors: make `_processflagsfunc` a module level function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42988
diff changeset
172 if flags & ~REVIDX_KNOWN_FLAGS:
50d9de61ce02 flagprocessors: make `_processflagsfunc` a module level function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42988
diff changeset
173 raise revlog._flagserrorclass(_("incompatible revision flag '%#x'") %
50d9de61ce02 flagprocessors: make `_processflagsfunc` a module level function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42988
diff changeset
174 (flags & ~REVIDX_KNOWN_FLAGS))
50d9de61ce02 flagprocessors: make `_processflagsfunc` a module level function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42988
diff changeset
175 validatehash = True
50d9de61ce02 flagprocessors: make `_processflagsfunc` a module level function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42988
diff changeset
176 # Depending on the operation (read or write), the order might be
50d9de61ce02 flagprocessors: make `_processflagsfunc` a module level function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42988
diff changeset
177 # reversed due to non-commutative transforms.
50d9de61ce02 flagprocessors: make `_processflagsfunc` a module level function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42988
diff changeset
178 orderedflags = REVIDX_FLAGS_ORDER
50d9de61ce02 flagprocessors: make `_processflagsfunc` a module level function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42988
diff changeset
179 if operation == 'write':
50d9de61ce02 flagprocessors: make `_processflagsfunc` a module level function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42988
diff changeset
180 orderedflags = reversed(orderedflags)
42871
5bb68fb72df2 flagutil: introduce a flagprocessorsmixin class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42732
diff changeset
181
42989
50d9de61ce02 flagprocessors: make `_processflagsfunc` a module level function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42988
diff changeset
182 outsidedata = {}
50d9de61ce02 flagprocessors: make `_processflagsfunc` a module level function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42988
diff changeset
183 for flag in orderedflags:
50d9de61ce02 flagprocessors: make `_processflagsfunc` a module level function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42988
diff changeset
184 # If a flagprocessor has been registered for a known flag, apply the
50d9de61ce02 flagprocessors: make `_processflagsfunc` a module level function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42988
diff changeset
185 # related operation transform and update result tuple.
50d9de61ce02 flagprocessors: make `_processflagsfunc` a module level function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42988
diff changeset
186 if flag & flags:
50d9de61ce02 flagprocessors: make `_processflagsfunc` a module level function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42988
diff changeset
187 vhash = True
42871
5bb68fb72df2 flagutil: introduce a flagprocessorsmixin class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42732
diff changeset
188
42989
50d9de61ce02 flagprocessors: make `_processflagsfunc` a module level function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42988
diff changeset
189 if flag not in revlog._flagprocessors:
50d9de61ce02 flagprocessors: make `_processflagsfunc` a module level function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42988
diff changeset
190 message = _("missing processor for flag '%#x'") % (flag)
50d9de61ce02 flagprocessors: make `_processflagsfunc` a module level function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42988
diff changeset
191 raise revlog._flagserrorclass(message)
42871
5bb68fb72df2 flagutil: introduce a flagprocessorsmixin class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42732
diff changeset
192
42989
50d9de61ce02 flagprocessors: make `_processflagsfunc` a module level function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42988
diff changeset
193 processor = revlog._flagprocessors[flag]
50d9de61ce02 flagprocessors: make `_processflagsfunc` a module level function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42988
diff changeset
194 if processor is not None:
50d9de61ce02 flagprocessors: make `_processflagsfunc` a module level function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42988
diff changeset
195 readtransform, writetransform, rawtransform = processor
42871
5bb68fb72df2 flagutil: introduce a flagprocessorsmixin class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42732
diff changeset
196
42989
50d9de61ce02 flagprocessors: make `_processflagsfunc` a module level function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42988
diff changeset
197 if operation == 'raw':
50d9de61ce02 flagprocessors: make `_processflagsfunc` a module level function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42988
diff changeset
198 vhash = rawtransform(revlog, text)
50d9de61ce02 flagprocessors: make `_processflagsfunc` a module level function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42988
diff changeset
199 elif operation == 'read':
50d9de61ce02 flagprocessors: make `_processflagsfunc` a module level function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42988
diff changeset
200 text, vhash, s = readtransform(revlog, text)
50d9de61ce02 flagprocessors: make `_processflagsfunc` a module level function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42988
diff changeset
201 outsidedata.update(s)
50d9de61ce02 flagprocessors: make `_processflagsfunc` a module level function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42988
diff changeset
202 else: # write operation
50d9de61ce02 flagprocessors: make `_processflagsfunc` a module level function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42988
diff changeset
203 text, vhash = writetransform(revlog, text, sidedata)
50d9de61ce02 flagprocessors: make `_processflagsfunc` a module level function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42988
diff changeset
204 validatehash = validatehash and vhash
42871
5bb68fb72df2 flagutil: introduce a flagprocessorsmixin class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42732
diff changeset
205
42989
50d9de61ce02 flagprocessors: make `_processflagsfunc` a module level function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42988
diff changeset
206 return text, validatehash, outsidedata