# HG changeset patch # User Gregory Szorc # Date 1536878933 25200 # Node ID 7b2b42fc377a09b69edfa972c38e0d1e155ab9be # Parent db088e133e91a93753ae58830e698b0ac10f2ece revlog: store flag processors per revlog Previously, revlog flag processing would consult a global dict when processing flags. This was simple. But it had the undesired side-effect that any extension could load flag processors once and those flag processors would be available to any revlog that was subsequent loaded in the process. e.g. in hgweb, if the narrow extension were loaded for repo A but not repo B, repo B would be able to decode ellipsis flags even though it shouldn't be able to. Making the flag processors dict per-revlog allows us to have per-revlog controls over what flag processors are available, thus preserving desired granular access to flag processors depending on the revlog's needs. If a flag processor is globally registered, it is still globally available. So this commit should not meaningfully change behavior. Differential Revision: https://phab.mercurial-scm.org/D4646 diff -r db088e133e91 -r 7b2b42fc377a mercurial/revlog.py --- a/mercurial/revlog.py Wed Sep 05 13:29:22 2018 -0700 +++ b/mercurial/revlog.py Thu Sep 13 15:48:53 2018 -0700 @@ -415,6 +415,10 @@ self._srdensitythreshold = 0.50 self._srmingapsize = 262144 + # Make copy of flag processors so each revlog instance can support + # custom flags. + self._flagprocessors = dict(_flagprocessors) + mmapindexthreshold = None v = REVLOG_DEFAULT_VERSION opts = getattr(opener, 'options', None) @@ -1707,11 +1711,11 @@ if flag & flags: vhash = True - if flag not in _flagprocessors: + if flag not in self._flagprocessors: message = _("missing processor for flag '%#x'") % (flag) raise RevlogError(message) - processor = _flagprocessors[flag] + processor = self._flagprocessors[flag] if processor is not None: readtransform, writetransform, rawtransform = processor