minimal/do: leak fewer variables, especially PREFIX.

Since we use ". filename.do" to run the .do files instead of just
"filename.do", shell local variables end up being inherited by the
subprogram.  Change all the local variables to be all lowercase, to avoid
conflicting with any typical environment variables someone might use.

The particular variable that triggered this was PREFIX (reported by "ulrik"
on the mailing list) and that fixes this, at least.

Arguably we shouldn't be using ".", but using it avoids unnecessary forks,
which is kind of nice.
This commit is contained in:
Avery Pennarun 2011-03-05 18:48:27 -08:00
commit 0e037b8c45

View file

@ -8,14 +8,14 @@
# #
# By default, no output coloring. # By default, no output coloring.
GREEN="" green=""
BOLD="" bold=""
PLAIN="" plain=""
if [ -n "$TERM" -a "$TERM" != "dumb" ] && tty <&2 >/dev/null 2>&1; then if [ -n "$TERM" -a "$TERM" != "dumb" ] && tty <&2 >/dev/null 2>&1; then
GREEN="$(printf '\033[32m')" green="$(printf '\033[32m')"
BOLD="$(printf '\033[1m')" bold="$(printf '\033[1m')"
PLAIN="$(printf '\033[m')" plain="$(printf '\033[m')"
fi fi
_dirsplit() _dirsplit()
@ -54,78 +54,78 @@ fi
_find_dofile_pwd() _find_dofile_pwd()
{ {
DOFILE=default.$1.do dofile=default.$1.do
while :; do while :; do
DOFILE=default.${DOFILE#default.*.} dofile=default.${dofile#default.*.}
[ -e "$DOFILE" -o "$DOFILE" = default.do ] && break [ -e "$dofile" -o "$dofile" = default.do ] && break
done done
EXT=${DOFILE#default} ext=${dofile#default}
EXT=${EXT%.do} ext=${ext%.do}
BASE=${1%$EXT} base=${1%$ext}
} }
_find_dofile() _find_dofile()
{ {
PREFIX= local prefix=
while :; do while :; do
_find_dofile_pwd "$1" _find_dofile_pwd "$1"
[ -e "$DOFILE" ] && break [ -e "$dofile" ] && break
[ "$PWD" = "/" ] && break [ "$PWD" = "/" ] && break
TARGET=${PWD##*/}/$TARGET target=${PWD##*/}/$target
PREFIX=${PWD##*/}/$PREFIX prefix=${PWD##*/}/$prefix
cd .. cd ..
done done
BASE=$PREFIX$BASE base=$prefix$base
} }
_run_dofile() _run_dofile()
{ {
export DO_DEPTH="$DO_DEPTH " export DO_DEPTH="$DO_DEPTH "
export REDO_TARGET=$PWD/$TARGET export REDO_TARGET=$PWD/$target
local line1
set -e set -e
read line1 <"$PWD/$DOFILE" read line1 <"$PWD/$dofile"
cmd=${line1#"#!/"} cmd=${line1#"#!/"}
if [ "$cmd" != "$line1" ]; then if [ "$cmd" != "$line1" ]; then
/$cmd "$PWD/$DOFILE" "$@" >"$TARGET.tmp2" /$cmd "$PWD/$dofile" "$@" >"$target.tmp2"
else else
:; . "$PWD/$DOFILE" >"$TARGET.tmp2" :; . "$PWD/$dofile" >"$target.tmp2"
fi fi
} }
_do() _do()
{ {
DIR=$1 local dir=$1 target=$2
TARGET=$2 if [ ! -e "$target" ] || [ -d "$target/." -a ! -e "$target.did" ]; then
if [ ! -e "$TARGET" ] || [ -d "$TARGET/." -a ! -e "$TARGET.did" ]; then
printf '%sdo %s%s%s%s\n' \ printf '%sdo %s%s%s%s\n' \
"$GREEN" "$DO_DEPTH" "$BOLD" "$DIR$TARGET" "$PLAIN" >&2 "$green" "$DO_DEPTH" "$bold" "$dir$target" "$plain" >&2
echo "$PWD/$TARGET" >>"$DO_BUILT" echo "$PWD/$target" >>"$DO_BUILT"
DOFILE=$TARGET.do dofile=$target.do
BASE=$TARGET base=$target
EXT= ext=
[ -e "$TARGET.do" ] || _find_dofile "$TARGET" [ -e "$target.do" ] || _find_dofile "$target"
if [ ! -e "$DOFILE" ]; then if [ ! -e "$dofile" ]; then
echo "do: $TARGET: no .do file" >&2 echo "do: $target: no .do file" >&2
return 1 return 1
fi fi
[ ! -e "$DO_BUILD" ] || : >>"$TARGET.did" [ ! -e "$DO_BUILD" ] || : >>"$target.did"
( _run_dofile "$BASE" "$EXT" "$TARGET.tmp" ) ( _run_dofile "$base" "$ext" "$target.tmp" )
RV=$? rv=$?
if [ $RV != 0 ]; then if [ $rv != 0 ]; then
printf "do: %s%s\n" "$DO_DEPTH" \ printf "do: %s%s\n" "$DO_DEPTH" \
"$DIR$TARGET: got exit code $RV" >&2 "$dir$target: got exit code $rv" >&2
rm -f "$TARGET.tmp" "$TARGET.tmp2" rm -f "$target.tmp" "$target.tmp2"
return $RV return $rv
fi fi
mv "$TARGET.tmp" "$TARGET" 2>/dev/null || mv "$target.tmp" "$target" 2>/dev/null ||
! test -s "$TARGET.tmp2" || ! test -s "$target.tmp2" ||
mv "$TARGET.tmp2" "$TARGET" 2>/dev/null mv "$target.tmp2" "$target" 2>/dev/null
rm -f "$TARGET.tmp2" rm -f "$target.tmp2"
else else
echo "do $DO_DEPTH$TARGET exists." >&2 echo "do $DO_DEPTH$target exists." >&2
fi fi
} }