okay, tests pass

Change-Id: I2610ed6b3405969d07775e7d72fee9ebfb50cc29
This commit is contained in:
Qyriad 2024-05-10 18:41:07 -06:00
parent 2955732baa
commit 7d1ce1420b
5 changed files with 61 additions and 31 deletions

View file

@ -307,7 +307,22 @@ std::string optimisticLockProfile(const Path & profile)
Path profilesDir() Path profilesDir()
{ {
return fmt("%s/profiles/per-user/%s", settings.nixStateDir, getUserName()); Path const dir = fmt("%s/profiles/per-user/%s", settings.nixStateDir, getUserName());
return dir;
try {
createNixStateDir();
} catch (SysError const & e) {
warn("ignoring error creating Nix XDG state dir: %s", e.what());
}
try {
createDirs(dir);
} catch (SysError const & e) {
warn("ignoring error creating home profiles link: %s", e.what());
}
return dir;
auto profileRoot = auto profileRoot =
(getuid() == 0) (getuid() == 0)
@ -340,31 +355,25 @@ Path ensureDefaultProfile()
Path const profileLink = getDefaultProfileLink(); Path const profileLink = getDefaultProfileLink();
try { try {
Path const profile = profilesDir() + "/profile"; Path const profile = profilesDir() + "/profile";
if (!pathExists(profileLink)) { if (!pathExists(profileLink)) {
try { replaceSymlink(profile, profileLink);
replaceSymlink(profile, profileLink);
} catch (SysError const & e) {
std::cerr << fmt("error while replaceSymlink(%s, %s)\n", profile, profileLink);
std::cerr << fmt("(attempted because %s does not exist)\n", profileLink);
throw;
}
} }
// Backwards compatibiliy measure: Make root's profile available as // Backwards compatibiliy measure: Make root's profile available as
// `.../default` as it's what NixOS and most of the init scripts expect // `.../default` as it's what NixOS and most of the init scripts expect
Path const globalProfileLink = settings.nixStateDir + "/profiles/default"; Path const globalProfileLink = settings.nixStateDir + "/profiles/default";
if (getuid() == 0 && !pathExists(globalProfileLink)) { if (getuid() == 0 && !pathExists(globalProfileLink)) {
try { replaceSymlink(profile, globalProfileLink);
replaceSymlink(profile, globalProfileLink);
} catch (SysError const & e) {
std::cerr << fmt("error while uid0 replaceSymlink(%s, %s)\n", profile, globalProfileLink);
}
} }
auto const absProfile = absPath(readLink(profileLink), dirOf(profileLink));
return absProfile; return absPath(readLink(profileLink), dirOf(profileLink));
} catch (Error const & e) { } catch (Error const & e) {
std::cerr << "returning original profileLink " << profileLink << std::endl; throw;
std::cerr << "err was " << e.what() << "\n"; //return profileLink;
return profileLink; //std::cerr << "returning original profileLink " << profileLink << std::endl;
//std::cerr << "err was " << e.what() << "\n";
//return profileLink;
} }
} }
@ -383,8 +392,6 @@ Path getDefaultProfile()
} }
return profileLink; return profileLink;
//Path const globalProfileLink = settings.nixStateDir + "/profiles/default";
} }
Path defaultChannelsDir() Path defaultChannelsDir()

View file

@ -503,7 +503,7 @@ static bool keep(DrvInfo & drv)
static void installDerivations(Globals & globals, static void installDerivations(Globals & globals,
const Strings & args, const Path & profile) const Strings & args, const Path & profile)
{ {
debug("installing derivations"); debug("installing derivations into profile %s", profile);
/* Get the set of user environment elements to be installed. */ /* Get the set of user environment elements to be installed. */
DrvInfos newElems, newElemsTmp; DrvInfos newElems, newElemsTmp;
@ -554,8 +554,17 @@ static void installDerivations(Globals & globals,
if (globals.dryRun) return; if (globals.dryRun) return;
if (createUserEnv(*globals.state, allElems, bool success = createUserEnv(
profile, settings.envKeepDerivations, lockToken)) break; *globals.state,
allElems,
profile,
settings.envKeepDerivations,
lockToken
);
if (success) {
break;
}
} }
} }

View file

@ -20,6 +20,7 @@ bool createUserEnv(EvalState & state, DrvInfos & elems,
const Path & profile, bool keepDerivations, const Path & profile, bool keepDerivations,
const std::string & lockToken) const std::string & lockToken)
{ {
debug("asked to create a user env %s for %u drvs", profile, elems.size());
/* Build the components in the user environment, if they don't /* Build the components in the user environment, if they don't
exist already. */ exist already. */
std::vector<StorePathWithOutputs> drvsToBuild; std::vector<StorePathWithOutputs> drvsToBuild;
@ -131,10 +132,11 @@ bool createUserEnv(EvalState & state, DrvInfos & elems,
state.repair ? bmRepair : bmNormal); state.repair ? bmRepair : bmNormal);
/* Switch the current user environment to the output path. */ /* Switch the current user environment to the output path. */
auto store2 = state.store.dynamic_pointer_cast<LocalFSStore>(); auto localStore = state.store.dynamic_pointer_cast<LocalFSStore>();
if (store2) { if (localStore) {
PathLocks lock; PathLocks lock;
debug("locking profile %s", profile);
lockProfile(lock, profile); lockProfile(lock, profile);
Path lockTokenCur = optimisticLockProfile(profile); Path lockTokenCur = optimisticLockProfile(profile);
@ -144,7 +146,7 @@ bool createUserEnv(EvalState & state, DrvInfos & elems,
} }
debug("switching to new user environment"); debug("switching to new user environment");
Path generation = createGeneration(*store2, profile, topLevelOut); Path generation = createGeneration(*localStore, profile, topLevelOut);
switchLink(profile, generation); switchLink(profile, generation);
} }

View file

@ -37,8 +37,10 @@ nix-env -qa '*' --description | grepQuiet silly
# Query the system. # Query the system.
nix-env -qa '*' --system | grepQuiet $system nix-env -qa '*' --system | grepQuiet $system
readlink $HOME/.nix-profile || true
eza --tree -la $HOME/.local/state/nix || true
# Install "foo-1.0". # Install "foo-1.0".
nix-env -i foo-1.0 nix-env --debug -i foo-1.0
# Query installed: should contain foo-1.0 now (which should be # Query installed: should contain foo-1.0 now (which should be
# executable). # executable).

View file

@ -21,11 +21,12 @@ in {
users.users.alice.isNormalUser = true; users.users.alice.isNormalUser = true;
#virtualisation.additionalPaths = [ pkgs.hello.drvPath ]; #virtualisation.additionalPaths = [ pkgs.hello.drvPath ];
#nix.settings.substituters = lib.mkForce [ ]; #nix.settings.substituters = lib.mkForce [ ];
nix.settings.experimental-features = [ "nix-command" "flakes" ]; #nix.settings.experimental-features = [ "nix-command" "flakes" ];
nix.settings = { nix.settings = {
substituters = lib.mkForce [ ]; substituters = lib.mkForce [ ];
#experimental-features = [ "nix-command" "flakes" ]; experimental-features = [ "nix-command" "flakes" ];
allowed-users = [ "alice" ]; allowed-users = [ "alice" ];
use-xdg-base-directories = true;
}; };
nix.nixPath = [ "nixpkgs=${pkgs.path}" ]; nix.nixPath = [ "nixpkgs=${pkgs.path}" ];
#nix.package = pkgs.nixVersions.nix_2_18; #nix.package = pkgs.nixVersions.nix_2_18;
@ -38,8 +39,6 @@ in {
# fmt: off # fmt: off
start_all() start_all()
machine.wait_for_unit("getty@tty1.service")
machine.wait_for_unit("nix-daemon.socket")
machine.wait_for_unit("multi-user.target") machine.wait_for_unit("multi-user.target")
machine.succeed("nix -vv --version >&2") machine.succeed("nix -vv --version >&2")
@ -52,6 +51,8 @@ in {
nix-env --version -vv >&2 nix-env --version -vv >&2
""") """)
print(machine.succeed("systemctl cat nix-daemon.service"))
# Initial state. # Initial state.
machine.succeed(""" machine.succeed("""
su --login alice -c ' su --login alice -c '
@ -86,6 +87,15 @@ in {
:' >&2 :' >&2
""") """)
machine.succeed("""
su --login alice -c '
set -euxo pipefail
PAGER=cat nix-env --option use-xdg-base-directories false --query '*'
${ezaTree} ~
${ezaTree} /nix/var/nix/profiles
:' >&2
""")
machine.succeed(""" machine.succeed("""
su --login alice -c ' su --login alice -c '
set -euxo pipefail set -euxo pipefail