rcutil.py
92 lines
| 2.9 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. | ||||
from __future__ import absolute_import | ||||
import os | ||||
from . import ( | ||||
encoding, | ||||
osutil, | ||||
pycompat, | ||||
util, | ||||
) | ||||
if pycompat.osname == 'nt': | ||||
from . import scmwindows as scmplatform | ||||
else: | ||||
from . import scmposix as scmplatform | ||||
systemrcpath = scmplatform.systemrcpath | ||||
userrcpath = scmplatform.userrcpath | ||||
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 | ||||
return [join(p, f) for f, k in osutil.listdir(p) if f.endswith('.rc')] | ||||
return [p] | ||||
Jun Wu
|
r31684 | 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 | ||||
Jun Wu
|
r31680 | def defaultrcpath(): | ||
'''return rc paths in default.d''' | ||||
Jun Wu
|
r31679 | path = [] | ||
defaultpath = os.path.join(util.datapath, 'default.d') | ||||
if os.path.isdir(defaultpath): | ||||
Jun Wu
|
r31681 | path = _expandrcpath(defaultpath) | ||
Jun Wu
|
r31679 | return path | ||
Jun Wu
|
r31682 | def rccomponents(): | ||
Jun Wu
|
r31683 | '''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. | ||||
''' | ||||
Jun Wu
|
r31685 | envrc = ('items', envrcitems()) | ||
Jun Wu
|
r31693 | 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: | ||||
Jun Wu
|
r31694 | normpaths = lambda paths: [('path', os.path.normpath(p)) for p in paths] | ||
_rccomponents = normpaths(defaultrcpath() + systemrcpath()) | ||||
Jun Wu
|
r31693 | _rccomponents.append(envrc) | ||
Jun Wu
|
r31694 | _rccomponents.extend(normpaths(userrcpath())) | ||
Jun Wu
|
r31682 | return _rccomponents | ||