Mercurial > public > mercurial-scm > hg
comparison mercurial/revlog.py @ 42871: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 | f75f47b3ea41 |
children | db4af1cb128a |
comparison
equal
deleted
inserted
replaced
42870:4257c33e24b7 | 42871:5bb68fb72df2 |
---|---|
259 p = indexformatng_pack(*entry) | 259 p = indexformatng_pack(*entry) |
260 if rev == 0: | 260 if rev == 0: |
261 p = versionformat_pack(version) + p[4:] | 261 p = versionformat_pack(version) + p[4:] |
262 return p | 262 return p |
263 | 263 |
264 class revlog(object): | 264 class revlog(flagutil.flagprocessorsmixin): |
265 """ | 265 """ |
266 the underlying revision storage object | 266 the underlying revision storage object |
267 | 267 |
268 A revlog consists of two parts, an index and the revision data. | 268 A revlog consists of two parts, an index and the revision data. |
269 | 269 |
1713 Available as a function so that subclasses can replace the hash | 1713 Available as a function so that subclasses can replace the hash |
1714 as needed. | 1714 as needed. |
1715 """ | 1715 """ |
1716 return storageutil.hashrevisionsha1(text, p1, p2) | 1716 return storageutil.hashrevisionsha1(text, p1, p2) |
1717 | 1717 |
1718 def _processflags(self, text, flags, operation, raw=False): | |
1719 """Inspect revision data flags and applies transforms defined by | |
1720 registered flag processors. | |
1721 | |
1722 ``text`` - the revision data to process | |
1723 ``flags`` - the revision flags | |
1724 ``operation`` - the operation being performed (read or write) | |
1725 ``raw`` - an optional argument describing if the raw transform should be | |
1726 applied. | |
1727 | |
1728 This method processes the flags in the order (or reverse order if | |
1729 ``operation`` is 'write') defined by REVIDX_FLAGS_ORDER, applying the | |
1730 flag processors registered for present flags. The order of flags defined | |
1731 in REVIDX_FLAGS_ORDER needs to be stable to allow non-commutativity. | |
1732 | |
1733 Returns a 2-tuple of ``(text, validatehash)`` where ``text`` is the | |
1734 processed text and ``validatehash`` is a bool indicating whether the | |
1735 returned text should be checked for hash integrity. | |
1736 | |
1737 Note: If the ``raw`` argument is set, it has precedence over the | |
1738 operation and will only update the value of ``validatehash``. | |
1739 """ | |
1740 # fast path: no flag processors will run | |
1741 if flags == 0: | |
1742 return text, True | |
1743 if not operation in ('read', 'write'): | |
1744 raise error.ProgrammingError(_("invalid '%s' operation") % | |
1745 operation) | |
1746 # Check all flags are known. | |
1747 if flags & ~flagutil.REVIDX_KNOWN_FLAGS: | |
1748 raise error.RevlogError(_("incompatible revision flag '%#x'") % | |
1749 (flags & ~flagutil.REVIDX_KNOWN_FLAGS)) | |
1750 validatehash = True | |
1751 # Depending on the operation (read or write), the order might be | |
1752 # reversed due to non-commutative transforms. | |
1753 orderedflags = REVIDX_FLAGS_ORDER | |
1754 if operation == 'write': | |
1755 orderedflags = reversed(orderedflags) | |
1756 | |
1757 for flag in orderedflags: | |
1758 # If a flagprocessor has been registered for a known flag, apply the | |
1759 # related operation transform and update result tuple. | |
1760 if flag & flags: | |
1761 vhash = True | |
1762 | |
1763 if flag not in self._flagprocessors: | |
1764 message = _("missing processor for flag '%#x'") % (flag) | |
1765 raise error.RevlogError(message) | |
1766 | |
1767 processor = self._flagprocessors[flag] | |
1768 if processor is not None: | |
1769 readtransform, writetransform, rawtransform = processor | |
1770 | |
1771 if raw: | |
1772 vhash = rawtransform(self, text) | |
1773 elif operation == 'read': | |
1774 text, vhash = readtransform(self, text) | |
1775 else: # write operation | |
1776 text, vhash = writetransform(self, text) | |
1777 validatehash = validatehash and vhash | |
1778 | |
1779 return text, validatehash | |
1780 | |
1781 def checkhash(self, text, node, p1=None, p2=None, rev=None): | 1718 def checkhash(self, text, node, p1=None, p2=None, rev=None): |
1782 """Check node hash integrity. | 1719 """Check node hash integrity. |
1783 | 1720 |
1784 Available as a function so that subclasses can extend hash mismatch | 1721 Available as a function so that subclasses can extend hash mismatch |
1785 behaviors as needed. | 1722 behaviors as needed. |