[PATCH 1 of 4] histedit: add a method to cleanup nodes safely
Jun Wu
quark at fb.com
Tue Mar 14 05:36:16 UTC 2017
# HG changeset patch
# User Jun Wu <quark at fb.com>
# Date 1489464645 25200
# Mon Mar 13 21:10:45 2017 -0700
# Node ID b4cf155f7a41ebf314407000f6948716ae0a64e2
# Parent 3d3109339b57341b333c1112beb41dd281fa944a
# Available At https://bitbucket.org/quark-zju/hg-draft
# hg pull https://bitbucket.org/quark-zju/hg-draft -r b4cf155f7a41
histedit: add a method to cleanup nodes safely
The new method will decide between:
- cleanupnode, which calls the unsafe repair.strip
- create obsmarkers
Ideally, nobody calls "cleanupnode" directly except for "safecleanupnode".
diff --git a/hgext/histedit.py b/hgext/histedit.py
--- a/hgext/histedit.py
+++ b/hgext/histedit.py
@@ -1582,4 +1582,29 @@ def cleanupnode(ui, repo, name, nodes):
repair.strip(ui, repo, c)
+def safecleanupnode(ui, repo, name, nodes):
+ """strip or obsolete nodes
+
+ nodes could be either a set or dict which maps to replacements.
+ nodes could be unknown (outside the repo).
+ """
+ supportsmarkers = obsolete.isenabled(repo, obsolete.createmarkersopt)
+ if supportsmarkers:
+ if util.safehasattr(nodes, 'get'):
+ # nodes is a dict-like mapping
+ # use unfiltered repo for successors in case they are hidden
+ urepo = repo.unfiltered()
+ marker = lambda x: (repo[x], (urepo[n] for n in nodes.get(x, ())))
+ else:
+ # nodes is a set-like
+ marker = lambda x: (repo[x], ())
+ # sort by revision number because it sound "right"
+ sortednodes = sorted([n for n in nodes if n in repo],
+ key=repo.changelog.rev)
+ markers = [marker(t) for t in sortednodes]
+ if markers:
+ obsolete.createmarkers(repo, markers)
+ else:
+ return cleanupnode(ui, repo, name, nodes)
+
def stripwrapper(orig, ui, repo, nodelist, *args, **kwargs):
if isinstance(nodelist, str):
More information about the Mercurial-devel
mailing list