diff options
| author | 2023-04-28 01:36:44 +0800 | |
|---|---|---|
| committer | 2023-04-28 01:36:44 +0800 | |
| commit | dd84b9d64fb98746a230cd24233ff50a562c39c9 (patch) | |
| tree | b583261ef00b3afe72ec4d6dacb31e57779a6faf /packages/turbo-ignore/src/checkCommit.ts | |
| parent | 0b46fcd72ac34382387b2bcf9095233efbcc52f4 (diff) | |
| download | HydroRoll-dd84b9d64fb98746a230cd24233ff50a562c39c9.tar.gz HydroRoll-dd84b9d64fb98746a230cd24233ff50a562c39c9.zip | |
Diffstat (limited to 'packages/turbo-ignore/src/checkCommit.ts')
| -rw-r--r-- | packages/turbo-ignore/src/checkCommit.ts | 104 |
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.`, + }; +} |
