From 266f509d65dcb20253d492f337fafc124c3e04bb Mon Sep 17 00:00:00 2001 From: Luc SORIGNET Date: Fri, 2 May 2025 11:22:21 +0200 Subject: [PATCH] chore: Ajout Hook Husky --- .husky/prepare-commit-msg | 3 - scripts/commit-template.txt | 4 +- scripts/prepare-commit-msg.js | 103 +++++++++++++++++++++++++++------- 3 files changed, 87 insertions(+), 23 deletions(-) diff --git a/.husky/prepare-commit-msg b/.husky/prepare-commit-msg index bfb96ca..2fa70b3 100644 --- a/.husky/prepare-commit-msg +++ b/.husky/prepare-commit-msg @@ -1,4 +1 @@ -#!/bin/sh -. "$(dirname "$0")/_/husky.sh" - node scripts/prepare-commit-msg.js "$1" "$2" \ No newline at end of file diff --git a/scripts/commit-template.txt b/scripts/commit-template.txt index 2617394..f4b4fde 100644 --- a/scripts/commit-template.txt +++ b/scripts/commit-template.txt @@ -1,5 +1,7 @@ # Message de commit (conventionnel) : -# +# Construction automatique depuis une branche aux formats: +# - --ma_super_description +# - -ma_super_description # (): [#] # ex : feat(frontend): ajout de la gestion des utilisateurs dans le dashboard [#1] # diff --git a/scripts/prepare-commit-msg.js b/scripts/prepare-commit-msg.js index 7cb36f6..1e95184 100644 --- a/scripts/prepare-commit-msg.js +++ b/scripts/prepare-commit-msg.js @@ -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}`); -} \ No newline at end of file + newCommitMessage = `${currentCommitMessage}\n${getCommitTemplateMsg()}`; +} + +fs.writeFileSync(commitMsgFile, newCommitMessage);