[PATCH 2 of 2 STABLE] bookmarks: resolve divergent bookmarks when moving active bookmark forward
Sean Farley
sean.michael.farley at gmail.com
Mon Apr 29 17:38:42 CDT 2013
# HG changeset patch
# User Sean Farley <sean.michael.farley at gmail.com>
# 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 at 1 -r 1
+ $ hg bookmark X at 2 -r 2
$ hg update X
0 files updated, 0 files merged, 1 files removed, 0 files unresolved
$ hg bookmarks
* X 0:719295282060
+ X at 1 1:cc586d725fbe
+ X at 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
More information about the Mercurial-devel
mailing list