minimal/do: don't create a .did file until after a file is actually built.

With the new "continue" feature on by default, it turned out that
ctrl-c during a build, or a .do file returning an error, would mark a
target as "built" even though it hadn't been.  This would prevent
retrying it when you started minimal/do again.  Use a temp file
instead.

It's a little tricky: to prevent accidental recursion, we want to
create a file *before* building, but clean up that file when starting
the next session.  And we rename that file to the actual .did file
*after* building successfully.
This commit is contained in:
Avery Pennarun 2018-11-02 03:48:25 -04:00
commit ec72beb343
11 changed files with 39 additions and 21 deletions

View file

@ -1 +1,3 @@
/fail
/want-fail
/maybe-fail

View file

@ -4,7 +4,6 @@ rm -f this-doesnt-exist
redo-ifcreate this-doesnt-exist >/dev/null 2>&1 || exit 34 # expected to pass
rm -f fail
! redo-ifchange fail >/dev/null 2>&1 || exit 44 # expected to fail
@ -16,3 +15,14 @@ redo-ifchange fail >/dev/null 2>&1 || exit 55 # expected to pass
# Make sure we don't leave this lying around for future runs, or redo
# might mark it as "manually modified" (since we did!)
rm -f fail
rm -f maybe-fail
: >want-fail
! redo-ifchange maybe-fail >/dev/null 2>&1 || exit 66
rm -f want-fail
../flush-cache
redo-ifchange maybe-fail || exit 67 # failed last time, must retry
: >want-fail
../flush-cache
redo-ifchange maybe-fail || exit 68 # passed last time, no dep, no redo
rm -f want-fail

View file

@ -1 +1 @@
rm -f fail *~ .*~
rm -f fail maybe-fail want-fail *~ .*~

2
t/201-fail/maybe-fail.do Normal file
View file

@ -0,0 +1,2 @@
[ -e 'want-fail' ] && exit 1
echo x

View file

@ -1,4 +1,4 @@
*.did
*.ran
*.extra
a
b

View file

@ -1,4 +1,4 @@
echo x >>a.did
echo x >>a.ran
rm -f $2.extra
echo foo >$2.extra
ln -s $2.extra $3

View file

@ -1,14 +1,14 @@
rm -f a a.extra b b.did
rm -f a a.extra b b.ran
d0=""
redo a
redo-ifchange b
d1=$(cat b.did)
d1=$(cat b.ran)
[ "$d0" != "$d1" ] || exit 11
# b only rebuilds if a changes
../flush-cache
redo-ifchange b
d2=$(cat b.did)
d2=$(cat b.ran)
[ "$d1" = "$d2" ] || exit 12
. ../skip-if-minimal-do.sh
@ -20,7 +20,7 @@ d2=$(cat b.did)
../flush-cache
redo a
redo-ifchange b
d3=$(cat b.did)
d3=$(cat b.ran)
[ "$d2" != "$d3" ] || exit 13
# Explicitly check that changing a's symlink target (a.extra) does *not*
@ -30,5 +30,5 @@ d3=$(cat b.did)
../flush-cache
touch a.extra
redo-ifchange b
d4=$(cat b.did)
d4=$(cat b.ran)
[ "$d3" = "$d4" ] || exit 14

View file

@ -1,3 +1,3 @@
echo x >>b.did
echo x >>b.ran
redo-ifchange a
cat a >$3

View file

@ -1 +1 @@
rm -f *~ .*~ a b *.extra *.did
rm -f *~ .*~ a b *.extra *.ran