# HG changeset patch # User Stanislau Hlebik <st...@fb.com> # Date 1478980606 28800 # Sat Nov 12 11:56:46 2016 -0800 # Branch stable # Node ID f8a24164d9190f457ff5cd5089b8879c71ec801f # Parent 745156544137985fe5c6b31fe99232e84d596ec4 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) + +@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) _______________________________________________ Mercurial-devel mailing list Mercurial-devel@mercurial-scm.org https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel