summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.github/workflows/ci.generate.ts6
-rw-r--r--.github/workflows/ci.yml3
-rw-r--r--tools/verify_pr_title.js47
3 files changed, 56 insertions, 0 deletions
diff --git a/.github/workflows/ci.generate.ts b/.github/workflows/ci.generate.ts
index 06d8e0a02..46a2bc632 100644
--- a/.github/workflows/ci.generate.ts
+++ b/.github/workflows/ci.generate.ts
@@ -474,6 +474,12 @@ const ci = {
"deno run --unstable --allow-write --allow-read --allow-run ./tools/format.js --check",
},
{
+ name: "Lint PR title",
+ if: "matrix.job == 'lint' && github.event_name == 'pull_request'",
+ run:
+ "deno run ./tools/verify_pr_title.js '${{ github.event.pull_request.title }}'",
+ },
+ {
name: "lint.js",
if: "matrix.job == 'lint'",
run:
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 474da1deb..ce99b96c6 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -285,6 +285,9 @@ jobs:
- name: test_format.js
if: '!(github.event_name == ''pull_request'' && matrix.skip_pr) && (steps.exit_early.outputs.EXIT_EARLY != ''true'' && (matrix.job == ''lint''))'
run: deno run --unstable --allow-write --allow-read --allow-run ./tools/format.js --check
+ - name: Lint PR title
+ if: '!(github.event_name == ''pull_request'' && matrix.skip_pr) && (steps.exit_early.outputs.EXIT_EARLY != ''true'' && (matrix.job == ''lint'' && github.event_name == ''pull_request''))'
+ run: 'deno run ./tools/verify_pr_title.js ''${{ github.event.pull_request.title }}'''
- name: lint.js
if: '!(github.event_name == ''pull_request'' && matrix.skip_pr) && (steps.exit_early.outputs.EXIT_EARLY != ''true'' && (matrix.job == ''lint''))'
run: deno run --unstable --allow-write --allow-read --allow-run ./tools/lint.js
diff --git a/tools/verify_pr_title.js b/tools/verify_pr_title.js
new file mode 100644
index 000000000..be877bbfd
--- /dev/null
+++ b/tools/verify_pr_title.js
@@ -0,0 +1,47 @@
+// Copyright 2018-2023 the Deno authors. All rights reserved. MIT license.
+const prTitle = Deno.args[0];
+
+if (prTitle == null) {
+ Deno.exit(0); // not a PR
+}
+
+console.log("PR title:", prTitle);
+
+// This is a release PR, so it's valid.
+if (/^[^\s]+\.[^\s]+\.[^\s]+$/.test(prTitle)) {
+ console.log("Valid.");
+ Deno.exit(0);
+}
+
+const validPrefixes = [
+ "chore",
+ "fix",
+ "feat",
+ "perf",
+ "ci",
+ "cleanup",
+ "docs",
+ "bench",
+ "build",
+ "refactor",
+ "test",
+ // allow Revert PRs because it allows us to remove the landed
+ // commit from the generated changelog
+ "Revert ",
+];
+
+if (validPrefixes.some((prefix) => prTitle.startsWith(prefix))) {
+ console.log("Valid.");
+} else {
+ console.error(
+ "The PR title must start with one of the following prefixes:\n",
+ );
+ for (const prefix of validPrefixes) {
+ console.error(` - ${prefix}`);
+ }
+ console.error(
+ "\nPlease fix the PR title according to https://www.conventionalcommits.org " +
+ "then push an empty commit to reset the CI.",
+ );
+ Deno.exit(1);
+}