stdenv setup.sh: revert most of changes around #14907

I'm giving this up. Feel free to find some reasonable variant that works
at least on Linux and Darwin. Problems encountered:
- During bootstrap of Darwin stdenv `env -0` and some bash features
  don't work.
- Without `env -0` the contents of some multi-line phases is taken as
  variable declarations, which wouldn't typically matter, but the PR
  wanted to refuse bash-invalid names which would be occasionally
  triggered. This commit dowgrades that to a warning with explanation.
This commit is contained in:
Vladimír Čunát 2016-05-12 03:48:05 +02:00
parent 6521529c23
commit 81df035429

View File

@ -408,14 +408,16 @@ substitute() {
if [ "$p" = --subst-var ]; then if [ "$p" = --subst-var ]; then
varName="${params[$((n + 1))]}" varName="${params[$((n + 1))]}"
n=$((n + 1))
# check if the used nix attribute name is a valid bash name # check if the used nix attribute name is a valid bash name
if ! [[ "$varName" =~ ^[a-zA-Z_][a-zA-Z0-9_]*$ ]]; then if ! [[ "$varName" =~ ^[a-zA-Z_][a-zA-Z0-9_]*$ ]]; then
echo "substitution variables must be valid bash names, \"$varName\" isn't." echo "WARNING: substitution variables should be valid bash names,"
exit 1; echo " \"$varName\" isn't and therefore was skipped; it might be caused"
echo " by multi-line phases in variables - see #14907 for details."
continue
fi fi
pattern="@$varName@" pattern="@$varName@"
replacement="${!varName}" replacement="${!varName}"
n=$((n + 1))
fi fi
if [ "$p" = --subst-var-by ]; then if [ "$p" = --subst-var-by ]; then
@ -447,19 +449,14 @@ substituteAll() {
local output="$2" local output="$2"
local -a args=() local -a args=()
# We need to be careful due to vars with multi-line contents or weird names. # Select all environment variables that start with a lowercase character.
local IFS== for varName in $(env | sed -e $'s/^\([a-z][^= \t]*\)=.*/\\1/; t \n d'); do
local varNames="$(env -0 | cut -z -d= -f1 | grep -z -v '^[_A-Z]' | tr '\000' '=')"
local varName
for varName in $varNames; do
if [ "$NIX_DEBUG" = "1" ]; then if [ "$NIX_DEBUG" = "1" ]; then
echo "@${varName}@ -> '${!varName}'" echo "@${varName}@ -> '${!varName}'"
fi fi
args+=("--subst-var" "$varName") args+=("--subst-var" "$varName")
done done
# restore default $IFS for the child
IFS=$' \t\n'
substitute "$input" "$output" "${args[@]}" substitute "$input" "$output" "${args[@]}"
} }