From 10bab8facaa676e7dea7c3145fada097e4cf2d22 Mon Sep 17 00:00:00 2001 From: Felipe Santos Date: Sat, 15 Feb 2025 12:47:40 -0300 Subject: [PATCH 1/4] Fix when pkgx is installed by Homebrew on Linux --- pkgm.ts | 38 +++++++++++++++++++++++++++----------- 1 file changed, 27 insertions(+), 11 deletions(-) diff --git a/pkgm.ts b/pkgm.ts index 645b57b..2dd5303 100755 --- a/pkgm.ts +++ b/pkgm.ts @@ -1,21 +1,31 @@ #!/usr/bin/env -S pkgx --quiet deno^2.1 run --ext=ts --allow-sys=uid --allow-run --allow-env=PKGX_DIR,HOMEBREW_PREFIX,HOME --allow-read=/usr/local/pkgs import { dirname, fromFileUrl, join } from "jsr:@std/path@^1"; import { ensureDir, existsSync } from "jsr:@std/fs@^1"; -import { parse as parse_args } from "jsr:@std/flags@0.224.0"; +import { parseArgs } from "jsr:@std/cli@^1"; import * as semver from "jsr:@std/semver@^1"; function standardPath() { - const basePath = "/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin"; - // for pkgm installed via homebrew - const homebrew = `${Deno.env.get("HOMEBREW_PREFIX") || "/opt/homebrew"}/bin`; - if (Deno.build.os === "darwin") { - return `${homebrew}:${basePath}`; - } else { - return basePath; + let path = "/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin"; + + // for pkgx installed via homebrew + let homebrewPrefix = ""; + switch (Deno.build.os) { + case "darwin": + homebrewPrefix = "/opt/homebrew"; + break; + case "linux": + homebrewPrefix = "/home/linuxbrew/.linuxbrew"; + break; } + if (homebrewPrefix) { + homebrewPrefix = Deno.env.get("HOMEBREW_PREFIX") ?? homebrewPrefix; + path = `${homebrewPrefix}/bin:${path}`; + } + + return path; } -const parsedArgs = parse_args(Deno.args, { +const parsedArgs = parseArgs(Deno.args, { alias: { v: "version", h: "help", @@ -117,7 +127,7 @@ async function install(args: string[]) { } const self = fromFileUrl(import.meta.url); - const pkgx_dir = Deno.env.get("PKGX_DIR") || `${Deno.env.get("HOME")}/.pkgx`; + const pkgx_dir = Deno.env.get("PKGX_DIR") ?? `${Deno.env.get("HOME")}/.pkgx`; const needs_sudo = Deno.uid() != 0; const runtime_env = expand_runtime_env(json.runtime_env); @@ -135,7 +145,13 @@ async function install(args: string[]) { runtime_env, ...to_install, ]; - const cmd = needs_sudo ? "/usr/bin/sudo" : args.shift()!; + let cmd = "" + if (needs_sudo) { + cmd = "/usr/bin/sudo"; + args.unshift("-E"); // we already cleared the env, it's safe + } else { + cmd = args.shift()!; + } status = await new Deno.Command(cmd, { args, env, clearEnv: true }) .spawn().status; Deno.exit(status.code); From 8fc657b4281a4d1572faa7acb95ff6aeba7e4704 Mon Sep 17 00:00:00 2001 From: Felipe Santos Date: Sat, 15 Feb 2025 12:53:22 -0300 Subject: [PATCH 2/4] Search in ~/.linuxbrew too --- pkgm.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkgm.ts b/pkgm.ts index 2dd5303..3953f7c 100755 --- a/pkgm.ts +++ b/pkgm.ts @@ -14,7 +14,7 @@ function standardPath() { homebrewPrefix = "/opt/homebrew"; break; case "linux": - homebrewPrefix = "/home/linuxbrew/.linuxbrew"; + homebrewPrefix = `/home/linuxbrew/.linuxbrew:${Deno.env.get("HOME")}/.linuxbrew`; break; } if (homebrewPrefix) { From 07a6adb883cac8da355f0548251cf7bc6f40b7a6 Mon Sep 17 00:00:00 2001 From: Felipe Santos Date: Sat, 15 Feb 2025 12:57:30 -0300 Subject: [PATCH 3/4] Add comment for /usr/local which is also homebrew prefix --- pkgm.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkgm.ts b/pkgm.ts index 3953f7c..3af4ebc 100755 --- a/pkgm.ts +++ b/pkgm.ts @@ -11,7 +11,7 @@ function standardPath() { let homebrewPrefix = ""; switch (Deno.build.os) { case "darwin": - homebrewPrefix = "/opt/homebrew"; + homebrewPrefix = "/opt/homebrew"; // /usr/local is already in the path break; case "linux": homebrewPrefix = `/home/linuxbrew/.linuxbrew:${Deno.env.get("HOME")}/.linuxbrew`; From 611a9a34fb196d214cf65a8549e1fc96529bd1ff Mon Sep 17 00:00:00 2001 From: Felipe Santos Date: Sat, 15 Feb 2025 13:04:21 -0300 Subject: [PATCH 4/4] Fix PATH in sudo for real --- pkgm.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/pkgm.ts b/pkgm.ts index 3af4ebc..c227020 100755 --- a/pkgm.ts +++ b/pkgm.ts @@ -148,7 +148,10 @@ async function install(args: string[]) { let cmd = "" if (needs_sudo) { cmd = "/usr/bin/sudo"; - args.unshift("-E"); // we already cleared the env, it's safe + args.unshift( + "-E", // we already cleared the env, it's safe + "env", `PATH=${env.PATH}`, + ); } else { cmd = args.shift()!; }