#!/usr/bin/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 the chromite shell. This script is intended to run in several ways: - Outside the chroot, it should be _copied_ to someplace that is in the path (like depot_tools). It will search for the right chromite by looking for a file 'chromite/shell/main.py' upward based on the CWD. - Inside the chroot, it might be _either_ copied to someplace in the path (since depot_tools is in the path in the chroot) or it might run from chromite/bin directly, which should be in the PATH. In any case, we'll look for the real 'chromite/shell/main.py' based on the environment variable CROS_WORKON_SRCROOT, so it doesn't matter what the CWD is. 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. """ # Python imports. import os import sys def Search(path): """Return an iterator of lists of places to look for chromite.""" if os.path.exists('/etc/debian_chroot'): # We're in the chroot. Chromite should be in the python path inside the # chroot, so we don't do any searching. NOTE that we purposely don't want # CROS_WORKON_SRCROOT in the python path. yield [] else: # Look in $CROS_WORKON_SRCROOT first. The idea is that a user would set # this manually if they wanted to specify a particular version of chromite. if 'CROS_WORKON_SRCROOT' in os.environ: yield [os.environ['CROS_WORKON_SRCROOT']] # Search upward until we either end up with a blank dir or the "parent" dir # doesn't change. prev_path = None while path and path != prev_path: yield [path] path, prev_path = os.path.dirname(path), path for path in Search(os.getcwd()): sys.path = path + sys.path try: import chromite.shell.main break except ImportError, e: # Just in case there is actually something wrong with Chromite, print # a sensible error. We match only the end of the string so that we can # handle an error within the chromite directory. # The full error is 'No module named (chromite.)shell.main' # Note: If you hit the directory containing chromite on the way up, then # the error will be 'No module named shell.main' so we must check only the # shell.main part. if not str(e).endswith('shell.main'): raise # We've got different modules named chromite in the tree, pulling in the # wrong one will break the right one. So unload it. if 'chromite' in sys.modules: del sys.modules['chromite'] sys.path = sys.path[len(path):] else: # TODO(dianders): Should we actually print out the 'repo init' call that # the user should use? sys.stderr.write( "ERROR: Couldn't find the chromite tool.\n" "\n" "Please change to a directory inside your Chromium OS source tree\n" "and retry. If you need to setup a Chromium OS source tree, see:\n" " http://www.chromium.org/chromium-os/developer-guide\n") sys.exit(1) chromite.shell.main.main()