Port Skia recipe to normal Python scripts, move to Skia repo

BUG=skia:4763
GOLD_TRYBOT_URL= https://gold.skia.org/search2?unt=true&query=source_type%3Dgm&master=false&issue=1703663002

Review URL: https://codereview.chromium.org/1703663002
diff --git a/infra/bots/common.py b/infra/bots/common.py
new file mode 100644
index 0000000..9b96440
--- /dev/null
+++ b/infra/bots/common.py
@@ -0,0 +1,150 @@
+#!/usr/bin/env python
+#
+# Copyright 2016 Google Inc.
+#
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+
+import os
+import subprocess
+import sys
+
+from flavor import android_flavor
+from flavor import chromeos_flavor
+from flavor import cmake_flavor
+from flavor import coverage_flavor
+from flavor import default_flavor
+from flavor import ios_flavor
+from flavor import valgrind_flavor
+from flavor import xsan_flavor
+
+
+CONFIG_COVERAGE = 'Coverage'
+CONFIG_DEBUG = 'Debug'
+CONFIG_RELEASE = 'Release'
+VALID_CONFIGS = (CONFIG_COVERAGE, CONFIG_DEBUG, CONFIG_RELEASE)
+
+GM_ACTUAL_FILENAME = 'actual-results.json'
+GM_EXPECTATIONS_FILENAME = 'expected-results.json'
+GM_IGNORE_TESTS_FILENAME = 'ignored-tests.txt'
+
+GS_GM_BUCKET = 'chromium-skia-gm'
+GS_SUMMARIES_BUCKET = 'chromium-skia-gm-summaries'
+
+SKIA_REPO = 'https://skia.googlesource.com/skia.git'
+INFRA_REPO = 'https://skia.googlesource.com/buildbot.git'
+
+SERVICE_ACCOUNT_FILE = 'service-account-skia.json'
+SERVICE_ACCOUNT_INTERNAL_FILE = 'service-account-skia-internal.json'
+
+
+def is_android(bot_cfg):
+  """Determine whether the given bot is an Android bot."""
+  return ('Android' in bot_cfg.get('extra_config', '') or
+          bot_cfg.get('os') == 'Android')
+
+def is_chromeos(bot_cfg):
+  return ('CrOS' in bot_cfg.get('extra_config', '') or
+          bot_cfg.get('os') == 'ChromeOS')
+
+def is_cmake(bot_cfg):
+  return 'CMake' in bot_cfg.get('extra_config', '')
+
+def is_ios(bot_cfg):
+  return ('iOS' in bot_cfg.get('extra_config', '') or
+          bot_cfg.get('os') == 'iOS')
+
+
+def is_valgrind(bot_cfg):
+  return 'Valgrind' in bot_cfg.get('extra_config', '')
+
+
+def is_xsan(bot_cfg):
+  return (bot_cfg.get('extra_config') == 'ASAN' or
+          bot_cfg.get('extra_config') == 'MSAN' or
+          bot_cfg.get('extra_config') == 'TSAN')
+
+
+class BotInfo(object):
+  def __init__(self, bot_name, slave_name, out_dir):
+    """Initialize the bot, given its name.
+
+    Assumes that CWD is the directory containing this file.
+    """
+    self.name = bot_name
+    self.slave_name = slave_name
+    self.skia_dir = os.path.abspath(os.path.join(
+        os.path.dirname(os.path.realpath(__file__)),
+        os.pardir, os.pardir))
+    os.chdir(self.skia_dir)
+    self.build_dir = os.path.abspath(os.path.join(self.skia_dir, os.pardir))
+    self.out_dir = out_dir
+    self.spec = self.get_bot_spec(bot_name)
+    self.configuration = self.spec['configuration']
+    self.default_env = {
+      'SKIA_OUT': self.out_dir,
+      'BUILDTYPE': self.configuration,
+      'PATH': os.environ['PATH'],
+    }
+    self.default_env.update(self.spec['env'])
+    self.build_targets = [str(t) for t in self.spec['build_targets']]
+    self.bot_cfg = self.spec['builder_cfg']
+    self.is_trybot = self.bot_cfg['is_trybot']
+    self.upload_dm_results = self.spec['upload_dm_results']
+    self.upload_perf_results = self.spec['upload_perf_results']
+    self.dm_flags = self.spec['dm_flags']
+    self.nanobench_flags = self.spec['nanobench_flags']
+    self._ccache = None
+    self._checked_for_ccache = False
+    self.flavor = self.get_flavor(self.bot_cfg)
+
+  @property
+  def ccache(self):
+    if not self._checked_for_ccache:
+      self._checked_for_ccache = True
+      if sys.platform != 'win32':
+        try:
+          result = subprocess.check_output(['which', 'ccache'])
+          self._ccache = result.rstrip()
+        except subprocess.CalledProcessError:
+          pass
+
+    return self._ccache
+
+  def get_bot_spec(self, bot_name):
+    """Retrieve the bot spec for this bot."""
+    sys.path.append(self.skia_dir)
+    from tools import buildbot_spec
+    return buildbot_spec.get_builder_spec(bot_name)
+
+  def get_flavor(self, bot_cfg):
+    """Return a flavor utils object specific to the given bot."""
+    if is_android(bot_cfg):
+      return android_flavor.AndroidFlavorUtils(self)
+    elif is_chromeos(bot_cfg):
+      return chromeos_flavor.ChromeOSFlavorUtils(self)
+    elif is_cmake(bot_cfg):
+      return cmake_flavor.CMakeFlavorUtils(self)
+    elif is_ios(bot_cfg):
+      return ios_flavor.iOSFlavorUtils(self)
+    elif is_valgrind(bot_cfg):
+      return valgrind_flavor.ValgrindFlavorUtils(self)
+    elif is_xsan(bot_cfg):
+      return xsan_flavor.XSanFlavorUtils(self)
+    elif bot_cfg.get('configuration') == CONFIG_COVERAGE:
+      return coverage_flavor.CoverageFlavorUtils(self)
+    else:
+      return default_flavor.DefaultFlavorUtils(self)
+
+  def run(self, cmd, env=None, cwd=None):
+    _env = {}
+    _env.update(self.default_env)
+    _env.update(env or {})
+    cwd = cwd or self.skia_dir
+    print '============'
+    print 'CMD: %s' % cmd
+    print 'CWD: %s' % cwd
+    print 'ENV: %s' % _env
+    print '============'
+    subprocess.check_call(cmd, env=_env, cwd=cwd)