From b9853d38586b574d1b554e34799a457d013823ce Mon Sep 17 00:00:00 2001 From: Avery Pennarun Date: Wed, 17 Nov 2010 18:24:40 -0800 Subject: [PATCH] minimal/do: handle nonzero exit codes and set $1/$2 correctly. Also add some tests to confirm this. --- minimal/do | 24 +++++++++++++++++------- t/.gitignore | 2 ++ t/all.do | 2 +- t/default.args.do | 3 +++ t/runtests.do | 1 + t/test2.args.do | 3 +++ 6 files changed, 27 insertions(+), 8 deletions(-) create mode 100644 t/default.args.do create mode 100644 t/test2.args.do diff --git a/minimal/do b/minimal/do index be26b05..e099c28 100755 --- a/minimal/do +++ b/minimal/do @@ -4,14 +4,13 @@ # For the full version, visit http://github.com/apenwarr/redo # export REDO="$(dirname "$0")/$(basename "$0")" -IFS=" -" if [ -z "$DO_BUILT" ]; then export DO_BUILT="$PWD/.do_built" if [ -e "$DO_BUILT" ]; then 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" fi fi @@ -27,18 +26,29 @@ _do() echo "$PWD/$TARGET" >>"$DO_BUILT" dof=".$TARGET" DOFILE="$TARGET.do" + BASE="$TARGET" + EXT="" while [ ! -e "$DOFILE" ]; do dof2=$(echo "$dof" | sed 's/\.[^\.]*//') [ "$dof" = "$dof2" ] && break dof="$dof2" DOFILE="default$dof.do" + BASE="$(basename "$TARGET" "$dof")" + EXT="$dof" done - set "$TARGET" "" "$TARGET.tmp" + set "$BASE" "$EXT" "$TARGET.tmp" + RV= ( export DO_DEPTH="$DO_DEPTH " + set -e . "$PWD/$DOFILE" >"$TARGET.tmp" - ) && - mv "$TARGET.tmp" "$TARGET" 2>/dev/null || touch "$TARGET" + ) || RV="$?" + [ -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 echo "do $DO_DEPTH$TARGET exists." >&2 fi @@ -54,7 +64,7 @@ redo() D="$(dirname "$i")/" [ "$D" = "./" ] && D="" B="$(basename "$i")" - ( cd "$D" && _do "$D" "$B" ) + ( cd "$D" && _do "$D" "$B" ) || exit $? done } diff --git a/t/.gitignore b/t/.gitignore index 580e8c9..d6488c9 100644 --- a/t/.gitignore +++ b/t/.gitignore @@ -4,3 +4,5 @@ c.c.c c.c.c.b c.c.c.b.b d +test.args +test2.args diff --git a/t/all.do b/t/all.do index 2ec8b54..ed97828 100644 --- a/t/all.do +++ b/t/all.do @@ -1,3 +1,3 @@ -redo-ifchange hello yellow bellow c d deltest deltest2 +redo-ifchange hello yellow bellow c d diff --git a/t/default.args.do b/t/default.args.do new file mode 100644 index 0000000..5309b61 --- /dev/null +++ b/t/default.args.do @@ -0,0 +1,3 @@ +[ "$1" = "test" ] +[ "$2" = ".args" ] +[ "$3" != "test.args" ] diff --git a/t/runtests.do b/t/runtests.do index 8aebc56..cec28ef 100644 --- a/t/runtests.do +++ b/t/runtests.do @@ -1,2 +1,3 @@ redo-ifchange all ./hello >&2 +redo deltest deltest2 test.args test2.args diff --git a/t/test2.args.do b/t/test2.args.do new file mode 100644 index 0000000..c96d759 --- /dev/null +++ b/t/test2.args.do @@ -0,0 +1,3 @@ +[ "$1" = "test2.args" ] +[ "$2" = "" ] +[ "$3" != "test2.args" ]