From 4618fabde17038bd961f93ceb9af6b31e778540b Mon Sep 17 00:00:00 2001 From: Steven Knight Date: Tue, 21 Oct 2003 12:18:38 +0000 Subject: Better detection of KeyboardInterrupts. (Christoph Wiedemann) --- src/CHANGES.txt | 3 +++ src/engine/SCons/Action.py | 2 +- src/engine/SCons/Job.py | 3 +++ src/engine/SCons/Node/FS.py | 4 ++-- src/engine/SCons/Options.py | 2 ++ src/engine/SCons/Platform/win32.py | 12 ++++++++---- src/engine/SCons/SConf.py | 4 ++-- src/engine/SCons/Script/SConscript.py | 2 +- src/engine/SCons/Script/__init__.py | 4 +++- src/engine/SCons/Sig/__init__.py | 18 +++++++++++------- src/engine/SCons/Taskmaster.py | 6 ++++++ src/engine/SCons/Tool/hpc++.py | 2 +- src/engine/SCons/Tool/hplink.py | 2 +- src/engine/SCons/Tool/javah.py | 2 +- src/engine/SCons/Tool/msvc.py | 2 ++ src/engine/SCons/Tool/msvs.py | 10 ++++++++++ src/engine/SCons/Tool/rmic.py | 2 +- src/engine/SCons/Tool/sunlink.py | 2 +- src/engine/SCons/Util.py | 2 +- 19 files changed, 60 insertions(+), 24 deletions(-) diff --git a/src/CHANGES.txt b/src/CHANGES.txt index b779323..bb32ad8 100644 --- a/src/CHANGES.txt +++ b/src/CHANGES.txt @@ -175,6 +175,9 @@ RELEASE X.XX - XXX - Support calling a Builder when a Configure context is still open. + - Handle interrupts better by eliminating all try:-except: blocks + which caught any and all exceptions, including KeyboardInterrupt. + RELEASE 0.92 - Wed, 20 Aug 2003 03:45:28 -0500 diff --git a/src/engine/SCons/Action.py b/src/engine/SCons/Action.py index 633bb06..13409aa 100644 --- a/src/engine/SCons/Action.py +++ b/src/engine/SCons/Action.py @@ -388,7 +388,7 @@ class FunctionAction(ActionBase): try: # "self.execfunction" is a function. code = self.execfunction.func_code.co_code - except: + except AttributeError: # "self.execfunction" is a callable object. code = self.execfunction.__call__.im_func.func_code.co_code return str(code) + env.subst(string.join(map(lambda v: '${'+v+'}', diff --git a/src/engine/SCons/Job.py b/src/engine/SCons/Job.py index b5296dc..d26b73c 100644 --- a/src/engine/SCons/Job.py +++ b/src/engine/SCons/Job.py @@ -135,6 +135,9 @@ class Worker(threading.Thread): try: task.execute() + except KeyboardInterrupt: + # be explicit here for test/interrupts.py + ok = False except: ok = 0 else: diff --git a/src/engine/SCons/Node/FS.py b/src/engine/SCons/Node/FS.py index b183a88..cffa2b5 100644 --- a/src/engine/SCons/Node/FS.py +++ b/src/engine/SCons/Node/FS.py @@ -721,7 +721,7 @@ class FS: self._cwd = dir if change_os_dir: os.chdir(dir.abspath) - except: + except OSError: self._cwd = curr raise @@ -1476,7 +1476,7 @@ class File(Base): def rfile(self): try: return self._rfile - except: + except AttributeError: self._rfile = self if not self.exists(): n = self.fs.Rsearch(self.path, clazz=File, diff --git a/src/engine/SCons/Options.py b/src/engine/SCons/Options.py index 45f607f..f4d2bcc 100644 --- a/src/engine/SCons/Options.py +++ b/src/engine/SCons/Options.py @@ -163,6 +163,8 @@ class Options: value = env[option.key] try: eval(repr(value)) + except KeyboardInterrupt: + raise except: # Convert stuff that has a repr() that # cannot be evaluated into a string diff --git a/src/engine/SCons/Platform/win32.py b/src/engine/SCons/Platform/win32.py index 08fb296..c590055 100644 --- a/src/engine/SCons/Platform/win32.py +++ b/src/engine/SCons/Platform/win32.py @@ -166,15 +166,15 @@ def piped_spawn(sh, escape, cmd, args, env, stdout, stderr): try: stdout.write(open( tmpFileStdout, "r" ).read()) os.remove( tmpFileStdout ) - except: + except (IOError, OSError): pass if stderr != None and stderrRedirected == 0: try: stderr.write(open( tmpFileStderr, "r" ).read()) os.remove( tmpFileStderr ) - except: - pass + except (IOError, OSError): + pass return ret def spawn(sh, escape, cmd, args, env): @@ -199,7 +199,7 @@ def get_system_root(): # A resonable default if we can't read the registry try: val = os.environ['SYSTEMROOT'] - except: + except KeyError: val = "C:/WINDOWS" pass @@ -216,6 +216,8 @@ def get_system_root(): k=SCons.Util.RegOpenKeyEx(SCons.Util.hkey_mod.HKEY_LOCAL_MACHINE, 'Software\\Microsoft\\Windows\\CurrentVersion') val, tok = SCons.Util.RegQueryValueEx(k, 'SystemRoot') + except KeyboardInterrupt: + raise except: pass return val @@ -260,6 +262,8 @@ def generate(env): 'Software\\Microsoft\\Windows\\CurrentVersion') val, tok = SCons.Util.RegQueryValueEx(k, 'SystemRoot') cmd_interp = os.path.join(val, 'command.com') + except KeyboardInterrupt: + raise except: pass diff --git a/src/engine/SCons/SConf.py b/src/engine/SCons/SConf.py index 144099f..04955a4 100644 --- a/src/engine/SCons/SConf.py +++ b/src/engine/SCons/SConf.py @@ -219,8 +219,6 @@ class SConf: sys.stderr.write("scons: *** [%s] %s\n" % (e.node, e.errstr)) if e.errstr == 'Exception': traceback.print_exception(e.args[0], e.args[1], e.args[2]) - except: - raise for n in nodes: state = n.get_state() @@ -401,6 +399,8 @@ class SConf: if cacheDesc['scons_version'] != SCons.__version__: raise Exception, "version mismatch" self.cache = cacheDesc['data'] + except KeyboardInterrupt: + raise except: self.cache = {} diff --git a/src/engine/SCons/Script/SConscript.py b/src/engine/SCons/Script/SConscript.py index 8212061..4c47078 100644 --- a/src/engine/SCons/Script/SConscript.py +++ b/src/engine/SCons/Script/SConscript.py @@ -80,7 +80,7 @@ def get_calling_namespaces(): """Return the locals and globals for the function that called into this module in the current callstack.""" try: 1/0 - except: frame = sys.exc_info()[2].tb_frame + except ZeroDivisionError: frame = sys.exc_info()[2].tb_frame while frame.f_globals.get("__name__") == __name__: frame = frame.f_back diff --git a/src/engine/SCons/Script/__init__.py b/src/engine/SCons/Script/__init__.py index 613f775..03cb6d8 100644 --- a/src/engine/SCons/Script/__init__.py +++ b/src/engine/SCons/Script/__init__.py @@ -422,6 +422,8 @@ class OptParser(OptionParser): __main__.__date__, __main__.__developer__, __main__.__buildsys__)) + except KeyboardInterrupt: + raise except: # On win32 there is no scons.py, so there is no __main__.__version__, # hence there is no script version. @@ -740,7 +742,7 @@ def _main(args, parser): cdir = _create_path(options.directory) try: os.chdir(cdir) - except: + except OSError: sys.stderr.write("Could not change directory to %s\n" % cdir) xmit_args = [] diff --git a/src/engine/SCons/Sig/__init__.py b/src/engine/SCons/Sig/__init__.py index dfddf34..a2ebd5c 100644 --- a/src/engine/SCons/Sig/__init__.py +++ b/src/engine/SCons/Sig/__init__.py @@ -117,7 +117,7 @@ class _SConsign: """ try: return self.entries[filename] - except: + except (KeyError, AttributeError): return SConsignEntry() def set_entry(self, filename, entry): @@ -198,6 +198,8 @@ class SConsignDB(_SConsign): if type(self.entries) is not type({}): self.entries = {} raise TypeError + except KeyboardInterrupt: + raise except: SCons.Warnings.warn(SCons.Warnings.CorruptSConsignWarning, "Ignoring corrupt sconsign entry : %s"%self.dir.path) @@ -244,11 +246,13 @@ class SConsignDirFile(SConsignDir): try: fp = open(self.sconsign, 'rb') - except: + except IOError: fp = None try: SConsignDir.__init__(self, fp, module) + except KeyboardInterrupt: + raise except: SCons.Warnings.warn(SCons.Warnings.CorruptSConsignWarning, "Ignoring corrupt .sconsign file: %s"%self.sconsign) @@ -274,11 +278,11 @@ class SConsignDirFile(SConsignDir): try: file = open(temp, 'wb') fname = temp - except: + except IOError: try: file = open(self.sconsign, 'wb') fname = self.sconsign - except: + except IOError: return cPickle.dump(self.entries, file, 1) file.close() @@ -287,16 +291,16 @@ class SConsignDirFile(SConsignDir): mode = os.stat(self.sconsign)[0] os.chmod(self.sconsign, 0666) os.unlink(self.sconsign) - except: + except OSError: pass try: os.rename(fname, self.sconsign) - except: + except OSError: open(self.sconsign, 'wb').write(open(fname, 'rb').read()) os.chmod(self.sconsign, mode) try: os.unlink(temp) - except: + except OSError: pass SConsignForDirectory = SConsignDirFile diff --git a/src/engine/SCons/Taskmaster.py b/src/engine/SCons/Taskmaster.py index 6eda8c1..b269fa2 100644 --- a/src/engine/SCons/Taskmaster.py +++ b/src/engine/SCons/Taskmaster.py @@ -237,6 +237,8 @@ class Taskmaster: self.candidates.pop() self.ready = node break + except KeyboardInterrupt: + raise except: # We had a problem just trying to figure out the # children (like a child couldn't be linked in to a @@ -264,6 +266,8 @@ class Taskmaster: try: def derived_nodes(node): return node.is_derived() or node.is_pseudo_derived() derived = filter(derived_nodes, children) + except KeyboardInterrupt: + raise except: # We had a problem just trying to figure out if any of # the kids are derived (like a child couldn't be linked @@ -343,6 +347,8 @@ class Taskmaster: task = self.tasker(self, tlist, node in self.targets, node) try: task.make_ready() + except KeyboardInterrupt: + raise except: # We had a problem just trying to get this task ready (like # a child couldn't be linked in to a BuildDir when deciding diff --git a/src/engine/SCons/Tool/hpc++.py b/src/engine/SCons/Tool/hpc++.py index 5b650d6..a38d494 100644 --- a/src/engine/SCons/Tool/hpc++.py +++ b/src/engine/SCons/Tool/hpc++.py @@ -44,7 +44,7 @@ acc = None try: dirs = os.listdir('/opt') -except: +except OSError: dirs = [] for dir in dirs: diff --git a/src/engine/SCons/Tool/hplink.py b/src/engine/SCons/Tool/hplink.py index 7468920..2c7b55c 100644 --- a/src/engine/SCons/Tool/hplink.py +++ b/src/engine/SCons/Tool/hplink.py @@ -43,7 +43,7 @@ ccLinker = None try: dirs = os.listdir('/opt') -except: +except OSError: dirs = [] for dir in dirs: diff --git a/src/engine/SCons/Tool/javah.py b/src/engine/SCons/Tool/javah.py index ccb62f2..93678e4 100644 --- a/src/engine/SCons/Tool/javah.py +++ b/src/engine/SCons/Tool/javah.py @@ -55,7 +55,7 @@ def emit_java_headers(target, source, env): else: try: classdir = s.attributes.java_classdir - except: + except AttributeError: classdir = '.' classdir = SCons.Node.FS.default_fs.Dir(classdir).rdir() if str(classdir) == '.': diff --git a/src/engine/SCons/Tool/msvc.py b/src/engine/SCons/Tool/msvc.py index db434c4..4b15568 100644 --- a/src/engine/SCons/Tool/msvc.py +++ b/src/engine/SCons/Tool/msvc.py @@ -301,6 +301,8 @@ def get_msvc_default_paths(version = None): try: if not version: version = SCons.Tool.msvs.get_visualstudio_versions()[0] #use highest version + except KeyboardInterrupt: + raise except: pass diff --git a/src/engine/SCons/Tool/msvs.py b/src/engine/SCons/Tool/msvs.py index d4c32ba..68e8fda 100644 --- a/src/engine/SCons/Tool/msvs.py +++ b/src/engine/SCons/Tool/msvs.py @@ -317,6 +317,8 @@ class _GenerateV6DSP(_DSPGenerator): try: datas = base64.decodestring(datas) data = pickle.loads(datas) + except KeyboardInterrupt: + raise except: return # unable to unpickle any data for some reason @@ -334,6 +336,8 @@ class _GenerateV6DSP(_DSPGenerator): try: datas = base64.decodestring(datas) data = pickle.loads(datas) + except KeyboardInterrupt: + raise except: return # unable to unpickle any data for some reason @@ -474,6 +478,8 @@ class _GenerateV7DSP(_DSPGenerator): try: datas = base64.decodestring(datas) data = pickle.loads(datas) + except KeyboardInterrupt: + raise except: return # unable to unpickle any data for some reason @@ -490,6 +496,8 @@ class _GenerateV7DSP(_DSPGenerator): try: datas = base64.decodestring(datas) data = pickle.loads(datas) + except KeyboardInterrupt: + raise except: return # unable to unpickle any data for some reason @@ -567,6 +575,8 @@ class _GenerateV7DSW(_DSWGenerator): try: datas = base64.decodestring(datas) data = pickle.loads(datas) + except KeyboardInterrupt: + raise except: return # unable to unpickle any data for some reason diff --git a/src/engine/SCons/Tool/rmic.py b/src/engine/SCons/Tool/rmic.py index 7043566..79cc316 100644 --- a/src/engine/SCons/Tool/rmic.py +++ b/src/engine/SCons/Tool/rmic.py @@ -55,7 +55,7 @@ def emit_rmic_classes(target, source, env): else: try: classdir = s.attributes.java_classdir - except: + except AttributeError: classdir = '.' classdir = SCons.Node.FS.default_fs.Dir(classdir).rdir() if str(classdir) == '.': diff --git a/src/engine/SCons/Tool/sunlink.py b/src/engine/SCons/Tool/sunlink.py index f23917b..53dd410 100644 --- a/src/engine/SCons/Tool/sunlink.py +++ b/src/engine/SCons/Tool/sunlink.py @@ -43,7 +43,7 @@ ccLinker = None try: dirs = os.listdir('/opt') -except: +except OSError: dirs = [] for dir in dirs: diff --git a/src/engine/SCons/Util.py b/src/engine/SCons/Util.py index c0bc6ac..41e3883 100644 --- a/src/engine/SCons/Util.py +++ b/src/engine/SCons/Util.py @@ -804,7 +804,7 @@ else: if os.path.isfile(f): try: st = os.stat(f) - except: + except OSError: continue if stat.S_IMODE(st[stat.ST_MODE]) & 0111: return os.path.normpath(f) -- cgit v0.12