Skip to content

Commit 822217b

Browse files
committed
Initial version of pre-commit "Check SPDX-License-Identifier"
1 parent bbbb666 commit 822217b

3 files changed

Lines changed: 254 additions & 0 deletions

File tree

.pre-commit-config.yaml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,14 @@ repos:
1919
- id: ruff
2020
args: [--fix, --show-fixes]
2121
- id: ruff-format
22+
23+
- repo: local
24+
hooks:
25+
- id: check-spdx
26+
name: Check SPDX-License-Identifier
27+
entry: ./toolshed/check_spdx.py
28+
language: system
29+
2230
- repo: https://github.com/PyCQA/bandit
2331
rev: 8ff25e07e487f143571cc305e56dd0253c60bc7b #v1.8.3
2432
hooks:

.spdx-ignore

Lines changed: 196 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,196 @@
1+
# Cleanup hint: tail -n +2 .spdx-ignore | LC_ALL=C sort | uniq
2+
.gitattributes
3+
.github/BACKPORT_BRANCH
4+
.github/PULL_REQUEST_TEMPLATE.md
5+
.github/copy-pr-bot.yaml
6+
.gitignore
7+
CONTRIBUTING.md
8+
LICENSE.md
9+
README.md
10+
SECURITY.md
11+
ci/versions.json
12+
cuda_bindings/LICENSE
13+
cuda_bindings/MANIFEST.in
14+
cuda_bindings/README.md
15+
cuda_bindings/benchmarks/conftest.py
16+
cuda_bindings/benchmarks/kernels.py
17+
cuda_bindings/benchmarks/pytest.ini
18+
cuda_bindings/benchmarks/test_cupy.py
19+
cuda_bindings/benchmarks/test_launch_latency.py
20+
cuda_bindings/benchmarks/test_numba.py
21+
cuda_bindings/benchmarks/test_pointer_attributes.py
22+
cuda_bindings/cuda/bindings/__init__.pxd
23+
cuda_bindings/cuda/bindings/__init__.py
24+
cuda_bindings/cuda/bindings/_bindings/__init__.py
25+
cuda_bindings/cuda/bindings/_bindings/cydriver.pxd.in
26+
cuda_bindings/cuda/bindings/_bindings/cydriver.pyx.in
27+
cuda_bindings/cuda/bindings/_bindings/cynvrtc.pxd.in
28+
cuda_bindings/cuda/bindings/_bindings/cynvrtc.pyx.in
29+
cuda_bindings/cuda/bindings/_bindings/cyruntime.pxd.in
30+
cuda_bindings/cuda/bindings/_bindings/cyruntime.pyx.in
31+
cuda_bindings/cuda/bindings/_bindings/cyruntime_ptds.pxd.in
32+
cuda_bindings/cuda/bindings/_bindings/cyruntime_ptds.pyx.in
33+
cuda_bindings/cuda/bindings/_bindings/loader.cpp
34+
cuda_bindings/cuda/bindings/_bindings/loader.h
35+
cuda_bindings/cuda/bindings/_bindings/loader.pxd
36+
cuda_bindings/cuda/bindings/_internal/__init__.py
37+
cuda_bindings/cuda/bindings/_lib/__init__.py
38+
cuda_bindings/cuda/bindings/_lib/cyruntime/__init__.py
39+
cuda_bindings/cuda/bindings/_lib/cyruntime/cyruntime.pxd.in
40+
cuda_bindings/cuda/bindings/_lib/cyruntime/cyruntime.pyx.in
41+
cuda_bindings/cuda/bindings/_lib/cyruntime/utils.pxd.in
42+
cuda_bindings/cuda/bindings/_lib/cyruntime/utils.pyx.in
43+
cuda_bindings/cuda/bindings/_lib/dlfcn.pxd
44+
cuda_bindings/cuda/bindings/_lib/param_packer.cpp
45+
cuda_bindings/cuda/bindings/_lib/param_packer.h
46+
cuda_bindings/cuda/bindings/_lib/param_packer.pxd
47+
cuda_bindings/cuda/bindings/_lib/utils.pxd.in
48+
cuda_bindings/cuda/bindings/_lib/utils.pyx.in
49+
cuda_bindings/cuda/bindings/_path_finder/README.md
50+
cuda_bindings/cuda/bindings/_version.py
51+
cuda_bindings/cuda/bindings/cydriver.pxd.in
52+
cuda_bindings/cuda/bindings/cydriver.pyx.in
53+
cuda_bindings/cuda/bindings/cynvrtc.pxd.in
54+
cuda_bindings/cuda/bindings/cynvrtc.pyx.in
55+
cuda_bindings/cuda/bindings/cyruntime.pxd.in
56+
cuda_bindings/cuda/bindings/cyruntime.pyx.in
57+
cuda_bindings/cuda/bindings/cyruntime_functions.pxi.in
58+
cuda_bindings/cuda/bindings/cyruntime_types.pxi.in
59+
cuda_bindings/cuda/bindings/driver.pxd.in
60+
cuda_bindings/cuda/bindings/driver.pyx.in
61+
cuda_bindings/cuda/bindings/nvrtc.pxd.in
62+
cuda_bindings/cuda/bindings/nvrtc.pyx.in
63+
cuda_bindings/cuda/bindings/runtime.pxd.in
64+
cuda_bindings/cuda/bindings/runtime.pyx.in
65+
cuda_bindings/cuda/ccuda.pxd
66+
cuda_bindings/cuda/ccuda.pyx
67+
cuda_bindings/cuda/ccudart.pxd
68+
cuda_bindings/cuda/ccudart.pyx
69+
cuda_bindings/cuda/cnvrtc.pxd
70+
cuda_bindings/cuda/cnvrtc.pyx
71+
cuda_bindings/cuda/cuda.pyx
72+
cuda_bindings/cuda/cudart.pyx
73+
cuda_bindings/cuda/nvrtc.pyx
74+
cuda_bindings/docs/Makefile
75+
cuda_bindings/docs/README.md
76+
cuda_bindings/docs/build_docs.sh
77+
cuda_bindings/docs/make.bat
78+
cuda_bindings/docs/source/_static/images/Nsight-Compute-CLI-625x473.png
79+
cuda_bindings/docs/source/_static/javascripts/version_dropdown.js
80+
cuda_bindings/docs/source/_static/logo-dark-mode.png
81+
cuda_bindings/docs/source/_static/logo-light-mode.png
82+
cuda_bindings/docs/source/_templates/main.html
83+
cuda_bindings/docs/source/_templates/sidebar/variant-selector.html
84+
cuda_bindings/docs/source/conduct.md
85+
cuda_bindings/docs/source/conf.py
86+
cuda_bindings/docs/source/contribute.md
87+
cuda_bindings/docs/source/environment_variables.md
88+
cuda_bindings/docs/source/install.md
89+
cuda_bindings/docs/source/motivation.md
90+
cuda_bindings/docs/source/overview.md
91+
cuda_bindings/docs/source/release/11.4.0-notes.md
92+
cuda_bindings/docs/source/release/11.5.0-notes.md
93+
cuda_bindings/docs/source/release/11.6.0-notes.md
94+
cuda_bindings/docs/source/release/11.6.1-notes.md
95+
cuda_bindings/docs/source/release/11.7.0-notes.md
96+
cuda_bindings/docs/source/release/11.7.1-notes.md
97+
cuda_bindings/docs/source/release/11.8.0-notes.md
98+
cuda_bindings/docs/source/release/11.8.1-notes.md
99+
cuda_bindings/docs/source/release/11.8.2-notes.md
100+
cuda_bindings/docs/source/release/11.8.3-notes.md
101+
cuda_bindings/docs/source/release/11.8.4-notes.md
102+
cuda_bindings/docs/source/release/11.8.5-notes.md
103+
cuda_bindings/docs/source/release/11.8.6-notes.md
104+
cuda_bindings/docs/source/release/12.0.0-notes.md
105+
cuda_bindings/docs/source/release/12.1.0-notes.md
106+
cuda_bindings/docs/source/release/12.2.0-notes.md
107+
cuda_bindings/docs/source/release/12.2.1-notes.md
108+
cuda_bindings/docs/source/release/12.3.0-notes.md
109+
cuda_bindings/docs/source/release/12.4.0-notes.md
110+
cuda_bindings/docs/source/release/12.5.0-notes.md
111+
cuda_bindings/docs/source/release/12.6.0-notes.md
112+
cuda_bindings/docs/source/release/12.6.1-notes.md
113+
cuda_bindings/docs/source/release/12.6.2-notes.md
114+
cuda_bindings/docs/source/release/12.8.0-notes.md
115+
cuda_bindings/docs/versions.json
116+
cuda_bindings/examples/0_Introduction/clock_nvrtc_test.py
117+
cuda_bindings/examples/0_Introduction/simpleCubemapTexture_test.py
118+
cuda_bindings/examples/0_Introduction/simpleP2P_test.py
119+
cuda_bindings/examples/0_Introduction/simpleZeroCopy_test.py
120+
cuda_bindings/examples/0_Introduction/systemWideAtomics_test.py
121+
cuda_bindings/examples/0_Introduction/vectorAddDrv_test.py
122+
cuda_bindings/examples/0_Introduction/vectorAddMMAP_test.py
123+
cuda_bindings/examples/2_Concepts_and_Techniques/streamOrderedAllocation_test.py
124+
cuda_bindings/examples/3_CUDA_Features/globalToShmemAsyncCopy_test.py
125+
cuda_bindings/examples/3_CUDA_Features/simpleCudaGraphs_test.py
126+
cuda_bindings/examples/4_CUDA_Libraries/conjugateGradientMultiBlockCG_test.py
127+
cuda_bindings/examples/common/common.py
128+
cuda_bindings/examples/common/helper_cuda.py
129+
cuda_bindings/examples/common/helper_string.py
130+
cuda_bindings/examples/extra/isoFDModelling_test.py
131+
cuda_bindings/examples/extra/jit_program_test.py
132+
cuda_bindings/examples/extra/numba_emm_plugin.py
133+
cuda_bindings/examples/pytest.ini
134+
cuda_bindings/requirements.txt
135+
cuda_bindings/site-packages/_cuda_bindings_redirector.pth
136+
cuda_bindings/site-packages/_cuda_bindings_redirector.py
137+
cuda_bindings/tests/cython/build_tests.bat
138+
cuda_bindings/tests/cython/build_tests.sh
139+
cuda_bindings/tests/cython/test_ccuda.pyx
140+
cuda_bindings/tests/cython/test_ccudart.pyx
141+
cuda_bindings/tests/cython/test_cython.py
142+
cuda_bindings/tests/cython/test_interoperability_cython.pyx
143+
cuda_bindings/tests/pytest.ini
144+
cuda_bindings/tests/test_cuda.py
145+
cuda_bindings/tests/test_cudart.py
146+
cuda_bindings/tests/test_interoperability.py
147+
cuda_bindings/tests/test_kernelParams.py
148+
cuda_bindings/tests/test_nvrtc.py
149+
cuda_core/LICENSE
150+
cuda_core/README.md
151+
cuda_core/cuda/core/__init__.pxd
152+
cuda_core/cuda/core/experimental/dlpack.h
153+
cuda_core/docs/Makefile
154+
cuda_core/docs/README.md
155+
cuda_core/docs/build_docs.sh
156+
cuda_core/docs/source/_static/javascripts/version_dropdown.js
157+
cuda_core/docs/source/_static/logo-dark-mode.png
158+
cuda_core/docs/source/_static/logo-light-mode.png
159+
cuda_core/docs/source/_templates/main.html
160+
cuda_core/docs/source/_templates/sidebar/variant-selector.html
161+
cuda_core/docs/source/conduct.md
162+
cuda_core/docs/source/install.md
163+
cuda_core/docs/versions.json
164+
cuda_core/tests/conftest.py
165+
cuda_core/tests/cython/build_tests.sh
166+
cuda_core/tests/example_tests/__init__.py
167+
cuda_core/tests/example_tests/test_basic_examples.py
168+
cuda_core/tests/example_tests/utils.py
169+
cuda_core/tests/requirements-cu11.txt
170+
cuda_core/tests/requirements-cu12.txt
171+
cuda_core/tests/test_context.py
172+
cuda_core/tests/test_device.py
173+
cuda_core/tests/test_event.py
174+
cuda_core/tests/test_launcher.py
175+
cuda_core/tests/test_memory.py
176+
cuda_core/tests/test_module.py
177+
cuda_core/tests/test_stream.py
178+
cuda_core/tests/test_system.py
179+
cuda_python/LICENSE
180+
cuda_python/docs/Makefile
181+
cuda_python/docs/README.md
182+
cuda_python/docs/build_all_docs.sh
183+
cuda_python/docs/build_docs.sh
184+
cuda_python/docs/environment-docs.yml
185+
cuda_python/docs/source/_static/javascripts/version_dropdown.js
186+
cuda_python/docs/source/_static/logo-dark-mode.png
187+
cuda_python/docs/source/_static/logo-light-mode.png
188+
cuda_python/docs/source/_templates/main.html
189+
cuda_python/docs/source/_templates/sidebar/variant-selector.html
190+
cuda_python/docs/source/conf.py
191+
cuda_python/docs/source/release.md
192+
cuda_python/docs/source/release/11.8.6-notes.md
193+
cuda_python/docs/source/release/12.6.1-notes.md
194+
cuda_python/docs/source/release/12.6.2-notes.md
195+
cuda_python/docs/source/release/12.8.0-notes.md
196+
cuda_python/docs/versions.json

toolshed/check_spdx.py

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
#!/usr/bin/env python3
2+
3+
# Copyright (c) 2025, NVIDIA CORPORATION & AFFILIATES. ALL RIGHTS RESERVED.
4+
# SPDX-License-Identifier: Apache-2.0
5+
6+
import os
7+
import sys
8+
9+
# Intentionally puzzling together EXPECTED_SPDX_STR so that we don't overlook
10+
# if the identifier is missing in this file.
11+
EXPECTED_SPDX_STR = "-".join(("SPDX", "License", "Identifier: "))
12+
EXPECTED_SPDX_BYTES = EXPECTED_SPDX_STR.encode()
13+
14+
SPDX_IGNORE_FILENAME = ".spdx-ignore"
15+
16+
17+
def load_spdx_ignore():
18+
if not os.path.exists(SPDX_IGNORE_FILENAME):
19+
return set()
20+
lines = []
21+
with open(SPDX_IGNORE_FILENAME, "r", encoding="utf-8") as f:
22+
for line in f.read().splitlines():
23+
if not line.startswith("#"):
24+
lines.append(line)
25+
ignore_set = set(lines)
26+
ignore_set.add(SPDX_IGNORE_FILENAME)
27+
return ignore_set
28+
29+
30+
def has_spdx(filepath):
31+
with open(filepath, "rb") as f:
32+
blob = f.read()
33+
return EXPECTED_SPDX_BYTES in blob
34+
35+
36+
def main(args):
37+
assert args, "filepaths expected to be passed from pre-commit"
38+
39+
ignore_set = load_spdx_ignore()
40+
41+
returncode = 0
42+
for filepath in args:
43+
if not has_spdx(filepath) and filepath not in ignore_set:
44+
print(f"MISSING {EXPECTED_SPDX_STR} {filepath!r}")
45+
returncode = 1
46+
return returncode
47+
48+
49+
if __name__ == "__main__":
50+
sys.exit(main(sys.argv[1:]))

0 commit comments

Comments
 (0)