def parse_plist(path): """ Parse the reports from a plist file. One plist file can contain multiple reports. """ LOG.debug("Parsing plist: " + path) reports = [] files = [] try: plist = plistlib.readPlist(path) files = plist['files'] for diag in plist['diagnostics']: available_keys = diag.keys() main_section = {} for key in available_keys: # Skip path it is handled separately. if key != 'path': main_section.update({key: diag[key]}) # We need to extend information for plist files generated # by older clang version (before 3.7). main_section['check_name'] = get_checker_name(diag, path) # We need to extend information for plist files generated # by older clang version (before 3.8). main_section['issue_hash_content_of_line_in_context'] = \ get_report_hash(diag, files[diag['location']['file']]) bug_path_items = [item for item in diag['path']] report = Report(main_section, bug_path_items) reports.append(report) except ExpatError as err: LOG.error('Failed to process plist file: ' + path + ' wrong file format?') LOG.error(err) except AttributeError as ex: LOG.error('Failed to get important report data from plist.') LOG.error(ex) except IndexError as iex: LOG.error('Indexing error during processing plist file ' + path) LOG.error(type(iex)) LOG.error(repr(iex)) _, _, exc_traceback = sys.exc_info() traceback.print_tb(exc_traceback, limit=1, file=sys.stdout) except Exception as ex: LOG.error('Error during processing reports from the plist file: ' + path) traceback.print_exc() LOG.error(type(ex)) LOG.error(ex) finally: return files, reports
def skip_html_report_data_handler(report_hash, source_file, report_line, checker_name, diag, files): """ Report handler which skips bugs which were suppressed by source code comments. """ report = Report(None, diag['path'], files) path_hash = get_report_path_hash(report, files) if path_hash in processed_path_hashes: LOG.debug("Skip report because it is a deduplication of an " "already processed report!") LOG.debug("Path hash: %s", path_hash) LOG.debug(diag) return True skip = plist_parser.skip_report(report_hash, source_file, report_line, checker_name, suppr_handler) if not skip: processed_path_hashes.add(path_hash) return skip
def parse_plist(path, source_root=None, allow_plist_update=True): """ Parse the reports from a plist file. One plist file can contain multiple reports. """ LOG.debug("Parsing plist: " + path) reports = [] files = [] try: plist = plistlib.readPlist(path) files = plist['files'] diag_changed = False for diag in plist['diagnostics']: available_keys = diag.keys() main_section = {} for key in available_keys: # Skip path it is handled separately. if key != 'path': main_section.update({key: diag[key]}) # We need to extend information for plist files generated # by older clang version (before 3.7). main_section['check_name'] = get_checker_name(diag, path) # We need to extend information for plist files generated # by older clang version (before 3.8). file_path = files[diag['location']['file']] if source_root: file_path = os.path.join(source_root, file_path.lstrip('/')) report_hash = get_report_hash(diag, file_path) main_section['issue_hash_content_of_line_in_context'] = \ report_hash if 'issue_hash_content_of_line_in_context' not in diag: # If the report hash was not in the plist, we set it in the # diagnostic section for later update. diag['issue_hash_content_of_line_in_context'] = report_hash diag_changed = True bug_path_items = [item for item in diag['path']] report = Report(main_section, bug_path_items, files) reports.append(report) if diag_changed and allow_plist_update: # If the diagnostic section has changed we update the plist file. # This way the client will always send a plist file where the # report hash field is filled. plistlib.writePlist(plist, path) except (ExpatError, TypeError, AttributeError) as err: LOG.warning('Failed to process plist file: %s wrong file format?', path) LOG.warning(err) except IndexError as iex: LOG.warning('Indexing error during processing plist file %s', path) LOG.warning(type(iex)) LOG.warning(repr(iex)) _, _, exc_traceback = sys.exc_info() traceback.print_tb(exc_traceback, limit=1, file=sys.stdout) except Exception as ex: LOG.warning('Error during processing reports from the plist file: %s', path) traceback.print_exc() LOG.warning(type(ex)) LOG.warning(ex) finally: return files, reports