From patchwork Mon Apr 29 22:38:42 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: [2, of, 2, STABLE] bookmarks: resolve divergent bookmarks when moving active bookmark forward From: Sean Farley X-Patchwork-Id: 1503 Message-Id: To: mercurial-devel@selenic.com Date: Mon, 29 Apr 2013 17:38:42 -0500 # HG changeset patch # User Sean Farley # Date 1367272357 18000 # Mon Apr 29 16:52:37 2013 -0500 # Branch stable # Node ID ddd8b869e48d8d353905e9c0b2964c3795a9dc88 # Parent d6ff913a84d296fc6d1ed129351eb215d7e6920e bookmarks: resolve divergent bookmarks when moving active bookmark forward This patch resolves divergent bookmarks between the current active bookmark MARK and the new destination. This situation can arise when pulling new changesets, abandoning your current changesets actively bookmarked with MARK via strip, and then doing a bare update. The non-divergent but active bookmark MARK is then moved to a common ancestor of the new changesets and the abandoned changesets. Test coverage is added. diff --git a/mercurial/bookmarks.py b/mercurial/bookmarks.py --- a/mercurial/bookmarks.py +++ b/mercurial/bookmarks.py @@ -169,24 +169,28 @@ del marks[mark] deleted = True return deleted def update(repo, parents, node): + deletefrom = parents marks = repo._bookmarks update = False cur = repo._bookmarkcurrent if not cur: return False if marks[cur] in parents: old = repo[marks[cur]] new = repo[node] + divs = [repo[b] for b in marks + if b.split('@', 1)[0] == cur.split('@', 1)[0]] + deletefrom = [b.node() for b in divs if b.descendant(new) or b == new] if old.descendant(new): marks[cur] = new.node() update = True - if deletedivergent(repo, parents, cur): + if deletedivergent(repo, deletefrom, cur): update = True if update: marks.write() return update diff --git a/tests/test-bookmarks-current.t b/tests/test-bookmarks-current.t --- a/tests/test-bookmarks-current.t +++ b/tests/test-bookmarks-current.t @@ -131,25 +131,31 @@ $ hg bookmark -i -m Y X $ hg bookmarks X 0:719295282060 Z 0:719295282060 -bare update moves the active bookmark forward +bare update moves the active bookmark forward and clear the divergent bookmarks $ echo a > a $ hg ci -Am1 adding a + $ echo b >> a + $ hg ci -Am2 + $ hg bookmark X@1 -r 1 + $ hg bookmark X@2 -r 2 $ hg update X 0 files updated, 0 files merged, 1 files removed, 0 files unresolved $ hg bookmarks * X 0:719295282060 + X@1 1:cc586d725fbe + X@2 2:49e1c4e84c58 Z 0:719295282060 $ hg update 1 files updated, 0 files merged, 0 files removed, 0 files unresolved updating bookmark X $ hg bookmarks - * X 1:cc586d725fbe + * X 2:49e1c4e84c58 Z 0:719295282060 test deleting .hg/bookmarks.current when explicitly updating to a revision