From accb23a9456b9fef5186b389cd38c5cb201ce723 Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Wed, 15 Jul 2026 09:14:10 -0400 Subject: [PATCH 1/2] Add check for pre-release generated content --- .pre-commit-config.yaml | 8 ++++ toolshed/check_generated_file_ctk_version.py | 41 ++++++++++++++++++++ 2 files changed, 49 insertions(+) create mode 100644 toolshed/check_generated_file_ctk_version.py diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 029e69da916..aa45082e45f 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -50,6 +50,14 @@ repos: files: ^cuda_bindings/ types: [text] + - id: check-generated-file-ctk-version + name: Check generated-file CTK version ceiling + entry: python ./toolshed/check_generated_file_ctk_version.py + language: python + files: ^cuda_bindings/ + types: [text] + additional_dependencies: [pyyaml] + - id: no-markdown-in-docs-source name: Prevent markdown files in docs/source directories entry: bash -c diff --git a/toolshed/check_generated_file_ctk_version.py b/toolshed/check_generated_file_ctk_version.py new file mode 100644 index 00000000000..2070d97d48e --- /dev/null +++ b/toolshed/check_generated_file_ctk_version.py @@ -0,0 +1,41 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 + +import re +import sys +from pathlib import Path + +import yaml + +_GENERATED_MARKER = "CYTHON-BINDINGS-GENERATED-DO-NOT-MODIFY-THIS-FILE:" +_VERSION_RE = re.compile(r"generated across versions from \S+ to (\d+\.\d+)") + + +def major_minor(version_str): + major, minor = version_str.split(".")[:2] + return (int(major), int(minor)) + + +def main(argv): + data = yaml.safe_load(Path("ci/versions.yml").read_text()) + latest_mm = major_minor(data["cuda"]["build"]["version"]) + + failed = False + for path in map(Path, argv): + content = path.read_text(encoding="utf-8", errors="replace") + if _GENERATED_MARKER not in content: + continue + m = _VERSION_RE.search(content) + if m and major_minor(m.group(1)) > latest_mm: + print( + f"ERROR: {path}: generated up to CTK {m.group(1)}, which exceeds " + f"ci/versions.yml cuda.build.version {'.'.join(str(x) for x in latest_mm)}. " + f"Update ci/versions.yml if a new CTK release is intended." + ) + failed = True + + return int(failed) + + +if __name__ == "__main__": + sys.exit(main(sys.argv[1:])) From 89586ee9afe3f30f04bffdcfaf57cfea500f89db Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Tue, 28 Jul 2026 10:54:47 -0400 Subject: [PATCH 2/2] Address comments in the PR --- .pre-commit-config.yaml | 1 + toolshed/check_generated_file_ctk_version.py | 9 ++++++--- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index aa45082e45f..8f3d86594ff 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -56,6 +56,7 @@ repos: language: python files: ^cuda_bindings/ types: [text] + exclude: ^cuda_bindings/cuda/bindings/_internal/_fast_enum\.py$ additional_dependencies: [pyyaml] - id: no-markdown-in-docs-source diff --git a/toolshed/check_generated_file_ctk_version.py b/toolshed/check_generated_file_ctk_version.py index 2070d97d48e..96bcfa0fa95 100644 --- a/toolshed/check_generated_file_ctk_version.py +++ b/toolshed/check_generated_file_ctk_version.py @@ -8,7 +8,7 @@ import yaml _GENERATED_MARKER = "CYTHON-BINDINGS-GENERATED-DO-NOT-MODIFY-THIS-FILE:" -_VERSION_RE = re.compile(r"generated across versions from \S+ to (\d+\.\d+)") +_VERSION_RE = re.compile(r"(?:generated across versions from \S+ to|generated with version) (?P\d+\.\d+)") def major_minor(version_str): @@ -26,13 +26,16 @@ def main(argv): if _GENERATED_MARKER not in content: continue m = _VERSION_RE.search(content) - if m and major_minor(m.group(1)) > latest_mm: + if m and major_minor(m.group("ver")) > latest_mm: print( - f"ERROR: {path}: generated up to CTK {m.group(1)}, which exceeds " + f"ERROR: {path}: generated up to CTK {m.group('ver')}, which exceeds " f"ci/versions.yml cuda.build.version {'.'.join(str(x) for x in latest_mm)}. " f"Update ci/versions.yml if a new CTK release is intended." ) failed = True + elif not m: + print(f"ERROR: {path}: could not find CTK version in generated file.") + failed = True return int(failed)