Files
nixpkgs/pkgs/by-name/th/the-unarchiver/update/update.mjs
Dark Steveneq 646b892680
Some checks failed
Periodic Merges (6h) / master → staging-nixos (push) Failing after 12m50s
Periodic Merges (6h) / master → staging-next (push) Failing after 12m54s
Periodic Merges (24h) / merge-base(master,staging) → haskell-updates (push) Failing after 11m54s
Periodic Merges (6h) / staging-next → staging (push) Failing after 12m13s
Periodic Merges (24h) / staging-next-25.05 → staging-25.05 (push) Failing after 13m24s
Periodic Merges (24h) / release-25.05 → staging-next-25.05 (push) Failing after 14m28s
push sheeet
2025-10-09 14:15:47 +02:00

104 lines
2.8 KiB
JavaScript
Executable File

#!/usr/bin/env nix-shell
/*
#!nix-shell -i node --pure --packages cacert nodejs yq-go nix
*/
import * as assert from "node:assert/strict";
import * as child_process from "node:child_process";
import * as fsPromises from "node:fs/promises";
import * as path from "node:path";
const __dirname = import.meta.dirname;
/** @typedef {{
rss: {
channel: {
item: Array<{
pubDate: string;
enclosure: {
"+@url": string;
"+@length": string;
"+@type": string;
"+@sparkle:version": string;
"+@sparkle:shortVersionString": string;
};
}>
}
}
}} UpdatesXmlInfo */
/** @typedef {{
version: string;
url: string;
hash: string;
}} Info */
const UPDATE_URL =
"https://updateinfo.devmate.com/com.macpaw.site.theunarchiver/updates.xml";
async function main() {
const filePath = path.join(__dirname, "../info.json");
/** @type {Info} */
const oldInfo = JSON.parse(
await fsPromises.readFile(filePath, { encoding: "utf-8" })
);
const response = await fetch(UPDATE_URL);
assert.ok(response.ok, `Failed to fetch ${UPDATE_URL}`);
/** @type {UpdatesXmlInfo} */
const updatesXmlInfo = JSON.parse(
child_process
.execSync(`yq eval --input-format=xml --output-format=json`, {
input: Buffer.from(await response.arrayBuffer()),
})
.toString()
);
const items = updatesXmlInfo?.rss?.channel?.item;
assert.ok(Array.isArray(items), "items is required");
const item = items.sort(
(a, b) => new Date(b.pubDate).getTime() - new Date(a.pubDate).getTime()
)[0];
const {
"+@url": url,
"+@sparkle:shortVersionString": version,
"+@length": fileSize,
} = item.enclosure;
assert.ok(url, "url is required");
assert.ok(version, "version is required");
assert.ok(fileSize, "fileSize is required");
if (oldInfo.url === url && oldInfo.version === version) {
console.log("[update] No updates found");
return;
}
const [prefetchHash, prefetchStorePath] = child_process
.execSync(`nix-prefetch-url --print-path ${url}`)
.toString()
.split("\n");
const downloadedFileSize = (await fsPromises.stat(prefetchStorePath)).size;
if (Number(fileSize) !== downloadedFileSize) {
console.error(
`File size mismatch: expected ${fileSize}, got ${downloadedFileSize}`
);
process.exit(1);
}
const hash = child_process
.execSync(`nix --extra-experimental-features nix-command hash convert --hash-algo sha256 --to sri ${prefetchHash}`)
.toString()
.trim();
/** @type {Info} */
const info = {
version,
url,
hash,
};
console.log(`[update] Updating Notion ${oldInfo.version} -> ${info.version}`);
await fsPromises.writeFile(filePath, JSON.stringify(info, null, 2) + "\n", {
encoding: "utf-8",
});
console.log("[update] Updating Notion complete");
}
main();