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