Add a redo-always command: it adds an "always dirty" dependency to your target.

This is mostly useless except when combined with redo-stamp... I think.
This commit is contained in:
Avery Pennarun 2010-12-11 07:02:45 -08:00
commit 0da5c7c082
10 changed files with 45 additions and 7 deletions

1
redo-always Symbolic link
View file

@ -0,0 +1 @@
redo-always.py

16
redo-always.py Executable file
View file

@ -0,0 +1,16 @@
#!/usr/bin/python
import sys, os
import vars, state
from helpers import err
try:
me = state.File(name=vars.TARGET)
me.add_dep('m', state.ALWAYS)
always = state.File(name=state.ALWAYS)
always.stamp = state.STAMP_MISSING
always.set_changed()
always.save()
state.commit()
except KeyboardInterrupt:
sys.exit(200)

View file

@ -28,6 +28,7 @@ def dirty_deps(f, depth, max_changed):
if not f.stamp: if not f.stamp:
debug('%s-- DIRTY (no stamp)\n' % depth) debug('%s-- DIRTY (no stamp)\n' % depth)
return DIRTY return DIRTY
newstamp = f.read_stamp() newstamp = f.read_stamp()
if f.stamp != newstamp: if f.stamp != newstamp:
if newstamp == state.STAMP_MISSING: if newstamp == state.STAMP_MISSING:

View file

@ -153,7 +153,7 @@ class File(object):
q += 'where rowid=?' q += 'where rowid=?'
l = [id] l = [id]
elif name != None: elif name != None:
name = relpath(name, vars.BASE) name = (name==ALWAYS) and ALWAYS or relpath(name, vars.BASE)
q += 'where name=?' q += 'where name=?'
l = [name] l = [name]
else: else:
@ -178,6 +178,8 @@ class File(object):
(self.id, self.name, self.is_generated, self.is_override, (self.id, self.name, self.is_generated, self.is_override,
self.checked_runid, self.changed_runid, self.failed_runid, self.checked_runid, self.changed_runid, self.failed_runid,
self.stamp, self.csum) = cols self.stamp, self.csum) = cols
if self.name == ALWAYS and self.changed_runid < vars.RUNID:
self.changed_runid = vars.RUNID
def __init__(self, id=None, name=None, cols=None): def __init__(self, id=None, name=None, cols=None):
if cols: if cols:
@ -259,9 +261,7 @@ class File(object):
def add_dep(self, mode, dep): def add_dep(self, mode, dep):
src = File(name=dep) src = File(name=dep)
reldep = relpath(dep, vars.BASE) debug2('add-dep: %r < %s %r\n' % (self.name, mode, src.name))
debug2('add-dep: %r < %s %r\n' % (self.name, mode, reldep))
assert(src.name == reldep)
assert(self.id != src.id) assert(self.id != src.id)
_write("insert or replace into Deps " _write("insert or replace into Deps "
" (target, mode, source) values (?,?,?)", " (target, mode, source) values (?,?,?)",

2
t/.gitignore vendored
View file

@ -16,3 +16,5 @@ test2.args
/touch1 /touch1
/touch1.do /touch1.do
/deltest2 /deltest2
/always1
/always1.log

3
t/always1.do Normal file
View file

@ -0,0 +1,3 @@
echo $$ >>always1.log
echo $$
redo-always

13
t/alwaystest.do Normal file
View file

@ -0,0 +1,13 @@
rm -f always1 always1.log
redo always1
[ "$(wc -l <always1.log)" -eq 1 ] || exit 11
# This shouldn't rebuild, but because other people might be running flush-cache.sh
# in parallel with us, we can't be 100% sure it won't. So don't test it.
#redo-ifchange always1
#[ "$(wc -l <always1.log)" -eq 1 ] || exit 21
./flush-cache.sh
redo-ifchange always1
[ "$(wc -l <always1.log)" -eq 2 ] || exit 31

View file

@ -1,5 +1,5 @@
redo example/clean curse/clean deps/clean "space dir/clean" stamp/clean redo example/clean curse/clean deps/clean "space dir/clean" stamp/clean
rm -f c c.c c.c.c c.c.c.b c.c.c.b.b d mode1 makedir.log chdir1 deltest2 \ rm -f c c.c c.c.c c.c.c.b c.c.c.b.b d mode1 makedir.log chdir1 deltest2 \
hello [by]ellow *.o *~ .*~ CC LD passfail silence silence.do \ hello [by]ellow *.o *~ .*~ *.log CC LD passfail silence silence.do \
touch1 touch1.do touch1 touch1.do always1
rm -rf makedir rm -rf makedir

View file

@ -7,6 +7,7 @@ redo stampy
# stampy already exists, so we won't generate it a second time, even though # stampy already exists, so we won't generate it a second time, even though
# usestamp depends on it. # usestamp depends on it.
../flush-cache.sh
redo-ifchange usestamp redo-ifchange usestamp
[ "$(wc -l <stampy.log)" -eq 1 ] || exit 21 [ "$(wc -l <stampy.log)" -eq 1 ] || exit 21
[ "$(wc -l <usestamp.log)" -eq 1 ] || exit 12 [ "$(wc -l <usestamp.log)" -eq 1 ] || exit 12
@ -17,6 +18,7 @@ redo stampy
[ "$(wc -l <usestamp.log)" -eq 1 ] || exit 32 [ "$(wc -l <usestamp.log)" -eq 1 ] || exit 32
# same as above: stampy is already up-to-date, so it won't be redone. # same as above: stampy is already up-to-date, so it won't be redone.
../flush-cache.sh
redo-ifchange usestamp redo-ifchange usestamp
[ "$(wc -l <stampy.log)" -eq 2 ] || exit 41 [ "$(wc -l <stampy.log)" -eq 2 ] || exit 41
[ "$(wc -l <usestamp.log)" -eq 1 ] || exit 42 [ "$(wc -l <usestamp.log)" -eq 1 ] || exit 42

View file

@ -2,4 +2,4 @@ redo-ifchange all
./hello >&2 ./hello >&2
redo deltest deltest2 test.args test2.args passfailtest chdirtest \ redo deltest deltest2 test.args test2.args passfailtest chdirtest \
curse/test deps/test "space dir/test" modetest makedir2 \ curse/test deps/test "space dir/test" modetest makedir2 \
silencetest touchtest stamp/test silencetest touchtest stamp/test alwaystest