This commit is contained in:
@@ -83,7 +83,7 @@ function makeLock(artifact: string, sha256: string) {
|
||||
return {
|
||||
schemaVersion: 1,
|
||||
releaseVersion: '0.1.0',
|
||||
portalVersion: '0.2.23',
|
||||
portalVersion: '0.2.24',
|
||||
catalogue: {
|
||||
id: 'de.add-ideas.toolbox',
|
||||
name: 'Test Toolbox',
|
||||
|
||||
+44
-21
@@ -111,19 +111,24 @@ async function giteaRequest(url, options, { allowNotFound = false } = {}) {
|
||||
}
|
||||
|
||||
const text = await response.text();
|
||||
const payload = text ? (() => {
|
||||
try {
|
||||
return JSON.parse(text);
|
||||
} catch {
|
||||
return { raw: text };
|
||||
}
|
||||
})() : null;
|
||||
const payload = text
|
||||
? (() => {
|
||||
try {
|
||||
return JSON.parse(text);
|
||||
} catch {
|
||||
return { raw: text };
|
||||
}
|
||||
})()
|
||||
: null;
|
||||
|
||||
if (!response.ok) {
|
||||
const detail = payload && typeof payload === 'object' && payload.error
|
||||
? payload.error
|
||||
: payload?.raw ?? text ?? '';
|
||||
throw new Error(`Gitea API request failed (${response.status} ${response.statusText}): ${detail}`);
|
||||
const detail =
|
||||
payload && typeof payload === 'object' && payload.error
|
||||
? payload.error
|
||||
: (payload?.raw ?? text ?? '');
|
||||
throw new Error(
|
||||
`Gitea API request failed (${response.status} ${response.statusText}): ${detail}`
|
||||
);
|
||||
}
|
||||
|
||||
return payload;
|
||||
@@ -148,7 +153,9 @@ async function run() {
|
||||
const lock = await readFile(options.lockFile, 'utf8');
|
||||
const lockJson = JSON.parse(lock);
|
||||
if (!SEMVER.test(lockJson.releaseVersion)) {
|
||||
throw new Error(`Invalid releaseVersion in lock: ${lockJson.releaseVersion}`);
|
||||
throw new Error(
|
||||
`Invalid releaseVersion in lock: ${lockJson.releaseVersion}`
|
||||
);
|
||||
}
|
||||
|
||||
const releaseVersion = parseReleaseVersionFromLock(lockJson);
|
||||
@@ -192,8 +199,12 @@ async function run() {
|
||||
}
|
||||
|
||||
if (dryRun) {
|
||||
console.log(`DRY-RUN: would ensure or create release ${releaseTag} on ${options.owner}/${options.repo}.`);
|
||||
console.log(`DRY-RUN: would upload assets ${path.basename(archive)} and ${path.basename(checksumFile)}.`);
|
||||
console.log(
|
||||
`DRY-RUN: would ensure or create release ${releaseTag} on ${options.owner}/${options.repo}.`
|
||||
);
|
||||
console.log(
|
||||
`DRY-RUN: would upload assets ${path.basename(archive)} and ${path.basename(checksumFile)}.`
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -216,13 +227,15 @@ async function run() {
|
||||
target_commitish: options.target || 'main',
|
||||
name: options.name,
|
||||
body:
|
||||
options.body
|
||||
|| `Automated release of add-ideas toolbox ${releaseTag} from lock release ${releaseVersion}.`,
|
||||
options.body ||
|
||||
`Automated release of add-ideas toolbox ${releaseTag} from lock release ${releaseVersion}.`,
|
||||
draft: false,
|
||||
prerelease: false,
|
||||
};
|
||||
if (dryRun) {
|
||||
console.log(`DRY-RUN: would create release ${releaseTag} on ${options.owner}/${options.repo}`);
|
||||
console.log(
|
||||
`DRY-RUN: would create release ${releaseTag} on ${options.owner}/${options.repo}`
|
||||
);
|
||||
release = { id: '<dry-run>', assets: [] };
|
||||
} else {
|
||||
release = await giteaRequest(`${releasePrefix}/releases`, {
|
||||
@@ -238,14 +251,20 @@ async function run() {
|
||||
} else {
|
||||
release = tagLookup;
|
||||
if (dryRun) {
|
||||
console.log(`DRY-RUN: would reuse existing release ${releaseTag} (${release?.id ?? 'unknown'})`);
|
||||
console.log(
|
||||
`DRY-RUN: would reuse existing release ${releaseTag} (${release?.id ?? 'unknown'})`
|
||||
);
|
||||
} else {
|
||||
console.log(`Using existing release ${releaseTag} (${release.id})`);
|
||||
}
|
||||
}
|
||||
|
||||
if (dryRun) {
|
||||
console.log('DRY-RUN: would upload assets:', options.archive, options.checksum);
|
||||
console.log(
|
||||
'DRY-RUN: would upload assets:',
|
||||
options.archive,
|
||||
options.checksum
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -258,7 +277,9 @@ async function run() {
|
||||
for (const asset of candidateAssets) {
|
||||
const duplicate = existingAssets.find((entry) => entry.name === asset.name);
|
||||
if (duplicate) {
|
||||
console.log(`Deleting existing asset ${asset.name} from release ${releaseTag}`);
|
||||
console.log(
|
||||
`Deleting existing asset ${asset.name} from release ${releaseTag}`
|
||||
);
|
||||
await giteaRequest(
|
||||
`${releasePrefix}/releases/assets/${duplicate.id}`,
|
||||
{ method: 'DELETE', headers },
|
||||
@@ -281,7 +302,9 @@ async function run() {
|
||||
);
|
||||
}
|
||||
|
||||
console.log(`Release ${releaseTag} published on ${options.owner}/${options.repo}`);
|
||||
console.log(
|
||||
`Release ${releaseTag} published on ${options.owner}/${options.repo}`
|
||||
);
|
||||
}
|
||||
|
||||
run().catch((error) => {
|
||||
|
||||
@@ -87,7 +87,9 @@ async function sha256ForPath(filePath) {
|
||||
async function computeRemoteSha256(url) {
|
||||
const response = await fetch(url);
|
||||
if (!response.ok) {
|
||||
throw new Error(`Unable to download artifact (${response.status} ${response.statusText}).`);
|
||||
throw new Error(
|
||||
`Unable to download artifact (${response.status} ${response.statusText}).`
|
||||
);
|
||||
}
|
||||
|
||||
if (!response.body) {
|
||||
@@ -132,7 +134,9 @@ function command(cwd) {
|
||||
child.on('exit', (code) =>
|
||||
code === 0
|
||||
? resolve(undefined)
|
||||
: reject(new Error(`${name} ${args.join(' ')} failed with code ${code}`))
|
||||
: reject(
|
||||
new Error(`${name} ${args.join(' ')} failed with code ${code}`)
|
||||
)
|
||||
);
|
||||
});
|
||||
}
|
||||
@@ -150,7 +154,9 @@ async function run() {
|
||||
${usage()}`);
|
||||
}
|
||||
if (!SEMVER.test(options.releaseVersion)) {
|
||||
throw new Error(`--release-version must be semver: ${options.releaseVersion}`);
|
||||
throw new Error(
|
||||
`--release-version must be semver: ${options.releaseVersion}`
|
||||
);
|
||||
}
|
||||
if (!SEMVER.test(options.appVersion)) {
|
||||
throw new Error(`--app-version must be semver: ${options.appVersion}`);
|
||||
@@ -160,7 +166,8 @@ ${usage()}`);
|
||||
const lockDir = path.dirname(lockPath);
|
||||
const lockJson = JSON.parse(await readFile(lockPath, 'utf8'));
|
||||
const lock = parseReleaseLock(lockJson);
|
||||
const nextReleaseVersion = options.releaseVersion ?? bumpPatch(lock.releaseVersion);
|
||||
const nextReleaseVersion =
|
||||
options.releaseVersion ?? bumpPatch(lock.releaseVersion);
|
||||
if (!SEMVER.test(nextReleaseVersion)) {
|
||||
throw new Error(`Invalid release version: ${nextReleaseVersion}`);
|
||||
}
|
||||
@@ -199,13 +206,17 @@ ${usage()}`);
|
||||
};
|
||||
if (options.portalVersion) {
|
||||
if (!SEMVER.test(options.portalVersion))
|
||||
throw new Error(`--portal-version must be semver: ${options.portalVersion}`);
|
||||
throw new Error(
|
||||
`--portal-version must be semver: ${options.portalVersion}`
|
||||
);
|
||||
nextLock.portalVersion = options.portalVersion;
|
||||
}
|
||||
|
||||
parseReleaseLock(nextLock);
|
||||
await writeFile(lockPath, `${JSON.stringify(nextLock, null, 2)}\n`, 'utf8');
|
||||
console.log(`Updated ${path.relative(process.cwd(), lockPath)} (${options.appId})`);
|
||||
console.log(
|
||||
`Updated ${path.relative(process.cwd(), lockPath)} (${options.appId})`
|
||||
);
|
||||
|
||||
if (!options.assemble) return;
|
||||
const runCommand = command(process.cwd());
|
||||
@@ -229,7 +240,11 @@ ${usage()}`);
|
||||
console.log(`Assembled release -> ${archive}`);
|
||||
const releaseChecksum = `${archive}.sha256`;
|
||||
const releaseSha256 = await sha256ForPath(archive);
|
||||
await writeFile(releaseChecksum, `${releaseSha256} ${path.basename(archive)}\n`, 'utf8');
|
||||
await writeFile(
|
||||
releaseChecksum,
|
||||
`${releaseSha256} ${path.basename(archive)}\n`,
|
||||
'utf8'
|
||||
);
|
||||
console.log(`Assembled release checksum: ${releaseSha256}`);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user