summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSteven Knight <knight@baldmt.com>2002-08-19 00:03:07 (GMT)
committerSteven Knight <knight@baldmt.com>2002-08-19 00:03:07 (GMT)
commit936f9896cc189747ace62a948d91324c7cec2b47 (patch)
treee031b29ee26af54b9486e93037788bb12329ee71
parentd9311bfd9cb3557263a8c9698bed7e50496c56d4 (diff)
downloadSCons-936f9896cc189747ace62a948d91324c7cec2b47.zip
SCons-936f9896cc189747ace62a948d91324c7cec2b47.tar.gz
SCons-936f9896cc189747ace62a948d91324c7cec2b47.tar.bz2
Cache exists() and rexists() values all the time.
-rw-r--r--src/engine/SCons/Node/FS.py109
-rw-r--r--src/engine/SCons/Node/FSTests.py18
2 files changed, 74 insertions, 53 deletions
diff --git a/src/engine/SCons/Node/FS.py b/src/engine/SCons/Node/FS.py
index 157f984..77e8c9e 100644
--- a/src/engine/SCons/Node/FS.py
+++ b/src/engine/SCons/Node/FS.py
@@ -429,17 +429,14 @@ class Entry(SCons.Node.Node):
raise AttributeError
def exists(self):
- return os.path.exists(str(self))
-
- def cached_exists(self):
- try:
- return self.exists_flag
- except AttributeError:
- self.exists_flag = self.exists()
- return self.exists_flag
+ if not hasattr(self, '_exists'):
+ self._exists = os.path.exists(str(self))
+ return self._exists
def rexists(self):
- return os.path.exists(self.rstr())
+ if not hasattr(self, '_rexists'):
+ self._rexists = os.path.exists(self.rstr())
+ return self._rexists
def get_parents(self):
parents = SCons.Node.Node.get_parents(self)
@@ -596,12 +593,16 @@ class Dir(Entry):
def exists(self):
# Again, directories are special...we don't care if their
# source path exists, we only care about the path.
- return os.path.exists(self.path)
+ if not hasattr(self, '_exists'):
+ self._exists = os.path.exists(self.path)
+ return self._exists
def rexists(self):
# Again, directories are special...we don't care if their
# source path exists, we only care about the path.
- return os.path.exists(self.rstr())
+ if not hasattr(self, '_rexists'):
+ self._rexists = os.path.exists(self.rstr())
+ return self._rexists
@@ -692,46 +693,53 @@ class File(Entry):
return []
def exists(self):
- if self.duplicate and not self.created:
- self.created = 1
- if self.srcpath != self.path and \
- os.path.exists(self.srcpath):
- if os.path.exists(self.path):
- os.unlink(self.path)
- self.__createDir()
- file_link(self.srcpath, self.path)
- return Entry.exists(self)
-
- def rexists(self):
- if self.path != self.srcpath:
- if os.path.exists(self.srcpath):
- if self.duplicate and not self.created:
- self.created = 1
+ if not hasattr(self, '_exists'):
+ if self.duplicate and not self.created:
+ self.created = 1
+ if self.srcpath != self.path and \
+ os.path.exists(self.srcpath):
if os.path.exists(self.path):
os.unlink(self.path)
self.__createDir()
file_link(self.srcpath, self.path)
- return 1
- for rep in self.fs.Repositories:
- if not os.path.isabs(self.path):
- f = os.path.join(rep.path, self.path)
- if os.path.exists(f):
- return 1
- f = os.path.join(rep.path, self.srcpath)
- if os.path.exists(f):
+ self._exists = os.path.exists(str(self))
+ return self._exists
+
+ def rexists(self):
+ if not hasattr(self, '_rexists'):
+ if self.path != self.srcpath:
+ if os.path.exists(self.srcpath):
if self.duplicate and not self.created:
self.created = 1
if os.path.exists(self.path):
os.unlink(self.path)
self.__createDir()
- file_link(f, self.path)
- else:
- self.srcpath = f
- self.srcpath_ = f + os.sep
- return 1
- return None
- else:
- return Entry.rexists(self)
+ file_link(self.srcpath, self.path)
+ self._rexists = 1
+ return self._rexists
+ for rep in self.fs.Repositories:
+ if not os.path.isabs(self.path):
+ f = os.path.join(rep.path, self.path)
+ if os.path.exists(f):
+ self._rexists = 1
+ return self._rexists
+ f = os.path.join(rep.path, self.srcpath)
+ if os.path.exists(f):
+ if self.duplicate and not self.created:
+ self.created = 1
+ if os.path.exists(self.path):
+ os.unlink(self.path)
+ self.__createDir()
+ file_link(f, self.path)
+ else:
+ self.srcpath = f
+ self.srcpath_ = f + os.sep
+ self._rexists = 1
+ return self._rexists
+ self._rexists = None
+ else:
+ self._rexists = Entry.rexists(self)
+ return self._rexists
def scanner_key(self):
return os.path.splitext(self.name)[1]
@@ -743,7 +751,7 @@ class File(Entry):
listDirs = []
parent=self.dir
while parent:
- if parent.cached_exists():
+ if parent.exists():
break
listDirs.append(parent)
parent = parent.up()
@@ -751,19 +759,24 @@ class File(Entry):
for dirnode in listDirs:
try:
os.mkdir(dirnode.abspath)
- dirnode.exists_flag = 1
+ dirnode._exists = 1
except OSError:
pass
- def build(self):
- Entry.build(self)
- self.exists_flag = self.exists()
+ def built(self):
+ SCons.Node.Node.built(self)
+ if hasattr(self, '_exists'):
+ delattr(self, '_exists')
+ if hasattr(self, '_rexists'):
+ delattr(self, '_rexists')
def prepare(self):
"""Prepare for this file to be created."""
if self.exists():
if not self.precious:
os.unlink(self.path)
+ if hasattr(self, '_exists'):
+ delattr(self, '_exists')
else:
self.__createDir()
@@ -831,7 +844,7 @@ def find_file(filename, paths, node_factory = default_fs.File):
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()):
+ (isinstance(node, SCons.Node.FS.Entry) and node.exists()):
retval = node
break
except TypeError:
diff --git a/src/engine/SCons/Node/FSTests.py b/src/engine/SCons/Node/FSTests.py
index f9f1c9e..24a508b 100644
--- a/src/engine/SCons/Node/FSTests.py
+++ b/src/engine/SCons/Node/FSTests.py
@@ -133,11 +133,19 @@ class BuildDirTestCase(unittest.TestCase):
test.subdir('src')
test.write(['src', 'test'], "src/test\n")
test.write(['src', 'test'], "src/test.out\n")
- assert f1.exists()
+
+ assert not f1.exists()
assert not f1out.exists()
assert not f2.exists()
assert not f2out.exists()
+ f1.built()
+ f2.built()
+
+ assert f1.exists()
+ assert not f1out.exists()
+ assert not f2.exists()
+ assert not f2out.exists()
d1 = fs.Dir('build/var1')
d2 = fs.Dir('build/var2')
@@ -453,13 +461,13 @@ class FSTestCase(unittest.TestCase):
f1 = fs.File(test.workpath("do_i_exist"))
assert not f1.exists()
test.write("do_i_exist","\n")
+ assert not f1.exists()
+ f1.built()
assert f1.exists()
- assert f1.cached_exists()
test.unlink("do_i_exist")
+ assert f1.exists()
+ f1.built()
assert not f1.exists()
- assert f1.cached_exists()
- f1.build()
- assert not f1.cached_exists()
# For some reason, in Win32, the \x1a character terminates
# the reading of files in text mode. This tests that