Add new branch versioning (MINOR)

This commit is contained in:
Paul Hatcherian 2023-09-27 20:17:26 -04:00
parent d3c0da227f
commit 61963e734d
21 changed files with 447 additions and 34 deletions

View file

@ -8,8 +8,10 @@ class ActionConfig {
this.branch = "HEAD";
/** The prefix to use to identify tags */
this.tagPrefix = "v";
/** Use branches instead of tags */
/** (Deprecated) Use branches instead of tags */
this.useBranches = false;
/** If true, the branch will be used to select the maximum version. */
this.versionFromBranch = false;
/** A string which, if present in a git commit, indicates that a change represents a major (breaking) change. Wrap with '/' to match using a regular expression. */
this.majorPattern = "(MAJOR)";
/** A string which indicates the flags used by the `majorPattern` regular expression. */

View file

@ -2,6 +2,7 @@
Object.defineProperty(exports, "__esModule", { value: true });
exports.ConfigurationProvider = void 0;
const CsvUserFormatter_1 = require("./formatting/CsvUserFormatter");
const BranchVersioningTagFormatter_1 = require("./formatting/BranchVersioningTagFormatter");
const DefaultTagFormatter_1 = require("./formatting/DefaultTagFormatter");
const DefaultVersionFormatter_1 = require("./formatting/DefaultVersionFormatter");
const JsonUserFormatter_1 = require("./formatting/JsonUserFormatter");
@ -26,7 +27,12 @@ class ConfigurationProvider {
return new DefaultVersionClassifier_1.DefaultVersionClassifier(this.config);
}
GetVersionFormatter() { return new DefaultVersionFormatter_1.DefaultVersionFormatter(this.config); }
GetTagFormatter() { return new DefaultTagFormatter_1.DefaultTagFormatter(this.config); }
GetTagFormatter(branchName) {
if (this.config.versionFromBranch) {
return new BranchVersioningTagFormatter_1.BranchVersioningTagFormatter(this.config, branchName);
}
return new DefaultTagFormatter_1.DefaultTagFormatter(this.config);
}
GetUserFormatter() {
switch (this.config.userFormatType) {
case 'json': return new JsonUserFormatter_1.JsonUserFormatter(this.config);

View file

@ -22,12 +22,12 @@ function runAction(configurationProvider) {
const commitsProvider = configurationProvider.GetCommitsProvider();
const versionClassifier = configurationProvider.GetVersionClassifier();
const versionFormatter = configurationProvider.GetVersionFormatter();
const tagFormatter = configurationProvider.GetTagFormatter();
const tagFormatter = configurationProvider.GetTagFormatter(yield currentCommitResolver.ResolveBranchNameAsync());
const userFormatter = configurationProvider.GetUserFormatter();
const debugManager = DebugManager_1.DebugManager.getInstance();
if (yield currentCommitResolver.IsEmptyRepoAsync()) {
const versionInfo = new VersionInformation_1.VersionInformation(0, 0, 0, 0, VersionType_1.VersionType.None, [], false, false);
return new VersionResult_1.VersionResult(versionInfo.major, versionInfo.minor, versionInfo.patch, versionInfo.increment, versionInfo.type, versionFormatter.Format(versionInfo), tagFormatter.Format(versionInfo), versionInfo.changed, versionInfo.isTagged, userFormatter.Format('author', []), '', '', '0.0.0', debugManager.getDebugOutput(true));
return new VersionResult_1.VersionResult(versionInfo.major, versionInfo.minor, versionInfo.patch, versionInfo.increment, versionInfo.type, versionFormatter.Format(versionInfo), tagFormatter.Format(versionInfo), versionInfo.changed, versionInfo.isTagged, userFormatter.Format('author', []), '', '', tagFormatter.Parse(tagFormatter.Format(versionInfo)).join('.'), debugManager.getDebugOutput(true));
}
const currentCommit = yield currentCommitResolver.ResolveAsync();
const lastRelease = yield lastReleaseResolver.ResolveAsync(currentCommit, tagFormatter);

View file

@ -0,0 +1,66 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.BranchVersioningTagFormatter = void 0;
const DefaultTagFormatter_1 = require("./DefaultTagFormatter");
/** Default tag formatter which allows a prefix to be specified */
class BranchVersioningTagFormatter extends DefaultTagFormatter_1.DefaultTagFormatter {
getRegex(pattern) {
if (/^\/.+\/[i]*$/.test(pattern)) {
const regexEnd = pattern.lastIndexOf('/');
const parsedFlags = pattern.slice(pattern.lastIndexOf('/') + 1);
return new RegExp(pattern.slice(1, regexEnd), parsedFlags);
}
return new RegExp(pattern);
}
constructor(config, branchName) {
super(config);
this.branchName = branchName;
const pattern = config.versionFromBranch === true ?
new RegExp("[0-9]+.[0-9]+$|[0-9]+$") :
this.getRegex(config.versionFromBranch);
const result = pattern.exec(branchName);
let branchVersion;
switch (result === null || result === void 0 ? void 0 : result.length) {
case 1:
branchVersion = result[0];
break;
case 2:
branchVersion = result[1];
break;
default:
throw new Error(`Unable to parse version from branch named '${branchName}' using pattern '${pattern}'`);
}
const versionValues = branchVersion.split('.');
if (versionValues.length > 2) {
throw new Error(`The version string '${branchVersion}' parsed from branch '${branchName}' is invalid. It must be in the format 'major.minor' or 'major'`);
}
this.major = parseInt(versionValues[0]);
if (isNaN(this.major)) {
throw new Error(`The major version '${versionValues[0]}' parsed from branch '${branchName}' is invalid. It must be a number.`);
}
if (versionValues.length > 1) {
this.minor = parseInt(versionValues[1]);
if (isNaN(this.minor)) {
throw new Error(`The minor version '${versionValues[1]}' parsed from branch '${branchName}' is invalid. It must be a number.`);
}
}
}
IsValid(tag) {
if (!super.IsValid(tag)) {
return false;
}
const parsed = super.Parse(tag);
if (parsed[0] !== this.major) {
return false;
}
if (this.minor !== undefined && parsed[1] !== this.minor) {
return false;
}
return true;
}
Parse(tag) {
const parsed = super.Parse(tag);
return [this.major, this.minor || parsed[1], parsed[2]];
}
}
exports.BranchVersioningTagFormatter = BranchVersioningTagFormatter;

View file

@ -22,6 +22,9 @@ class DefaultTagFormatter {
return `${this.tagPrefix}*[0-9].*[0-9].*[0-9]`;
}
Parse(tag) {
if (tag === '') {
return [0, 0, 0];
}
let tagParts = tag
.replace(this.tagPrefix, '<--!PREFIX!-->')
.replace(this.namespace, '<--!NAMESPACE!-->')

View file

@ -64,10 +64,29 @@ function setOutput(versionResult) {
}
function run() {
return __awaiter(this, void 0, void 0, function* () {
function toBool(value) {
if (!value || value.toLowerCase() === 'false') {
return false;
}
else if (value.toLowerCase() === 'true') {
return true;
}
return false;
}
function toStringOrBool(value) {
if (!value || value === 'false') {
return false;
}
if (value === 'true') {
return true;
}
return value;
}
const config = {
branch: core.getInput('branch'),
tagPrefix: core.getInput('tag_prefix'),
useBranches: core.getInput('use_branches') === 'true',
useBranches: toBool(core.getInput('use_branches')),
versionFromBranch: toStringOrBool(core.getInput('version_from_branch')),
majorPattern: core.getInput('major_pattern'),
minorPattern: core.getInput('minor_pattern'),
majorFlags: core.getInput('major_regexp_flags'),
@ -75,14 +94,17 @@ function run() {
versionFormat: core.getInput('version_format'),
changePath: core.getInput('change_path'),
namespace: core.getInput('namespace'),
bumpEachCommit: core.getInput('bump_each_commit') === 'true',
searchCommitBody: core.getInput('search_commit_body') === 'true',
bumpEachCommit: toBool(core.getInput('bump_each_commit')),
searchCommitBody: toBool(core.getInput('search_commit_body')),
userFormatType: core.getInput('user_format_type'),
enablePrereleaseMode: core.getInput('enable_prerelease_mode') === 'true',
enablePrereleaseMode: toBool(core.getInput('enable_prerelease_mode')),
bumpEachCommitPatchPattern: core.getInput('bump_each_commit_patch_pattern'),
debug: core.getInput('debug') === 'true',
debug: toBool(core.getInput('debug')),
replay: ''
};
if (config.useBranches) {
core.warning(`The 'use_branches' input option is deprecated, please see the documentation for more information on how to use branches`);
}
if (config.versionFormat === '' && core.getInput('format') !== '') {
core.warning(`The 'format' input is deprecated, use 'versionFormat' instead`);
config.versionFormat = core.getInput('format');

View file

@ -29,5 +29,13 @@ class DefaultCurrentCommitResolver {
return lastCommitAll === '';
});
}
ResolveBranchNameAsync() {
return __awaiter(this, void 0, void 0, function* () {
const branchName = this.branch == 'HEAD' ?
process.env.GITHUB_REF_NAME || (yield (0, CommandRunner_1.cmd)('git', 'rev-parse', '--abbrev-ref', 'HEAD'))
: this.branch;
return branchName.trim();
});
}
}
exports.DefaultCurrentCommitResolver = DefaultCurrentCommitResolver;

View file

@ -85,8 +85,9 @@ class DefaultLastReleaseResolver {
core.warning('No tags are present for this repository. If this is unexpected, check to ensure that tags have been pulled from the remote.');
}
}
const [major, minor, patch] = tagFormatter.Parse('');
// no release tags yet, use the initial commit as the root
return new ReleaseInformation_1.ReleaseInformation(0, 0, 0, '', currentMajor, currentMinor, currentPatch, isTagged);
return new ReleaseInformation_1.ReleaseInformation(major, minor, patch, '', currentMajor, currentMinor, currentPatch, isTagged);
}
// parse the version tag
const [major, minor, patch] = tagFormatter.Parse(tag);