diff --git a/infer/lib/python/inferlib/bucklib.py b/infer/lib/python/inferlib/bucklib.py index 87955ad1d..a341b61a6 100644 --- a/infer/lib/python/inferlib/bucklib.py +++ b/infer/lib/python/inferlib/bucklib.py @@ -142,18 +142,29 @@ def get_output_jars(targets): return filter(os.path.isfile, classpath_jars) +def get_key(e): + return (e[issues.JSON_INDEX_FILENAME], e[issues.JSON_INDEX_TYPE], + e[issues.JSON_INDEX_LINE], e[issues.JSON_INDEX_QUALIFIER]) + + +def merge_reports(report, collected): + for e in report: + key = get_key(e) + if key not in collected: + collected[key] = e + + def collect_results(args, start_time, targets): """Walks through buck-out/, collects results for the different buck targets and stores them in in args.infer_out/results.json. """ - all_json_rows = [] + collected_reports = {} for path in get_output_jars(targets): try: with zipfile.ZipFile(path) as jar: - json_rows = load_json_report(jar) - for row in json_rows: - all_json_rows.append(row) + report = load_json_report(jar) + merge_reports(report, collected_reports) except NotFoundInJar: pass except zipfile.BadZipfile: @@ -162,7 +173,7 @@ def collect_results(args, start_time, targets): json_report = os.path.join(args.infer_out, config.JSON_REPORT_FILENAME) with open(json_report, 'w') as file_out: - json.dump(all_json_rows, file_out) + json.dump(collected_reports.values(), file_out) bugs_out = os.path.join(args.infer_out, config.BUGS_FILENAME) issues.print_and_save_errors(args.infer_out, args.project_root,