Fix issue #1249 by making Mkdir action (actually mkdir_func) succeed if the underlyin...
authorgaryo <garyo@fdb21ef1-2011-0410-befe-b5e4ea1792b1>
Thu, 11 Dec 2008 02:59:40 +0000 (02:59 +0000)
committergaryo <garyo@fdb21ef1-2011-0410-befe-b5e4ea1792b1>
Thu, 11 Dec 2008 02:59:40 +0000 (02:59 +0000)
git-svn-id: http://scons.tigris.org/svn/scons/trunk@3823 fdb21ef1-2011-0410-befe-b5e4ea1792b1

src/engine/SCons/Defaults.py
src/engine/SCons/DefaultsTests.py [new file with mode: 0644]

index b790a49f7515d9d6a243fb014970ac2f524bef78..5d78215d001aff4fbf23a8a8ae01881ee9858bff 100644 (file)
@@ -38,6 +38,7 @@ __revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
 
 import os
 import os.path
+import errno
 import shutil
 import stat
 import string
@@ -220,7 +221,14 @@ def mkdir_func(dest):
     if not SCons.Util.is_List(dest):
         dest = [dest]
     for entry in dest:
-        os.makedirs(str(entry))
+        try:
+            os.makedirs(str(entry))
+        except os.error, e:
+            p = str(entry)
+            if e[0] == errno.EEXIST and os.path.isdir(str(entry)):
+                pass
+            else:
+                raise
 
 Mkdir = ActionFactory(mkdir_func,
                       lambda dir: 'Mkdir(%s)' % get_paths_str(dir))
diff --git a/src/engine/SCons/DefaultsTests.py b/src/engine/SCons/DefaultsTests.py
new file mode 100644 (file)
index 0000000..aec9e46
--- /dev/null
@@ -0,0 +1,88 @@
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import os
+import os.path
+import string
+import StringIO
+import sys
+import types
+import unittest
+
+from UserDict import UserDict
+
+import TestCmd
+
+import SCons.Errors
+
+from SCons.Defaults import *
+
+class DefaultsTestCase(unittest.TestCase):
+    def test_mkdir_func0(self):
+        test = TestCmd.TestCmd(workdir = '')
+        test.subdir('sub')
+        subdir2 = test.workpath('sub', 'dir1', 'dir2')
+        # Simple smoke test
+        mkdir_func(subdir2)
+        mkdir_func(subdir2)     # 2nd time should be OK too
+
+    def test_mkdir_func1(self):
+        test = TestCmd.TestCmd(workdir = '')
+        test.subdir('sub')
+        subdir1 = test.workpath('sub', 'dir1')
+        subdir2 = test.workpath('sub', 'dir1', 'dir2')
+        # No error if asked to create existing dir
+        os.makedirs(subdir2)
+        mkdir_func(subdir2)
+        mkdir_func(subdir1)
+
+    def test_mkdir_func2(self):
+        test = TestCmd.TestCmd(workdir = '')
+        test.subdir('sub')
+        subdir1 = test.workpath('sub', 'dir1')
+        subdir2 = test.workpath('sub', 'dir1', 'dir2')
+        file = test.workpath('sub', 'dir1', 'dir2', 'file')
+
+        # make sure it does error if asked to create a dir
+        # where there's already a file
+        os.makedirs(subdir2)
+        test.write(file, "test\n")
+        try:
+            mkdir_func(file)
+        except os.error, e:
+            pass
+        else:
+            fail("expected os.error")
+        
+
+if __name__ == "__main__":
+    suite = unittest.TestSuite()
+    tclasses = [ DefaultsTestCase,
+               ]
+    for tclass in tclasses:
+        names = unittest.getTestCaseNames(tclass, 'test_')
+        suite.addTests(map(tclass, names))
+    if not unittest.TextTestRunner().run(suite).wasSuccessful():
+        sys.exit(1)