diff --git a/redo-ifchange.py b/redo-ifchange.py index a70fc03..99ffad3 100755 --- a/redo-ifchange.py +++ b/redo-ifchange.py @@ -5,9 +5,14 @@ from helpers import debug, err, mkdirp, unlink def _dirty_deps(t, depth, fromdir): - if state.ismarked(t, fromdir): - return False # has already been checked during this session debug('%s?%s\n' % (depth, t)) + if state.isbuilt(t, fromdir): + debug('%s-- DIRTY (built)\n' % depth) + return True # has already been built during this session + if state.ismarked(t, fromdir): + debug('%s-- CLEAN (marked)\n' % depth) + return False # has already been checked during this session + stamptime = state.stamped(t, fromdir) if stamptime == None: debug('%s-- DIRTY (no stamp)\n' % depth) @@ -29,7 +34,7 @@ def _dirty_deps(t, depth, fromdir): return True elif mode == 'm': if dirty_deps(name, depth + ' ', fromdir=vars.BASE): - #debug('%s-- DIRTY (sub)\n' % depth) + debug('%s-- DIRTY (sub)\n' % depth) return True state.mark(t, fromdir) return False @@ -42,8 +47,12 @@ def dirty_deps(t, depth, fromdir=None): return False +def should_build(t): + return not state.isbuilt(t) and dirty_deps(t, depth = '') + + def maybe_build(t): - if dirty_deps(t, depth = ''): + if should_build(t): builder.build(t) @@ -56,7 +65,7 @@ try: want_build = [] for t in sys.argv[1:]: state.add_dep(vars.TARGET, 'm', t) - if dirty_deps(t, depth = ''): + if should_build(t): want_build.append(t) rv = builder.main(want_build, maybe_build) diff --git a/state.py b/state.py index b8a7b33..4c26769 100644 --- a/state.py +++ b/state.py @@ -13,6 +13,8 @@ def init(): os.unlink(f) for f in glob.glob('%s/.redo/mark^*' % vars.BASE): os.unlink(f) + for f in glob.glob('%s/.redo/built^*' % vars.BASE): + os.unlink(f) def _sname(typ, t, fromdir=None): @@ -46,6 +48,7 @@ def _stampname(t, fromdir=None): def stamp(t): + built(t) mark(t) stampfile = _stampname(t) newstampfile = _sname('stamp' + str(os.getpid()), t) @@ -78,6 +81,25 @@ def stamped(t, fromdir=None): return stamptime +def built(t, fromdir=None): + try: + open(_sname('built', t, fromdir), 'w').close() + except IOError, e: + if e.errno == errno.ENOENT: + pass # may happen if someone deletes our .redo dir + else: + raise + + +_builts = {} +def isbuilt(t, fromdir=None): + if _builts.get((t,fromdir)): + return True + if os.path.exists(_sname('built', t, fromdir)): + _builts[(t,fromdir)] = True + return True + + def mark(t, fromdir=None): try: open(_sname('mark', t, fromdir), 'w').close()