config.py 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528
  1. # Copyright 2013 The Chromium Authors. All rights reserved.
  2. # Use of this source code is governed by a BSD-style license that can be
  3. # found in the LICENSE file.
  4. try:
  5. _STRING_TYPE = basestring
  6. except NameError: # pragma: no cover
  7. _STRING_TYPE = str
  8. from recipe_engine.config import config_item_context, ConfigGroup, BadConf
  9. from recipe_engine.config import ConfigList, Dict, Single, Static, Set, List
  10. from . import api as gclient_api
  11. def BaseConfig(USE_MIRROR=True, CACHE_DIR=None,
  12. BUILDSPEC_VERSION=None, deps_file='.DEPS.git', **_kwargs):
  13. cache_dir = str(CACHE_DIR) if CACHE_DIR else None
  14. return ConfigGroup(
  15. solutions = ConfigList(
  16. lambda: ConfigGroup(
  17. name = Single(_STRING_TYPE),
  18. url = Single((_STRING_TYPE, type(None)), empty_val=''),
  19. deps_file = Single(_STRING_TYPE, empty_val=deps_file, required=False,
  20. hidden=False),
  21. managed = Single(bool, empty_val=True, required=False, hidden=False),
  22. custom_deps = Dict(value_type=(_STRING_TYPE, type(None))),
  23. custom_vars = Dict(value_type=(_STRING_TYPE, bool)),
  24. safesync_url = Single(_STRING_TYPE, required=False),
  25. revision = Single(
  26. (_STRING_TYPE, gclient_api.RevisionResolver),
  27. required=False, hidden=True),
  28. )
  29. ),
  30. deps_os = Dict(value_type=_STRING_TYPE),
  31. hooks = List(_STRING_TYPE),
  32. target_os = Set(_STRING_TYPE),
  33. target_os_only = Single(bool, empty_val=False, required=False),
  34. target_cpu = Set(_STRING_TYPE),
  35. target_cpu_only = Single(bool, empty_val=False, required=False),
  36. cache_dir = Static(cache_dir, hidden=False),
  37. # If supplied, use this as the source root (instead of the first solution's
  38. # checkout).
  39. src_root = Single(_STRING_TYPE, required=False, hidden=True),
  40. # Maps 'solution' -> build_property
  41. # TODO(machenbach): Deprecate this in favor of the one below.
  42. # http://crbug.com/713356
  43. got_revision_mapping = Dict(hidden=True),
  44. # Maps build_property -> 'solution'
  45. got_revision_reverse_mapping = Dict(hidden=True),
  46. # Addition revisions we want to pass in. For now there's a duplication
  47. # of code here of setting custom vars AND passing in --revision. We hope
  48. # to remove custom vars later.
  49. revisions = Dict(
  50. value_type=(_STRING_TYPE, gclient_api.RevisionResolver),
  51. hidden=True),
  52. # TODO(iannucci): HACK! The use of None here to indicate that we apply this
  53. # to the solution.revision field is really terrible. I mostly blame
  54. # gclient.
  55. # Maps 'parent_build_property' -> 'custom_var_name'
  56. # Maps 'parent_build_property' -> None
  57. # If value is None, the property value will be applied to
  58. # solutions[0].revision. Otherwise, it will be applied to
  59. # solutions[0].custom_vars['custom_var_name']
  60. parent_got_revision_mapping = Dict(hidden=True),
  61. delete_unversioned_trees = Single(bool, empty_val=True, required=False),
  62. # Maps canonical repo URL to (local_path, revision).
  63. # - canonical gitiles repo URL is "https://<host>/<project>"
  64. # where project does not have "/a/" prefix or ".git" suffix.
  65. # - solution/path is then used to apply patches as patch root in
  66. # bot_update.
  67. # - if revision is given, it's passed verbatim to bot_update for
  68. # corresponding dependency. Otherwise (i.e. None), the patch will be
  69. # applied on top of version pinned in DEPS.
  70. # This is essentially a allowlist of which repos inside a solution
  71. # can be patched automatically by bot_update based on
  72. # api.buildbucket.build.input.gerrit_changes[0].project
  73. # For example, if bare chromium solution has this entry in repo_path_map
  74. # 'https://chromium.googlesource.com/angle/angle': (
  75. # 'src/third_party/angle', 'HEAD')
  76. # then a patch to Angle project can be applied to a chromium src's
  77. # checkout after first updating Angle's repo to its main's HEAD.
  78. repo_path_map = Dict(value_type=tuple, hidden=True),
  79. # Check out refs/branch-heads.
  80. # TODO (machenbach): Only implemented for bot_update atm.
  81. with_branch_heads = Single(
  82. bool,
  83. empty_val=False,
  84. required=False,
  85. hidden=True),
  86. # Check out refs/tags.
  87. with_tags = Single(
  88. bool,
  89. empty_val=False,
  90. required=False,
  91. hidden=True),
  92. USE_MIRROR = Static(bool(USE_MIRROR)),
  93. BUILDSPEC_VERSION= Static(BUILDSPEC_VERSION, hidden=True),
  94. )
  95. config_ctx = config_item_context(BaseConfig)
  96. def ChromiumGitURL(_c, *pieces):
  97. return '/'.join(('https://chromium.googlesource.com',) + pieces)
  98. # TODO(phajdan.jr): Move to proper repo and add coverage.
  99. def ChromeInternalGitURL(_c, *pieces): # pragma: no cover
  100. return '/'.join(('https://chrome-internal.googlesource.com',) + pieces)
  101. @config_ctx()
  102. def android(c):
  103. c.target_os.add('android')
  104. @config_ctx()
  105. def nacl(c):
  106. s = c.solutions.add()
  107. s.name = 'native_client'
  108. s.url = ChromiumGitURL(c, 'native_client', 'src', 'native_client.git')
  109. m = c.got_revision_mapping
  110. m['native_client'] = 'got_revision'
  111. @config_ctx()
  112. def webports(c):
  113. s = c.solutions.add()
  114. s.name = 'src'
  115. s.url = ChromiumGitURL(c, 'webports.git')
  116. m = c.got_revision_mapping
  117. m['src'] = 'got_revision'
  118. @config_ctx()
  119. def emscripten_releases(c):
  120. s = c.solutions.add()
  121. s.name = 'emscripten-releases'
  122. s.url = ChromiumGitURL(c, 'emscripten-releases.git')
  123. m = c.got_revision_mapping
  124. m['emscripten-releases'] = 'got_revision'
  125. @config_ctx()
  126. def gyp(c):
  127. s = c.solutions.add()
  128. s.name = 'gyp'
  129. s.url = ChromiumGitURL(c, 'external', 'gyp.git')
  130. m = c.got_revision_mapping
  131. m['gyp'] = 'got_revision'
  132. @config_ctx()
  133. def build(c):
  134. s = c.solutions.add()
  135. s.name = 'build'
  136. s.url = ChromiumGitURL(c, 'chromium', 'tools', 'build.git')
  137. m = c.got_revision_mapping
  138. m['build'] = 'got_revision'
  139. @config_ctx()
  140. def depot_tools(c): # pragma: no cover
  141. s = c.solutions.add()
  142. s.name = 'depot_tools'
  143. s.url = ChromiumGitURL(c, 'chromium', 'tools', 'depot_tools.git')
  144. m = c.got_revision_mapping
  145. m['depot_tools'] = 'got_revision'
  146. @config_ctx()
  147. def skia(c): # pragma: no cover
  148. s = c.solutions.add()
  149. s.name = 'skia'
  150. s.url = 'https://skia.googlesource.com/skia.git'
  151. m = c.got_revision_mapping
  152. m['skia'] = 'got_revision'
  153. @config_ctx()
  154. def skia_buildbot(c): # pragma: no cover
  155. s = c.solutions.add()
  156. s.name = 'skia_buildbot'
  157. s.url = 'https://skia.googlesource.com/buildbot.git'
  158. m = c.got_revision_mapping
  159. m['skia_buildbot'] = 'got_revision'
  160. @config_ctx()
  161. def chrome_golo(c): # pragma: no cover
  162. s = c.solutions.add()
  163. s.name = 'chrome_golo'
  164. s.url = 'https://chrome-internal.googlesource.com/chrome-golo/chrome-golo.git'
  165. c.got_revision_mapping['chrome_golo'] = 'got_revision'
  166. @config_ctx()
  167. def infra_puppet(c): # pragma: no cover
  168. s = c.solutions.add()
  169. s.name = 'infra_puppet'
  170. s.url = 'https://chrome-internal.googlesource.com/infra/puppet.git'
  171. c.got_revision_mapping['infra_puppet'] = 'got_revision'
  172. @config_ctx()
  173. def build_internal(c):
  174. s = c.solutions.add()
  175. s.name = 'build_internal'
  176. s.url = 'https://chrome-internal.googlesource.com/chrome/tools/build.git'
  177. c.got_revision_mapping['build_internal'] = 'got_revision'
  178. # We do not use 'includes' here, because we want build_internal to be the
  179. # first solution in the list as run_presubmit computes upstream revision
  180. # from the first solution.
  181. build(c)
  182. c.got_revision_mapping['build'] = 'got_build_revision'
  183. @config_ctx()
  184. def build_internal_scripts_slave(c):
  185. s = c.solutions.add()
  186. s.name = 'build_internal/scripts/slave'
  187. s.url = ('https://chrome-internal.googlesource.com/'
  188. 'chrome/tools/build_limited/scripts/slave.git')
  189. c.got_revision_mapping['build_internal/scripts/slave'] = 'got_revision'
  190. # We do not use 'includes' here, because we want build_internal to be the
  191. # first solution in the list as run_presubmit computes upstream revision
  192. # from the first solution.
  193. build(c)
  194. c.got_revision_mapping['build'] = 'got_build_revision'
  195. @config_ctx()
  196. def master_deps(c):
  197. s = c.solutions.add()
  198. s.name = 'master.DEPS'
  199. s.url = ('https://chrome-internal.googlesource.com/'
  200. 'chrome/tools/build/master.DEPS.git')
  201. c.got_revision_mapping['master.DEPS'] = 'got_revision'
  202. @config_ctx()
  203. def slave_deps(c):
  204. s = c.solutions.add()
  205. s.name = 'slave.DEPS'
  206. s.url = ('https://chrome-internal.googlesource.com/'
  207. 'chrome/tools/build/slave.DEPS.git')
  208. c.got_revision_mapping['slave.DEPS'] = 'got_revision'
  209. @config_ctx()
  210. def internal_deps(c):
  211. s = c.solutions.add()
  212. s.name = 'internal.DEPS'
  213. s.url = ('https://chrome-internal.googlesource.com/'
  214. 'chrome/tools/build/internal.DEPS.git')
  215. c.got_revision_mapping['internal.DEPS'] = 'got_revision'
  216. @config_ctx()
  217. def pdfium(c):
  218. soln = c.solutions.add()
  219. soln.name = 'pdfium'
  220. soln.url = 'https://pdfium.googlesource.com/pdfium.git'
  221. m = c.got_revision_mapping
  222. m['pdfium'] = 'got_revision'
  223. @config_ctx()
  224. def crashpad(c):
  225. soln = c.solutions.add()
  226. soln.name = 'crashpad'
  227. soln.url = 'https://chromium.googlesource.com/crashpad/crashpad.git'
  228. @config_ctx()
  229. def boringssl(c):
  230. soln = c.solutions.add()
  231. soln.name = 'boringssl'
  232. soln.url = 'https://boringssl.googlesource.com/boringssl.git'
  233. soln.deps_file = 'util/bot/DEPS'
  234. @config_ctx()
  235. def dart(c):
  236. soln = c.solutions.add()
  237. soln.name = 'sdk'
  238. soln.url = ('https://dart.googlesource.com/sdk.git')
  239. soln.deps_file = 'DEPS'
  240. soln.managed = False
  241. @config_ctx()
  242. def expect_tests(c):
  243. soln = c.solutions.add()
  244. soln.name = 'expect_tests'
  245. soln.url = 'https://chromium.googlesource.com/infra/testing/expect_tests.git'
  246. c.got_revision_mapping['expect_tests'] = 'got_revision'
  247. @config_ctx()
  248. def infra(c):
  249. soln = c.solutions.add()
  250. soln.name = 'infra'
  251. soln.url = 'https://chromium.googlesource.com/infra/infra.git'
  252. c.got_revision_mapping['infra'] = 'got_revision'
  253. c.repo_path_map.update({
  254. 'https://chromium.googlesource.com/infra/luci/gae': (
  255. 'infra/go/src/go.chromium.org/gae', 'HEAD'),
  256. 'https://chromium.googlesource.com/infra/luci/luci-py': (
  257. 'infra/luci', 'HEAD'),
  258. 'https://chromium.googlesource.com/infra/luci/luci-go': (
  259. 'infra/go/src/go.chromium.org/luci', 'HEAD'),
  260. 'https://chromium.googlesource.com/infra/luci/recipes-py': (
  261. 'infra/recipes-py', 'HEAD')
  262. })
  263. @config_ctx()
  264. def infra_internal(c): # pragma: no cover
  265. soln = c.solutions.add()
  266. soln.name = 'infra_internal'
  267. soln.url = 'https://chrome-internal.googlesource.com/infra/infra_internal.git'
  268. c.got_revision_mapping['infra_internal'] = 'got_revision'
  269. @config_ctx(includes=['infra'])
  270. def luci_gae(c):
  271. # luci/gae is checked out as a part of infra.git solution at HEAD.
  272. c.revisions['infra'] = 'refs/heads/main'
  273. # luci/gae is developed together with luci-go, which should be at HEAD.
  274. c.revisions['infra/go/src/go.chromium.org/luci'] = 'refs/heads/main'
  275. c.revisions['infra/go/src/go.chromium.org/gae'] = (
  276. gclient_api.RevisionFallbackChain('refs/heads/main'))
  277. m = c.got_revision_mapping
  278. del m['infra']
  279. m['infra/go/src/go.chromium.org/gae'] = 'got_revision'
  280. @config_ctx(includes=['infra'])
  281. def luci_go(c):
  282. # luci-go is checked out as a part of infra.git solution at HEAD.
  283. c.revisions['infra'] = 'refs/heads/main'
  284. c.revisions['infra/go/src/go.chromium.org/luci'] = (
  285. gclient_api.RevisionFallbackChain('refs/heads/main'))
  286. m = c.got_revision_mapping
  287. del m['infra']
  288. m['infra/go/src/go.chromium.org/luci'] = 'got_revision'
  289. @config_ctx(includes=['infra'])
  290. def luci_py(c):
  291. # luci-py is checked out as part of infra just to have appengine
  292. # pre-installed, as that's what luci-py PRESUBMIT relies on.
  293. c.revisions['infra'] = 'refs/heads/main'
  294. c.revisions['infra/luci'] = (
  295. gclient_api.RevisionFallbackChain('refs/heads/main'))
  296. m = c.got_revision_mapping
  297. del m['infra']
  298. m['infra/luci'] = 'got_revision'
  299. @config_ctx(includes=['infra'])
  300. def recipes_py(c):
  301. c.revisions['infra'] = 'refs/heads/main'
  302. c.revisions['infra/recipes-py'] = (
  303. gclient_api.RevisionFallbackChain('refs/heads/main'))
  304. m = c.got_revision_mapping
  305. del m['infra']
  306. m['infra/recipes-py'] = 'got_revision'
  307. @config_ctx()
  308. def recipes_py_bare(c):
  309. soln = c.solutions.add()
  310. soln.name = 'recipes-py'
  311. soln.url = 'https://chromium.googlesource.com/infra/luci/recipes-py'
  312. c.got_revision_mapping['recipes-py'] = 'got_revision'
  313. @config_ctx()
  314. def catapult(c):
  315. soln = c.solutions.add()
  316. soln.name = 'catapult'
  317. soln.url = 'https://chromium.googlesource.com/catapult'
  318. c.got_revision_mapping['catapult'] = 'got_revision'
  319. @config_ctx(includes=['infra_internal'])
  320. def infradata_master_manager(c):
  321. soln = c.solutions.add()
  322. soln.name = 'infra-data-master-manager'
  323. soln.url = (
  324. 'https://chrome-internal.googlesource.com/infradata/master-manager.git')
  325. del c.got_revision_mapping['infra_internal']
  326. c.got_revision_mapping['infra-data-master-manager'] = 'got_revision'
  327. @config_ctx()
  328. def infradata_config(c):
  329. soln = c.solutions.add()
  330. soln.name = 'infra-data-config'
  331. soln.url = 'https://chrome-internal.googlesource.com/infradata/config.git'
  332. c.got_revision_mapping['infra-data-config'] = 'got_revision'
  333. @config_ctx()
  334. def infradata_rbe(c):
  335. soln = c.solutions.add()
  336. soln.name = 'infradata-rbe'
  337. soln.url = 'https://chrome-internal.googlesource.com/infradata/rbe.git'
  338. c.got_revision_mapping['infradata-rbe'] = 'got_revision'
  339. @config_ctx()
  340. def with_branch_heads(c):
  341. c.with_branch_heads = True
  342. @config_ctx()
  343. def with_tags(c):
  344. c.with_tags = True
  345. @config_ctx()
  346. def custom_tabs_client(c):
  347. soln = c.solutions.add()
  348. soln.name = 'custom_tabs_client'
  349. # TODO(pasko): test custom-tabs-client within a full chromium checkout.
  350. soln.url = 'https://chromium.googlesource.com/custom-tabs-client'
  351. c.got_revision_mapping['custom_tabs_client'] = 'got_revision'
  352. @config_ctx()
  353. def gerrit_test_cq_normal(c):
  354. soln = c.solutions.add()
  355. soln.name = 'gerrit-test-cq-normal'
  356. soln.url = 'https://chromium.googlesource.com/playground/gerrit-cq/normal.git'
  357. @config_ctx()
  358. def dawn(c):
  359. soln = c.solutions.add()
  360. soln.name = 'dawn'
  361. soln.url = 'https://dawn.googlesource.com/dawn.git'
  362. c.got_revision_mapping['dawn'] = 'got_revision'
  363. @config_ctx()
  364. def celab(c):
  365. soln = c.solutions.add()
  366. # soln.name must match the repo name for `dep` to work properly
  367. soln.name = 'cel'
  368. soln.url = 'https://chromium.googlesource.com/enterprise/cel.git'
  369. c.got_revision_mapping['cel'] = 'got_revision'
  370. @config_ctx()
  371. def openscreen(c):
  372. s = c.solutions.add()
  373. s.name = 'openscreen'
  374. s.url = 'https://chromium.googlesource.com/openscreen'
  375. c.got_revision_mapping['openscreen'] = 'got_revision'
  376. @config_ctx()
  377. def devtools(c):
  378. s = c.solutions.add()
  379. s.name = 'devtools'
  380. s.url = 'https://chromium.googlesource.com/devtools/devtools-frontend.git'
  381. c.got_revision_mapping['devtools'] = 'got_revision'
  382. c.repo_path_map.update({
  383. 'https://chromium.googlesource.com/devtools/devtools-frontend': (
  384. 'devtools/devtools-frontend', 'HEAD'),
  385. })
  386. @config_ctx()
  387. def tint(c):
  388. soln = c.solutions.add()
  389. soln.name = 'tint'
  390. soln.url = 'https://dawn.googlesource.com/tint.git'
  391. c.got_revision_mapping['tint'] = 'got_revision'
  392. @config_ctx()
  393. def gerrit(c):
  394. s = c.solutions.add()
  395. s.name = 'gerrit'
  396. s.url = 'https://gerrit.googlesource.com/gerrit.git'
  397. c.revisions['gerrit'] = 'refs/heads/master'
  398. @config_ctx(includes=['gerrit'])
  399. def gerrit_plugins_binary_size(c):
  400. s = c.solutions.add()
  401. s.name = 'gerrit_plugins_binary_size'
  402. s.url = ChromiumGitURL(c, 'infra', 'gerrit-plugins', 'binary-size.git')
  403. c.got_revision_mapping['gerrit_plugins_binary_size'] = 'got_revision'
  404. @config_ctx(includes=['gerrit'])
  405. def gerrit_plugins_buildbucket(c):
  406. s = c.solutions.add()
  407. s.name = 'gerrit_plugins_buildbucket'
  408. s.url = ChromiumGitURL(c, 'infra', 'gerrit-plugins', 'buildbucket.git')
  409. c.got_revision_mapping['gerrit_plugins_buildbucket'] = 'got_revision'
  410. @config_ctx(includes=['gerrit'])
  411. def gerrit_plugins_chromium_behavior(c):
  412. s = c.solutions.add()
  413. s.name = 'gerrit_plugins_chromium_behavior'
  414. s.url = ChromiumGitURL(c, 'infra', 'gerrit-plugins', 'chromium-behavior.git')
  415. c.got_revision_mapping['gerrit_plugins_chromium_behavior'] = 'got_revision'
  416. @config_ctx(includes=['gerrit'])
  417. def gerrit_plugins_chromium_binary_size(c):
  418. s = c.solutions.add()
  419. s.name = 'gerrit_plugins_chromium_binary_size'
  420. s.url = ChromiumGitURL(c, 'infra', 'gerrit-plugins',
  421. 'chromium-binary-size.git')
  422. c.got_revision_mapping['gerrit_plugins_chromium_binary_size'] = 'got_revision'
  423. @config_ctx(includes=['gerrit'])
  424. def gerrit_plugins_chromium_style(c):
  425. s = c.solutions.add()
  426. s.name = 'gerrit_plugins_chromium_style'
  427. s.url = ChromiumGitURL(c, 'infra', 'gerrit-plugins', 'chromium-style.git')
  428. c.got_revision_mapping['gerrit_plugins_binary_size'] = 'got_revision'
  429. @config_ctx(includes=['gerrit'])
  430. def gerrit_plugins_chumpdetector(c):
  431. s = c.solutions.add()
  432. s.name = 'gerrit_plugins_chumpdetector'
  433. s.url = ChromiumGitURL(c, 'infra', 'gerrit-plugins', 'chumpdetector.git')
  434. c.got_revision_mapping['gerrit_plugins_chumpdetector'] = 'got_revision'
  435. @config_ctx(includes=['gerrit'])
  436. def gerrit_plugins_code_coverage(c):
  437. s = c.solutions.add()
  438. s.name = 'gerrit_plugins_code_coverage'
  439. s.url = ChromiumGitURL(c, 'infra', 'gerrit-plugins', 'code-coverage.git')
  440. c.got_revision_mapping['gerrit_plugins_code_coverage'] = 'got_revision'
  441. @config_ctx(includes=['gerrit'])
  442. def gerrit_plugins_git_numberer(c):
  443. s = c.solutions.add()
  444. s.name = 'gerrit_plugins_git_numberer'
  445. s.url = ChromiumGitURL(c, 'infra', 'gerrit-plugins', 'git-numberer.git')
  446. c.got_revision_mapping['gerrit_plugins_git_numberer'] = 'got_revision'
  447. @config_ctx(includes=['gerrit'])
  448. def gerrit_plugins_landingwidget(c):
  449. s = c.solutions.add()
  450. s.name = 'gerrit_plugins_landingwidget'
  451. s.url = ChromiumGitURL(c, 'infra', 'gerrit-plugins', 'landingwidget.git')
  452. c.got_revision_mapping['gerrit_plugins_landingwidget'] = 'got_revision'
  453. @config_ctx(includes=['gerrit'])
  454. def gerrit_plugins_tricium(c):
  455. s = c.solutions.add()
  456. s.name = 'gerrit_plugins_tricium'
  457. s.url = ChromiumGitURL(c, 'infra', 'gerrit-plugins', 'tricium.git')
  458. c.got_revision_mapping['gerrit_plugins_tricium'] = 'got_revision'