| #!/usr/bin/env python |
| """A command line utility to merge two JSON files. |
| |
| This is a python program that merges two JSON files into a single one. The |
| intended use for this is to combine generated 'compile_commands.json' files |
| created by CMake when performing an LLVM runtime build. |
| """ |
| |
| import argparse |
| import json |
| import sys |
| |
| |
| def main(): |
| parser = argparse.ArgumentParser(description=__doc__) |
| parser.add_argument( |
| "-o", |
| type=str, |
| help="The output file to write JSON data to", |
| default=None, |
| nargs="?", |
| ) |
| parser.add_argument( |
| "json_files", type=str, nargs="+", help="Input JSON files to merge" |
| ) |
| args = parser.parse_args() |
| |
| merged_data = [] |
| |
| for json_file in args.json_files: |
| try: |
| with open(json_file, "r") as f: |
| data = json.load(f) |
| merged_data.extend(data) |
| except (IOError, json.JSONDecodeError) as e: |
| continue |
| |
| # Deduplicate by converting each entry to a tuple of sorted key-value pairs |
| unique_data = list({json.dumps(entry, sort_keys=True) for entry in merged_data}) |
| unique_data = [json.loads(entry) for entry in unique_data] |
| |
| with open(args.o, "w") as f: |
| json.dump(unique_data, f, indent=2) |
| |
| |
| if __name__ == "__main__": |
| main() |