Patchwork [06,of,10,V8] bundle2: add `bookmarks` part handler

login
register
mail settings
Submitter Stanislau Hlebik
Date Nov. 12, 2016, 8:19 p.m.
Message ID <f8a24164d9190f457ff5.1478981996@dev1918.lla1.facebook.com>
Download mbox | patch
Permalink /patch/17520/
State Superseded
Headers show

Comments

Stanislau Hlebik - Nov. 12, 2016, 8:19 p.m.
# HG changeset patch
# User Stanislau Hlebik <stash@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).

Patch

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)