# Copyright 2013 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. import types from recipe_engine.config import config_item_context, ConfigGroup, BadConf from recipe_engine.config import ConfigList, Dict, Single, Static, Set, List from . import api as gclient_api def BaseConfig(USE_MIRROR=True, CACHE_DIR=None, BUILDSPEC_VERSION=None, deps_file='.DEPS.git', **_kwargs): cache_dir = str(CACHE_DIR) if CACHE_DIR else None return ConfigGroup( solutions = ConfigList( lambda: ConfigGroup( name = Single(basestring), url = Single((basestring, type(None)), empty_val=''), deps_file = Single(basestring, empty_val=deps_file, required=False, hidden=False), managed = Single(bool, empty_val=True, required=False, hidden=False), custom_deps = Dict(value_type=(basestring, types.NoneType)), custom_vars = Dict(value_type=(basestring, types.BooleanType)), safesync_url = Single(basestring, required=False), revision = Single( (basestring, gclient_api.RevisionResolver), required=False, hidden=True), ) ), deps_os = Dict(value_type=basestring), hooks = List(basestring), target_os = Set(basestring), target_os_only = Single(bool, empty_val=False, required=False), target_cpu = Set(basestring), target_cpu_only = Single(bool, empty_val=False, required=False), cache_dir = Static(cache_dir, hidden=False), # If supplied, use this as the source root (instead of the first solution's # checkout). src_root = Single(basestring, required=False, hidden=True), # Maps 'solution' -> build_property # TODO(machenbach): Deprecate this in favor of the one below. # http://crbug.com/713356 got_revision_mapping = Dict(hidden=True), # Maps build_property -> 'solution' got_revision_reverse_mapping = Dict(hidden=True), # Addition revisions we want to pass in. For now there's a duplication # of code here of setting custom vars AND passing in --revision. We hope # to remove custom vars later. revisions = Dict( value_type=(basestring, gclient_api.RevisionResolver), hidden=True), # TODO(iannucci): HACK! The use of None here to indicate that we apply this # to the solution.revision field is really terrible. I mostly blame # gclient. # Maps 'parent_build_property' -> 'custom_var_name' # Maps 'parent_build_property' -> None # If value is None, the property value will be applied to # solutions[0].revision. Otherwise, it will be applied to # solutions[0].custom_vars['custom_var_name'] parent_got_revision_mapping = Dict(hidden=True), delete_unversioned_trees = Single(bool, empty_val=True, required=False), # Maps canonical repo URL to (local_path, revision). # - canonical gitiles repo URL is "https:///" # where project does not have "/a/" prefix or ".git" suffix. # - solution/path is then used to apply patches as patch root in # bot_update. # - if revision is given, it's passed verbatim to bot_update for # corresponding dependency. Otherwise (i.e. None), the patch will be # applied on top of version pinned in DEPS. # This is essentially a whitelist of which repos inside a solution # can be patched automatically by bot_update based on # api.buildbucket.build.input.gerrit_changes[0].project # For example, if bare chromium solution has this entry in repo_path_map # 'https://chromium.googlesource.com/angle/angle': ( # 'src/third_party/angle', 'HEAD') # then a patch to Angle project can be applied to a chromium src's # checkout after first updating Angle's repo to its master's HEAD. repo_path_map = Dict(value_type=tuple, hidden=True), # Check out refs/branch-heads. # TODO (machenbach): Only implemented for bot_update atm. with_branch_heads = Single( bool, empty_val=False, required=False, hidden=True), # Check out refs/tags. with_tags = Single( bool, empty_val=False, required=False, hidden=True), disable_syntax_validation = Single(bool, empty_val=False, required=False), USE_MIRROR = Static(bool(USE_MIRROR)), BUILDSPEC_VERSION= Static(BUILDSPEC_VERSION, hidden=True), ) config_ctx = config_item_context(BaseConfig) def ChromiumGitURL(_c, *pieces): return '/'.join(('https://chromium.googlesource.com',) + pieces) # TODO(phajdan.jr): Move to proper repo and add coverage. def ChromeInternalGitURL(_c, *pieces): # pragma: no cover return '/'.join(('https://chrome-internal.googlesource.com',) + pieces) @config_ctx() def disable_syntax_validation(c): c.disable_syntax_validation = True @config_ctx() def android(c): c.target_os.add('android') @config_ctx() def nacl(c): s = c.solutions.add() s.name = 'native_client' s.url = ChromiumGitURL(c, 'native_client', 'src', 'native_client.git') m = c.got_revision_mapping m['native_client'] = 'got_revision' @config_ctx() def webports(c): s = c.solutions.add() s.name = 'src' s.url = ChromiumGitURL(c, 'webports.git') m = c.got_revision_mapping m['src'] = 'got_revision' @config_ctx() def wasm_llvm(c): s = c.solutions.add() s.name = 'src' s.url = ChromiumGitURL( c, 'external', 'github.com', 'WebAssembly', 'waterfall.git') m = c.got_revision_mapping m['src'] = 'got_waterfall_revision' c.revisions['src'] = 'origin/master' @config_ctx() def emscripten_releases(c): s = c.solutions.add() s.name = 'emscripten-releases' s.url = ChromiumGitURL(c, 'emscripten-releases.git') m = c.got_revision_mapping m['emscripten-releases'] = 'got_revision' @config_ctx() def gyp(c): s = c.solutions.add() s.name = 'gyp' s.url = ChromiumGitURL(c, 'external', 'gyp.git') m = c.got_revision_mapping m['gyp'] = 'got_revision' @config_ctx() def build(c): s = c.solutions.add() s.name = 'build' s.url = ChromiumGitURL(c, 'chromium', 'tools', 'build.git') m = c.got_revision_mapping m['build'] = 'got_revision' @config_ctx() def depot_tools(c): # pragma: no cover s = c.solutions.add() s.name = 'depot_tools' s.url = ChromiumGitURL(c, 'chromium', 'tools', 'depot_tools.git') m = c.got_revision_mapping m['depot_tools'] = 'got_revision' @config_ctx() def skia(c): # pragma: no cover s = c.solutions.add() s.name = 'skia' s.url = 'https://skia.googlesource.com/skia.git' m = c.got_revision_mapping m['skia'] = 'got_revision' @config_ctx() def skia_buildbot(c): # pragma: no cover s = c.solutions.add() s.name = 'skia_buildbot' s.url = 'https://skia.googlesource.com/buildbot.git' m = c.got_revision_mapping m['skia_buildbot'] = 'got_revision' @config_ctx() def chrome_golo(c): # pragma: no cover s = c.solutions.add() s.name = 'chrome_golo' s.url = 'https://chrome-internal.googlesource.com/chrome-golo/chrome-golo.git' c.got_revision_mapping['chrome_golo'] = 'got_revision' @config_ctx() def build_internal(c): s = c.solutions.add() s.name = 'build_internal' s.url = 'https://chrome-internal.googlesource.com/chrome/tools/build.git' c.got_revision_mapping['build_internal'] = 'got_revision' # We do not use 'includes' here, because we want build_internal to be the # first solution in the list as run_presubmit computes upstream revision # from the first solution. build(c) c.got_revision_mapping['build'] = 'got_build_revision' @config_ctx() def build_internal_scripts_slave(c): s = c.solutions.add() s.name = 'build_internal/scripts/slave' s.url = ('https://chrome-internal.googlesource.com/' 'chrome/tools/build_limited/scripts/slave.git') c.got_revision_mapping['build_internal/scripts/slave'] = 'got_revision' # We do not use 'includes' here, because we want build_internal to be the # first solution in the list as run_presubmit computes upstream revision # from the first solution. build(c) c.got_revision_mapping['build'] = 'got_build_revision' @config_ctx() def master_deps(c): s = c.solutions.add() s.name = 'master.DEPS' s.url = ('https://chrome-internal.googlesource.com/' 'chrome/tools/build/master.DEPS.git') c.got_revision_mapping['master.DEPS'] = 'got_revision' @config_ctx() def slave_deps(c): s = c.solutions.add() s.name = 'slave.DEPS' s.url = ('https://chrome-internal.googlesource.com/' 'chrome/tools/build/slave.DEPS.git') c.got_revision_mapping['slave.DEPS'] = 'got_revision' @config_ctx() def internal_deps(c): s = c.solutions.add() s.name = 'internal.DEPS' s.url = ('https://chrome-internal.googlesource.com/' 'chrome/tools/build/internal.DEPS.git') c.got_revision_mapping['internal.DEPS'] = 'got_revision' @config_ctx() def pdfium(c): soln = c.solutions.add() soln.name = 'pdfium' soln.url = 'https://pdfium.googlesource.com/pdfium.git' m = c.got_revision_mapping m['pdfium'] = 'got_revision' @config_ctx() def crashpad(c): soln = c.solutions.add() soln.name = 'crashpad' soln.url = 'https://chromium.googlesource.com/crashpad/crashpad.git' @config_ctx() def boringssl(c): soln = c.solutions.add() soln.name = 'boringssl' soln.url = 'https://boringssl.googlesource.com/boringssl.git' soln.deps_file = 'util/bot/DEPS' @config_ctx() def dart(c): soln = c.solutions.add() soln.name = 'sdk' soln.url = ('https://dart.googlesource.com/sdk.git') soln.deps_file = 'DEPS' soln.managed = False @config_ctx() def expect_tests(c): soln = c.solutions.add() soln.name = 'expect_tests' soln.url = 'https://chromium.googlesource.com/infra/testing/expect_tests.git' c.got_revision_mapping['expect_tests'] = 'got_revision' @config_ctx() def infra(c): soln = c.solutions.add() soln.name = 'infra' soln.url = 'https://chromium.googlesource.com/infra/infra.git' c.got_revision_mapping['infra'] = 'got_revision' c.repo_path_map.update({ 'https://chromium.googlesource.com/infra/luci/gae': ( 'infra/go/src/go.chromium.org/gae', 'HEAD'), 'https://chromium.googlesource.com/infra/luci/luci-py': ( 'infra/luci', 'HEAD'), 'https://chromium.googlesource.com/infra/luci/luci-go': ( 'infra/go/src/go.chromium.org/luci', 'HEAD'), 'https://chromium.googlesource.com/infra/luci/recipes-py': ( 'infra/recipes-py', 'HEAD') }) @config_ctx() def infra_internal(c): # pragma: no cover soln = c.solutions.add() soln.name = 'infra_internal' soln.url = 'https://chrome-internal.googlesource.com/infra/infra_internal.git' c.got_revision_mapping['infra_internal'] = 'got_revision' @config_ctx(includes=['infra']) def luci_gae(c): # luci/gae is checked out as a part of infra.git solution at HEAD. c.revisions['infra'] = 'origin/master' # luci/gae is developed together with luci-go, which should be at HEAD. c.revisions['infra/go/src/go.chromium.org/luci'] = 'origin/master' c.revisions['infra/go/src/go.chromium.org/gae'] = ( gclient_api.RevisionFallbackChain('origin/master')) m = c.got_revision_mapping del m['infra'] m['infra/go/src/go.chromium.org/gae'] = 'got_revision' @config_ctx(includes=['infra']) def luci_go(c): # luci-go is checked out as a part of infra.git solution at HEAD. c.revisions['infra'] = 'origin/master' c.revisions['infra/go/src/go.chromium.org/luci'] = ( gclient_api.RevisionFallbackChain('origin/master')) m = c.got_revision_mapping del m['infra'] m['infra/go/src/go.chromium.org/luci'] = 'got_revision' @config_ctx(includes=['infra']) def luci_py(c): # luci-py is checked out as part of infra just to have appengine # pre-installed, as that's what luci-py PRESUBMIT relies on. c.revisions['infra'] = 'origin/master' c.revisions['infra/luci'] = ( gclient_api.RevisionFallbackChain('origin/master')) m = c.got_revision_mapping del m['infra'] m['infra/luci'] = 'got_revision' @config_ctx(includes=['infra']) def recipes_py(c): c.revisions['infra'] = 'origin/master' c.revisions['infra/recipes-py'] = ( gclient_api.RevisionFallbackChain('origin/master')) m = c.got_revision_mapping del m['infra'] m['infra/recipes-py'] = 'got_revision' @config_ctx() def recipes_py_bare(c): soln = c.solutions.add() soln.name = 'recipes-py' soln.url = 'https://chromium.googlesource.com/infra/luci/recipes-py' c.got_revision_mapping['recipes-py'] = 'got_revision' @config_ctx() def catapult(c): soln = c.solutions.add() soln.name = 'catapult' soln.url = 'https://chromium.googlesource.com/catapult' c.got_revision_mapping['catapult'] = 'got_revision' @config_ctx(includes=['infra_internal']) def infradata_master_manager(c): soln = c.solutions.add() soln.name = 'infra-data-master-manager' soln.url = ( 'https://chrome-internal.googlesource.com/infradata/master-manager.git') del c.got_revision_mapping['infra_internal'] c.got_revision_mapping['infra-data-master-manager'] = 'got_revision' @config_ctx() def infradata_config(c): soln = c.solutions.add() soln.name = 'infra-data-config' soln.url = 'https://chrome-internal.googlesource.com/infradata/config.git' c.got_revision_mapping['infra-data-config'] = 'got_revision' @config_ctx() def with_branch_heads(c): c.with_branch_heads = True @config_ctx() def with_tags(c): c.with_tags = True @config_ctx() def custom_tabs_client(c): soln = c.solutions.add() soln.name = 'custom_tabs_client' # TODO(pasko): test custom-tabs-client within a full chromium checkout. soln.url = 'https://chromium.googlesource.com/custom-tabs-client' c.got_revision_mapping['custom_tabs_client'] = 'got_revision' @config_ctx() def gerrit_test_cq_normal(c): soln = c.solutions.add() soln.name = 'gerrit-test-cq-normal' soln.url = 'https://chromium.googlesource.com/playground/gerrit-cq/normal.git' @config_ctx() def angle(c): soln = c.solutions.add() soln.name = 'angle' soln.url = 'https://chromium.googlesource.com/angle/angle.git' # Standalone developer angle builds want the angle checkout in the same # directory the .gclient file is in. Bots want it in a directory called # 'angle'. To make both cases work, the angle DEPS file pulls deps and runs # hooks relative to the variable "root" which is set to . by default and # then to 'angle' in the recipes here: soln.custom_vars = {'angle_root': 'angle'} c.got_revision_mapping['angle'] = 'got_revision' @config_ctx() def dawn(c): soln = c.solutions.add() soln.name = 'dawn' soln.url = 'https://dawn.googlesource.com/dawn.git' c.got_revision_mapping['dawn'] = 'got_revision' @config_ctx() def celab(c): soln = c.solutions.add() # soln.name must match the repo name for `dep` to work properly soln.name = 'cel' soln.url = 'https://chromium.googlesource.com/enterprise/cel.git' c.got_revision_mapping['cel'] = 'got_revision' @config_ctx() def openscreen(c): s = c.solutions.add() s.name = 'openscreen' s.url = 'https://chromium.googlesource.com/openscreen' c.got_revision_mapping['openscreen'] = 'got_revision' @config_ctx() def devtools(c): s = c.solutions.add() s.name = 'devtools' s.url = 'https://chromium.googlesource.com/devtools/devtools-frontend.git' c.got_revision_mapping['devtools'] = 'got_revision' c.repo_path_map.update({ 'https://chromium.googlesource.com/devtools/devtools-frontend': ( 'devtools/devtools-frontend', 'HEAD'), }) @config_ctx() def tint(c): soln = c.solutions.add() soln.name = 'tint' soln.url = 'https://dawn.googlesource.com/tint.git' c.got_revision_mapping['tint'] = 'got_revision'