import { getRelease, uploadAsset } from "../src/github"; import { fetch } from "../src/fetch"; import { spawn } from "../src/spawn"; import { confirm, exit, log, stdin, warn } from "../src/console"; import { hash, join, rm, tmp, write, basename, blob } from "../src/fs"; const [tag, ...paths] = process.argv.slice(2); if (!tag) { exit("Invalid arguments: [tag] [...assets]"); } const { tag_name, assets } = await getRelease(tag); log("Release:", tag_name, "\n"); log("Existing assets:\n", ...assets.map(({ name }) => `- ${name}\n`)); log("Updating assets:\n", ...paths.map(path => `+ ${basename(path)}\n`)); await confirm(); log("Hashing assets...\n"); const existing: Map = new Map(); for (const { name, browser_download_url } of assets) { if (name.startsWith("SHASUMS256.txt")) { continue; } const response = await fetch(browser_download_url); const buffer = Buffer.from(await response.arrayBuffer()); existing.set(name, await hash(buffer)); } const updated: Map = new Map(); for (const path of paths) { const name = basename(path); updated.set(name, await hash(path)); } log( "Unchanged hashes:\n", ...Array.from(existing.entries()) .filter(([name]) => !updated.has(name)) .map(([name, sha256]) => ` - ${sha256} => ${name}\n`), ); log("Changed hashes:\n", ...Array.from(updated.entries()).map(([name, sha256]) => ` + ${sha256} => ${name}\n`)); await confirm(); log("Signing assets...\n"); const cwd = tmp(); const path = join(cwd, "SHASUMS256.txt"); const signedPath = `${path}.asc`; write( path, [...Array.from(updated.entries()), ...Array.from(existing.entries()).filter(([name]) => !updated.has(name))] .sort(([a], [b]) => a.localeCompare(b)) .map(([name, sha256]) => `${sha256} ${name}`) .join("\n"), ); const { stdout: keys } = spawn("gpg", ["--list-secret-keys", "--keyid-format", "long"]); const verifiedKeys = [ "F3DCC08A8572C0749B3E18888EAB4D40A7B22B59", // robobun@oven.sh ]; if (!verifiedKeys.find(key => keys.includes(key))) { warn("Signature is probably wrong, key not found: robobun@oven.sh"); } const passphrase = await stdin("Passphrase:"); log(); const { exitCode, stdout, stderr } = spawn( "gpg", ["--pinentry-mode", "loopback", "--passphrase-fd", "0", "--clearsign", "--output", signedPath, path], { // @ts-ignore input: passphrase, stdout: "inherit", stderr: "inherit", }, ); if (exitCode !== 0) { exit(stdout || stderr); } const uploads = [...paths, path, signedPath]; log("Uploading assets:\n", ...uploads.map(path => ` + ${basename(path)}\n`)); await confirm(); for (const path of uploads) { const name = basename(path); await uploadAsset(tag_name, name, blob(path)); } try { rm(cwd); } catch { warn("Failed to cleanup:", cwd, "\n"); } log("Done"); process.exit(0); // FIXME install'>dave/postinstall Unnamed repository; edit this file 'description' to name the repository.
aboutsummaryrefslogtreecommitdiff
AgeCommit message (Expand)AuthorFilesLines
2023-07-30Fix coredump when reading an empty file(`node:stream:createReadStream`) (#3882)Gravatar Ai Hoshino 2-0/+30
2023-07-30Improv. (#3885)Gravatar Tiramify (A.K. Daniel) 3-37/+38
2023-07-29Make `bun:jsc` memoryUsage more accurate (#3876)Gravatar Jarred Sumner 6-68/+61
2023-07-29docs: fixed small errors (#3879)Gravatar 0xflotus 4-4/+4
2023-07-29fix: small error (#3878)Gravatar 0xflotus 1-1/+1
2023-07-29typo spawn.md (#3875)Gravatar Jhorman Tito 1-1/+1
2023-07-28Update nodejs-apis.mdGravatar Jarred Sumner 1-4/+4
2023-07-28Update nodejs-apis.mdGravatar Jarred Sumner 1-5/+5
2023-07-28Defer task destructionbun-v0.7.1Gravatar Jarred Sumner 1-1/+17
2023-07-28Stat largefile test (#3870)Gravatar Jarred Sumner 1-0/+22
2023-07-28Ignore when printing to stdout errors (#3869)Gravatar Jarred Sumner 1-2/+4
2023-07-28Fix bug with `/path/to/absolute/bun.lockb`Gravatar Jarred Sumner 1-10/+13
2023-07-28markBindingGravatar Dylan Conway 1-0/+1
2023-07-28optional parameterGravatar Dylan Conway 1-3/+3
2023-07-28Fixes #3868Gravatar Jarred Sumner 1-2/+3
2023-07-28Fix assertion failure and possible infinite loop when printing as yarn lock f...Gravatar Jarred Sumner 2-3/+16
2023-07-28Mark broken test as todoGravatar Jarred Sumner 2-1/+5
2023-07-28fix types and add message channel/port gc testGravatar Dylan Conway 2-62/+18
2023-07-28`MessageChannel` and `MessagePort` (#3860)Gravatar Dylan Conway 57-247/+3752
2023-07-28mark tests as todoGravatar Jarred Sumner 2-81/+75
2023-07-28add fork to child_process (#3851)Gravatar Vlad Sirenko 7-19/+446
2023-07-28feat(bun/test): Impl. expect().pass() & expect().fail() (#3843)Gravatar Tiramify (A.K. Daniel) 6-5/+212
2023-07-28fix the chunk boundary (`node:stream:createReadStream`) (#3853)Gravatar Ai Hoshino 3-8/+90
2023-07-28Support file: URLs in `fetch` (#3858)Gravatar Jarred Sumner 6-183/+281
2023-07-28fix(tls) exposes native canonicalizeIP and fix rootCertificates (#3866)Gravatar Ciro Spaciari 7-29/+125
2023-07-28Fixes #3795 (#3856)Gravatar Jarred Sumner 11-6/+140
2023-07-28Add todoGravatar Jarred Sumner 2-0/+8
2023-07-28Update pull_request_template.mdGravatar Jarred Sumner 1-1/+1
2023-07-28Update pull_request_template.mdGravatar Jarred Sumner 1-11/+16
2023-07-27Fix bug with // @bun annotation in main thread (#3855)Gravatar Jarred Sumner 4-2/+53
2023-07-27Add `Bun.isMainThread`Gravatar Jarred Sumner 7-3/+48
2023-07-27Uncomment testGravatar Jarred Sumner 1-1/+1
2023-07-27Resolve watch directories outside main thread + async iterator and symlink fi...Gravatar Ciro Spaciari 8-197/+523
2023-07-27Update pull_request_template.mdGravatar Jarred Sumner 1-1/+1
2023-07-27Update pull_request_template.mdGravatar Jarred Sumner 1-1/+1
2023-07-27Update pull_request_template.mdGravatar Jarred Sumner 1-1/+1
2023-07-27Update pull_request_template.mdGravatar Jarred Sumner 1-2/+2
2023-07-27Update pull_request_template.mdGravatar Jarred Sumner 1-0/+4
2023-07-27Update pull_request_template.mdGravatar Jarred Sumner 1-5/+11