160 lines
4.3 KiB
Markdown
160 lines
4.3 KiB
Markdown
# Running Linters Locally
|
|
|
|
## Using the Command Line
|
|
|
|
You can run all the various linters in the tree using the `mach lint` command. Simply pass in the
|
|
directory or file you wish to lint (defaults to current working directory):
|
|
|
|
```{eval-rst}
|
|
.. parsed-literal::
|
|
|
|
./mach lint path/to/files
|
|
```
|
|
|
|
Multiple paths are allowed:
|
|
|
|
```{eval-rst}
|
|
.. parsed-literal::
|
|
|
|
./mach lint path/to/foo.js path/to/bar.py path/to/dir
|
|
```
|
|
|
|
To force execution on a directory that would otherwise be excluded:
|
|
|
|
```{eval-rst}
|
|
.. parsed-literal::
|
|
|
|
./mach lint -n path/in/the/exclude/list
|
|
```
|
|
|
|
`Mozlint` will automatically determine which types of files exist, and which linters need to be run
|
|
against them. For example, if the directory contains both JavaScript and Python files then mozlint
|
|
will automatically run both ESLint and Flake8 against those files respectively.
|
|
|
|
To restrict which linters are invoked manually, pass in `-l/--linter`:
|
|
|
|
```{eval-rst}
|
|
.. parsed-literal::
|
|
|
|
./mach lint -l eslint path/to/files
|
|
```
|
|
|
|
You can see a list of the available linters by running:
|
|
|
|
```{eval-rst}
|
|
.. parsed-literal::
|
|
|
|
./mach lint --list
|
|
```
|
|
|
|
Finally, `mozlint` can lint the files touched by outgoing revisions or the working directory using
|
|
the `-o/--outgoing` and `-w/--workdir` arguments respectively.
|
|
In the case of `--outgoing`, the default remote repository the changes would be pushed to is
|
|
used as the comparison. If desired, a remote can be specified manually. In git, you may only want to
|
|
lint staged commits from the working directory, this can be accomplished with `--workdir=staged`.
|
|
Examples:
|
|
|
|
```{eval-rst}
|
|
.. parsed-literal::
|
|
|
|
./mach lint --workdir
|
|
./mach lint --workdir=staged
|
|
./mach lint --outgoing
|
|
./mach lint --outgoing origin/master
|
|
./mach lint -wo
|
|
|
|
```
|
|
|
|
### Automatically Fixing Lint Errors
|
|
|
|
`Mozlint` has a best-effort ability to fix lint errors:
|
|
|
|
```{eval-rst}
|
|
.. parsed-literal::
|
|
|
|
$ ./mach lint --fix
|
|
```
|
|
|
|
Not all linters support fixing, and even the ones that do can not usually fix
|
|
all types of errors. Any errors that cannot be automatically fixed, will be
|
|
printed to stdout like normal. In that case, you can also fix errors manually:
|
|
|
|
```{eval-rst}
|
|
.. parsed-literal::
|
|
|
|
$ ./mach lint --edit
|
|
```
|
|
|
|
This requires the \$EDITOR environment variable be defined. For most editors,
|
|
this will simply open each file containing errors one at a time. For vim (or
|
|
neovim), this will populate the [quickfix list] with the errors.
|
|
|
|
The `--fix` and `--edit` arguments can be combined, in which case any
|
|
errors that can be fixed automatically will be, and the rest will be opened
|
|
with your \$EDITOR.
|
|
|
|
## VCS Integrations
|
|
|
|
(lint-vcs-hook)=
|
|
|
|
### Using a Git Hook
|
|
|
|
There are also both pre-commit and pre-push version control hooks that work in
|
|
git.
|
|
|
|
To enable a pre-push git hook, run the following command:
|
|
|
|
```console
|
|
ln -s ../../tools/lint/hooks.py .git/hooks/pre-push
|
|
```
|
|
|
|
To enable a pre-commit git hook, run the following command:
|
|
|
|
```console
|
|
ln -s ../../tools/lint/hooks.py .git/hooks/pre-commit
|
|
```
|
|
|
|
Note that the symlink will be interpreted as `.git/hooks/../../tools/lint/hooks.py`.
|
|
|
|
### Jujutsu Integration
|
|
|
|
Mach lint can also integrate with [Jujutsu SCM's] `jj fix` command. Add
|
|
the following to your repo config:
|
|
|
|
```toml
|
|
[fix.tools.mozlint]
|
|
command = ["path/to/mozilla-unified/tools/lint/pipelint", "$path"]
|
|
patterns = ["glob:'**/*'"]
|
|
```
|
|
|
|
:::{note}
|
|
On Windows you must explicitly prepend `"python3",` to `command`.
|
|
:::
|
|
|
|
```toml
|
|
[fix.tools.mozlint]
|
|
command = ["python3", "path/to/mozilla-unified/tools/lint/pipelint", "$path"]
|
|
patterns = ["glob:'**/*'"]
|
|
```
|
|
|
|
## Editor Integrations
|
|
|
|
:::{note}
|
|
See details on [how to set up your editor here](/contributing/editor.html#editor-ide-integration)
|
|
:::
|
|
|
|
Editor integrations are highly recommended for linters, as they let you see
|
|
errors in real time, and can help you fix issues before you compile or run tests.
|
|
|
|
Although mozilla-central does not currently have an integration available for
|
|
`./mach lint`, there are various integrations available for some of the major
|
|
linting tools that we use:
|
|
|
|
- [ESLint]
|
|
- [Black (Python)]
|
|
|
|
[black (python)]: https://black.readthedocs.io/en/stable/editor_integration.html
|
|
[eslint]: https://eslint.org/docs/user-guide/integrations#editors
|
|
[jujutsu scm's]: https://jj-vcs.github.io/jj/latest/
|
|
[quickfix list]: http://vimdoc.sourceforge.net/htmldoc/quickfix.html
|