[PATCH 1 of 3]: update: never move active bookmark

Waldemar Kornewald wkornewald at gmail.com
Sat Nov 7 18:23:36 CST 2015


Hi,
sorry that these three patches have no unit tests, yet, but I'd first
like to check if you guys are even interested in changing hg's
behavior like that and possibly breaking current habits.

Greetings,
Waldemar

On Sun, Nov 8, 2015 at 1:17 AM, Waldemar Kornewald <wkornewald at gmail.com> wrote:
> # HG changeset patch
> # User Waldemar Kornewald <wkornewald>
> # Date 1446916310 -3600
> #      Sat Nov 07 18:11:50 2015 +0100
> # Node ID 7e94770574c7b1a62378c212c8fb338a4e0616b5
> # Parent  f9984f76fd90e439221425d751e29bae17bec995
> update: never move active bookmark
>
> An "hg update" without args moved the active bookmark to tip, however tip has
> no useful meaning in the context of bookmarks.
> Now we simply stay on the active bookmark (the "tip" of a bookmark is the
> bookmark itself).
>
> This also fixes an issue with "hg pull --update":
> The active bookmark stayed active, but "hg id" would be tip.
> This was inconsistent with running "hg pull" followed by "hg update".
>
> diff -r f9984f76fd90 -r 7e94770574c7 mercurial/bookmarks.py
> --- a/mercurial/bookmarks.py Wed Nov 04 15:17:52 2015 -0600
> +++ b/mercurial/bookmarks.py Sat Nov 07 18:11:50 2015 +0100
> @@ -215,17 +215,13 @@
>      return deleted
>
>  def calculateupdate(ui, repo, checkout):
> -    '''Return a tuple (targetrev, movemarkfrom) indicating the rev to
> -    check out and where to move the active bookmark from, if needed.'''
> -    movemarkfrom = None
> +    '''Return targetrev indicating the rev to check out.'''
>      if checkout is None:
>          activemark = repo._activebookmark
> -        if isactivewdirparent(repo):
> -            movemarkfrom = repo['.'].node()
> -        elif activemark:
> +        if activemark:
>              ui.status(_("updating to active bookmark %s\n") % activemark)
>              checkout = activemark
> -    return (checkout, movemarkfrom)
> +    return checkout
>
>  def update(repo, parents, node):
>      deletefrom = parents
> diff -r f9984f76fd90 -r 7e94770574c7 mercurial/commands.py
> --- a/mercurial/commands.py Wed Nov 04 15:17:52 2015 -0600
> +++ b/mercurial/commands.py Sat Nov 07 18:11:50 2015 +0100
> @@ -5220,20 +5220,15 @@
>          return
>      if optupdate:
>          try:
> -            brev = checkout
> -            movemarkfrom = None
>              if not checkout:
> -                updata =  destutil.destupdate(repo)
> -                checkout, movemarkfrom, brev = updata
> +                updata = destutil.destupdate(repo)
> +                checkout, brev = updata
>              ret = hg.update(repo, checkout)
>          except error.UpdateAbort as inst:
>              ui.warn(_("not updating: %s\n") % str(inst))
>              if inst.hint:
>                  ui.warn(_("(%s)\n") % inst.hint)
>              return 0
> -        if not ret and not checkout:
> -            if bookmarks.update(repo, [movemarkfrom], repo['.'].node()):
> -                ui.status(_("updating bookmark %s\n") % repo._activebookmark)
>          return ret
>      if modheads > 1:
>          currentbranchheads = len(repo.branchheads())
> @@ -6613,9 +6608,8 @@
>      """update working directory (or switch revisions)
>
>      Update the repository's working directory to the specified
> -    changeset. If no changeset is specified, update to the tip of the
> -    current named branch and move the active bookmark (see :hg:`help
> -    bookmarks`).
> +    changeset. If no changeset is specified, update to the active bookmark.
> +    If there is no active bookmark, update to the tip of the current
> named branch.
>
>      Update sets the working directory's parent revision to the specified
>      changeset (see :hg:`help parents`).
> @@ -6659,7 +6653,6 @@
>
>      Returns 0 on success, 1 if there are unresolved files.
>      """
> -    movemarkfrom = None
>      if rev and node:
>          raise error.Abort(_("please specify just one revision"))
>
> @@ -6687,7 +6680,7 @@
>              cmdutil.bailifchanged(repo, merge=False)
>          if rev is None:
>              updata =  destutil.destupdate(repo, clean=clean, check=check)
> -            rev, movemarkfrom, brev = updata
> +            rev, brev = updata
>
>          repo.ui.setconfig('ui', 'forcemerge', tool, 'update')
>
> @@ -6696,17 +6689,7 @@
>          else:
>              ret = hg.update(repo, rev)
>
> -        if not ret and movemarkfrom:
> -            if movemarkfrom == repo['.'].node():
> -                pass # no-op update
> -            elif bookmarks.update(repo, [movemarkfrom], repo['.'].node()):
> -                ui.status(_("updating bookmark %s\n") % repo._activebookmark)
> -            else:
> -                # this can happen with a non-linear update
> -                ui.status(_("(leaving bookmark %s)\n") %
> -                          repo._activebookmark)
> -                bookmarks.deactivate(repo)
> -        elif brev in repo._bookmarks:
> +        if brev in repo._bookmarks:
>              bookmarks.activate(repo, brev)
>              ui.status(_("(activating bookmark %s)\n") % brev)
>          elif brev:
> diff -r f9984f76fd90 -r 7e94770574c7 mercurial/destutil.py
> --- a/mercurial/destutil.py Wed Nov 04 15:17:52 2015 -0600
> +++ b/mercurial/destutil.py Sat Nov 07 18:11:50 2015 +0100
> @@ -45,7 +45,6 @@
>      node = None
>      wc = repo[None]
>      p1 = wc.p1()
> -    movemark = None
>
>      if p1.obsolete() and not p1.children():
>          # allow updating to successors
> @@ -72,33 +71,23 @@
>              # get the max revision for the given successors set,
>              # i.e. the 'tip' of a set
>              node = repo.revs('max(%ln)', successors).first()
> -            if bookmarks.isactivewdirparent(repo):
> -                movemark = repo['.'].node()
> -    return node, movemark, None
> +    return node, None
>
>  def _destupdatebook(repo, clean, check):
>      """decide on an update destination from active bookmark"""
> -    # we also move the active bookmark, if any
> -    activemark = None
> -    node, movemark = bookmarks.calculateupdate(repo.ui, repo, None)
> -    if node is not None:
> -        activemark = node
> -    return node, movemark, activemark
> +    return (bookmarks.calculateupdate(repo.ui, repo, None),) * 2
>
>  def _destupdatebranch(repo, clean, check):
>      """decide on an update destination from current branch"""
>      wc = repo[None]
> -    movemark = node = None
>      try:
>          node = repo.branchtip(wc.branch())
> -        if bookmarks.isactivewdirparent(repo):
> -            movemark = repo['.'].node()
>      except error.RepoLookupError:
>          if wc.branch() == 'default': # no default branch!
>              node = repo.lookup('tip') # update to tip
>          else:
>              raise error.Abort(_("branch %s not found") % wc.branch())
> -    return node, movemark, None
> +    return node, None
>
>  # order in which each step should be evalutated
>  # steps are run until one finds a destination
> @@ -115,21 +104,19 @@
>      return (rev, movemark, activemark)
>
>      - rev: the revision to update to,
> -    - movemark: node to move the active bookmark from
> -                (cf bookmark.calculate update),
>      - activemark: a bookmark to activate at the end of the update.
>      """
> -    node = movemark = activemark = None
> +    node = activemark = None
>
>      for step in destupdatesteps:
> -        node, movemark, activemark = destupdatestepmap[step](repo,
> clean, check)
> +        node, activemark = destupdatestepmap[step](repo, clean, check)
>          if node is not None:
>              break
>      rev = repo[node].rev()
>
>      _destupdatevalidate(repo, rev, clean, check)
>
> -    return rev, movemark, activemark
> +    return rev, activemark
>
>  def _destmergebook(repo):
>      """find merge destination in the active bookmark case"""
> diff -r f9984f76fd90 -r 7e94770574c7 mercurial/merge.py
> --- a/mercurial/merge.py Wed Nov 04 15:17:52 2015 -0600
> +++ b/mercurial/merge.py Sat Nov 07 18:11:50 2015 +0100
> @@ -1152,7 +1152,7 @@
>              if (repo.ui.configbool('devel', 'all-warnings')
>                      or repo.ui.configbool('devel', 'oldapi')):
>                  repo.ui.develwarn('update with no target')
> -            rev, _mark, _act = destutil.destupdate(repo)
> +            rev, _act = destutil.destupdate(repo)
>              node = repo[rev].node()
>
>          overwrite = force and not branchmerge


More information about the Mercurial-devel mailing list