diff --git a/redo-ifchange.py b/redo-ifchange.py index a9951b7..a70fc03 100755 --- a/redo-ifchange.py +++ b/redo-ifchange.py @@ -5,6 +5,8 @@ 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)) stamptime = state.stamped(t, fromdir) if stamptime == None: @@ -29,6 +31,7 @@ def _dirty_deps(t, depth, fromdir): if dirty_deps(name, depth + ' ', fromdir=vars.BASE): #debug('%s-- DIRTY (sub)\n' % depth) return True + state.mark(t, fromdir) return False diff --git a/redo.py b/redo.py index b371d24..263e2fb 100755 --- a/redo.py +++ b/redo.py @@ -50,6 +50,8 @@ if is_root: mkdirp('%s/.redo' % base) for f in glob.glob('%s/.redo/lock*' % base): os.unlink(f) + for f in glob.glob('%s/.redo/mark^*' % base): + os.unlink(f) if not vars.DEPTH: diff --git a/state.py b/state.py index 2857c36..3f8591d 100644 --- a/state.py +++ b/state.py @@ -34,6 +34,7 @@ def _stampname(t, fromdir=None): def stamp(t): + mark(t) stampfile = _stampname(t) newstampfile = _sname('stamp' + str(os.getpid()), t) depfile = _sname('dep', t) @@ -65,6 +66,25 @@ def stamped(t, fromdir=None): return stamptime +def mark(t, fromdir=None): + try: + open(_sname('mark', t, fromdir), 'w').close() + except IOError, e: + if e.errno == errno.ENOENT: + pass # may happen if someone deletes our .redo dir + else: + raise + + +_marks = {} +def ismarked(t, fromdir=None): + if _marks.get((t,fromdir)): + return True + if os.path.exists(_sname('mark', t, fromdir)): + _marks[(t,fromdir)] = True + return True + + def is_generated(t): return os.path.exists(_sname('gen', t))