fix: prepare commit message hook no longer fires on merge/squash/etc

main
Buddy 2 weeks ago
parent 329cf76ff9
commit 6e6961544e

@ -4,52 +4,38 @@
/*{{ if lookPath "node" -}}*/ /*{{ if lookPath "node" -}}*/
#!/usr/bin/env node #!/usr/bin/env node
const fs = require("fs"); // Add a "# [TICKET-ID]" comment hint to the editor when running a plain
const childProcess = require("child_process"); // `git commit` on a branch containing a ticket ID (e.g. buddy/BE-1234/foo,
const { promisify } = require("util"); // fix/BE-1234/bar). The hint is a comment, so git strips it unless you
// uncomment or retype it.
//
// Every other way a commit message gets made is left alone: -m/-F
// ("message"), merge, squash, amend/-c ("commit"), and commit templates
// ("template") all arrive with a mode argument, and we exit immediately.
const exec = promisify(childProcess.exec); import * as fs from "node:fs";
const readFile = promisify(fs.readFile); import { execSync } from "node:child_process";
const writeFile = promisify(fs.writeFile);
const [, , message, mode] = process.argv; const [, , messagePath, mode] = process.argv;
async function main() { if (mode !== undefined) process.exit(0);
const file = await readFile(message, { encoding: "utf8" });
let result;
try {
result = await exec("git rev-parse --abbrev-ref HEAD");
} catch (err) {
return
}
if (message.match(/^#/)) {
return
}
const tags = result.stdout let branch;
.split("\n") try {
.map(branch => branch.match(/[A-Z]+-\d+/g)) branch = execSync("git rev-parse --abbrev-ref HEAD", {
.filter(x => !!x) encoding: "utf8",
.reduce((allIDs, matchedIDs) => [...allIDs, ...matchedIDs], []) stdio: ["ignore", "pipe", "ignore"],
.map(id => `[${id}]`); }).trim();
} catch {
if (tags.length === 0) { process.exit(0); // detached HEAD, rebase, etc.
return;
}
if (tags.find(tag => file.includes(tag))) {
return;
} }
const newFile = mode === 'message' const ids = branch.match(/[A-Z]+-\d+/g);
? file + '\n\n' + tags.join(" ") if (!ids) process.exit(0);
: `\n\n# ` + tags.join(" ") + "\n" + file;
await writeFile(message, newFile); const tags = [...new Set(ids)].map(id => `[${id}]`);
} const file = fs.readFileSync(messagePath, "utf8");
if (tags.some(tag => file.includes(tag))) process.exit(0);
main().catch(err => { fs.writeFileSync(messagePath, `\n\n# ${tags.join(" ")}\n${file}`);
console.error(err);
process.exit(1);
});
/*{{- end }}*/ /*{{- end }}*/

Loading…
Cancel
Save