mirror of
https://github.com/facebook/sapling.git
synced 2024-10-07 23:38:50 +03:00
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.
This commit is contained in:
parent
41733331bc
commit
fd1f0f7321
@ -173,9 +173,28 @@ def _readmarkers(data):
|
||||
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 @@ 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:
|
||||
# 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)
|
||||
|
Loading…
Reference in New Issue
Block a user