From b6775e2df7ece82293333ca53d2390e8dbfd2e2c Mon Sep 17 00:00:00 2001 From: dave caruso Date: Thu, 7 Dec 2023 00:56:36 -0800 Subject: [PATCH] fix(upgrade): print a better message on NixOS (#7489) --- src/cli/upgrade_command.zig | 30 +++++++++++++++++++++++++++--- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/src/cli/upgrade_command.zig b/src/cli/upgrade_command.zig index 8b76350436..43e6278272 100644 --- a/src/cli/upgrade_command.zig +++ b/src/cli/upgrade_command.zig @@ -682,14 +682,38 @@ pub const UpgradeCommand = struct { .cwd = tmpdir_path, .max_output_bytes = 512, }) catch |err| { - save_dir_.deleteTree(version_name) catch {}; - Output.prettyErrorln("error Failed to verify Bun {s})", .{@errorName(err)}); + defer save_dir_.deleteTree(version_name) catch {}; + + if (err == error.FileNotFound) { + if (std.fs.cwd().access(exe, .{})) { + // On systems like NixOS, the FileNotFound is actually the system-wide linker, + // as they do not have one (most systems have it at a known path). This is how + // ChildProcess returns FileNotFound despite the actual + // + // In these cases, prebuilt binaries from GitHub will never work without + // extra patching, so we will print a message deferring them to their system + // package manager. + Output.prettyErrorln( + \\error: 'bun upgrade' is unsupported on systems without ld + \\ + \\You are likely on an immutable system such as NixOS, where dynamic + \\libraries are stored in a global cache. + \\ + \\Please use your system's package manager to properly upgrade bun. + \\ + , .{}); + Global.exit(1); + return; + } else |_| {} + } + + Output.prettyErrorln("error: Failed to verify Bun (code: {s}))", .{@errorName(err)}); Global.exit(1); }; if (result.term.Exited != 0) { save_dir_.deleteTree(version_name) catch {}; - Output.prettyErrorln("error failed to verify Bun (exit code: {d})", .{result.term.Exited}); + Output.prettyErrorln("error: failed to verify Bun (exit code: {d})", .{result.term.Exited}); Global.exit(1); }