@gitlab/semantic-release-merge-request-analyzer
Version:
Semantic release plugin to determine version based on GitLab merge request labels
76 lines (62 loc) • 2.33 kB
JavaScript
import getGitLabClient from "./get-gitlab-client.js";
import {
getMergeRequestForCommit,
getReleaseType,
} from "./get-merge-request.js";
import { getDefaultLabelConfig, releaseTypePrecedence } from "./config.js";
/**
* Analyzes commits to determine the release type.
*
* @param {Object} pluginConfig The plugin configuration.
* @param {Object} context The semantic-release context.
* @returns {Promise<string|null>} The release type or null if no release should be created.
*/
async function analyzeCommits(pluginConfig, context) {
const { env, commits, logger } = context;
const projectId = env.CI_PROJECT_ID;
const gitlab = getGitLabClient(context);
// Get label configuration from plugin config or use defaults
const labelConfig =
(pluginConfig && pluginConfig.labels) || getDefaultLabelConfig();
logger.log(`Analyzing ${commits.length} commits to determine release type`);
// Track the highest release type found
let highestReleaseType = null;
let highestReleaseTypeIndex = Infinity;
for (const commit of commits) {
logger.log(`Analyzing commit: ${commit.hash}`);
const mergeRequest = await getMergeRequestForCommit(
gitlab,
projectId,
commit.hash,
logger,
);
if (!mergeRequest) {
logger.log(`Could not find merge request for commit ${commit.hash}`);
continue;
}
const releaseType = getReleaseType(mergeRequest, labelConfig, logger);
if (!releaseType) {
logger.log(
`No release type detected for merge request #${mergeRequest.iid} / commit ${commit.hash}`,
);
continue;
}
logger.log(
`Merge request #${mergeRequest.iid} indicates a ${releaseType} release`,
);
// Update highest release type based on precedence
const releaseTypeIndex = releaseTypePrecedence.indexOf(releaseType);
if (releaseTypeIndex >= 0 && releaseTypeIndex < highestReleaseTypeIndex) {
highestReleaseType = releaseType;
highestReleaseTypeIndex = releaseTypeIndex;
logger.log(`New highest release type: ${highestReleaseType}`);
}
}
if (highestReleaseType) {
logger.success(`Analysis complete: ${highestReleaseType} release`);
} else {
logger.log("Analysis complete: no release needed");
}
return highestReleaseType;
}
export default analyzeCommits;