Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 03aaa7e2 authored by Sam Saccone's avatar Sam Saccone Committed by Chih-Hung Hsieh
Browse files

Add the ability to save off the CSV to a file.

While we are generating the html file also expose a way for a user to
save off a csv file. This prevents having to run the tool twice.

* Add a new flag called csvpath that takes a file path for the csv dump.
* Use csv.writer to simply print formats.
* Modify the dump_csv and count_severity to take a csv writer.

Test: run with a build.log file, compare before and after html/csv dumps.
Change-Id: I27ed730625a352fdc3fb2928433eb5e8b2ea229c
parent 2d6e79d2
Loading
Loading
Loading
Loading
+20 −24
Original line number Diff line number Diff line
@@ -73,14 +73,9 @@ Use option --gencsv to output warning counts in CSV format.
# New dynamic HTML related function to emit data:
#   escape_string, strip_escape_string, emit_warning_arrays
#   emit_js_data():
#
# To emit csv files of warning message counts:
#   flag --gencsv
#   description_for_csv, string_for_csv:
#   count_severity(sev, kind):
#   dump_csv():

import argparse
import csv
import multiprocessing
import os
import re
@@ -88,6 +83,9 @@ import signal
import sys

parser = argparse.ArgumentParser(description='Convert a build log into HTML')
parser.add_argument('--csvpath',
                    help='Save CSV warning file to the passed absolute path',
                    default=None)
parser.add_argument('--gencsv',
                    help='Generate a CSV file with number of various warnings',
                    action='store_true',
@@ -2672,48 +2670,46 @@ def description_for_csv(category):
  return category['description']


def string_for_csv(s):
  # Only some Java warning desciptions have used quotation marks.
  # TODO(chh): if s has double quote character, s should be quoted.
  if ',' in s:
    # TODO(chh): replace a double quote with two double quotes in s.
    return '"{}"'.format(s)
  return s


def count_severity(sev, kind):
def count_severity(writer, sev, kind):
  """Count warnings of given severity."""
  total = 0
  for i in warn_patterns:
    if i['severity'] == sev and i['members']:
      n = len(i['members'])
      total += n
      warning = string_for_csv(kind + ': ' + description_for_csv(i))
      print '{},,{}'.format(n, warning)
      warning = kind + ': ' + description_for_csv(i)
      writer.writerow([n, '', warning])
      # print number of warnings for each project, ordered by project name.
      projects = i['projects'].keys()
      projects.sort()
      for p in projects:
        print '{},{},{}'.format(i['projects'][p], p, warning)
  print '{},,{}'.format(total, kind + ' warnings')
        writer.writerow([i['projects'][p], p, warning])
  writer.writerow([total, '', kind + ' warnings'])

  return total


# dump number of warnings in csv format to stdout
def dump_csv():
def dump_csv(writer):
  """Dump number of warnings in csv format to stdout."""
  sort_warnings()
  total = 0
  for s in Severity.range:
    total += count_severity(s, Severity.column_headers[s])
  print '{},,{}'.format(total, 'All warnings')
    total += count_severity(writer, s, Severity.column_headers[s])
  writer.writerow([total, '', 'All warnings'])


def main():
  warning_lines = parse_input_file(open(args.buildlog, 'r'))
  parallel_classify_warnings(warning_lines)
  # If a user pases a csv path, save the fileoutput to the path
  # If the user also passed gencsv write the output to stdout
  # If the user did not pass gencsv flag dump the html report to stdout.
  if args.csvpath:
    with open(args.csvpath, 'w') as f:
      dump_csv(csv.writer(f, lineterminator='\n'))
  if args.gencsv:
    dump_csv()
    dump_csv(csv.writer(sys.stdout, lineterminator='\n'))
  else:
    dump_html()