Mercurial > public > mercurial-scm > evolve
diff hgext/evolve.py @ 313:47d10459fa24
uncommit: handle bookmarks
Extract the bookmarks handling code from amend and share it with
uncommit.
author | Patrick Mezard <patrick@mezard.eu> |
---|---|
date | Tue, 26 Jun 2012 16:12:52 +0200 |
parents | a7b5989d1d92 |
children | ebd286f06879 |
line wrap: on
line diff
--- 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: