hgext/evolve.py
changeset 313 47d10459fa24
parent 312 a7b5989d1d92
child 314 ebd286f06879
--- a/hgext/evolve.py	Tue Jun 26 18:12:31 2012 +0200
+++ b/hgext/evolve.py	Tue Jun 26 16:12:52 2012 +0200
@@ -63,7 +63,7 @@
     if len(old.parents()) > 1: #XXX remove this unecessary limitation.
         raise error.Abort(_('cannot amend merge changesets'))
     base = old.p1()
-    bm = bookmarks.readcurrent(repo)
+    updatebookmarks = _bookmarksupdater(repo, old.node())
 
     wlock = repo.wlock()
     try:
@@ -134,19 +134,10 @@
         new = repo[newid]
         created = len(repo) != revcount
         if created:
-            # update the bookmark
-            if bm:
-                repo._bookmarks[bm] = newid
-                bookmarks.write(repo)
-
+            updatebookmarks(newid)
             # add evolution metadata
             collapsed = set([u.node() for u in updates] + [old.node()])
             repo.addcollapsedobsolete(collapsed, new.node())
-            oldbookmarks = repo.nodebookmarks(old.node())
-            for book in oldbookmarks:
-                repo._bookmarks[book] = new.node()
-            if oldbookmarks:
-                bookmarks.write(repo)
         else:
             # newid is an existing revision. It could make sense to
             # replace revisions with existing ones but probably not by
@@ -216,6 +207,25 @@
             return unstables[0]
     return None
 
+def _bookmarksupdater(repo, oldid):
+    """Return a callable update(newid) updating the current bookmark
+    and bookmarks bound to oldid to newid.
+    """
+    bm = bookmarks.readcurrent(repo)
+    def updatebookmarks(newid):
+        dirty = False
+        if bm:
+            repo._bookmarks[bm] = newid
+            dirty = True
+        oldbookmarks = repo.nodebookmarks(oldid)
+        if oldbookmarks:
+            for b in oldbookmarks:
+                repo._bookmarks[b] = newid
+            dirty = True
+        if dirty:
+            bookmarks.write(repo)
+    return updatebookmarks
+
 ### new command
 #############################
 cmdtable = {}
@@ -584,6 +594,7 @@
             if len(old.parents()) > 1:
                 raise util.Abort(_("cannot uncommit merge changeset"))
             oldphase = old.phase()
+            updatebookmarks = _bookmarksupdater(repo, old.node())
             # Recommit the filtered changeset
             newid = None
             if pats or opts.get('include') or opts.get('exclude'):
@@ -596,6 +607,7 @@
             phases.retractboundary(repo, oldphase, [newid])
             repo.dirstate.setparents(newid, node.nullid)
             _uncommitdirstate(repo, old, match)
+            updatebookmarks(newid)
         finally:
             wlock.release()
     finally: