diff --git a/0001-Partially-Revert-scan-view-Remove-Reporter.py-and-as.patch b/0001-Partially-Revert-scan-view-Remove-Reporter.py-and-as.patch new file mode 100644 index 0000000..6079e9f --- /dev/null +++ b/0001-Partially-Revert-scan-view-Remove-Reporter.py-and-as.patch @@ -0,0 +1,224 @@ +From 9d68d4554d903353a7d4599d2428bd479651eb40 Mon Sep 17 00:00:00 2001 +From: Tom Stellard +Date: Tue, 9 Feb 2021 13:35:43 -0800 +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. + +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 """\ ++ ++%s: ++ ++"""%(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 """\ ++ ++%s:"""%(self.getName(),r.getName(),self.getName(),'\n'.join(["""\ ++"""%(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 ++ +-- +2.27.0 + diff --git a/0001-scan-view-Remove-Reporter.py-and-associated-AppleScr.patch b/0001-scan-view-Remove-Reporter.py-and-associated-AppleScr.patch new file mode 100644 index 0000000..e8a7969 --- /dev/null +++ b/0001-scan-view-Remove-Reporter.py-and-associated-AppleScr.patch @@ -0,0 +1,299 @@ +From f962ce26b4bf716af29b9d4d05860d5fb81cee61 Mon Sep 17 00:00:00 2001 +From: Tom Stellard +Date: Fri, 18 Dec 2020 23:16:26 +0000 +Subject: [PATCH] scan-view: Remove Reporter.py and associated AppleScript + files + +I'm not exactly sure what this is, but it appears to be a tool for reporting +internal issues at Apple. These files haven't been meaningfully updated in +12 years, and it doesn't seem like there is any reason to keep them in tree. + +Differential Revision: https://reviews.llvm.org/D93565 +--- + clang/tools/scan-view/CMakeLists.txt | 3 - + clang/tools/scan-view/share/FileRadar.scpt | Bin 18418 -> 0 bytes + .../scan-view/share/GetRadarVersion.scpt | 0 + clang/tools/scan-view/share/Reporter.py | 251 ------------------ + 4 files changed, 254 deletions(-) + delete mode 100644 clang/tools/scan-view/share/FileRadar.scpt + delete mode 100644 clang/tools/scan-view/share/GetRadarVersion.scpt + delete 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 22edb974bac7..dd3d33439299 100644 +--- a/clang/tools/scan-view/CMakeLists.txt ++++ b/clang/tools/scan-view/CMakeLists.txt +@@ -5,10 +5,7 @@ set(BinFiles + + set(ShareFiles + ScanView.py +- Reporter.py + startfile.py +- FileRadar.scpt +- GetRadarVersion.scpt + bugcatcher.ico) + + if(CLANG_INSTALL_SCANVIEW) +diff --git a/clang/tools/scan-view/share/GetRadarVersion.scpt b/clang/tools/scan-view/share/GetRadarVersion.scpt +deleted file mode 100644 +index e69de29bb2d1..000000000000 +diff --git a/clang/tools/scan-view/share/Reporter.py b/clang/tools/scan-view/share/Reporter.py +deleted file mode 100644 +index b1ff16142e27..000000000000 +--- a/clang/tools/scan-view/share/Reporter.py ++++ /dev/null +@@ -1,251 +0,0 @@ +-#!/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 """\ +- +-%s: +- +-"""%(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 """\ +- +-%s:"""%(self.getName(),r.getName(),self.getName(),'\n'.join(["""\ +-"""%(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' +- +-class RadarReporter(object): +- @staticmethod +- def isAvailable(): +- # FIXME: Find this .scpt better +- path = os.path.join(os.path.dirname(__file__),'../share/scan-view/GetRadarVersion.scpt') +- try: +- p = subprocess.Popen(['osascript',path], +- stdout=subprocess.PIPE, stderr=subprocess.PIPE) +- except: +- return False +- data,err = p.communicate() +- res = p.wait() +- # FIXME: Check version? Check for no errors? +- return res == 0 +- +- def getName(self): +- return 'Radar' +- +- def getParameters(self): +- return [ TextParameter('Component'), TextParameter('Component Version'), +- RadarClassificationParameter() ] +- +- def fileReport(self, report, parameters): +- component = parameters.get('Component', '') +- componentVersion = parameters.get('Component Version', '') +- classification = parameters.get('Classification', '') +- personID = "" +- diagnosis = "" +- config = "" +- +- if not component.strip(): +- component = 'Bugs found by clang Analyzer' +- if not componentVersion.strip(): +- componentVersion = 'X' +- +- script = os.path.join(os.path.dirname(__file__),'../share/scan-view/FileRadar.scpt') +- args = ['osascript', script, component, componentVersion, classification, personID, report.title, +- report.description, diagnosis, config] + [os.path.abspath(f) for f in report.files] +-# print >>sys.stderr, args +- try: +- p = subprocess.Popen(args, stdout=subprocess.PIPE, stderr=subprocess.PIPE) +- except: +- raise ReportFailure("Unable to file radar (AppleScript failure).") +- data, err = p.communicate() +- res = p.wait() +- +- if res: +- raise ReportFailure("Unable to file radar (AppleScript failure).") +- +- try: +- values = eval(data) +- except: +- raise ReportFailure("Unable to process radar results.") +- +- # We expect (int: bugID, str: message) +- if len(values) != 2 or not isinstance(values[0], int): +- raise ReportFailure("Unable to process radar results.") +- +- bugID,message = values +- bugID = int(bugID) +- +- if not bugID: +- raise ReportFailure(message) +- +- return "Filed: %d"%(bugID,bugID) +- +-### +- +-def getReporters(): +- reporters = [] +- if RadarReporter.isAvailable(): +- reporters.append(RadarReporter()) +- reporters.append(EmailReporter()) +- return reporters +- +-- +2.26.2 + diff --git a/clang.spec b/clang.spec index 2731e6c..f13573e 100644 --- a/clang.spec +++ b/clang.spec @@ -4,7 +4,7 @@ %global min_ver 1 %global patch_ver 0 %global rc_ver 2 -%global baserelease 4 +%global baserelease 5 %global clang_tools_binaries \ %{_bindir}/clang-apply-replacements \ @@ -93,6 +93,8 @@ Patch13: 0001-Make-funwind-tables-the-default-for-all-archs.patch Patch15: 0001-clang-Don-t-install-static-libraries.patch Patch16: 0001-clang-Fix-spurious-test-failure.patch Patch17: 0001-Driver-Prefer-gcc-toolchains-with-libgcc_s.so-when-n.patch +Patch18: 0001-scan-view-Remove-Reporter.py-and-associated-AppleScr.patch +Patch19: 0001-Partially-Revert-scan-view-Remove-Reporter.py-and-as.patch BuildRequires: gcc BuildRequires: gcc-c++ @@ -275,6 +277,12 @@ pathfix.py -i %{__python3} -pn \ %patch15 -p2 -b .no-install-static %patch16 -p2 -b .test-fix2 %patch17 -p1 -b .check-gcc_s +%patch18 -p2 -b .scan-view-remove-files +%patch19 -p2 -b .scan-view-remove-files-fix + +# Patch does not support binary diffs from git so we have to manually delete +# this: +rm tools/scan-view/share/FileRadar.scpt mv ../%{clang_tools_srcdir} tools/extra @@ -528,6 +536,9 @@ false %endif %changelog +* Thu Feb 09 2021 Tom Stellard - 11.1.0-0.5.rc2 +- Remove some unnecessary scan-view files + * Tue Jan 26 2021 Fedora Release Engineering - 11.1.0-0.4.rc2 - Rebuilt for https://fedoraproject.org/wiki/Fedora_34_Mass_Rebuild