aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/packages/turbo-ignore/src/checkCommit.ts
diff options
context:
space:
mode:
Diffstat (limited to 'packages/turbo-ignore/src/checkCommit.ts')
-rw-r--r--packages/turbo-ignore/src/checkCommit.ts104
1 files changed, 104 insertions, 0 deletions
diff --git a/packages/turbo-ignore/src/checkCommit.ts b/packages/turbo-ignore/src/checkCommit.ts
new file mode 100644
index 0000000..af6108e
--- /dev/null
+++ b/packages/turbo-ignore/src/checkCommit.ts
@@ -0,0 +1,104 @@
+import { execSync } from "child_process";
+
+export const skipAllCommits = [
+ `[skip ci]`,
+ `[ci skip]`,
+ `[no ci]`,
+ `[skip vercel]`,
+ `[vercel skip]`,
+];
+
+export const forceAllCommits = [`[vercel deploy]`, `[vercel build]`];
+
+export function skipWorkspaceCommits({ workspace }: { workspace: string }) {
+ return [`[vercel skip ${workspace}]`];
+}
+
+export function forceWorkspaceCommits({ workspace }: { workspace: string }) {
+ return [`[vercel deploy ${workspace}]`, `[vercel build ${workspace}]`];
+}
+
+export function getCommitDetails() {
+ // if we're on Vercel, use the provided commit message
+ if (process.env.VERCEL === "1") {
+ if (process.env.VERCEL_GIT_COMMIT_MESSAGE) {
+ return process.env.VERCEL_GIT_COMMIT_MESSAGE;
+ }
+ }
+ return execSync("git show -s --format=%B").toString();
+}
+
+export function checkCommit({ workspace }: { workspace: string }): {
+ result: "skip" | "deploy" | "continue" | "conflict";
+ scope: "global" | "workspace";
+ reason: string;
+} {
+ const commitMessage = getCommitDetails();
+ const findInCommit = (commit: string) => commitMessage.includes(commit);
+
+ // check workspace specific messages first
+ const forceWorkspaceDeploy = forceWorkspaceCommits({ workspace }).find(
+ findInCommit
+ );
+ const forceWorkspaceSkip = skipWorkspaceCommits({ workspace }).find(
+ findInCommit
+ );
+
+ if (forceWorkspaceDeploy && forceWorkspaceSkip) {
+ return {
+ result: "conflict",
+ scope: "workspace",
+ reason: `Conflicting commit messages found: ${forceWorkspaceDeploy} and ${forceWorkspaceSkip}`,
+ };
+ }
+
+ if (forceWorkspaceDeploy) {
+ return {
+ result: "deploy",
+ scope: "workspace",
+ reason: `Found commit message: ${forceWorkspaceDeploy}`,
+ };
+ }
+
+ if (forceWorkspaceSkip) {
+ return {
+ result: "skip",
+ scope: "workspace",
+ reason: `Found commit message: ${forceWorkspaceSkip}`,
+ };
+ }
+
+ // check global messages last
+ const forceDeploy = forceAllCommits.find(findInCommit);
+ const forceSkip = skipAllCommits.find(findInCommit);
+
+ if (forceDeploy && forceSkip) {
+ return {
+ result: "conflict",
+ scope: "global",
+ reason: `Conflicting commit messages found: ${forceDeploy} and ${forceSkip}`,
+ };
+ }
+
+ if (forceDeploy) {
+ return {
+ result: "deploy",
+ scope: "global",
+ reason: `Found commit message: ${forceDeploy}`,
+ };
+ }
+
+ if (forceSkip) {
+ return {
+ result: "skip",
+ scope: "global",
+ reason: `Found commit message: ${forceSkip}`,
+ };
+ }
+
+ return {
+ result: "continue",
+ scope: "global",
+ reason: `No deploy or skip string found in commit message.`,
+ };
+}