--- a/hgext/evolve.py Tue Jun 26 18:12:31 2012 +0200
+++ b/hgext/evolve.py Tue Jun 26 16:12:52 2012 +0200
@@ -63,7 +63,7 @@
if len(old.parents()) > 1: #XXX remove this unecessary limitation.
raise error.Abort(_('cannot amend merge changesets'))
base = old.p1()
- bm = bookmarks.readcurrent(repo)
+ updatebookmarks = _bookmarksupdater(repo, old.node())
wlock = repo.wlock()
try:
@@ -134,19 +134,10 @@
new = repo[newid]
created = len(repo) != revcount
if created:
- # update the bookmark
- if bm:
- repo._bookmarks[bm] = newid
- bookmarks.write(repo)
-
+ updatebookmarks(newid)
# add evolution metadata
collapsed = set([u.node() for u in updates] + [old.node()])
repo.addcollapsedobsolete(collapsed, new.node())
- oldbookmarks = repo.nodebookmarks(old.node())
- for book in oldbookmarks:
- repo._bookmarks[book] = new.node()
- if oldbookmarks:
- bookmarks.write(repo)
else:
# newid is an existing revision. It could make sense to
# replace revisions with existing ones but probably not by
@@ -216,6 +207,25 @@
return unstables[0]
return None
+def _bookmarksupdater(repo, oldid):
+ """Return a callable update(newid) updating the current bookmark
+ and bookmarks bound to oldid to newid.
+ """
+ bm = bookmarks.readcurrent(repo)
+ def updatebookmarks(newid):
+ dirty = False
+ if bm:
+ repo._bookmarks[bm] = newid
+ dirty = True
+ oldbookmarks = repo.nodebookmarks(oldid)
+ if oldbookmarks:
+ for b in oldbookmarks:
+ repo._bookmarks[b] = newid
+ dirty = True
+ if dirty:
+ bookmarks.write(repo)
+ return updatebookmarks
+
### new command
#############################
cmdtable = {}
@@ -584,6 +594,7 @@
if len(old.parents()) > 1:
raise util.Abort(_("cannot uncommit merge changeset"))
oldphase = old.phase()
+ updatebookmarks = _bookmarksupdater(repo, old.node())
# Recommit the filtered changeset
newid = None
if pats or opts.get('include') or opts.get('exclude'):
@@ -596,6 +607,7 @@
phases.retractboundary(repo, oldphase, [newid])
repo.dirstate.setparents(newid, node.nullid)
_uncommitdirstate(repo, old, match)
+ updatebookmarks(newid)
finally:
wlock.release()
finally: