summaryrefslogtreecommitdiff
path: root/docs/linting.md
blob: a499505442d4490f6b560a422d03ffebc0e86fbc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
# Linting in the MongoDB codebase

## C++ Linters

### `clang-format`
The `buildscripts/clang_format.py` wrapper script runs the `clang-format` linter. You can see the 
usage message for the wrapper by running `buildscripts/clang_format.py --help`.

Ex: `buildscripts/clang_format.py lint`

| Linter | Configuration File(s) | Help Command | Documentation | 
| --- | --- | --- | --- |
| `clang-format` | `.clang-format` | `clang-format --help` | [https://clang.llvm.org/docs/ClangFormat.html](https://clang.llvm.org/docs/ClangFormat.html) |

### `clang-tidy`
The `evergreen/run_clang_tidy.sh` shell script runs the `clang-tidy` linter. In order to run 
`clang-tidy` you must have a compilation database (`compile_commands.json` file).

Ex: `bash buildscripts/run_clang_tidy.sh`

| Linter | Configuration File(s) | Help Command | Documentation | 
| --- | --- | --- | --- |
| `clang-tidy` | `.clang-tidy`  | `clang-tidy --help` | [https://clang.llvm.org/extra/clang-tidy/index.html](https://clang.llvm.org/extra/clang-tidy/index.html) |

### `errorcodes.py`
The `buildscripts/errorcodes.py` script runs a custom error code linter, which verifies that all 
assertion codes are distinct. You can see the usage by running the following command: 
`buildscripts/errorcodes.py --help`.

Ex: `buildscripts/errorcodes.py`

### `quickcpplint.py`
The `buildscripts/quickcpplint.py` script runs a simple MongoDB C++ linter. You can see the usage 
by running the following command: `buildscripts/quickcpplint.py --help`. You can take a look at 
`buildscripts/linter/simplecpplint.py` to better understand the rules for this linter.

Ex: `buildscripts/quickcpplint.py lint`

## Javascript Linters
The `buildscripts/eslint.py` wrapper script runs the `eslint` javascript linter. You can see the 
usage message for the wrapper by running `buildscripts/eslint.py --help`.

Ex: `buildscripts/eslint.py lint`

| Linter | Configuration File(s) | Help Command | Documentation | 
| --- | --- | --- | --- |
| `eslint` | `.eslintrc.yml` `.eslintignore` | `eslint --help` | [https://eslint.org/](https://eslint.org/) |

## Yaml Linters
The `buildscripts/yamllinters.sh` shell script runs the yaml linters. The supported yaml linters 
are: `yamllint` & `evergreen-lint`. `evergreen-lint` is a custom MongoDB linter used specifically 
for `evergreen` yaml files.

Ex: `bash buildscripts/yamllinters.sh`

| Linter | Configuration File(s) | Help Command | Documentation | 
| --- | --- | --- | --- |
| `yamllint` | `etc/yamllint_config.yml` | `yamllint --help` | [https://readthedocs.org/projects/yamllint/](https://readthedocs.org/projects/yamllint/) |
| `evergreen-lint` | `etc/evergreen_lint.yml` | `python -m evergreen_lint --help` | [https://github.com/evergreen-ci/config-linter](https://github.com/evergreen-ci/config-linter) |

## Python Linters
The `buildscripts/pylinters.py` wrapper script runs the Python linters. You can 
see the usage message for the wrapper by running the following command: 
`buildscripts/pylinters.py --help`. The following linters are supported: `pylint`, `mypy`, 
`pydocstyle` & `yapf`.

Ex: `buildscripts/pylinters.py lint`

| Linter | Configuration File(s) | Help Command | Documentation | 
| --- | --- | --- | --- |
| `pylint` | `.pylintrc` | `pylint --help` | [https://www.pylint.org/](https://www.pylint.org/) |
| `mypy` | `.mypy.ini` | `mypy --help` | [https://readthedocs.org/projects/mypy/](https://readthedocs.org/projects/mypy/) |
| `pydocstyle` | `.pydocstyle` | `pydocstyle --help` | [https://readthedocs.org/projects/pydocstyle/](https://readthedocs.org/projects/pydocstyle/) |
| `yapf` | `.style.yapf` | `yapf --help` | [https://github.com/google/yapf](https://github.com/google/yapf) |

### SCons Linters
`buildscripts/pylinters.py` has the `lint-scons` and `fix-scons` commands to lint 
and fix SCons and build system related code. Currently `yapf` is the only 
linter supported for SCons code.

## Using SCons for linting
You can use SCons to run most of the linters listed above via their corresponding Python wrapper 
script. SCons also provides the ability to run multiple linters in a single command. At this time, 
SCons does not support `clang-tidy` or `buildscripts/yamllinters.sh`

Here are some examples:

| SCons Target | Linter(s) | Example |
| --- | --- | --- |
| `lint` | `clang-format` `errorcodes.py` `quickcpplint.py` `eslint` `pylint` `mypy` `pydocstyle` `yapf` | `buildscripts/scons.py lint` |
| `lint-fast` | `clang-format` `errorcodes.py` `eslint` `pylint` `mypy` `pydocstyle` `yapf` | `buildscripts/scons.py lint-fast` |
| `lint-clang-format` | `clang-format` | `buildscripts/scons.py lint-clang-format` |
| `lint-errorcodes` | `errorcodes.py` | `buildscripts/scons.py lint-errorcodes` |
| `lint-lint.py` | `quickcpplint.py` | `buildscripts/scons.py lint-lint.py` |
| `lint-eslint` | `eslint` | `buildscripts/scons.py lint-eslint` |
| `lint-pylinters` | `pylint` `mypy` `pydocstyle` `yapf` | `buildscripts/scons.py lint-pylinters` |
| `lint-sconslinters` | `yapf` | `buildscripts/scons.py lint-sconslinters` |