Files
Toju/tools/resolve-release-version.js
2026-03-10 23:56:53 +01:00

137 lines
3.3 KiB
JavaScript

const fs = require('fs');
const path = require('path');
const rootDir = path.resolve(__dirname, '..');
const packageJsonPath = path.join(rootDir, 'package.json');
function parseArgs(argv) {
const args = {};
for (let index = 0; index < argv.length; index += 1) {
const token = argv[index];
if (!token.startsWith('--')) {
continue;
}
const key = token.slice(2);
const nextToken = argv[index + 1];
if (!nextToken || nextToken.startsWith('--')) {
args[key] = true;
continue;
}
args[key] = nextToken;
index += 1;
}
return args;
}
function normalizeVersion(rawValue) {
if (typeof rawValue !== 'string') {
return null;
}
const trimmedValue = rawValue.trim();
if (!trimmedValue) {
return null;
}
return trimmedValue.replace(/^v/i, '').split('+')[0] || null;
}
function parseVersion(rawValue) {
const normalized = normalizeVersion(rawValue);
if (!normalized) {
return null;
}
const match = normalized.match(/^(\d+)\.(\d+)\.(\d+)(?:-[0-9A-Za-z.-]+)?$/);
if (!match) {
return null;
}
return {
major: Number.parseInt(match[1], 10),
minor: Number.parseInt(match[2], 10),
patch: Number.parseInt(match[3], 10)
};
}
function resolveBaseVersion() {
const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8'));
const parsedVersion = parseVersion(packageJson.version);
if (!parsedVersion) {
throw new Error(`package.json version must be a full semver string. Received: ${packageJson.version}`);
}
return parsedVersion;
}
function resolveReleaseVersion(args) {
const explicitVersion = normalizeVersion(args.version || process.env.RELEASE_VERSION);
if (explicitVersion) {
return explicitVersion;
}
const baseVersion = resolveBaseVersion();
const rawRunNumber = args['run-number'] || process.env.GITHUB_RUN_NUMBER || process.env.GITEA_RUN_NUMBER;
const parsedRunNumber = Number.parseInt(String(rawRunNumber || '').trim(), 10);
if (Number.isFinite(parsedRunNumber) && parsedRunNumber > 0) {
return `${baseVersion.major}.${baseVersion.minor}.${baseVersion.patch + parsedRunNumber}`;
}
return `${baseVersion.major}.${baseVersion.minor}.${baseVersion.patch}`;
}
function appendOutputLine(outputPath, key, value) {
fs.appendFileSync(outputPath, `${key}=${value}\n`, 'utf8');
}
function main() {
const args = parseArgs(process.argv.slice(2));
const version = resolveReleaseVersion(args);
const tag = typeof args.tag === 'string' && args.tag.trim().length > 0
? args.tag.trim()
: `v${version}`;
const result = {
release_name: `MetoYou ${version}`,
release_tag: tag,
release_version: version
};
if (args['write-output']) {
if (!process.env.GITHUB_OUTPUT) {
throw new Error('GITHUB_OUTPUT is not set.');
}
appendOutputLine(process.env.GITHUB_OUTPUT, 'release_version', result.release_version);
appendOutputLine(process.env.GITHUB_OUTPUT, 'release_tag', result.release_tag);
appendOutputLine(process.env.GITHUB_OUTPUT, 'release_name', result.release_name);
}
if (args.json) {
console.log(JSON.stringify(result, null, 2));
return;
}
console.log(result.release_version);
}
try {
main();
} catch (error) {
const message = error instanceof Error ? error.message : String(error);
console.error(`[release-version] ${message}`);
process.exitCode = 1;
}