mirror of
				https://git.proxmox.com/git/llvm-toolchain
				synced 2025-10-31 17:31:04 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			224 lines
		
	
	
		
			7.3 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			224 lines
		
	
	
		
			7.3 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
| From e3cd3a3c91524c957e06bb0170343548f02b6842 Mon Sep 17 00:00:00 2001
 | |
| From: Tom Stellard <tstellar@redhat.com>
 | |
| Date: Thu, 11 Feb 2021 22:28:19 +0000
 | |
| Subject: [PATCH] Partially Revert "scan-view: Remove Reporter.py and
 | |
|  associated AppleScript files"
 | |
| 
 | |
| This reverts some of commit dbb01536f6f49fa428f170e34466072ef439b3e9.
 | |
| 
 | |
| 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 in
 | |
| dbb01536f6f49fa428f170e34466072ef439b3e9.
 | |
| 
 | |
| Reviewed By: NoQ
 | |
| 
 | |
| Differential Revision: https://reviews.llvm.org/D96367
 | |
| ---
 | |
|  clang/tools/scan-view/CMakeLists.txt    |   1 +
 | |
|  clang/tools/scan-view/share/Reporter.py | 183 ++++++++++++++++++++++++
 | |
|  2 files changed, 184 insertions(+)
 | |
|  create mode 100644 clang/tools/scan-view/share/Reporter.py
 | |
| 
 | |
| diff --git a/clang/tools/scan-view/CMakeLists.txt b/clang/tools/scan-view/CMakeLists.txt
 | |
| index dd3d33439299..eccc6b83195b 100644
 | |
| --- a/clang/tools/scan-view/CMakeLists.txt
 | |
| +++ b/clang/tools/scan-view/CMakeLists.txt
 | |
| @@ -5,6 +5,7 @@ set(BinFiles
 | |
|  
 | |
|  set(ShareFiles
 | |
|        ScanView.py
 | |
| +      Reporter.py
 | |
|        startfile.py
 | |
|        bugcatcher.ico)
 | |
|  
 | |
| diff --git a/clang/tools/scan-view/share/Reporter.py b/clang/tools/scan-view/share/Reporter.py
 | |
| new file mode 100644
 | |
| index 000000000000..31a14fb0cf74
 | |
| --- /dev/null
 | |
| +++ b/clang/tools/scan-view/share/Reporter.py
 | |
| @@ -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
 | |
| +
 | 
