dangerjs: Improve check for git commit messages

This commit is contained in:
Tomas Sebestik
2023-03-08 11:00:04 +01:00
parent 7002a5ce10
commit 58d7db6e5d
4 changed files with 58 additions and 26 deletions
+57 -13
View File
@@ -1,26 +1,70 @@
/**
* Check commit message are descriptive enough (longer that 10 characters)
* Check if commit messages are sufficiently descriptive (not too short).
*
* #TODO: this simple logic will be improved in future MRs - Jira IDF-6856.
* Search for commit messages that appear to be automatically generated by Gitlab or temporary messages and report them.
*
* @dangerjs WARN
*/
module.exports = function () {
const shortCommitMessageThreshold = 10; // commit message is considered too short below this number of characters
const mrCommit = danger.gitlab.commits;
const mrCommits = danger.gitlab.commits;
let shortCommitMessages = [];
for (let i = 0; i < mrCommit.length; i++) {
const commitMessage = mrCommit[i].message;
const detectRegexes = [
/^Rebased.*onto.*/i, // Automatically generated message by Gitlab
/^Fast-forwarded.*to.*/i, // Automatically generated message by Gitlab
/^Applied suggestion to.*/i, // Automatically generated message by Gitlab
/^Suggestion applied for line.*/i, // Automatically generated message by Gitlab
/^Opened merge request/i, // Automatically generated message by Gitlab
/^Merged.*/i, // Automatically generated message by Gitlab
/^Opened issue #\d+:.*/i, // Automatically generated message by Gitlab
/^Closed issue #\d+:.*/i, // Automatically generated message by Gitlab
/^Tagged.*as.*/i, // Automatically generated message by Gitlab
/^Deleted tag.*/i, // Automatically generated message by Gitlab
/^WIP.*/i, // Message starts with prefix "WIP"
/^Cleaned.*/i, // Message starts "Cleaned"
/clean ?up/i, // Message contains "clean up"
/^[^A-Za-z0-9\s].*/, // Message starts with special characters
];
// Search for the messages in each commit
let partMessages = [];
for (const commit of mrCommits) {
const commitMessage = commit.message;
const commitMessageTitle = commit.title;
// Check if the commit message contains any Jira ticket references
const jiraTicketRegex = /[A-Z0-9]+-[0-9]+/g;
const jiraTicketMatches = commitMessage.match(jiraTicketRegex);
if (jiraTicketMatches) {
const jiraTicketNames = jiraTicketMatches.join(", ");
partMessages.push(
`- the commit message \`${commitMessageTitle}\` probably contains Jira ticket reference (\`${jiraTicketNames}\`). Please remove Jira tickets from commit messages.`
);
continue;
}
// Check if the commit message matches any regex from "detectRegexes"
if (detectRegexes.some((regex) => commitMessage.match(regex))) {
partMessages.push(
`- the commit message \`${commitMessageTitle}\` appears to be a temporary or automatically generated message`
);
continue;
}
// Check if the commit message is not too short
const shortCommitMessageThreshold = 20; // commit message is considered too short below this number of characters
if (commitMessage.length < shortCommitMessageThreshold) {
shortCommitMessages.push(`- commit message: ${commitMessage}`);
partMessages.push(
`- the commit message \`${commitMessageTitle}\` may not be sufficiently descriptive`
);
}
}
if (shortCommitMessages.length) {
warn(`Some of your commit messages may not be sufficiently descriptive (are shorter than ${shortCommitMessageThreshold} characters):
\n${shortCommitMessages.join("")}
\nYou might consider squashing commits (simplifying branch history) or updating those short commit messages.`);
}
// Create report
if (partMessages.length) {
partMessages.sort();
let dangerMessage = `\nSome issues found for the commit messages in this MR:\n${partMessages.join('\n')}
\nPlease consider updating these commit messages. It is recommended to follow this [commit messages guide](https://gitlab.espressif.cn:6688/espressif/esp-idf/-/wikis/dev-proc/Commit-messages)`;
warn(dangerMessage);
}
};