# HG changeset patch # User Pierre-Yves David # Date 1408976161 -7200 # Node ID b130b241718e64bbd05a2961188be9955d077f2c # Parent e74f8a65252d4f9016a6cbe84296374dd178bb3b obsolete: support for any known obsstore format when reading or writing We can now read and write any known format. The list of known formats currently has one element (0). The obsstore itself is not aware of multiple formats yet and always uses format 0. diff -r e74f8a65252d -r b130b241718e mercurial/obsolete.py --- a/mercurial/obsolete.py Mon Aug 25 16:09:18 2014 +0200 +++ b/mercurial/obsolete.py Mon Aug 25 16:16:01 2014 +0200 @@ -142,10 +142,10 @@ off = 0 diskversion = _unpack('>B', data[off:off + 1])[0] off += 1 - if diskversion != _fm0version: + if diskversion not in formats: raise util.Abort(_('parsing obsolete marker: unknown version %r') % diskversion) - return _fm0readmarkers(data, off) + return formats[diskversion][0](data, off) def _fm0readmarkers(data, off=0): """Read and enumerate markers from raw data in format version 0""" @@ -217,6 +217,10 @@ data.extend(sucs) return _pack(format, *data) + metadata +# mapping to read/write various marker formats +# -> (decoder, encoder) +formats = {0: (_fm0readmarkers, _fm0encodeonemarker)} + def encodemeta(meta): """Return encoded metadata string to string mapping. @@ -438,13 +442,14 @@ seennodes |= pendingnodes return seenmarkers -def _encodemarkers(markers, addheader=False): +def _encodemarkers(markers, addheader=False, version=_fm0version): # Kept separate from flushmarkers(), it will be reused for # markers exchange. + encodeone = formats[version][1] if addheader: yield _pack('>B', _fm0version) for marker in markers: - yield _fm0encodeonemarker(marker) + yield encodeone(marker) # arbitrary picked to fit into 8K limit from HTTP server