xref: /llvm-project/llvm/utils/merge-json.py (revision 2072ec1ff957cb08a054e5ce7a1e916232d3bc6b)
1*4148aa63SJoseph Huber#!/usr/bin/env python
2*4148aa63SJoseph Huber"""A command line utility to merge two JSON files.
3*4148aa63SJoseph Huber
4*4148aa63SJoseph HuberThis is a python program that merges two JSON files into a single one. The
5*4148aa63SJoseph Huberintended use for this is to combine generated 'compile_commands.json' files
6*4148aa63SJoseph Hubercreated by CMake when performing an LLVM runtime build.
7*4148aa63SJoseph Huber"""
8*4148aa63SJoseph Huber
9*4148aa63SJoseph Huberimport argparse
10*4148aa63SJoseph Huberimport json
11*4148aa63SJoseph Huberimport sys
12*4148aa63SJoseph Huber
13*4148aa63SJoseph Huber
14*4148aa63SJoseph Huberdef main():
15*4148aa63SJoseph Huber    parser = argparse.ArgumentParser(description=__doc__)
16*4148aa63SJoseph Huber    parser.add_argument(
17*4148aa63SJoseph Huber        "-o",
18*4148aa63SJoseph Huber        type=str,
19*4148aa63SJoseph Huber        help="The output file to write JSON data to",
20*4148aa63SJoseph Huber        default=None,
21*4148aa63SJoseph Huber        nargs="?",
22*4148aa63SJoseph Huber    )
23*4148aa63SJoseph Huber    parser.add_argument(
24*4148aa63SJoseph Huber        "json_files", type=str, nargs="+", help="Input JSON files to merge"
25*4148aa63SJoseph Huber    )
26*4148aa63SJoseph Huber    args = parser.parse_args()
27*4148aa63SJoseph Huber
28*4148aa63SJoseph Huber    merged_data = []
29*4148aa63SJoseph Huber
30*4148aa63SJoseph Huber    for json_file in args.json_files:
31*4148aa63SJoseph Huber        try:
32*4148aa63SJoseph Huber            with open(json_file, "r") as f:
33*4148aa63SJoseph Huber                data = json.load(f)
34*4148aa63SJoseph Huber                merged_data.extend(data)
35*4148aa63SJoseph Huber        except (IOError, json.JSONDecodeError) as e:
36*4148aa63SJoseph Huber            continue
37*4148aa63SJoseph Huber
38*4148aa63SJoseph Huber    # Deduplicate by converting each entry to a tuple of sorted key-value pairs
39*4148aa63SJoseph Huber    unique_data = list({json.dumps(entry, sort_keys=True) for entry in merged_data})
40*4148aa63SJoseph Huber    unique_data = [json.loads(entry) for entry in unique_data]
41*4148aa63SJoseph Huber
42*4148aa63SJoseph Huber    with open(args.o, "w") as f:
43*4148aa63SJoseph Huber        json.dump(unique_data, f, indent=2)
44*4148aa63SJoseph Huber
45*4148aa63SJoseph Huber
46*4148aa63SJoseph Huberif __name__ == "__main__":
47*4148aa63SJoseph Huber    main()
48