From c7585558ef3ceb90e5ce4cd39a3f0ab817793a46 Mon Sep 17 00:00:00 2001 From: Avery Pennarun Date: Wed, 17 Nov 2010 17:55:16 -0800 Subject: [PATCH] If the .do script deletes $3, don't die. --- minimal/do | 2 +- redo.py | 6 ++++-- t/all.do | 3 ++- t/deltest.do | 2 ++ t/deltest2.do | 3 +++ 5 files changed, 12 insertions(+), 4 deletions(-) create mode 100644 t/deltest.do create mode 100644 t/deltest2.do diff --git a/minimal/do b/minimal/do index 5c9c9e9..be26b05 100755 --- a/minimal/do +++ b/minimal/do @@ -38,7 +38,7 @@ _do() export DO_DEPTH="$DO_DEPTH " . "$PWD/$DOFILE" >"$TARGET.tmp" ) && - mv "$TARGET.tmp" "$TARGET" + mv "$TARGET.tmp" "$TARGET" 2>/dev/null || touch "$TARGET" else echo "do $DO_DEPTH$TARGET exists." >&2 fi diff --git a/redo.py b/redo.py index cfbaba0..1cf4b54 100755 --- a/redo.py +++ b/redo.py @@ -134,10 +134,12 @@ def _build(t): log('%s\n' % relpath(t, vars.STARTDIR)) rv = subprocess.call(argv, preexec_fn=lambda: _preexec(t), stdout=f.fileno()) - st = os.stat(tmpname) stampfile = sname('stamp', t) if rv==0: - if st.st_size: + if os.path.exists(tmpname) and os.stat(tmpname).st_size: + # there's a race condition here, but if the tmpfile disappears + # at *this* point you deserve to get an error, because you're + # doing something totally scary. os.rename(tmpname, t) else: unlink(tmpname) diff --git a/t/all.do b/t/all.do index 2b876ff..2ec8b54 100644 --- a/t/all.do +++ b/t/all.do @@ -1,2 +1,3 @@ -redo-ifchange hello yellow bellow c d +redo-ifchange hello yellow bellow c d deltest deltest2 + diff --git a/t/deltest.do b/t/deltest.do new file mode 100644 index 0000000..4be8b3e --- /dev/null +++ b/t/deltest.do @@ -0,0 +1,2 @@ +# remove an empty output file +rm -f $3 diff --git a/t/deltest2.do b/t/deltest2.do new file mode 100644 index 0000000..6caacc7 --- /dev/null +++ b/t/deltest2.do @@ -0,0 +1,3 @@ +# delete a non-empty output file +echo hello +rm -f $3