From 06f496cdd595a9b883c25256b842f7e97d656d49 Mon Sep 17 00:00:00 2001 From: Michal Zielenkiewicz Date: Mon, 31 Jul 2023 14:03:39 +0200 Subject: [PATCH] Setup gitlint --- .github/workflows/ci-lint.yml | 23 +++++++++++++++++++++++ .gitlint | 24 ++++++++++++++++++++++++ internals/scripts/gitlint.js | 16 ++++++++++++++++ package.json | 1 + 4 files changed, 64 insertions(+) create mode 100644 .gitlint create mode 100644 internals/scripts/gitlint.js diff --git a/.github/workflows/ci-lint.yml b/.github/workflows/ci-lint.yml index 3cea0ad8fd..feecafa4f9 100644 --- a/.github/workflows/ci-lint.yml +++ b/.github/workflows/ci-lint.yml @@ -26,19 +26,42 @@ jobs: steps: - name: Checkout code uses: actions/checkout@v4 + with: + # Checkout pull request HEAD commit instead of merge commit. + ref: ${{ github.event.pull_request.head.sha }} + # Fetch all history so gitlint can check the relevant commits. + fetch-depth: '0' + - name: Set up Python 3 + uses: actions/setup-python@v4 + with: + python-version: '3.x' - name: Set up Node.js 18 uses: actions/setup-node@v3 with: node-version: '18.x' cache: yarn + - name: Install gitlint + run: | + python -m pip install gitlint - name: Install dependencies run: yarn install --frozen-lockfile + - name: Lint git commits + run: | + yarn lint-git + # Always run this step so that all linting errors can be seen at once. + if: always() - name: ESLint # Disallow warnings and always throw errors. run: yarn lint --max-warnings 0 + # Always run this step so that all linting errors can be seen at once. + if: always() - name: Validate Grommet icons types run: | yarn fix-grommet-icons-types git diff --exit-code + # Always run this step so that all linting errors can be seen at once. + if: always() - name: Validate TypeScript run: yarn checkTs + # Always run this step so that all linting errors can be seen at once. + if: always() diff --git a/.gitlint b/.gitlint new file mode 100644 index 0000000000..023a6cead1 --- /dev/null +++ b/.gitlint @@ -0,0 +1,24 @@ +# gitlint configuration. + +# For more information, see: +# https://jorisroovers.com/gitlint/configuration/. + +[general] +verbosity = 2 +ignore-merge-commits=true +ignore-fixup-commits=false +ignore-squash-commits=false +ignore=body-is-missing +contrib=contrib-disallow-cleanup-commits + +[title-max-length] +line-length=72 + +[body-max-line-length] +line-length=80 + +[body-min-length] +min-length=20 + +[title-must-not-contain-word] +words=wip diff --git a/internals/scripts/gitlint.js b/internals/scripts/gitlint.js new file mode 100644 index 0000000000..9eb4725e28 --- /dev/null +++ b/internals/scripts/gitlint.js @@ -0,0 +1,16 @@ +// @ts-check +// https://github.com/oasisprotocol/oasis-core/blob/50d972df71fed2bcaa88e6ce5430d919ec08087d/common.mk#L171-L180 +const execSync = require('child_process').execSync + +const GIT_ORIGIN_REMOTE = 'origin' +const RELEASE_BRANCH = 'master' +const BRANCH = `${GIT_ORIGIN_REMOTE}/${RELEASE_BRANCH}` +const COMMIT_SHA = require('child_process').execSync(`git rev-parse ${BRANCH}`).toString().trim() + +console.log(`*** Running gitlint for commits from ${BRANCH} (${COMMIT_SHA})`) + +try { + execSync(`gitlint --commits ${BRANCH}..HEAD`, { stdio: 'inherit' }) +} catch (error) { + process.exit(1) +} diff --git a/package.json b/package.json index 8e15c698c5..3825f32e60 100644 --- a/package.json +++ b/package.json @@ -22,6 +22,7 @@ "lint": "eslint --ext js,ts,tsx ./", "lint:fix": "yarn run lint --fix", "lint:css": "stylelint src/**/*.css", + "lint-git": "node ./internals/scripts/gitlint.js", "extract-messages": "rm src/locales/en/translation.json && i18next-scanner --config=internals/extractMessages/i18next-scanner.config.js", "fix-grommet-icons-types": "node ./internals/scripts/fix-grommet-icons-types.js", "print-extension-dev-csp": "node ./internals/scripts/print-extension-dev-csp.js"