[PATCH 1 of 8] obsolete: introduction of obsolete markers
Augie Fackler
raf at durin42.com
Wed Jun 13 10:06:17 CDT 2012
On Jun 7, 2012, at 1:24 PM, pierre-yves.david at logilab.fr wrote:
> # HG changeset patch
> # User Pierre-Yves.David at ens-lyon.org
> # Date 1339088859 -7200
> # Node ID 83d66f9957e9f73404c2c776fc3dbe5dce1c18e8
> # Parent 2255950e1f7663a9faa6b57040cc5c0debe7d4dd
> obsolete: introduction of obsolete markers
> diff --git a/mercurial/obsolete.py b/mercurial/obsolete.py
> new file mode 100644
> --- /dev/null
> +++ b/mercurial/obsolete.py
> @@ -0,0 +1,175 @@
> +- M bytes: metadata as a sequence of nul-terminated strings. Each
> + string contains a key and a value, separated by a color ':', without
s/color/colon/
> + additional encoding. Keys cannot contain '\0' or ':' and values
> + cannot contain '\0'.
> +"""
> +import struct
> +from mercurial import util
> +from i18n import _
> +
> +_pack = struct.pack
> +_unpack = struct.unpack
> +
> +
> +
> +# data used for parsing and writing
> +_fmversion = 0
> +_fmfixed = '>BIB20s'
> +_fmnode = '20s'
> +_fmfsize = struct.calcsize(_fmfixed)
> +_fnodesize = struct.calcsize(_fmnode)
> +
> +def _readmarkers(data):
> + """Read and enumerate markers from raw data"""
> + off = 0
> + diskversion = _unpack('>B', data[off:off + 1])[0]
> + off += 1
> + if diskversion != _fmversion:
> + raise util.Abort(_('parsing obsolete marker: unknown version %r')
why %r here instead of %d?
> + % diskversion)
> + def add(self, marker):
> + """Add a new marker to the store
> +
> + This marker still needs to be written to disk"""
I'd love it if this docstring would mention the format of the marker.
> + self._new.append(marker)
> + self._load(marker)
> +
> + def loadmarkers(self, data):
> + """Load all markers in data, mark them as known."""
> + for marker in _readmarkers(data):
> + self._load(marker)
> +
> + def flushmarkers(self, stream):
> + """Write all markers to a stream
> +
> + After this operation, "new" markers are considered "known"."""
> + self._writemarkers(stream)
> + self._new[:] = []
> +
> + def _load(self, marker):
> + self._all.append(marker)
> + pre, sucs = marker[:2]
> + self.precursors.setdefault(pre, set()).add(marker)
> + for suc in sucs:
> + self.successors.setdefault(suc, set()).add(marker)
> +
> + def _writemarkers(self, stream):
> + # Kept separate from flushmarkers(), it will be reused for
> + # markers exchange.
> + stream.write(_pack('>B', _fmversion))
> + for marker in self._all:
> + pre, sucs, flags, metadata = marker
> + nbsuc = len(sucs)
> + format = _fmfixed + (_fmnode * nbsuc)
> + data = [nbsuc, len(metadata), flags, pre]
> + data.extend(sucs)
> + stream.write(_pack(format, *data))
> + stream.write(metadata)
> _______________________________________________
> Mercurial-devel mailing list
> Mercurial-devel at selenic.com
> http://selenic.com/mailman/listinfo/mercurial-devel
More information about the Mercurial-devel
mailing list