[PATCH 10 of 12 V3] bundle2: support a 'records' mode for the 'bookmarks' part
Durham Goode
durham at fb.com
Thu Mar 22 17:49:09 UTC 2018
Potential bug mentioned inline
On 11/20/17 8:52 AM, 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 7e610585998e3eff1d0498a6ce024350bb04fc23
> # Parent ab0fe3f91e7b9ed7bd508a9affa0b91128facf13
> # EXP-Topic b2.bookmarks
> # Available At https://urldefense.proofpoint.com/v2/url?u=https-3A__bitbucket.org_octobus_mercurial-2Ddevel_&d=DwIGaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=nuarHzhP1wi1T9iURRCj1A&m=EyaOozG7mqYFV7-uTtZuxV3zYCWicwAVyqzUZmeNyFQ&s=6vm3KUlcZ0dR7UkeLmcuPjYetLgy50kNjAlNrys3aEI&e=
> # hg pull https://urldefense.proofpoint.com/v2/url?u=https-3A__bitbucket.org_octobus_mercurial-2Ddevel_&d=DwIGaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=nuarHzhP1wi1T9iURRCj1A&m=EyaOozG7mqYFV7-uTtZuxV3zYCWicwAVyqzUZmeNyFQ&s=6vm3KUlcZ0dR7UkeLmcuPjYetLgy50kNjAlNrys3aEI&e= -r 7e610585998e
> 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
> pulling.
>
> diff --git a/mercurial/bundle2.py b/mercurial/bundle2.py
> --- a/mercurial/bundle2.py
> +++ b/mercurial/bundle2.py
> @@ -1898,40 +1898,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)
Should this be 'pushkey' instead of 'prepushkey'? Since it happens after
the lock? That would match localrepository.pushkey()'s behavior.
> + 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://urldefense.proofpoint.com/v2/url?u=https-3A__www.mercurial-2Dscm.org_mailman_listinfo_mercurial-2Ddevel&d=DwIGaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=nuarHzhP1wi1T9iURRCj1A&m=EyaOozG7mqYFV7-uTtZuxV3zYCWicwAVyqzUZmeNyFQ&s=7YABt1cm45Mp__z7bxjPwnISb9XFpHkbVFYIoVgsA9U&e=
>
More information about the Mercurial-devel
mailing list