bundle2: extract logic for seeking bundle2 part into own class
Currently, unbundlepart classes support bi-directional seeking.
Most consumers of unbundlepart only ever seek forward - typically
as part of moving to the end of the bundle part so they can move
on to the next one. But regardless of the actual usage of the
part, instances maintain an index mapping offsets within the
underlying raw payload to offsets within the decoded payload.
Maintaining the mapping of offset data can be expensive in terms of
memory use. Furthermore, many bundle2 consumers don't have access
to an underlying seekable stream. This includes all compressed
bundles. So maintaining offset data when the underlying stream
can't be seeked anyway is wasteful. And since many bundle2 streams
can't be seeked, it seems like a bad idea to expose a seek API
in bundle2 parts by default. If you provide them, people will
attempt to use them.
Seekable bundle2 parts should be the exception, not the rule. This
commit starts the process dividing unbundlepart into 2 classes: a
base class that supports linear, one-time reads and a child class
that supports bi-directional seeking. In this first commit, we
split various methods and attributes out into a new
"seekableunbundlepart" class. Previous instantiators of "unbundlepart"
now instantiate "seekableunbundlepart." This preserves backwards
compatibility. The coupling between the classes is still tight:
"unbundlepart" cannot be used on its own. This will be addressed
in subsequent commits.
Differential Revision: https://phab.mercurial-scm.org/D1386
$ hg debugextensions
$ debugpath=`pwd`/extwithoutinfos.py
$ cat > extwithoutinfos.py <<EOF
> EOF
$ cat > extwithinfos.py <<EOF
> testedwith = '3.0 3.1 3.2.1'
> buglink = 'https://example.org/bts'
> EOF
$ cat >> $HGRCPATH <<EOF
> [extensions]
> histedit=
> patchbomb=
> rebase=
> mq=
> ext1 = $debugpath
> ext2 = `pwd`/extwithinfos.py
> EOF
$ hg debugextensions
ext1 (untested!)
ext2 (3.2.1!)
histedit
mq
patchbomb
rebase
$ hg debugextensions -v
ext1
location: */extwithoutinfos.py* (glob)
bundled: no
ext2
location: */extwithinfos.py* (glob)
bundled: no
tested with: 3.0 3.1 3.2.1
bug reporting: https://example.org/bts
histedit
location: */hgext/histedit.py* (glob)
bundled: yes
mq
location: */hgext/mq.py* (glob)
bundled: yes
patchbomb
location: */hgext/patchbomb.py* (glob)
bundled: yes
rebase
location: */hgext/rebase.py* (glob)
bundled: yes
$ hg debugextensions -Tjson | sed 's|\\\\|/|g'
[
{
"buglink": "",
"bundled": false,
"name": "ext1",
"source": "*/extwithoutinfos.py*", (glob)
"testedwith": []
},
{
"buglink": "https://example.org/bts",
"bundled": false,
"name": "ext2",
"source": "*/extwithinfos.py*", (glob)
"testedwith": ["3.0", "3.1", "3.2.1"]
},
{
"buglink": "",
"bundled": true,
"name": "histedit",
"source": "*/hgext/histedit.py*", (glob)
"testedwith": []
},
{
"buglink": "",
"bundled": true,
"name": "mq",
"source": "*/hgext/mq.py*", (glob)
"testedwith": []
},
{
"buglink": "",
"bundled": true,
"name": "patchbomb",
"source": "*/hgext/patchbomb.py*", (glob)
"testedwith": []
},
{
"buglink": "",
"bundled": true,
"name": "rebase",
"source": "*/hgext/rebase.py*", (glob)
"testedwith": []
}
]
$ hg debugextensions -T '{ifcontains("3.1", testedwith, "{name}\n")}'
ext2
$ hg debugextensions \
> -T '{ifcontains("3.2", testedwith, "no substring match: {name}\n")}'