# 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 from distutils.spawn import find_executable import mozfile from mozprocess import ProcessHandlerMixin from mozlint import result from mozlint.pathutils import expand_exclusions here = os.path.abspath(os.path.dirname(__file__)) results = [] class PyCompatProcess(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): try: res = json.loads(line) except ValueError: print( "Non JSON output from {} linter: {}".format(self.config["name"], line) ) return res["level"] = "error" results.append(result.from_config(self.config, **res)) def setup(python): """Setup doesn't currently do any bootstrapping. For now, this function is only used to print the warning message. """ binary = find_executable(python) if not binary: # TODO Bootstrap python2/python3 if not available print("warning: {} not detected, skipping py-compat check".format(python)) def run_linter(python, paths, config, **lintargs): log = lintargs["log"] binary = find_executable(python) if not binary: # If we're in automation, this is fatal. Otherwise, the warning in the # setup method was already printed. if "MOZ_AUTOMATION" in os.environ: return 1 return [] files = expand_exclusions(paths, config, lintargs["root"]) with mozfile.NamedTemporaryFile(mode="w") as fh: fh.write("\n".join(files)) fh.flush() cmd = [binary, os.path.join(here, "check_compat.py"), fh.name] log.debug("Command: {}".format(" ".join(cmd))) proc = PyCompatProcess(config, cmd) proc.run() try: proc.wait() except KeyboardInterrupt: proc.kill() return results def setuppy2(**lintargs): return setup("python2") def lintpy2(*args, **kwargs): return run_linter("python2", *args, **kwargs) def setuppy3(**lintargs): return setup("python3") def lintpy3(*args, **kwargs): return run_linter("python3", *args, **kwargs)