#!/usr/bin/env python
# Copyright 2013 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

# This script can either source a file and dump the enironment changes done by
# it, or just simply dump the current environment as JSON into a file.

import json
import optparse
import os
import pipes
import subprocess
import sys


def main():
  parser = optparse.OptionParser()
  parser.add_option('-f', '--output-json',
                    help='File to dump the environment as JSON into.')
  parser.add_option(
      '-d', '--dump-mode', action='store_true',
      help='Dump the environment to sys.stdout and exit immediately.')

  parser.disable_interspersed_args()
  options, args = parser.parse_args()
  if options.dump_mode:
    if args or options.output_json:
      parser.error('Cannot specify args or --output-json with --dump-mode.')
    json.dump(dict(os.environ), sys.stdout)
  else:
    if not options.output_json:
      parser.error('Requires --output-json option.')

    envsetup_cmd = ' '.join(map(pipes.quote, args))
    full_cmd = [
        'bash', '-c',
        '. %s > /dev/null; %s -d' % (envsetup_cmd, os.path.abspath(__file__))
    ]
    try:
      output = subprocess.check_output(full_cmd)
    except Exception as e:
      sys.exit('Error running %s and dumping environment.' % envsetup_cmd)

    env_diff = {}
    new_env = json.loads(output)
    for k, val in new_env.items():
      if k == '_' or (k in os.environ and os.environ[k] == val):
        continue
      env_diff[k] = val
    with open(options.output_json, 'w') as f:
      json.dump(env_diff, f)


if __name__ == '__main__':
  sys.exit(main())
