#!/usr/bin/env python2
# -*- coding: utf-8 -*-
# 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.
"""

from __future__ import print_function

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 as 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())
