You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
97 lines
3.0 KiB
Python
97 lines
3.0 KiB
Python
#!/usr/bin/env python
|
|
# Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
|
|
# Use of this source code is governed by a BSD-style license that can be
|
|
# found in the LICENSE file.
|
|
|
|
"""Wrapper for chromite tools.
|
|
|
|
The script is intend to be symlinked to any number of chromite tools, attempts
|
|
to find the path for chromite, and hands off to the right tool via exec if
|
|
possible.
|
|
|
|
It is intended to used strictly outside of the chroot.
|
|
|
|
If you're looking at a copy and want to know where the original looks at, look
|
|
here:
|
|
http://git.chromium.org/gitweb/?p=chromite.git;a=blob;f=bin/chromite
|
|
|
|
Since this script is _copied_, it should remain small and not use internal libs.
|
|
|
|
"""
|
|
|
|
import errno
|
|
import os
|
|
import sys
|
|
|
|
# Due to historical reasons, and the fact depot_tools ToT is used by older
|
|
# factory branches (lacking chromite script cleanups), note we have to
|
|
# fallback to some odd import locations. This is the only reason for the
|
|
# fallback code- any/all new scripts symlinked to this script *must* exist
|
|
# in chromite/bin/ .
|
|
|
|
def _FindChromite(path):
|
|
"""Find the chromite dir in a repo, gclient, or submodule checkout."""
|
|
path = os.path.abspath(path)
|
|
# Depending on the checkout type (whether repo chromeos or gclient chrome)
|
|
# Chromite lives in a different location.
|
|
roots = (
|
|
('.repo', 'chromite/.git'),
|
|
('.gclient', 'src/third_party/chromite/.git'),
|
|
('src/.gitmodules', 'src/third_party/chromite/.git'),
|
|
)
|
|
|
|
while path != '/':
|
|
for root, chromite_git_dir in roots:
|
|
if all(os.path.exists(os.path.join(path, x))
|
|
for x in [root, chromite_git_dir]):
|
|
return os.path.dirname(os.path.join(path, chromite_git_dir))
|
|
path = os.path.dirname(path)
|
|
return None
|
|
|
|
|
|
def _MissingErrorOut(target):
|
|
sys.stderr.write(
|
|
"""ERROR: Couldn't find the chromite tool %s.
|
|
|
|
Please change to a directory inside your Chromium OS source tree
|
|
and retry. If you need to setup a Chromium OS source tree, see
|
|
http://www.chromium.org/chromium-os/developer-guide
|
|
""" % target)
|
|
return 127
|
|
|
|
|
|
def main():
|
|
chromite_dir = _FindChromite(os.getcwd())
|
|
target = os.path.basename(sys.argv[0])
|
|
if chromite_dir is None:
|
|
return _MissingErrorOut(target)
|
|
|
|
path = os.path.join(chromite_dir, 'bin', target)
|
|
try:
|
|
os.execv(path, [path] + sys.argv[1:])
|
|
except EnvironmentError, e:
|
|
if e.errno not in (errno.ENOENT, errno.EPERM):
|
|
raise
|
|
|
|
# Reaching here means it's either a bad target, or we're working against
|
|
# an old (pre 6be2efcf5bb575b03862113eec097c44d8d7f93e) revision of
|
|
# chromite. Fallback to trying to import it; this code works at least as
|
|
# far back as branch 0.11.241.B; likely further.
|
|
|
|
if target == 'cbuildbot':
|
|
target = 'chromite.buildbot.cbuildbot'
|
|
else:
|
|
target = 'chromite.bin.%s' % (target,)
|
|
|
|
# Adjust the path importation so we can import our our target.
|
|
sys.path.insert(0, os.path.dirname(chromite_dir))
|
|
|
|
try:
|
|
module = __import__(target, fromlist=['main'])
|
|
except ImportError:
|
|
return _MissingErrorOut(target)
|
|
return module.main()
|
|
|
|
if __name__ == '__main__':
|
|
sys.exit(main())
|