65 lines
2.6 KiB
JavaScript
65 lines
2.6 KiB
JavaScript
const PRODUCT_NAME = 'Multi Hoster Uploader';
|
|
const ARTIFACT_NAME = 'Multi-Hoster-Upload';
|
|
|
|
function requireEnglishReleaseNotes(value) {
|
|
const notes = typeof value === 'string' ? value.trim() : '';
|
|
if (!/[A-Za-z]/.test(notes)) {
|
|
throw new Error('English release notes are required');
|
|
}
|
|
return notes;
|
|
}
|
|
|
|
export function parseReleaseArgs(args) {
|
|
const version = Array.isArray(args) ? args[0] : '';
|
|
if (!/^\d+\.\d+\.\d+$/.test(version || '')) {
|
|
throw new Error('Usage: <version> --transport-tag <vX.Y.Z> [release notes] [--dry-run]');
|
|
}
|
|
|
|
const transportTagIndex = args.indexOf('--transport-tag');
|
|
const transportTag = transportTagIndex >= 0 ? args[transportTagIndex + 1] : '';
|
|
if (!/^v\d+\.\d+\.\d+$/.test(transportTag)) {
|
|
throw new Error('--transport-tag must match vX.Y.Z');
|
|
}
|
|
|
|
const excludedIndexes = new Set([0, transportTagIndex, transportTagIndex + 1]);
|
|
const notes = requireEnglishReleaseNotes(args.filter((arg, index) => !excludedIndexes.has(index) && arg !== '--dry-run').join(' '));
|
|
return { version, transportTag, notes, dryRun: args.includes('--dry-run') };
|
|
}
|
|
|
|
export function createReleasePlan(options) {
|
|
const releaseBody = requireEnglishReleaseNotes(options.notes);
|
|
const releaseTitle = `${PRODUCT_NAME} v${options.version}`;
|
|
const setupName = `${ARTIFACT_NAME} Setup ${options.version}.exe`;
|
|
const portableName = `${ARTIFACT_NAME} ${options.version}.exe`;
|
|
const blockmapName = `${setupName}.blockmap`;
|
|
const githubSetupName = setupName.replaceAll(' ', '.');
|
|
const githubPortableName = portableName.replaceAll(' ', '.');
|
|
const githubBlockmapName = blockmapName.replaceAll(' ', '.');
|
|
return {
|
|
...options,
|
|
tag: options.transportTag,
|
|
releaseTitle,
|
|
releaseBody,
|
|
setupName,
|
|
portableName,
|
|
blockmapName,
|
|
githubSetupName,
|
|
githubPortableName,
|
|
githubBlockmapName,
|
|
expectedArtifacts: [setupName, portableName, blockmapName, 'latest.yml'],
|
|
githubExpectedArtifacts: [githubSetupName, githubPortableName, githubBlockmapName, 'latest.yml']
|
|
};
|
|
}
|
|
|
|
export function resolveExistingReleaseId(plan, release) {
|
|
const existingTitle = typeof release?.name === 'string' ? release.name : '';
|
|
if (existingTitle !== plan.releaseTitle) {
|
|
throw new Error(`Refusing recovery for ${plan.tag}: existing release title "${existingTitle}" does not match "${plan.releaseTitle}"`);
|
|
}
|
|
return release.id;
|
|
}
|
|
|
|
export function renderLatestYml(plan, sha, size, releaseDate = new Date().toISOString(), setupName = plan.setupName) {
|
|
return `version: ${plan.version}\nfiles:\n - url: ${setupName}\n sha512: ${sha}\n size: ${size}\npath: ${setupName}\nsha512: ${sha}\nreleaseDate: '${releaseDate}'\n`;
|
|
}
|