diff options
Diffstat (limited to 'src/engine/SCons/Node')
| -rw-r--r-- | src/engine/SCons/Node/FSTests.py | 16 | ||||
| -rw-r--r-- | src/engine/SCons/Node/NodeTests.py | 86 | ||||
| -rw-r--r-- | src/engine/SCons/Node/__init__.py | 52 |
3 files changed, 42 insertions, 112 deletions
diff --git a/src/engine/SCons/Node/FSTests.py b/src/engine/SCons/Node/FSTests.py index 5917044..b5c96f9 100644 --- a/src/engine/SCons/Node/FSTests.py +++ b/src/engine/SCons/Node/FSTests.py @@ -40,10 +40,16 @@ class Builder: def __init__(self, factory): self.factory = factory - def execute(self, target, source, env): - global built_it - built_it = 1 - return 0 + def get_actions(self): + class Action: + def execute(self, targets, sources, env): + global built_it + built_it = 1 + return 0 + return [Action()] + + def targets(self, t): + return [t] def source_factory(self, name): return self.factory(name) @@ -554,6 +560,8 @@ class FSTestCase(unittest.TestCase): fs.chdir(fs.Dir('..')) # Test scanning + f1.builder_set(Builder(fs.File)) + f1.env_set(Environment()) f1.target_scanner = Scanner() f1.scan() assert f1.implicit[0].path_ == os.path.join("d1", "f1") diff --git a/src/engine/SCons/Node/NodeTests.py b/src/engine/SCons/Node/NodeTests.py index 4054bb9..abfbe1c 100644 --- a/src/engine/SCons/Node/NodeTests.py +++ b/src/engine/SCons/Node/NodeTests.py @@ -38,7 +38,7 @@ built_target = None built_source = None cycle_detected = None -class Builder: +class MyAction: def execute(self, target, source, env): global built_it, built_target, built_source, built_args built_it = 1 @@ -46,8 +46,12 @@ class Builder: built_source = source built_args = env return 0 + +class Builder: + def targets(self, t): + return [t] def get_actions(self): - return 'xyzzy' + return [MyAction()] def get_contents(self, target, source, env): return 7 @@ -89,58 +93,14 @@ class Environment: class NodeTestCase(unittest.TestCase): - def test_BuildException(self): - """Test throwing an exception on build failure. - """ - node = SCons.Node.Node() - node.builder_set(FailBuilder()) - node.env_set(Environment()) - try: - node.build() - except SCons.Errors.BuildError: - pass - else: - raise TestFailed, "did not catch expected BuildError" - - node = SCons.Node.Node() - node.builder_set(ExceptBuilder()) - node.env_set(Environment()) - try: - node.build() - except SCons.Errors.BuildError: - pass - else: - raise TestFailed, "did not catch expected BuildError" - - node = SCons.Node.Node() - node.builder_set(ExceptBuilder2()) - node.env_set(Environment()) - try: - node.build() - except SCons.Errors.BuildError, e: - # On a generic (non-BuildError) exception from a Builder, - # the Node should throw a BuildError exception with - # the args set to the exception value, type, and traceback. - assert len(e.args) == 3, `e.args` - assert e.args[0] == 'foo', e.args[0] - assert e.args[1] is None - assert type(e.args[2]) is type(sys.exc_traceback), e.args[2] - else: - raise TestFailed, "did not catch expected BuildError" - def test_build(self): """Test building a node """ global built_it class MyNode(SCons.Node.Node): - def __init__(self, **kw): - apply(SCons.Node.Node.__init__, (self,), kw) - self.prepare_count = 0 def __str__(self): return self.path - def prepare(self): - self.prepare_count = self.prepare_count+ 1 # Make sure it doesn't blow up if no builder is set. node = MyNode() node.build() @@ -153,8 +113,8 @@ class NodeTestCase(unittest.TestCase): node.sources = ["yyy", "zzz"] node.build() assert built_it - assert type(built_target) == type(MyNode()), type(built_target) - assert str(built_target) == "xxx", str(built_target) + assert type(built_target[0]) == type(MyNode()), type(built_target[0]) + assert str(built_target[0]) == "xxx", str(built_target[0]) assert built_source == ["yyy", "zzz"], built_source built_it = None @@ -166,8 +126,8 @@ class NodeTestCase(unittest.TestCase): node.overrides = { "foo" : 1, "bar" : 2 } node.build() assert built_it - assert type(built_target) == type(MyNode()), type(built_target) - assert str(built_target) == "qqq", str(built_target) + assert type(built_target[0]) == type(MyNode()), type(built_target[0]) + assert str(built_target[0]) == "qqq", str(built_target[0]) assert built_source == ["rrr", "sss"], built_source assert built_args["foo"] == 1, built_args assert built_args["bar"] == 2, built_args @@ -185,28 +145,6 @@ class NodeTestCase(unittest.TestCase): fff.sources = ["hhh", "iii"] ggg.sources = ["hhh", "iii"] - built_it = None - fff.build() - assert built_it - ggg.build() - assert ggg.prepare_count== 1, ggg.prepare_count - assert type(built_target) == type(MyNode()), type(built_target) - assert str(built_target) == "fff", str(built_target) - assert built_source == ["hhh", "iii"], built_source - - delattr(lb, 'status') - fff.prepare_count = 0 - ggg.prepare_count = 0 - - built_it = None - ggg.build() - #assert built_it - fff.build() - assert fff.prepare_count== 1, fff.prepare_count - assert type(built_target) == type(MyNode()), type(built_target) - assert str(built_target) == "fff", str(built_target) - assert built_source == ["hhh", "iii"], built_source - def test_depends_on(self): parent = SCons.Node.Node() child = SCons.Node.Node() @@ -249,8 +187,8 @@ class NodeTestCase(unittest.TestCase): """ node = SCons.Node.Node() node.builder_set(Builder()) - a = node.get_actions() - assert a == 'xyzzy', a + a = node.builder.get_actions() + assert isinstance(a[0], MyAction), a[0] def test_set_bsig(self): """Test setting a Node's signature diff --git a/src/engine/SCons/Node/__init__.py b/src/engine/SCons/Node/__init__.py index 82dfd7e..ca6e8eb 100644 --- a/src/engine/SCons/Node/__init__.py +++ b/src/engine/SCons/Node/__init__.py @@ -46,13 +46,10 @@ __revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__" -import string -import types import copy -import sys -import SCons.Sig +import types -from SCons.Errors import BuildError, UserError +import SCons.Sig import SCons.Util # Node states @@ -110,38 +107,25 @@ class Node: def generate_build_env(self): return self.env.Override(self.overrides) - def get_actions(self): - """Fetch the action list to build.""" - return self.builder.get_actions() - def build(self): - """Actually build the node. Return the status from the build.""" - # This method is called from multiple threads in a parallel build, - # so only do thread safe stuff here. Do thread unsafe stuff in built(). + """Actually build the node. + + This method is called from multiple threads in a parallel build, + so only do thread safe stuff here. Do thread unsafe stuff in + built(). + """ if not self.builder: return None - try: - # If this Builder instance has already been called, - # there will already be an associated status. - stat = self.builder.status - except AttributeError: - try: - stat = self.builder.execute(self, self.sources, self.generate_build_env()) - except KeyboardInterrupt: - raise - except UserError: - raise - except BuildError: - raise - except: - raise BuildError(self, "Exception", - sys.exc_type, - sys.exc_value, - sys.exc_traceback) - if stat: - raise BuildError(node = self, errstr = "Error %d" % stat) - - return stat + action_list = self.builder.get_actions() + if not action_list: + return + targets = self.builder.targets(self) + env = self.generate_build_env() + for action in action_list: + stat = action.execute(targets, self.sources, env) + if stat: + raise SCons.Errors.BuildError(node = self, + errstr = "Error %d" % stat) def built(self): """Called just after this node is sucessfully built.""" |
