minimal/do: handle nonzero exit codes and set $1/$2 correctly.

Also add some tests to confirm this.
This commit is contained in:
Avery Pennarun 2010-11-17 18:24:40 -08:00
commit b9853d3858
6 changed files with 27 additions and 8 deletions

View file

@ -4,14 +4,13 @@
# For the full version, visit http://github.com/apenwarr/redo # For the full version, visit http://github.com/apenwarr/redo
# #
export REDO="$(dirname "$0")/$(basename "$0")" export REDO="$(dirname "$0")/$(basename "$0")"
IFS="
"
if [ -z "$DO_BUILT" ]; then if [ -z "$DO_BUILT" ]; then
export DO_BUILT="$PWD/.do_built" export DO_BUILT="$PWD/.do_built"
if [ -e "$DO_BUILT" ]; then if [ -e "$DO_BUILT" ]; then
echo "Removing previously built files..." >&2 echo "Removing previously built files..." >&2
sort "$DO_BUILT" | uniq | tee "$DO_BUILT.new" | xargs rm -f sort "$DO_BUILT" | uniq | tee "$DO_BUILT.new" |
while read f; do rm -f "$f"; done
mv "$DO_BUILT.new" "$DO_BUILT" mv "$DO_BUILT.new" "$DO_BUILT"
fi fi
fi fi
@ -27,18 +26,29 @@ _do()
echo "$PWD/$TARGET" >>"$DO_BUILT" echo "$PWD/$TARGET" >>"$DO_BUILT"
dof=".$TARGET" dof=".$TARGET"
DOFILE="$TARGET.do" DOFILE="$TARGET.do"
BASE="$TARGET"
EXT=""
while [ ! -e "$DOFILE" ]; do while [ ! -e "$DOFILE" ]; do
dof2=$(echo "$dof" | sed 's/\.[^\.]*//') dof2=$(echo "$dof" | sed 's/\.[^\.]*//')
[ "$dof" = "$dof2" ] && break [ "$dof" = "$dof2" ] && break
dof="$dof2" dof="$dof2"
DOFILE="default$dof.do" DOFILE="default$dof.do"
BASE="$(basename "$TARGET" "$dof")"
EXT="$dof"
done done
set "$TARGET" "" "$TARGET.tmp" set "$BASE" "$EXT" "$TARGET.tmp"
RV=
( (
export DO_DEPTH="$DO_DEPTH " export DO_DEPTH="$DO_DEPTH "
set -e
. "$PWD/$DOFILE" >"$TARGET.tmp" . "$PWD/$DOFILE" >"$TARGET.tmp"
) && ) || RV="$?"
mv "$TARGET.tmp" "$TARGET" 2>/dev/null || touch "$TARGET" [ -z "$RV" ] && mv "$TARGET.tmp" "$TARGET" 2>/dev/null
: >>"$TARGET"
if [ -n "$RV" ]; then
printf "do: %s%s\n" "$DO_DEPTH" "got exit code $RV" >&2
exit $RV
fi
else else
echo "do $DO_DEPTH$TARGET exists." >&2 echo "do $DO_DEPTH$TARGET exists." >&2
fi fi
@ -54,7 +64,7 @@ redo()
D="$(dirname "$i")/" D="$(dirname "$i")/"
[ "$D" = "./" ] && D="" [ "$D" = "./" ] && D=""
B="$(basename "$i")" B="$(basename "$i")"
( cd "$D" && _do "$D" "$B" ) ( cd "$D" && _do "$D" "$B" ) || exit $?
done done
} }

2
t/.gitignore vendored
View file

@ -4,3 +4,5 @@ c.c.c
c.c.c.b c.c.c.b
c.c.c.b.b c.c.c.b.b
d d
test.args
test2.args

View file

@ -1,3 +1,3 @@
redo-ifchange hello yellow bellow c d deltest deltest2 redo-ifchange hello yellow bellow c d

3
t/default.args.do Normal file
View file

@ -0,0 +1,3 @@
[ "$1" = "test" ]
[ "$2" = ".args" ]
[ "$3" != "test.args" ]

View file

@ -1,2 +1,3 @@
redo-ifchange all redo-ifchange all
./hello >&2 ./hello >&2
redo deltest deltest2 test.args test2.args

3
t/test2.args.do Normal file
View file

@ -0,0 +1,3 @@
[ "$1" = "test2.args" ]
[ "$2" = "" ]
[ "$3" != "test2.args" ]