diff options
author | Dirk Baechle <dl9obn@darc.de> | 2012-01-10 22:12:51 (GMT) |
---|---|---|
committer | Dirk Baechle <dl9obn@darc.de> | 2012-01-10 22:12:51 (GMT) |
commit | 35f4086ceb163bcb036a9432b05b5c2089361c1f (patch) | |
tree | bee1c8f2200453a51af4fe64af04c7054835b40c /src | |
parent | 31dcd5f9ff47063d9d10a09415dd2421967ae818 (diff) | |
download | SCons-35f4086ceb163bcb036a9432b05b5c2089361c1f.zip SCons-35f4086ceb163bcb036a9432b05b5c2089361c1f.tar.gz SCons-35f4086ceb163bcb036a9432b05b5c2089361c1f.tar.bz2 |
- fixed issue #2720, applied final patch (v3) by Alexey Klimkin
Diffstat (limited to 'src')
-rw-r--r-- | src/engine/SCons/Node/__init__.py | 1 | ||||
-rw-r--r-- | src/engine/SCons/Taskmaster.py | 31 | ||||
-rw-r--r-- | src/engine/SCons/TaskmasterTests.py | 3 |
3 files changed, 23 insertions, 12 deletions
diff --git a/src/engine/SCons/Node/__init__.py b/src/engine/SCons/Node/__init__.py index 2fbe2c6..69d2898 100644 --- a/src/engine/SCons/Node/__init__.py +++ b/src/engine/SCons/Node/__init__.py @@ -216,6 +216,7 @@ class Node(object): self.precious = None self.noclean = 0 self.nocache = 0 + self.cached = 0 # is this node pulled from cache? self.always_build = None self.includes = None self.attributes = self.Attrs() # Generic place to stick information about the Node. diff --git a/src/engine/SCons/Taskmaster.py b/src/engine/SCons/Taskmaster.py index 58a8d90..64ab84d 100644 --- a/src/engine/SCons/Taskmaster.py +++ b/src/engine/SCons/Taskmaster.py @@ -227,20 +227,26 @@ class Task(object): if T: T.write(self.trace_message(u'Task.execute()', self.node)) try: - everything_was_cached = 1 + cached_targets = [] for t in self.targets: - if t.retrieve_from_cache(): - # Call the .built() method without calling the - # .push_to_cache() method, since we just got the - # target from the cache and don't need to push - # it back there. - t.set_state(NODE_EXECUTED) - t.built() - else: - everything_was_cached = 0 + if not t.retrieve_from_cache(): break - if not everything_was_cached: + cached_targets.append(t) + if len(cached_targets) < len(self.targets): + # Remove targets before building. It's possible that we + # partially retrieved targets from the cache, leaving + # them in read-only mode. That might cause the command + # to fail. + # + for t in cached_targets: + try: + t.fs.unlink(t.path) + except (IOError, OSError): + pass self.targets[0].build() + else: + for t in cached_targets: + t.cached = 1 except SystemExit: exc_value = sys.exc_info()[1] raise SCons.Errors.ExplicitExit(self.targets[0], exc_value.code) @@ -292,7 +298,8 @@ class Task(object): for side_effect in t.side_effects: side_effect.set_state(NODE_NO_STATE) t.set_state(NODE_EXECUTED) - t.push_to_cache() + if not t.cached: + t.push_to_cache() t.built() t.visited() diff --git a/src/engine/SCons/TaskmasterTests.py b/src/engine/SCons/TaskmasterTests.py index 66c6b9c..4c56538 100644 --- a/src/engine/SCons/TaskmasterTests.py +++ b/src/engine/SCons/TaskmasterTests.py @@ -91,6 +91,9 @@ class Node(object): global built_text built_text = self.name + " built" + def remove(self): + pass + def built(self): global built_text if not self.cached: |