2018-12-12 03:36:09 +00:00
|
|
|
rm -rf destruct
|
|
|
|
|
mkdir destruct
|
|
|
|
|
cd destruct
|
|
|
|
|
cat >destruct1.do <<-EOF
|
|
|
|
|
rm -f *.tmp
|
|
|
|
|
echo 'redir' >\$3
|
|
|
|
|
EOF
|
|
|
|
|
cat >destruct2.do <<-EOF
|
|
|
|
|
rm -f *.tmp
|
|
|
|
|
echo 'stdout'
|
|
|
|
|
EOF
|
|
|
|
|
|
Use mkstemp() to create the stdout temp file, and simplify $3 path.
Previously, we'd try to put the stdout temp file in the same dir as the
target, if that dir exists. Otherwise we'd walk up the directory tree
looking for a good place. But this would go wrong if the directory we
chose got *deleted* during the run of the .do file.
Instead, we switch to an entirely new design: we use mkstemp() to
generate a temp file in the standard temp file location (probably
/tmp), then open it and immediately delete it, so the .do file can't
cause any unexpected behaviour. After the .do file exits, we use our
still-open fd to the stdout file to read the content back out.
In the old implementation, we also put the $3 in the "adjusted"
location that depended whether the target dir already existed, just for
consistency. But that was never necessary: we didn't create the $3
file, and if the .do script wants to write to $3, it should create the
target dir first anyway. So change it to *always* use a $3 temp
filename in the target dir, which is much simpler and so has fewer edge
cases.
Add t/202-del/deltest4 with some tests for all these edge cases.
Reported-by: Jeff Stearns <jeff.stearns@gmail.com>
2018-12-12 03:37:44 +00:00
|
|
|
# deleting unused stdout file is a warning at most
|
2018-12-12 03:36:09 +00:00
|
|
|
redo destruct1 2>destruct1.log || exit 11
|
|
|
|
|
[ "$(cat destruct1)" = "redir" ] || exit 12
|
|
|
|
|
|
|
|
|
|
# deleting *used* stdout file may be a fatal mistake,
|
|
|
|
|
# but we won't enforce that, since some redo variants
|
|
|
|
|
# might be more accepting or use different tmp file
|
|
|
|
|
# algorithms. So either the file should be correct,
|
|
|
|
|
# or it should be missing.
|
|
|
|
|
redo destruct2 2>destruct2.log || :
|
|
|
|
|
if [ -e "destruct2" ]; then
|
|
|
|
|
[ "$(cat destruct2)" = "stdout" ] || exit 22
|
|
|
|
|
fi
|