mirror of
https://github.com/facebook/sapling.git
synced 2024-10-16 19:57:18 +03:00
584656dff3
Summary: Turned on the auto formatter. Ran `arc lint --apply-patches --take BLACK **/*.py`. Then run `arc lint` again so some other autofixers like spellchecker etc. looked at the code base. Manually accept the changes whenever they make sense, or use a workaround (ex. changing "dict()" to "dict constructor") where autofix is false positive. Disabled linters on files that are hard (i18n/polib.py) to fix, or less interesting to fix (hgsubversion tests), or cannot be fixed without breaking OSS build (FBPYTHON4). Conflicted linters (test-check-module-imports.t, part of test-check-code.t, test-check-pyflakes.t) are removed or disabled. Duplicated linters (test-check-pyflakes.t, test-check-pylint.t) are removed. An issue of the auto-formatter is lines are no longer guarnateed to be <= 80 chars. But that seems less important comparing with the benefit auto-formatter provides. As we're here, also remove test-check-py3-compat.t, as it is currently broken if `PYTHON3=/bin/python3` is set. Reviewed By: wez, phillco, simpkins, pkaush, singhsrb Differential Revision: D8173629 fbshipit-source-id: 90e248ae0c5e6eaadbe25520a6ee42d32005621b
147 lines
4.6 KiB
Python
147 lines
4.6 KiB
Python
# 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 errno
|
|
import os
|
|
|
|
from . import config, encoding, mdiff, 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"}
|
|
|
|
|
|
def editconfig(path, section, name, value):
|
|
"""Append a config item to the given config path.
|
|
|
|
Try to edit the config in-place without breaking config file syntax for
|
|
simple cases. Fallback to just append the new config.
|
|
"""
|
|
path = os.path.realpath(path)
|
|
content = ""
|
|
try:
|
|
content = util.readfile(path)
|
|
except IOError as ex:
|
|
if ex.errno != errno.ENOENT:
|
|
raise
|
|
cfg = config.config()
|
|
cfg.parse("", content, include=lambda *args, **kwargs: None)
|
|
source = cfg.source(section, name)
|
|
edited = False
|
|
|
|
# in-place edit if possible
|
|
if source.startswith(":"):
|
|
# line index
|
|
index = int(source[1:]) - 1
|
|
lines = mdiff.splitnewlines(content)
|
|
# for simple case, we can edit the line in-place
|
|
if ( # config line should still exist
|
|
index < len(lines)
|
|
# the line should start with "NAME ="
|
|
and lines[index].split("=")[0].rstrip() == name
|
|
# the next line should not be indented (a multi-line value)
|
|
and (index + 1 >= len(lines) or not lines[index + 1][:1].isspace())
|
|
):
|
|
edited = True
|
|
# edit the line
|
|
content = "".join(
|
|
lines[:index] + ["%s = %s\n" % (name, value)] + lines[index + 1 :]
|
|
)
|
|
if not edited:
|
|
# append as new config
|
|
if content:
|
|
content += "\n"
|
|
content += "[%s]\n%s = %s\n" % (section, name, value)
|
|
with util.atomictempfile(path) as f:
|
|
f.write(content)
|