mirror of
https://github.com/NixOS/nix.git
synced 2025-11-10 12:36:01 +01:00
This adds a setting 'lazy-trees' that causes flake inputs to be
"mounted" as virtual filesystems on top of /nix/store as random
"virtual" store paths. Only when the store path is actually used as a
dependency of a store derivation do we materialize ("devirtualize")
the input by copying it to its content-addressed location in the
store.
String contexts determine when devirtualization happens. One wrinkle
is that there are cases where we had store paths without proper
contexts, in particular when the user does `toString <path>` (where
<path> is a source tree in the Nix store) and passes the result to a
derivation. This usage was always broken, since it can result in
derivations that lack correct references. But to ensure that we don't
change evaluation results, we introduce a new type of context that
results in devirtualization but not in store references. We also now
print a warning about this.
45 lines
1.4 KiB
Bash
Executable file
45 lines
1.4 KiB
Bash
Executable file
#!/usr/bin/env bash
|
|
|
|
source ./common.sh
|
|
|
|
requireGit
|
|
|
|
flake1Dir=$TEST_ROOT/flake1
|
|
flake2Dir=$TEST_ROOT/flake2
|
|
|
|
createGitRepo "$flake1Dir"
|
|
cat > "$flake1Dir"/flake.nix <<EOF
|
|
{
|
|
outputs = { self }: { x = import ./x.nix; };
|
|
}
|
|
EOF
|
|
echo 123 > "$flake1Dir"/x.nix
|
|
git -C "$flake1Dir" add flake.nix x.nix
|
|
git -C "$flake1Dir" commit -m Initial
|
|
|
|
createGitRepo "$flake2Dir"
|
|
cat > "$flake2Dir"/flake.nix <<EOF
|
|
{
|
|
outputs = { self, flake1 }: { x = flake1.x; };
|
|
}
|
|
EOF
|
|
git -C "$flake2Dir" add flake.nix
|
|
|
|
[[ $(nix eval --json "$flake2Dir#x" --override-input flake1 "$TEST_ROOT/flake1") = 123 ]]
|
|
|
|
echo 456 > "$flake1Dir"/x.nix
|
|
|
|
[[ $(nix eval --json "$flake2Dir#x" --override-input flake1 "$TEST_ROOT/flake1") = 456 ]]
|
|
|
|
# Dirty overrides require --allow-dirty-locks.
|
|
expectStderr 1 nix flake lock "$flake2Dir" --override-input flake1 "$TEST_ROOT/flake1" |
|
|
grepQuiet "Will not write lock file.*because it has an unlocked input"
|
|
|
|
nix flake lock "$flake2Dir" --override-input flake1 "$TEST_ROOT/flake1" --allow-dirty-locks
|
|
_NIX_TEST_FAIL_ON_LARGE_PATH=1 nix flake lock "$flake2Dir" --override-input flake1 "$TEST_ROOT/flake1" --allow-dirty-locks --warn-large-path-threshold 1 --lazy-trees
|
|
|
|
# Using a lock file with a dirty lock does not require --allow-dirty-locks, but should print a warning.
|
|
expectStderr 0 nix eval "$flake2Dir#x" |
|
|
grepQuiet "warning: Lock file entry .* is unlocked"
|
|
|
|
[[ $(nix eval "$flake2Dir#x") = 456 ]]
|