D3818: scmutil: make cleanupnodes optionally also fix the phase
yuja (Yuya Nishihara)
phabricator at mercurial-scm.org
Wed Jun 20 09:44:19 EDT 2018
yuja added a comment.
> +def cleanupnodes(repo, replacements, operation, moves=None, metadata=None,
> + fixphase=False):
>
> """do common cleanups when old nodes are replaced by new nodes
>
> That includes writing obsmarkers or stripping nodes, and moving bookmarks.
>
> @@ -825,11 +826,34 @@
>
> newnode = newnodes[0]
> moves[oldnode] = newnode
>
>
> + allnewnodes = [n for ns in replacements.values() for n in ns]
> + toretract = {}
> + toadvance = {}
> + if fixphase:
> + precursors = {}
> + for oldnode, newnodes in replacements.items():
> + for newnode in newnodes:
> + precursors.setdefault(newnode, []).append(oldnode)
> +
> + allnewnodes.sort(key=lambda n: repo[n].rev())
> + newphase = {}
> + def phase(ctx):
> + return newphase.get(ctx.node(), ctx.phase())
> + for newnode in allnewnodes:
> + ctx = repo[newnode]
> + oldphase = max(repo[oldnode].phase()
> + for oldnode in precursors[newnode])
> + parentphase = max(phase(p) for p in ctx.parents())
> + newphase[newnode] = max(oldphase, parentphase)
> + if newphase[newnode] > ctx.phase():
> + toretract.setdefault(newphase[newnode], []).append(newnode)
> + elif newphase[newnode] < ctx.phase():
> + toadvance.setdefault(newphase[newnode], []).append(newnode)
> +
>
> with repo.transaction('cleanup') as tr:
> # Move bookmarks
> bmarks = repo._bookmarks
> bmarkchanges = []
>
> - allnewnodes = [n for ns in replacements.values() for n in ns] for oldnode, newnode in moves.items(): oldbmarks = repo.nodebookmarks(oldnode) if not oldbmarks: @@ -850,6 +874,11 @@ if bmarkchanges: bmarks.applychanges(repo, tr, bmarkchanges)
>
> + for phase, nodes in toretract.items(): + phases.retractboundary(repo, tr, phase, nodes) + for phase, nodes in toadvance.items(): + phases.advanceboundary(repo, tr, phase, nodes)
The logic looks good to me, but I'm not sure if recomputing a proper phase
move here is better than the original config override.
> - a/hgext/fix.py +++ b/hgext/fix.py @@ -158,7 +158,7 @@ del filedata[rev]
>
> replacements = {prec: [succ] for prec, succ in replacements.iteritems()}
> - scmutil.cleanupnodes(repo, replacements, 'fix') + scmutil.cleanupnodes(repo, replacements, 'fix', fixphase=True)
Perhaps this has to be wrapped by a transaction. Otherwise, I think a secret
changeset could be temporarily exposed until cleanupnodes().
REPOSITORY
rHG Mercurial
REVISION DETAIL
https://phab.mercurial-scm.org/D3818
To: martinvonz, #hg-reviewers
Cc: yuja, mercurial-devel
More information about the Mercurial-devel
mailing list