summaryrefslogtreecommitdiffstats
path: root/src/engine/SCons/Node
diff options
context:
space:
mode:
authorSteven Knight <knight@baldmt.com>2001-10-10 21:50:55 (GMT)
committerSteven Knight <knight@baldmt.com>2001-10-10 21:50:55 (GMT)
commit385aabf686d687432fb81fa2e68b77e3f11f06f8 (patch)
tree319adfb4dc23d8c7b1e55fb2e691898d8b544481 /src/engine/SCons/Node
parentf72203b4610a100fce3065f5c5c4c41e92fc5883 (diff)
downloadSCons-385aabf686d687432fb81fa2e68b77e3f11f06f8.zip
SCons-385aabf686d687432fb81fa2e68b77e3f11f06f8.tar.gz
SCons-385aabf686d687432fb81fa2e68b77e3f11f06f8.tar.bz2
Add -i (ignore errors) support
Diffstat (limited to 'src/engine/SCons/Node')
-rw-r--r--src/engine/SCons/Node/NodeTests.py10
-rw-r--r--src/engine/SCons/Node/__init__.py50
2 files changed, 34 insertions, 26 deletions
diff --git a/src/engine/SCons/Node/NodeTests.py b/src/engine/SCons/Node/NodeTests.py
index 7dfa23e..febb95a 100644
--- a/src/engine/SCons/Node/NodeTests.py
+++ b/src/engine/SCons/Node/NodeTests.py
@@ -157,6 +157,14 @@ class NodeTestCase(unittest.TestCase):
kids.sort()
assert kids == ['five', 'four', 'one', 'six', 'three', 'two']
+ def test_state(self):
+ """Test setting and getting the state of a node
+ """
+ node = SCons.Node.Node()
+ assert node.get_state() == None
+ node.set_state(SCons.Node.executing)
+ assert node.get_state() == SCons.Node.executing
+
def test_walker(self):
"""Test walking a Node tree.
"""
@@ -169,7 +177,9 @@ class NodeTestCase(unittest.TestCase):
n1 = MyNode("n1")
nw = SCons.Node.Walker(n1)
+ assert not nw.is_done()
assert nw.next().name == "n1"
+ assert nw.is_done()
assert nw.next() == None
n2 = MyNode("n2")
diff --git a/src/engine/SCons/Node/__init__.py b/src/engine/SCons/Node/__init__.py
index b6922dc..c0346cc 100644
--- a/src/engine/SCons/Node/__init__.py
+++ b/src/engine/SCons/Node/__init__.py
@@ -34,6 +34,13 @@ __revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
from SCons.Errors import BuildError
import string
import types
+import copy
+
+# Node states:
+executing = 1
+executed = 2
+up_to_date = 3
+failed = 4
class Node:
@@ -46,6 +53,7 @@ class Node:
self.depends = []
self.derived = 0
self.env = None
+ self.state = None
def build(self):
if not hasattr(self, "builder"):
@@ -87,26 +95,27 @@ class Node:
def children(self):
return self.sources + self.depends
+ def set_state(self, state):
+ self.state = state
-
+ def get_state(self):
+ return self.state
class Wrapper:
def __init__(self, node):
self.node = node
- self.kids = node.children()
+ self.kids = copy.copy(node.children())
# XXX randomize kids here, if requested
class Walker:
"""An iterator for walking a Node tree.
-
+
This is depth-first, children are visited before the parent.
- The Walker object can be initialized with any node, and
+ The Walker object can be initialized with any node, and
returns the next node on the descent with each next() call.
"""
def __init__(self, node):
- self.current = Wrapper(node)
- self.stack = []
- self.top = self.current
+ self.stack = [Wrapper(node)]
def next(self):
"""Return the next node for this walk of the tree.
@@ -114,23 +123,12 @@ class Walker:
This function is intentionally iterative, not recursive,
to sidestep any issues of stack size limitations.
"""
- if not self.current:
- return None
- while 1:
- if self.current.kids:
- k = Wrapper(self.current.kids[0])
- self.current.kids = self.current.kids[1:]
- if k.kids:
- self.stack.append(self.current)
- self.current = k
- else:
- return k.node
- else:
- n = self.current.node
- if self.stack:
- self.current = self.stack[-1]
- self.stack = self.stack[0:-1]
- else:
- self.current = None
- return n
+ while self.stack:
+ if self.stack[-1].kids:
+ self.stack.append(Wrapper(self.stack[-1].kids.pop(0)))
+ else:
+ return self.stack.pop().node
+
+ def is_done(self):
+ return not self.stack