# HG changeset patch # User Durham Goode # Date 2013-03-11 22:37:28 # Node ID 72412afe4c2872fc3197aeee06f6841c76e19772 # Parent d420ac09f866faca827abd9c65f494e01d53e3c6 rebase: restore active bookmark after rebase --continue When a rebase has conflicts and the user uses rebase --continue, the previously active bookmark was not being made active once again. With this change that bookmark is made active again, just as if the rebase had never been interrupted. This changes the rebasestate file format, but should handle old formats correctly. Since the file is transient, this is even less of a problem. Adds a test to verify the new behavior. I manually tested continuing rebases with and without an active bookmark, and with and without being on the bookmark being rebased. diff --git a/hgext/rebase.py b/hgext/rebase.py --- a/hgext/rebase.py +++ b/hgext/rebase.py @@ -112,6 +112,7 @@ def rebase(ui, repo, **opts): Returns 0 on success, 1 if nothing to rebase. """ originalwd = target = None + activebookmark = None external = nullrev state = {} skipped = set() @@ -159,7 +160,7 @@ def rebase(ui, repo, **opts): ui.warn(_('tool option will be ignored\n')) (originalwd, target, state, skipped, collapsef, keepf, - keepbranchesf, external) = restorestatus(repo) + keepbranchesf, external, activebookmark) = restorestatus(repo) if abortf: return abort(repo, originalwd, target, state) else: @@ -245,7 +246,7 @@ def rebase(ui, repo, **opts): # Keep track of the current bookmarks in order to reset them later currentbookmarks = repo._bookmarks.copy() - activebookmark = repo._bookmarkcurrent + activebookmark = activebookmark or repo._bookmarkcurrent if activebookmark: bookmarks.unsetcurrent(repo) @@ -258,7 +259,7 @@ def rebase(ui, repo, **opts): ui.progress(_("rebasing"), pos, ("%d:%s" % (rev, repo[rev])), _('changesets'), total) storestatus(repo, originalwd, target, state, collapsef, keepf, - keepbranchesf, external) + keepbranchesf, external, activebookmark) p1, p2 = defineparents(repo, rev, target, state, targetancestors) if len(repo.parents()) == 2: @@ -516,7 +517,7 @@ def updatebookmarks(repo, targetnode, ns marks.write() def storestatus(repo, originalwd, target, state, collapse, keep, keepbranches, - external): + external, activebookmark): 'Store the current status to allow recovery' f = repo.opener("rebasestate", "w") f.write(repo[originalwd].hex() + '\n') @@ -525,6 +526,7 @@ def storestatus(repo, originalwd, target f.write('%d\n' % int(collapse)) f.write('%d\n' % int(keep)) f.write('%d\n' % int(keepbranches)) + f.write('%s\n' % (activebookmark or '')) for d, v in state.iteritems(): oldrev = repo[d].hex() if v > nullmerge: @@ -545,6 +547,7 @@ def restorestatus(repo): target = None collapse = False external = nullrev + activebookmark = None state = {} f = repo.opener("rebasestate") for i, l in enumerate(f.read().splitlines()): @@ -560,6 +563,10 @@ def restorestatus(repo): keep = bool(int(l)) elif i == 5: keepbranches = bool(int(l)) + elif i == 6 and not (len(l) == 81 and ':' in l): + # line 6 is a recent addition, so for backwards compatibility + # check that the line doesn't look like the oldrev:newrev lines + activebookmark = l else: oldrev, newrev = l.split(':') if newrev in (str(nullmerge), str(revignored)): @@ -577,7 +584,7 @@ def restorestatus(repo): repo.ui.debug('computed skipped revs: %s\n' % skipped) repo.ui.debug('rebase status resumed\n') return (originalwd, target, state, skipped, - collapse, keep, keepbranches, external) + collapse, keep, keepbranches, external, activebookmark) except IOError, err: if err.errno != errno.ENOENT: raise diff --git a/tests/test-rebase-conflicts.t b/tests/test-rebase-conflicts.t --- a/tests/test-rebase-conflicts.t +++ b/tests/test-rebase-conflicts.t @@ -7,7 +7,7 @@ > publish=False > > [alias] - > tglog = log -G --template "{rev}:{phase} '{desc}' {branches}\n" + > tglog = log -G --template "{rev}:{phase} '{desc}' {branches} {bookmarks}\n" > EOF $ hg init a @@ -36,11 +36,12 @@ $ echo l3 >> extra2 $ hg add extra2 $ hg ci -m L3 + $ hg bookmark mybook $ hg phase --force --secret 4 $ hg tglog - @ 5:secret 'L3' + @ 5:secret 'L3' mybook | o 4:secret 'L2' | @@ -81,7 +82,7 @@ Conclude rebase: saved backup bundle to $TESTTMP/a/.hg/strip-backup/*-backup.hg (glob) $ hg tglog - @ 5:secret 'L3' + @ 5:secret 'L3' mybook | o 4:secret 'L2' | @@ -118,4 +119,8 @@ Check correctness: $ hg cat -r 5 common resolved merge +Bookmark stays active after --continue + $ hg bookmarks + * mybook 5:d67b21408fc0 + $ cd ..