sapling/contrib/lint.py
Jun Wu 584656dff3 codemod: join the auto-formatter party
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
2018-05-25 22:17:29 -07:00

96 lines
2.5 KiB
Python
Executable File

#!/usr/bin/env python
""" Convert mercurial check-code errors into a format
that plays nicely with arc lint """
from __future__ import absolute_import, print_function
import errno
import os
import re
import subprocess
import sys
import utils
sys.path.insert(0, os.path.dirname(__file__))
# Normalize the list of files that we should report on
wanted = set()
for path in sys.argv[1:]:
wanted.add(os.path.relpath(path))
# Export LINTFILES so tests can skip unrelated files
if wanted:
os.environ["LINTFILES"] = "\n".join(sorted(wanted))
args = ["-l", "test-check-code-hg.t", "test-check-pyflakes-hg.t"]
try:
proc = utils.spawnruntests(args, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
except OSError as ex:
if ex.errno == errno.ENOENT:
print(
"lint.py:1: ERROR:ENVIRON: Please either set "
+ "MERCURIALRUNTEST var to the full path to run-tests.py, "
+ "or add the containing directory to your $PATH"
)
else:
print("lint.py:1: ERROR:OSError: %r" % ex)
sys.exit(0)
output, error = proc.communicate()
context_file = None
lines = error.split("\n")
# We expect a run of 3 lines to describe the error, with the first
# of those to look like a filename and line number location
while lines:
line = lines[0]
lines.pop(0)
# test-check-pyflakes-hg style output
m = re.match("^\+ ([a-zA-Z0-9_./-]+):(\d+): (.*)$", line)
if m:
filename, location, why = m.groups()
if filename in wanted:
print("%s:%s: ERROR:Pyflakes: %s" % (filename, location, why))
continue
# test-check-code-hg style output
if re.match("^--- (.*)$", line):
context_file = os.path.relpath(line[4:])
continue
m = re.match("^\+ (Skipping (.*) it has no.*)$", line)
if m:
filename = m.group(2)
if filename in wanted:
print(
"%s:0: ERROR:CheckCode: Update %s to add %s"
% (filename, context_file, m.group(1))
)
continue
if not re.match("^\+ +[a-zA-Z0-9_./-]+:\d+:$", line):
continue
if len(lines) < 2:
continue
location = line
context = lines.pop(0) # we ignore this
why = lines.pop(0)
location = location[1:].strip() # strip off the "+ " bit
location = location.rstrip(":")
filename, lineno = location.split(":")
if filename not in wanted:
# lint doesn't care about this file.
continue
why = why[1:].strip()
print("%s: ERROR:CheckCode: %s" % (location, why))