1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
|
# Copyright 2024 The Chromium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""Top-level presubmit for //third_party/rust
See https://www.chromium.org/developers/how-tos/depottools/presubmit-scripts
for more details about the presubmit API built into depot_tools.
"""
PRESUBMIT_VERSION = '2.0.0'
import re
def CheckForManualEditsOfGnrtAutogeneratedFiles(input_api, output_api):
GNRT_INPUTS = [
"tools/crates/gnrt/.*",
"tools/crates/run_gnrt.py",
"third_party/rust/chromium_crates_io/patches/.*",
"third_party/rust/chromium_crates_io/Cargo.lock",
"third_party/rust/chromium_crates_io/Cargo.toml",
"third_party/rust/chromium_crates_io/BUILD.gn.hbs",
"third_party/rust/chromium_crates_io/README.chromium.hbs",
"third_party/rust/chromium_crates_io/gnrt_config.toml",
]
GNRT_OUTPUTS = [
"third_party/rust/chromium_crates_io/vendor/.*",
"third_party/rust/[^/]*/v[0-9_]*/BUILD.gn",
"third_party/rust/[^/]*/v[0-9_]*/README.chromium",
]
input_regexes = [re.compile(r) for r in GNRT_INPUTS]
output_regexes = [re.compile(r) for r in GNRT_OUTPUTS]
is_input_path_predicate = lambda p: any(r.match(p) for r in input_regexes)
is_output_path_predicate = lambda p: any(r.match(p) for r in output_regexes)
affected_paths = [f.UnixLocalPath() for f in input_api.change.AffectedFiles()]
affected_input_paths = filter(is_input_path_predicate, affected_paths)
if not any(affected_input_paths):
affected_output_paths = filter(is_output_path_predicate, affected_paths)
error_msg_paths_count = 0
error_msg_paths_snippet = ""
for path in affected_output_paths:
if error_msg_paths_count == 5:
error_msg_paths_snippet += f"\n ..."
break
else:
error_msg_paths_snippet += f"\n {path}"
error_msg_paths_count += 1
if error_msg_paths_count != 0:
# TODO(lukasza): Ideally we would give a suggestion to run `gnrt`,
# but `tools/crates/run_gnrt.py vendor` will only check the crate
# version and won't redownload if the version matches expectations
# (even if crate sources have been modified).
return [output_api.PresubmitError(
f"ERROR: The CL manually changes files auto-generated by `gnrt`",
long_text=\
f"The CL modifies the following auto-generated file(s):" +
f"{error_msg_paths_snippet}\n" +
f"without modifying any generator inputs.\n" +
f"See `//docs/rust.md` for instructions for running `gnrt`"
)]
return []
|