[PATCH 06 of 10 V10] bundle2: add `bookmarks` part handler
Stanislau Hlebik
stash at fb.com
Sun Nov 20 12:13:59 UTC 2016
# HG changeset patch
# User Stanislau Hlebik <stash at fb.com>
# Date 1479643450 28800
# Sun Nov 20 04:04:10 2016 -0800
# Node ID 866281dae2407308c19c7c3109bb5501b940ee67
# Parent 57d7f92db34461da87850e26d831d2d235282356
bundle2: add `bookmarks` part handler
Applies bookmarks part to the local repo. `processbookmarksmode` determines
how remote bookmarks are handled. They are either ignored ('ignore' mode),
diverged ('diverge' mode) or applied ('apply' mode).
diff --git a/mercurial/bundle2.py b/mercurial/bundle2.py
--- a/mercurial/bundle2.py
+++ b/mercurial/bundle2.py
@@ -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,36 @@
cache.write()
op.ui.debug('applied %i hgtags fnodes cache entries\n' % count)
+
+ at 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 = {}
+ 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)
More information about the Mercurial-devel
mailing list