[PATCH 06 of 10 V10] bundle2: add `bookmarks` part handler

Gregory Szorc gregory.szorc at gmail.com
Mon Nov 21 22:22:43 EST 2016


On Sun, Nov 20, 2016 at 4:13 AM, Stanislau Hlebik <stash at fb.com> wrote:

> # HG changeset patch
> # User Stanislau Hlebik <stash at fb.com>
> # Date 1479643450 28800
> #      Sun Nov 20 04:04:10 2016 -0800
> # Node ID 866281dae2407308c19c7c3109bb5501b940ee67
> # Parent  57d7f92db34461da87850e26d831d2d235282356
> bundle2: add `bookmarks` part handler
>
> Applies bookmarks part to the local repo. `processbookmarksmode` determines
> how remote bookmarks are handled. They are either ignored ('ignore' mode),
> diverged ('diverge' mode) or applied ('apply' mode).
>
> 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 as bookmod,
>      changegroup,
>      error,
>      obsolete,
> @@ -287,13 +288,19 @@
>      * a way to construct a bundle response when applicable.
>      """
>
> -    def __init__(self, repo, transactiongetter, captureoutput=True):
> +    def __init__(self, repo, transactiongetter, captureoutput=True,
> +                 behavior=None):
> +        """
> +        `behavior` is a dictionary that is passed to part handlers to
> tweak
> +        their behaviour
> +        """
>          self.repo = repo
>          self.ui = repo.ui
>          self.records = unbundlerecords()
>          self.gettransaction = transactiongetter
>          self.reply = None
>          self.captureoutput = captureoutput
> +        self.behavior = behavior or {}
>
>  class TransactionUnavailable(RuntimeError):
>      pass
> @@ -1616,3 +1623,36 @@
>
>      cache.write()
>      op.ui.debug('applied %i hgtags fnodes cache entries\n' % count)
> +
> + at parthandler('bookmarks')
> +def handlebookmarks(op, inpart):
> +    """Processes bookmarks part.
> +
> +    `processbookmarksmode` determines how remote bookmarks are handled.
> They are
> +    either ignored ('ignore' mode), diverged ('diverge' mode) or applied
> +    ('apply' mode). 'ignore' mode is used to get bookmarks and process
> them
> +    later, 'diverge' mode is used to process bookmarks during pull,
> 'apply'
> +    mode is used during push.
> +    """
> +
> +    bookmarks = {}
> +    bookmarks = bookmod.decodebookmarks(inpart.read())
>

The empty dict assignment line can be deleted.


> +    processbookmarksmode = op.behavior.get('processbookmarksmode',
> 'ignore')
> +    if processbookmarksmode == 'apply':
> +        for bookmark, node in bookmarks.items():
> +            if node:
> +                op.repo._bookmarks[bookmark] = node
> +            else:
> +                try:
> +                    del op.repo._bookmarks[bookmark]
> +                except KeyError:
> +                    # ignore if bookmark does not exist
> +                    pass
> +        op.repo._bookmarks.recordchange(op.gettransaction())
> +    elif processbookmarksmode == 'diverge':
> +        remotepath = op.behavior.get('remotepath', '')
> +        explicitbookmarks = op.behavior.get('explicitbookmarks', ())
> +        bookmod.updatefromremote(op.ui, op.repo, bookmarks,
> +                                 remotepath, op.gettransaction,
> +                                 explicit=explicitbookmarks)
> +    op.records.add('bookmarks', bookmarks)
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.mercurial-scm.org/pipermail/mercurial-devel/attachments/20161121/44a88036/attachment.html>


More information about the Mercurial-devel mailing list