mercurial/wireprotov2server.py
changeset 39634 9dffa99f9158
parent 39632 c1aacb0d76ff
child 39636 399ddd3227a4
--- a/mercurial/wireprotov2server.py	Wed Sep 12 10:01:58 2018 -0700
+++ b/mercurial/wireprotov2server.py	Thu Aug 23 18:14:19 2018 -0700
@@ -533,6 +533,10 @@
                 b'phase': b'public' if publishing else repo[node].phasestr()
             }
 
+    nodebookmarks = {}
+    for mark, node in repo._bookmarks.items():
+        nodebookmarks.setdefault(node, set()).add(mark)
+
     # It is already topologically sorted by revision number.
     for node in outgoing:
         d = {
@@ -549,6 +553,10 @@
                 ctx = repo[node]
                 d[b'phase'] = ctx.phasestr()
 
+        if b'bookmarks' in fields and node in nodebookmarks:
+            d[b'bookmarks'] = sorted(nodebookmarks[node])
+            del nodebookmarks[node]
+
         revisiondata = None
 
         if b'revision' in fields:
@@ -560,6 +568,15 @@
         if revisiondata is not None:
             yield revisiondata
 
+    # If requested, send bookmarks from nodes that didn't have revision
+    # data sent so receiver is aware of any bookmark updates.
+    if b'bookmarks' in fields:
+        for node, marks in sorted(nodebookmarks.iteritems()):
+            yield {
+                b'node': node,
+                b'bookmarks': sorted(marks),
+            }
+
 @wireprotocommand('heads',
                   args={
                       'publiconly': False,