[PATCH 10 of 10 V2] util: remove compressorobj API from compression engines
Augie Fackler
raf at durin42.com
Thu Nov 10 10:55:17 EST 2016
On Wed, Nov 09, 2016 at 03:48:39PM -0800, Gregory Szorc wrote:
> On Wed, Nov 9, 2016 at 9:35 AM, Augie Fackler <raf at durin42.com> wrote:
>
> > On Mon, Nov 07, 2016 at 07:13:58PM -0800, Gregory Szorc wrote:
> > > # HG changeset patch
> > > # User Gregory Szorc <gregory.szorc at gmail.com>
> > > # Date 1478573874 28800
> > > # Mon Nov 07 18:57:54 2016 -0800
> > > # Node ID 6755052bb245a2fbf30a22c8b4cf5599441fabfb
> > > # Parent 8e2ca8bfa2d0f7c02b6f58b36341b4c4cf7ec0f9
> > > util: remove compressorobj API from compression engines
> >
> > I like it. Let's chat some about the interface defined in patch 1
> > (class scope invites questions, and none of those instances actually
> > use the self attribute so I'd like to try and get things demoted to
> > module level unless there's a compelling reason), and then get this
> > landed. Thanks!
> >
>
> It was originally less heavyweight and Pierre-Yves's review feedback
> steered me towards the current implementation...
>
> I agree the classes are essentially singletons and don't provide much
> value. But no matter how you slice it, you need a way to hold references to
> a collection of functions for a particular engine. That's, uh, what a class
> is for. I suppose we could pass function "pointers" to a class's __init__
> and have it populate attributes. But the base class with stub methods does
> provide some safety and an obvious place to document the API. And the final
> result would probably have the same external API, just N instances of a 1
> class instead of 1 instances of N classes.
>
> FWIW, I anticipate the zstd engine will need "self" storage. This is to
> facilitate C vs CFFI and lazy module importing and possibly caching of
> certain objects to facilitate faster revlog operations.
If the zstd thing will need self-storage in an instance, then I'm okay
to take this as-is and clean it up to be less classy if we end up not
needing it.
>
> I'm not opposed to rewriting the engine definition/registration code. But
> at this point I'd prefer to get *something* in place to unblock zstd work.
> We can always refine later. It's not like we have to commit to a BC API :)
> > All callers have been replaced with "compressstream." It is quite
> > low-level and redundant with "compressstream." So eliminate it.
> >
> > diff --git a/mercurial/util.py b/mercurial/util.py
> > --- a/mercurial/util.py
> > +++ b/mercurial/util.py
> > @@ -2966,7 +2966,7 @@ class compressionengine(object):
> > exclude the name from external usage, set the first element to
> ``None``.
> >
> > If bundle compression is supported, the class must also implement
> > - ``compressstream``, ``compressorobj`` and `decompressorreader``.
> > + ``compressstream`` and `decompressorreader``.
> > """
> > return None
> >
> > @@ -2982,14 +2982,6 @@ class compressionengine(object):
> > """
> > raise NotImplementedError()
> >
> > - def compressorobj(self):
> > - """(Temporary) Obtain an object used for compression.
> > -
> > - The returned object has ``compress(data)`` and ``flush()``
> methods.
> > - These are used to incrementally feed data chunks into a
> compressor.
> > - """
> > - raise NotImplementedError()
> > -
> > def decompressorreader(self, fh):
> > """Perform decompression on a file object.
> >
> > @@ -3006,9 +2998,6 @@ class _zlibengine(compressionengine):
> > def bundletype(self):
> > return 'gzip', 'GZ'
> >
> > - def compressorobj(self):
> > - return zlib.compressobj()
> > -
> > def compressstream(self, it, opts=None):
> > opts = opts or {}
> >
> > @@ -3039,9 +3028,6 @@ class _bz2engine(compressionengine):
> > def bundletype(self):
> > return 'bzip2', 'BZ'
> >
> > - def compressorobj(self):
> > - return bz2.BZ2Compressor()
> > -
> > def compressstream(self, it, opts=None):
> > opts = opts or {}
> > z = bz2.BZ2Compressor(opts.get('level', 9))
> > @@ -3069,7 +3055,7 @@ class _truncatedbz2engine(compressioneng
> > def bundletype(self):
> > return None, '_truncatedBZ'
> >
> > - # We don't implement compressorobj because it is hackily handled
> elsewhere.
> > + # We don't implement compressstream because it is hackily handled
> elsewhere.
> >
> > def decompressorreader(self, fh):
> > def gen():
> > @@ -3083,13 +3069,6 @@ class _truncatedbz2engine(compressioneng
> >
> > compengines.register(_truncatedbz2engine())
> >
> > -class nocompress(object):
> > - def compress(self, x):
> > - return x
> > -
> > - def flush(self):
> > - return ''
> > -
> > class _noopengine(compressionengine):
> > def name(self):
> > return 'none'
> > @@ -3097,9 +3076,6 @@ class _noopengine(compressionengine):
> > def bundletype(self):
> > return 'none', 'UN'
> >
> > - def compressorobj(self):
> > - return nocompress()
> > -
> > def compressstream(self, it, opts=None):
> > return it
> >
>
> > > _______________________________________________
> > > Mercurial-devel mailing list
> > > Mercurial-devel at mercurial-scm.org
> > > https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel
> >
More information about the Mercurial-devel
mailing list