137 lines
3.3 KiB
JavaScript
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;
|
|
}
|