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