Merge branch 'dangerjs/improove_commit_messages' into 'master'

ci: danger: Improve check for git commit messages

Closes IDF-6856 and IDF-6970

See merge request espressif/esp-idf!22655
pull/11041/head
Tomas Sebestik 2023-03-17 19:45:41 +08:00
commit 8e65a673fa
4 zmienionych plików z 58 dodań i 26 usunięć

Wyświetl plik

@ -170,14 +170,6 @@ check_artifacts_expire_time:
# check if we have set expire time for all artifacts
- python tools/ci/check_artifacts_expire_time.py
check_commit_msg:
extends: .pre_check_template
script:
- git status
- git log -n10 --oneline ${PIPELINE_COMMIT_SHA}
# commit start with "WIP: " need to be squashed before merge
- 'git log --pretty=%s origin/master..${PIPELINE_COMMIT_SHA} -- | grep -i "^WIP:" && exit 1 || exit 0'
check_test_scripts_build_test_rules:
extends:
- .pre_check_template

Wyświetl plik

@ -2,8 +2,6 @@
* Modules with checks are stored in ".gitlab/dangerjs/<module_name>". To import them, use path relative to "dangerfile.js"
*/
const checkMrCommits = require(`./mrCommitsCommitMessage.js`);
async function runChecks() {
// Checks for merge request title
require("./mrTitleNoDraftOrWip.js")();

Wyświetl plik

@ -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);
}
};

Wyświetl plik

@ -1,12 +1,10 @@
/**
* Check if MR has not an excessive numbers of commits (if squashed)
*
* #TODO: this simple logic will be improved in future MRs - Jira IDF-6856.
*
* @dangerjs INFO
*/
module.exports = function () {
const tooManyCommitThreshold = 5; // above this number of commits, squash is recommended
const tooManyCommitThreshold = 2; // above this number of commits, squash commits is suggested
const mrCommits = danger.gitlab.commits;
if (mrCommits.length > tooManyCommitThreshold) {