summaryrefslogtreecommitdiffstats
path: root/src/engine/SCons/Node
diff options
context:
space:
mode:
authorSteven Knight <knight@baldmt.com>2002-03-12 15:57:38 (GMT)
committerSteven Knight <knight@baldmt.com>2002-03-12 15:57:38 (GMT)
commit136f9a0b1742fb37db047d923dccacb2f5d5f9ad (patch)
tree7bb5a28dba1de85fd47718d0e048a7aa706548c3 /src/engine/SCons/Node
parent815fd42ff563da2b188200db897edd809905df8d (diff)
downloadSCons-136f9a0b1742fb37db047d923dccacb2f5d5f9ad.zip
SCons-136f9a0b1742fb37db047d923dccacb2f5d5f9ad.tar.gz
SCons-136f9a0b1742fb37db047d923dccacb2f5d5f9ad.tar.bz2
Move find_file() and find_files() from SCons.Util to SCons.Node.FS.
Diffstat (limited to 'src/engine/SCons/Node')
-rw-r--r--src/engine/SCons/Node/FS.py51
-rw-r--r--src/engine/SCons/Node/FSTests.py19
2 files changed, 70 insertions, 0 deletions
diff --git a/src/engine/SCons/Node/FS.py b/src/engine/SCons/Node/FS.py
index 3167005..f7e1f44 100644
--- a/src/engine/SCons/Node/FS.py
+++ b/src/engine/SCons/Node/FS.py
@@ -573,5 +573,56 @@ class File(Entry):
else:
self.__createDir()
+
default_fs = FS()
+
+def find_file(filename, paths, node_factory = default_fs.File):
+ """
+ find_file(str, [Dir()]) -> [nodes]
+
+ filename - a filename to find
+ paths - a list of directory path *nodes* to search in
+
+ returns - the node created from the found file.
+
+ Find a node corresponding to either a derived file or a file
+ that exists already.
+
+ Only the first file found is returned, and none is returned
+ if no file is found.
+ """
+ retval = None
+ for dir in paths:
+ try:
+ node = node_factory(filename, dir)
+ # Return true of the node exists or is a derived node.
+ if node.builder or \
+ (isinstance(node, SCons.Node.FS.Entry) and node.cached_exists()):
+ retval = node
+ break
+ except TypeError:
+ # If we find a directory instead of a file, we don't care
+ pass
+
+ return retval
+
+def find_files(filenames, paths, node_factory = default_fs.File):
+ """
+ find_files([str], [Dir()]) -> [nodes]
+
+ filenames - a list of filenames to find
+ paths - a list of directory path *nodes* to search in
+
+ returns - the nodes created from the found files.
+
+ Finds nodes corresponding to either derived files or files
+ that exist already.
+
+ Only the first file found is returned for each filename,
+ and any files that aren't found are ignored.
+ """
+ nodes = map(lambda x, paths=paths, node_factory=node_factory:
+ find_file(x, paths, node_factory),
+ filenames)
+ return filter(lambda x: x != None, nodes)
diff --git a/src/engine/SCons/Node/FSTests.py b/src/engine/SCons/Node/FSTests.py
index 94f81fd..b132b12 100644
--- a/src/engine/SCons/Node/FSTests.py
+++ b/src/engine/SCons/Node/FSTests.py
@@ -469,10 +469,29 @@ class FSTestCase(unittest.TestCase):
#XXX test get_prevsiginfo()
+class find_fileTestCase(unittest.TestCase):
+ def runTest(self):
+ """Testing find_file function"""
+ test = TestCmd(workdir = '')
+ test.write('./foo', 'Some file\n')
+ fs = SCons.Node.FS.FS(test.workpath(""))
+ os.chdir(test.workpath("")) # FS doesn't like the cwd to be something other than it's root
+ node_derived = fs.File(test.workpath('bar/baz'))
+ node_derived.builder_set(1) # Any non-zero value.
+ paths = map(fs.Dir, ['.', './bar'])
+ nodes = [SCons.Node.FS.find_file('foo', paths, fs.File),
+ SCons.Node.FS.find_file('baz', paths, fs.File)]
+ file_names = map(str, nodes)
+ file_names = map(os.path.normpath, file_names)
+ assert os.path.normpath('./foo') in file_names, file_names
+ assert os.path.normpath('./bar/baz') in file_names, file_names
+
+
if __name__ == "__main__":
suite = unittest.TestSuite()
suite.addTest(FSTestCase())
suite.addTest(BuildDirTestCase())
+ suite.addTest(find_fileTestCase())
if not unittest.TextTestRunner().run(suite).wasSuccessful():
sys.exit(1)