|
|
|
#!/usr/bin/env python3
|
|
|
|
# Copyright 2014 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.
|
|
|
|
|
|
|
|
# Modified from go/env.py in Chromium infrastructure's repository to patch out
|
|
|
|
# everything but the core toolchain.
|
|
|
|
#
|
|
|
|
# https://chromium.googlesource.com/infra/infra/
|
|
|
|
|
|
|
|
"""Used to wrap a command:
|
|
|
|
|
|
|
|
$ ./env.py go version
|
|
|
|
"""
|
|
|
|
|
|
|
|
assert __name__ == '__main__'
|
|
|
|
|
|
|
|
import os
|
|
|
|
import subprocess
|
|
|
|
import sys
|
|
|
|
|
|
|
|
# /path/to/util/bot
|
|
|
|
ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
|
|
|
|
|
|
|
# Platform depended suffix for executable files.
|
|
|
|
EXE_SFX = '.exe' if sys.platform == 'win32' else ''
|
|
|
|
|
|
|
|
def get_go_environ(goroot):
|
|
|
|
"""Returns a copy of os.environ with added GOROOT and PATH variables."""
|
|
|
|
env = os.environ.copy()
|
|
|
|
env['GOROOT'] = goroot
|
|
|
|
gobin = os.path.join(goroot, 'bin')
|
|
|
|
path = env['PATH'].split(os.pathsep)
|
|
|
|
if gobin not in path:
|
|
|
|
env['PATH'] = os.pathsep.join([gobin] + path)
|
|
|
|
return env
|
|
|
|
|
|
|
|
def find_executable(name, goroot):
|
|
|
|
"""Returns full path to an executable in GOROOT."""
|
|
|
|
basename = name
|
|
|
|
if EXE_SFX and basename.endswith(EXE_SFX):
|
|
|
|
basename = basename[:-len(EXE_SFX)]
|
|
|
|
full_path = os.path.join(goroot, 'bin', basename + EXE_SFX)
|
|
|
|
if os.path.exists(full_path):
|
|
|
|
return full_path
|
|
|
|
return name
|
|
|
|
|
|
|
|
# TODO(davidben): Now that we use CIPD to fetch Go, this script does not do
|
|
|
|
# much. Switch to setting up GOROOT and PATH in the recipe?
|
|
|
|
goroot = os.path.join(ROOT, 'golang')
|
|
|
|
new = get_go_environ(goroot)
|
|
|
|
|
|
|
|
exe = sys.argv[1]
|
|
|
|
if exe == 'python':
|
|
|
|
exe = sys.executable
|
|
|
|
else:
|
|
|
|
# Help Windows to find the executable in new PATH, do it only when
|
|
|
|
# executable is referenced by name (and not by path).
|
|
|
|
if os.sep not in exe:
|
|
|
|
exe = find_executable(exe, goroot)
|
|
|
|
sys.exit(subprocess.call([exe] + sys.argv[2:], env=new))
|