summaryrefslogtreecommitdiffstats
path: root/src/engine/SCons/Node/FS.py
diff options
context:
space:
mode:
authorSteven Knight <knight@baldmt.com>2005-03-05 02:08:10 (GMT)
committerSteven Knight <knight@baldmt.com>2005-03-05 02:08:10 (GMT)
commit93f3f5bfacb423243a4f8a1ab2d55a0452d51db5 (patch)
treefa680d14d84f234f2407d87d7ea608d1eacc767f /src/engine/SCons/Node/FS.py
parent213996506374ad40fc7ee4949e2be3790ead99d9 (diff)
downloadSCons-93f3f5bfacb423243a4f8a1ab2d55a0452d51db5.zip
SCons-93f3f5bfacb423243a4f8a1ab2d55a0452d51db5.tar.gz
SCons-93f3f5bfacb423243a4f8a1ab2d55a0452d51db5.tar.bz2
Eliminate find_file() inefficiency.
Diffstat (limited to 'src/engine/SCons/Node/FS.py')
-rw-r--r--src/engine/SCons/Node/FS.py85
1 files changed, 48 insertions, 37 deletions
diff --git a/src/engine/SCons/Node/FS.py b/src/engine/SCons/Node/FS.py
index 52f19f5..df974de 100644
--- a/src/engine/SCons/Node/FS.py
+++ b/src/engine/SCons/Node/FS.py
@@ -1410,24 +1410,59 @@ class Dir(Base):
sccspath = 'SCCS' + os.sep + 's.'+name
return self.entry_exists_on_disk(sccspath)
- def srcdir_duplicate(self, name, clazz):
- dname = '.'
+ def srcdir_list(self):
+ """__cacheable__"""
+ result = []
+
+ dirname = '.'
dir = self
while dir:
if dir.srcdir:
- srcdir = dir.srcdir.Dir(dname)
- if srcdir.entry_exists_on_disk(name):
- srcnode = self.fs._doLookup(clazz, name, srcdir)
- if self.duplicate:
- node = self.fs._doLookup(clazz, name, self)
- node.do_duplicate(srcnode)
- return node
- else:
- return srcnode
- dname = dir.name + os.sep + dname
+ d = dir.srcdir.Dir(dirname)
+ if d.is_under(dir):
+ # Shouldn't source from something in the build path:
+ # build_dir is probably under src_dir, in which case
+ # we are reflecting.
+ break
+ result.append(d)
+ dirname = dir.name + os.sep + dirname
dir = dir.get_dir()
+
+ return result
+
+ def srcdir_duplicate(self, name, clazz):
+ for dir in self.srcdir_list():
+ if dir.entry_exists_on_disk(name):
+ srcnode = self.fs._doLookup(clazz, name, dir)
+ if self.duplicate:
+ node = self.fs._doLookup(clazz, name, self)
+ node.do_duplicate(srcnode)
+ return node
+ else:
+ return srcnode
return None
+ def srcdir_find_file(self, filename):
+ """__cacheable__"""
+ fs = self.fs
+ do_Rsearch = fs.do_Rsearch
+
+ def func(node):
+ if isinstance(node, SCons.Node.FS.File) and \
+ (node.is_derived() or node.is_pseudo_derived() or node.exists()):
+ return node
+ return None
+
+ node, d = do_Rsearch(filename, self, func, File)
+ if node:
+ return node, d
+
+ for dir in self.srcdir_list():
+ node, d = do_Rsearch(filename, dir, func, File)
+ if node:
+ return File(filename, self, fs), d
+ return None, None
+
def node_on_disk(self, name, clazz):
if self.entry_exists_on_disk(name) or \
self.sccs_on_disk(name) or \
@@ -1888,36 +1923,12 @@ def find_file(filename, paths, verbose=None):
return None
paths = filter(None, map(filedir_lookup, paths))
- def func(node):
- if isinstance(node, SCons.Node.FS.File) and \
- (node.is_derived() or node.is_pseudo_derived() or node.exists()):
- return node
- return None
-
for dir in paths:
verbose("looking for '%s' in '%s' ...\n" % (filename, dir))
-
- node, d = default_fs.do_Rsearch(filename, dir, func, File)
+ node, d = dir.srcdir_find_file(filename)
if node:
verbose("... FOUND '%s' in '%s'\n" % (filename, d))
return node
-
- dirname = '.'
- while dir:
- if dir.srcdir:
- d = dir.srcdir.Dir(dirname)
- if d.is_under(dir):
- # Shouldn't source from something in the build path:
- # build_dir is probably under src_dir, in which case
- # we are reflecting.
- break
- node, d = dir.fs.do_Rsearch(filename, d, func, File)
- if node:
- verbose("... FOUND '%s' in '%s'\n" % (filename, d))
- return File(filename, dir.Dir(dirname), dir.fs)
- dirname = dir.name + os.sep + dirname
- dir = dir.get_dir()
-
return None
def find_files(filenames, paths):