| #!/usr/bin/env python | 
 | # Copyright (c) 2012 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. | 
 |  | 
 | import os | 
 | import sys | 
 |  | 
 | def Main(argv): | 
 |   """This is like 'env -i', but it uses a whitelist of env variables to allow | 
 |   through to the command being run.  It attempts to strip off Xcode-added | 
 |   values from PATH. | 
 |   """ | 
 |   # Note: An attempt was made to do something like: env -i bash -lc '[command]' | 
 |   # but that fails to set the things set by login (USER, etc.), so instead | 
 |   # the only approach that seems to work is to have a whitelist. | 
 |   env_key_whitelist = ( | 
 |     'HOME', | 
 |     'LOGNAME', | 
 |     # 'PATH' added below (but filtered). | 
 |     'PWD', | 
 |     'SHELL', | 
 |     'TEMP', | 
 |     'TMPDIR', | 
 |     'USER' | 
 |   ) | 
 |  | 
 |   # Need something to run. | 
 |   # TODO(lliabraa): Make this output a usage string and exit (here and below). | 
 |   assert(len(argv) > 0) | 
 |  | 
 |   add_to_path = []; | 
 |   first_entry = argv[0]; | 
 |   if first_entry.startswith('ADD_TO_PATH='): | 
 |     argv = argv[1:]; | 
 |     add_to_path = first_entry.replace('ADD_TO_PATH=', '', 1).split(':') | 
 |  | 
 |   # Still need something to run. | 
 |   assert(len(argv) > 0) | 
 |  | 
 |   clean_env = {} | 
 |  | 
 |   # Pull over the whitelisted keys. | 
 |   for key in env_key_whitelist: | 
 |     val = os.environ.get(key, None) | 
 |     if not val is None: | 
 |       clean_env[key] = val | 
 |  | 
 |   # Collect the developer dir as set via Xcode, defaulting it. | 
 |   dev_prefix = os.environ.get('DEVELOPER_DIR', '/Developer/') | 
 |   if dev_prefix[-1:] != '/': | 
 |     dev_prefix += '/' | 
 |  | 
 |   # Now pull in PATH, but remove anything Xcode might have added. | 
 |   initial_path = os.environ.get('PATH', '') | 
 |   filtered_chunks = \ | 
 |       [x for x in initial_path.split(':') if not x.startswith(dev_prefix)] | 
 |   if filtered_chunks: | 
 |     clean_env['PATH'] = ':'.join(add_to_path + filtered_chunks) | 
 |  | 
 |   # Add any KEY=VALUE args before the command to the cleaned environment. | 
 |   args = argv[:] | 
 |   while '=' in args[0]: | 
 |     (key, val) = args[0].split('=', 1) | 
 |     clean_env[key] = val | 
 |     args = args[1:] | 
 |  | 
 |   # Still need something to run. | 
 |   assert(len(args) > 0) | 
 |  | 
 |   # Off it goes... | 
 |   os.execvpe(args[0], args, clean_env) | 
 |   # Should never get here, so return a distinctive, non-zero status code. | 
 |   return 66 | 
 |  | 
 | if __name__ == '__main__': | 
 |   sys.exit(Main(sys.argv[1:])) |