Comments
Patch
@@ -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,35 @@
cache.write()
op.ui.debug('applied %i hgtags fnodes cache entries\n' % count)
+
+@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 = bookmod.decodebookmarks(inpart.read())
+ 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)