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.
--- a/mercurial/obsolete.py Mon Aug 18 17:06:08 2014 -0700
+++ b/mercurial/obsolete.py Mon Aug 18 16:28:44 2014 -0700
@@ -173,9 +173,28 @@
date = util.parsedate(decodemeta(metadata).pop('date', '0 0'))
except util.Abort:
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:
+ try:
+ parents = tuple(node.bin(p) for p in parents)
+ # if parent content is not a nodeid, drop the data
+ for p in parents:
+ if len(p) != 20:
+ parents = None
+ break
+ except TypeError:
+ # if content cannot be translated to nodeid drop the data.
+ parents = None
+
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.
@@ -371,6 +390,12 @@
pre, sucs, flags, metadata, date, parents = marker
metadata = decodemeta(metadata)
metadata['date'] = '%d %i' % date
+ if parents is not None:
+ if not parents:
+ # mark that 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)