mirror of
https://github.com/NixOS/nix
synced 2025-07-07 10:11:47 +02:00
Fix nix upgrade-nix
profile search
Commitcfe66dbec
updated `nix upgrade-nix` to use `ExecutablePath::load().find`, which broke the logic for finding the profile associated with the nix executable. The error looks something like: ``` $ sudo -i nix upgrade-nix --debug found Nix in '"/nix/store/46p1z0w9ad605kky62dr53z4h24k2a5r-nix-2.25.2/bin/nix"' found profile '/nix/store/46p1z0w9ad605kky62dr53z4h24k2a5r-nix-2.25.2/bin' error: directory '"/nix/store/46p1z0w9ad605kky62dr53z4h24k2a5r-nix-2.25.2/bin/nix"' does not appear to be part of a Nix profile ``` This seems to happen for two reasons: 1. The original PATH search resulted in a directory, but `find` returns the path to the executable. Fixed by getting the path's parent. 2. The profile symlink cannot be found because `ExecutablePath::load().find` canonicalizes the executable path. I updated find to normalize the path instead, which seems more in line with how other programs resolve paths. I'm not sure if this affects other callers though. I manually tested this on macOS and Linux, and it seemed to fix upgrading from 2.25.2 to 2.25.3. (cherry picked from commit4f831e2be5
)
This commit is contained in:
parent
fd087ceec6
commit
e467269a44
2 changed files with 2 additions and 2 deletions
|
@ -73,7 +73,7 @@ ExecutablePath::findName(const OsString & exe, std::function<bool(const fs::path
|
||||||
for (auto & dir : directories) {
|
for (auto & dir : directories) {
|
||||||
auto candidate = dir / exe;
|
auto candidate = dir / exe;
|
||||||
if (isExecutable(candidate))
|
if (isExecutable(candidate))
|
||||||
return std::filesystem::canonical(candidate);
|
return candidate.lexically_normal();
|
||||||
}
|
}
|
||||||
|
|
||||||
return std::nullopt;
|
return std::nullopt;
|
||||||
|
|
|
@ -107,7 +107,7 @@ struct CmdUpgradeNix : MixDryRun, StoreCommand
|
||||||
auto whereOpt = ExecutablePath::load().findName(OS_STR("nix-env"));
|
auto whereOpt = ExecutablePath::load().findName(OS_STR("nix-env"));
|
||||||
if (!whereOpt)
|
if (!whereOpt)
|
||||||
throw Error("couldn't figure out how Nix is installed, so I can't upgrade it");
|
throw Error("couldn't figure out how Nix is installed, so I can't upgrade it");
|
||||||
auto & where = *whereOpt;
|
const auto & where = whereOpt->parent_path();
|
||||||
|
|
||||||
printInfo("found Nix in '%s'", where);
|
printInfo("found Nix in '%s'", where);
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue