''' Error classes used by Yabs. ''' import inspect, os, signal, sys, time, traceback class error( Exception): '''Base type for all Yabs errors''' def __init__( self): Exception.__init__( self) def signal_name( s): for n, v in inspect.getmembers( signal): if n.startswith( 'SIG') and s==v: return n return '' def exit_description( e): #e = e/256 + (e%256)*256 if os.WIFSTOPPED( e): s = os.WSTOPSIG( e) return 'stopped due to signal ' + str( s) + ': ' + signal_name( s) elif os.WIFSIGNALED( e): s = os.WTERMSIG( e) return 'exited due to signal ' + str( s) + ': ' + signal_name( s) elif os.WIFEXITED( e): return 'exited with code ' + str( os.WEXITSTATUS( e)) else: return 'unrecognised exit status' class rulefn_error( error): '''Errors raised by rule functions''' def __init__( self, commandfn, text=None, exc_info=None): ''' uses sys.exc_info() if exc_info is None. ''' if exc_info is None: exc_info = sys.exc_info() error.__init__( self) self.commandfn = commandfn self.exc_info = exc_info self.text = text self.text_has_been_printed = False def __str__( self): # traceback.format_exception doesn't appear to be documented on # the python website, but is is the python-2.3 source. ret = 'rule-fn failed:\n' ret += ''.join( traceback.format_exception( *self.exc_info)) #if self.text: ret += 'output was:\n' + self.text return ret class command_error( error): '''Thrown by yabs.command_* functions''' def __init__( self, command, ret, text): error.__init__( self) #print '************command_error:', command, ret, text self.command = command self.ret = ret self.text = text self.text_has_been_printed = False self.command_has_been_printed = False self.ret_has_been_printed = False def __str__( self): ret = 'command failed:\n'\ + ' return value: 0x%x\n' % self.ret\ + ' command:\n' + str( self.command).strip() + '\n'\ + ' output:\n' + self.text.strip() + '\n' return ret class commandfn_error( error): '''Thrown by yabs.command_* functions''' def __init__( self, commandfn, text=None, exc_info=None): ''' uses sys.exc_info() if exc_info is None. ''' if exc_info is None: exc_info = sys.exc_info() error.__init__( self) self.commandfn = commandfn self.exc_info = exc_info self.text = text self.text_has_been_printed = False def __str__( self): # traceback.format_exception doesn't appear to be documented on # the python website, but is is the python-2.3 source. ret = 'command-fn ' + str( self.commandfn.func_code) + ' failed:\n' ret += ''.join( traceback.format_exception( *self.exc_info)) #if self.text: ret += 'output was:\n' + self.text return ret class file_command_error( error): '''Raised when a command fails to create the target.''' def __init__( self, filename, command): error.__init__( self) self.filename = filename self.command = command self.command_has_been_printed = False def __str__( self): ret = '' ret += 'command failed to create target\n' ret += ' filename: ' + self.filename + '\n' ret += ' command: ' + str( self.command) + '\n' return ret class file_command_mtime_error( error): '''Raised when a command makes a target older than previously.''' def __init__( self, filename, command, original_mtime, new_mtime): error.__init__( self) self.filename = filename self.command = command self.original_mtime = original_mtime self.new_mtime = new_mtime self.command_has_been_printed = False def __str__( self): ret = 'command created file with older datestamp\n' ret += ' filename: ' + self.filename + '\n' ret += ' command: ' + str( self.command) + '\n' ret += ' original mtime: ' + time.ctime( self.original_mtime) + '\n' ret += ' new mtime: ' + time.ctime( self.new_mtime) + '\n' return ret class no_rule_error( error): '''Raised when no command can be found to make a target.''' def __init__( self, filename): error.__init__( self) self.filename = filename def __str__( self): return 'don\'t kow how to make: ' + self.filename class bad_prerequisites( error): '''Raised when a rule doesn't return valid prerequisites or semi- prerequisites.''' def __init__( self, prerequisite): error.__init__( self) self.prerequisite = prerequisite def __str__( self): return 'Bad prerequisite or semi-prerequisite: ' + self.prerequisite