Bug 1515746 - [lint] Remove duplicate flake8 implementation, r=egao
authorAndrew Halberstadt <ahalberstadt@mozilla.com>
Thu, 07 Feb 2019 20:16:36 +0000
changeset 515561 ba9e0f7f49a3b4844122676de241dc2ce6671e22
parent 515560 2e1a490ab0e9caa8c8a8c5ea2796755c2c718425
child 515562 3c7c50fba28399ae0d1a3812e5088cde55aacd8e
push id10862
push userffxbld-merge
push dateMon, 11 Mar 2019 13:01:11 +0000
treeherdermozilla-beta@a2e7f5c935da [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersegao
bugs1515746
milestone67.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
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
tools/lint/python/__init__.py
--- a/tools/lint/python/__init__.py
+++ b/tools/lint/python/__init__.py
@@ -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