--- 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,