[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