summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSteven Knight <knight@baldmt.com>2002-04-25 10:28:24 (GMT)
committerSteven Knight <knight@baldmt.com>2002-04-25 10:28:24 (GMT)
commited580001466a51a8bb8cf16f15e858d02866fb88 (patch)
tree0bf25db6a6857703dc1ae6d2a87c292fde97f3e9
parent6238fcb0f5fb8cd4aef9d956414618dbe5aa4072 (diff)
downloadSCons-ed580001466a51a8bb8cf16f15e858d02866fb88.zip
SCons-ed580001466a51a8bb8cf16f15e858d02866fb88.tar.gz
SCons-ed580001466a51a8bb8cf16f15e858d02866fb88.tar.bz2
Don't create a directory Node when a file already exists there, and vice versa. (Chad Austin)
-rw-r--r--src/CHANGES.txt3
-rw-r--r--src/engine/SCons/Node/FS.py22
-rw-r--r--src/engine/SCons/Node/FSTests.py15
3 files changed, 40 insertions, 0 deletions
diff --git a/src/CHANGES.txt b/src/CHANGES.txt
index 67a0574..3bb532d 100644
--- a/src/CHANGES.txt
+++ b/src/CHANGES.txt
@@ -14,6 +14,9 @@ RELEASE 0.07 -
- Changes to build SCons packages on IRIX (and other *NIces).
+ - Don't create a directory Node when a file already exists there,
+ and vice versa.
+
From Charles Crain:
- Internal cleanup of environment passing to function Actions.
diff --git a/src/engine/SCons/Node/FS.py b/src/engine/SCons/Node/FS.py
index 861fbaf..d629d40 100644
--- a/src/engine/SCons/Node/FS.py
+++ b/src/engine/SCons/Node/FS.py
@@ -167,6 +167,7 @@ class FS:
path_comp = path_comp[1:]
else:
path_comp = [ path_first, ] + path_comp[1:]
+
# Lookup the directory
for path_name in path_comp[:-1]:
path_norm = _my_normcase(path_name)
@@ -176,6 +177,14 @@ class FS:
except KeyError:
if not create:
raise UserError
+
+ # look at the actual filesystem and make sure there isn't
+ # a file already there
+ path = os.path.join(str(directory), path_name)
+ if os.path.isfile(path):
+ raise TypeError, \
+ "File %s found where directory expected." % path
+
dir_temp = Dir(path_name, directory)
directory.entries[path_norm] = dir_temp
directory.add_wkid(dir_temp)
@@ -186,6 +195,19 @@ class FS:
except KeyError:
if not create:
raise UserError
+
+ # make sure we don't create File nodes when there is actually
+ # a directory at that path on the disk, and vice versa
+ path = os.path.join(str(directory), path_comp[-1])
+ if fsclass == File:
+ if os.path.isdir(path):
+ raise TypeError, \
+ "Directory %s found where file expected." % path
+ elif fsclass == Dir:
+ if os.path.isfile(path):
+ raise TypeError, \
+ "File %s found where directory expected." % path
+
ret = fsclass(path_comp[-1], directory)
directory.entries[file_name] = ret
directory.add_wkid(ret)
diff --git a/src/engine/SCons/Node/FSTests.py b/src/engine/SCons/Node/FSTests.py
index 0259deb..4cf3cb5 100644
--- a/src/engine/SCons/Node/FSTests.py
+++ b/src/engine/SCons/Node/FSTests.py
@@ -487,6 +487,21 @@ class FSTestCase(unittest.TestCase):
parents = f1.get_parents()
assert parents == [ d1 ], parents
+ test.write("i_am_not_a_directory", "\n")
+ exc_caught = 0
+ try:
+ fs.Dir(test.workpath("i_am_not_a_directory"))
+ except TypeError:
+ exc_caught = 1
+ assert exc_caught, "Should have caught a TypeError"
+ test.unlink("i_am_not_a_directory")
+
+ exc_caught = 0
+ try:
+ fs.File(sub_dir)
+ except TypeError:
+ exc_caught = 1
+ assert exc_caught, "Should have caught a TypeError"
class find_fileTestCase(unittest.TestCase):
def runTest(self):