#!/usr/bin/python

'''
Copyright 2013 Google Inc.

Use of this source code is governed by a BSD-style license that can be
found in the LICENSE file.
'''

'''
Rewrites a JSON file to use Python's standard JSON pretty-print format,
so that subsequent runs of rebaseline.py will generate useful diffs
(only the actual checksum differences will show up as diffs, not obscured
by format differences).

Should not modify the JSON contents in any meaningful way.
'''

# System-level imports
import argparse
import os
import sys

# Imports from within Skia
#
# We need to add the 'gm' directory, so that we can import gm_json.py within
# that directory.  That script allows us to parse the actual-results.json file
# written out by the GM tool.
# Make sure that the 'gm' dir is in the PYTHONPATH, but add it at the *end*
# so any dirs that are already in the PYTHONPATH will be preferred.
#
# This assumes that the 'gm' directory has been checked out as a sibling of
# the 'tools' directory containing this script, which will be the case if
# 'trunk' was checked out as a single unit.
GM_DIRECTORY = os.path.realpath(
    os.path.join(os.path.dirname(os.path.dirname(__file__)), 'gm'))
if GM_DIRECTORY not in sys.path:
    sys.path.append(GM_DIRECTORY)
import gm_json

def Reformat(filename):
  print 'Reformatting file %s...' % filename
  gm_json.WriteToFile(gm_json.LoadFromFile(filename), filename)

def _Main():
  parser = argparse.ArgumentParser(description='Reformat JSON files in-place.')
  parser.add_argument('filenames', metavar='FILENAME', nargs='+',
                      help='file to reformat')
  args = parser.parse_args()
  for filename in args.filenames:
    Reformat(filename)
  sys.exit(0)

if __name__ == '__main__':
    _Main()
