changeset 17664:4eb13b619785

histedit: factorise node stripping logic Create a function dedicated to stripping a group of node. All existing duplicated code is replaced by call to this function. This new function take care of stripping known and relevant node only.
author Pierre-Yves David <pierre-yves.david@logilab.fr>
date Wed, 26 Sep 2012 14:46:08 +0200
parents c6de8c696644
children b65533958b85
files hgext/histedit.py
diffstat 1 files changed, 27 insertions(+), 40 deletions(-) [+]
line wrap: on
line diff
--- a/hgext/histedit.py	Wed Sep 26 14:19:19 2012 +0200
+++ b/hgext/histedit.py	Wed Sep 26 14:46:08 2012 +0200
@@ -482,21 +482,8 @@
          existing, rules, keep, tip, replacemap) = readstate(repo)
         ui.debug('restore wc to old tip %s\n' % node.hex(tip))
         hg.clean(repo, tip)
-        ui.debug('should strip created nodes %s\n' %
-                 ', '.join([node.short(n) for n in created]))
-        ui.debug('should strip temp nodes %s\n' %
-                 ', '.join([node.short(n) for n in tmpnodes]))
-        for nodes in (created, tmpnodes):
-            lock = None
-            try:
-                lock = repo.lock()
-                for n in reversed(nodes):
-                    try:
-                        repair.strip(ui, repo, n)
-                    except error.LookupError:
-                        pass
-            finally:
-                lockmod.release(lock)
+        cleanupnode(ui, repo, 'created', created)
+        cleanupnode(ui, repo, 'temp', tmpnodes)
         os.unlink(os.path.join(repo.path, 'histedit-state'))
         return
     else:
@@ -604,32 +591,9 @@
         if replacemap:
             movebookmarks(ui, repo, replacemap, tmpnodes, created)
             # TODO update mq state
+        cleanupnode(ui, repo, 'replaced', replaced)
 
-        ui.debug('should strip replaced nodes %s\n' %
-                 ', '.join([node.short(n) for n in replaced]))
-        lock = None
-        try:
-            lock = repo.lock()
-            for n in sorted(replaced, key=lambda x: repo[x].rev()):
-                try:
-                    repair.strip(ui, repo, n)
-                except error.LookupError:
-                    pass
-        finally:
-            lockmod.release(lock)
-
-    ui.debug('should strip temp nodes %s\n' %
-             ', '.join([node.short(n) for n in tmpnodes]))
-    lock = None
-    try:
-        lock = repo.lock()
-        for n in reversed(tmpnodes):
-            try:
-                repair.strip(ui, repo, n)
-            except error.LookupError:
-                pass
-    finally:
-        lockmod.release(lock)
+    cleanupnode(ui, repo, 'temp', tmpnodes)
     os.unlink(os.path.join(repo.path, 'histedit-state'))
     if os.path.exists(repo.sjoin('undo')):
         os.unlink(repo.sjoin('undo'))
@@ -747,3 +711,26 @@
 
     for old, new in sorted(replacemap.iteritems()):
         copybms(old, new)
+
+def cleanupnode(ui, repo, name, nodes):
+    """strip a group of nodes from the repository
+
+    The set of node to strip may contains unknown nodes."""
+    ui.debug('should strip %s nodes %s\n' %
+             (name, ', '.join([node.short(n) for n in nodes])))
+    lock = None
+    try:
+        lock = repo.lock()
+        # Find all node that need to be stripped
+        # (we hg %lr instead of %ln to silently ignore unknown item
+        nm = repo.changelog.nodemap
+        nodes = [n for n in nodes if n in nm]
+        roots = [c.node() for c in repo.set("roots(%ln)", nodes)]
+        for c in roots:
+            # We should process node in reverse order to strip tip most first.
+            # but this trigger a bug in changegroup hook.
+            # This would reduce bundle overhead
+            repair.strip(ui, repo, c)
+    finally:
+        lockmod.release(lock)
+