qyearsley | 61be68b | 2015-07-06 12:57:02 -0700 | [diff] [blame] | 1 | # Copyright 2015 The Chromium Authors. All rights reserved. |
sullivan | 3283c9a | 2015-05-28 12:41:09 -0700 | [diff] [blame] | 2 | # Use of this source code is governed by a BSD-style license that can be |
| 3 | # found in the LICENSE file. |
| 4 | |
| 5 | """Top-level presubmit script for catapult. |
| 6 | |
| 7 | See https://www.chromium.org/developers/how-tos/depottools/presubmit-scripts |
| 8 | for more details about the presubmit API built into depot_tools. |
| 9 | """ |
sullivan | 497af69 | 2015-08-11 10:39:21 -0700 | [diff] [blame] | 10 | import re |
Petr Cermak | 3946db2 | 2015-05-22 15:35:39 +0100 | [diff] [blame] | 11 | import sys |
sullivan | 3283c9a | 2015-05-28 12:41:09 -0700 | [diff] [blame] | 12 | |
sullivan | 7bb77ca | 2015-08-07 10:44:03 -0700 | [diff] [blame] | 13 | _EXCLUDED_PATHS = ( |
dtu | a9d94bc | 2015-09-15 13:54:19 -0700 | [diff] [blame] | 14 | r'(.*[\\/])?\.git[\\/].*', |
sullivan | 7bb77ca | 2015-08-07 10:44:03 -0700 | [diff] [blame] | 15 | r'.+\.png$', |
| 16 | r'.+\.svg$', |
| 17 | r'.+\.skp$', |
| 18 | r'.+\.gypi$', |
| 19 | r'.+\.gyp$', |
| 20 | r'.+\.gn$', |
| 21 | r'.*\.gitignore$', |
| 22 | r'.*codereview.settings$', |
| 23 | r'.*AUTHOR$', |
| 24 | r'^CONTRIBUTORS\.md$', |
| 25 | r'.*LICENSE$', |
| 26 | r'.*OWNERS$', |
| 27 | r'.*README\.md$', |
sullivan | f8f372d | 2017-05-12 14:16:25 -0700 | [diff] [blame] | 28 | r'^dashboard[\\/]dashboard[\\/]api[\\/]examples[\\/].*.js', |
dtu | a9d94bc | 2015-09-15 13:54:19 -0700 | [diff] [blame] | 29 | r'^dashboard[\\/]dashboard[\\/]templates[\\/].*', |
Dean Michael Berris | f616294 | 2019-05-01 17:16:35 +1000 | [diff] [blame] | 30 | r'^dashboard[\\/]dashboard[\\/]sheriff_config[\\/].*_pb2.py$', |
dtu | a9d94bc | 2015-09-15 13:54:19 -0700 | [diff] [blame] | 31 | r'^experimental[\\/]heatmap[\\/].*', |
primiano | 494b9b2 | 2017-04-10 13:15:36 -0700 | [diff] [blame] | 32 | r'^experimental[\\/]trace_on_tap[\\/]third_party[\\/].*', |
Annie Sullivan | 308728e | 2018-06-14 17:07:11 -0400 | [diff] [blame] | 33 | r'^experimental[\\/]perf_sheriffing_emailer[\\/].*.js', |
dtu | a9d94bc | 2015-09-15 13:54:19 -0700 | [diff] [blame] | 34 | r'^perf_insights[\\/]test_data[\\/].*', |
| 35 | r'^perf_insights[\\/]third_party[\\/].*', |
nednguyen | c9667ec | 2017-09-05 15:49:12 -0700 | [diff] [blame] | 36 | r'^telemetry[\\/]third_party[\\/].*', |
dtu | a9d94bc | 2015-09-15 13:54:19 -0700 | [diff] [blame] | 37 | r'^third_party[\\/].*', |
| 38 | r'^tracing[\\/]\.allow-devtools-save$', |
| 39 | r'^tracing[\\/]bower\.json$', |
| 40 | r'^tracing[\\/]\.bowerrc$', |
| 41 | r'^tracing[\\/]tracing_examples[\\/]string_convert\.js$', |
| 42 | r'^tracing[\\/]test_data[\\/].*', |
| 43 | r'^tracing[\\/]third_party[\\/].*', |
Oystein Eftevaag | 8138826 | 2017-10-04 15:06:44 -0700 | [diff] [blame] | 44 | r'^py_vulcanize[\\/]third_party[\\/].*', |
| 45 | r'^common/py_vulcanize[\\/].*', # TODO(hjd): Remove after fixing long lines. |
sullivan | 7bb77ca | 2015-08-07 10:44:03 -0700 | [diff] [blame] | 46 | ) |
| 47 | |
sullivan | 3283c9a | 2015-05-28 12:41:09 -0700 | [diff] [blame] | 48 | |
Aaron Gable | 6907a1c | 2017-10-09 12:59:45 -0700 | [diff] [blame] | 49 | _GITHUB_BUG_ID_RE = re.compile(r'#[1-9]\d*') |
| 50 | _MONORAIL_BUG_ID_RE = re.compile(r'[1-9]\d*') |
Nghia Nguyen | 219bbf1 | 2018-04-20 07:39:12 -0700 | [diff] [blame] | 51 | _MONORAIL_PROJECT_NAMES = frozenset({'chromium', 'v8', 'angleproject', 'skia'}) |
petrcermak | dad7f31 | 2016-06-01 05:49:22 -0700 | [diff] [blame] | 52 | |
sullivan | 497af69 | 2015-08-11 10:39:21 -0700 | [diff] [blame] | 53 | def CheckChangeLogBug(input_api, output_api): |
agable | 622801d | 2017-05-22 10:12:27 -0700 | [diff] [blame] | 54 | # Show a presubmit message if there is no Bug line or an empty Bug line. |
| 55 | if not input_api.change.BugsFromDescription(): |
petrcermak | dad7f31 | 2016-06-01 05:49:22 -0700 | [diff] [blame] | 56 | return [output_api.PresubmitNotifyResult( |
Aaron Gable | 6907a1c | 2017-10-09 12:59:45 -0700 | [diff] [blame] | 57 | 'If this change has associated bugs on GitHub or Monorail, add a ' |
agable | 622801d | 2017-05-22 10:12:27 -0700 | [diff] [blame] | 58 | '"Bug: <bug>(, <bug>)*" line to the patch description where <bug> can ' |
petrcermak | dad7f31 | 2016-06-01 05:49:22 -0700 | [diff] [blame] | 59 | 'be one of the following: catapult:#NNNN, ' + |
Aaron Gable | 6907a1c | 2017-10-09 12:59:45 -0700 | [diff] [blame] | 60 | ', '.join('%s:NNNNNN' % n for n in _MONORAIL_PROJECT_NAMES) + '.')] |
petrcermak | dad7f31 | 2016-06-01 05:49:22 -0700 | [diff] [blame] | 61 | |
petrcermak | dad7f31 | 2016-06-01 05:49:22 -0700 | [diff] [blame] | 62 | # Check that each bug in the BUG= line has the correct format. |
| 63 | error_messages = [] |
| 64 | catapult_bug_provided = False |
petrcermak | dad7f31 | 2016-06-01 05:49:22 -0700 | [diff] [blame] | 65 | |
agable | 622801d | 2017-05-22 10:12:27 -0700 | [diff] [blame] | 66 | for index, bug in enumerate(input_api.change.BugsFromDescription()): |
petrcermak | dad7f31 | 2016-06-01 05:49:22 -0700 | [diff] [blame] | 67 | # Check if the bug can be split into a repository name and a bug ID (e.g. |
| 68 | # 'catapult:#1234' -> 'catapult' and '#1234'). |
| 69 | bug_parts = bug.split(':') |
| 70 | if len(bug_parts) != 2: |
| 71 | error_messages.append('Invalid bug "%s". Bugs should be provided in the ' |
Aaron Gable | 6907a1c | 2017-10-09 12:59:45 -0700 | [diff] [blame] | 72 | '"<project-name>:<bug-id>" format.' % bug) |
petrcermak | dad7f31 | 2016-06-01 05:49:22 -0700 | [diff] [blame] | 73 | continue |
Aaron Gable | 6907a1c | 2017-10-09 12:59:45 -0700 | [diff] [blame] | 74 | project_name, bug_id = bug_parts |
petrcermak | dad7f31 | 2016-06-01 05:49:22 -0700 | [diff] [blame] | 75 | |
Aaron Gable | 6907a1c | 2017-10-09 12:59:45 -0700 | [diff] [blame] | 76 | if project_name == 'catapult': |
Dave Tu | b3611d5 | 2017-10-09 18:38:58 -0700 | [diff] [blame] | 77 | if not _GITHUB_BUG_ID_RE.match(bug_id): |
petrcermak | dad7f31 | 2016-06-01 05:49:22 -0700 | [diff] [blame] | 78 | error_messages.append('Invalid bug "%s". Bugs in the Catapult ' |
| 79 | 'repository should be provided in the ' |
| 80 | '"catapult:#NNNN" format.' % bug) |
| 81 | catapult_bug_provided = True |
Aaron Gable | 6907a1c | 2017-10-09 12:59:45 -0700 | [diff] [blame] | 82 | elif project_name in _MONORAIL_PROJECT_NAMES: |
| 83 | if not _MONORAIL_BUG_ID_RE.match(bug_id): |
| 84 | error_messages.append('Invalid bug "%s". Bugs in the Monorail %s ' |
| 85 | 'project should be provided in the ' |
| 86 | '"%s:NNNNNN" format.' % (bug, project_name, |
| 87 | project_name)) |
petrcermak | dad7f31 | 2016-06-01 05:49:22 -0700 | [diff] [blame] | 88 | else: |
| 89 | error_messages.append('Invalid bug "%s". Unknown repository "%s".' % ( |
Aaron Gable | 6907a1c | 2017-10-09 12:59:45 -0700 | [diff] [blame] | 90 | bug, project_name)) |
petrcermak | dad7f31 | 2016-06-01 05:49:22 -0700 | [diff] [blame] | 91 | |
petrcermak | dad7f31 | 2016-06-01 05:49:22 -0700 | [diff] [blame] | 92 | return map(output_api.PresubmitError, error_messages) |
sullivan | 497af69 | 2015-08-11 10:39:21 -0700 | [diff] [blame] | 93 | |
| 94 | |
Petr Cermak | 3946db2 | 2015-05-22 15:35:39 +0100 | [diff] [blame] | 95 | def CheckChange(input_api, output_api): |
sullivan | 1e38874 | 2015-08-03 13:45:35 -0700 | [diff] [blame] | 96 | results = [] |
Petr Cermak | 3946db2 | 2015-05-22 15:35:39 +0100 | [diff] [blame] | 97 | try: |
| 98 | sys.path += [input_api.PresubmitLocalPath()] |
benjhayden | 448b06c | 2017-07-05 21:42:49 -0700 | [diff] [blame] | 99 | |
| 100 | from catapult_build import bin_checks |
qyearsley | bd4fba6 | 2015-11-11 12:02:41 -0800 | [diff] [blame] | 101 | from catapult_build import html_checks |
benjhayden | 448b06c | 2017-07-05 21:42:49 -0700 | [diff] [blame] | 102 | from catapult_build import js_checks |
petrcermak | 1fda6fc | 2016-02-24 10:15:03 -0800 | [diff] [blame] | 103 | from catapult_build import repo_checks |
benjhayden | 448b06c | 2017-07-05 21:42:49 -0700 | [diff] [blame] | 104 | |
sullivan | 497af69 | 2015-08-11 10:39:21 -0700 | [diff] [blame] | 105 | results += input_api.canned_checks.PanProjectChecks( |
| 106 | input_api, output_api, excluded_paths=_EXCLUDED_PATHS) |
Sergiy Byelozyorov | 48ce525 | 2017-11-03 12:42:28 +0100 | [diff] [blame] | 107 | results += input_api.RunTests( |
| 108 | input_api.canned_checks.CheckVPythonSpec(input_api, output_api)) |
sullivan | 497af69 | 2015-08-11 10:39:21 -0700 | [diff] [blame] | 109 | results += CheckChangeLogBug(input_api, output_api) |
qyearsley | e080ff9 | 2015-08-17 11:19:59 -0700 | [diff] [blame] | 110 | results += js_checks.RunChecks( |
| 111 | input_api, output_api, excluded_paths=_EXCLUDED_PATHS) |
Ryan Heise | f85be7e | 2021-02-26 17:21:50 +0000 | [diff] [blame] | 112 | results += input_api.RunTests( |
| 113 | input_api.canned_checks.CheckPatchFormatted(input_api, output_api, |
| 114 | check_js=True)) |
qyearsley | bd4fba6 | 2015-11-11 12:02:41 -0800 | [diff] [blame] | 115 | results += html_checks.RunChecks( |
| 116 | input_api, output_api, excluded_paths=_EXCLUDED_PATHS) |
petrcermak | 1fda6fc | 2016-02-24 10:15:03 -0800 | [diff] [blame] | 117 | results += repo_checks.RunChecks(input_api, output_api) |
benjhayden | 448b06c | 2017-07-05 21:42:49 -0700 | [diff] [blame] | 118 | results += bin_checks.RunChecks( |
| 119 | input_api, output_api, excluded_paths=_EXCLUDED_PATHS) |
Petr Cermak | 3946db2 | 2015-05-22 15:35:39 +0100 | [diff] [blame] | 120 | finally: |
nduca | a6e18a9 | 2015-08-09 17:06:32 -0700 | [diff] [blame] | 121 | sys.path.remove(input_api.PresubmitLocalPath()) |
sullivan | 1e38874 | 2015-08-03 13:45:35 -0700 | [diff] [blame] | 122 | return results |
sullivan | c11564b | 2015-06-25 10:37:29 -0700 | [diff] [blame] | 123 | |
| 124 | |
| 125 | def CheckChangeOnUpload(input_api, output_api): |
Zhenyao Mo | 074cebc | 2018-08-27 11:31:05 -0700 | [diff] [blame] | 126 | results = CheckChange(input_api, output_api) |
| 127 | cwd = input_api.PresubmitLocalPath() |
| 128 | exit_code = input_api.subprocess.call( |
| 129 | [input_api.python_executable, 'generate_telemetry_build.py', '--check'], |
| 130 | cwd=cwd) |
| 131 | if exit_code != 0: |
| 132 | results.append(output_api.PresubmitError( |
| 133 | 'BUILD.gn needs to be re-generated. Please run ' |
| 134 | '%s/generate_telemetry_build.py and include the changes in this CL' % |
| 135 | cwd)) |
| 136 | return results |
sullivan | c11564b | 2015-06-25 10:37:29 -0700 | [diff] [blame] | 137 | |
| 138 | def CheckChangeOnCommit(input_api, output_api): |
Petr Cermak | 3946db2 | 2015-05-22 15:35:39 +0100 | [diff] [blame] | 139 | return CheckChange(input_api, output_api) |