Mercurial > hg
view mercurial/rcutil.py @ 35112:073eec083e25
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
author | Gregory Szorc <gregory.szorc@gmail.com> |
---|---|
date | Mon, 13 Nov 2017 19:22:11 -0800 |
parents | 75979c8d4572 |
children | edbcf5b239f9 |
line wrap: on
line source
# rcutil.py - utilities about config paths, special config sections etc. # # Copyright Mercurial Contributors # # This software may be used and distributed according to the terms of the # GNU General Public License version 2 or any later version. from __future__ import absolute_import import os from . import ( encoding, pycompat, util, ) if pycompat.iswindows: from . import scmwindows as scmplatform else: from . import scmposix as scmplatform fallbackpager = scmplatform.fallbackpager systemrcpath = scmplatform.systemrcpath userrcpath = scmplatform.userrcpath def _expandrcpath(path): '''path could be a file or a directory. return a list of file paths''' p = util.expandpath(path) if os.path.isdir(p): join = os.path.join return [join(p, f) for f, k in util.listdir(p) if f.endswith('.rc')] return [p] def envrcitems(env=None): '''Return [(section, name, value, source)] config items. The config items are extracted from environment variables specified by env, used to override systemrc, but not userrc. If env is not provided, encoding.environ will be used. ''' if env is None: env = encoding.environ checklist = [ ('EDITOR', 'ui', 'editor'), ('VISUAL', 'ui', 'editor'), ('PAGER', 'pager', 'pager'), ] result = [] for envname, section, configname in checklist: if envname not in env: continue result.append((section, configname, env[envname], '$%s' % envname)) return result def defaultrcpath(): '''return rc paths in default.d''' path = [] defaultpath = os.path.join(util.datapath, 'default.d') if os.path.isdir(defaultpath): path = _expandrcpath(defaultpath) return path def rccomponents(): '''return an ordered [(type, obj)] about where to load configs. respect $HGRCPATH. if $HGRCPATH is empty, only .hg/hgrc of current repo is used. if $HGRCPATH is not set, the platform default will be used. if a directory is provided, *.rc files under it will be used. type could be either 'path' or 'items', if type is 'path', obj is a string, and is the config file path. if type is 'items', obj is a list of (section, name, value, source) that should fill the config directly. ''' envrc = ('items', envrcitems()) if 'HGRCPATH' in encoding.environ: # assume HGRCPATH is all about user configs so environments can be # overridden. _rccomponents = [envrc] for p in encoding.environ['HGRCPATH'].split(pycompat.ospathsep): if not p: continue _rccomponents.extend(('path', p) for p in _expandrcpath(p)) else: normpaths = lambda paths: [('path', os.path.normpath(p)) for p in paths] _rccomponents = normpaths(defaultrcpath() + systemrcpath()) _rccomponents.append(envrc) _rccomponents.extend(normpaths(userrcpath())) return _rccomponents def defaultpagerenv(): '''return a dict of default environment variables and their values, intended to be set before starting a pager. ''' return {'LESS': 'FRX', 'LV': '-c'}