# HG changeset patch # User Jun Wu # Date 1490584722 25200 # Node ID 0f8ba0bc1154d20e5984cbc671be411aa56d7911 # Parent 1ed57a7dd904f8b79f79ecb4ea6fe1871e7af740 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 diff -r 1ed57a7dd904 -r 0f8ba0bc1154 mercurial/commands.py --- a/mercurial/commands.py Sat Mar 25 17:25:23 2017 +0900 +++ b/mercurial/commands.py Sun Mar 26 20:18:42 2017 -0700 @@ -43,6 +43,7 @@ patch, phases, pycompat, + rcutil, revsetlang, scmutil, server, @@ -1776,9 +1777,9 @@ 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 @@ 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: diff -r 1ed57a7dd904 -r 0f8ba0bc1154 mercurial/rcutil.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mercurial/rcutil.py Sun Mar 26 20:18:42 2017 -0700 @@ -0,0 +1,64 @@ +# 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 diff -r 1ed57a7dd904 -r 0f8ba0bc1154 mercurial/scmutil.py --- a/mercurial/scmutil.py Sat Mar 25 17:25:23 2017 +0900 +++ b/mercurial/scmutil.py Sun Mar 26 20:18:42 2017 -0700 @@ -20,7 +20,6 @@ encoding, error, match as matchmod, - osutil, pathutil, phases, pycompat, @@ -35,8 +34,6 @@ else: from . import scmposix as scmplatform -systemrcpath = scmplatform.systemrcpath -userrcpath = scmplatform.userrcpath termsize = scmplatform.termsize class status(tuple): @@ -391,45 +388,6 @@ 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""" diff -r 1ed57a7dd904 -r 0f8ba0bc1154 mercurial/ui.py --- a/mercurial/ui.py Sat Mar 25 17:25:23 2017 +0900 +++ b/mercurial/ui.py Sun Mar 26 20:18:42 2017 -0700 @@ -33,6 +33,7 @@ formatter, progress, pycompat, + rcutil, scmutil, util, ) @@ -211,7 +212,7 @@ """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