diff mercurial/phases.py @ 34326:5779d096a696

phases: move binary encoding into a reusable function We want to use binary phases for pushing and pulling. We extract the encoding function out of the bundle2 module first.
author Boris Feld <boris.feld@octobus.net>
date Tue, 19 Sep 2017 22:01:31 +0200
parents 57a017f79e96
children 12c42bcd4133
line wrap: on
line diff
--- a/mercurial/phases.py	Tue Sep 19 22:08:09 2017 +0200
+++ b/mercurial/phases.py	Tue Sep 19 22:01:31 2017 +0200
@@ -103,6 +103,7 @@
 from __future__ import absolute_import
 
 import errno
+import struct
 
 from .i18n import _
 from .node import (
@@ -119,6 +120,8 @@
     util,
 )
 
+_fphasesentry = struct.Struct('>i20s')
+
 allphases = public, draft, secret = range(3)
 trackedphases = allphases[1:]
 phasenames = ['public', 'draft', 'secret']
@@ -154,6 +157,18 @@
         dirty = True
     return roots, dirty
 
+def binaryencode(phasemapping):
+    """encode a 'phase -> nodes' mapping into a binary stream
+
+    Since phases are integer the mapping is actually a python list:
+    [[PUBLIC_HEADS], [DRAFTS_HEADS], [SECRET_HEADS]]
+    """
+    binarydata = []
+    for phase, nodes in enumerate(phasemapping):
+        for head in nodes:
+            binarydata.append(_fphasesentry.pack(phase, head))
+    return ''.join(binarydata)
+
 def _trackphasechange(data, rev, old, new):
     """add a phase move the <data> dictionnary