Patchwork [2,of,2] update: update to current bookmark if it moved out from under us (issue3682)

login
register
mail settings
Submitter Kevin Bullock
Date Jan. 21, 2013, 7:48 p.m.
Message ID <e3a54977eda7d9d675f7.1358797685@slower-than-infinity.lan>
Download mbox | patch
Permalink /patch/701/
State Superseded
Headers show

Comments

Kevin Bullock - Jan. 21, 2013, 7:48 p.m.
# HG changeset patch
# User Kevin Bullock <kbullock@ringworld.org>
# Date 1358797630 21600
# Branch stable
# Node ID e3a54977eda7d9d675f7a440ce3dc6d069084107
# Parent  911229b0565cb0c031baaae36f21a5829f78e3b1
update: update to current bookmark if it moved out from under us (issue3682)

If the current bookmark (the one listed in .hg/bookmarks.current)
doesn't point to a parent of the working directory, e.g. if it was moved
by a pull, use that as the update target instead of the tipmost
descendent.

A small predicate is (finally) added to the bookmarks module to check
whether the current bookmark is also active.

Patch

diff --git a/mercurial/bookmarks.py b/mercurial/bookmarks.py
--- a/mercurial/bookmarks.py
+++ b/mercurial/bookmarks.py
@@ -134,6 +134,19 @@  def unsetcurrent(repo):
     finally:
         wlock.release()
 
+def iscurrent(repo, mark=None, parents=None):
+    '''Tell whether the current bookmark is also active
+
+    I.e., the bookmark listed in .hg/bookmarks.current also points to a
+    parent of the working directory.
+    '''
+    if not mark:
+        mark = repo._bookmarkcurrent
+    if not parents:
+        parents = [p.node() for p in repo[None].parents()]
+    marks = repo._bookmarks
+    return (mark in marks and marks[mark] in parents)
+
 def updatecurrentbookmark(repo, oldnode, curbranch):
     try:
         return update(repo, oldnode, repo.branchtip(curbranch))
diff --git a/mercurial/commands.py b/mercurial/commands.py
--- a/mercurial/commands.py
+++ b/mercurial/commands.py
@@ -5961,7 +5961,12 @@  def update(ui, repo, node=None, rev=None
     # with no argument, we also move the current bookmark, if any
     movemarkfrom = None
     if rev is None:
-        movemarkfrom = repo['.'].node()
+        curmark = repo._bookmarkcurrent
+        if bookmarks.iscurrent(repo):
+            movemarkfrom = repo['.'].node()
+        else:
+            ui.status(_("updating to active bookmark %s\n") % curmark)
+            rev = repo._bookmarks[curmark]
 
     # if we defined a bookmark, we have to remember the original bookmark name
     brev = rev
diff --git a/tests/test-bookmarks-pushpull.t b/tests/test-bookmarks-pushpull.t
--- a/tests/test-bookmarks-pushpull.t
+++ b/tests/test-bookmarks-pushpull.t
@@ -173,6 +173,9 @@  divergent bookmarks
 
 update a remote bookmark from a non-head to a head
 
+  $ cd ../a
+  $ hg up -q Y
+  $ cd ../b
   $ hg up -q Y
   $ echo c3 > f2
   $ hg ci -Am3
@@ -188,10 +191,19 @@  update a remote bookmark from a non-head
   updating bookmark Y
   $ hg -R ../a book
      @                         1:0d2164f0ce0d
-   * X                         1:0d2164f0ce0d
+     X                         1:0d2164f0ce0d
      Y                         3:f6fc62dde3c0
      Z                         1:0d2164f0ce0d
 
+update to current bookmark if it's not the parent
+
+  $ cd ../a
+  $ hg up
+  updating to active bookmark Y
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ hg up -q X
+  $ cd ../b
+
 diverging a remote bookmark fails
 
   $ hg up -q 4e3505fd9583