hgext/evolution.py
changeset 88 64fe5a4f877e
parent 87 246b8fefd0a5
child 91 5b8d08c78854
--- a/hgext/evolution.py	Mon Sep 19 03:18:08 2011 +0200
+++ b/hgext/evolution.py	Mon Sep 19 18:03:51 2011 +0200
@@ -17,6 +17,7 @@
 from mercurial import commands
 from mercurial import bookmarks
 from mercurial import context
+from mercurial import util
 from mercurial.i18n import _
 from mercurial.commands import walkopts, commitopts, commitopts2, logopts
 
@@ -107,6 +108,29 @@
 
     return newid
 
+def relocate(repo, rev, 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'
+        rebase.updatedirstate(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)
+        repo.addobsolete(nodenew, nodesrc)
+        oldbookmarks = repo.nodebookmarks(nodesrc)
+        for book in oldbookmarks:
+            repo._bookmarks[book] = nodenew
+        if oldbookmarks:
+            bookmarks.write(repo)
+    except util.Abort:
+        # Invalidate the previous setparents
+        repo.dirstate.invalidate()
+        raise
+
+
 
 ### new command
 #############################
@@ -126,7 +150,26 @@
     assert obs.obsolete()
     newer = obsolete.newerversion(repo, obs.node())
     target = newer[-1]
-    repo.ui.status('hg rebase --dest %s --source %s --detach \n' % (repo[target].rev(), next))
+    repo.ui.status('hg relocate --rev %s %s\n' % (next, repo[target].rev()))
+
+@command('^relocate',
+    [
+    ('r', 'rev', '.',
+     _('revision to relocate')),
+    ],
+    '')
+def cmdrelocate(ui, repo, dest, rev='.'):
+    """relocate a changeset"""
+    wlock = repo.wlock()
+    try:
+        src = repo[rev]
+        dest = repo[dest]
+        if src == src.ancestor(dest):
+            raise util.Abort(_('source is ancestor of destination'))
+        relocate(repo, src.rev(), dest.rev())
+        return 0
+    finally:
+        wlock.release()