[PATCH 06 of 10 V9] bundle2: add `bookmarks` part handler
Stanislau Hlebik
stash at fb.com
Sun Nov 13 05:30:17 EST 2016
# HG changeset patch
# User Stanislau Hlebik <stash at fb.com>
# Date 1479032456 28800
# Sun Nov 13 02:20:56 2016 -0800
# Branch stable
# Node ID bf21586f26e5a41f7d8bf342d4b4c16d71dbc6d2
# Parent 5cdf21805bb97ba99199c8779e3ad91137061c07
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,21 @@
* a way to construct a bundle response when applicable.
"""
- def __init__(self, repo, transactiongetter, captureoutput=True):
+ def __init__(self, repo, transactiongetter, captureoutput=True,
+ input=None):
+ """
+ `input` 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
+ if input is None:
+ input = {}
+ self.input = input
class TransactionUnavailable(RuntimeError):
pass
@@ -1624,3 +1633,32 @@
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.input.get('processbookmarksmode', 'ignore')
+ if processbookmarksmode == 'apply':
+ for bookmark, node in bookmarks.items():
+ if node:
+ op.repo._bookmarks[bookmark] = node
+ else:
+ del op.repo._bookmarks[bookmark]
+ op.repo._bookmarks.recordchange(op.gettransaction())
+ elif processbookmarksmode == 'diverge':
+ remotepath = op.input.get('remotepath', '')
+ explicitbookmarks = op.input.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