aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Hensing <robert@roberthensing.nl>2019-10-27 09:34:33 +0100
committerRobert Hensing <robert@roberthensing.nl>2019-10-27 13:16:02 +0100
commit9d612c393abc3a73590650d24bcfe2ee57792872 (patch)
tree96f512ba950c0b00da9e96c6dd832aeac7d43499
parent2f96a89646c6e55e2f1bbb80805dcbbe60fa94ae (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-xsrc/nix-build/nix-build.cc16
-rw-r--r--tests/nix-shell.sh8
-rw-r--r--tests/shell.nix3
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;
};