def setup(root, **lintargs): setup_helper.set_project_root(root) if not setup_helper.check_node_executables_valid(): return 1 return setup_helper.eslint_maybe_setup()
def build_docs( self, path=None, fmt="html", outdir=None, auto_open=True, serve=True, http=None, archive=False, upload=False, jobs=None, write_url=None, verbose=None, ): # TODO: Bug 1704891 - move the ESLint setup tools to a shared place. sys.path.append(mozpath.join(self.topsrcdir, "tools", "lint", "eslint")) import setup_helper setup_helper.set_project_root(self.topsrcdir) if not setup_helper.check_node_executables_valid(): return 1 setup_helper.eslint_maybe_setup() # Set the path so that Sphinx can find jsdoc, unfortunately there isn't # a way to pass this to Sphinx itself at the moment. os.environ["PATH"] = ( mozpath.join(self.topsrcdir, "node_modules", ".bin") + os.pathsep + self._node_path() + os.pathsep + os.environ["PATH"]) self.activate_virtualenv() self.virtualenv_manager.install_pip_requirements( os.path.join(here, "requirements.txt")) import webbrowser from livereload import Server from moztreedocs.package import create_tarball unique_id = "%s/%s" % (self.project, str(uuid.uuid1())) outdir = outdir or os.path.join(self.topobjdir, "docs") savedir = os.path.join(outdir, fmt) path = path or self.topsrcdir path = os.path.normpath(os.path.abspath(path)) docdir = self._find_doc_dir(path) if not docdir: print(self._dump_sphinx_backtrace()) return die("failed to generate documentation:\n" "%s: could not find docs at this location" % path) result = self._run_sphinx(docdir, savedir, fmt=fmt, jobs=jobs, verbose=verbose) if result != 0: print(self._dump_sphinx_backtrace()) return die("failed to generate documentation:\n" "%s: sphinx return code %d" % (path, result)) else: print("\nGenerated documentation:\n%s" % savedir) # Upload the artifact containing the link to S3 # This would be used by code-review to post the link to Phabricator if write_url is not None: unique_link = BASE_LINK + unique_id + "/index.html" with open(write_url, "w") as fp: fp.write(unique_link) fp.flush() print("Generated " + write_url) if archive: archive_path = os.path.join(outdir, "%s.tar.gz" % self.project) create_tarball(archive_path, savedir) print("Archived to %s" % archive_path) if upload: self._s3_upload(savedir, self.project, unique_id, self.version) if not serve: index_path = os.path.join(savedir, "index.html") if auto_open and os.path.isfile(index_path): webbrowser.open(index_path) return # Create livereload server. Any files modified in the specified docdir # will cause a re-build and refresh of the browser (if open). try: host, port = http.split(":", 1) port = int(port) except ValueError: return die("invalid address: %s" % http) server = Server() sphinx_trees = self.manager.trees or {savedir: docdir} for _, src in sphinx_trees.items(): run_sphinx = partial(self._run_sphinx, src, savedir, fmt=fmt, jobs=jobs, verbose=verbose) server.watch(src, run_sphinx) server.serve( host=host, port=port, root=savedir, open_url_delay=0.1 if auto_open else None, )
def lint(paths, config, binary=None, fix=None, setup=None, **lintargs): """Run eslint.""" setup_helper.set_project_root(lintargs['root']) module_path = setup_helper.get_project_root() # Valid binaries are: # - Any provided by the binary argument. # - Any pointed at by the ESLINT environmental variable. # - Those provided by |mach lint --setup|. if not binary: binary, _ = find_node_executable() if not binary: print(ESLINT_NOT_FOUND_MESSAGE) return 1 extra_args = lintargs.get('extra_args') or [] exclude_args = [] for path in config.get('exclude', []): exclude_args.extend( ['--ignore-pattern', os.path.relpath(path, lintargs['root'])]) cmd_args = [ binary, os.path.join(module_path, "node_modules", "eslint", "bin", "eslint.js"), # Enable the HTML plugin. # We can't currently enable this in the global config file # because it has bad interactions with the SublimeText # ESLint plugin (bug 1229874). '--plugin', 'html', # This keeps ext as a single argument. '--ext', '[{}]'.format(','.join(config['extensions'])), '--format', 'json', ] + extra_args + exclude_args + paths # eslint requires that --fix be set before the --ext argument. if fix: cmd_args.insert(2, '--fix') shell = False if os.environ.get('MSYSTEM') in ('MINGW32', 'MINGW64'): # The eslint binary needs to be run from a shell with msys shell = True orig = signal.signal(signal.SIGINT, signal.SIG_IGN) proc = ProcessHandler(cmd_args, env=os.environ, stream=None, shell=shell) proc.run() signal.signal(signal.SIGINT, orig) try: proc.wait() except KeyboardInterrupt: proc.kill() return [] if not proc.output: return [] # no output means success try: jsonresult = json.loads(proc.output[0]) except ValueError: print(ESLINT_ERROR_MESSAGE.format("\n".join(proc.output))) return 1 results = [] for obj in jsonresult: errors = obj['messages'] for err in errors: err.update({ 'hint': err.get('fix'), 'level': 'error' if err['severity'] == 2 else 'warning', 'lineno': err.get('line') or 0, 'path': obj['filePath'], 'rule': err.get('ruleId'), }) results.append(result.from_config(config, **err)) return results
def lint(paths, config, binary=None, fix=None, setup=None, **lintargs): """Run eslint.""" setup_helper.set_project_root(lintargs['root']) module_path = setup_helper.get_project_root() if not setup_helper.check_node_executables_valid(): return 1 if setup: return setup_helper.eslint_setup() setup_helper.eslint_maybe_setup() # Valid binaries are: # - Any provided by the binary argument. # - Any pointed at by the ESLINT environmental variable. # - Those provided by mach eslint --setup. # # eslint --setup installs some mozilla specific plugins and installs # all node modules locally. This is the preferred method of # installation. if not binary: binary = os.environ.get('ESLINT', None) if not binary: binary = os.path.join(module_path, "node_modules", ".bin", "eslint") if not os.path.isfile(binary): binary = None if not binary: print(ESLINT_NOT_FOUND_MESSAGE) return 1 extra_args = lintargs.get('extra_args') or [] cmd_args = [binary, # Enable the HTML plugin. # We can't currently enable this in the global config file # because it has bad interactions with the SublimeText # ESLint plugin (bug 1229874). '--plugin', 'html', # This keeps ext as a single argument. '--ext', '[{}]'.format(','.join(config['extensions'])), '--format', 'json', ] + extra_args + paths # eslint requires that --fix be set before the --ext argument. if fix: cmd_args.insert(1, '--fix') shell = False if os.environ.get('MSYSTEM') in ('MINGW32', 'MINGW64'): # The eslint binary needs to be run from a shell with msys shell = True orig = signal.signal(signal.SIGINT, signal.SIG_IGN) proc = ProcessHandler(cmd_args, env=os.environ, stream=None, shell=shell) proc.run() signal.signal(signal.SIGINT, orig) try: proc.wait() except KeyboardInterrupt: proc.kill() return [] if not proc.output: return [] # no output means success try: jsonresult = json.loads(proc.output[0]) except ValueError: print(ESLINT_ERROR_MESSAGE.format("\n".join(proc.output))) return 1 results = [] for obj in jsonresult: errors = obj['messages'] for err in errors: err.update({ 'hint': err.get('fix'), 'level': 'error' if err['severity'] == 2 else 'warning', 'lineno': err.get('line'), 'path': obj['filePath'], 'rule': err.get('ruleId'), }) results.append(result.from_config(config, **err)) return results