|
| 1 | +#!/usr/bin/env -S pkgx deno^2 run -A |
| 2 | + |
| 3 | +//TODO if you step into dev-dir/subdir does it work? |
| 4 | +//TODO dev off uses PWD which may not be correct if in subdir (obv) |
| 5 | + |
| 6 | +import { Path, utils } from "libpkgx"; |
| 7 | +import shellcode from "./src/shellcode().ts"; |
| 8 | +import sniff from "./src/sniff.ts"; |
| 9 | +import shell_escape from "./src/shell-escape.ts"; |
| 10 | + |
| 11 | +switch (Deno.args[0]) { |
| 12 | + case "--help": { |
| 13 | + const status = await new Deno.Command("pkgx", { |
| 14 | + args: ["gh", "repo", "view", "pkgxdev/dev"], |
| 15 | + }).spawn().status; |
| 16 | + Deno.exit(status.code); |
| 17 | + break; // deno lint insists |
| 18 | + } |
| 19 | + case "--shellcode": |
| 20 | + console.log(shellcode()); |
| 21 | + Deno.exit(0); |
| 22 | + break; // deno lint insists |
| 23 | +} |
| 24 | + |
| 25 | +const snuff = await sniff(Path.cwd()); |
| 26 | + |
| 27 | +const pkgspecs = snuff.pkgs.map((pkg) => `+${utils.pkg.str(pkg)}`); |
| 28 | + |
| 29 | +const cmd = new Deno.Command("pkgx", { |
| 30 | + args: [...pkgspecs], |
| 31 | + stdout: "piped", |
| 32 | + env: { CLICOLOR_FORCE: "1" }, // unfortunate |
| 33 | +}).spawn(); |
| 34 | + |
| 35 | +await cmd.status; |
| 36 | + |
| 37 | +const stdout = (await cmd.output()).stdout; |
| 38 | +let env = new TextDecoder().decode(stdout); |
| 39 | + |
| 40 | +// add any additional env that we sniffed |
| 41 | +for (const [key, value] of Object.entries(snuff.env)) { |
| 42 | + env += `${key}=${shell_escape(value)}\n`; |
| 43 | +} |
| 44 | + |
| 45 | +env = env.trim(); |
| 46 | + |
| 47 | +let undo = ""; |
| 48 | +for (const envln of env.trim().split("\n")) { |
| 49 | + const [key] = envln.split("=", 2); |
| 50 | + const value = Deno.env.get(key); |
| 51 | + if (value) { |
| 52 | + undo += ` export ${key}=${shell_escape(value)}\n`; |
| 53 | + } else { |
| 54 | + undo += ` unset ${key}\n`; |
| 55 | + } |
| 56 | +} |
| 57 | + |
| 58 | +const dir = Deno.cwd(); |
| 59 | + |
| 60 | +const bye_bye_msg = pkgspecs.map((pkgspec) => `-${pkgspec.slice(1)}`).join(" "); |
| 61 | + |
| 62 | +console.log(` |
| 63 | +set -a |
| 64 | +${env} |
| 65 | +set +a |
| 66 | +
|
| 67 | +_pkgx_dev_try_bye() { |
| 68 | + suffix="\${PWD#"${dir}"}" |
| 69 | + if test "$PWD" != "${dir}$suffix"; then |
| 70 | + ${undo.trim()} |
| 71 | + unset -f _pkgx_dev_try_bye |
| 72 | + echo "\\033[31m${bye_bye_msg}\\033[0m" >&2 |
| 73 | + return 0 |
| 74 | + else |
| 75 | + return 1 |
| 76 | + fi |
| 77 | +} |
| 78 | +`.trim()); |
| 79 | + |
| 80 | +console.error("%c%s", "color: green", pkgspecs.join(" ")); |
0 commit comments