Added tool to call tools in infra.git

Example usage: yo cq_stats --help

BUG=
R=stip@chromium.org

Review URL: https://codereview.chromium.org/1232573007 .

git-svn-id: svn://svn.chromium.org/chrome/trunk/tools/depot_tools@296053 0039d316-1c4b-4281-b951-d872f2087c98
diff --git a/cit b/cit
new file mode 100755
index 0000000..410341f
--- /dev/null
+++ b/cit
@@ -0,0 +1,8 @@
+#!/usr/bin/env bash
+# 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.
+
+base_dir=$(dirname "$0")
+
+PYTHONDONTWRITEBYTECODE=1 exec python "$base_dir/cit.py" "$@"
diff --git a/cit.bat b/cit.bat
new file mode 100755
index 0000000..a1da0dd
--- /dev/null
+++ b/cit.bat
@@ -0,0 +1,11 @@
+@echo off
+:: 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.
+setlocal
+
+:: This is required with cygwin only.
+PATH=%~dp0;%PATH%
+
+:: Defer control.
+%~dp0python "%~dp0\cit.py" %*
diff --git a/cit.py b/cit.py
new file mode 100755
index 0000000..8e1ae55
--- /dev/null
+++ b/cit.py
@@ -0,0 +1,104 @@
+#!/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', '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())