diff --git a/src/nix/develop.cc b/src/nix/develop.cc index 37bce6ca0..fb895498c 100644 --- a/src/nix/develop.cc +++ b/src/nix/develop.cc @@ -62,6 +62,7 @@ struct BuildEnvironment std::map vars; StringMap bashFunctions; std::optional> structuredAttrs; + std::optional minimalBashVersion; static BuildEnvironment fromJSON(const nlohmann::json & json) { @@ -87,6 +88,10 @@ struct BuildEnvironment res.structuredAttrs = {json["structuredAttrs"][".attrs.json"], json["structuredAttrs"][".attrs.sh"]}; } + if (json.contains("meta") && json["meta"].contains("min-bash-version")) { + res.minimalBashVersion = std::optional{ json["meta"]["min-bash-version"] }; + } + return res; } @@ -153,6 +158,18 @@ struct BuildEnvironment void toBash(std::ostream & out, const StringSet & ignoreVars) const { + if (minimalBashVersion.has_value()) { + out << stripIndentation(fmt(R"__NIX_STR( + if [[ -n "${BASH_VERSINFO-}" && "${BASH_VERSINFO-}" -lt %d ]]; then + echo "Detected Bash version that isn't supported by this derivation (${BASH_VERSION})" + echo "Please install Bash %d or greater to continue." + exit 1 + fi + )__NIX_STR", + minimalBashVersion.value(), + minimalBashVersion.value())); + } + for (auto & [name, value] : vars) { if (!ignoreVars.count(name)) { if (auto str = std::get_if(&value)) { diff --git a/src/nix/get-env.sh b/src/nix/get-env.sh index 071edf9b9..3541eaffd 100644 --- a/src/nix/get-env.sh +++ b/src/nix/get-env.sh @@ -115,6 +115,16 @@ __dumpEnv() { printf '\n }' fi + printf ',\n "meta": {\n ' + # min-bash-version is supposed to be an integer. + # If not, just ignore it. + if [[ -n "${NIX_ENV_MIN_BASH_VERSION-}" && "$NIX_ENV_MIN_BASH_VERSION" -eq "$NIX_ENV_MIN_BASH_VERSION" ]]; then + __escapeString "min-bash-version" + printf ': ' + printf '%d' "${NIX_ENV_MIN_BASH_VERSION}" + fi + printf '\n }' + printf '\n}' } diff --git a/tests/functional/flakes/develop.sh b/tests/functional/flakes/develop.sh index c222f0fbb..da67e57f0 100755 --- a/tests/functional/flakes/develop.sh +++ b/tests/functional/flakes/develop.sh @@ -143,3 +143,20 @@ EOF )" -ef "$BASH_INTERACTIVE_EXECUTABLE" ]] clearStore + +# Use a newer bash version than the current one +cat <$TEST_HOME/flake.nix +{ + inputs.nixpkgs.url = "$TEST_HOME/nixpkgs"; + outputs = {self, nixpkgs}: { + packages.$system.hello = (import ./config.nix).mkDerivation { + name = "hello"; + outputs = [ "out" "dev" ]; + meta.outputsToInstall = [ "out" ]; + buildCommand = ""; + NIX_ENV_MIN_BASH_VERSION=99; + }; + }; +} +EOF +expect 1 nix develop .#hello --command true