summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorSteven Knight <knight@baldmt.com>2002-01-15 13:55:17 (GMT)
committerSteven Knight <knight@baldmt.com>2002-01-15 13:55:17 (GMT)
commit4f1715fd6ff09cd910099cf250cbb5e23ee5ca85 (patch)
tree579aedbb29f18aac291e26d2f521aafd55d043ea /src
parentf1743c83435f365ca75f7887267cd5773475e6cc (diff)
downloadSCons-4f1715fd6ff09cd910099cf250cbb5e23ee5ca85.zip
SCons-4f1715fd6ff09cd910099cf250cbb5e23ee5ca85.tar.gz
SCons-4f1715fd6ff09cd910099cf250cbb5e23ee5ca85.tar.bz2
Document function Actions and fix their return values (None == success, don't ignore failures).
Diffstat (limited to 'src')
-rw-r--r--src/CHANGES.txt3
-rw-r--r--src/engine/SCons/Errors.py4
-rw-r--r--src/engine/SCons/ErrorsTests.py4
-rw-r--r--src/engine/SCons/Node/NodeTests.py33
-rw-r--r--src/engine/SCons/Node/__init__.py11
-rw-r--r--src/engine/SCons/Script/__init__.py2
6 files changed, 48 insertions, 9 deletions
diff --git a/src/CHANGES.txt b/src/CHANGES.txt
index 2fa528e..70e30be 100644
--- a/src/CHANGES.txt
+++ b/src/CHANGES.txt
@@ -20,6 +20,9 @@ RELEASE 0.04 -
variables and other functions, defined begin and end macros for
the example sections, regularized white space separation.
+ - Function action fixes: None is now a successful return value.
+ Exceptions are now reported. Document function actions.
+
RELEASE 0.03 - Fri, 11 Jan 2002 01:09:30 -0600
diff --git a/src/engine/SCons/Errors.py b/src/engine/SCons/Errors.py
index 2e8a455..ae2bbb9 100644
--- a/src/engine/SCons/Errors.py
+++ b/src/engine/SCons/Errors.py
@@ -33,9 +33,9 @@ __revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
class BuildError(Exception):
- def __init__(self, node=None, stat=0, *args):
+ def __init__(self, node=None, errstr="Unknown error", *args):
self.node = node
- self.stat = stat
+ self.errstr = errstr
self.args = args
class InternalError(Exception):
diff --git a/src/engine/SCons/ErrorsTests.py b/src/engine/SCons/ErrorsTests.py
index 2612c95..31ad119 100644
--- a/src/engine/SCons/ErrorsTests.py
+++ b/src/engine/SCons/ErrorsTests.py
@@ -32,10 +32,10 @@ class ErrorsTestCase(unittest.TestCase):
def test_BuildError(self):
"""Test the BuildError exception."""
try:
- raise SCons.Errors.BuildError(node = "n", stat = 7)
+ raise SCons.Errors.BuildError(node = "n", errstr = "foo")
except SCons.Errors.BuildError, e:
assert e.node == "n"
- assert e.stat == 7
+ assert e.errstr == "foo"
def test_InternalError(self):
"""Test the InternalError exception."""
diff --git a/src/engine/SCons/Node/NodeTests.py b/src/engine/SCons/Node/NodeTests.py
index f55659e..37b9f37 100644
--- a/src/engine/SCons/Node/NodeTests.py
+++ b/src/engine/SCons/Node/NodeTests.py
@@ -47,10 +47,19 @@ class Builder:
def get_contents(self, env, dir):
return 7
+class NoneBuilder(Builder):
+ def execute(self, **kw):
+ apply(Builder.execute, (self,), kw)
+ return None
+
class FailBuilder:
def execute(self, **kw):
return 1
+class ExceptBuilder:
+ def execute(self, **kw):
+ raise SCons.Errors.BuildError
+
class Environment:
def Dictionary(self, *args):
pass
@@ -72,9 +81,21 @@ class NodeTestCase(unittest.TestCase):
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"
+
def test_build(self):
"""Test building a node
"""
+ global built_it
+
class MyNode(SCons.Node.Node):
def __str__(self):
return self.path
@@ -94,6 +115,18 @@ class NodeTestCase(unittest.TestCase):
assert str(built_target) == "xxx", str(built_target)
assert built_source == ["yyy", "zzz"], built_source
+ built_it = None
+ node = MyNode()
+ node.builder_set(NoneBuilder())
+ node.env_set(Environment())
+ node.path = "qqq"
+ node.sources = ["rrr", "sss"]
+ node.build()
+ assert built_it
+ assert type(built_target) == type(MyNode()), type(built_target)
+ assert str(built_target) == "qqq", str(built_target)
+ assert built_source == ["rrr", "sss"], built_source
+
def test_builder_set(self):
"""Test setting a Node's Builder
"""
diff --git a/src/engine/SCons/Node/__init__.py b/src/engine/SCons/Node/__init__.py
index b81f911..102b532 100644
--- a/src/engine/SCons/Node/__init__.py
+++ b/src/engine/SCons/Node/__init__.py
@@ -72,10 +72,13 @@ class Node:
"""Actually build the node. Return the status from the build."""
if not self.builder:
return None
- stat = self.builder.execute(env = self.env.Dictionary(),
- target = self, source = self.sources)
- if stat != 0:
- raise BuildError(node = self, stat = stat)
+ try:
+ stat = self.builder.execute(env = self.env.Dictionary(),
+ target = self, source = self.sources)
+ except:
+ raise BuildError(node = self, errstr = "Exception")
+ if stat:
+ raise BuildError(node = self, errstr = "Error %d" % stat)
# If we succesfully build a node, then we need to rescan for
# implicit dependencies, since it might have changed on us.
diff --git a/src/engine/SCons/Script/__init__.py b/src/engine/SCons/Script/__init__.py
index 101e5d6..1711f7a 100644
--- a/src/engine/SCons/Script/__init__.py
+++ b/src/engine/SCons/Script/__init__.py
@@ -75,7 +75,7 @@ class BuildTask(SCons.Taskmaster.Task):
try:
self.target.build()
except BuildError, e:
- sys.stderr.write("scons: *** [%s] Error %s\n" % (e.node, str(e.stat)))
+ sys.stderr.write("scons: *** [%s] %s\n" % (e.node, e.errstr))
raise
def executed(self):