Commit b05b25f7 authored by Jun Wu's avatar Jun Wu
Browse files

rcutil: move scmutil.*rcpath to rcutil (API)

As discussed at [1], the logic around "actual config"s seem to be
non-trivial enough that it's worth a new module.

This patch creates the module and move "scmutil.*rcpath" functions there as
the first step. More methods will be moved to the module in the future.

The module is different from config.py because the latter only cares about
data structure and parsing, and does not care about special case, or system
config paths, or environment variables.

[1]: https://www.mercurial-scm.org/pipermail/mercurial-devel/2017-March/095503.html
parent 1ed57a7dd904
......@@ -43,6 +43,7 @@ from . import (
patch,
phases,
pycompat,
rcutil,
revsetlang,
scmutil,
server,
......@@ -1776,9 +1777,9 @@ def config(ui, repo, *values, **opts):
raise error.Abort(_("can't use --local outside a repository"))
paths = [repo.vfs.join('hgrc')]
elif opts.get('global'):
paths = scmutil.systemrcpath()
paths = rcutil.systemrcpath()
else:
paths = scmutil.userrcpath()
paths = rcutil.userrcpath()
for f in paths:
if os.path.exists(f):
......@@ -1803,7 +1804,7 @@ def config(ui, repo, *values, **opts):
return
ui.pager('config')
fm = ui.formatter('config', opts)
for f in scmutil.rcpath():
for f in rcutil.rcpath():
ui.debug('read config from: %s\n' % f)
untrusted = bool(opts.get('untrusted'))
if values:
......
# 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
def osrcpath():
'''return default os-specific hgrc search path'''
path = []
defaultpath = os.path.join(util.datapath, 'default.d')
if os.path.isdir(defaultpath):
for f, kind in osutil.listdir(defaultpath):
if f.endswith('.rc'):
path.append(os.path.join(defaultpath, f))
path.extend(systemrcpath())
path.extend(userrcpath())
path = [os.path.normpath(f) for f in path]
return path
_rcpath = None
def rcpath():
'''return hgrc search path. if env var HGRCPATH is set, use it.
for each item in path, if directory, use files ending in .rc,
else use item.
make HGRCPATH empty to only look in .hg/hgrc of current repo.
if no HGRCPATH, use default os-specific path.'''
global _rcpath
if _rcpath is None:
if 'HGRCPATH' in encoding.environ:
_rcpath = []
for p in encoding.environ['HGRCPATH'].split(pycompat.ospathsep):
if not p:
continue
p = util.expandpath(p)
if os.path.isdir(p):
for f, kind in osutil.listdir(p):
if f.endswith('.rc'):
_rcpath.append(os.path.join(p, f))
else:
_rcpath.append(p)
else:
_rcpath = osrcpath()
return _rcpath
......@@ -20,7 +20,6 @@ from . import (
encoding,
error,
match as matchmod,
osutil,
pathutil,
phases,
pycompat,
......@@ -35,8 +34,6 @@ if pycompat.osname == 'nt':
else:
from . import scmposix as scmplatform
systemrcpath = scmplatform.systemrcpath
userrcpath = scmplatform.userrcpath
termsize = scmplatform.termsize
class status(tuple):
......@@ -391,45 +388,6 @@ def walkrepos(path, followsym=False, seen_dirs=None, recurse=False):
newdirs.append(d)
dirs[:] = newdirs
def osrcpath():
'''return default os-specific hgrc search path'''
path = []
defaultpath = os.path.join(util.datapath, 'default.d')
if os.path.isdir(defaultpath):
for f, kind in osutil.listdir(defaultpath):
if f.endswith('.rc'):
path.append(os.path.join(defaultpath, f))
path.extend(systemrcpath())
path.extend(userrcpath())
path = [os.path.normpath(f) for f in path]
return path
_rcpath = None
def rcpath():
'''return hgrc search path. if env var HGRCPATH is set, use it.
for each item in path, if directory, use files ending in .rc,
else use item.
make HGRCPATH empty to only look in .hg/hgrc of current repo.
if no HGRCPATH, use default os-specific path.'''
global _rcpath
if _rcpath is None:
if 'HGRCPATH' in encoding.environ:
_rcpath = []
for p in encoding.environ['HGRCPATH'].split(pycompat.ospathsep):
if not p:
continue
p = util.expandpath(p)
if os.path.isdir(p):
for f, kind in osutil.listdir(p):
if f.endswith('.rc'):
_rcpath.append(os.path.join(p, f))
else:
_rcpath.append(p)
else:
_rcpath = osrcpath()
return _rcpath
def intrev(rev):
"""Return integer for a given revision that can be used in comparison or
arithmetic operation"""
......
......@@ -33,6 +33,7 @@ from . import (
formatter,
progress,
pycompat,
rcutil,
scmutil,
util,
)
......@@ -211,7 +212,7 @@ class ui(object):
"""Create a ui and load global and user configs"""
u = cls()
# we always trust global config files
for f in scmutil.rcpath():
for f in rcutil.rcpath():
u.readconfig(f, trust=True)
return u
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment