[PATCH 5 of 7] obsstore: also store the 'parents' field on disk

Pierre-Yves David pierre-yves.david at ens-lyon.org
Mon Aug 18 19:49:35 CDT 2014


# HG changeset patch
# User Pierre-Yves David <pierre-yves.david at fb.com>
# Date 1408404524 25200
#      Mon Aug 18 16:28:44 2014 -0700
# Node ID bfa06f4858e3e088f84df0cda1ad78bbe9a01132
# Parent  793dd98326b070cb43804c3141e6053dc37c386e
obsstore: also store the 'parents' field on disk

We now store the `parents` field on disk. We use the same strategy as for
`date`: We stick it into the metadata. This is slow and dirty, but this is also
the only way we currently have.

At some point we'll have a new obsstore format to store this properly.

diff --git a/mercurial/obsolete.py b/mercurial/obsolete.py
--- a/mercurial/obsolete.py
+++ b/mercurial/obsolete.py
@@ -168,13 +168,22 @@ def _readmarkers(data):
                                'short, %d bytes expected, got %d')
                              % (mdsize, len(metadata)))
         off += mdsize
         meta = decodemeta(metadata)
         date = util.parsedate(meta.pop('date', '0 0'))
+        parents = None
+        if 'p2' in meta:
+            parents = (meta.pop('p1', None), meta.pop('p2', None))
+        elif 'p1' in meta:
+            parents = (meta.pop('p1', None),)
+        elif 'p0' in meta:
+            parents = ()
+        if parents is not None:
+            parents = tuple(node.bin(p) for p in parents)
         metadata = encodemeta(meta)
 
-        yield (pre, sucs, flags, metadata, date, None)
+        yield (pre, sucs, flags, metadata, date, parents)
 
 def encodemeta(meta):
     """Return encoded metadata string to string mapping.
 
     Assume no ':' in key and no '\0' in both key and value."""
@@ -359,10 +368,16 @@ def _encodemarkers(markers, addheader=Fa
 
 def _encodeonemarker(marker):
     pre, sucs, flags, metadata, date, parents = marker
     metadata = decodemeta(metadata)
     metadata['date'] = '%d %i' % date
+    if parents is not None:
+        if not parents:
+            # marks we explicitly recorded no parents.
+            metadata['p0'] = ''
+        for i, p in enumerate(parents, 1):
+            metadata['p%i' % i] = node.hex(p)
     metadata = encodemeta(metadata)
     nbsuc = len(sucs)
     format = _fmfixed + (_fmnode * nbsuc)
     data = [nbsuc, len(metadata), flags, pre]
     data.extend(sucs)


More information about the Mercurial-devel mailing list