diff options
| author | Steven Knight <knight@baldmt.com> | 2002-03-12 15:57:38 (GMT) |
|---|---|---|
| committer | Steven Knight <knight@baldmt.com> | 2002-03-12 15:57:38 (GMT) |
| commit | 136f9a0b1742fb37db047d923dccacb2f5d5f9ad (patch) | |
| tree | 7bb5a28dba1de85fd47718d0e048a7aa706548c3 /src/engine/SCons/Node | |
| parent | 815fd42ff563da2b188200db897edd809905df8d (diff) | |
| download | SCons-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.py | 51 | ||||
| -rw-r--r-- | src/engine/SCons/Node/FSTests.py | 19 |
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) |
