--- 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()