Patchwork [1,of,5,STABLE,V2] bookmarks: resolve divergent bookmarks when fowarding bookmark to descendant

login
register
mail settings
Submitter Sean Farley
Date May 1, 2013, 9:04 p.m.
Message ID <e1a18fe0651e7e04f4bb.1367442298@laptop.local>
Download mbox | patch
Permalink /patch/1526/
State Accepted
Commit 26c51e87e807d085a24cc9f2321c75faaa0c7ff4
Headers show

Comments

Sean Farley - May 1, 2013, 9:04 p.m.
# HG changeset patch
# User Sean Farley <sean.michael.farley@gmail.com>
# Date 1367440299 18000
#      Wed May 01 15:31:39 2013 -0500
# Branch stable
# Node ID e1a18fe0651e7e04f4bb0c53388c73ac28f754c3
# Parent  cb95716da5fe37a9bd6a8c7da73dc6caf89d5fe7
bookmarks: resolve divergent bookmarks when fowarding bookmark to descendant

This patch is a follow-up to 56dd55da2f7d that resolves divergent bookmarks
between the to-be-forwarded bookmark MARK and the new descendant. This
situation can happen when pulling new changesets, updating to the divergent
bookmark, abandoning the previous changesets with strip, and then moving MARK
to MARK@N.

Test coverage is added.

Patch

diff --git a/mercurial/commands.py b/mercurial/commands.py
--- a/mercurial/commands.py
+++ b/mercurial/commands.py
@@ -814,10 +814,15 @@ 
                 if marks[mark] == target and target == cur:
                     # re-activating a bookmark
                     return
                 anc = repo.changelog.ancestors([repo[target].rev()])
                 bmctx = repo[marks[mark]]
+                divs = [repo[b].node() for b in marks
+                        if b.split('@', 1)[0] == mark.split('@', 1)[0]]
+                deletefrom = [b for b in divs
+                              if repo[b].rev() in anc or b == target]
+                bookmarks.deletedivergent(repo, deletefrom, mark)
                 if bmctx.rev() in anc:
                     ui.status(_("moving bookmark '%s' forward from %s\n") %
                               (mark, short(bmctx.node())))
                     return
             raise util.Abort(_("bookmark '%s' already exists "
diff --git a/tests/test-bookmarks.t b/tests/test-bookmarks.t
--- a/tests/test-bookmarks.t
+++ b/tests/test-bookmarks.t
@@ -588,5 +588,26 @@ 
   o  changeset:   0:f7b1eb17ad24
      user:        test
      date:        Thu Jan 01 00:00:00 1970 +0000
      summary:     0
   
+
+test clearing divergent bookmarks of linear ancestors
+
+  $ hg bookmark Z -r 0
+  $ hg bookmark Z@1 -r 1
+  $ hg bookmark Z@2 -r 2
+  $ hg bookmark Z@3 -r 3
+  $ hg book
+     Z                         0:f7b1eb17ad24
+     Z@1                       1:925d80f479bb
+     Z@2                       2:db815d6d32e6
+   * Z@3                       3:9ba5f110a0b3
+     four                      3:9ba5f110a0b3
+     should-end-on-two         2:db815d6d32e6
+  $ hg bookmark Z
+  moving bookmark 'Z' forward from f7b1eb17ad24
+  $ hg book
+   * Z                         3:9ba5f110a0b3
+     Z@1                       1:925d80f479bb
+     four                      3:9ba5f110a0b3
+     should-end-on-two         2:db815d6d32e6