hgext/evolve.py
changeset 139 9b9500175ae5
parent 137 bbc653876876
child 140 462d52ae7fb7
--- a/hgext/evolve.py	Fri Feb 17 19:08:36 2012 +0100
+++ b/hgext/evolve.py	Fri Feb 17 19:54:42 2012 +0100
@@ -120,29 +120,36 @@
         for u in updates:
             repo.addobsolete(u.node(), old.node())
             repo.addobsolete(new.node(), u.node())
+        oldbookmarks = repo.nodebookmarks(old.node())
+        for book in oldbookmarks:
+            repo._bookmarks[book] = new.node()
+        if oldbookmarks:
+            bookmarks.write(repo)
 
     finally:
         wlock.release()
 
     return newid
 
-def relocate(repo, rev, dest):
+def relocate(repo, orig, dest):
     """rewrite <rev> on dest"""
     try:
         rebase = extensions.find('rebase')
         # dummy state to trick rebase node
-        assert repo[rev].p2().rev() == node.nullrev, 'no support yet'
-        cmdutil.duplicatecopies(repo, rev, repo[dest].node(),
-                                         repo[rev].p2().node())
-        rebase.rebasenode(repo, rev, dest, {node.nullrev: node.nullrev})
-        nodenew = rebase.concludenode(repo, rev, dest, node.nullid)
-        nodesrc = repo.changelog.node(rev)
+        assert orig.p2().rev() == node.nullrev, 'no support yet'
+        destbookmarks = repo.nodebookmarks(dest.node())
+        cmdutil.duplicatecopies(repo, orig.node(), dest.node())
+        rebase.rebasenode(repo, orig.node(), dest.node(), {node.nullrev: node.nullrev})
+        nodenew = rebase.concludenode(repo, orig.node(), dest.node(), node.nullid)
+        nodesrc = orig.node()
         repo.addobsolete(nodenew, nodesrc)
         phases.retractboundary(repo, repo[nodesrc].phase(), [nodenew])
         oldbookmarks = repo.nodebookmarks(nodesrc)
         for book in oldbookmarks:
             repo._bookmarks[book] = nodenew
-        if oldbookmarks:
+        for book in destbookmarks: # restore bookmark that rebase move
+            repo._bookmarks[book] = dest.node()
+        if oldbookmarks or destbookmarks:
             bookmarks.write(repo)
     except util.Abort:
         # Invalidate the previous setparents
@@ -157,19 +164,21 @@
 command = cmdutil.command(cmdtable)
 
 @command('^stabilize',
-    [],
+    [
+     ('n', 'dry-run', False, 'Do nothing but printing what should be done')
+    ],
     '')
-def stabilize(ui, repo):
-    """suggest the next evolution step"""
+def stabilize(ui, repo, **opts):
+    """move changeset out of they unstable state"""
     obsolete = extensions.find('obsolete')
-    unstable = repo.revs('unstable()')
+    unstable = list(repo.set('unstable()'))
     if not unstable:
         ui.write_err(_('no unstable changeset\n'))
         return 1
-    next = unstable[0]
-    obs = repo[next].parents()[0]
+    node = unstable[0]
+    obs = node.parents()[0]
     if not obs.obsolete():
-        obs = next.parents()[1]
+        obs = node.parents()[1]
     assert obs.obsolete()
     newer = obsolete.newerversion(repo, obs.node())
     if len(newer) > 1:
@@ -183,7 +192,22 @@
         ui.write_err(_("does not handle splitted parent yet\n"))
         return 2
     target = targets[0]
-    repo.ui.status('hg rebase -Dr %s -d %s\n' % (repo[next], repo[target]))
+    displayer = cmdutil.show_changeset(ui, repo, {'template': shorttemplate})
+    target = repo[target]
+    repo.ui.status(_('move:'))
+    displayer.show(node)
+    repo.ui.status(_('atop:'))
+    displayer.show(target)
+    todo= 'hg rebase -Dr %s -d %s\n' % (node, target)
+    if opts['dry_run']:
+        repo.ui.status(todo)
+    else:
+        repo.ui.note(todo)
+        lock = repo.lock()
+        try:
+            relocate(repo, node, target)
+        finally:
+            lock.release()
 
 shorttemplate = '[{rev}] {desc|firstline}\n'