Skip to content

Commit e709526

Browse files
committed
fix: publish updater URLs from release tags
1 parent 9980446 commit e709526

2 files changed

Lines changed: 28 additions & 1 deletion

File tree

scripts/generate-updater-manifest.mjs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ export async function buildUpdaterManifest({
7272
assets,
7373
readSignature,
7474
requiredPlatforms = [],
75+
downloadBaseUrl,
7576
}) {
7677
const assetsByName = new Map(assets.map((asset) => [asset.name, asset]));
7778
const platforms = {};
@@ -89,7 +90,12 @@ export async function buildUpdaterManifest({
8990

9091
const entry = {
9192
signature: (await readSignature(signatureAsset)).trim(),
92-
url: updaterAsset.browser_download_url,
93+
// A draft GitHub Release reports an `untagged-...` download URL. That
94+
// URL is invalid after publication, so manifests must be addressed by
95+
// the immutable tag rather than copied from the draft asset response.
96+
url: downloadBaseUrl
97+
? `${downloadBaseUrl}/${encodeURIComponent(updaterAsset.name)}`
98+
: updaterAsset.browser_download_url,
9399
};
94100
const baseKey = `${target.os}-${target.arch}`;
95101
const installerKey = `${baseKey}-${target.installer}`;
@@ -176,6 +182,7 @@ async function generateFromGitHub({ repo, tag, output, requiredPlatforms }) {
176182
release,
177183
assets,
178184
requiredPlatforms,
185+
downloadBaseUrl: `https://github.com/${repo}/releases/download/${encodeURIComponent(tag)}`,
179186
readSignature: async (asset) => {
180187
const response = await githubRequest(
181188
`${apiBaseUrl}/repos/${repo}/releases/assets/${asset.id}`,

scripts/generate-updater-manifest.test.mjs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,26 @@ test("builds one complete manifest after all release assets are available", asyn
7979
);
8080
});
8181

82+
test("uses the immutable tag download path instead of a draft asset URL", async () => {
83+
const draftAsset = {
84+
id: 1,
85+
name: "lovcode_aarch64.app.tar.gz",
86+
browser_download_url:
87+
"https://github.com/example/lovcode/releases/download/untagged-draft/lovcode_aarch64.app.tar.gz",
88+
};
89+
const manifest = await buildUpdaterManifest({
90+
release: { ...release, tag_name: "v1.2.3" },
91+
assets: [draftAsset, { ...draftAsset, id: 2, name: `${draftAsset.name}.sig` }],
92+
readSignature: async () => "signature",
93+
downloadBaseUrl: "https://github.com/example/lovcode/releases/download/v1.2.3",
94+
});
95+
96+
assert.equal(
97+
manifest.platforms["darwin-aarch64"].url,
98+
"https://github.com/example/lovcode/releases/download/v1.2.3/lovcode_aarch64.app.tar.gz",
99+
);
100+
});
101+
82102
test("fails before upload when a required target is absent", async () => {
83103
const assets = signedAssetPair(1, "lovcode_aarch64.app.tar.gz");
84104

0 commit comments

Comments
 (0)