Certain redo post-build failures would still mark a target as built.

If we failed because:
- target dir doesn't exist
- failed to copy from stdout
- failed to rename $3

We would correctly return error 209, but the target would still be
marked as having been built, so redo-ifchange would not try to build it
next time, beause we forgot to call sf.set_failed() in those cases.

minimal/do worked correctly.

Added a test to catch this in the future.
This commit is contained in:
Avery Pennarun 2019-03-02 02:13:18 -05:00
commit 8100aa4973
6 changed files with 29 additions and 1 deletions

View file

@ -419,7 +419,8 @@ class _BuildJob(object):
sf.csum = None sf.csum = None
sf.update_stamp() sf.update_stamp()
sf.set_changed() sf.set_changed()
else: # rv might have changed up above
if rv:
helpers.unlink(self.tmpname) helpers.unlink(self.tmpname)
sf = self.sf sf = self.sf
sf.set_failed() sf.set_failed()

1
t/122-defaults-parent/.gitignore vendored Normal file
View file

@ -0,0 +1 @@
/*.log

View file

@ -0,0 +1,22 @@
rm -f x/shouldfail
log=$PWD/$1.log
rm -f "$log"
expect_fail() {
local rv=$1
shift
if ("$@") >>$log 2>&1; then
cat "$log" >&2
echo "unexpected success:" "$@" >&2
return $rv
else
return 0
fi
}
cd inner
expect_fail 11 redo ../x/shouldfail # should fail
expect_fail 12 redo-ifchange ../x/shouldfail # should fail again
exit 0

View file

@ -0,0 +1,2 @@
rm -f *~ .*~ */*~ */.*~ *.tmp */*.tmp x/shouldfail *.log */*.log

View file

@ -0,0 +1,2 @@
echo "inner/default.do: PWD=$PWD '$1' '$2' '$3'" >&2
echo SUSPICIOUS

View file