forked from OSchip/llvm-project
Partially Revert "scan-view: Remove Reporter.py and associated AppleScript files"
This reverts some of commitdbb01536f6
. The Reporter module was still being used by the ScanView.py module and deleting it caused scan-view to fail. This commit adds back Reporter.py but removes the code the references the AppleScript files which were removed indbb01536f6
. Reviewed By: NoQ Differential Revision: https://reviews.llvm.org/D96367
This commit is contained in:
parent
7387f33bfe
commit
e3cd3a3c91
|
@ -5,6 +5,7 @@ set(BinFiles
|
|||
|
||||
set(ShareFiles
|
||||
ScanView.py
|
||||
Reporter.py
|
||||
startfile.py
|
||||
bugcatcher.ico)
|
||||
|
||||
|
|
|
@ -0,0 +1,183 @@
|
|||
#!/usr/bin/env python
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
"""Methods for reporting bugs."""
|
||||
|
||||
import subprocess, sys, os
|
||||
|
||||
__all__ = ['ReportFailure', 'BugReport', 'getReporters']
|
||||
|
||||
#
|
||||
|
||||
class ReportFailure(Exception):
|
||||
"""Generic exception for failures in bug reporting."""
|
||||
def __init__(self, value):
|
||||
self.value = value
|
||||
|
||||
# Collect information about a bug.
|
||||
|
||||
class BugReport(object):
|
||||
def __init__(self, title, description, files):
|
||||
self.title = title
|
||||
self.description = description
|
||||
self.files = files
|
||||
|
||||
# Reporter interfaces.
|
||||
|
||||
import os
|
||||
|
||||
import email, mimetypes, smtplib
|
||||
from email import encoders
|
||||
from email.message import Message
|
||||
from email.mime.base import MIMEBase
|
||||
from email.mime.multipart import MIMEMultipart
|
||||
from email.mime.text import MIMEText
|
||||
|
||||
#===------------------------------------------------------------------------===#
|
||||
# ReporterParameter
|
||||
#===------------------------------------------------------------------------===#
|
||||
|
||||
class ReporterParameter(object):
|
||||
def __init__(self, n):
|
||||
self.name = n
|
||||
def getName(self):
|
||||
return self.name
|
||||
def getValue(self,r,bugtype,getConfigOption):
|
||||
return getConfigOption(r.getName(),self.getName())
|
||||
def saveConfigValue(self):
|
||||
return True
|
||||
|
||||
class TextParameter (ReporterParameter):
|
||||
def getHTML(self,r,bugtype,getConfigOption):
|
||||
return """\
|
||||
<tr>
|
||||
<td class="form_clabel">%s:</td>
|
||||
<td class="form_value"><input type="text" name="%s_%s" value="%s"></td>
|
||||
</tr>"""%(self.getName(),r.getName(),self.getName(),self.getValue(r,bugtype,getConfigOption))
|
||||
|
||||
class SelectionParameter (ReporterParameter):
|
||||
def __init__(self, n, values):
|
||||
ReporterParameter.__init__(self,n)
|
||||
self.values = values
|
||||
|
||||
def getHTML(self,r,bugtype,getConfigOption):
|
||||
default = self.getValue(r,bugtype,getConfigOption)
|
||||
return """\
|
||||
<tr>
|
||||
<td class="form_clabel">%s:</td><td class="form_value"><select name="%s_%s">
|
||||
%s
|
||||
</select></td>"""%(self.getName(),r.getName(),self.getName(),'\n'.join(["""\
|
||||
<option value="%s"%s>%s</option>"""%(o[0],
|
||||
o[0] == default and ' selected="selected"' or '',
|
||||
o[1]) for o in self.values]))
|
||||
|
||||
#===------------------------------------------------------------------------===#
|
||||
# Reporters
|
||||
#===------------------------------------------------------------------------===#
|
||||
|
||||
class EmailReporter(object):
|
||||
def getName(self):
|
||||
return 'Email'
|
||||
|
||||
def getParameters(self):
|
||||
return [TextParameter(x) for x in ['To', 'From', 'SMTP Server', 'SMTP Port']]
|
||||
|
||||
# Lifted from python email module examples.
|
||||
def attachFile(self, outer, path):
|
||||
# Guess the content type based on the file's extension. Encoding
|
||||
# will be ignored, although we should check for simple things like
|
||||
# gzip'd or compressed files.
|
||||
ctype, encoding = mimetypes.guess_type(path)
|
||||
if ctype is None or encoding is not None:
|
||||
# No guess could be made, or the file is encoded (compressed), so
|
||||
# use a generic bag-of-bits type.
|
||||
ctype = 'application/octet-stream'
|
||||
maintype, subtype = ctype.split('/', 1)
|
||||
if maintype == 'text':
|
||||
fp = open(path)
|
||||
# Note: we should handle calculating the charset
|
||||
msg = MIMEText(fp.read(), _subtype=subtype)
|
||||
fp.close()
|
||||
else:
|
||||
fp = open(path, 'rb')
|
||||
msg = MIMEBase(maintype, subtype)
|
||||
msg.set_payload(fp.read())
|
||||
fp.close()
|
||||
# Encode the payload using Base64
|
||||
encoders.encode_base64(msg)
|
||||
# Set the filename parameter
|
||||
msg.add_header('Content-Disposition', 'attachment', filename=os.path.basename(path))
|
||||
outer.attach(msg)
|
||||
|
||||
def fileReport(self, report, parameters):
|
||||
mainMsg = """\
|
||||
BUG REPORT
|
||||
---
|
||||
Title: %s
|
||||
Description: %s
|
||||
"""%(report.title, report.description)
|
||||
|
||||
if not parameters.get('To'):
|
||||
raise ReportFailure('No "To" address specified.')
|
||||
if not parameters.get('From'):
|
||||
raise ReportFailure('No "From" address specified.')
|
||||
|
||||
msg = MIMEMultipart()
|
||||
msg['Subject'] = 'BUG REPORT: %s'%(report.title)
|
||||
# FIXME: Get config parameters
|
||||
msg['To'] = parameters.get('To')
|
||||
msg['From'] = parameters.get('From')
|
||||
msg.preamble = mainMsg
|
||||
|
||||
msg.attach(MIMEText(mainMsg, _subtype='text/plain'))
|
||||
for file in report.files:
|
||||
self.attachFile(msg, file)
|
||||
|
||||
try:
|
||||
s = smtplib.SMTP(host=parameters.get('SMTP Server'),
|
||||
port=parameters.get('SMTP Port'))
|
||||
s.sendmail(msg['From'], msg['To'], msg.as_string())
|
||||
s.close()
|
||||
except:
|
||||
raise ReportFailure('Unable to send message via SMTP.')
|
||||
|
||||
return "Message sent!"
|
||||
|
||||
class BugzillaReporter(object):
|
||||
def getName(self):
|
||||
return 'Bugzilla'
|
||||
|
||||
def getParameters(self):
|
||||
return [TextParameter(x) for x in ['URL','Product']]
|
||||
|
||||
def fileReport(self, report, parameters):
|
||||
raise NotImplementedError
|
||||
|
||||
|
||||
class RadarClassificationParameter(SelectionParameter):
|
||||
def __init__(self):
|
||||
SelectionParameter.__init__(self,"Classification",
|
||||
[['1', 'Security'], ['2', 'Crash/Hang/Data Loss'],
|
||||
['3', 'Performance'], ['4', 'UI/Usability'],
|
||||
['6', 'Serious Bug'], ['7', 'Other']])
|
||||
|
||||
def saveConfigValue(self):
|
||||
return False
|
||||
|
||||
def getValue(self,r,bugtype,getConfigOption):
|
||||
if bugtype.find("leak") != -1:
|
||||
return '3'
|
||||
elif bugtype.find("dereference") != -1:
|
||||
return '2'
|
||||
elif bugtype.find("missing ivar release") != -1:
|
||||
return '3'
|
||||
else:
|
||||
return '7'
|
||||
|
||||
###
|
||||
|
||||
def getReporters():
|
||||
reporters = []
|
||||
reporters.append(EmailReporter())
|
||||
return reporters
|
||||
|
Loading…
Reference in New Issue