|
|
|
#!/usr/bin/env python3
|
|
|
|
|
|
|
|
# Copyright (c) 2017-present, Facebook, Inc.
|
|
|
|
#
|
|
|
|
# This source code is licensed under the MIT license found in the
|
|
|
|
# LICENSE file in the root directory of this source tree.
|
|
|
|
|
|
|
|
import argparse
|
|
|
|
import json
|
|
|
|
|
|
|
|
|
|
|
|
def load_report(report_filename):
|
|
|
|
with open(report_filename, 'r') as file_in:
|
|
|
|
return json.load(file_in)
|
|
|
|
|
|
|
|
|
|
|
|
def compute_duplicates(report):
|
|
|
|
table = {}
|
|
|
|
for e in report:
|
|
|
|
bug_hash = e['hash']
|
|
|
|
if bug_hash in table:
|
|
|
|
table[bug_hash].append(e)
|
|
|
|
else:
|
|
|
|
table[bug_hash] = [e]
|
|
|
|
duplicates = []
|
|
|
|
for value in table.values():
|
|
|
|
if len(value) > 1:
|
|
|
|
duplicates += value
|
|
|
|
return duplicates
|
|
|
|
|
|
|
|
|
|
|
|
def save_duplicates(duplicates, output_filename):
|
|
|
|
duplicated_types = {}
|
|
|
|
for e in duplicates:
|
|
|
|
bug_type = e['bug_type']
|
|
|
|
if bug_type in duplicated_types:
|
|
|
|
duplicated_types[bug_type] += 1
|
|
|
|
else:
|
|
|
|
duplicated_types[bug_type] = 1
|
|
|
|
for bug_type, count in duplicated_types.items():
|
|
|
|
print('{} -> {}'.format(bug_type, count))
|
|
|
|
with open(output_filename, 'w') as file_out:
|
|
|
|
json.dump(duplicates, file_out, indent=2, separators=(',', ': '))
|
|
|
|
|
|
|
|
|
|
|
|
cli_parser = argparse.ArgumentParser()
|
|
|
|
cli_parser.add_argument('--report', type=str, required=True,
|
|
|
|
help='Infer report')
|
|
|
|
cli_parser.add_argument('--out', type=str, required=True,
|
|
|
|
help='Output list of duplicates (in JSON)')
|
|
|
|
|
|
|
|
|
|
|
|
if __name__ == '__main__':
|
|
|
|
args = cli_parser.parse_args()
|
|
|
|
report = load_report(args.report)
|
|
|
|
duplicates = compute_duplicates(report)
|
|
|
|
save_duplicates(duplicates, args.out)
|