diff -r fbccc1648d79 -r 19ff083c2870 error.py --- a/error.py Mon Feb 16 02:09:14 2009 +0200 +++ b/error.py Mon Feb 16 02:49:06 2009 +0200 @@ -2,35 +2,112 @@ Build error messages """ -import traceback, sys +import traceback, sys, cgi, urllib -def build_error (exc_info=None) : +def build_error (exc_info=None, env=None) : """ Dumps out a raw traceback of the given/current exception to stdout. + If request_env, it should be a environment dict, like under WSGI, and will be used to display additional info + about the request. + Returns a (status, content-type, body) tuple, with all components being non-unicode strs. """ - - # default + # default for exc_info is current exception if not exc_info : exc_info = sys.exc_info() + # request URL? + if env : + try : + from qmsk.web.http import request_url + + url = request_url(env) + + except : + # ignore + url = None + else : + url = None + + # working copy path? + try : + from config import HG_WC_PATH + + wc_path = HG_WC_PATH + + except : + # a good guess + wc_path = '.' + + # version? + try : + from version import version_string + + version = version_string(wc_path) + + except : + version = None + + # the exception type + exception_str = traceback.format_exception_only(*exc_info[:2])[-1][:255] + + # the exception traceback + traceback_lines = traceback.format_exception(*exc_info) + + # XXX: make this configureable + trac_url = "http://projects.qmsk.net/irclogs2/trac" + + # ticket list + query_url = "%s/query" % trac_url + + # submit ticket + submit_args = dict(type='defect') + + if url : + submit_args['url'] = url + + if version : + submit_args['revision'] = version + + if exception_str : + submit_args['summary'] = exception_str + + if traceback_lines : + # this is big + submit_args['description'] = """\ +[Insert any additional information here] + + += Traceback = +{{{ +%s +}}}""" % ''.join(traceback_lines) + + # the trac newticket URL + submit_url = "%s/newticket?%s" % (trac_url, '&'.join('%s=%s' % (urllib.quote(k), urllib.quote(v)) for k, v in submit_args.iteritems())) + # return return ('500 Internal Server Error', 'text/html; charset=UTF-8', ("""\ 500 Internal Server Error

Oops!

An error occured, which was not logged, and will not be reported to anybody. It might be your fault, or it might be - the programmer's, but it's probably not mine. If you think you really care, you can try poking the administrator of - this site to see if they respond. + mine.

- If you do so, please include the following information: + You can try poking the administrator of this site to see if they respond, or submit a defect ticket at the Project Trac, using the following link:

+
+    %(submit_url_short)s
+

Details:

%(traceback)s
""" % dict( - traceback = ''.join(traceback.format_exception(*exc_info)) + traceback = cgi.escape(''.join(traceback_lines)), + query_url = query_url, + submit_url = submit_url, + submit_url_short = submit_url[:120] + '...' )).encode('utf-8'))