diff --git a/.github/workflows/conventional-commits-lint.js b/.github/workflows/conventional-commits-lint.js deleted file mode 100644 index 35db22f5..00000000 --- a/.github/workflows/conventional-commits-lint.js +++ /dev/null @@ -1,92 +0,0 @@ -"use strict"; - -const fs = require("fs"); - -const TITLE_PATTERN = - /^(?[^:!(]+)(?\([^)]+\))?(?[!])?:.+$/; -const RELEASE_AS_DIRECTIVE = /^\s*Release-As:/im; -const BREAKING_CHANGE_DIRECTIVE = /^\s*BREAKING[ \t]+CHANGE:/im; - -const ALLOWED_CONVENTIONAL_COMMIT_PREFIXES = [ - "revert", - "feat", - "fix", - "ci", - "docs", - "chore", - "style", - "test", - "refactor", -]; - -const object = process.argv[2]; -const payload = JSON.parse(fs.readFileSync(process.stdin.fd, "utf-8")); - -let validate = []; - -if (object === "pr") { - validate.push({ - title: payload.pull_request.title, - content: payload.pull_request.body, - }); -} else if (object === "push") { - validate.push( - ...payload.commits - .map((commit) => ({ - title: commit.message.split("\n")[0], - content: commit.message, - })) - .filter(({ title }) => !title.startsWith("Merge branch ") && !title.startsWith("Revert ")), - ); -} else { - console.error( - `Unknown object for first argument "${object}", use 'pr' or 'push'.`, - ); - process.exit(0); -} - -let failed = false; - -validate.forEach((payload) => { - if (payload.title) { - const match = payload.title.match(TITLE_PATTERN); - if (!match) { - return - } - - const { groups } = match - - if (groups) { - if ( - !ALLOWED_CONVENTIONAL_COMMIT_PREFIXES.find( - (prefix) => prefix === groups.prefix, - ) - ) { - console.error( - `PR (or a commit in it) is using a disallowed conventional commit prefix ("${groups.prefix}"). Only ${ALLOWED_CONVENTIONAL_COMMIT_PREFIXES.join(", ")} are allowed. Make sure the prefix is lowercase!`, - ); - failed = true; - } - } else { - console.error( - "PR or commit title must match conventional commit structure.", - ); - failed = true; - } - } - - if (payload.content) { - if (payload.content.match(RELEASE_AS_DIRECTIVE)) { - console.error( - "PR descriptions or commit messages must not contain Release-As conventional commit directives.", - ); - failed = true; - } - } -}); - -if (failed) { - process.exit(1); -} - -process.exit(0); diff --git a/.github/workflows/conventional-commits.yml b/.github/workflows/conventional-commits.yml index 41983b10..b0eebcd5 100644 --- a/.github/workflows/conventional-commits.yml +++ b/.github/workflows/conventional-commits.yml @@ -1,46 +1,28 @@ -name: Check pull requests +# See https://github.com/amannn/action-semantic-pull-request +name: 'PR Title is Conventional' on: - push: - branches-ignore: # Run the checks on all branches but the protected ones - - main - - release/* - pull_request: - branches: - - main - - release/* types: - opened - edited - - reopened - - ready_for_review + - synchronize permissions: + pull-requests: write contents: read jobs: - check-conventional-commits: + main: + name: Validate PR title runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v5 + - uses: amannn/action-semantic-pull-request@v6 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: - sparse-checkout: | - .github - - - if: ${{ github.event_name == 'pull_request' }} - run: | - set -ex - - node .github/workflows/conventional-commits-lint.js pr <