D4754: storageutil: move metadata parsing and packing from revlog (API)

indygreg (Gregory Szorc) phabricator at mercurial-scm.org
Wed Sep 26 17:13:23 EDT 2018


This revision was automatically updated to reflect the committed changes.
Closed by commit rHGa6c5a9f36716: storageutil: move metadata parsing and packing from revlog (API) (authored by indygreg, committed by ).

REPOSITORY
  rHG Mercurial

CHANGES SINCE LAST UPDATE
  https://phab.mercurial-scm.org/D4754?vs=11409&id=11430

REVISION DETAIL
  https://phab.mercurial-scm.org/D4754

AFFECTED FILES
  hgext/lfs/wrapper.py
  mercurial/filelog.py
  mercurial/revlog.py
  mercurial/testing/storage.py
  mercurial/utils/storageutil.py
  tests/simplestorerepo.py

CHANGE DETAILS

diff --git a/tests/simplestorerepo.py b/tests/simplestorerepo.py
--- a/tests/simplestorerepo.py
+++ b/tests/simplestorerepo.py
@@ -326,7 +326,7 @@
             return False
 
         fulltext = self.revision(node)
-        m = revlog.parsemeta(fulltext)[0]
+        m = storageutil.parsemeta(fulltext)[0]
 
         if m and 'copy' in m:
             return m['copy'], bin(m['copyrev'])
@@ -411,7 +411,7 @@
 
     def add(self, text, meta, transaction, linkrev, p1, p2):
         if meta or text.startswith(b'\1\n'):
-            text = revlog.packmeta(meta, text)
+            text = storageutil.packmeta(meta, text)
 
         return self.addrevision(text, transaction, linkrev, p1, p2)
 
diff --git a/mercurial/utils/storageutil.py b/mercurial/utils/storageutil.py
--- a/mercurial/utils/storageutil.py
+++ b/mercurial/utils/storageutil.py
@@ -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)
diff --git a/mercurial/testing/storage.py b/mercurial/testing/storage.py
--- a/mercurial/testing/storage.py
+++ b/mercurial/testing/storage.py
@@ -19,6 +19,9 @@
     mdiff,
     revlog,
 )
+from ..utils import (
+    storageutil,
+)
 
 class basetestcase(unittest.TestCase):
     if not getattr(unittest.TestCase, r'assertRaisesRegex', False):
@@ -880,7 +883,7 @@
     def testcensored(self):
         f = self._makefilefn()
 
-        stored1 = revlog.packmeta({
+        stored1 = storageutil.packmeta({
             b'censored': b'tombstone',
         }, b'')
 
diff --git a/mercurial/revlog.py b/mercurial/revlog.py
--- a/mercurial/revlog.py
+++ b/mercurial/revlog.py
@@ -17,7 +17,6 @@
 import contextlib
 import errno
 import os
-import re
 import struct
 import zlib
 
@@ -127,27 +126,8 @@
     ellipsisrawprocessor,
 )
 
-_mdre = re.compile('\1\n')
-def parsemeta(text):
-    """return (metadatadict, metadatasize)"""
-    # text can be buffer, so we can't use .startswith or .index
-    if text[:2] != '\1\n':
-        return None, None
-    s = _mdre.search(text, 2).start()
-    mtext = text[2:s]
-    meta = {}
-    for l in mtext.splitlines():
-        k, v = l.split(": ", 1)
-        meta[k] = v
-    return meta, (s + 2)
-
-def packmeta(meta, text):
-    keys = sorted(meta)
-    metatext = "".join("%s: %s\n" % (k, meta[k]) for k in keys)
-    return "\1\n%s\1\n%s" % (metatext, text)
-
 def _censoredtext(text):
-    m, offs = parsemeta(text)
+    m, offs = storageutil.parsemeta(text)
     return m and "censored" in m
 
 def addflagprocessor(flag, processor):
@@ -2516,7 +2496,7 @@
                                     self.version)
 
         rev = self.rev(node)
-        tombstone = packmeta({b'censored': tombstone}, b'')
+        tombstone = storageutil.packmeta({b'censored': tombstone}, b'')
 
         if len(tombstone) > self.rawsize(rev):
             raise error.Abort(_('censor tombstone must be no longer than '
diff --git a/mercurial/filelog.py b/mercurial/filelog.py
--- a/mercurial/filelog.py
+++ b/mercurial/filelog.py
@@ -14,6 +14,7 @@
 )
 from .utils import (
     interfaceutil,
+    storageutil,
 )
 
 @interfaceutil.implementer(repository.ifilestorage)
@@ -120,14 +121,14 @@
 
     def add(self, text, meta, transaction, link, p1=None, p2=None):
         if meta or text.startswith('\1\n'):
-            text = revlog.packmeta(meta, text)
+            text = storageutil.packmeta(meta, text)
         return self.addrevision(text, transaction, link, p1, p2)
 
     def renamed(self, node):
         if self.parents(node)[0] != revlog.nullid:
             return False
         t = self.revision(node)
-        m = revlog.parsemeta(t)[0]
+        m = storageutil.parsemeta(t)[0]
         # copy and copyrev occur in pairs. In rare cases due to bugs,
         # one can occur without the other.
         if m and "copy" in m and "copyrev" in m:
diff --git a/hgext/lfs/wrapper.py b/hgext/lfs/wrapper.py
--- a/hgext/lfs/wrapper.py
+++ b/hgext/lfs/wrapper.py
@@ -20,6 +20,7 @@
 )
 
 from mercurial.utils import (
+    storageutil,
     stringutil,
 )
 
@@ -76,13 +77,13 @@
             name = k[len('x-hg-'):]
             hgmeta[name] = p[k]
     if hgmeta or text.startswith('\1\n'):
-        text = revlog.packmeta(hgmeta, text)
+        text = storageutil.packmeta(hgmeta, text)
 
     return (text, True)
 
 def writetostore(self, text):
     # hg filelog metadata (includes rename, etc)
-    hgmeta, offset = revlog.parsemeta(text)
+    hgmeta, offset = storageutil.parsemeta(text)
     if offset and offset > 0:
         # lfs blob does not contain hg filelog metadata
         text = text[offset:]
@@ -132,7 +133,7 @@
     if lfstrack:
         textlen = len(text)
         # exclude hg rename meta from file size
-        meta, offset = revlog.parsemeta(text)
+        meta, offset = storageutil.parsemeta(text)
         if offset:
             textlen -= offset
 



To: indygreg, #hg-reviewers
Cc: mercurial-devel


More information about the Mercurial-devel mailing list