// Copyright 2018-2024 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); if ( prTitle.startsWith("chore:") && prTitle.includes("deno_core") && (prTitle.includes("upgrade") || prTitle.includes("update")) ) { console.error([ "Please categorize this deno_core upgrade as a 'feat:', 'fix:' or a ", "'refactor:'. If your upgrade does not fall into either of these ", "categories, wait until the next deno_core release.\n\n", "For feats and fixes, please title your PR outlining the fixed issue ", "rather than just `fix: upgrade deno_core` so that users understand the ", "change that was made in the changelog.", ].join("")); Deno.exit(1); } // 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 ", // allow Reland PRs because when editing the changelog, it helps us identify // commits that were reverted, but then relanded "Reland ", // Allow landing breaking changes that are properly marked "BREAKING", // Allow landing breaking changes that will be applied in Deno 2, or available // immediately with DENO_FUTURE=1 env var "FUTURE", ]; 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); }