diff -r b9e453d683a1 -r c1aacb0d76ff mercurial/wireprotov2server.py --- a/mercurial/wireprotov2server.py Wed Sep 12 10:01:36 2018 -0700 +++ b/mercurial/wireprotov2server.py Tue Aug 28 18:19:23 2018 -0700 @@ -511,6 +511,7 @@ # list. seen.clear() + publishing = repo.publishing() if outgoing: repo.hook('preoutgoing', throw=True, source='serve') @@ -519,6 +520,19 @@ b'totalitems': len(outgoing), } + # The phases of nodes already transferred to the client may have changed + # since the client last requested data. We send phase-only records + # for these revisions, if requested. + if b'phase' in fields and noderange is not None: + # TODO skip nodes whose phase will be reflected by a node in the + # outgoing set. This is purely an optimization to reduce data + # size. + for node in noderange[0]: + yield { + b'node': node, + b'phase': b'public' if publishing else repo[node].phasestr() + } + # It is already topologically sorted by revision number. for node in outgoing: d = { @@ -528,6 +542,13 @@ if b'parents' in fields: d[b'parents'] = cl.parents(node) + if b'phase' in fields: + if publishing: + d[b'phase'] = b'public' + else: + ctx = repo[node] + d[b'phase'] = ctx.phasestr() + revisiondata = None if b'revision' in fields: