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