rcutil.py
119 lines
| 3.6 KiB
| text/x-python
|
PythonLexer
/ mercurial / rcutil.py
Jun Wu
|
r31679 | # 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. | ||||
Matt Harbison
|
r52756 | from __future__ import annotations | ||
Jun Wu
|
r31679 | |||
import os | ||||
from . import ( | ||||
encoding, | ||||
pycompat, | ||||
util, | ||||
) | ||||
Martin von Zweigbergk
|
r44070 | from .utils import resourceutil | ||
Jun Wu
|
r34646 | if pycompat.iswindows: | ||
Jun Wu
|
r31679 | from . import scmwindows as scmplatform | ||
else: | ||||
from . import scmposix as scmplatform | ||||
Yuya Nishihara
|
r32078 | fallbackpager = scmplatform.fallbackpager | ||
Jun Wu
|
r31679 | systemrcpath = scmplatform.systemrcpath | ||
userrcpath = scmplatform.userrcpath | ||||
Augie Fackler
|
r43345 | |||
Jun Wu
|
r31681 | 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 | ||||
Augie Fackler
|
r43345 | return sorted( | ||
Augie Fackler
|
r43347 | join(p, f) for f, k in util.listdir(p) if f.endswith(b'.rc') | ||
Augie Fackler
|
r43345 | ) | ||
Jun Wu
|
r31681 | return [p] | ||
Augie Fackler
|
r43345 | |||
Jun Wu
|
r31684 | def envrcitems(env=None): | ||
Augie Fackler
|
r46554 | """Return [(section, name, value, source)] config items. | ||
Jun Wu
|
r31684 | |||
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. | ||||
Augie Fackler
|
r46554 | """ | ||
Jun Wu
|
r31684 | if env is None: | ||
env = encoding.environ | ||||
checklist = [ | ||||
Augie Fackler
|
r43347 | (b'EDITOR', b'ui', b'editor'), | ||
(b'VISUAL', b'ui', b'editor'), | ||||
(b'PAGER', b'pager', b'pager'), | ||||
Jun Wu
|
r31684 | ] | ||
result = [] | ||||
for envname, section, configname in checklist: | ||||
if envname not in env: | ||||
continue | ||||
Augie Fackler
|
r43347 | result.append((section, configname, env[envname], b'$%s' % envname)) | ||
Jun Wu
|
r31684 | return result | ||
Augie Fackler
|
r43345 | |||
Matt Harbison
|
r44483 | def default_rc_resources(): | ||
"""return rc resource IDs in defaultrc""" | ||||
rsrcs = resourceutil.contents(b'mercurial.defaultrc') | ||||
return [ | ||||
(b'mercurial.defaultrc', r) | ||||
for r in sorted(rsrcs) | ||||
if resourceutil.is_resource(b'mercurial.defaultrc', r) | ||||
and r.endswith(b'.rc') | ||||
] | ||||
Jun Wu
|
r31682 | def rccomponents(): | ||
Augie Fackler
|
r46554 | """return an ordered [(type, obj)] about where to load configs. | ||
Jun Wu
|
r31683 | |||
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. | ||||
Matt Harbison
|
r44483 | type could be either 'path', 'items' or 'resource'. 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. | ||||
If type is 'resource', obj is a tuple of (package name, resource name). | ||||
Augie Fackler
|
r46554 | """ | ||
Augie Fackler
|
r43347 | envrc = (b'items', envrcitems()) | ||
Jun Wu
|
r31685 | |||
Augie Fackler
|
r43347 | if b'HGRCPATH' in encoding.environ: | ||
Jun Wu
|
r31693 | # assume HGRCPATH is all about user configs so environments can be | ||
# overridden. | ||||
_rccomponents = [envrc] | ||||
Augie Fackler
|
r43347 | for p in encoding.environ[b'HGRCPATH'].split(pycompat.ospathsep): | ||
Jun Wu
|
r31693 | if not p: | ||
continue | ||||
Augie Fackler
|
r43347 | _rccomponents.extend((b'path', p) for p in _expandrcpath(p)) | ||
Jun Wu
|
r31693 | else: | ||
Matt Harbison
|
r44483 | _rccomponents = [(b'resource', r) for r in default_rc_resources()] | ||
Augie Fackler
|
r43347 | normpaths = lambda paths: [ | ||
(b'path', os.path.normpath(p)) for p in paths | ||||
] | ||||
Matt Harbison
|
r44484 | _rccomponents.extend(normpaths(systemrcpath())) | ||
Jun Wu
|
r31693 | _rccomponents.append(envrc) | ||
Jun Wu
|
r31694 | _rccomponents.extend(normpaths(userrcpath())) | ||
Jun Wu
|
r31682 | return _rccomponents | ||
Jun Wu
|
r31954 | |||
Augie Fackler
|
r43345 | |||
Jun Wu
|
r31954 | def defaultpagerenv(): | ||
Augie Fackler
|
r46554 | """return a dict of default environment variables and their values, | ||
Jun Wu
|
r31954 | intended to be set before starting a pager. | ||
Augie Fackler
|
r46554 | """ | ||
Augie Fackler
|
r43347 | return {b'LESS': b'FRX', b'LV': b'-c'} | ||
r44727 | ||||
def use_repo_hgrc(): | ||||
"""True if repositories `.hg/hgrc` config should be read""" | ||||
return b'HGRCSKIPREPO' not in encoding.environ | ||||