diff options
author | Robert Hensing <robert@roberthensing.nl> | 2019-10-27 09:34:33 +0100 |
---|---|---|
committer | Robert Hensing <robert@roberthensing.nl> | 2019-10-27 13:16:02 +0100 |
commit | 9d612c393abc3a73590650d24bcfe2ee57792872 (patch) | |
tree | 96f512ba950c0b00da9e96c6dd832aeac7d43499 | |
parent | 2f96a89646c6e55e2f1bbb80805dcbbe60fa94ae (diff) |
Add inNixShell = true to nix-shell auto-call
This is an alternative to the IN_NIX_SHELL environment variable,
allowing the expression to adapt itself to nix-shell without
triggering those adaptations when used as a dependency of another
shell.
Closes #3147
-rwxr-xr-x | src/nix-build/nix-build.cc | 16 | ||||
-rw-r--r-- | tests/nix-shell.sh | 8 | ||||
-rw-r--r-- | tests/shell.nix | 3 |
3 files changed, 21 insertions, 6 deletions
diff --git a/src/nix-build/nix-build.cc b/src/nix-build/nix-build.cc index 085650e4f..357986980 100755 --- a/src/nix-build/nix-build.cc +++ b/src/nix-build/nix-build.cc @@ -245,7 +245,21 @@ static void _main(int argc, char * * argv) auto state = std::make_unique<EvalState>(myArgs.searchPath, store); state->repair = repair; - Bindings & autoArgs = *myArgs.getAutoArgs(*state); + Bindings & autoArgs = *[&](){ + Bindings *userAutoArgs = myArgs.getAutoArgs(*state); + if (runEnv) { + Bindings * res = state->allocBindings(userAutoArgs->size() + 1); + Value * tru = state->allocValue(); + mkBool(*tru, true); + res->push_back(Attr(state->symbols.create("inNixShell"), tru)); + for (auto & i : *userAutoArgs) { + res->push_back(i); + } + res->sort(); + return res; + } + else return userAutoArgs; + }(); if (packages) { std::ostringstream joined; diff --git a/tests/nix-shell.sh b/tests/nix-shell.sh index ee502dddb..235e2a5ff 100644 --- a/tests/nix-shell.sh +++ b/tests/nix-shell.sh @@ -7,9 +7,9 @@ export IMPURE_VAR=foo export SELECTED_IMPURE_VAR=baz export NIX_BUILD_SHELL=$SHELL output=$(nix-shell --pure shell.nix -A shellDrv --run \ - 'echo "$IMPURE_VAR - $VAR_FROM_STDENV_SETUP - $VAR_FROM_NIX"') + 'echo "$IMPURE_VAR - $VAR_FROM_STDENV_SETUP - $VAR_FROM_NIX - $TEST_inNixShell"') -[ "$output" = " - foo - bar" ] +[ "$output" = " - foo - bar - true" ] # Test --keep output=$(nix-shell --pure --keep SELECTED_IMPURE_VAR shell.nix -A shellDrv --run \ @@ -19,10 +19,10 @@ output=$(nix-shell --pure --keep SELECTED_IMPURE_VAR shell.nix -A shellDrv --run # Test nix-shell on a .drv [[ $(nix-shell --pure $(nix-instantiate shell.nix -A shellDrv) --run \ - 'echo "$IMPURE_VAR - $VAR_FROM_STDENV_SETUP - $VAR_FROM_NIX"') = " - foo - bar" ]] + 'echo "$IMPURE_VAR - $VAR_FROM_STDENV_SETUP - $VAR_FROM_NIX - $TEST_inNixShell"') = " - foo - bar - false" ]] [[ $(nix-shell --pure $(nix-instantiate shell.nix -A shellDrv) --run \ - 'echo "$IMPURE_VAR - $VAR_FROM_STDENV_SETUP - $VAR_FROM_NIX"') = " - foo - bar" ]] + 'echo "$IMPURE_VAR - $VAR_FROM_STDENV_SETUP - $VAR_FROM_NIX - $TEST_inNixShell"') = " - foo - bar - false" ]] # Test nix-shell on a .drv symlink diff --git a/tests/shell.nix b/tests/shell.nix index eb39f9039..6cb4f082b 100644 --- a/tests/shell.nix +++ b/tests/shell.nix @@ -1,4 +1,4 @@ -{ }: +{ inNixShell ? false }: with import ./config.nix; @@ -22,6 +22,7 @@ let pkgs = rec { name = "shellDrv"; builder = "/does/not/exist"; VAR_FROM_NIX = "bar"; + TEST_inNixShell = if inNixShell then "true" else "false"; inherit stdenv; }; |