summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSteven Knight <knight@baldmt.com>2002-08-06 03:15:21 (GMT)
committerSteven Knight <knight@baldmt.com>2002-08-06 03:15:21 (GMT)
commit59ec4b2e4ca1579c703093d0f87a7c5ecde8633c (patch)
tree2394ab9dbeda4c515b700745631a041384e09ffa
parent71600f7a97bc30494ecfbd9afd4b4df43381f57e (diff)
downloadSCons-59ec4b2e4ca1579c703093d0f87a7c5ecde8633c.zip
SCons-59ec4b2e4ca1579c703093d0f87a7c5ecde8633c.tar.gz
SCons-59ec4b2e4ca1579c703093d0f87a7c5ecde8633c.tar.bz2
Support Repository and Default().
-rw-r--r--src/engine/SCons/Action.py12
-rw-r--r--src/engine/SCons/Environment.py4
-rw-r--r--src/engine/SCons/Node/Alias.py1
-rw-r--r--src/engine/SCons/Node/FS.py1
-rw-r--r--src/engine/SCons/Node/NodeTests.py86
-rw-r--r--src/engine/SCons/Node/__init__.py5
-rw-r--r--test/Repository/Default.py100
7 files changed, 111 insertions, 98 deletions
diff --git a/src/engine/SCons/Action.py b/src/engine/SCons/Action.py
index 2a07fce..e2fe07f 100644
--- a/src/engine/SCons/Action.py
+++ b/src/engine/SCons/Action.py
@@ -462,9 +462,15 @@ class FunctionAction(ActionBase):
if kw.has_key('target') and not \
SCons.Util.is_List(kw['target']):
kw['target'] = [ kw['target'] ]
- if kw.has_key('source') and not \
- SCons.Util.is_List(kw['source']):
- kw['source'] = [ kw['source'] ]
+ if kw.has_key('source'):
+ def rfile(n):
+ try:
+ return n.rfile()
+ except AttributeError:
+ return n
+ if not SCons.Util.is_List(kw['source']):
+ kw['source'] = [ kw['source'] ]
+ kw['source'] = map(rfile, kw['source'])
if kw.has_key("env") and not isinstance(kw["env"], EnvDictProxy):
kw["env"] = EnvDictProxy(kw["env"])
return apply(self.function, (), kw)
diff --git a/src/engine/SCons/Environment.py b/src/engine/SCons/Environment.py
index 99eff2e..fea60c3 100644
--- a/src/engine/SCons/Environment.py
+++ b/src/engine/SCons/Environment.py
@@ -334,7 +334,7 @@ class Environment:
def Install(self, dir, source):
"""Install specified files in the given directory."""
- sources = SCons.Node.arg2Rnodes(source, self.fs.File)
+ sources = SCons.Node.arg2nodes(source, self.fs.File)
dnodes = SCons.Node.arg2nodes(dir, self.fs.Dir)
tgt = []
for dnode in dnodes:
@@ -347,7 +347,7 @@ class Environment:
def InstallAs(self, target, source):
"""Install sources as targets."""
- sources = SCons.Node.arg2Rnodes(source, self.fs.File)
+ sources = SCons.Node.arg2nodes(source, self.fs.File)
targets = SCons.Node.arg2nodes(target, self.fs.File)
ret = []
for src, tgt in map(lambda x, y: (x, y), sources, targets):
diff --git a/src/engine/SCons/Node/Alias.py b/src/engine/SCons/Node/Alias.py
index 73fd706..276750f 100644
--- a/src/engine/SCons/Node/Alias.py
+++ b/src/engine/SCons/Node/Alias.py
@@ -99,4 +99,3 @@ class Alias(SCons.Node.Node):
default_ans = AliasNameSpace()
SCons.Node.arg2nodes_lookups.append(default_ans.lookup)
-SCons.Node.arg2Rnodes_lookups.append(default_ans.lookup)
diff --git a/src/engine/SCons/Node/FS.py b/src/engine/SCons/Node/FS.py
index d756276..8bdfeb6 100644
--- a/src/engine/SCons/Node/FS.py
+++ b/src/engine/SCons/Node/FS.py
@@ -109,7 +109,6 @@ class FS:
self.Root = {}
self.Top = None
self.Repositories = []
- SCons.Node.arg2Rnodes_lookups.append(self.Rsearch)
def set_toplevel_dir(self, path):
assert not self.Top, "You can only set the top-level path on an FS object that has not had its File, Dir, or Entry methods called yet."
diff --git a/src/engine/SCons/Node/NodeTests.py b/src/engine/SCons/Node/NodeTests.py
index 963fffe..31c4ee6 100644
--- a/src/engine/SCons/Node/NodeTests.py
+++ b/src/engine/SCons/Node/NodeTests.py
@@ -683,92 +683,6 @@ class NodeTestCase(unittest.TestCase):
assert not hasattr(nodes[1], 'bbbb'), nodes[0]
assert nodes[1].c == 1, nodes[1]
- def test_arg2Rnodes(self):
- """Test the arg2Rnodes function."""
- dict = {}
- class X(SCons.Node.Node):
- pass
- def Factory(name, directory = None, create = 1, dict=dict, X=X):
- if not dict.has_key(name):
- dict[name] = X()
- dict[name].name = name
- return dict[name]
-
- nodes = SCons.Node.arg2Rnodes("Util.py UtilTests.py", Factory)
- assert len(nodes) == 1, nodes
- assert isinstance(nodes[0], X)
- assert nodes[0].name == "Util.py UtilTests.py"
-
- if hasattr(types, 'UnicodeType'):
- code = """if 1:
- nodes = SCons.Node.arg2Rnodes(u"Util.py UtilTests.py", Factory)
- assert len(nodes) == 1, nodes
- assert isinstance(nodes[0], X)
- assert nodes[0].name == u"Util.py UtilTests.py"
- \n"""
- exec code in globals(), locals()
-
- nodes = SCons.Node.arg2Rnodes(["Util.py", "UtilTests.py"], Factory)
- assert len(nodes) == 2, nodes
- assert isinstance(nodes[0], X)
- assert isinstance(nodes[1], X)
- assert nodes[0].name == "Util.py"
- assert nodes[1].name == "UtilTests.py"
-
- n1 = Factory("Util.py")
- nodes = SCons.Node.arg2Rnodes([n1, "UtilTests.py"], Factory)
- assert len(nodes) == 2, nodes
- assert isinstance(nodes[0], X)
- assert isinstance(nodes[1], X)
- assert nodes[0].name == "Util.py"
- assert nodes[1].name == "UtilTests.py"
-
- class SConsNode(SCons.Node.Node):
- pass
- nodes = SCons.Node.arg2Rnodes(SConsNode())
- assert len(nodes) == 1, nodes
- assert isinstance(nodes[0], SConsNode), node
-
- class OtherNode:
- pass
- nodes = SCons.Node.arg2Rnodes(OtherNode())
- assert len(nodes) == 1, nodes
- assert isinstance(nodes[0], OtherNode), node
-
- def lookup_a(str, F=Factory):
- if str[0] == 'a':
- n = F(str)
- n.a = 1
- return n
- else:
- return None
-
- def lookup_b(str, F=Factory):
- if str[0] == 'b':
- n = F(str)
- n.b = 1
- return n
- else:
- return None
-
- SCons.Node.arg2Rnodes_lookups.append(lookup_a)
- SCons.Node.arg2Rnodes_lookups.append(lookup_b)
-
- nodes = SCons.Node.arg2Rnodes(['aaa', 'bbb', 'ccc'], Factory)
- assert len(nodes) == 3, nodes
-
- assert nodes[0].name == 'aaa', nodes[0]
- assert nodes[0].a == 1, nodes[0]
- assert not hasattr(nodes[0], 'b'), nodes[0]
-
- assert nodes[1].name == 'bbb'
- assert not hasattr(nodes[1], 'a'), nodes[1]
- assert nodes[1].b == 1, nodes[1]
-
- assert nodes[2].name == 'ccc'
- assert not hasattr(nodes[2], 'a'), nodes[1]
- assert not hasattr(nodes[2], 'b'), nodes[1]
-
if __name__ == "__main__":
diff --git a/src/engine/SCons/Node/__init__.py b/src/engine/SCons/Node/__init__.py
index 3054d5e..d12edae 100644
--- a/src/engine/SCons/Node/__init__.py
+++ b/src/engine/SCons/Node/__init__.py
@@ -465,8 +465,6 @@ class Walker:
arg2nodes_lookups = []
-arg2Rnodes_lookups = []
-
def arg2nodes(args, node_factory=None, lookup_list=arg2nodes_lookups):
"""This function converts a string or list into a list of Node
instances. It accepts the following inputs:
@@ -504,6 +502,3 @@ def arg2nodes(args, node_factory=None, lookup_list=arg2nodes_lookups):
nodes.append(v)
return nodes
-
-def arg2Rnodes(args, node_factory=None):
- return arg2nodes(args, node_factory, arg2Rnodes_lookups)
diff --git a/test/Repository/Default.py b/test/Repository/Default.py
new file mode 100644
index 0000000..e531c4e
--- /dev/null
+++ b/test/Repository/Default.py
@@ -0,0 +1,100 @@
+#!/usr/bin/env python
+#
+# Copyright (c) 2001, 2002 Steven Knight
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import os.path
+import sys
+import TestSCons
+
+test = TestSCons.TestSCons()
+
+test.subdir('repository', ['repository', 'subdir'], 'work')
+
+work_aaa_out = test.workpath('work', 'aaa.out')
+work_bbb_out = test.workpath('work', 'bbb.out')
+work_ccc_out = test.workpath('work', 'ccc.out')
+work_subdir_ddd_out = test.workpath('work', 'subdir', 'ddd.out')
+work_subdir_eee_out = test.workpath('work', 'subdir', 'eee.out')
+work_subdir_fff_out = test.workpath('work', 'subdir', 'fff.out')
+
+opts = "-Y " + test.workpath('repository')
+
+#
+test.write(['repository', 'SConstruct'], r"""
+def copy(env, source, target):
+ source = str(source[0])
+ target = str(target[0])
+ print 'copy() < %s > %s' % (source, target)
+ open(target, "wb").write(open(source, "rb").read())
+
+Build = Builder(action=copy)
+env = Environment(BUILDERS={'Build':Build})
+env.Build('aaa.out', 'aaa.in')
+env.Build('bbb.out', 'bbb.in')
+env.Build('ccc.out', 'ccc.in')
+Default('bbb.out')
+SConscript('subdir/SConscript', "env")
+""")
+
+test.write(['repository', 'subdir', 'SConscript'], r"""
+Import("env")
+Default('eee.out')
+env.Build('ddd.out', 'ddd.in')
+env.Build('eee.out', 'eee.in')
+env.Build('fff.out', 'fff.in')
+""")
+
+test.write(['repository', 'aaa.in'], "repository/aaa.in\n")
+test.write(['repository', 'bbb.in'], "repository/bbb.in\n")
+test.write(['repository', 'ccc.in'], "repository/ccc.in\n")
+test.write(['repository', 'subdir', 'ddd.in'], "repository/subdir/ddd.in\n")
+test.write(['repository', 'subdir', 'eee.in'], "repository/subdir/eee.in\n")
+test.write(['repository', 'subdir', 'fff.in'], "repository/subdir/fff.in\n")
+
+# Make the entire repository non-writable, so we'll detect
+# if we try to write into it accidentally.
+test.writable('repository', 0)
+
+test.run(chdir = 'work', options = opts, arguments = '')
+
+test.fail_test(os.path.exists(work_aaa_out))
+test.fail_test(test.read(work_bbb_out) != "repository/bbb.in\n")
+test.fail_test(os.path.exists(work_ccc_out))
+test.fail_test(os.path.exists(work_subdir_ddd_out))
+test.fail_test(test.read(work_subdir_eee_out) != "repository/subdir/eee.in\n")
+test.fail_test(os.path.exists(work_subdir_fff_out))
+
+#
+test.run(chdir = 'work', options = opts, arguments = '.')
+
+test.fail_test(test.read(work_aaa_out) != "repository/aaa.in\n")
+test.fail_test(test.read(work_ccc_out) != "repository/ccc.in\n")
+test.fail_test(test.read(work_subdir_ddd_out) != "repository/subdir/ddd.in\n")
+test.fail_test(test.read(work_subdir_fff_out) != "repository/subdir/fff.in\n")
+
+test.up_to_date(chdir = 'work', options = opts, arguments = '.')
+
+#
+test.pass_test()