[PATCH 3 of 8 V5] bundle2: add `bookmarks` part handler

Pierre-Yves David pierre-yves.david at ens-lyon.org
Thu Oct 6 11:33:02 UTC 2016



On 10/05/2016 06:59 PM, Stanislau Hlebik wrote:
> What does binary encoding for bookmarks mean? Or you are talking about nodes encoding?

It means using a binary format instead of a textual one. Historically 
Mercurial have been using textual format a lot, but we have been moving 
to favoring binary ones in the later years.

A binary format for bookmarks could be:

   <20 bytes for nodes><4 (or 2?) bytes for length of 
bookmarks><bookmark name>

>
> Thanks,
> Stas
>
> On 9/16/16, 4:53 PM, "Pierre-Yves David" <pierre-yves.david at ens-lyon.org> wrote:
>
>
>
>     On 09/16/2016 01:10 PM, Stanislau Hlebik wrote:
>     > # HG changeset patch
>     > # User Stanislau Hlebik <stash at fb.com>
>     > # Date 1473954996 25200
>     > #      Thu Sep 15 08:56:36 2016 -0700
>     > # Node ID 3456cba8a4879e74f3b928df321ce7e7c695fb4c
>     > # Parent  f3fb030f0e4601561ac94137c7481694407db7b7
>     > bundle2: add `bookmarks` part handler
>     >
>     > diff --git a/mercurial/bundle2.py b/mercurial/bundle2.py
>     > --- a/mercurial/bundle2.py
>     > +++ b/mercurial/bundle2.py
>     > @@ -154,8 +154,12 @@
>     >  import sys
>     >
>     >  from .i18n import _
>     > +from .node import (
>     > +    bin,
>     > +)
>     >  from . import (
>     >      changegroup,
>     > +    encoding,
>     >      error,
>     >      obsolete,
>     >      pushkey,
>     > @@ -1614,3 +1618,20 @@
>     >
>     >      cache.write()
>     >      op.ui.debug('applied %i hgtags fnodes cache entries\n' % count)
>     > +
>     > + at parthandler('bookmarks')
>     > +def handlebookmarks(op, inpart):
>
>
>     Please add some docstring to this part.
>
>     Greg, do you think we should also update the technical documentation
>     specification of each part or should the docstring take care of this ?
>
>     > +    dec = encoding.tolocal
>     > +    bookmarks = {}
>     > +    for bookmarknode in inpart.read().splitlines():
>     > +        book, node = bookmarknode.rsplit(' ', 1)
>
>     We should probably stick on binary encoding for bookmark. This would
>     avoid the need to encode/decode the hex and probably be more extensible
>     in the future.
>
>     > +        bookmarks[dec(book)] = node
>     > +    if op.applybookmarks:
>     > +        for bookmark, node in bookmarks.items():
>     > +            if node:
>     > +                op.repo._bookmarks[bookmark] = bin(node)
>     > +            else:
>     > +                del op.repo._bookmarks[bookmark]
>     > +        op.repo._bookmarks.recordchange(op.gettransaction())
>
>     You wan to call gettransaction before doing any change. The pushrebase
>     extension delay the locking until the transaction is actually fetched
>     and this would expose you to a race here.
>
>     As you pointed on IRC, this is no longer trigger the pushkey hooks for
>     bookmarks. This highlight the fact that:
>
>     (1) We should most probably introduces some hook dedicated to bookmark
>     (2) unfortunatly, we probably need to trigger the pushkey hook even if
>     we are not using pushkey for BC reason :-(
>
>
>     > +    else:
>     > +        op.records.add('bookmarks', bookmarks)
>
>     We want to add record in all cases. The record are here to help other
>     part of the push (eg: handler, hooks) to understand and collaborate with
>     what happened.
>
>     Cheers,
>
>     --
>     Pierre-Yves David
>
>

-- 
Pierre-Yves David



More information about the Mercurial-devel mailing list