aboutsummaryrefslogtreecommitdiff
path: root/nixpkgs/pkgs/development/web/deno/update/common.ts
diff options
context:
space:
mode:
Diffstat (limited to 'nixpkgs/pkgs/development/web/deno/update/common.ts')
-rw-r--r--nixpkgs/pkgs/development/web/deno/update/common.ts65
1 files changed, 65 insertions, 0 deletions
diff --git a/nixpkgs/pkgs/development/web/deno/update/common.ts b/nixpkgs/pkgs/development/web/deno/update/common.ts
new file mode 100644
index 00000000000..d8956b21d16
--- /dev/null
+++ b/nixpkgs/pkgs/development/web/deno/update/common.ts
@@ -0,0 +1,65 @@
+interface GHRelease {
+ tag_name: string;
+}
+
+const decode = (buffer: Uint8Array) => new TextDecoder("utf-8").decode(buffer);
+const run = async (command: string, args: string[]) => {
+ const cmd = Deno.run(
+ { cmd: [command, ...args], stdout: "piped", stderr: "piped" },
+ );
+ if (!(await cmd.status()).success) {
+ const error = await cmd.stderrOutput().then((b) => decode(b).trimEnd());
+ // Known error we can ignore
+ if (error.includes("'allow-unsafe-native-code-during-evaluation'")) {
+ // Extract the target sha256 out of the error
+ const target = " got: sha256:";
+ const match = error
+ .split("\n")
+ .find((l) => l.includes(target))
+ ?.split(target)[1];
+ if (typeof match !== "undefined") {
+ return match;
+ }
+ }
+ throw new Error(error);
+ }
+ return cmd.output().then((b) => decode(b).trimEnd());
+};
+
+// Exports
+export const versionRegExp = /\d+\.\d+\.\d+/;
+export const sha256RegExp = /[a-z0-9]{52}/;
+
+export async function commit(
+ name: string,
+ oldVer: string,
+ newVer: string,
+ files: string[],
+) {
+ await run("git", ["add", ...files]);
+ await run("git", ["commit", "-m", `${name}: ${oldVer} -> ${newVer}`]);
+}
+
+export const getExistingVersion = async (filePath: string) =>
+ read(filePath).then((s) =>
+ s.match(genValueRegExp("version", versionRegExp))?.shift() || ""
+ );
+
+export const getLatestVersion = (owner: string, repo: string) =>
+ fetch(`https://api.github.com/repos/${owner}/${repo}/releases`)
+ .then((res) => res.json())
+ .then((res: GHRelease[]) => res[0].tag_name);
+
+// The (?<=) and (?=) allow replace to only change inside
+// Match the regex passed in or empty
+export const genValueRegExp = (key: string, regex: RegExp) =>
+ new RegExp(`(?<=${key} = ")(${regex.source}|)(?=")`);
+
+export const logger = (name: string) =>
+ (...a: any) => console.log(`[${name}]`, ...a);
+
+export const nixPrefetch = (args: string[]) => run("nix-prefetch", args);
+export const nixPrefetchURL = (args: string[]) => run("nix-prefetch-url", args);
+
+export const read = Deno.readTextFile;
+export const write = Deno.writeTextFile;