# HG changeset patch # User Pierre-Yves David # Date 1684966985 -7200 # Node ID cbcbf63b6dbf804603e0a3d008a9bda449bfb346 # Parent 5460424092e2436c25b733def777404bdc3d2b25 rewrite: simplify the `retained_extras` extra logic First, we move the definition of value outside of the rebase extensions, as this apply to all rebase-like operation and some live in other place (like evolve). Second we make it a simple set, so that it is easy for an extension to add a new value in it. Third, we move the associated logic in core too. That make it easily available to other extensions. Fourth we simplify it usage, as the verbose version of the filtering is just a handful on line long, we are just going to test all the value for updates, so the Projection overlay is not bringing much here. Note that, we make it a module level set, is a key is worth preserving it is probably worth preserving in all cases. This was already the behavior prior to this change. diff -r 5460424092e2 -r cbcbf63b6dbf hgext/rebase.py --- a/hgext/rebase.py Mon May 29 18:41:58 2023 +0200 +++ b/hgext/rebase.py Thu May 25 00:23:05 2023 +0200 @@ -24,7 +24,6 @@ wdirrev, ) from mercurial.pycompat import open -from mercurial.thirdparty.jaraco.collections import Projection from mercurial import ( bookmarks, cmdutil, @@ -86,19 +85,6 @@ return 1 -def retained_extras(): - """ - Yield the names of the extras to be retained. - """ - # graft - yield b'source' - yield b'intermediate-source' - - -def _save_extras(ctx, extra): - extra.update(Projection(retained_extras(), ctx.extra())) - - def _savebranch(ctx, extra): extra[b'branch'] = ctx.branch() @@ -199,7 +185,7 @@ self.date = opts.get('date', None) e = opts.get('extrafn') # internal, used by e.g. hgsubversion - self.extrafns = [_save_extras] + self.extrafns = [rewriteutil.preserve_extras_on_rebase] if e: self.extrafns = [e] diff -r 5460424092e2 -r cbcbf63b6dbf mercurial/rewriteutil.py --- a/mercurial/rewriteutil.py Mon May 29 18:41:58 2023 +0200 +++ b/mercurial/rewriteutil.py Thu May 25 00:23:05 2023 +0200 @@ -27,6 +27,21 @@ NODE_RE = re.compile(br'\b[0-9a-f]{6,64}\b') +# set of extra entry that should survive a rebase-like operation, extensible by extensions +retained_extras_on_rebase = { + b'source', + b'intermediate-source', +} + + +def preserve_extras_on_rebase(old_ctx, new_extra): + """preserve the relevant `extra` entry from old_ctx on rebase-like operation""" + new_extra.update( + (key, value) + for key, value in old_ctx.extra().items() + if key in retained_extras_on_rebase + ) + def _formatrevs(repo, revs, maxrevs=4): """returns a string summarizing revisions in a decent size diff -r 5460424092e2 -r cbcbf63b6dbf mercurial/thirdparty/jaraco/__init__.py diff -r 5460424092e2 -r cbcbf63b6dbf mercurial/thirdparty/jaraco/collections.py --- a/mercurial/thirdparty/jaraco/collections.py Mon May 29 18:41:58 2023 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,56 +0,0 @@ -# adapted from jaraco.collections 3.9 - -import collections - - -class Projection(collections.abc.Mapping): - """ - Project a set of keys over a mapping - - >>> sample = {'a': 1, 'b': 2, 'c': 3} - >>> prj = Projection(['a', 'c', 'd'], sample) - >>> prj == {'a': 1, 'c': 3} - True - - Keys should only appear if they were specified and exist in the space. - - >>> sorted(list(prj.keys())) - ['a', 'c'] - - Attempting to access a key not in the projection - results in a KeyError. - - >>> prj['b'] - Traceback (most recent call last): - ... - KeyError: 'b' - - Use the projection to update another dict. - - >>> target = {'a': 2, 'b': 2} - >>> target.update(prj) - >>> target == {'a': 1, 'b': 2, 'c': 3} - True - - Also note that Projection keeps a reference to the original dict, so - if you modify the original dict, that could modify the Projection. - - >>> del sample['a'] - >>> dict(prj) - {'c': 3} - """ - - def __init__(self, keys, space): - self._keys = tuple(keys) - self._space = space - - def __getitem__(self, key): - if key not in self._keys: - raise KeyError(key) - return self._space[key] - - def __iter__(self): - return iter(set(self._keys).intersection(self._space)) - - def __len__(self): - return len(tuple(iter(self))) diff -r 5460424092e2 -r cbcbf63b6dbf setup.py --- a/setup.py Mon May 29 18:41:58 2023 +0200 +++ b/setup.py Thu May 25 00:23:05 2023 +0200 @@ -1303,7 +1303,6 @@ 'mercurial.templates', 'mercurial.thirdparty', 'mercurial.thirdparty.attr', - 'mercurial.thirdparty.jaraco', 'mercurial.thirdparty.zope', 'mercurial.thirdparty.zope.interface', 'mercurial.upgrade_utils',