summaryrefslogtreecommitdiffstats
path: root/src/engine/SCons/Script/Main.py
diff options
context:
space:
mode:
authorSteven Knight <knight@baldmt.com>2005-08-20 23:10:35 (GMT)
committerSteven Knight <knight@baldmt.com>2005-08-20 23:10:35 (GMT)
commitc5f5ba58f1c8b4927ee22e3781a19c334352aa45 (patch)
tree0f8aba7fb052a1dfc6efa91287951f007a752892 /src/engine/SCons/Script/Main.py
parentcfcbeb6ff0607e5a573768eb1dbaef6fe86089a2 (diff)
downloadSCons-c5f5ba58f1c8b4927ee22e3781a19c334352aa45.zip
SCons-c5f5ba58f1c8b4927ee22e3781a19c334352aa45.tar.gz
SCons-c5f5ba58f1c8b4927ee22e3781a19c334352aa45.tar.bz2
Handle IOError exceptions when pushing files to CacheDir (and elsewhere).
Diffstat (limited to 'src/engine/SCons/Script/Main.py')
-rw-r--r--src/engine/SCons/Script/Main.py38
1 files changed, 36 insertions, 2 deletions
diff --git a/src/engine/SCons/Script/Main.py b/src/engine/SCons/Script/Main.py
index e5a8cb2..67b3308 100644
--- a/src/engine/SCons/Script/Main.py
+++ b/src/engine/SCons/Script/Main.py
@@ -190,6 +190,35 @@ class BuildTask(SCons.Taskmaster.Task):
class CleanTask(SCons.Taskmaster.Task):
"""An SCons clean task."""
+ def dir_index(self, directory):
+ dirname = lambda f, d=directory: os.path.join(d, f)
+ files = map(dirname, os.listdir(directory))
+
+ # os.listdir() isn't guaranteed to return files in any specific order,
+ # but some of the test code expects sorted output.
+ files.sort()
+ return files
+
+ def fs_delete(self, path, remove=1):
+ try:
+ if os.path.exists(path):
+ if os.path.isfile(path):
+ if remove: os.unlink(path)
+ display("Removed " + path)
+ elif os.path.isdir(path) and not os.path.islink(path):
+ # delete everything in the dir
+ for p in self.dir_index(path):
+ if os.path.isfile(p):
+ if remove: os.unlink(p)
+ display("Removed " + p)
+ else:
+ self.fs_delete(p, remove)
+ # then delete dir itself
+ if remove: os.rmdir(path)
+ display("Removed directory " + path)
+ except (IOError, OSError), e:
+ print "scons: Could not remove '%s':" % str(path), e.strerror
+
def show(self):
target = self.targets[0]
if (target.has_builder() or target.side_effect) and not target.isdir():
@@ -197,7 +226,7 @@ class CleanTask(SCons.Taskmaster.Task):
if SCons.Environment.CleanTargets.has_key(target):
files = SCons.Environment.CleanTargets[target]
for f in files:
- SCons.Util.fs_delete(str(f), 0)
+ self.fs_delete(str(f), 0)
def remove(self):
target = self.targets[0]
@@ -206,6 +235,11 @@ class CleanTask(SCons.Taskmaster.Task):
try:
removed = t.remove()
except OSError, e:
+ # An OSError may indicate something like a permissions
+ # issue, an IOError would indicate something like
+ # the file not existing. In either case, print a
+ # message and keep going to try to remove as many
+ # targets aa possible.
print "scons: Could not remove '%s':" % str(t), e.strerror
else:
if removed:
@@ -213,7 +247,7 @@ class CleanTask(SCons.Taskmaster.Task):
if SCons.Environment.CleanTargets.has_key(target):
files = SCons.Environment.CleanTargets[target]
for f in files:
- SCons.Util.fs_delete(str(f))
+ self.fs_delete(str(f))
execute = remove