mercurial/utils/storageutil.py
changeset 39878 3e896b51aa5d
parent 39877 f8eb71f9e3bd
child 39879 d269ddbf54f0
--- a/mercurial/utils/storageutil.py	Mon Sep 24 14:23:54 2018 -0700
+++ b/mercurial/utils/storageutil.py	Mon Sep 24 14:31:31 2018 -0700
@@ -8,6 +8,7 @@
 from __future__ import absolute_import
 
 import hashlib
+import re
 
 from ..node import (
     nullid,
@@ -39,3 +40,28 @@
         s.update(b)
     s.update(text)
     return s.digest()
+
+METADATA_RE = re.compile(b'\x01\n')
+
+def parsemeta(text):
+    """Parse metadata header from revision data.
+
+    Returns a 2-tuple of (metadata, offset), where both can be None if there
+    is no metadata.
+    """
+    # text can be buffer, so we can't use .startswith or .index
+    if text[:2] != b'\x01\n':
+        return None, None
+    s = METADATA_RE.search(text, 2).start()
+    mtext = text[2:s]
+    meta = {}
+    for l in mtext.splitlines():
+        k, v = l.split(b': ', 1)
+        meta[k] = v
+    return meta, s + 2
+
+def packmeta(meta, text):
+    """Add metadata to fulltext to produce revision text."""
+    keys = sorted(meta)
+    metatext = b''.join(b'%s: %s\n' % (k, meta[k]) for k in keys)
+    return b'\x01\n%s\x01\n%s' % (metatext, text)