# HG changeset patch # User Jason R. Coombs # Date 1686236854 14400 # Node ID e44d343b9ed23080ede3f1888f41fb09345398f9 # Parent 173293415d1fcbb81f279c7c9d83bbd4adc545d5 evolve: retain extras when relocating a commit Building on 2cd959fe631a::82e5a9b1ef1e (submitted as https://foss.heptapod.net/mercurial/mercurial-devel/-/merge_requests/511) and cbcbf63b6dbf, this change addresses the regression introduced in b1d1f4ade142::53d63b608230 (from !458) when evolve stopped including extras added by downstream plugins when relocating commits for evolve. Mercurial now provides an extension point at mercurial.rewriteutil.preserve_extras_on_rebase; it's a list of extras to be retained, that Evolve uses, and that downstream users might extend. diff -r 173293415d1f -r e44d343b9ed2 hgext3rd/evolve/compat.py --- a/hgext3rd/evolve/compat.py Thu May 25 11:08:09 2023 -0300 +++ b/hgext3rd/evolve/compat.py Thu Jun 08 11:07:34 2023 -0400 @@ -21,6 +21,7 @@ node, obsolete, pycompat, + rewriteutil, scmutil, util, ) @@ -559,3 +560,26 @@ else: # hg <= 5.6 (527ce85c2e60) StateError = error.Abort + +try: + retained_extras_on_rebase = rewriteutil.retained_extras_on_rebase + preserve_extras_on_rebase = rewriteutil.preserve_extras_on_rebase +except AttributeError: + # hg <= 6.4 (cbcbf63b6dbf) + retained_extras_on_rebase = { + b'source', + b'intermediate-source', + } + + def preserve_extras_on_rebase(old_ctx, new_extra): + """preserve the relevant `extra` entries from old_ctx on rebase-like operations + """ + old_extra = old_ctx.extra() + for key in retained_extras_on_rebase: + value = old_extra.get(key) + if value is not None: + new_extra[key] = value + + # give other extensions an opportunity to collaborate + rewriteutil.retained_extras_on_rebase = retained_extras_on_rebase + rewriteutil.preserve_extras_on_rebase = preserve_extras_on_rebase diff -r 173293415d1f -r e44d343b9ed2 hgext3rd/evolve/evolvecmd.py --- a/hgext3rd/evolve/evolvecmd.py Thu May 25 11:08:09 2023 -0300 +++ b/hgext3rd/evolve/evolvecmd.py Thu Jun 08 11:07:34 2023 -0400 @@ -959,18 +959,9 @@ _finalizerelocate(repo, orig, dest, nodenew, tr, category, evolvestate) return nodenew -# This is copied from hgext.rebase._savegraft() -def _savegraft(ctx, extra): - s = ctx.extra().get(b'source', None) - if s is not None: - extra[b'source'] = s - s = ctx.extra().get(b'intermediate-source', None) - if s is not None: - extra[b'intermediate-source'] = s - def _relocatecommit(repo, orig, dest, pctx, keepbranch, commitmsg, update): extra = {} - _savegraft(orig, extra) + compat.preserve_extras_on_rebase(orig, extra) extra[b'rebase_source'] = orig.hex() targetphase = max(orig.phase(), phases.draft) configoverrides = { @@ -2201,7 +2192,7 @@ ctx = orig extra = {} - _savegraft(ctx, extra) + compat.preserve_extras_on_rebase(orig, extra) extra[b'rebase_source'] = orig.hex() user = ctx.user()