[PATCH 03 of 15] bookmark: add a 'check:bookmarks' bundle2 part

Gregory Szorc gregory.szorc at gmail.com
Wed Oct 18 13:01:48 EDT 2017


On Wed, Oct 18, 2017 at 6:09 PM, Boris Feld <boris.feld at octobus.net> wrote:

> # HG changeset patch
> # User Boris Feld <boris.feld at octobus.net>
> # Date 1508072463 -7200
> #      Sun Oct 15 15:01:03 2017 +0200
> # Node ID 5eec60fda2b053ca9f6527b4dc86631adac3ca91
> # Parent  f27feea4fe4c313aa87c85aabd1ed8c3c4b31296
> # EXP-Topic b2.bookmarks
> # Available At https://bitbucket.org/octobus/mercurial-devel/
> #              hg pull https://bitbucket.org/octobus/mercurial-devel/ -r
> 5eec60fda2b0
> bookmark: add a 'check:bookmarks' bundle2 part
>
> This part checks that bookmarks are still at the node they are expected to
> be.
> This allows a pushing client to detect push race where the repository was
> updated between the time it discovered the server state and the time it
> managed
> to finish its push.
>
> Such checking already exists when pushing bookmark through pushkey. This
> new
> part can be inserted at the beginning of the bundle, triggering abort
> earlier.
> In addition, we would like to move away from pushey to push bookmark. A
> step
> useful to solve issue5165.
>
> diff --git a/mercurial/bundle2.py b/mercurial/bundle2.py
> --- a/mercurial/bundle2.py
> +++ b/mercurial/bundle2.py
> @@ -155,6 +155,7 @@
>
>  from .i18n import _
>  from . import (
> +    bookmarks,
>      changegroup,
>      error,
>      node as nodemod,
> @@ -1702,6 +1703,34 @@
>      replyto = int(inpart.params['in-reply-to'])
>      op.records.add('changegroup', {'return': ret}, replyto)
>
> + at parthandler('check:bookmarks')
> +def handlecheckbookmarks(op, inpart):
> +    """check location of bookmarks
> +
> +    This part is to be used to detect push race regarding bookmark, it
> +    contains binary encoded (bookmark, node) tuple. If the local state
> does
> +    not marks the one in the part, a PushRaced exception is raised
> +    """
> +    bookdata = bookmarks.binarydecode(inpart)
> +
> +    msgstandard = ('repository changed while pushing - please try again '
> +                   '(bookmark "%s" move from %s to %s)')
> +    msgmissing = ('repository changed while pushing - please try again '
> +                  '(bookmark "%s" is missing, expected %s)')
> +    msgexist = ('repository changed while pushing - please try again '
> +                '(bookmark "%s" set on %s, expected missing)')
> +    for book, node in bookdata:
> +        currentnode = op.repo._bookmarks.get(book)
> +        if currentnode != node:
> +            if node is None:
> +                finalmsg = msgexist % (book, nodemod.short(currentnode))
> +            elif currentnode is None:
> +                finalmsg = msgmissing % (book, nodemod.short(node))
> +            else:
> +                finalmsg = msgstandard % (book, nodemod.short(node),
> +                                          nodemod.short(currentnode))
> +            raise error.PushRaced(finalmsg)
> +
>

+1 to the feature!

Currently, the error message only captures the first failure. Do you think
it should capture all failures? (This could be changed as a follow-up of
course.)


>  @parthandler('check:heads')
>  def handlecheckheads(op, inpart):
>      """check that head of the repo did not change
> _______________________________________________
> Mercurial-devel mailing list
> Mercurial-devel at mercurial-scm.org
> https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.mercurial-scm.org/pipermail/mercurial-devel/attachments/20171018/54d8cdd5/attachment.html>


More information about the Mercurial-devel mailing list