[evolution] first workign draft of a relocate function
authorPierre-Yves David <pierre-yves.david@logilab.fr>
Mon, 19 Sep 2011 18:03:51 +0200
changeset 88 64fe5a4f877e
parent 87 246b8fefd0a5
child 89 757153438e58
[evolution] first workign draft of a relocate function The relocate function is a lighter rebase.
hgext/evolution.py
tests/test-evolution.t
--- 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()
 
 
 
--- a/tests/test-evolution.t	Mon Sep 19 03:18:08 2011 +0200
+++ b/tests/test-evolution.t	Mon Sep 19 18:03:51 2011 +0200
@@ -113,7 +113,7 @@
 To begin with, we just do the changes that will be the initial version of the changeset::
 
   $ echo One >file-from-A
-  $ sed -i '' -e s/One/Eins/ main-file-1 
+  $ sed -i'' -e s/One/Eins/ main-file-1
   $ hg add file-from-A
 
 So this is what we would like our changeset to be::
@@ -147,7 +147,7 @@
 Let's do this again for the second changeset::
 
   $ echo Two >file-from-B
-  $ sed -i '' -e s/Two/Zwie/ main-file-1
+  $ sed -i'' -e s/Two/Zwie/ main-file-1
   $ hg add file-from-B
 
 Before committing, however, we need to switch to a new bookmark for the second
@@ -174,7 +174,7 @@
 
 Fixing this is very easy. Just change::
 
-  $ sed -i '' -e s/Zwie/Zwei/ main-file-1
+  $ sed -i'' -e s/Zwie/Zwei/ main-file-1
 
 and **amend**::
 
@@ -193,7 +193,7 @@
   0	: base - test
 
   $ hg up feature-A -q
-  $ sed -i '' -e s/Eins/Un/ main-file-1
+  $ sed -i'' -e s/Eins/Un/ main-file-1
 
   $ hg amend --note 'french looks better'
   $ hg log
@@ -202,11 +202,10 @@
   1	: a nifty feature - test
   0	: base - test
   $ hg evolve
-  hg rebase --dest 6 --source 4 --detach
+  hg relocate --rev 4 6
   $ hg up feature-B -q #prevent feature-A bookmark to move grml
-  $ hg rebase --dest 6 --source 4 --detach
+  $ hg relocate -r 4 6 --traceback
   merging main-file-1
-  $ hg bookmark -fr 7 feature-B # XXX there is a bug out-there because we force --keep imp
   $ hg log
   7	feature-B: another feature - test
   6	feature-A: a nifty feature - test