diff -r f8eb71f9e3bd -r 3e896b51aa5d mercurial/utils/storageutil.py --- 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)