1d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#!/usr/bin/python
2d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)# Copyright 2013 The Chromium Authors. All rights reserved.
3d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)# Use of this source code is governed by a BSD-style license that can be
4d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)# found in the LICENSE file.
5d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
6d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)# This script can either source a file and dump the enironment changes done by
7d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)# it, or just simply dump the current environment as JSON into a file.
8d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
9d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)import json
10d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)import optparse
11d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)import os
12d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)import pipes
13d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)import subprocess
14d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)import sys
15d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
16d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
17d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)def main():
18d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  parser = optparse.OptionParser()
19d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  parser.add_option('-f', '--output-json',
20d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                    help='File to dump the environment as JSON into.')
21d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  parser.add_option(
22d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      '-d', '--dump-mode', action='store_true',
23d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      help='Dump the environment to sys.stdout and exit immediately.')
24d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
2568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  parser.disable_interspersed_args()
26d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  options, args = parser.parse_args()
27d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  if options.dump_mode:
28d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    if args or options.output_json:
29d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      parser.error('Cannot specify args or --output-json with --dump-mode.')
30d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    json.dump(dict(os.environ), sys.stdout)
31d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  else:
32d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    if not options.output_json:
33d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      parser.error('Requires --output-json option.')
34d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
35d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    envsetup_cmd = ' '.join(map(pipes.quote, args))
36d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    full_cmd = [
37d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        'bash', '-c',
38d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        '. %s > /dev/null; %s -d' % (envsetup_cmd, os.path.abspath(__file__))
39d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    ]
40d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    try:
41d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      output = subprocess.check_output(full_cmd)
42d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    except Exception as e:
43d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      sys.exit('Error running %s and dumping environment.' % envsetup_cmd)
44d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
45d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    env_diff = {}
46d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    new_env = json.loads(output)
47d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    for k, val in new_env.items():
48d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      if k == '_' or (k in os.environ and os.environ[k] == val):
49d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        continue
50d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      env_diff[k] = val
51d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    with open(options.output_json, 'w') as f:
52d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      json.dump(env_diff, f)
53d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
54d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
55d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)if __name__ == '__main__':
56d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  sys.exit(main())
57