[PATCH 2 of 7 V4] exchange: add `bookmarks` part generator

Pierre-Yves David pierre-yves.david at ens-lyon.org
Tue Sep 6 08:56:07 EDT 2016



On 09/05/2016 12:46 AM, Stanislau Hlebik wrote:
> # HG changeset patch
> # User Stanislau Hlebik <stash at fb.com>
> # Date 1473012054 25200
> #      Sun Sep 04 11:00:54 2016 -0700
> # Node ID f3bc1662dbce19de1f51c4da519238dbe98c1c95
> # Parent  6e9d1438a270ba02cd06590efd959039b0fae566
> exchange: add `bookmarks` part generator
>
> diff --git a/mercurial/bundle2.py b/mercurial/bundle2.py
> --- a/mercurial/bundle2.py
> +++ b/mercurial/bundle2.py
> @@ -1252,6 +1252,7 @@
>                  'digests': tuple(sorted(util.DIGESTS.keys())),
>                  'remote-changegroup': ('http', 'https'),
>                  'hgtagsfnodes': (),
> +                'bookmarks': (),
>                 }
>
>  def getrepocaps(repo, allowpushback=False):
> diff --git a/mercurial/exchange.py b/mercurial/exchange.py
> --- a/mercurial/exchange.py
> +++ b/mercurial/exchange.py
> @@ -21,6 +21,7 @@
>      bundle2,
>      changegroup,
>      discovery,
> +    encoding,
>      error,
>      lock as lockmod,
>      obsolete,
> @@ -1671,6 +1672,24 @@
>      if chunks:
>          bundler.newpart('hgtagsfnodes', data=''.join(chunks))
>
> + at getbundle2partsgenerator('bookmarks')
> +def _getbundlebookmarkspart(bundler, repo, source, bundlecaps=None,
> +                            b2caps=None, heads=None, common=None,
> +                            **kwargs):
> +    if not kwargs.get('bookmarks'):
> +        return
> +    if kwargs.get('bookmarks') and 'bookmarks' not in b2caps:

The second check for kwargs.get('bookmarks') seems to be redundant.

> +        raise ValueError(
> +            _('bookmarks are requested but client is not capable '
> +              'of receiving it'))
> +
> +    enc = encoding.fromlocal
> +    bookmarks = _get_bookmarks(repo, kwargs)
> +    encodedbookmarks = '\n'.join(
> +        '%s %s' % (enc(bookmark), enc(node))

Encoding nodes seems a bit strange? Why are you doing this?

> +        for bookmark, node in bookmarks.items())
> +    bundler.newpart('bookmarks', data=encodedbookmarks)

If we forsee the bookmark part to be huge we could turn the data 
generation into a generator instead.

>  def _get_bookmarks(repo, kwargs):
>      return repo.listkeys(namespace='bookmarks')
>
> diff --git a/mercurial/wireproto.py b/mercurial/wireproto.py
> --- a/mercurial/wireproto.py
> +++ b/mercurial/wireproto.py
> @@ -219,7 +219,8 @@
>               'bundlecaps': 'scsv',
>               'listkeys': 'csv',
>               'cg': 'boolean',
> -             'cbattempted': 'boolean'}
> +             'cbattempted': 'boolean',
> +             'bookmarks': 'boolean'}


-- 
Pierre-Yves David


More information about the Mercurial-devel mailing list