# Copyright (C) 2008 Novell Inc. All rights reserved. # This program is free software; it may be used, copied, modified # and distributed under the terms of the GNU General Public Licence, # either version 2, or (at your option) any later version. import os.path import sys import signal import errno from osc import oscerr from urllib2 import URLError, HTTPError from oscsslexcp import NoSecureSSLError from osc.util.cpio import CpioError from osc.util.packagequery import PackageError try: from M2Crypto.SSL.Checker import SSLVerificationError from M2Crypto.SSL import SSLError as SSLError except: SSLError = None SSLVerificationError = None try: # import as RPMError because the class "error" is too generic from rpm import error as RPMError except: # if rpm-python isn't installed (we might be on a debian system): RPMError = None # the good things are stolen from Matt Mackall's mercurial def catchterm(*args): raise oscerr.SignalInterrupt for name in 'SIGBREAK', 'SIGHUP', 'SIGTERM': num = getattr(signal, name, None) if num: signal.signal(num, catchterm) def run(prg): try: try: if '--debugger' in sys.argv: import pdb pdb.set_trace() # here we actually run the program: return prg.main() except: # look for an option in the prg.options object and in the config dict # print stack trace, if desired if getattr(prg.options, 'traceback', None) or getattr(prg.conf, 'config', {}).get('traceback', None) or \ getattr(prg.options, 'post_mortem', None) or getattr(prg.conf, 'config', {}).get('post_mortem', None): import traceback traceback.print_exc(file=sys.stderr) # we could use http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/52215 # enter the debugger, if desired if getattr(prg.options, 'post_mortem', None) or getattr(prg.conf, 'config', {}).get('post_mortem', None): if sys.stdout.isatty() and not hasattr(sys, 'ps1'): import pdb pdb.post_mortem(sys.exc_info()[2]) else: print >>sys.stderr, 'sys.stdout is not a tty. Not jumping into pdb.' raise except oscerr.SignalInterrupt: print >>sys.stderr, 'killed!' return 1 except KeyboardInterrupt: print >>sys.stderr, 'interrupted!' return 1 except oscerr.UserAbort: print >>sys.stderr, 'aborted.' return 1 except oscerr.APIError, e: print >>sys.stderr, 'BuildService API error:', e.msg return 1 except oscerr.LinkExpandError, e: print >>sys.stderr, 'Link "%s/%s" cannot be expanded:\n' % (e.prj, e.pac), e.msg print >>sys.stderr, 'Use "osc repairlink" to fix merge conflicts.\n' return 1 except oscerr.WorkingCopyWrongVersion, e: print >>sys.stderr, e except oscerr.NoWorkingCopy, e: print >>sys.stderr, e if os.path.isdir('.git'): print >>sys.stderr, "Current directory looks like git." if os.path.isdir('.hg'): print >>sys.stderr, "Current directory looks like mercurial." if os.path.isdir('.svn'): print >>sys.stderr, "Current directory looks like svn." if os.path.isdir('CVS'): print >>sys.stderr, "Current directory looks like cvs." return 1 except HTTPError, e: print >>sys.stderr, 'Server returned an error:', e if hasattr(e, 'osc_msg'): print >>sys.stderr, e.osc_msg try: body = e.read() except AttributeError: body = '' if getattr(prg.options, 'debug', None) or \ getattr(prg.conf, 'config', {}).get('debug', None): print >>sys.stderr, e.hdrs print >>sys.stderr, body if e.code in [ 400, 403, 404, 500 ]: if '' in body: msg = body.split('')[1] msg = msg.split('')[0] print >>sys.stderr, msg return 1 except URLError, e: print >>sys.stderr, 'Failed to reach a server:\n', e.reason return 1 except IOError, e: # ignore broken pipe if e.errno != errno.EPIPE: raise return 1 except OSError, e: if e.errno != errno.ENOENT: raise print >>sys.stderr, e return 1 except (oscerr.ConfigError, oscerr.NoConfigfile), e: print >>sys.stderr, e.msg return 1 except oscerr.OscIOError, e: print >>sys.stderr, e.msg if getattr(prg.options, 'debug', None) or \ getattr(prg.conf, 'config', {}).get('debug', None): print >>sys.stderr, e.e return 1 except (oscerr.WrongOptions, oscerr.WrongArgs), e: print >>sys.stderr, e return 2 except oscerr.ExtRuntimeError, e: print >>sys.stderr, e.msg return 1 except oscerr.ServiceNotInstalled, e: print >>sys.stderr, e.msg return 1 except oscerr.WorkingCopyOutdated, e: print >>sys.stderr, e return 1 except (oscerr.PackageExists, oscerr.PackageMissing, oscerr.WorkingCopyInconsistent), e: print >>sys.stderr, e.msg return 1 except oscerr.PackageInternalError, e: import traceback print >>sys.stderr, 'a package internal error occured\n' \ 'please file a bug and attach your current package working copy ' \ 'and the following traceback to it:' print >>sys.stderr, e.msg traceback.print_exc(file=sys.stderr) return 1 except oscerr.PackageError, e: print >>sys.stderr, e.msg return 1 except PackageError, e: print >>sys.stderr, '%s:' % e.fname, e.msg return 1 except RPMError, e: print >>sys.stderr, e return 1 except SSLError, e: print >>sys.stderr, "SSL Error:", e return 1 except SSLVerificationError, e: print >>sys.stderr, "Certificate Verification Error:", e return 1 except NoSecureSSLError, e: print >>sys.stderr, e return 1 except CpioError, e: print >>sys.stderr, e return 1 # vim: sw=4 et