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

Matt Mackall mpm at selenic.com
Mon Jan 21 17:29:13 CST 2013


On Mon, 2013-01-21 at 14:15 -0600, Kevin Bullock wrote:
> # HG changeset patch
> # User Kevin Bullock <kbullock at ringworld.org>
> # Date 1358797630 21600
> # Branch stable
> # Node ID 669c7ba6f12dde14cfededf3f2c9a2fa9be8690f
> # 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.

Confused. I thought we were going to erase the distinction between
current and active.

> 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()
> +        elif curmark:
> +            ui.status(_("updating to active bookmark %s\n") % curmark)
> +            rev = curmark
>  
>      # if we defined a bookmark, we have to remember the original bookmark name
>      brev = rev
> diff --git a/tests/test-bookmarks.t b/tests/test-bookmarks.t
> --- a/tests/test-bookmarks.t
> +++ b/tests/test-bookmarks.t
> @@ -458,7 +458,11 @@ create bundle with two heads
>    adding file changes
>    added 2 changesets with 2 changes to 2 files (+1 heads)
>    (run 'hg heads' to see heads, 'hg merge' to merge)
> +
> +update to current bookmark if it's not the parent
> +
>    $ hg update
> +  updating to active bookmark Z
>    1 files updated, 0 files merged, 0 files removed, 0 files unresolved
>    $ hg bookmarks
>       X2                        1:925d80f479bb


-- 
Mathematics is the supreme nostalgia of our time.




More information about the Mercurial-devel mailing list