# HG changeset patch # User Patrick Mezard # Date 1340719972 -7200 # Node ID 47d10459fa24a9e654a077378d8e368897facacd # Parent a7b5989d1d92e3f7bf483f48f21554ef99de8830 uncommit: handle bookmarks Extract the bookmarks handling code from amend and share it with uncommit. diff -r a7b5989d1d92 -r 47d10459fa24 hgext/evolve.py --- 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: diff -r a7b5989d1d92 -r 47d10459fa24 tests/test-uncommit.t --- a/tests/test-uncommit.t Tue Jun 26 18:12:31 2012 +0200 +++ b/tests/test-uncommit.t Tue Jun 26 16:12:52 2012 +0200 @@ -117,6 +117,25 @@ l o +Add a couple of bookmarks + + $ glog --hidden + @ 3:5eb72dbe0cb4@bar(stable/draft) touncommit + | + o 2:f63b90038565@default(stable/draft) merge + |\ + | o 1:f15c744d48e8@default(stable/draft) addmore + | + o 0:07f494440405@default(stable/draft) adda + + $ hg bookmark -r 2 unrelated + $ hg bookmark touncommit-bm + $ hg bookmark --inactive touncommit-bm-inactive + $ hg bookmarks + * touncommit-bm 3:5eb72dbe0cb4 + touncommit-bm-inactive 3:5eb72dbe0cb4 + unrelated 2:f63b90038565 + Prepare complicated working directory $ hg branch foo @@ -135,6 +154,10 @@ $ hg uncommit abort: nothing to uncommit [255] + $ hg bookmarks + * touncommit-bm 3:5eb72dbe0cb4 + touncommit-bm-inactive 3:5eb72dbe0cb4 + unrelated 2:f63b90038565 Test no matches @@ -205,6 +228,10 @@ | o 0:07f494440405@default(stable/draft) adda + $ hg bookmarks + * touncommit-bm 4:e8db4aa611f6 + touncommit-bm-inactive 4:e8db4aa611f6 + unrelated 2:f63b90038565 $ hg debugsuccessors 5eb72dbe0cb4 e8db4aa611f6