r253068 - [scan-build] Move non user-facing utilities to share

Jonathan Roelofs via cfe-commits cfe-commits at lists.llvm.org
Fri Nov 13 11:56:07 PST 2015


Author: jroelofs
Date: Fri Nov 13 13:56:07 2015
New Revision: 253068

URL: http://llvm.org/viewvc/llvm-project?rev=253068&view=rev
Log:
[scan-build] Move non user-facing utilities to share

Added:
    cfe/trunk/tools/scan-view/share/Reporter.py
      - copied unchanged from r253045, cfe/trunk/tools/scan-view/Reporter.py
    cfe/trunk/tools/scan-view/share/ScanView.py
      - copied unchanged from r253045, cfe/trunk/tools/scan-view/ScanView.py
    cfe/trunk/tools/scan-view/share/startfile.py
      - copied unchanged from r253045, cfe/trunk/tools/scan-view/startfile.py
Removed:
    cfe/trunk/tools/scan-view/Reporter.py
    cfe/trunk/tools/scan-view/ScanView.py
    cfe/trunk/tools/scan-view/startfile.py
Modified:
    cfe/trunk/tools/scan-build/CMakeLists.txt
    cfe/trunk/tools/scan-build/scan-build
    cfe/trunk/tools/scan-view/CMakeLists.txt
    cfe/trunk/tools/scan-view/Makefile
    cfe/trunk/tools/scan-view/scan-view

Modified: cfe/trunk/tools/scan-build/CMakeLists.txt
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/scan-build/CMakeLists.txt?rev=253068&r1=253067&r2=253068&view=diff
==============================================================================
--- cfe/trunk/tools/scan-build/CMakeLists.txt (original)
+++ cfe/trunk/tools/scan-build/CMakeLists.txt Fri Nov 13 13:56:07 2015
@@ -64,15 +64,15 @@ if(CLANG_INSTALL_SCANBUILD)
   endforeach()
 
   foreach(ShareFile ${ShareFiles})
-    add_custom_command(OUTPUT ${CMAKE_BINARY_DIR}/share/scan-view/${ShareFile}
+    add_custom_command(OUTPUT ${CMAKE_BINARY_DIR}/share/scan-build/${ShareFile}
                        COMMAND ${CMAKE_COMMAND} -E make_directory
-                         ${CMAKE_BINARY_DIR}/share/scan-view
+                         ${CMAKE_BINARY_DIR}/share/scan-build
                        COMMAND ${CMAKE_COMMAND} -E copy
                          ${CMAKE_CURRENT_SOURCE_DIR}/share/${ShareFile}
-                         ${CMAKE_BINARY_DIR}/share/scan-view/
+                         ${CMAKE_BINARY_DIR}/share/scan-build/
                        DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/share/${ShareFile})
-    list(APPEND Depends ${CMAKE_BINARY_DIR}/share/scan-view/${ShareFile})
-    install(FILES share/${ShareFile} DESTINATION share/scan-view)
+    list(APPEND Depends ${CMAKE_BINARY_DIR}/share/scan-build/${ShareFile})
+    install(FILES share/${ShareFile} DESTINATION share/scan-build)
   endforeach()
 
   add_custom_target(scan-build ALL DEPENDS ${Depends})

Modified: cfe/trunk/tools/scan-build/scan-build
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/scan-build/scan-build?rev=253068&r1=253067&r2=253068&view=diff
==============================================================================
--- cfe/trunk/tools/scan-build/scan-build (original)
+++ cfe/trunk/tools/scan-build/scan-build Fri Nov 13 13:56:07 2015
@@ -462,7 +462,7 @@ sub CopyFiles {
 
   my $Dir = shift;
 
-  my $JS = Cwd::realpath("$RealBin/sorttable.js");
+  my $JS = Cwd::realpath("$RealBin/../share/scan-build/sorttable.js");
 
   DieDiag("Cannot find 'sorttable.js'.\n")
     if (! -r $JS);
@@ -472,7 +472,7 @@ sub CopyFiles {
   DieDiag("Could not copy 'sorttable.js' to '$Dir'.\n")
     if (! -r "$Dir/sorttable.js");
 
-  my $CSS = Cwd::realpath("$RealBin/scanview.css");
+  my $CSS = Cwd::realpath("$RealBin/../share/scan-build/scanview.css");
 
   DieDiag("Cannot find 'scanview.css'.\n")
     if (! -r $CSS);

Modified: cfe/trunk/tools/scan-view/CMakeLists.txt
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/scan-view/CMakeLists.txt?rev=253068&r1=253067&r2=253068&view=diff
==============================================================================
--- cfe/trunk/tools/scan-view/CMakeLists.txt (original)
+++ cfe/trunk/tools/scan-view/CMakeLists.txt Fri Nov 13 13:56:07 2015
@@ -1,12 +1,12 @@
 option(CLANG_INSTALL_SCANVIEW "Install the scan-view tool" ON)
 
 set(BinFiles
-      Reporter.py
-      ScanView.py
-      scan-view
-      startfile.py)
+      scan-view)
 
 set(ShareFiles
+      ScanView.py
+      Reporter.py
+      startfile.py
       FileRadar.scpt
       GetRadarVersion.scpt
       bugcatcher.ico)

Modified: cfe/trunk/tools/scan-view/Makefile
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/scan-view/Makefile?rev=253068&r1=253067&r2=253068&view=diff
==============================================================================
--- cfe/trunk/tools/scan-view/Makefile (original)
+++ cfe/trunk/tools/scan-view/Makefile Fri Nov 13 13:56:07 2015
@@ -15,10 +15,10 @@ include $(CLANG_LEVEL)/Makefile
 CLANG_INSTALL_SCANVIEW ?= 1
 
 ifeq ($(CLANG_INSTALL_SCANVIEW), 1)
-  InstallTargets := $(ToolDir)/Reporter.py \
-                    $(ToolDir)/ScanView.py \
-                    $(ToolDir)/scan-view \
-                    $(ToolDir)/startfile.py \
+  InstallTargets := $(ToolDir)/scan-view \
+                    $(ShareDir)/scan-view/Reporter.py \
+                    $(ShareDir)/scan-view/ScanView.py \
+                    $(ShareDir)/scan-view/startfile.py \
                     $(ShareDir)/scan-view/FileRadar.scpt \
                     $(ShareDir)/scan-view/GetRadarVersion.scpt \
                     $(ShareDir)/scan-view/bugcatcher.ico

Removed: cfe/trunk/tools/scan-view/Reporter.py
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/scan-view/Reporter.py?rev=253067&view=auto
==============================================================================
--- cfe/trunk/tools/scan-view/Reporter.py (original)
+++ cfe/trunk/tools/scan-view/Reporter.py (removed)
@@ -1,248 +0,0 @@
-"""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:
-    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:
-  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:
-    def getName(self):
-        return 'Email'
-
-    def getParameters(self):
-        return map(lambda x:TextParameter(x),['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:
-    def getName(self):
-        return 'Bugzilla'
-    
-    def getParameters(self):
-        return map(lambda x:TextParameter(x),['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:
-    @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] + map(os.path.abspath, 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: <a href=\"rdar://%d/\">%d</a>"%(bugID,bugID)
-
-###
-
-def getReporters():
-    reporters = []
-    if RadarReporter.isAvailable():
-        reporters.append(RadarReporter())
-    reporters.append(EmailReporter())
-    return reporters
-

Removed: cfe/trunk/tools/scan-view/ScanView.py
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/scan-view/ScanView.py?rev=253067&view=auto
==============================================================================
--- cfe/trunk/tools/scan-view/ScanView.py (original)
+++ cfe/trunk/tools/scan-view/ScanView.py (removed)
@@ -1,767 +0,0 @@
-import BaseHTTPServer
-import SimpleHTTPServer
-import os
-import sys
-import urllib, urlparse
-import posixpath
-import StringIO
-import re
-import shutil
-import threading
-import time
-import socket
-import itertools
-
-import Reporter
-import ConfigParser
-
-###
-# Various patterns matched or replaced by server.
-
-kReportFileRE = re.compile('(.*/)?report-(.*)\\.html')
-
-kBugKeyValueRE = re.compile('<!-- BUG([^ ]*) (.*) -->')
-
-#  <!-- REPORTPROBLEM file="crashes/clang_crash_ndSGF9.mi" stderr="crashes/clang_crash_ndSGF9.mi.stderr.txt" info="crashes/clang_crash_ndSGF9.mi.info" -->
-
-kReportCrashEntryRE = re.compile('<!-- REPORTPROBLEM (.*?)-->')
-kReportCrashEntryKeyValueRE = re.compile(' ?([^=]+)="(.*?)"')
-
-kReportReplacements = []
-
-# Add custom javascript.
-kReportReplacements.append((re.compile('<!-- SUMMARYENDHEAD -->'), """\
-<script language="javascript" type="text/javascript">
-function load(url) {
-  if (window.XMLHttpRequest) {
-    req = new XMLHttpRequest();
-  } else if (window.ActiveXObject) {
-    req = new ActiveXObject("Microsoft.XMLHTTP");
-  }
-  if (req != undefined) {
-    req.open("GET", url, true);
-    req.send("");
-  }
-}
-</script>"""))
-
-# Insert additional columns.
-kReportReplacements.append((re.compile('<!-- REPORTBUGCOL -->'), 
-                            '<td></td><td></td>'))
-
-# Insert report bug and open file links.
-kReportReplacements.append((re.compile('<!-- REPORTBUG id="report-(.*)\\.html" -->'),
-                            ('<td class="Button"><a href="report/\\1">Report Bug</a></td>' + 
-                             '<td class="Button"><a href="javascript:load(\'open/\\1\')">Open File</a></td>')))
-
-kReportReplacements.append((re.compile('<!-- REPORTHEADER -->'),
-                                       '<h3><a href="/">Summary</a> > Report %(report)s</h3>'))
-
-kReportReplacements.append((re.compile('<!-- REPORTSUMMARYEXTRA -->'),
-                            '<td class="Button"><a href="report/%(report)s">Report Bug</a></td>'))
-
-# Insert report crashes link.
-
-# Disabled for the time being until we decide exactly when this should
-# be enabled. Also the radar reporter needs to be fixed to report
-# multiple files.
-
-#kReportReplacements.append((re.compile('<!-- REPORTCRASHES -->'),
-#                            '<br>These files will automatically be attached to ' +
-#                            'reports filed here: <a href="report_crashes">Report Crashes</a>.'))
-
-###
-# Other simple parameters
-
-kShare = posixpath.join(posixpath.dirname(__file__), '../share/scan-view')
-kConfigPath = os.path.expanduser('~/.scanview.cfg')
-
-###
-
-__version__ = "0.1"
-
-__all__ = ["create_server"]
-
-class ReporterThread(threading.Thread):
-    def __init__(self, report, reporter, parameters, server):
-        threading.Thread.__init__(self)
-        self.report = report
-        self.server = server
-        self.reporter = reporter
-        self.parameters = parameters
-        self.success = False
-        self.status = None
-
-    def run(self):
-        result = None
-        try:
-            if self.server.options.debug:
-                print >>sys.stderr, "%s: SERVER: submitting bug."%(sys.argv[0],)
-            self.status = self.reporter.fileReport(self.report, self.parameters)
-            self.success = True
-            time.sleep(3)
-            if self.server.options.debug:
-                print >>sys.stderr, "%s: SERVER: submission complete."%(sys.argv[0],)
-        except Reporter.ReportFailure,e:
-            self.status = e.value
-        except Exception,e:
-            s = StringIO.StringIO()
-            import traceback
-            print >>s,'<b>Unhandled Exception</b><br><pre>'
-            traceback.print_exc(e,file=s)
-            print >>s,'</pre>'
-            self.status = s.getvalue()
-
-class ScanViewServer(BaseHTTPServer.HTTPServer):
-    def __init__(self, address, handler, root, reporters, options):
-        BaseHTTPServer.HTTPServer.__init__(self, address, handler)
-        self.root = root
-        self.reporters = reporters
-        self.options = options        
-        self.halted = False
-        self.config = None
-        self.load_config()
-
-    def load_config(self):
-        self.config = ConfigParser.RawConfigParser()
-
-        # Add defaults
-        self.config.add_section('ScanView')
-        for r in self.reporters:
-            self.config.add_section(r.getName())
-            for p in r.getParameters():
-              if p.saveConfigValue():
-                self.config.set(r.getName(), p.getName(), '')
-
-        # Ignore parse errors
-        try:
-            self.config.read([kConfigPath])
-        except:
-            pass
-
-        # Save on exit
-        import atexit
-        atexit.register(lambda: self.save_config())
-        
-    def save_config(self):
-        # Ignore errors (only called on exit).
-        try:
-            f = open(kConfigPath,'w')
-            self.config.write(f)
-            f.close()
-        except:
-            pass
-        
-    def halt(self):
-        self.halted = True
-        if self.options.debug:
-            print >>sys.stderr, "%s: SERVER: halting." % (sys.argv[0],)
-
-    def serve_forever(self):
-        while not self.halted:
-            if self.options.debug > 1:
-                print >>sys.stderr, "%s: SERVER: waiting..." % (sys.argv[0],)
-            try:
-                self.handle_request()
-            except OSError,e:
-                print 'OSError',e.errno
-
-    def finish_request(self, request, client_address):
-        if self.options.autoReload:
-            import ScanView
-            self.RequestHandlerClass = reload(ScanView).ScanViewRequestHandler
-        BaseHTTPServer.HTTPServer.finish_request(self, request, client_address)
-
-    def handle_error(self, request, client_address):
-        # Ignore socket errors
-        info = sys.exc_info()
-        if info and isinstance(info[1], socket.error):
-            if self.options.debug > 1:
-                print >>sys.stderr, "%s: SERVER: ignored socket error." % (sys.argv[0],)
-            return
-        BaseHTTPServer.HTTPServer.handle_error(self, request, client_address)
-
-# Borrowed from Quixote, with simplifications.
-def parse_query(qs, fields=None):
-    if fields is None:
-        fields = {}
-    for chunk in filter(None, qs.split('&')):
-        if '=' not in chunk:
-            name = chunk
-            value = ''
-        else:
-            name, value = chunk.split('=', 1)
-        name = urllib.unquote(name.replace('+', ' '))
-        value = urllib.unquote(value.replace('+', ' '))
-        item = fields.get(name)
-        if item is None:
-            fields[name] = [value]
-        else:
-            item.append(value)
-    return fields
-
-class ScanViewRequestHandler(SimpleHTTPServer.SimpleHTTPRequestHandler):
-    server_version = "ScanViewServer/" + __version__
-    dynamic_mtime = time.time()
-
-    def do_HEAD(self):
-        try:
-            SimpleHTTPServer.SimpleHTTPRequestHandler.do_HEAD(self)
-        except Exception,e:
-            self.handle_exception(e)
-            
-    def do_GET(self):
-        try:
-            SimpleHTTPServer.SimpleHTTPRequestHandler.do_GET(self)
-        except Exception,e:
-            self.handle_exception(e)
-            
-    def do_POST(self):
-        """Serve a POST request."""
-        try:
-            length = self.headers.getheader('content-length') or "0"
-            try:
-                length = int(length)
-            except:
-                length = 0
-            content = self.rfile.read(length)
-            fields = parse_query(content)
-            f = self.send_head(fields)
-            if f:
-                self.copyfile(f, self.wfile)
-                f.close()
-        except Exception,e:
-            self.handle_exception(e)            
-
-    def log_message(self, format, *args):
-        if self.server.options.debug:
-            sys.stderr.write("%s: SERVER: %s - - [%s] %s\n" %
-                             (sys.argv[0],
-                              self.address_string(),
-                              self.log_date_time_string(),
-                              format%args))
-
-    def load_report(self, report):
-        path = os.path.join(self.server.root, 'report-%s.html'%report)
-        data = open(path).read()
-        keys = {}
-        for item in kBugKeyValueRE.finditer(data):
-            k,v = item.groups()
-            keys[k] = v
-        return keys
-
-    def load_crashes(self):
-        path = posixpath.join(self.server.root, 'index.html')
-        data = open(path).read()
-        problems = []
-        for item in kReportCrashEntryRE.finditer(data):
-            fieldData = item.group(1)
-            fields = dict([i.groups() for i in 
-                           kReportCrashEntryKeyValueRE.finditer(fieldData)])
-            problems.append(fields)
-        return problems
-
-    def handle_exception(self, exc):
-        import traceback
-        s = StringIO.StringIO()
-        print >>s, "INTERNAL ERROR\n"
-        traceback.print_exc(exc, s)
-        f = self.send_string(s.getvalue(), 'text/plain')
-        if f:
-            self.copyfile(f, self.wfile)
-            f.close()        
-            
-    def get_scalar_field(self, name):
-        if name in self.fields:
-            return self.fields[name][0]
-        else:
-            return None
-
-    def submit_bug(self, c):
-        title = self.get_scalar_field('title')
-        description = self.get_scalar_field('description')
-        report = self.get_scalar_field('report')
-        reporterIndex = self.get_scalar_field('reporter')
-        files = []
-        for fileID in self.fields.get('files',[]):
-            try:
-                i = int(fileID)
-            except:
-                i = None
-            if i is None or i<0 or i>=len(c.files):
-                return (False, 'Invalid file ID')
-            files.append(c.files[i])
-        
-        if not title:
-            return (False, "Missing title.")
-        if not description:
-            return (False, "Missing description.")
-        try:
-            reporterIndex = int(reporterIndex)
-        except:
-            return (False, "Invalid report method.")
-        
-        # Get the reporter and parameters.
-        reporter = self.server.reporters[reporterIndex]
-        parameters = {}
-        for o in reporter.getParameters():
-            name = '%s_%s'%(reporter.getName(),o.getName())
-            if name not in self.fields:
-                return (False, 
-                        'Missing field "%s" for %s report method.'%(name,
-                                                                    reporter.getName()))
-            parameters[o.getName()] = self.get_scalar_field(name)
-
-        # Update config defaults.
-        if report != 'None':
-            self.server.config.set('ScanView', 'reporter', reporterIndex)
-            for o in reporter.getParameters():
-              if o.saveConfigValue():
-                name = o.getName()
-                self.server.config.set(reporter.getName(), name, parameters[name])
-
-        # Create the report.
-        bug = Reporter.BugReport(title, description, files)
-
-        # Kick off a reporting thread.
-        t = ReporterThread(bug, reporter, parameters, self.server)
-        t.start()
-
-        # Wait for thread to die...
-        while t.isAlive():
-            time.sleep(.25)
-        submitStatus = t.status
-
-        return (t.success, t.status)
-
-    def send_report_submit(self):
-        report = self.get_scalar_field('report')
-        c = self.get_report_context(report)
-        if c.reportSource is None:
-            reportingFor = "Report Crashes > "
-            fileBug = """\
-<a href="/report_crashes">File Bug</a> > """%locals()
-        else:
-            reportingFor = '<a href="/%s">Report %s</a> > ' % (c.reportSource, 
-                                                                   report)
-            fileBug = '<a href="/report/%s">File Bug</a> > ' % report
-        title = self.get_scalar_field('title')
-        description = self.get_scalar_field('description')
-
-        res,message = self.submit_bug(c)
-
-        if res:
-            statusClass = 'SubmitOk'
-            statusName = 'Succeeded'
-        else:
-            statusClass = 'SubmitFail'
-            statusName = 'Failed'
-
-        result = """
-<head>
-  <title>Bug Submission</title>
-  <link rel="stylesheet" type="text/css" href="/scanview.css" />
-</head>
-<body>
-<h3>
-<a href="/">Summary</a> > 
-%(reportingFor)s
-%(fileBug)s
-Submit</h3>
-<form name="form" action="">
-<table class="form">
-<tr><td>
-<table class="form_group">
-<tr>
-  <td class="form_clabel">Title:</td>
-  <td class="form_value">
-    <input type="text" name="title" size="50" value="%(title)s" disabled>
-  </td>
-</tr>
-<tr>
-  <td class="form_label">Description:</td>
-  <td class="form_value">
-<textarea rows="10" cols="80" name="description" disabled>
-%(description)s
-</textarea>
-  </td>
-</table>
-</td></tr>
-</table>
-</form>
-<h1 class="%(statusClass)s">Submission %(statusName)s</h1>
-%(message)s
-<p>
-<hr>
-<a href="/">Return to Summary</a>
-</body>
-</html>"""%locals()
-        return self.send_string(result)
-
-    def send_open_report(self, report):
-        try:
-            keys = self.load_report(report)
-        except IOError:
-            return self.send_error(400, 'Invalid report.')
-
-        file = keys.get('FILE')
-        if not file or not posixpath.exists(file):
-            return self.send_error(400, 'File does not exist: "%s"' % file)
-
-        import startfile
-        if self.server.options.debug:
-            print >>sys.stderr, '%s: SERVER: opening "%s"'%(sys.argv[0],
-                                                            file)
-
-        status = startfile.open(file)
-        if status:
-            res = 'Opened: "%s"' % file
-        else:
-            res = 'Open failed: "%s"' % file
-
-        return self.send_string(res, 'text/plain')
-
-    def get_report_context(self, report):
-        class Context:
-            pass
-        if report is None or report == 'None':
-            data = self.load_crashes()
-            # Don't allow empty reports.
-            if not data:
-                raise ValueError, 'No crashes detected!'
-            c = Context()
-            c.title = 'clang static analyzer failures'
-
-            stderrSummary = ""
-            for item in data:
-                if 'stderr' in item:
-                    path = posixpath.join(self.server.root, item['stderr'])
-                    if os.path.exists(path):
-                        lns = itertools.islice(open(path), 0, 10)
-                        stderrSummary += '%s\n--\n%s' % (item.get('src', 
-                                                                  '<unknown>'),
-                                                         ''.join(lns))
-
-            c.description = """\
-The clang static analyzer failed on these inputs:
-%s
-
-STDERR Summary
---------------
-%s
-""" % ('\n'.join([item.get('src','<unknown>') for item in data]),
-       stderrSummary)
-            c.reportSource = None
-            c.navMarkup = "Report Crashes > "
-            c.files = []
-            for item in data:                
-                c.files.append(item.get('src',''))
-                c.files.append(posixpath.join(self.server.root,
-                                              item.get('file','')))
-                c.files.append(posixpath.join(self.server.root,
-                                              item.get('clangfile','')))
-                c.files.append(posixpath.join(self.server.root,
-                                              item.get('stderr','')))
-                c.files.append(posixpath.join(self.server.root,
-                                              item.get('info','')))
-            # Just in case something failed, ignore files which don't
-            # exist.
-            c.files = [f for f in c.files
-                       if os.path.exists(f) and os.path.isfile(f)]
-        else:
-            # Check that this is a valid report.            
-            path = posixpath.join(self.server.root, 'report-%s.html' % report)
-            if not posixpath.exists(path):
-                raise ValueError, 'Invalid report ID'
-            keys = self.load_report(report)
-            c = Context()
-            c.title = keys.get('DESC','clang error (unrecognized')
-            c.description = """\
-Bug reported by the clang static analyzer.
-
-Description: %s
-File: %s
-Line: %s
-"""%(c.title, keys.get('FILE','<unknown>'), keys.get('LINE', '<unknown>'))
-            c.reportSource = 'report-%s.html' % report
-            c.navMarkup = """<a href="/%s">Report %s</a> > """ % (c.reportSource,
-                                                                  report)
-
-            c.files = [path]
-        return c
-
-    def send_report(self, report, configOverrides=None):
-        def getConfigOption(section, field):            
-            if (configOverrides is not None and
-                section in configOverrides and
-                field in configOverrides[section]):
-                return configOverrides[section][field]
-            return self.server.config.get(section, field)
-
-        # report is None is used for crashes
-        try:
-            c = self.get_report_context(report)
-        except ValueError, e:
-            return self.send_error(400, e.message)
-
-        title = c.title
-        description= c.description
-        reportingFor = c.navMarkup
-        if c.reportSource is None:
-            extraIFrame = ""
-        else:
-            extraIFrame = """\
-<iframe src="/%s" width="100%%" height="40%%"
-        scrolling="auto" frameborder="1">
-  <a href="/%s">View Bug Report</a>
-</iframe>""" % (c.reportSource, c.reportSource)
-
-        reporterSelections = []
-        reporterOptions = []
-
-        try:
-            active = int(getConfigOption('ScanView','reporter'))
-        except:
-            active = 0
-        for i,r in enumerate(self.server.reporters):
-            selected = (i == active)
-            if selected:
-                selectedStr = ' selected'
-            else:
-                selectedStr = ''
-            reporterSelections.append('<option value="%d"%s>%s</option>'%(i,selectedStr,r.getName()))
-            options = '\n'.join([ o.getHTML(r,title,getConfigOption) for o in r.getParameters()])
-            display = ('none','')[selected]
-            reporterOptions.append("""\
-<tr id="%sReporterOptions" style="display:%s">
-  <td class="form_label">%s Options</td>
-  <td class="form_value">
-    <table class="form_inner_group">
-%s
-    </table>
-  </td>
-</tr>
-"""%(r.getName(),display,r.getName(),options))
-        reporterSelections = '\n'.join(reporterSelections)
-        reporterOptionsDivs = '\n'.join(reporterOptions)
-        reportersArray = '[%s]'%(','.join([`r.getName()` for r in self.server.reporters]))
-
-        if c.files:
-            fieldSize = min(5, len(c.files))
-            attachFileOptions = '\n'.join(["""\
-<option value="%d" selected>%s</option>""" % (i,v) for i,v in enumerate(c.files)])
-            attachFileRow = """\
-<tr>
-  <td class="form_label">Attach:</td>
-  <td class="form_value">
-<select style="width:100%%" name="files" multiple size=%d>
-%s
-</select>
-  </td>
-</tr>
-""" % (min(5, len(c.files)), attachFileOptions)
-        else:
-            attachFileRow = ""
-
-        result = """<html>
-<head>
-  <title>File Bug</title>
-  <link rel="stylesheet" type="text/css" href="/scanview.css" />
-</head>
-<script language="javascript" type="text/javascript">
-var reporters = %(reportersArray)s;
-function updateReporterOptions() {
-  index = document.getElementById('reporter').selectedIndex;
-  for (var i=0; i < reporters.length; ++i) {
-    o = document.getElementById(reporters[i] + "ReporterOptions");
-    if (i == index) {
-      o.style.display = "";
-    } else {
-      o.style.display = "none";
-    }
-  }
-}
-</script>
-<body onLoad="updateReporterOptions()">
-<h3>
-<a href="/">Summary</a> > 
-%(reportingFor)s
-File Bug</h3>
-<form name="form" action="/report_submit" method="post">
-<input type="hidden" name="report" value="%(report)s">
-
-<table class="form">
-<tr><td>
-<table class="form_group">
-<tr>
-  <td class="form_clabel">Title:</td>
-  <td class="form_value">
-    <input type="text" name="title" size="50" value="%(title)s">
-  </td>
-</tr>
-<tr>
-  <td class="form_label">Description:</td>
-  <td class="form_value">
-<textarea rows="10" cols="80" name="description">
-%(description)s
-</textarea>
-  </td>
-</tr>
-
-%(attachFileRow)s
-
-</table>
-<br>
-<table class="form_group">
-<tr>
-  <td class="form_clabel">Method:</td>
-  <td class="form_value">
-    <select id="reporter" name="reporter" onChange="updateReporterOptions()">
-    %(reporterSelections)s
-    </select>
-  </td>
-</tr>
-%(reporterOptionsDivs)s
-</table>
-<br>
-</td></tr>
-<tr><td class="form_submit">
-  <input align="right" type="submit" name="Submit" value="Submit">
-</td></tr>
-</table>
-</form>
-
-%(extraIFrame)s
-
-</body>
-</html>"""%locals()
-
-        return self.send_string(result)
-
-    def send_head(self, fields=None):
-        if (self.server.options.onlyServeLocal and
-            self.client_address[0] != '127.0.0.1'):
-            return self.send_error(401, 'Unauthorized host.')
-
-        if fields is None:
-            fields = {}
-        self.fields = fields
-
-        o = urlparse.urlparse(self.path)
-        self.fields = parse_query(o.query, fields)
-        path = posixpath.normpath(urllib.unquote(o.path))
-
-        # Split the components and strip the root prefix.
-        components = path.split('/')[1:]
-        
-        # Special case some top-level entries.
-        if components:
-            name = components[0]
-            if len(components)==2:
-                if name=='report':
-                    return self.send_report(components[1])
-                elif name=='open':
-                    return self.send_open_report(components[1])
-            elif len(components)==1:
-                if name=='quit':
-                    self.server.halt()
-                    return self.send_string('Goodbye.', 'text/plain')
-                elif name=='report_submit':
-                    return self.send_report_submit()
-                elif name=='report_crashes':
-                    overrides = { 'ScanView' : {},
-                                  'Radar' : {},
-                                  'Email' : {} }
-                    for i,r in enumerate(self.server.reporters):
-                        if r.getName() == 'Radar':
-                            overrides['ScanView']['reporter'] = i
-                            break
-                    overrides['Radar']['Component'] = 'llvm - checker'
-                    overrides['Radar']['Component Version'] = 'X'
-                    return self.send_report(None, overrides)
-                elif name=='favicon.ico':
-                    return self.send_path(posixpath.join(kShare,'bugcatcher.ico'))
-        
-        # Match directory entries.
-        if components[-1] == '':
-            components[-1] = 'index.html'
-
-        relpath = '/'.join(components)
-        path = posixpath.join(self.server.root, relpath)
-
-        if self.server.options.debug > 1:
-            print >>sys.stderr, '%s: SERVER: sending path "%s"'%(sys.argv[0],
-                                                                 path)
-        return self.send_path(path)
-
-    def send_404(self):
-        self.send_error(404, "File not found")
-        return None
-
-    def send_path(self, path):
-        # If the requested path is outside the root directory, do not open it
-        rel = os.path.abspath(path)
-        if not rel.startswith(os.path.abspath(self.server.root)):
-          return self.send_404()
-        
-        ctype = self.guess_type(path)
-        if ctype.startswith('text/'):
-            # Patch file instead
-            return self.send_patched_file(path, ctype)
-        else:
-            mode = 'rb'
-        try:
-            f = open(path, mode)
-        except IOError:
-            return self.send_404()
-        return self.send_file(f, ctype)
-
-    def send_file(self, f, ctype):
-        # Patch files to add links, but skip binary files.
-        self.send_response(200)
-        self.send_header("Content-type", ctype)
-        fs = os.fstat(f.fileno())
-        self.send_header("Content-Length", str(fs[6]))
-        self.send_header("Last-Modified", self.date_time_string(fs.st_mtime))
-        self.end_headers()
-        return f
-
-    def send_string(self, s, ctype='text/html', headers=True, mtime=None):
-        if headers:
-            self.send_response(200)
-            self.send_header("Content-type", ctype)
-            self.send_header("Content-Length", str(len(s)))
-            if mtime is None:
-                mtime = self.dynamic_mtime
-            self.send_header("Last-Modified", self.date_time_string(mtime))
-            self.end_headers()
-        return StringIO.StringIO(s)
-
-    def send_patched_file(self, path, ctype):
-        # Allow a very limited set of variables. This is pretty gross.
-        variables = {}
-        variables['report'] = ''
-        m = kReportFileRE.match(path)
-        if m:
-            variables['report'] = m.group(2)
-
-        try:
-            f = open(path,'r')
-        except IOError:
-            return self.send_404()
-        fs = os.fstat(f.fileno())
-        data = f.read()
-        for a,b in kReportReplacements:
-            data = a.sub(b % variables, data)
-        return self.send_string(data, ctype, mtime=fs.st_mtime)
-
-
-def create_server(address, options, root):
-    import Reporter
-
-    reporters = Reporter.getReporters()
-
-    return ScanViewServer(address, ScanViewRequestHandler,
-                          root,
-                          reporters,
-                          options)

Modified: cfe/trunk/tools/scan-view/scan-view
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/scan-view/scan-view?rev=253068&r1=253067&r2=253068&view=diff
==============================================================================
--- cfe/trunk/tools/scan-view/scan-view (original)
+++ cfe/trunk/tools/scan-view/scan-view Fri Nov 13 13:56:07 2015
@@ -4,6 +4,8 @@
 """
 
 import sys
+import imp
+import os
 import posixpath
 import thread
 import time
@@ -54,6 +56,7 @@ def start_browser(port, options):
     webbrowser.open(url)
 
 def run(port, options, root):
+    sys.path.append(os.path.dirname(__file__) + "/../share/scan-view")
     import ScanView
     try:
         print 'Starting scan-view at: http://%s:%d'%(options.host,

Removed: cfe/trunk/tools/scan-view/startfile.py
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/scan-view/startfile.py?rev=253067&view=auto
==============================================================================
--- cfe/trunk/tools/scan-view/startfile.py (original)
+++ cfe/trunk/tools/scan-view/startfile.py (removed)
@@ -1,203 +0,0 @@
-"""Utility for opening a file using the default application in a cross-platform
-manner. Modified from http://code.activestate.com/recipes/511443/.
-"""
-
-__version__ = '1.1x'
-__all__ = ['open']
-
-import os
-import sys
-import webbrowser
-import subprocess
-
-_controllers = {}
-_open = None
-
-
-class BaseController(object):
-    '''Base class for open program controllers.'''
-
-    def __init__(self, name):
-        self.name = name
-
-    def open(self, filename):
-        raise NotImplementedError
-
-
-class Controller(BaseController):
-    '''Controller for a generic open program.'''
-
-    def __init__(self, *args):
-        super(Controller, self).__init__(os.path.basename(args[0]))
-        self.args = list(args)
-
-    def _invoke(self, cmdline):
-        if sys.platform[:3] == 'win':
-            closefds = False
-            startupinfo = subprocess.STARTUPINFO()
-            startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW
-        else:
-            closefds = True
-            startupinfo = None
-
-        if (os.environ.get('DISPLAY') or sys.platform[:3] == 'win' or
-                                                    sys.platform == 'darwin'):
-            inout = file(os.devnull, 'r+')
-        else:
-            # for TTY programs, we need stdin/out
-            inout = None
-
-        # if possible, put the child precess in separate process group,
-        # so keyboard interrupts don't affect child precess as well as
-        # Python
-        setsid = getattr(os, 'setsid', None)
-        if not setsid:
-            setsid = getattr(os, 'setpgrp', None)
-
-        pipe = subprocess.Popen(cmdline, stdin=inout, stdout=inout,
-                                stderr=inout, close_fds=closefds,
-                                preexec_fn=setsid, startupinfo=startupinfo)
-
-        # It is assumed that this kind of tools (gnome-open, kfmclient,
-        # exo-open, xdg-open and open for OSX) immediately exit after lauching
-        # the specific application
-        returncode = pipe.wait()
-        if hasattr(self, 'fixreturncode'):
-            returncode = self.fixreturncode(returncode)
-        return not returncode
-
-    def open(self, filename):
-        if isinstance(filename, basestring):
-            cmdline = self.args + [filename]
-        else:
-            # assume it is a sequence
-            cmdline = self.args + filename
-        try:
-            return self._invoke(cmdline)
-        except OSError:
-            return False
-
-
-# Platform support for Windows
-if sys.platform[:3] == 'win':
-
-    class Start(BaseController):
-        '''Controller for the win32 start progam through os.startfile.'''
-
-        def open(self, filename):
-            try:
-                os.startfile(filename)
-            except WindowsError:
-                # [Error 22] No application is associated with the specified
-                # file for this operation: '<URL>'
-                return False
-            else:
-                return True
-
-    _controllers['windows-default'] = Start('start')
-    _open = _controllers['windows-default'].open
-
-
-# Platform support for MacOS
-elif sys.platform == 'darwin':
-    _controllers['open']= Controller('open')
-    _open = _controllers['open'].open
-
-
-# Platform support for Unix
-else:
-
-    import commands
-
-    # @WARNING: use the private API of the webbrowser module
-    from webbrowser import _iscommand
-
-    class KfmClient(Controller):
-        '''Controller for the KDE kfmclient program.'''
-
-        def __init__(self, kfmclient='kfmclient'):
-            super(KfmClient, self).__init__(kfmclient, 'exec')
-            self.kde_version = self.detect_kde_version()
-
-        def detect_kde_version(self):
-            kde_version = None
-            try:
-                info = commands.getoutput('kde-config --version')
-
-                for line in info.splitlines():
-                    if line.startswith('KDE'):
-                        kde_version = line.split(':')[-1].strip()
-                        break
-            except (OSError, RuntimeError):
-                pass
-
-            return kde_version
-
-        def fixreturncode(self, returncode):
-            if returncode is not None and self.kde_version > '3.5.4':
-                return returncode
-            else:
-                return os.EX_OK
-
-    def detect_desktop_environment():
-        '''Checks for known desktop environments
-
-        Return the desktop environments name, lowercase (kde, gnome, xfce)
-        or "generic"
-
-        '''
-
-        desktop_environment = 'generic'
-
-        if os.environ.get('KDE_FULL_SESSION') == 'true':
-            desktop_environment = 'kde'
-        elif os.environ.get('GNOME_DESKTOP_SESSION_ID'):
-            desktop_environment = 'gnome'
-        else:
-            try:
-                info = commands.getoutput('xprop -root _DT_SAVE_MODE')
-                if ' = "xfce4"' in info:
-                    desktop_environment = 'xfce'
-            except (OSError, RuntimeError):
-                pass
-
-        return desktop_environment
-
-
-    def register_X_controllers():
-        if _iscommand('kfmclient'):
-            _controllers['kde-open'] = KfmClient()
-
-        for command in ('gnome-open', 'exo-open', 'xdg-open'):
-            if _iscommand(command):
-                _controllers[command] = Controller(command)
-
-    def get():
-        controllers_map = {
-            'gnome': 'gnome-open',
-            'kde': 'kde-open',
-            'xfce': 'exo-open',
-        }
-
-        desktop_environment = detect_desktop_environment()
-
-        try:
-            controller_name = controllers_map[desktop_environment]
-            return _controllers[controller_name].open
-
-        except KeyError:
-            if _controllers.has_key('xdg-open'):
-                return _controllers['xdg-open'].open
-            else:
-                return webbrowser.open
-
-
-    if os.environ.get("DISPLAY"):
-        register_X_controllers()
-    _open = get()
-
-
-def open(filename):
-    '''Open a file or an URL in the registered default application.'''
-
-    return _open(filename)




More information about the cfe-commits mailing list