blob: 06bf27f46f99ce0890b1f4d786b16624dc7d4b39 [file] [log] [blame]
#!/usr/bin/env fuchsia-vendored-python
# Copyright 2019 The Fuchsia Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
import difflib
import json
import sys
def usage():
print(
"Usage:\n"
" diff_json.py FILE1 FILE2 OUTPUT\n"
" Generates canonical json text for FILE1 and FILE2, then does a normal text comparison,\n"
" writing the diff output to OUTPUT."
)
def main():
if len(sys.argv) != 4:
usage()
exit(-1)
try:
with open(sys.argv[1], "r") as file1:
with open(sys.argv[2], "r") as file2:
with open(sys.argv[3], "w") as result:
json1 = json.load(file1)
json2 = json.load(file2)
canon1 = json.dumps(
json1, sort_keys=True, indent=2
).splitlines()
canon2 = json.dumps(
json2, sort_keys=True, indent=2
).splitlines()
diff = difflib.unified_diff(
canon1, canon2, sys.argv[1], sys.argv[2], lineterm=""
)
diffstr = "\n".join(diff)
result.write(diffstr)
if len(diffstr) != 0:
print(
f"Error: non-empty diff between canonical json representations:\n{diffstr}"
)
exit(-4)
except IOError as e:
print(f"Error accessing files: {e}")
usage()
exit(-2)
except ValueError as e:
print(f"Error decoding json: {e}")
exit(-3)
if __name__ == "__main__":
sys.exit(main())