#!/usr/bin/env python
# Copyright (c) 2015 The Chromium 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 updating and calling infra.git tools.

This tool does a two things:
* Maintains a infra.git checkout pinned at "deployed" in the home dir
* Acts as an alias to infra.tools.*
"""

# TODO(hinoka): Use cipd/glyco instead of git/gclient.

import sys
import os
import subprocess
import re


SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
GCLIENT = os.path.join(SCRIPT_DIR, 'gclient.py')
TARGET_DIR = os.path.expanduser('~/.chrome-infra')
INFRA_DIR = os.path.join(TARGET_DIR, 'infra')


def get_git_rev(target, branch):
  return subprocess.check_output(
      ['git', 'log', '--format=%B', '-n1', branch], cwd=target)


def need_to_update():
  """Checks to see if we need to update the ~/.chrome-infra/infra checkout."""
  try:
    cmd = [sys.executable, GCLIENT, 'revinfo']
    subprocess.check_call(
        cmd, cwd=os.path.join(TARGET_DIR), stdout=subprocess.PIPE)
  except subprocess.CalledProcessError:
    return True  # Gclient failed, definitely need to update.
  except OSError:
    return True  # Gclient failed, definitely need to update.

  local_rev = get_git_rev(INFRA_DIR, 'HEAD')

  subprocess.check_call(
      ['git', 'fetch', 'origin'], cwd=INFRA_DIR,
      stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
  origin_rev = get_git_rev(INFRA_DIR, 'origin/deployed')
  return origin_rev != local_rev


def ensure_infra():
  """Ensures that infra.git is present in ~/.chrome-infra."""
  print 'Fetching infra into %s, may take a couple of minutes...' % TARGET_DIR
  if not os.path.isdir(TARGET_DIR):
    os.mkdir(TARGET_DIR)
  if not os.path.exists(os.path.join(TARGET_DIR, '.gclient')):
    subprocess.check_call(
        [sys.executable, os.path.join(SCRIPT_DIR, 'fetch.py'), 'infra'],
        cwd=TARGET_DIR,
        stdout=subprocess.PIPE)
  subprocess.check_call(
      [sys.executable, GCLIENT, 'sync', '--revision', 'origin/deployed'],
      cwd=TARGET_DIR,
      stdout=subprocess.PIPE)


def get_available_tools():
  tools = []
  starting = os.path.join(TARGET_DIR, 'infra', 'infra', 'tools')
  for root, _, files in os.walk(starting):
    if '__main__.py' in files:
      tools.append(root[len(starting)+1:].replace(os.path.sep, '.'))
  return tools


def run(args):
  if args:
    tool_name = args[0]
    cmd = [
        sys.executable, os.path.join(TARGET_DIR, 'infra', 'run.py'),
        'infra.tools.%s' % tool_name]
    cmd.extend(args[1:])
    return subprocess.call(cmd)

  tools = get_available_tools()
  print """usage: cit.py <name of tool> [args for tool]

  Wrapper for maintaining and calling tools in "infra.git/run.py infra.tools.*"

  Available tools are:
  """
  for tool in tools:
    print '  * %s' % tool


def main():
  if need_to_update():
    ensure_infra()
  return run(sys.argv[1:])

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