aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/nix/upgrade-nix.cc18
1 files changed, 17 insertions, 1 deletions
diff --git a/src/nix/upgrade-nix.cc b/src/nix/upgrade-nix.cc
index 55f833833..3e47fc8f0 100644
--- a/src/nix/upgrade-nix.cc
+++ b/src/nix/upgrade-nix.cc
@@ -111,7 +111,23 @@ struct CmdUpgradeNix : MixDryRun, EvalCommand
if (pathExists(canonProfileDir + "/manifest.nix")) {
- std::string nixEnvCmd = settings.nixBinDir + "/nix-env";
+ // {settings.nixBinDir}/nix-env is a symlink to a {settings.nixBinDir}/nix, which *then*
+ // is a symlink to /nix/store/meow-nix/bin/nix. We want /nix/store/meow-nix/bin/nix-env.
+ Path const nixInStore = canonPath(settings.nixBinDir + "/nix-env", true);
+ Path const nixEnvCmd = dirOf(nixInStore) + "/nix-env";
+
+ // First remove the existing Nix, then use that Nix by absolute path to
+ // install the new one, in case the new and old versions aren't considered
+ // to be "the same package" by nix-env's logic (e.g., if their pnames differ).
+ Strings removeArgs = {
+ "--uninstall",
+ nixEnvCmd,
+ "--profile",
+ this->profileDir,
+ };
+ printTalkative("running %s %s", nixEnvCmd, concatStringsSep(" ", removeArgs));
+ runProgram(nixEnvCmd, false, removeArgs);
+
Strings upgradeArgs = {
"--profile",
this->profileDir,