Skip to content

Commit 82e40fc

Browse files
authored
Merge branch 'main' into fix/frozen-curesult-table-13.3
2 parents e5511c8 + 858fb2f commit 82e40fc

439 files changed

Lines changed: 35058 additions & 21082 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,127 @@
1+
---
2+
name: create-cuda-python-pull-request
3+
description: Create a CUDA Python pull request from an approved personal or organization-owned fork, including the GitHub CLI GraphQL fallback for renamed organization-owned forks. Use when the user directly requests creating or opening a CUDA Python pull request. Do not use for local implementation, commits, pushes, branch preparation, PR advice, or general GitHub work without that direct request.
4+
---
5+
6+
# Create CUDA Python Pull Request
7+
8+
This skill supplies technical procedure after the user directly asks to create
9+
a pull request. It does not define when a pull request should be created or
10+
authorize one without that direct request. Do not infer the request from
11+
completed work, a local commit, a push request, or the existence of a suitable
12+
fork.
13+
14+
## Inspect the topology and proposed change
15+
16+
1. Run `git status --short --branch`, inspect the branch diff, and confirm the
17+
intended base branch.
18+
2. Run `git remote -v` and resolve the complete `OWNER/REPOSITORY` names of the
19+
base repository and intended fork. Do not rely on remote names alone.
20+
3. Confirm through GitHub that the push target is a fork of the base repository
21+
and is not the base repository itself.
22+
4. Confirm that the intended push target complies with the repository's
23+
remote-write policy and the user's request.
24+
5. Inspect the repository's pull-request template, available labels, and open
25+
milestones. Do not guess required metadata; ask the user when it is unclear.
26+
27+
## Validate and push
28+
29+
Run the checks appropriate to the change and review the final diff. Push the
30+
current branch to the approved fork using the explicit remote and branch:
31+
32+
```bash
33+
git push <fork-remote> <branch>
34+
```
35+
36+
## Create the pull request
37+
38+
Prepare a complete body from the repository's pull-request template. Every
39+
pull request must have at least one assignee, one label, and a milestone; CI
40+
enforces this through `pr-metadata-check`.
41+
42+
Use `gh pr create` when it can identify the fork unambiguously. Select the base
43+
repository and branch explicitly and supply the required metadata:
44+
45+
```bash
46+
gh pr create \
47+
--repo <base-owner>/<base-repository> \
48+
--base <base-branch> \
49+
--head <fork-owner>:<head-branch> \
50+
--title "<title>" \
51+
--body-file <path-to-pr-body> \
52+
--assignee <assignee> \
53+
--label <label> \
54+
--milestone <milestone>
55+
```
56+
57+
Add `--draft` when the user requests a draft pull request.
58+
59+
## Handle renamed organization-owned forks
60+
61+
[GitHub CLI issue cli/cli#10093](https://github.com/cli/cli/issues/10093)
62+
tracks `gh pr create` support for cross-repository pull requests within one
63+
organization. Check whether the issue has been resolved before using the
64+
workaround.
65+
66+
If `gh pr create` cannot identify an organization-owned fork whose repository
67+
name differs from the base repository, create the pull request with GitHub's
68+
GraphQL API and pass `headRepositoryId` explicitly.
69+
70+
Resolve the repository node IDs:
71+
72+
```bash
73+
BASE_REPO="<base-owner>/<base-repository>"
74+
HEAD_REPO="<fork-owner>/<fork-repository>"
75+
BASE_REPO_ID="$(gh api "repos/${BASE_REPO}" --jq '.node_id')"
76+
HEAD_REPO_ID="$(gh api "repos/${HEAD_REPO}" --jq '.node_id')"
77+
```
78+
79+
Create the pull request. Set `draft` to match the user's request.
80+
81+
```bash
82+
gh api graphql \
83+
-f repositoryId="${BASE_REPO_ID}" \
84+
-f headRepositoryId="${HEAD_REPO_ID}" \
85+
-f baseRefName="<base-branch>" \
86+
-f headRefName="<head-branch>" \
87+
-f title="<title>" \
88+
-F body="@<path-to-pr-body>" \
89+
-F draft=false \
90+
-f query='
91+
mutation CreatePullRequest(
92+
$repositoryId: ID!
93+
$headRepositoryId: ID!
94+
$baseRefName: String!
95+
$headRefName: String!
96+
$title: String!
97+
$body: String!
98+
$draft: Boolean!
99+
) {
100+
createPullRequest(input: {
101+
repositoryId: $repositoryId
102+
headRepositoryId: $headRepositoryId
103+
baseRefName: $baseRefName
104+
headRefName: $headRefName
105+
title: $title
106+
body: $body
107+
draft: $draft
108+
}) {
109+
pullRequest { number url }
110+
}
111+
}' \
112+
--jq '.data.createPullRequest.pullRequest'
113+
```
114+
115+
The GraphQL API does not populate the pull-request template automatically.
116+
After creation, add the required metadata to the returned pull-request number:
117+
118+
```bash
119+
gh pr edit <pr-number> \
120+
--repo "${BASE_REPO}" \
121+
--add-assignee "<assignee>" \
122+
--add-label "<label>" \
123+
--milestone "<milestone>"
124+
```
125+
126+
Verify the resulting URL, base branch, head repository and branch, draft state,
127+
body, assignee, label, and milestone before reporting completion.
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
2+
#
3+
# SPDX-License-Identifier: Apache-2.0
4+
5+
interface:
6+
display_name: "Create CUDA Python PR"
7+
short_description: "Open an explicitly requested CUDA Python pull request"
8+
default_prompt: "Use $create-cuda-python-pull-request to create the CUDA Python pull request I explicitly requested."
9+
policy:
10+
allow_implicit_invocation: true

.coveragerc

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,12 @@ plugins = Cython.Coverage
1111
core = ctrace
1212
branch = False
1313
relative_files = True
14-
# Omits specific definition files that causes plugin errors
14+
# Cython.Coverage cannot build a FileReporter for .pxd/.pxi (not standalone
15+
# translation units). Pattern in [run], not an enumeration: a new file of
16+
# either kind otherwise breaks `coverage html`. Must be [run], not [report].
1517
omit =
16-
*/windll.pxd
17-
*/_lib/windll.pxd
18-
*/_lib/utils.pxd
18+
*/*.pxd
19+
*/*.pxi
1920

2021
[report]
2122
show_missing = true

.github/ISSUE_TEMPLATE/release_checklist.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ body:
2020
- label: File an internal nvbug to communicate test plan & release schedule with QA
2121
- label: Ensure all pending PRs are reviewed, tested, and merged
2222
- label: Check (or update if needed) the dependency requirements
23+
- label: Sweep deprecations whose stated removal version has arrived (`grep -rn 'deprecated::' cuda_core/cuda`) and remove any that are due
2324
- label: "Finalize the doc update, including release notes (\"Note: Touching docstrings/type annotations in code is OK during code freeze, apply your best judgement!\")"
2425
- label: Update the docs for the new version
2526
- label: Create a public release tag

.github/RELEASE-core.md

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,29 @@ platforms as appropriate for each release.
6464
Review `cuda_core/pyproject.toml` and verify that all dependency
6565
requirements are current.
6666

67+
Update the cuda_core dependency in `cuda_python/setup.py`.
68+
69+
---
70+
71+
## Sweep deprecations whose removal version has arrived
72+
73+
Deprecated APIs are marked in the source with a Sphinx `deprecated`
74+
directive naming the version that introduced the deprecation, and their
75+
docstrings state the version in which they will be removed. Find them all
76+
with:
77+
78+
```console
79+
$ grep -rn 'deprecated::' cuda_core/cuda
80+
```
81+
82+
For each hit, check the stated removal version against the version being
83+
released. If the release has reached or passed it, remove the API, its
84+
runtime `DeprecationWarning`, and any tests asserting that warning.
85+
86+
This must happen *before* the release tag is cut. Removals are breaking
87+
changes, so they are only permitted at a major-version boundary per the
88+
[support policy](https://nvidia.github.io/cuda-python/cuda-core/latest/support.html).
89+
6790
---
6891

6992
## Refresh frozen fallback explanation tables

.github/actionlint.yaml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,3 +8,10 @@ self-hosted-runner:
88
labels:
99
- linux-amd64-cpu8
1010
- linux-amd64-gpu-l4-latest-1
11+
12+
# GitHub supports queued concurrency runs, but the latest actionlint release
13+
# does not yet recognize the concurrency.queue key.
14+
paths:
15+
".github/workflows/ci-workflow-health.yml":
16+
ignore:
17+
- 'unexpected key "queue" for "concurrency" section'
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
2+
#
3+
# SPDX-License-Identifier: Apache-2.0
4+
5+
name: griffe API check
6+
7+
description: >-
8+
Check a package's public API (as defined by `__all__`) for changes using
9+
griffe.
10+
11+
inputs:
12+
package-name:
13+
description: "Importable package name to check, e.g. cuda.core"
14+
required: true
15+
package-dir:
16+
description: "Directory to search for the package sources, e.g. cuda_core"
17+
required: true
18+
merge-base:
19+
description: >-
20+
Git ref/sha to compare the current code against, typically the PR's
21+
merge-base with its target branch.
22+
required: true
23+
24+
runs:
25+
using: composite
26+
steps:
27+
- name: Install uv
28+
uses: astral-sh/setup-uv@fac544c07dec837d0ccb6301d7b5580bf5edae39 # v8.2.0
29+
with:
30+
enable-cache: false
31+
32+
- name: Check API
33+
shell: bash --noprofile --norc -euo pipefail {0}
34+
env:
35+
PACKAGE_NAME: ${{ inputs.package-name }}
36+
PACKAGE_DIR: ${{ inputs.package-dir }}
37+
MERGE_BASE: ${{ inputs.merge-base }}
38+
run: |
39+
uvx griffe check "$PACKAGE_NAME" \
40+
--search "$PACKAGE_DIR" \
41+
--find-stubs-packages \
42+
--against "$MERGE_BASE" \
43+
--format github \
44+
2>&1

0 commit comments

Comments
 (0)