{ood,sources,targets}: fix relative paths; turn missing targets into sources.
When we check dependencies and a previously-is_generated dependency existed before, but no longer does, forget that it was is_generated. This slightly improves the situation where as a project evolves, a file that used to be a target gets removed, and then later is re-added as a static source file. (It doesn't fix the other variant, where a file is changed from target to source in a single atomic change, and is never missing. That one will be trickier to handle.) While adding a test for this behaviour, I discovered that redo-sources, redo-targets, and redo-ood were reporting their output relative to STARTDIR instead of relative to $PWD, so fix that too.
This commit is contained in:
parent
5596b9fae3
commit
c06d1fba40
11 changed files with 89 additions and 8 deletions
1
clean.do
1
clean.do
|
|
@ -10,3 +10,4 @@ rm -rf minimal/.do_built minimal/.do_built.dir website
|
|||
redo t/clean Documentation/clean version/clean
|
||||
rm -f *~ .*~ */*~ */.*~ *.pyc install.wrapper
|
||||
find . -name '*.tmp' -exec rm -fv {} \;
|
||||
find . -name '*.did' -exec rm -fv {} \;
|
||||
|
|
|
|||
13
deps.py
13
deps.py
|
|
@ -39,6 +39,17 @@ def isdirty(f, depth, max_changed,
|
|||
if f.stamp != newstamp:
|
||||
if newstamp == state.STAMP_MISSING:
|
||||
debug('%s-- DIRTY (missing)\n' % depth)
|
||||
if f.stamp and f.is_generated:
|
||||
# previously was stamped and generated, but suddenly missing.
|
||||
# We can safely forget that it is/was a target; if someone
|
||||
# does redo-ifchange on it and it doesn't exist, we'll mark
|
||||
# it a target again, but if someone creates it by hand,
|
||||
# it'll be a source. This should reduce false alarms when
|
||||
# files change from targets to sources as a project evolves.
|
||||
debug('%s converted target -> source\n' % depth)
|
||||
f.is_generated = False
|
||||
#f.update_stamp()
|
||||
f.save()
|
||||
else:
|
||||
debug('%s-- DIRTY (mtime)\n' % depth)
|
||||
if f.csum:
|
||||
|
|
@ -103,5 +114,3 @@ def isdirty(f, depth, max_changed,
|
|||
state.warn_override(f.name)
|
||||
set_checked(f)
|
||||
return CLEAN
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -21,9 +21,10 @@ def set_checked(f):
|
|||
cache[f.id] = 1
|
||||
|
||||
|
||||
cwd = os.getcwd()
|
||||
for f in state.files():
|
||||
if f.is_generated and f.read_stamp() != state.STAMP_MISSING:
|
||||
if deps.isdirty(f, depth='', max_changed=vars.RUNID,
|
||||
already_checked=[],
|
||||
is_checked=is_checked, set_checked=set_checked):
|
||||
print f.nicename()
|
||||
print state.relpath(os.path.join(vars.BASE, f.name), cwd)
|
||||
|
|
|
|||
|
|
@ -4,15 +4,16 @@ import sys, os
|
|||
import vars_init
|
||||
vars_init.init([])
|
||||
|
||||
import state
|
||||
import state, vars
|
||||
from logs import err
|
||||
|
||||
if len(sys.argv[1:]) != 0:
|
||||
err('%s: no arguments expected.\n' % sys.argv[0])
|
||||
sys.exit(1)
|
||||
|
||||
cwd = os.getcwd()
|
||||
for f in state.files():
|
||||
if f.name.startswith('//'):
|
||||
continue # special name, ignore
|
||||
if not f.is_generated and f.read_stamp() != state.STAMP_MISSING:
|
||||
print f.nicename()
|
||||
print state.relpath(os.path.join(vars.BASE, f.name), cwd)
|
||||
|
|
|
|||
|
|
@ -4,13 +4,14 @@ import sys, os
|
|||
import vars_init
|
||||
vars_init.init([])
|
||||
|
||||
import state
|
||||
import state, vars
|
||||
from logs import err
|
||||
|
||||
if len(sys.argv[1:]) != 0:
|
||||
err('%s: no arguments expected.\n' % sys.argv[0])
|
||||
sys.exit(1)
|
||||
|
||||
cwd = os.getcwd()
|
||||
for f in state.files():
|
||||
if f.is_generated and f.read_stamp() != state.STAMP_MISSING:
|
||||
print f.nicename()
|
||||
print state.relpath(os.path.join(vars.BASE, f.name), cwd)
|
||||
|
|
|
|||
|
|
@ -1 +1 @@
|
|||
rm -f touch1 touch1-ran *~ .*~
|
||||
rm -f touch1 touch1-ran *~ .*~ silence.do
|
||||
|
|
|
|||
6
t/351-deps-forget/.gitignore
vendored
Normal file
6
t/351-deps-forget/.gitignore
vendored
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
bork
|
||||
bork.do
|
||||
bork.log
|
||||
sub
|
||||
sub.log
|
||||
targets.out
|
||||
55
t/351-deps-forget/all.do
Normal file
55
t/351-deps-forget/all.do
Normal file
|
|
@ -0,0 +1,55 @@
|
|||
exec >&2
|
||||
rm -f bork.do bork bork.log sub sub.log targets.out
|
||||
|
||||
qgrep() {
|
||||
# like "grep -q", but portable
|
||||
grep "$@" >/dev/null
|
||||
}
|
||||
|
||||
cp bork.do.in bork.do
|
||||
redo bork
|
||||
[ "$(cat bork.log)" = "x" ] || exit 2
|
||||
redo bork
|
||||
[ "$(cat bork.log)" = "xx" ] || exit 3
|
||||
|
||||
redo-ifchange sub
|
||||
[ "$(cat bork.log)" = "xx" ] || exit 10
|
||||
[ "$(cat sub.log)" = "y" ] || exit 11
|
||||
. ../skip-if-minimal-do.sh
|
||||
redo-sources | qgrep '^bork$' && exit 12
|
||||
redo-targets | tee targets.out | qgrep '^bork$' || exit 13
|
||||
|
||||
# Might as well test redo-ood while we're here
|
||||
../flush-cache
|
||||
redo bork
|
||||
redo-targets | qgrep '^bork$' || exit 15
|
||||
redo-targets | qgrep '^sub$' || exit 16
|
||||
redo-ood | qgrep '^sub$' || exit 17
|
||||
|
||||
redo-ifchange sub
|
||||
[ "$(cat bork.log)" = "xxx" ] || exit 18
|
||||
[ "$(cat sub.log)" = "yy" ] || exit 19
|
||||
|
||||
rm -f bork
|
||||
../flush-cache
|
||||
redo-ifchange sub # rebuilds, and sub.do drops dependency on bork
|
||||
[ "$(cat bork.log)" = "xxx" ] || exit 20
|
||||
[ "$(cat sub.log)" = "yyy" ] || exit 21
|
||||
redo-sources | qgrep '^bork$' && exit 22 # nonexistent, so not a source
|
||||
redo-targets | qgrep '^bork$' && exit 23 # deleted; not a target anymore
|
||||
|
||||
echo static >bork
|
||||
../flush-cache
|
||||
redo-ifchange sub # doesn't depend on bork anymore, so doesn't rebuild
|
||||
[ "$(cat bork.log)" = "xxx" ] || exit 30
|
||||
[ "$(cat sub.log)" = "yyy" ] || exit 31
|
||||
|
||||
# bork should now be considered static, so no warning or need to rebuild.
|
||||
# It should now be considered a source, not a target.
|
||||
redo sub # force rebuild; sub.do now declares dependency on bork
|
||||
[ "$(cat bork.log)" = "xxx" ] || exit 40
|
||||
[ "$(cat sub.log)" = "yyyy" ] || exit 41
|
||||
redo-sources | qgrep '^bork$' || exit 42
|
||||
redo-targets | qgrep '^bork$' && exit 43
|
||||
|
||||
exit 0
|
||||
2
t/351-deps-forget/bork.do.in
Normal file
2
t/351-deps-forget/bork.do.in
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
echo bork
|
||||
printf x >>$1.log
|
||||
2
t/351-deps-forget/clean.do
Normal file
2
t/351-deps-forget/clean.do
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
rm -f *~ .*~ bork bork.do bork.log sub sub.log targets.out
|
||||
|
||||
3
t/351-deps-forget/sub.do
Normal file
3
t/351-deps-forget/sub.do
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
[ -e bork ] && redo-ifchange bork
|
||||
echo sub
|
||||
printf y >>$1.log
|
||||
Loading…
Add table
Add a link
Reference in a new issue