#!/usr/bin/env python3
# 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.
"""

import os
import sys


# Min version of Python that we *want*.  We warn for older versions.
MIN_PYTHON_VER_SOFT = (3, 6)
# Min version of Python that we *require*.  We abort for older versions.
MIN_PYTHON_VER_HARD = (3, 6)


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
  https://chromium.googlesource.com/chromiumos/docs/+/HEAD/developer_guide.md
""" % target)
  return 127


def _CheckPythonVersion():
  """Verify active Python is new enough."""
  if sys.version_info >= MIN_PYTHON_VER_SOFT:
    return

  progname = os.path.basename(sys.argv[0])
  print('%s: Chrome OS requires Python-%s+, but "%s" is "%s"' %
        (progname, '.'.join(str(x) for x in MIN_PYTHON_VER_SOFT),
         sys.executable, sys.version.replace('\n', ' ')),
        file=sys.stderr)
  if sys.version_info < MIN_PYTHON_VER_HARD:
    print('%s: fatal: giving up since Python is too old.' % (progname,),
          file=sys.stderr)
    sys.exit(1)

  print('warning: temporarily continuing anyways; you must upgrade soon to '
        'maintain support.', file=sys.stderr)


def main():
  _CheckPythonVersion()

  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)
  os.execv(path, [path] + sys.argv[1:])


if __name__ == '__main__':
  sys.exit(main())
