UNPKG

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