chore: Ajout Hook Husky

This commit is contained in:
Luc SORIGNET
2025-05-02 11:22:21 +02:00
parent 24069b894e
commit 266f509d65
3 changed files with 87 additions and 23 deletions

View File

@ -1,4 +1 @@
#!/bin/sh
. "$(dirname "$0")/_/husky.sh"
node scripts/prepare-commit-msg.js "$1" "$2"

View File

@ -1,5 +1,7 @@
# Message de commit (conventionnel) :
#
# Construction automatique depuis une branche aux formats:
# - <type>-<ticket-id>-ma_super_description
# - <type>-ma_super_description
# <type>(<scope>): <description> [#<ticket-id>]
# ex : feat(frontend): ajout de la gestion des utilisateurs dans le dashboard [#1]
#

View File

@ -1,30 +1,95 @@
const fs = require('fs');
const path = require('path');
const fs = require("fs");
const path = require("path");
const { execSync } = require("child_process");
// Fichier template
const TEMPLATE_FILE = path.join(__dirname, './commit-template.txt');
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);
if (commitType === "message" || commitType === "template") {
process.exit(0);
}
// Vérifie si le fichier template existe
if (fs.existsSync(TEMPLATE_FILE)) {
try {
// Lit le fichier template
const templateContent = fs.readFileSync(TEMPLATE_FILE, 'utf8');
const currentCommitMessage = fs.readFileSync(commitMsgFile, "utf8");
const branchName = getBranchName();
const newBranchMessage = formatCommitMessageFromBranchName(branchName);
let newCommitMessage = "";
// Ajoute le contenu du template au message de commit
fs.appendFileSync(commitMsgFile, `\n${templateContent}`);
} catch (error) {
console.error('Erreur lors de la modification du message de commit :', error);
process.exit(1);
}
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 {
console.warn(`Fichier template introuvable : ${TEMPLATE_FILE}`);
}
newCommitMessage = `${currentCommitMessage}\n${getCommitTemplateMsg()}`;
}
fs.writeFileSync(commitMsgFile, newCommitMessage);