danger-plugin-commitlint-gitlab
Version:
This plugin checks a merge request title and commit messages to make sure they are well formatted and respect the commitlint/lint
106 lines (105 loc) • 4.53 kB
JavaScript
;
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
// Provides dev-time type structures for `danger` - doesn't affect runtime.
const lint = require("@commitlint/lint");
const debug_1 = require("debug");
const debug = (0, debug_1.default)("danger-plugin:commitlint-gitlab");
const defaultConfig = { severity: "fail" };
function check(rules, userConfig) {
return __awaiter(this, void 0, void 0, function* () {
const config = Object.assign(Object.assign({}, defaultConfig), userConfig);
// check MR squash flag and number of commits
const squashFlag = danger.gitlab.mr.squash;
const commitsArrayLength = danger.gitlab.commits.length;
debug("squash flag: ", squashFlag);
debug("MR title: ", danger.gitlab.mr.title);
if (squashFlag === true && commitsArrayLength > 1) {
// If MR sqash flag is true & multiple commits - title must be correct
yield lintCommitMessage(danger.gitlab.mr.title.replace("Draft:", "").trim(), rules, config.severity);
}
else if (squashFlag === false && commitsArrayLength > 1) {
// If MR sqash flag is false & multiple commits - at least one commit must be correct
yield evalMessages(danger.gitlab.commits, rules, config.severity);
// await messageLint(danger.gitlab.commits, rules, config.severity)
}
else {
yield lintCommitMessage(danger.gitlab.commits[0].message, rules, config.severity);
}
});
}
exports.default = check;
function lintCommitMessage(commitMessage, rules, severity) {
return __awaiter(this, void 0, void 0, function* () {
debug("Commit message: ", commitMessage);
return lint(commitMessage, rules).then((report) => {
if (!report.valid) {
let failureMessage = `There is a problem with the commit message\n> ${commitMessage}`;
report.errors.forEach((error) => {
failureMessage = `${failureMessage}\n- ${error.message}`;
});
reportFn(severity, failureMessage);
}
});
});
}
function messageFailed(commitMessage, rules) {
return __awaiter(this, void 0, void 0, function* () {
debug("Commit message: ", commitMessage);
return lint(commitMessage, rules).then((report) => {
if (!report.valid) {
let failureMessage = `There is a problem with the commit message\n> ${commitMessage}`;
report.errors.forEach((error) => {
failureMessage = `${failureMessage}\n- ${error.message}`;
});
return true;
}
else {
return false;
}
});
});
}
function isTrue(currentValue) {
return currentValue === true;
}
function evalMessages(commits, rules, severity) {
return __awaiter(this, void 0, void 0, function* () {
const tab = [];
for (const commit of commits) {
const apromise = messageFailed(commit.message, rules);
yield apromise.then((res) => {
tab.push(res);
});
}
if (tab.every(isTrue)) {
const failureMessage = "At least one commit message should be good. " +
"The commit messages have to be squashed for the checks to only be performed on the MR title";
reportFn(severity, failureMessage);
}
});
}
function reportFn(severity, failureMessage) {
switch (severity) {
case "fail":
fail(failureMessage);
break;
case "warn":
warn(failureMessage);
break;
case "message":
message(failureMessage);
break;
case "disable":
default:
break;
}
}