# HG changeset patch # User David Schleimer # Date 2012-06-22 18:40:31 # Node ID 4116504d1ec4c9263b7b7cb333e00f379024e688 # Parent 52ea9ce5b64143a836f5b6551b9dbe1a91ec907a bookmarks: correctly update current bookmarks on rebase (issue2277) When you rebased with a currently active bookmark, that bookmark would always point at the new tip, regardless of what revision it pointed at before the rebase. All bookmarks will now point at the equivalent post-rebase commit. However, the currently active bookmark will cease to be active unless it points at the new tip post-rebase. Rebase will always leave the new tip as the working copy parent, which is incompatible with having an active bookmark that points at some other revision. The common case should be that the active bookmark will point at the new tip post-rebase. diff --git a/hgext/rebase.py b/hgext/rebase.py --- a/hgext/rebase.py +++ b/hgext/rebase.py @@ -247,6 +247,9 @@ def rebase(ui, repo, **opts): # Keep track of the current bookmarks in order to reset them later currentbookmarks = repo._bookmarks.copy() + activebookmark = repo._bookmarkcurrent + if activebookmark: + bookmarks.unsetcurrent(repo) sortedstate = sorted(state) total = len(sortedstate) @@ -336,6 +339,11 @@ def rebase(ui, repo, **opts): util.unlinkpath(repo.sjoin('undo')) if skipped: ui.note(_("%d revisions have been skipped\n") % len(skipped)) + + if (activebookmark and + repo['tip'].node() == repo._bookmarks[activebookmark]): + bookmarks.setcurrent(repo, activebookmark) + finally: release(lock, wlock) @@ -483,13 +491,11 @@ def updatemq(repo, state, skipped, **opt def updatebookmarks(repo, nstate, originalbookmarks, **opts): 'Move bookmarks to their correct changesets' - current = repo._bookmarkcurrent for k, v in originalbookmarks.iteritems(): if v in nstate: if nstate[v] != nullmerge: - # reset the pointer if the bookmark was moved incorrectly - if k != current: - repo._bookmarks[k] = nstate[v] + # update the bookmarks for revs that have moved + repo._bookmarks[k] = nstate[v] bookmarks.write(repo) diff --git a/tests/test-rebase-bookmarks.t b/tests/test-rebase-bookmarks.t --- a/tests/test-rebase-bookmarks.t +++ b/tests/test-rebase-bookmarks.t @@ -36,8 +36,10 @@ Create a repo with several bookmarks adding d created new head + $ hg book W + $ hg tglog - @ 3: 'D' bookmarks: + @ 3: 'D' bookmarks: W | | o 2: 'C' bookmarks: Y Z | | @@ -60,7 +62,7 @@ Move only rebased bookmarks $ hg tglog @ 3: 'C' bookmarks: Y Z | - o 2: 'D' bookmarks: + o 2: 'D' bookmarks: W | | o 1: 'B' bookmarks: X |/ @@ -82,7 +84,30 @@ Keep bookmarks to the correct rebased ch | o 2: 'B' bookmarks: X | - o 1: 'D' bookmarks: + o 1: 'D' bookmarks: W | o 0: 'A' bookmarks: + +Keep active bookmark on the correct changeset + + $ cd .. + $ hg clone -q a a3 + + $ cd a3 + $ hg up -q X + + $ hg rebase -d W + saved backup bundle to $TESTTMP/a3/.hg/strip-backup/*-backup.hg (glob) + + $ hg tglog + @ 3: 'C' bookmarks: Y Z + | + o 2: 'B' bookmarks: X + | + o 1: 'D' bookmarks: W + | + o 0: 'A' bookmarks: + + + $ cd ..