[PATCH 12 of 15 V2] bundle2: support a 'records' mode for the 'bookmarks' part

Augie Fackler raf at durin42.com
Fri Nov 10 17:43:06 EST 2017


On Thu, Nov 02, 2017 at 02:18:09PM +0100, Boris Feld wrote:
> # HG changeset patch
> # User Boris Feld <boris.feld at octobus.net>
> # Date 1508246776 -7200
> #      Tue Oct 17 15:26:16 2017 +0200
> # Node ID 68bbec307c142b6b41893512b1c76320c87c2fa1
> # Parent  bd3927325fe48e104b1627e5681ccd09a9a49e44
> # EXP-Topic b2.bookmarks
> # Available At https://bitbucket.org/octobus/mercurial-devel/
> #              hg pull https://bitbucket.org/octobus/mercurial-devel/ -r 68bbec307c14
> bundle2: support a 'records' mode for the 'bookmarks' part
>
> In this mode, the bookmarks changes are record in the 'bundleoperation' records
> instead of inflicted to the repository. This is necessary to use the part when

s/inflicted/applied/?

> pulling.
>

I'm confused. Why do we not want to apply the part when we're pulling?
This log message could use some expansion.

>
> diff --git a/mercurial/bundle2.py b/mercurial/bundle2.py
> --- a/mercurial/bundle2.py
> +++ b/mercurial/bundle2.py
> @@ -1897,40 +1897,55 @@ def handlepushkey(op, inpart):
>  def handlebookmark(op, inpart):
>      """transmit bookmark information
>
> -    The part contains binary encoded bookmark information. The bookmark
> -    information is applied as is to the unbundling repository. Make sure a
> -    'check:bookmarks' part is issued earlier to check for race condition in
> -    such update.
> +    The part contains binary encoded bookmark information.
> +
> +    The exact behavior of this part can be controlled by the 'bookmarks' mode
> +    on the bundle operation.
>
> -    This behavior is suitable for pushing. Semantic adjustment will be needed
> -    for pull.
> +    When mode is 'apply' (the default) the bookmark information is applied as
> +    is to the unbundling repository. Make sure a 'check:bookmarks' part is
> +    issued earlier to check for push races in such update. This behavior is
> +    suitable for pushing.
> +
> +    When mode is 'records', the information is recorded into the 'bookmarks'
> +    records of the bundle operation. This behavior is suitable for pulling.
>      """
>      changes = bookmarks.binarydecode(inpart)
>
> -    tr = op.gettransaction()
> -    bookstore = op.repo._bookmarks
> +    pushkeycompat = op.repo.ui.configbool('server', 'bookmarks-pushkey-compat')
> +    bookmarksmode = op.modes.get('bookmarks', 'apply')
>
> -    pushkeycompat = op.repo.ui.configbool('server', 'bookmarks-pushkey-compat')
> -    if pushkeycompat:
> -        allhooks = []
> +    if bookmarksmode == 'apply':
> +        tr = op.gettransaction()
> +        bookstore = op.repo._bookmarks
> +        if pushkeycompat:
> +            allhooks = []
> +            for book, node in changes:
> +                hookargs = tr.hookargs.copy()
> +                hookargs['pushkeycompat'] = '1'
> +                hookargs['namespace'] = 'bookmark'
> +                hookargs['key'] = book
> +                hookargs['old'] = nodemod.hex(bookstore.get(book, ''))
> +                hookargs['new'] = nodemod.hex(node if node is not None else '')
> +                allhooks.append(hookargs)
> +
> +            for hookargs in allhooks:
> +                op.repo.hook('prepushkey', throw=True, **hookargs)
> +
> +        bookstore.applychanges(op.repo, op.gettransaction(), changes)
> +
> +        if pushkeycompat:
> +            def runhook():
> +                for hookargs in allhooks:
> +                    op.repo.hook('prepushkey', **hookargs)
> +            op.repo._afterlock(runhook)
> +
> +    elif bookmarksmode == 'records':
>          for book, node in changes:
> -            hookargs = tr.hookargs.copy()
> -            hookargs['pushkeycompat'] = '1'
> -            hookargs['namespace'] = 'bookmark'
> -            hookargs['key'] = book
> -            hookargs['old'] = nodemod.hex(bookstore.get(book, ''))
> -            hookargs['new'] = nodemod.hex(node if node is not None else '')
> -            allhooks.append(hookargs)
> -        for hookargs in allhooks:
> -            op.repo.hook('prepushkey', throw=True, **hookargs)
> -
> -    bookstore.applychanges(op.repo, tr, changes)
> -
> -    if pushkeycompat:
> -        def runhook():
> -            for hookargs in allhooks:
> -                op.repo.hook('prepushkey', **hookargs)
> -        op.repo._afterlock(runhook)
> +            record = {'bookmark': book, 'node': node}
> +            op.records.add('bookmarks', record)
> +    else:
> +        raise error.ProgrammingError('unkown bookmark mode: %s' % bookmarksmode)
>
>  @parthandler('phase-heads')
>  def handlephases(op, inpart):
> _______________________________________________
> Mercurial-devel mailing list
> Mercurial-devel at mercurial-scm.org
> https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel


More information about the Mercurial-devel mailing list