Support Repository and Default().
authorstevenknight <stevenknight@fdb21ef1-2011-0410-befe-b5e4ea1792b1>
Tue, 6 Aug 2002 03:15:21 +0000 (03:15 +0000)
committerstevenknight <stevenknight@fdb21ef1-2011-0410-befe-b5e4ea1792b1>
Tue, 6 Aug 2002 03:15:21 +0000 (03:15 +0000)
git-svn-id: http://scons.tigris.org/svn/scons/trunk@430 fdb21ef1-2011-0410-befe-b5e4ea1792b1

src/engine/SCons/Action.py
src/engine/SCons/Environment.py
src/engine/SCons/Node/Alias.py
src/engine/SCons/Node/FS.py
src/engine/SCons/Node/NodeTests.py
src/engine/SCons/Node/__init__.py
test/Repository/Default.py [new file with mode: 0644]

index 2a07fceb8722cb8ae2166107715b85dbe0390f2d..e2fe07f0fa4a755e4ed5b4275d4244c832172536 100644 (file)
@@ -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)
index 99eff2e26767fdae11543f462992b111e64c5b9e..fea60c3fdca0bb1f1e8bc97825f2d6efbc1cd62b 100644 (file)
@@ -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):
index 73fd706f919c263fef28a7cf2b7f81f5cb6093f1..276750f2ca3c7ccbdb630b397faadaf325dd75e3 100644 (file)
@@ -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)
index d756276057b745b4cd662264ed408a8403d67e8a..8bdfeb65b23ffb031fb9a80a1e1a1a382a1f19f7 100644 (file)
@@ -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."
index 963fffe0ee9c8e7daa800ae4559a44c07bdec436..31c4ee615ad18f02355849839b1d18a6fb4069ec 100644 (file)
@@ -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__":
index 3054d5e38b204dec013e0ccf1002abd906214e07..d12edaeb952f095c135b518ec497b650fe7b456b 100644 (file)
@@ -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 (file)
index 0000000..e531c4e
--- /dev/null
@@ -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()