# HG changeset patch # User Boris Feld <boris.f...@octobus.net> # Date 1508234844 -7200 # Tue Oct 17 12:07:24 2017 +0200 # Node ID 3ac21e61b800b660eaf2835eb44ef8d216a92025 # Parent 8c03b055c85e73058e11df7f802860bd47c7d7df # EXP-Topic b2.bookmarks # Available At https://bitbucket.org/octobus/mercurial-devel/ # hg pull https://bitbucket.org/octobus/mercurial-devel/ -r 3ac21e61b800 bookmark: add pushkey hook compatiblity to the bundle2 part
Currently, pushing a bookmark update triggers a pushkey hooks. It is likely that users in the wild use such hooks to control bookmark movement. Using a non push-key mechanism to exchange bookmark means these hooks are no longer called, possibly breaking existing users setup. So we add explicit call to the pushkey hooks in the handling of the bundle2 part. This behavior can be disabled with a new config knob: 'server.bookmarks-pushkey-compat'. diff --git a/mercurial/bundle2.py b/mercurial/bundle2.py --- a/mercurial/bundle2.py +++ b/mercurial/bundle2.py @@ -1904,7 +1904,31 @@ def handlebookmark(op, inpart): for pull. """ changes = bookmarks.binarydecode(inpart) - op.repo._bookmarks.applychanges(op.repo, op.gettransaction(), changes) + + tr = op.gettransaction() + bookstore = op.repo._bookmarks + + pushkeycompat = op.repo.ui.configbool('server', 'bookmarks-pushkey-compat') + 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, tr, changes) + + if pushkeycompat: + def runhook(): + for hookargs in allhooks: + op.repo.hook('prepushkey', **hookargs) + op.repo._afterlock(runhook) @parthandler('phase-heads') def handlephases(op, inpart): diff --git a/mercurial/configitems.py b/mercurial/configitems.py --- a/mercurial/configitems.py +++ b/mercurial/configitems.py @@ -745,6 +745,9 @@ coreconfigitem('progress', 'width', coreconfigitem('push', 'pushvars.server', default=False, ) +coreconfigitem('server', 'bookmarks-pushkey-compat', + default=True, +) coreconfigitem('server', 'bundle1', default=True, ) diff --git a/mercurial/help/config.txt b/mercurial/help/config.txt --- a/mercurial/help/config.txt +++ b/mercurial/help/config.txt @@ -1723,6 +1723,14 @@ Alias definitions for revsets. See :hg:` Controls generic server settings. +``bookmarks-pushkey-compat`` + Trigger pushkey hook when being pushed bookmark updates. This config exist + for compatibility purpose (default to True) + + If you use ``pushkey`` and ``pre-pushkey`` hooks to control bookmark + movement we recommend you migrate them to ``txnclose-bookmark`` and + ``pretxnclose-bookmark``. + ``compressionengines`` List of compression engines and their relative priority to advertise to clients. _______________________________________________ Mercurial-devel mailing list Mercurial-devel@mercurial-scm.org https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel