[PATCH 12 of 15 V2] bundle2: support a 'records' mode for the 'bookmarks' part
Boris Feld
boris.feld at octobus.net
Mon Nov 13 05:24:26 EST 2017
On Fri, 2017-11-10 at 17:43 -0500, Augie Fackler wrote:
> 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-deve
> > l/ -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.
When pulling, the remote bookmark value is not just applied -as-is-
into the local repository. There is an extra step to detect bookmark
divergence. The remote bookmarks data are stored until this processing
happens.
>
> >
> > 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