# HG changeset patch # User Pierre-Yves David # Date 2014-08-18 23:28:44 # Node ID cf414981978a53d2d9a38bbb971bddd3c9a2ba14 # Parent 4bc96685a40c889d0a3c30931d642bc34e51120b 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 @@ -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)