Putting names at the top of files is is not recommended. Collective wisdom for
[opensuse:osc.git] / osc / babysitter.py
1 #!/usr/bin/python
2
3 # Copyright (C) 2008 Novell Inc.  All rights reserved.
4 # This program is free software; it may be used, copied, modified
5 # and distributed under the terms of the GNU General Public Licence,
6 # either version 2, or (at your option) any later version.
7
8 import sys
9 import signal
10 from osc import oscerr
11 from urllib2 import URLError, HTTPError
12 try:
13     # import as RPMError because the class "error" is too generic
14     from rpm import error as RPMError
15 except:
16     # if rpm-python isn't installed (we might be on a debian system):
17     RPMError = None
18
19
20 # the good things are stolen from Matt Mackall's mercurial
21
22 def catchterm(*args):
23     raise oscerr.SignalInterrupt
24
25 for name in 'SIGBREAK', 'SIGHUP', 'SIGTERM':
26     num = getattr(signal, name, None)
27     if num: signal.signal(num, catchterm)
28
29
30 def run(prg):
31
32     try:
33
34         try:
35             if '--debugger' in sys.argv:
36                 import pdb
37                 pdb.set_trace()
38
39             # here we actually run the program:
40             return prg.main()
41
42         except:
43             # look for an option in the prg.options object and in the config dict
44             # print stack trace, if desired
45             if getattr(prg.options, 'traceback', None) or getattr(prg.conf, 'config', {}).get('traceback', None) or \
46                getattr(prg.options, 'post_mortem', None) or getattr(prg.conf, 'config', {}).get('post_mortem', None):
47                 import traceback
48                 traceback.print_exc(file=sys.stderr)
49                 # we could use http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/52215
50
51             # enter the debugger, if desired
52             if getattr(prg.options, 'post_mortem', None) or getattr(prg.conf, 'config', {}).get('post_mortem', None):
53                 if sys.stdout.isatty() and not hasattr(sys, 'ps1'):
54                     import pdb
55                     pdb.post_mortem(sys.exc_info()[2])
56                 else:
57                     print >>sys.stderr, 'sys.stdout is not a tty. Not jumping into pdb.'
58             raise
59
60     except oscerr.SignalInterrupt:
61         print >>sys.stderr, 'killed!'
62         return 1
63
64     except KeyboardInterrupt:
65         print >>sys.stderr, 'interrupted!'
66         return 1
67
68     except oscerr.UserAbort:
69         print >>sys.stderr, 'aborted.'
70         return 1
71
72     except oscerr.APIError, e:
73         print >>sys.stderr, 'BuildService API error:', e.msg
74         return 1
75
76     except oscerr.LinkExpandError, e:
77         print >>sys.stderr, 'Link cannot be expanded:\n', e
78         return 1
79
80     except (oscerr.NoWorkingCopy, oscerr.WorkingCopyWrongVersion), e:
81         print >>sys.stderr, e
82         return 1
83
84     except HTTPError, e:
85         print >>sys.stderr, 'Server returned an error:', e
86         if hasattr(e, 'osc_msg'):
87             print >>sys.stderr, e.osc_msg
88
89         body = e.read()
90         if getattr(prg.options, 'debug', None) or \
91            getattr(prg.conf, 'config', {}).get('debug', None):
92                 print >>sys.stderr, e.hdrs
93                 print >>sys.stderr, body
94
95         if e.code in [ 400, 403, 404, 500 ]:
96             if '<summary>' in body:
97                 msg = body.split('<summary>')[1]
98                 msg = msg.split('</summary>')[0]
99                 print >>sys.stderr, msg
100
101         return 1
102
103     except URLError, e:
104         print >>sys.stderr, 'Failed to reach a server:', e.reason
105         return 1
106
107     except (oscerr.ConfigError, oscerr.NoConfigfile), e:
108         print >>sys.stderr, e.msg
109         return 1
110
111     except oscerr.OscIOError, e:
112         print >>sys.stderr, e.msg
113         if getattr(prg.options, 'debug', None) or \
114            getattr(prg.conf, 'config', {}).get('debug', None):
115                 print >>sys.stderr, e.e
116         return 1
117
118     except (oscerr.WrongOptions, oscerr.WrongArgs), e:
119         print >>sys.stderr, e
120         return 2
121
122     except oscerr.WorkingCopyOutdated, e:
123         print >>sys.stderr, e
124         return 1
125
126     except (oscerr.PackageExists, oscerr.PackageMissing), e:
127         print >>sys.stderr, e.msg
128         return 1
129
130     except IOError, e:
131         print >>sys.stderr, e
132         return 1
133
134     except AttributeError, e:
135         print >>sys.stderr, e
136         return 1
137     
138     except RPMError, e:
139         print >>sys.stderr, e
140         return 1
141
142     except OSError, e:
143         print >>sys.stderr, e
144         return 1