#!/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())
