Files
n3wt-school/scripts/prepare-commit-msg.js
2025-05-04 13:37:05 +02:00

96 lines
2.9 KiB
JavaScript

const fs = require("fs");
const path = require("path");
const { execSync } = require("child_process");
function getBranchName() {
return execSync("git rev-parse --abbrev-ref HEAD").toString().trim();
}
function formatCommitMessageFromBranchName(branchName) {
// Vérifie si le nom de la branche suit le format "type-(ID_TIKET)-nom_de_fonctionnalité"
const typeAllowed = [
"feat",
"fix",
"docs",
"style",
"refactor",
"test",
"chore",
];
const typeRegex = typeAllowed.join("|");
const regex = new RegExp(`^(${typeRegex})-([0-9]+)-(.+)$`);
const match = branchName.match(regex);
const regexWithoutTicket = new RegExp(`^(${typeRegex})-(.+)$`);
const matchWithoutTicket = branchName.match(regexWithoutTicket);
if (match) {
const type = match[1];
const idTicket = match[2];
const featureName = match[3];
return `${type}: ${featureName.replace(/[-_]/g, " ")} [#${idTicket}]`;
} else if (matchWithoutTicket) {
const type = matchWithoutTicket[1];
const featureName = matchWithoutTicket[2];
return `${type}: ${featureName.replace(/[-_]/g, " ")}`;
}
return null;
}
/**
* Ajoute le contenu du fichier template au message de commit
* @param {*} commitMsg
*/
function getCommitTemplateMsg() {
// Fichier template
const TEMPLATE_FILE = path.join(__dirname, "./commit-template.txt");
// Vérifie si le fichier template existe
if (fs.existsSync(TEMPLATE_FILE)) {
try {
// Lit le fichier template
const templateContent = fs.readFileSync(TEMPLATE_FILE, "utf8");
// Ajoute le contenu du template au message de commit
return `${templateContent}`;
} catch (error) {
console.error(
"Erreur lors de la modification du message de commit :",
error
);
process.exit(1);
}
} else {
console.warn(`Fichier template introuvable : ${TEMPLATE_FILE}`);
}
}
// ----------------------------------------------------
// MAIN
// ----------------------------------------------------
// Arguments passés par Husky
const commitMsgFile = process.argv[2];
const commitType = process.argv[3];
// Vérifie si le commit est interactif
if (commitType === "message" || commitType === "template") {
process.exit(0);
}
const currentCommitMessage = fs.readFileSync(commitMsgFile, "utf8");
const branchName = getBranchName();
const newBranchMessage = formatCommitMessageFromBranchName(branchName);
let newCommitMessage = "";
if (newBranchMessage) {
// Vérifie si le message de commit est déjà présent
const messageRegex = new RegExp(`^${newBranchMessage}`, "m");
if (!messageRegex.test(currentCommitMessage)) {
newCommitMessage = `${newBranchMessage}\n${getCommitTemplateMsg()}\n${currentCommitMessage}`;
} else {
// Si le message de commit est déjà présent, on ne fait rien
newCommitMessage = currentCommitMessage;
}
} else {
newCommitMessage = `${currentCommitMessage}\n${getCommitTemplateMsg()}`;
}
fs.writeFileSync(commitMsgFile, newCommitMessage);