hgext/evolve.py
changeset 137 bbc653876876
parent 133 aa182b912d62
child 139 9b9500175ae5
--- a/hgext/evolve.py	Fri Feb 17 17:55:12 2012 +0100
+++ b/hgext/evolve.py	Fri Feb 17 19:01:25 2012 +0100
@@ -156,20 +156,34 @@
 cmdtable = {}
 command = cmdutil.command(cmdtable)
 
-@command('^evolve',
+@command('^stabilize',
     [],
     '')
-def evolve(ui, repo):
+def stabilize(ui, repo):
     """suggest the next evolution step"""
     obsolete = extensions.find('obsolete')
-    next = min(obsolete.unstables(repo))
+    unstable = repo.revs('unstable()')
+    if not unstable:
+        ui.write_err(_('no unstable changeset\n'))
+        return 1
+    next = unstable[0]
     obs = repo[next].parents()[0]
     if not obs.obsolete():
         obs = next.parents()[1]
     assert obs.obsolete()
     newer = obsolete.newerversion(repo, obs.node())
-    target = newer[-1]
-    repo.ui.status('hg relocate --rev %s %s\n' % (repo[next], repo[target]))
+    if len(newer) > 1:
+        ui.write_err(_("conflict rewriting. can't choose destination\n"))
+        return 2
+    targets = newer[0]
+    if not targets:
+        ui.write_err(_("does not handle kill parent yet\n"))
+        return 2
+    if len(targets) > 1:
+        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]))
 
 shorttemplate = '[{rev}] {desc|firstline}\n'
 
@@ -355,15 +369,25 @@
         lock.release()
 
 def commitwrapper(orig, ui, repo, *arg, **kwargs):
-    obsoleted = kwargs.get('obsolete', [])
-    if obsoleted:
-        obsoleted = repo.set('%lr', obsoleted)
-    result = orig(ui, repo, *arg, **kwargs)
-    if not result: # commit successed
-        new = repo['-1']
-        for old in obsoleted:
-            repo.addobsolete(new.node(), old.node())
-    return result
+    lock = repo.lock()
+    try:
+        obsoleted = kwargs.get('obsolete', [])
+        if obsoleted:
+            obsoleted = repo.set('%lr', obsoleted)
+        result = orig(ui, repo, *arg, **kwargs)
+        if not result: # commit successed
+            new = repo['-1']
+            oldbookmarks = []
+            for old in obsoleted:
+                oldbookmarks.extend(repo.nodebookmarks(old.node()))
+                repo.addobsolete(new.node(), old.node())
+            for book in oldbookmarks:
+                repo._bookmarks[book] = new.node()
+            if oldbookmarks:
+                bookmarks.write(repo)
+        return result
+    finally:
+        lock.release()
 
 def graftwrapper(orig, ui, repo, *revs, **kwargs):
     lock = repo.lock()