From 91630a892ac0fd6cee6c5c39bdfbd91260848efc Mon Sep 17 00:00:00 2001 From: Avery Pennarun Date: Sat, 11 Dec 2010 05:50:29 -0800 Subject: [PATCH] Whoops, redo-oob was slightly wrong when used with -j. We called 'redo' instead of 'redo-ifchange' on our indeterminate objects. Since other instances of redo-oob might be running at the same time, this could cause the same object to get rebuilt more than once unnecessarily. The unit tests caught this, I just didn't notice earlier. --- builder.py | 2 +- redo-oob.py | 5 ++++- vars.py | 3 +++ 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/builder.py b/builder.py index 7ee69c9..342c5b4 100644 --- a/builder.py +++ b/builder.py @@ -73,7 +73,7 @@ class BuildJob: except ImmediateReturn, e: return self._after2(e.rv) - if dirty == True: + if vars.NO_OOB or dirty == True: self._start_do() else: self._start_oob(dirty) diff --git a/redo-oob.py b/redo-oob.py index 9da8fa6..9b989a7 100755 --- a/redo-oob.py +++ b/redo-oob.py @@ -12,11 +12,14 @@ deps = sys.argv[2:] me = state.File(name=target) -argv = ['redo'] + deps +os.environ['REDO_NO_OOB'] = '1' +argv = ['redo-ifchange'] + deps rv = os.spawnvp(os.P_WAIT, argv[0], argv) if rv: sys.exit(rv) +# we know our caller already owns the lock on target, so we don't have to +# acquire another one. os.environ['REDO_UNLOCKED'] = '1' argv = ['redo-ifchange', target] rv = os.spawnvp(os.P_WAIT, argv[0], argv) diff --git a/vars.py b/vars.py index 534ccff..39a3346 100644 --- a/vars.py +++ b/vars.py @@ -25,3 +25,6 @@ while BASE and BASE.endswith('/'): UNLOCKED = os.environ.get('REDO_UNLOCKED', '') and 1 or 0 os.environ['REDO_UNLOCKED'] = '' # not inheritable by subprocesses + +NO_OOB = os.environ.get('REDO_NO_OOB', '') and 1 or 0 +os.environ['REDO_NO_OOB'] = '' # not inheritable by subprocesses