diff --git a/.github/workflows/new_linter_checklist.yaml b/.github/workflows/new_linter_checklist.yaml new file mode 100644 index 0000000000000..bea50b1a96eb1 --- /dev/null +++ b/.github/workflows/new_linter_checklist.yaml @@ -0,0 +1,105 @@ +--- +name: Add new linter checklist +on: + pull_request: + types: + - labeled + +jobs: + add-comment: + if: "github.event.label.name == 'linter: new'" + runs-on: ubuntu-latest + permissions: + pull-requests: write + + steps: + - name: Add checklist + run: | + # This is just safety to not spam with new comments if the tag is + # removed and added back multiple times maliciously. It will reset the + # checklist but the previous values will be in the edit history. + comment_exist=$(gh pr view "$NUMBER" \ + --json comments \ + --jq '.comments[].author | select(.login=="github-actions") | .login' \ + | wc -l) + [ "$comment_exist" -gt 0 ] && edit_last="--edit-last" + + # Comment on the PR with the checklist. + gh pr comment "$NUMBER" --body "$BODY" $edit_last + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + GH_REPO: ${{ github.repository }} + NUMBER: ${{ github.event.number }} + BODY: | + In order for a pull request adding a linter to be reviewed, the linter and the PR must follow some requirements. + + - [ ] The CLA must be signed + + ### Pull Request Description + + - [ ] It must have a link to the linter repository. + - [ ] It must provide a short description of the linter. + + ### Linter + + - [ ] It must not be a duplicate of another linter or a rule of a linter. (the team will help to verify that) + - [ ] It must have a valid license (AGPL is not allowed) and the file must contain the required information by the license, ex: author, year, etc. + - [ ] The linter repository must have a CI and tests. + - [ ] It must use [`go/analysis`](https://golangci-lint.run/contributing/new-linters/). + - [ ] It must have a valid tag, ex: `v1.0.0`, `v0.1.0`. + - [ ] It must not contain `init()`. + - [ ] It must not contain `panic()`. + - [ ] It must not contain `log.fatal()`, `os.exit()`, or similar. + - [ ] It must not modify the AST. + - [ ] It must not have false positives/negatives. (the team will help to verify that) + - [ ] It must have tests inside golangci-lint. + + ### The Linter Tests Inside Golangci-lint + + - [ ] They must have at least one std lib import. + - [ ] They must have integration tests without configuration (default). + - [ ] They must have integration tests with configuration (if the linter has a configuration). + + ### `.golangci.next.reference.yml` + + - [ ] The file `.golangci.next.reference.yml` must be updated. + - [ ] The file `.golangci.reference.yml` must NOT be edited. + - [ ] The linter must be added to the lists of available linters (alphabetical case-insensitive order). + - `enable` and `disable` options + - [ ] If the linter has a configuration, the exhaustive configuration of the linter must be added (alphabetical case-insensitive order) + - The values must be different from the default ones. + - The default values must be defined in a comment. + - The option must have a short description. + + ### Others Requirements + + - [ ] The files (tests and linter) inside golangci-lint must have the same name as the linter. + - [ ] The `.golangci.yml` of golangci-lint itself must not be edited and the linter must not be added to this file. + - [ ] The linters must be sorted in the alphabetical order (case-insensitive) in the `lintersdb/builder_linter.go` and `.golangci.next.reference.yml`. + - [ ] The load mode (`WithLoadMode(...)`): + - if the linter uses `goanalysis.LoadModeSyntax` -> no `WithLoadForGoAnalysis()` in `lintersdb/builder_linter.go` + - if the linter uses `goanalysis.LoadModeTypesInfo`, it requires `WithLoadForGoAnalysis()` in `lintersdb/builder_linter.go` + - [ ] The version in `WithSince(...)` must be the next minor version (`v1.X.0`) of golangci-lint. + - [ ] `WithURL()` must contain the URL of the repository. + - [ ] The linter must use go1.21 + + ### Recommendations + + - [ ] The file `jsonschema/golangci.next.jsonschema.json` should be updated. + - [ ] The file `jsonschema/golangci.jsonschema.json` must NOT be edited. + - [ ] The linter repository should have a readme and linting. + - [ ] The linter should be published as a binary. (useful to diagnose bug origins) + - [ ] The linter repository should have a `.gitignore` (IDE files, binaries, OS files, etc. should not be committed) + - [ ] A tag should never be recreated. + + --- + + The golangci-lint team will edit this comment to check the boxes before and during the review. + + The code review will start after the completion of those checkboxes (except for the specific items that the team will help to verify). + + The reviews should be addressed as commits (no squash). + + If the author of the PR is a member of the golangci-lint team, he should not edit this message. + + **This checklist does not imply that we will accept the linter.**