mirror of
				https://git.proxmox.com/git/llvm-toolchain
				synced 2025-11-04 14:44:34 +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
 | 
						|
+
 |