Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
104 commits
Select commit Hold shift + click to select a range
79c434c
build: fetch SPDX license list data as a third-party dependency
aristarkhovNV Sep 28, 2026
f867de7
build: separate third-party OpenXR extension headers from NVIDIA's
aristarkhovNV Sep 30, 2026
d70230b
build: generate type stubs into the build tree, then stage them
aristarkhovNV Sep 30, 2026
482a7ef
build: publish a contents SBOM and license evidence with every wheel
aristarkhovNV Sep 30, 2026
6c73e19
build(sbom): describe the wheel a real build produces
aristarkhovNV Oct 1, 2026
08f095b
build(sbom): read a build-id without loading the library
aristarkhovNV Oct 1, 2026
d5620e9
docs(sbom): say which two members the document omits
aristarkhovNV Oct 1, 2026
49da742
build(sbom): do not walk another build tree as source
aristarkhovNV Oct 1, 2026
a3f7e52
build(sbom): name a supplier and stop implying a pinned version
aristarkhovNV Oct 1, 2026
180164c
build(sbom): record where a fetched archive came from, and a range as…
aristarkhovNV Oct 1, 2026
cffb25c
build(sbom): drop the fallbacks that hid a changed condition
aristarkhovNV Oct 1, 2026
b5a7eeb
build(sbom): stop treating identical bytes as proof of origin
aristarkhovNV Oct 1, 2026
8b9236e
licenses: restore the REUSE pool to its canonical texts
aristarkhovNV Oct 1, 2026
fdd770b
build(sbom): package a reference text, never one from this checkout
aristarkhovNV Oct 1, 2026
3054b8a
build: ignore coverage databases
aristarkhovNV Oct 1, 2026
d36bda8
build(sbom): tell repository source from this build's own output
aristarkhovNV Oct 1, 2026
db54aea
build(sbom): stop asserting licence facts the evidence does not carry
aristarkhovNV Oct 1, 2026
aa511d2
docs(sbom): say what the collector does, not what it was meant to do
aristarkhovNV Oct 1, 2026
8da30ad
build(sbom): credit a staged directory, and the holders it was missing
aristarkhovNV Oct 1, 2026
2c1f743
test(sbom): give the synthetic project a fixed clock
aristarkhovNV Oct 1, 2026
61805c3
build(sbom): stop overstating what the build did to a file
aristarkhovNV Oct 1, 2026
7858c67
build(sbom): verify the wheel, not what the wheel says about itself
aristarkhovNV Oct 1, 2026
8759e7b
build(sbom): give every index and every artifact the same rules
aristarkhovNV Oct 1, 2026
27344d3
build(sbom): close the ways a wheel could lie about itself and pass
aristarkhovNV Oct 1, 2026
fcf8e94
build(sbom): trace the project's own licence texts instead of asserti…
aristarkhovNV Oct 1, 2026
1ba82fe
build(sbom): one entry per licence text, not one per component
aristarkhovNV Oct 1, 2026
9521980
build(sbom): hold the document to the evidence, not to itself
aristarkhovNV Oct 1, 2026
9c2766f
build(sbom): give the distribution's own package its copyright notices
aristarkhovNV Oct 1, 2026
1db065e
build(sbom): fold a copyright notice another already covers
aristarkhovNV Oct 1, 2026
e1c1d86
build(sbom): read the supplier from the project, not from this file
aristarkhovNV Oct 1, 2026
ccaf566
build(sbom): read the licence texts the collector itself packages
aristarkhovNV Oct 1, 2026
b036673
build(sbom): declare the licence a component's own file states
aristarkhovNV Oct 1, 2026
f565d48
build(sbom): require a manifest record to name every sidecar
aristarkhovNV Oct 1, 2026
ee21ed0
build(sbom): compare what a document claims with what the build recorded
aristarkhovNV Oct 1, 2026
8740382
build(sbom): count every text the build read as read
aristarkhovNV Oct 1, 2026
93b78d7
build(sbom): check the files a package claims to hold are here
aristarkhovNV Oct 1, 2026
b11de4d
build(sbom): fail on an expression that cannot be read
aristarkhovNV Oct 1, 2026
dccd929
build(sbom): reject a file tag the grammar cannot name
aristarkhovNV Oct 1, 2026
c2cb872
build(sbom): do not credit a component with the licence steward's notice
aristarkhovNV Oct 1, 2026
82fe9ad
build(sbom): give a system library the notices its copyright file states
aristarkhovNV Oct 1, 2026
59adfd2
build(sbom): read licence terms only from the texts packaged as evidence
aristarkhovNV Oct 1, 2026
8fa9cb2
build(sbom): keep the path separators in a packaged licence's name
aristarkhovNV Oct 1, 2026
da45113
build(sbom): state one node per required package and range
aristarkhovNV Oct 1, 2026
71476b1
docs(agents): do not state counts that drift in a comment
aristarkhovNV Oct 1, 2026
8753e75
build(sbom): keep the staged tree out of the index whatever --build-d…
aristarkhovNV Oct 1, 2026
5442405
build(sbom): separate joined requirements by something they do not co…
aristarkhovNV Oct 1, 2026
94a14dd
refactor(sbom): give each shared rule one place to live
aristarkhovNV Oct 1, 2026
082fe20
refactor(sbom): drop what was written twice, and what was never read
aristarkhovNV Oct 1, 2026
acc1e04
perf(sbom): read the build tree once per run, not once per wheel
aristarkhovNV Oct 1, 2026
27f3d6c
build(sbom): point a requirement this build also made at its own docu…
aristarkhovNV Oct 1, 2026
21afc76
build(sbom): close the gaps a code review found, and one its fix opened
aristarkhovNV Oct 1, 2026
f5a5088
build(sbom): make a distribution ship the licence it declares
aristarkhovNV Oct 1, 2026
55c2702
build(sbom): name every copyright holder, and say what the wheel carries
aristarkhovNV Oct 1, 2026
90b8ae3
build(sbom): credit a holder stated inside a component, not just at i…
aristarkhovNV Oct 1, 2026
bc781d3
docs(sbom): record the rules this round added
aristarkhovNV Oct 1, 2026
221575f
build(sbom): say what the build knows about a sibling it cannot cite
aristarkhovNV Oct 1, 2026
47b296a
build(sbom): conclude every licence the wheel carries, and find every…
aristarkhovNV Oct 1, 2026
6d3ecc3
docs(sbom): stop the design doc contradicting what the collector does
aristarkhovNV Oct 1, 2026
d984b15
build(sbom): read the commoner Debian copyright field, and break the …
aristarkhovNV Oct 1, 2026
f32198f
docs(agents): a rule changed in one place is changed in none
aristarkhovNV Oct 1, 2026
1c018af
build(sbom): stop a choice of licences being published as both
aristarkhovNV Oct 1, 2026
0cc299d
build(sbom): name the licensor of a wheel that ships no file of its own
aristarkhovNV Oct 1, 2026
b916647
build(sbom): say that most of this wheel's files determined no licence
aristarkhovNV Oct 1, 2026
9489f0d
chore: stop ignoring the SBOM audit notes
aristarkhovNV Oct 1, 2026
0a944ad
build: ask for the codemodel without raising the project's CMake minimum
aristarkhovNV Oct 1, 2026
fc02746
ci: keep a fetched archive's provenance in the cache with the archive
aristarkhovNV Oct 1, 2026
7eb4bc9
build(sbom): do not read the build tree as repository source
aristarkhovNV Oct 1, 2026
40909bb
build(sbom): stop naming a package after a copyright holder
aristarkhovNV Oct 1, 2026
8b03ecb
build(sbom): do not present a copyright holder as a package name
aristarkhovNV Oct 1, 2026
7dc4755
docs(sbom): summarise a REUSE pool in the report table
aristarkhovNV Oct 1, 2026
dbf890a
ci: assemble the release evidence without colliding on a universal wheel
aristarkhovNV Oct 1, 2026
15e3a61
build(sbom): keep a universal wheel universal
aristarkhovNV Oct 1, 2026
a0e53e3
build(sbom): judge a repeated wheel by the wheel, not by its evidence
aristarkhovNV Oct 1, 2026
15714b1
build(sbom): read the codemodel the reply index names
aristarkhovNV Oct 2, 2026
5bbce2e
Merge remote-tracking branch 'upstream/main' into sbom-upstream
aristarkhovNV Oct 14, 2026
4107ad2
build(sbom): ship the license texts the root pyproject names, from bo…
aristarkhovNV Oct 14, 2026
27d8b57
ci: leave the wheel license reports out of the build job summary
aristarkhovNV Oct 14, 2026
d53d237
build(sbom): read vendored files' licences from REUSE metadata
aristarkhovNV Oct 19, 2026
68a10af
build(sbom): take vendored holders from REUSE, read every covered file
aristarkhovNV Oct 19, 2026
ff57512
build(sbom): inventory static code the build links into a wheel member
aristarkhovNV Oct 20, 2026
cfcf5ce
build(sbom): keep a compiled component's nested licence texts
aristarkhovNV Oct 20, 2026
39ef38d
build(sbom): account for every grant text in a component's conclusion
aristarkhovNV Oct 20, 2026
519bbe6
build(sbom): never give a fetched tree the enclosing repository's ide…
aristarkhovNV Oct 20, 2026
d9b3ae2
build(sbom): refuse a manifest that lists no wheel, and a wheel no ma…
aristarkhovNV Oct 20, 2026
74ddf84
build(sbom): report a component whose licence nothing concludes
aristarkhovNV Oct 20, 2026
f521a32
docs(sbom): REUSE terms are read only for checked-in files; a sidecar…
aristarkhovNV Oct 20, 2026
fcb9303
refactor(sbom): drop the unused document-reference machinery
aristarkhovNV Oct 20, 2026
b9c9e72
docs(sbom): say what each collector option is for
aristarkhovNV Oct 20, 2026
efdef39
docs(sbom): say these releases carry no PEP 740 attestations
aristarkhovNV Oct 20, 2026
8cf1410
refactor(sbom): delete code nothing uses
aristarkhovNV Oct 20, 2026
8736249
docs(sbom): state the rules comments protect, not the bugs that taugh…
aristarkhovNV Oct 20, 2026
6386043
fix(sbom): name a host package's vendor by the archive that published it
aristarkhovNV Oct 20, 2026
7098268
Merge remote-tracking branch 'upstream/main' into sbom-upstream
aristarkhovNV Oct 20, 2026
0e905fe
feat(sbom): give each file an SPDXID that survives the next release
aristarkhovNV Oct 20, 2026
2df1b67
refactor(sbom): name the collector package isaaccapture_sbom, keep it…
aristarkhovNV Oct 20, 2026
7f8013e
docs(sbom): a short page for wheel users, a README for the collector
aristarkhovNV Oct 21, 2026
05fa593
ci(sbom): the collector's own tests gate SBOM generation
aristarkhovNV Oct 21, 2026
cc1a78f
build(sbom): run the collector's tests with uv, outside the product's…
aristarkhovNV Oct 21, 2026
56730df
ci(sbom): test the collector in a job of its own, beside the build
aristarkhovNV Oct 21, 2026
18877f0
fix(sbom): a wheel's licence report lists what the wheel holds, not t…
aristarkhovNV Oct 21, 2026
6ae270b
ci(sbom): publish only the evidence a release's manifest binds
aristarkhovNV Oct 21, 2026
c03ead1
Merge remote-tracking branch 'upstream/main' into sbom-upstream
aristarkhovNV Oct 21, 2026
a1d6d68
ci(sbom): attach a release's evidence as one reproducible archive
aristarkhovNV Oct 22, 2026
d5189f4
Trim redundant SBOM comments and docstrings
aristarkhovNV Oct 22, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 7 additions & 1 deletion .github/actions/setup-cloudxr-sdk/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,12 @@ runs:
path: |
deps/cloudxr/*.tar.gz
deps/cloudxr/*.tgz
key: cloudxr-sdk-${{ runner.os }}-${{ runner.arch }}-rt${{ steps.parse.outputs.runtime_version }}-web${{ steps.parse.outputs.web_version }}
# The URL each tarball came from, written beside it on download. A
# cache hit without it leaves every CloudXR wheel member unattributable:
# an archive explains one only if the repository tracks it or this
# marker says where it was fetched from.
deps/cloudxr/*.source
key: cloudxr-sdk-v2-${{ runner.os }}-${{ runner.arch }}-rt${{ steps.parse.outputs.runtime_version }}-web${{ steps.parse.outputs.web_version }}

- name: Download CloudXR Runtime SDK
shell: bash
Expand All @@ -66,4 +71,5 @@ runs:
path: |
deps/cloudxr/*.tar.gz
deps/cloudxr/*.tgz
deps/cloudxr/*.source
key: ${{ steps.cache.outputs.cache-primary-key }}
293 changes: 290 additions & 3 deletions .github/workflows/build-ubuntu.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,9 @@ concurrency:

env:
# Shared apt build dependencies. Each job installs these plus its own extras
# (ccache, clang-format, the OAK camera autotools chain).
CORE_APT_DEPS: build-essential cmake glslang-tools libegl-dev libvulkan-dev libwayland-dev libx11-dev libxcursor-dev libxext-dev libxi-dev libxinerama-dev libxkbcommon-dev libxrandr-dev patchelf pkg-config wayland-protocols
# (ccache, clang-format, the OAK camera autotools chain). libmagic1: see
# scripts/sbom/pyproject.toml.
CORE_APT_DEPS: build-essential cmake glslang-tools libegl-dev libmagic1 libvulkan-dev libwayland-dev libx11-dev libxcursor-dev libxext-dev libxi-dev libxinerama-dev libxkbcommon-dev libxrandr-dev patchelf pkg-config wayland-protocols
# Pin vcpkg to an immutable commit for reproducible, supply-chain-stable CI
# instead of tracking its moving default branch. Port versions are fixed by the
# consuming manifest's builtin-baseline (e.g. DepthAI's vcpkg.json), so this
Expand Down Expand Up @@ -283,6 +284,56 @@ jobs:
mv install/wheels-repaired/*.whl install/wheels/
rmdir install/wheels-repaired || true

# Run after auditwheel and before upload so evidence describes the repaired bytes.
- name: Package licenses and contents SBOM into wheels (Release only)
if: matrix.build_type == 'Release'
run: |
set -euo pipefail
shopt -s nullglob
args=()
for wheel in install/wheels/*.whl; do args+=(--wheel "${wheel}"); done
if (( ${#args[@]} == 0 )); then
echo "No wheels to describe"
exit 1
fi
uv run --project scripts/sbom --python ${{ matrix.python_version }} \
isaaccapture-sbom build \
--build-dir "${BUILD_DIR}" "${args[@]}" --out-dir sbom

- name: Check wheel SBOMs (Release only)
if: matrix.build_type == 'Release'
run: |
set -euo pipefail
shopt -s nullglob
for wheel in install/wheels/*.whl; do
stem="$(basename "${wheel}" .whl)"
uv run --project scripts/sbom --python ${{ matrix.python_version }} \
isaaccapture-sbom check --wheel "${wheel}" \
--manifest sbom/manifest.json \
--build-evidence "sbom/${stem}.build-evidence.json"
done
for document in sbom/*.spdx.json; do
uv run --project scripts/sbom --python ${{ matrix.python_version }} \
--extra dev pyspdxtools -i "${document}"
done

- name: Install and import the finished wheel (Release only)
if: matrix.build_type == 'Release'
run: |
set -euo pipefail
shopt -s nullglob
wheels=(install/wheels/*.whl)
# --find-links resolves the sibling transition wheel from this build.
uv venv --python ${{ matrix.python_version }} .venv-wheel-check
uv pip install --python .venv-wheel-check \
--find-links install/wheels "${wheels[@]}"
.venv-wheel-check/bin/python -c "import isaaccapture; print('imported', isaaccapture.__version__)"
# Exercise standalone verification without build evidence or a manifest.
for wheel in "${wheels[@]}"; do
uv run --project scripts/sbom --python ${{ matrix.python_version }} \
isaaccapture-sbom check --wheel "${wheel}"
done

- name: Create tarball to preserve permissions
if: matrix.build_type == 'Release'
run: tar -cvf isaacteleop-install.tar -C install .
Expand All @@ -303,6 +354,74 @@ jobs:
if-no-files-found: error
retention-days: 7

- name: Upload wheel SBOM sidecars
if: matrix.build_type == 'Release'
uses: actions/upload-artifact@v6
with:
name: isaaccapture-sbom-${{ matrix.arch }}-py${{ matrix.python_version }}
path: sbom/
if-no-files-found: error
retention-days: 7

# The SBOM collector's tests need only a configured tree, so they run beside
# the product build; wheel-gate waits on them.
test-sbom-collector:
runs-on: ${{ matrix.arch == 'arm64' && 'ubuntu-22.04-arm' || 'ubuntu-22.04' }}
permissions:
contents: read
timeout-minutes: 20
strategy:
fail-fast: ${{ github.event_name == 'pull_request' }}
matrix:
arch: ['x64', 'arm64']
env:
BUILD_DIR: build

steps:
- name: Checkout code
uses: actions/checkout@v6
with:
fetch-depth: 0 # configure derives the version from history
persist-credentials: false

- name: Install uv
uses: ./.github/actions/setup-uv

- name: Install Apt dependencies
run: |
sudo apt-get update
sudo apt-get install -y $CORE_APT_DEPS

# BUILD_TESTING=ON: a test target links a static library the project builds,
# which the codemodel test looks for.
- name: Configure CMake
run: |
cmake -B "${BUILD_DIR}" \
-DCMAKE_BUILD_TYPE=Release \
-DBUILD_PLUGINS=OFF \
-DBUILD_EXAMPLES=OFF \
-DBUILD_VIZ=OFF \
-DBUILD_PYTHON_BINDINGS=OFF \
-DENABLE_CLANG_FORMAT_CHECK=OFF \
-DBUILD_TESTING=ON

# Pythons: build-ubuntu's python_version matrix; keep the two lists in step.
# The named build makes missing inputs fail the tests rather than skip them.
- name: Test the SBOM collector
env:
ISAACCAPTURE_SBOM_BUILD_DIR: ${{ env.BUILD_DIR }}
run: |
set -uo pipefail
failed=()
for python in 3.11 3.12 3.13; do
uv run --project scripts/sbom --python "${python}" \
--extra dev pytest scripts/sbom/tests || failed+=("${python}")
done
if (( ${#failed[@]} )); then
echo "::error::SBOM collector tests failed under Python ${failed[*]}"
exit 1
fi

pip-editable-install:
# Validates the scikit-build-core (PEP 517/660) from-source install path added
# for issue #735: an sdist build and `pip install -e .` over the root
Expand Down Expand Up @@ -999,6 +1118,7 @@ jobs:
permissions: {}
needs:
- build-ubuntu
- test-sbom-collector
- test-viz-gpu
- test-viz-sanitizers
- test-cloudxr
Expand Down Expand Up @@ -1027,6 +1147,103 @@ jobs:

echo "All wheel dependency jobs completed successfully"

publish-sbom-evidence: # durable copies attached to the GitHub release
# Attach durable evidence to releases; Actions artifacts expire.
runs-on: ubuntu-22.04
needs:
- wheel-gate
permissions:
contents: write
timeout-minutes: 20
env:
ARCHIVE: isaaccapture-sbom-${{ github.ref_name }}

# !cancelled() lets wheel-gate's result decide despite skipped upstream jobs.
if: >-
!cancelled()
&& needs.wheel-gate.result == 'success'
&& github.repository_id == '1092046207'
&& startsWith(github.ref, 'refs/tags/v')

steps:
- name: Checkout code
uses: actions/checkout@v6
with:
fetch-depth: 1
persist-credentials: false

- name: Install uv
uses: ./.github/actions/setup-uv

- name: Download wheel artifacts
uses: actions/download-artifact@v7
with:
pattern: isaacteleop-wheels-*
merge-multiple: true
path: wheels

- name: Download wheel SBOM sidecars
uses: actions/download-artifact@v7
with:
pattern: isaaccapture-sbom-*
path: sbom-sidecars

# Fix manifest and archive timestamps for reproducible reruns.
- name: Pin the build clock to the commit
run: echo "SOURCE_DATE_EPOCH=$(git log -1 --pretty=%ct)" >> "$GITHUB_ENV"

- name: Pack and verify the release evidence archive
run: |
set -euo pipefail

# Universal wheels repeat across matrix entries. Reject conflicting copies
# and publish only the evidence bound by the merged manifest.
uv run --project scripts/sbom --python 3.12 \
isaaccapture-sbom merge-manifests \
--output "${ARCHIVE}/isaaccapture-sbom-manifest.json" \
--evidence-out "${ARCHIVE}" \
sbom-sidecars/*/manifest.json

# ZIP preserves filenames that GitHub renames in loose assets (`!` to `.`).
# Fix times, modes, order, and extra fields for reproducibility;
# ZIP stores local time, so set TZ too.
touch -d "@${SOURCE_DATE_EPOCH}" "${ARCHIVE}"/*
chmod 644 "${ARCHIVE}"/*
printf '%s\n' "${ARCHIVE}"/* | LC_ALL=C sort \
| TZ=UTC zip -X -q "${ARCHIVE}.zip" -@

# Verify the unpacked release using the published consumer procedure.
unzip -q "${ARCHIVE}.zip" -d unpacked
uv run --project scripts/sbom --python 3.12 \
isaaccapture-sbom check-set \
--manifest "unpacked/${ARCHIVE}/isaaccapture-sbom-manifest.json" \
--wheel-dir wheels --evidence-dir "unpacked/${ARCHIVE}"

unzip -l "${ARCHIVE}.zip"

- name: Attach evidence to the release
env:
GH_TOKEN: ${{ github.token }}
TAG: ${{ github.ref_name }}
run: |
set -euo pipefail

# The tag can trigger this job before release-tag.yml creates its draft.
# Wait for that release to preserve its draft/approval step.
deadline=$(( SECONDS + 900 ))
until gh release view "${TAG}" >/dev/null 2>&1; do
if (( SECONDS >= deadline )); then
echo "::error::No release exists for ${TAG} after 15 minutes; evidence not attached."
exit 1
fi
echo "Waiting for the ${TAG} release to be created..."
sleep 20
done

gh release upload "${TAG}" "${ARCHIVE}.zip" --clobber

echo "Attached ${ARCHIVE}.zip to ${TAG}"

publish-wheel: # to internal Artifactory
runs-on: [self-hosted, linux]
permissions: {}
Expand Down Expand Up @@ -1062,7 +1279,7 @@ jobs:

- name: Ensure clean wheels directory
run: |
rm -rf wheels
rm -rf wheels sbom-sidecars

- name: Download wheel artifacts
uses: actions/download-artifact@v7
Expand All @@ -1071,6 +1288,76 @@ jobs:
merge-multiple: true
path: wheels

- name: Download wheel SBOM sidecars
uses: actions/download-artifact@v7
with:
pattern: isaaccapture-sbom-*
path: sbom-sidecars

- name: Verify wheel variant coverage and digests
run: |
set -euo pipefail

# Keep platform and ABI lists aligned with the build-ubuntu Release matrix.
platforms=(x86_64 aarch64)
abis=(cp311 cp312 cp313)
expected=$(( ${#platforms[@]} * ${#abis[@]} ))

shopt -s nullglob
manifests=(sbom-sidecars/*/manifest.json)
if (( ${#manifests[@]} != expected )); then
echo "Expected ${expected} SBOM manifests, found ${#manifests[@]}"
ls -la sbom-sidecars || true
exit 1
fi

declare -A named=()
for manifest in "${manifests[@]}"; do
while IFS=$'\t' read -r filename digest; do
wheel="wheels/${filename}"
if [[ ! -f "${wheel}" ]]; then
echo "Manifest names ${filename}, which is not among the downloaded wheels"
exit 1
fi
actual="$(sha256sum "${wheel}" | cut -d' ' -f1)"
if [[ "${actual}" != "${digest}" ]]; then
echo "${filename} was modified after its digest was bound"
echo " manifest: ${digest}"
echo " actual: ${actual}"
exit 1
fi
named["${filename}"]=1
done < <(jq -r '.wheels[] | [.filename, .sha256] | @tsv' "${manifest}")
done

# Every downloaded wheel is uploaded below, so require evidence for all of them.
for wheel in wheels/*.whl; do
name="$(basename "${wheel}")"
if [[ -z "${named[${name}]:-}" ]]; then
echo "${name} is among the downloaded wheels, and no manifest names it"
exit 1
fi
done

for platform in "${platforms[@]}"; do
for abi in "${abis[@]}"; do
found=0
for filename in "${!named[@]}"; do
if [[ "${filename}" == *"-${abi}-${abi}-manylinux"*"_${platform}.whl" ]]; then
found=1
break
fi
done
if (( found == 0 )); then
echo "No wheel was published for ${abi} on ${platform}"
printf ' have: %s\n' "${!named[@]}"
exit 1
fi
done
done

echo "All ${expected} wheel variants present and matching their recorded digests"

- name: Upload wheel(s) to Artifactory
id: upload-artifactory
env:
Expand Down
6 changes: 6 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,10 @@ MUJOCO_LOG.TXT
# Runtime device files injected by MCP server infrastructure
.mcp.json

# Python coverage databases
.coverage
.coverage.*

# Agent session logs (never committed)
tmp/

Expand All @@ -84,3 +88,5 @@ tmp/
!/examples/mujoco_xr/python/isaacteleop_examples/mujoco_xr/assets/leader/leader_gripper.xml
/examples/mujoco_xr/python/isaacteleop_examples/mujoco_xr/assets/follower/*
!/examples/mujoco_xr/python/isaacteleop_examples/mujoco_xr/assets/follower/follower_arm.xml
# Wheel SBOM and license evidence written by the collector in scripts/sbom/
/sbom/
7 changes: 4 additions & 3 deletions .pre-commit-config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ repos:
- id: debug-statements
# SPDX license headers (REUSE): require SPDX-FileCopyrightText and SPDX-License-Identifier
- repo: https://github.com/fsfe/reuse-tool
rev: v6.2.0
rev: v6.2.0 # scripts/sbom/pyproject.toml pins the same reuse to read this metadata
hooks:
- id: reuse-lint-file
name: REUSE licenses (source files and complete EgoPost subtree)
Expand All @@ -52,8 +52,9 @@ repos:
name: Check copyright year (include current year)
entry: python3 scripts/check_copyright_year.py --fix
language: system
# Include CMakeLists.txt and Dockerfile.xxx by matching those explicitly in the regex
files: \.(py|js|ts|cpp|c|h|hpp|cxx|hxx|cmake|md|yaml|yml|sh|fbs|toml|html)$|CMakeLists\.txt$|Dockerfile(\.[A-Za-z0-9_-]+)?$
# Include CMakeLists.txt and Dockerfile.xxx by matching those explicitly in the regex.
# Same rule as SOURCE_FILES in scripts/check_licenses.py; change both together.
files: \.(py|pyi|js|ts|cpp|cc|c|h|hpp|cxx|hxx|inc|cu|cuh|frag|vert|cmake|md|yaml|yml|sh|fbs|toml|html)$|CMakeLists\.txt$|Dockerfile(\.[A-Za-z0-9_-]+)?$
- id: check-lfs-pointers
name: Ensure Git LFS-marked files are LFS pointers
entry: python3 scripts/check_lfs_pointers.py
Expand Down
Loading
Loading