nix upgrade-nix: Handle .nix-profile being a link to .../profiles/per-user/...

Also some cosmetic improvements.
This commit is contained in:
Eelco Dolstra 2018-08-30 21:18:56 +02:00
parent f08b14c9d0
commit 39f1722f36
No known key found for this signature in database
GPG key ID: 8170B4726D7198DE
2 changed files with 24 additions and 14 deletions

View file

@ -241,6 +241,7 @@ let
{ diskImage = vmTools.diskImages.ubuntu1204x86_64; { diskImage = vmTools.diskImages.ubuntu1204x86_64;
} }
'' ''
set -x
useradd -m alice useradd -m alice
su - alice -c 'tar xf ${binaryTarball.x86_64-linux}/*.tar.*' su - alice -c 'tar xf ${binaryTarball.x86_64-linux}/*.tar.*'
mkdir /dest-nix mkdir /dest-nix
@ -251,14 +252,13 @@ let
su - alice -c 'PAGER= nix-store -qR ${build.x86_64-linux}' su - alice -c 'PAGER= nix-store -qR ${build.x86_64-linux}'
# Check whether 'nix upgrade-nix' works. # Check whether 'nix upgrade-nix' works.
(! [ -L /nix/var/nix/profiles/per-user/alice/profile-2-link ])
cat > /tmp/paths.nix <<EOF cat > /tmp/paths.nix <<EOF
{ {
x86_64-linux = "${build.x86_64-linux}"; x86_64-linux = "${build.x86_64-linux}";
} }
EOF EOF
su - alice -c 'nix upgrade-nix -vvv --nix-store-paths-url file:///tmp/paths.nix' su - alice -c 'nix upgrade-nix -vvv --nix-store-paths-url file:///tmp/paths.nix'
[ -L /nix/var/nix/profiles/per-user/alice/profile-2-link ] (! [ -L /home/alice/.profile-1-link ])
su - alice -c 'PAGER= nix-store -qR ${build.x86_64-linux}' su - alice -c 'PAGER= nix-store -qR ${build.x86_64-linux}'
mkdir -p $out/nix-support mkdir -p $out/nix-support

View file

@ -4,6 +4,8 @@
#include "download.hh" #include "download.hh"
#include "eval.hh" #include "eval.hh"
#include "attr-path.hh" #include "attr-path.hh"
#include "names.hh"
#include "progress-bar.hh"
using namespace nix; using namespace nix;
@ -67,28 +69,36 @@ struct CmdUpgradeNix : MixDryRun, StoreCommand
storePath = getLatestNix(store); storePath = getLatestNix(store);
} }
auto version = DrvName(storePathToName(storePath)).version;
if (dryRun) {
stopProgressBar();
printError("would upgrade to version %s", version);
return;
}
{ {
Activity act(*logger, lvlInfo, actUnknown, fmt("downloading '%s'...", storePath)); Activity act(*logger, lvlInfo, actUnknown, fmt("downloading '%s'...", storePath));
if (!dryRun) store->ensurePath(storePath);
store->ensurePath(storePath);
} }
{ {
Activity act(*logger, lvlInfo, actUnknown, fmt("verifying that '%s' works...", storePath)); Activity act(*logger, lvlInfo, actUnknown, fmt("verifying that '%s' works...", storePath));
if (!dryRun) { auto program = storePath + "/bin/nix-env";
auto program = storePath + "/bin/nix-env"; auto s = runProgram(program, false, {"--version"});
auto s = runProgram(program, false, {"--version"}); if (s.find("Nix") == std::string::npos)
if (s.find("Nix") == std::string::npos) throw Error("could not verify that '%s' works", program);
throw Error("could not verify that '%s' works", program);
}
} }
stopProgressBar();
{ {
Activity act(*logger, lvlInfo, actUnknown, fmt("installing '%s' into profile '%s'...", storePath, profileDir)); Activity act(*logger, lvlInfo, actUnknown, fmt("installing '%s' into profile '%s'...", storePath, profileDir));
if (!dryRun) runProgram(settings.nixBinDir + "/nix-env", false,
runProgram(settings.nixBinDir + "/nix-env", false, {"--profile", profileDir, "-i", storePath, "--no-sandbox"});
{"--profile", profileDir, "-i", storePath, "--no-sandbox"});
} }
printError(ANSI_GREEN "upgrade to version %s done" ANSI_NORMAL, version);
} }
/* Return the profile in which Nix is installed. */ /* Return the profile in which Nix is installed. */
@ -113,7 +123,7 @@ struct CmdUpgradeNix : MixDryRun, StoreCommand
Path profileDir = dirOf(where); Path profileDir = dirOf(where);
// Resolve profile to /nix/var/nix/profiles/<name> link. // Resolve profile to /nix/var/nix/profiles/<name> link.
while (baseNameOf(dirOf(canonPath(profileDir))) != "profiles" && isLink(profileDir)) while (canonPath(profileDir).find("/profiles/") == std::string::npos && isLink(profileDir))
profileDir = readLink(profileDir); profileDir = readLink(profileDir);
printInfo("found profile '%s'", profileDir); printInfo("found profile '%s'", profileDir);