зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1515746 - [lint] Remove duplicate flake8 implementation, r=egao
Somehow we have two copies of the flake8 linter implementation: - tools/lint/python/__init__.py - tools/lint/python/flake8.py I'm not really sure how this happened, but the latter is the one that we use, so let's remove the former. It wasn't really affecting anything, though could have caused confusion to people looking to modify the lint integration. Differential Revision: https://phabricator.services.mozilla.com/D18352 --HG-- extra : moz-landing-system : lando
This commit is contained in:
Родитель
abe07d6020
Коммит
cee62d2c1f
|
@ -1,146 +0,0 @@
|
|||
# This Source Code Form is subject to the terms of the Mozilla Public
|
||||
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||
|
||||
import json
|
||||
import os
|
||||
import signal
|
||||
from collections import defaultdict
|
||||
|
||||
import which
|
||||
from mozprocess import ProcessHandlerMixin
|
||||
|
||||
from mozlint import result
|
||||
from mozlint.util import pip
|
||||
from mozlint.pathutils import get_ancestors_by_name
|
||||
|
||||
|
||||
here = os.path.abspath(os.path.dirname(__file__))
|
||||
FLAKE8_REQUIREMENTS_PATH = os.path.join(here, 'flake8_requirements.txt')
|
||||
|
||||
FLAKE8_NOT_FOUND = """
|
||||
Could not find flake8! Install flake8 and try again.
|
||||
|
||||
$ pip install -U --require-hashes -r {}
|
||||
""".strip().format(FLAKE8_REQUIREMENTS_PATH)
|
||||
|
||||
|
||||
FLAKE8_INSTALL_ERROR = """
|
||||
Unable to install correct version of flake8
|
||||
Try to install it manually with:
|
||||
$ pip install -U --require-hashes -r {}
|
||||
""".strip().format(FLAKE8_REQUIREMENTS_PATH)
|
||||
|
||||
LINE_OFFSETS = {
|
||||
# continuation line under-indented for hanging indent
|
||||
'E121': (-1, 2),
|
||||
# continuation line missing indentation or outdented
|
||||
'E122': (-1, 2),
|
||||
# continuation line over-indented for hanging indent
|
||||
'E126': (-1, 2),
|
||||
# continuation line over-indented for visual indent
|
||||
'E127': (-1, 2),
|
||||
# continuation line under-indented for visual indent
|
||||
'E128': (-1, 2),
|
||||
# continuation line unaligned for hanging indend
|
||||
'E131': (-1, 2),
|
||||
# expected 1 blank line, found 0
|
||||
'E301': (-1, 2),
|
||||
# expected 2 blank lines, found 1
|
||||
'E302': (-2, 3),
|
||||
}
|
||||
"""Maps a flake8 error to a lineoffset tuple.
|
||||
|
||||
The offset is of the form (lineno_offset, num_lines) and is passed
|
||||
to the lineoffset property of an `Issue`.
|
||||
"""
|
||||
|
||||
results = []
|
||||
|
||||
|
||||
class Flake8Process(ProcessHandlerMixin):
|
||||
def __init__(self, config, *args, **kwargs):
|
||||
self.config = config
|
||||
kwargs['processOutputLine'] = [self.process_line]
|
||||
ProcessHandlerMixin.__init__(self, *args, **kwargs)
|
||||
|
||||
def process_line(self, line):
|
||||
# Escape slashes otherwise JSON conversion will not work
|
||||
line = line.replace('\\', '\\\\')
|
||||
try:
|
||||
res = json.loads(line)
|
||||
except ValueError:
|
||||
print('Non JSON output from linter, will not be processed: {}'.format(line))
|
||||
return
|
||||
|
||||
if res.get('code') in LINE_OFFSETS:
|
||||
res['lineoffset'] = LINE_OFFSETS[res['code']]
|
||||
|
||||
results.append(result.from_config(self.config, **res))
|
||||
|
||||
def run(self, *args, **kwargs):
|
||||
# flake8 seems to handle SIGINT poorly. Handle it here instead
|
||||
# so we can kill the process without a cryptic traceback.
|
||||
orig = signal.signal(signal.SIGINT, signal.SIG_IGN)
|
||||
ProcessHandlerMixin.run(self, *args, **kwargs)
|
||||
signal.signal(signal.SIGINT, orig)
|
||||
|
||||
|
||||
def get_flake8_binary():
|
||||
"""
|
||||
Returns the path of the first flake8 binary available
|
||||
if not found returns None
|
||||
"""
|
||||
binary = os.environ.get('FLAKE8')
|
||||
if binary:
|
||||
return binary
|
||||
|
||||
try:
|
||||
return which.which('flake8')
|
||||
except which.WhichError:
|
||||
return None
|
||||
|
||||
|
||||
def run_process(config, cmd):
|
||||
proc = Flake8Process(config, cmd)
|
||||
proc.run()
|
||||
try:
|
||||
proc.wait()
|
||||
except KeyboardInterrupt:
|
||||
proc.kill()
|
||||
|
||||
|
||||
def lint(paths, config, **lintargs):
|
||||
|
||||
if not pip.reinstall_program(FLAKE8_REQUIREMENTS_PATH):
|
||||
print(FLAKE8_INSTALL_ERROR)
|
||||
return 1
|
||||
|
||||
binary = get_flake8_binary()
|
||||
|
||||
cmdargs = [
|
||||
binary,
|
||||
'--format', '{"path":"%(path)s","lineno":%(row)s,'
|
||||
'"column":%(col)s,"rule":"%(code)s","message":"%(text)s"}',
|
||||
]
|
||||
|
||||
# Run any paths with a .flake8 file in the directory separately so
|
||||
# it gets picked up. This means only .flake8 files that live in
|
||||
# directories that are explicitly included will be considered.
|
||||
# See bug 1277851
|
||||
paths_by_config = defaultdict(list)
|
||||
for path in paths:
|
||||
configs = get_ancestors_by_name('.flake8', path, lintargs['root'])
|
||||
paths_by_config[os.pathsep.join(configs) if configs else 'default'].append(path)
|
||||
|
||||
for configs, paths in paths_by_config.items():
|
||||
cmd = cmdargs[:]
|
||||
|
||||
if configs != 'default':
|
||||
configs = reversed(configs.split(os.pathsep))
|
||||
cmd.extend(['--append-config={}'.format(c) for c in configs])
|
||||
|
||||
cmd.extend(paths)
|
||||
run_process(config, cmd)
|
||||
|
||||
return results
|
Загрузка…
Ссылка в новой задаче