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