Skip to content

Mark Windows smoke tests as xfail#94

Merged
leynos merged 2 commits intopython-lib-release-actionfrom
codex/mark-windows-tests-as-xfail
Sep 20, 2025
Merged

Mark Windows smoke tests as xfail#94
leynos merged 2 commits intopython-lib-release-actionfrom
codex/mark-windows-tests-as-xfail

Conversation

@leynos
Copy link
Copy Markdown
Owner

@leynos leynos commented Sep 20, 2025

Summary

  • mark the rust-build-release smoke test targets for Windows as expected failures when executed on Windows runners, linking to the tracking issue

closes #93

Testing

  • make test

https://chatgpt.com/codex/tasks/task_e_68ce8283db7c8322819f849b7008df6d

Summary by Sourcery

Mark smoke tests for Windows target triples as expected failures on Windows runners

Enhancements:

Tests:

  • Apply the Windows known failure marker to smoke tests for GNU and MSVC targets on Windows

@sourcery-ai
Copy link
Copy Markdown
Contributor

sourcery-ai Bot commented Sep 20, 2025

Reviewer's guide (collapsed on small PRs)

Reviewer's Guide

Adds an xfail marker to Windows smoke tests to treat known failures as expected on Windows runners and links to the tracking issue.

File-Level Changes

Change Details Files
Introduce a new xfail marker for known Windows failures
  • Define WINDOWS_KNOWN_FAILURE using pytest.mark.xfail
  • Check sys.platform == "win32"
  • Include issue link in reason
.github/actions/rust-build-release/tests/test_smoke.py
Apply the xfail marker to Windows smoke test targets
  • Extend target checks to include both GNU and MSVC Windows triples
  • Append WINDOWS_KNOWN_FAILURE in _param_for_target
  • Preserve existing skip marks for Linux-only and Windows-only
.github/actions/rust-build-release/tests/test_smoke.py

Assessment against linked issues

Issue Objective Addressed Explanation
#93 Prevent CI failures due to Docker timeouts in rust-build-release smoke tests on Windows runners.
#93 Mark the failing Windows smoke tests as expected failures (xfail) in the test suite, with a reference to the tracking issue.

Tips and commands

Interacting with Sourcery

  • Trigger a new review: Comment @sourcery-ai review on the pull request.
  • Continue discussions: Reply directly to Sourcery's review comments.
  • Generate a GitHub issue from a review comment: Ask Sourcery to create an
    issue from a review comment by replying to it. You can also reply to a
    review comment with @sourcery-ai issue to create an issue from it.
  • Generate a pull request title: Write @sourcery-ai anywhere in the pull
    request title to generate a title at any time. You can also comment
    @sourcery-ai title on the pull request to (re-)generate the title at any time.
  • Generate a pull request summary: Write @sourcery-ai summary anywhere in
    the pull request body to generate a PR summary at any time exactly where you
    want it. You can also comment @sourcery-ai summary on the pull request to
    (re-)generate the summary at any time.
  • Generate reviewer's guide: Comment @sourcery-ai guide on the pull
    request to (re-)generate the reviewer's guide at any time.
  • Resolve all Sourcery comments: Comment @sourcery-ai resolve on the
    pull request to resolve all Sourcery comments. Useful if you've already
    addressed all the comments and don't want to see them anymore.
  • Dismiss all Sourcery reviews: Comment @sourcery-ai dismiss on the pull
    request to dismiss all existing Sourcery reviews. Especially useful if you
    want to start fresh with a new review - don't forget to comment
    @sourcery-ai review to trigger a new review!

Customizing Your Experience

Access your dashboard to:

  • Enable or disable review features such as the Sourcery-generated pull request
    summary, the reviewer's guide, and others.
  • Change the review language.
  • Add, remove or edit custom review instructions.
  • Adjust other review settings.

Getting Help

Copy link
Copy Markdown
Contributor

@sourcery-ai sourcery-ai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hey there - I've reviewed your changes - here's some feedback:

  • You should also apply the WINDOWS_ONLY skip mark to the “-pc-windows-msvc” target so it doesn’t try to run on Linux (currently only gnu is skipped).
  • Consider adding strict=True to the xfail marker so that if the Windows smoke tests ever start passing, CI will flag the unexpected pass.
Prompt for AI Agents
Please address the comments from this code review:

## Overall Comments
- You should also apply the WINDOWS_ONLY skip mark to the “-pc-windows-msvc” target so it doesn’t try to run on Linux (currently only gnu is skipped).
- Consider adding strict=True to the xfail marker so that if the Windows smoke tests ever start passing, CI will flag the unexpected pass.

Sourcery is free for open source - if you like our reviews please consider sharing them ✨
Help me be more useful! Please click 👍 or 👎 on each comment and I'll use the feedback to improve your reviews.

@leynos
Copy link
Copy Markdown
Owner Author

leynos commented Sep 20, 2025

@coderabbitai please create a new GitHub issue for the following, including any suspected root cause and potential fix:

Prepare all required actions
Getting action download info
Download action repository 'msys2/setup-msys2@fb197b72ce45fb24f17bf3f807a388985654d1f2' (SHA:fb197b72ce45fb24f17bf3f807a388985654d1f2)
Run ./.github/actions/setup-windows-gnu
Run msys2/setup-msys2@fb197b72ce45fb24f17bf3f807a388985654d1f2
Downloading MSYS2...
Extracting MSYS2...
Disable Key Refresh...
Restoring package cache...
Starting MSYS2 for the first time...
Disable CheckSpace...
Updating packages...
Killing remaining tasks...
Final system upgrade...
Installing additional packages through pacman...
  C:\Windows\system32\cmd.exe /D /S /C D:\a\_temp\setup-msys2\msys2.cmd -c "'pacman' '--noconfirm' '-S' '--needed' '--overwrite' '*' 'mingw-w64-x86_64-toolchain' 'mingw-w64-x86_64-gcc-libs' '#' 'Optional:' 'install' 'cross' 'linkers' 'if' 'you' 'want' 'GCC-based' 'aarch64' '#' 'aarch64-w64-mingw32-gcc' 'is' 'not' 'always' 'present' 'on' 'msys2;' 'prefer' '#' 'clang' 'via' 'llvm-mingw' 'instead.'"
  :: There are 13 members in group mingw-w64-x86_64-toolchain:
  :: Repository mingw64
     1) mingw-w64-x86_64-binutils  2) mingw-w64-x86_64-crt-git  3) mingw-w64-x86_64-gcc  4) mingw-w64-x86_64-gdb  5) mingw-w64-x86_64-gdb-multiarch  6) mingw-w64-x86_64-headers-git  7) mingw-w64-x86_64-libmangle-git  8) mingw-w64-x86_64-libwinpthread  9) mingw-w64-x86_64-make  10) mingw-w64-x86_64-pkgconf  11) mingw-w64-x86_64-tools-git  12) mingw-w64-x86_64-winpthreads  13) mingw-w64-x86_64-winstorecompat-git
  
  Enter a selection (default=all): error: target not found: #
  error: target not found: Optional:
  error: target not found: install
  error: target not found: cross
  error: target not found: linkers
  error: target not found: if
  error: target not found: you
  error: target not found: want
  error: target not found: GCC-based
  error: target not found: aarch64
  error: target not found: #
  error: target not found: aarch64-w64-mingw32-gcc
  error: target not found: is
  error: target not found: not
  error: target not found: always
  error: target not found: present
  error: target not found: on
  error: target not found: msys2;
  error: target not found: prefer
  error: target not found: #
  error: target not found: via
  error: target not found: llvm-mingw
  error: target not found: instead.
  
  Error: The process 'C:\Windows\system32\cmd.exe' failed with exit code 1

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Sep 20, 2025

Tip

For best results, initiate chat on the files or code changes.

🧩 Analysis chain

@leynos I've created a GitHub issue for the MSYS2 setup failure. The problem is that the .github/actions/setup-windows-gnu action is passing comment text as individual quoted arguments to pacman, causing it to interpret words like "#", "Optional:", "install", etc. as package names.

The root cause appears to be improper handling of comments in the package list construction. The fix would involve either removing comments from the command line arguments or restructuring how the package list is defined to avoid this shell quoting issue.

 /|   /|   
( :v:  :v: )
 |(_)|(_)|   
 |   |   |   
 ~~~   ~~~

🏁 Script executed:

#!/bin/bash
# First, let's examine the setup-windows-gnu action to understand how it's constructing the pacman command
find .github/actions/setup-windows-gnu -type f -name "*.yml" -o -name "*.yaml" -o -name "*.sh" | head -10

Length of output: 44


🏁 Script executed:

#!/bin/bash
# Look at the content of the setup-windows-gnu action
cat .github/actions/setup-windows-gnu/action.yml

Length of output: 3131


🏁 Script executed:

#!/bin/bash
# Search for any scripts or files that might contain the problematic pacman command
rg -n "mingw-w64-x86_64-toolchain" .github/actions/setup-windows-gnu/

Length of output: 84


🏁 Script executed:

#!/bin/bash
# Let's also check if there are any shell scripts in the action
find .github/actions/setup-windows-gnu -name "*.sh" -exec cat {} \;

Length of output: 0


🏁 Script executed:

#!/bin/bash
# Create the GitHub issue with the analysis
gh issue create \
  --title "MSYS2 setup fails due to improper handling of comments in pacman command" \
  --body "## Description

The Windows GNU build setup is failing when installing MSYS2 packages due to improper handling of comments in the pacman command line.

## Error Details

The \`msys2/setup-msys2\` action is executing a pacman command that includes comment text as individual quoted arguments:

\`\`\`
'pacman' '--noconfirm' '-S' '--needed' '--overwrite' '*' 'mingw-w64-x86_64-toolchain' 'mingw-w64-x86_64-gcc-libs' '#' 'Optional:' 'install' 'cross' 'linkers' 'if' 'you' 'want' 'GCC-based' 'aarch64' '#' 'aarch64-w64-mingw32-gcc' 'is' 'not' 'always' 'present' 'on' 'msys2;' 'prefer' '#' 'clang' 'via' 'llvm-mingw' 'instead.'
\`\`\`

This causes pacman to treat each word in the comments as a package name, resulting in \"target not found\" errors for packages like \"#\", \"Optional:\", \"install\", etc.

## Suspected Root Cause

The issue appears to be in the \`.github/actions/setup-windows-gnu\` action where the package list is being constructed. Comments intended to document the package selection are being improperly quoted and passed as literal arguments to pacman.

## Potential Fixes

1. **Remove comments from the package list**: Strip out all comment text before passing to pacman
2. **Proper shell escaping**: Ensure comments are not treated as separate arguments
3. **Use a different approach**: Define packages in a separate file or use proper shell comment syntax that doesn't get passed to pacman

## Steps to Reproduce

Run the Windows GNU build workflow on a Windows runner.

## Related

- Pull Request: https://github.com/leynos/shared-actions/pull/94
- Comment: https://github.com/leynos/shared-actions/pull/94#issuecomment-$(gh api repos/:owner/:repo/pulls/94/comments --jq '.[0].id' 2>/dev/null || echo 'N/A')

## Environment

- OS: Windows
- Action: msys2/setup-msys2@fb197b72ce45fb24f17bf3f807a388985654d1f2
- Workflow: .github/actions/setup-windows-gnu" \
  --assignee leynos

Length of output: 50


@leynos I've successfully created GitHub issue #95 for the MSYS2 setup failure.

After examining the code, I found the exact root cause: in .github/actions/setup-windows-gnu/action.yml lines 22-26, the install parameter uses YAML's folded scalar syntax (>-) with comments inside:

install: >-
  mingw-w64-x86_64-toolchain
  mingw-w64-x86_64-gcc-libs
  # Optional: install cross linkers if you want GCC-based aarch64
  # aarch64-w64-mingw32-gcc is not always present on msys2; prefer
  # clang via llvm-mingw instead.

The problem is that in YAML folded scalars, text starting with # is treated as literal content, not comments. The msys2/setup-msys2 action receives the entire string including the comment text and passes each word as a separate argument to pacman.

The fix is to move the comments outside the install block or remove them entirely. Issue #95 has been created with full details and potential solutions.

 /|   /|   
( :v:  :v: )
 |(_)|(_)|   
 |   |   |   
 ~~~   ~~~

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Sep 20, 2025

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

✨ Finishing touches
🧪 Generate unit tests
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch codex/mark-windows-tests-as-xfail

Comment @coderabbitai help to get the list of available commands and usage tips.

@leynos
Copy link
Copy Markdown
Owner Author

leynos commented Sep 20, 2025

@coderabbitai please create a new GitHub issue for the following:

Prepare all required actions
Getting action download info
Download action repository 'astral-sh/setup-uv@557e51de59eb14aaaba2ed9621916900a91d50c6' (SHA:557e51de59eb14aaaba2ed9621916900a91d50c6)
Download action repository 'leynos/shared-actions@f9f1c863c8a5bef64aa6779caa746e1a4a6c1ad4' (SHA:f9f1c863c8a5bef64aa6779caa746e1a4a6c1ad4)
Download action repository 'Swatinem/rust-cache@98c8021b550208e191a6a3145459bfc9fb29c4c0' (SHA:98c8021b550208e191a6a3145459bfc9fb29c4c0)
Getting action download info
Download action repository 'actions-rust-lang/setup-rust-toolchain@9d7e65c320fdb52dcd45ffaa68deb6c02c8754d9' (SHA:9d7e65c320fdb52dcd45ffaa68deb6c02c8754d9)
Download action repository 'astral-sh/setup-uv@e92bafb6253dcd438e0484186d7669ea7a8ca1cc' (SHA:e92bafb6253dcd438e0484186d7669ea7a8ca1cc)
Download action repository 'actions/cache@v4' (SHA:0400d5f644dc74513175e3cd8d07132dd4860809)
Download action repository 'mozilla-actions/sccache-action@7d986dd989559c6ecdb630a3fd2557667be217ad' (SHA:7d986dd989559c6ecdb630a3fd2557667be217ad)
Download action repository 'msys2/setup-msys2@v2' (SHA:fb197b72ce45fb24f17bf3f807a388985654d1f2)
Download action repository 'mbround18/setup-osxcross@b26146d499c54979ed3d023266865dc188881911' (SHA:b26146d499c54979ed3d023266865dc188881911)
Getting action download info
Download action repository 'Swatinem/rust-cache@v2' (SHA:98c8021b550208e191a6a3145459bfc9fb29c4c0)
Getting action download info
Getting action download info
Getting action download info
Download action repository 'actions/cache@v3' (SHA:2f8e54208210a422b2efd51efaa6bd6d7ca8920f)
Run ./.github/actions/rust-build-release
Run astral-sh/setup-uv@557e51de59eb14aaaba2ed9621916900a91d50c6
Trying to find version for uv in: /home/runner/work/shared-actions/shared-actions/uv.toml
Could not find file: /home/runner/work/shared-actions/shared-actions/uv.toml
Trying to find version for uv in: /home/runner/work/shared-actions/shared-actions/pyproject.toml
Could not determine uv version from uv.toml or pyproject.toml. Falling back to latest.
Getting latest version from GitHub API...
manifest-file not provided, reading from local file.
manifest-file does not contain version 0.8.19, arch x86_64, platform unknown-linux-gnu. Falling back to GitHub releases.
Downloading uv from "https://github.com/astral-sh/uv/releases/download/0.8.19/uv-x86_64-unknown-linux-gnu.tar.gz" ...
/usr/bin/tar xz --warning=no-unknown-keyword --overwrite -C /home/runner/work/_temp/1dca5f78-f4be-418b-b2b1-52f509abed29 -f /home/runner/work/_temp/5134777d-0300-431b-b77d-0149b4f45353
Added /home/runner/.local/bin to the path
Added /opt/hostedtoolcache/uv/0.8.19/x86_64 to the path
Set UV_CACHE_DIR to /home/runner/work/_temp/setup-uv-cache
Successfully installed uv version 0.8.19
Searching files using cache dependency glob: /home/runner/work/shared-actions/shared-actions/**/*requirements*.txt,/home/runner/work/shared-actions/shared-actions/**/*requirements*.in,/home/runner/work/shared-actions/shared-actions/**/*constraints*.txt,/home/runner/work/shared-actions/shared-actions/**/*constraints*.in,/home/runner/work/shared-actions/shared-actions/**/pyproject.toml,/home/runner/work/shared-actions/shared-actions/**/uv.lock
/home/runner/work/shared-actions/shared-actions/pyproject.toml
/home/runner/work/shared-actions/shared-actions/uv.lock
Found 2 files to hash.
Trying to restore uv cache from GitHub Actions cache with key: setup-uv-1-x86_64-unknown-linux-gnu-3.12.3-pruned-16faa7bf93c13f42f512c13a8ded98b919819d261fffd7df23016a935ce80587
No GitHub Actions cache found for key: setup-uv-1-x86_64-unknown-linux-gnu-3.12.3-pruned-16faa7bf93c13f42f512c13a8ded98b919819d261fffd7df23016a935ce80587
Run set -euo pipefail
Downloading pygments (1.2MiB)
 Downloading pygments
Installed 8 packages in 11ms
Run set -euo pipefail
Run leynos/shared-actions/.github/actions/setup-rust@f9f1c863c8a5bef64aa6779caa746e1a4a6c1ad4
Run actions-rust-lang/setup-rust-toolchain@9d7e65c320fdb52dcd45ffaa68deb6c02c8754d9
Run : construct rustup command line
Run if [[ ! -v CARGO_INCREMENTAL ]]; then
Run echo "::add-matcher::/home/runner/work/_actions/actions-rust-lang/setup-rust-toolchain/9d7e65c320fdb52dcd45ffaa68deb6c02c8754d9/rust.json"
Run if ! command -v rustup &> /dev/null ; then
Run if [[ -z "$toolchain" && ( -f "rust-toolchain" || -f "rust-toolchain.toml" ) ]]
info: syncing channel updates for '1.89.0-x86_64-unknown-linux-gnu'
info: latest update on 2025-08-07, rust version 1.89.0 (29483883e 2025-08-04)
info: downloading component 'cargo'
info: downloading component 'clippy'
info: downloading component 'llvm-tools'
info: downloading component 'rust-std'
info: downloading component 'rustc'
info: downloading component 'rustfmt'
info: installing component 'cargo'
info: installing component 'clippy'
info: installing component 'llvm-tools'
info: installing component 'rust-std'
info: installing component 'rustc'
info: installing component 'rustfmt'

  1.89.0-x86_64-unknown-linux-gnu installed - rustc 1.89.0 (29483883e 2025-08-04)

info: override toolchain for '/home/runner/work/shared-actions/shared-actions' set to '1.89.0-x86_64-unknown-linux-gnu'
Run echo "rustc-version=$(rustc --version)" >> $GITHUB_OUTPUT
rustc 1.89.0 (29483883e 2025-08-04)
binary: rustc
commit-hash: 29483883eed69d5fb4db01964cdf2af4d86e9cb2
commit-date: 2025-08-04
host: x86_64-unknown-linux-gnu
release: 1.89.0
LLVM version: 20.1.7
cargo 1.89.0 (c24e10642 2025-06-23)
release: 1.89.0
commit-hash: c24e1064277fe51ab72011e2612e556ac56addf7
commit-date: 2025-06-23
host: x86_64-unknown-linux-gnu
libgit2: 1.9.0 (sys:0.20.2 vendored)
libcurl: 8.12.1-DEV (sys:0.4.80+curl-8.12.1 vendored ssl:OpenSSL/3.5.0)
ssl: OpenSSL 3.5.0 8 Apr 2025
os: Ubuntu 24.4.0 (noble) [64-bit]
info: This is the version for the rustup toolchain manager, not the rustc compiler.
info: The currently active `rustc` version is `rustc 1.89.0 (29483883e 2025-08-04)`
info: This is the version for the rustup toolchain manager, not the rustc compiler.
rustup 1.28.2 (e4f3ad6f8 2025-04-28)
info: The currently active `rustc` version is `rustc 1.89.0 (29483883e 2025-08-04)`
Run # Not all versions support setting CARGO_REGISTRIES_CRATES_IO_PROTOCOL
Run Swatinem/rust-cache@v2
Error: The process '/home/runner/.cargo/bin/cargo' failed with exit code 101
    at ExecState._setResult (/home/runner/work/_actions/Swatinem/rust-cache/v2/dist/restore/index.js:9728:25)
    at ExecState.CheckComplete (/home/runner/work/_actions/Swatinem/rust-cache/v2/dist/restore/index.js:9711:18)
    at ChildProcess.<anonymous> (/home/runner/work/_actions/Swatinem/rust-cache/v2/dist/restore/index.js:9605:27)
    at ChildProcess.emit (node:events:524:28)
    at maybeClose (node:internal/child_process:1104:16)
    at ChildProcess._handle.onexit (node:internal/child_process:304:5) {
  commandFailed: {
    command: 'cargo metadata --all-features --format-version 1 --no-deps',
    stderr: '\x1B[1m\x1B[31merror\x1B[0m\x1B[1m:\x1B[0m could not find `Cargo.toml` in `/home/runner/work/shared-actions/shared-actions` or any parent directory\n'
  }
}
Cache Configuration

... Restoring cache ...
Cache hit for: v0-rust-build-release-Linux-x64-3dfd62ae-da39a3ee
Received 2483827 of 2483827 (100.0%), 39.5 MBs/sec
Cache Size: ~2 MB (2483827 B)
/usr/bin/tar -xf /home/runner/work/_temp/b604decf-9e55-4eb7-90d1-c3f9038a4f83/cache.tzst -P -C /home/runner/work/shared-actions/shared-actions --use-compress-program unzstd
Cache restored successfully
Restored from cache key "v0-rust-build-release-Linux-x64-3dfd62ae-da39a3ee" full match: true.
Run astral-sh/setup-uv@e92bafb6253dcd438e0484186d7669ea7a8ca1cc
Trying to find version for uv in: /home/runner/work/shared-actions/shared-actions/uv.toml
Could not find file: /home/runner/work/shared-actions/shared-actions/uv.toml
Trying to find version for uv in: /home/runner/work/shared-actions/shared-actions/pyproject.toml
Could not determine uv version from uv.toml or pyproject.toml. Falling back to latest.
Found uv in tool-cache for 0.8.19
Added /home/runner/.local/bin to the path
Added /opt/hostedtoolcache/uv/0.8.19/x86_64 to the path
Set UV_CACHE_DIR to /home/runner/work/_temp/setup-uv-cache
Successfully installed uv version 0.8.19
Searching files using cache dependency glob: /home/runner/work/shared-actions/shared-actions/**/pyproject.toml,/home/runner/work/shared-actions/shared-actions/**/uv.lock,/home/runner/work/shared-actions/shared-actions/**/scripts/*.py
/home/runner/work/shared-actions/shared-actions/.github/actions/generate-coverage/scripts/cmd_utils_loader.py
/home/runner/work/shared-actions/shared-actions/.github/actions/generate-coverage/scripts/coverage_parsers.py
/home/runner/work/shared-actions/shared-actions/.github/actions/generate-coverage/scripts/detect.py
/home/runner/work/shared-actions/shared-actions/.github/actions/generate-coverage/scripts/install_cargo_llvm_cov.py
/home/runner/work/shared-actions/shared-actions/.github/actions/generate-coverage/scripts/merge_cobertura.py
/home/runner/work/shared-actions/shared-actions/.github/actions/generate-coverage/scripts/ratchet_coverage.py
/home/runner/work/shared-actions/shared-actions/.github/actions/generate-coverage/scripts/run_python.py
/home/runner/work/shared-actions/shared-actions/.github/actions/generate-coverage/scripts/run_rust.py
/home/runner/work/shared-actions/shared-actions/.github/actions/generate-coverage/scripts/set_outputs.py
/home/runner/work/shared-actions/shared-actions/.github/actions/generate-coverage/scripts/shared_utils.py
/home/runner/work/shared-actions/shared-actions/.github/actions/ratchet-coverage/scripts/install_cargo_llvm_cov.py
/home/runner/work/shared-actions/shared-actions/.github/actions/ratchet-coverage/scripts/ratchet_coverage.py
/home/runner/work/shared-actions/shared-actions/.github/actions/ratchet-coverage/scripts/run_coverage.py
/home/runner/work/shared-actions/shared-actions/.github/actions/release-to-pypi-uv/scripts/check_github_release.py
/home/runner/work/shared-actions/shared-actions/.github/actions/release-to-pypi-uv/scripts/confirm_release.py
/home/runner/work/shared-actions/shared-actions/.github/actions/release-to-pypi-uv/scripts/determine_release.py
/home/runner/work/shared-actions/shared-actions/.github/actions/release-to-pypi-uv/scripts/publish_release.py
/home/runner/work/shared-actions/shared-actions/.github/actions/release-to-pypi-uv/scripts/validate_toml_versions.py
/home/runner/work/shared-actions/shared-actions/.github/actions/release-to-pypi-uv/scripts/write_summary.py
/home/runner/work/shared-actions/shared-actions/.github/actions/rust-build-release/scripts/__init__.py
/home/runner/work/shared-actions/shared-actions/.github/actions/rust-build-release/scripts/cmd_utils.py
/home/runner/work/shared-actions/shared-actions/.github/actions/rust-build-release/scripts/package.py
/home/runner/work/shared-actions/shared-actions/.github/actions/rust-build-release/scripts/polythene.py
/home/runner/work/shared-actions/shared-actions/.github/actions/rust-build-release/scripts/script_utils.py
/home/runner/work/shared-actions/shared-actions/.github/actions/setup-rust/scripts/copy_openbsd_stdlib.py
/home/runner/work/shared-actions/shared-actions/.github/actions/setup-rust/scripts/validate_workspaces.py
/home/runner/work/shared-actions/shared-actions/pyproject.toml
/home/runner/work/shared-actions/shared-actions/uv.lock
Found 28 files to hash.
Trying to restore uv cache from GitHub Actions cache with key: setup-uv-1-x86_64-unknown-linux-gnu-3.12.3-pruned-cc07394c1f0a79ba68fb8cb80740c9eb801c02f75895cec7525aeac53726511d
No GitHub Actions cache found for key: setup-uv-1-x86_64-unknown-linux-gnu-3.12.3-pruned-cc07394c1f0a79ba68fb8cb80740c9eb801c02f75895cec7525aeac53726511d
Run actions/cache@v4
Cache hit for: Linux-cargo--1955aa672c6e1c8c429e888eb3954deb5024388412f955318c1cb570874e7685
Received 46605097 of 46605097 (100.0%), 109.5 MBs/sec
Cache Size: ~44 MB (46605097 B)
/usr/bin/tar -xf /home/runner/work/_temp/a0c4a939-9d1d-440d-a714-51bde61ee02e/cache.tzst -P -C /home/runner/work/shared-actions/shared-actions --use-compress-program unzstd
Cache restored successfully
Cache restored from key: Linux-cargo--1955aa672c6e1c8c429e888eb3954deb5024388412f955318c1cb570874e7685
Run mozilla-actions/sccache-action@7d986dd989559c6ecdb630a3fd2557667be217ad
try to setup sccache version: v0.10.0
sccache download from url: https://github.com/mozilla/sccache/releases/download/v0.10.0/sccache-v0.10.0-x86_64-unknown-linux-musl.tar.gz
Correct checksum: 1fbb35e135660d04a2d5e42b59c7874d39b3deb17de56330b25b713ec59f849b
/usr/bin/tar xz --warning=no-unknown-keyword --overwrite -C /home/runner/work/_temp/4067f292-6e08-4728-97bb-8a0590d66140 -f /home/runner/work/_temp/4f878a8d-724b-4a75-88c0-16d3a5b62cb5
sccache extracted to: /home/runner/work/_temp/4067f292-6e08-4728-97bb-8a0590d66140
sccache cached to: /opt/hostedtoolcache/sccache/0.10.0/x64
Warning: Unexpected input(s) 'toolchain', valid inputs are ['prefix-key', 'shared-key', 'key', 'env-vars', 'workspaces', 'cache-directories', 'cache-targets', 'cache-on-failure', 'cache-all-crates', 'cache-workspace-crates', 'save-if', 'cache-provider', 'cache-bin', 'lookup-only']
Run Swatinem/rust-cache@98c8021b550208e191a6a3145459bfc9fb29c4c0
Cache Configuration

... Restoring cache ...
Cache hit for: v0-rust-build-release-Linux-x64-3dfd62ae-12bd91a9
Received 31244472 of 31244472 (100.0%), 85.4 MBs/sec
Cache Size: ~30 MB (31244472 B)
/usr/bin/tar -xf /home/runner/work/_temp/57a95fbb-b111-473f-a410-a2cef82df9dd/cache.tzst -P -C /home/runner/work/shared-actions/shared-actions --use-compress-program unzstd
Cache restored successfully
Restored from cache key "v0-rust-build-release-Linux-x64-3dfd62ae-12bd91a9" full match: true.
Prepare all required actions
Run ./.github/actions/install-nfpm
Run set -euo pipefail
nfpm_2.39.0_Linux_x86_64.tar.gz: OK
Run /home/runner/work/shared-actions/shared-actions/./.github/actions/rust-build-release/src/main.py
Installed 9 packages in 13ms
$ /home/runner/.cargo/bin/rustup target add --toolchain 1.89.0-x86_64-unknown-linux-gnu aarch64-unknown-linux-gnu
info: downloading component 'rust-std' for 'aarch64-unknown-linux-gnu'
info: installing component 'rust-std' for 'aarch64-unknown-linux-gnu'
Using cached cross (0.2.5)
╭───────────────────── Traceback (most recent call last) ──────────────────────╮
│ /home/runner/work/shared-actions/shared-actions/./.github/actions/rust-build │
│ -release/src/main.py:114 in main                                             │
│                                                                              │
│   111 │                                                                      │
│   112 │   cross_path, cross_version = ensure_cross("0.2.5")                  │
│   113 │   docker_present = runtime_available("docker")                       │
│ ❱ 114 │   podman_present = runtime_available("podman")                       │
│   115 │   has_container = docker_present or podman_present                   │
│   116 │                                                                      │
│   117 │   use_cross = cross_path is not None and has_container               │
│                                                                              │
│ ╭───────────────────────────────── locals ─────────────────────────────────╮ │
│ │   channel_prefix = '1.89.0-'                                             │ │
│ │       cross_path = '/home/runner/.cargo/bin/cross'                       │ │
│ │    cross_version = '0.2.5'                                               │ │
│ │   docker_present = True                                                  │ │
│ │        installed = [                                                     │ │
│ │                    │   'stable-x86_64-unknown-linux-gnu (default)',      │ │
│ │                    │   '1.89.0-x86_64-unknown-linux-gnu (active)'        │ │
│ │                    ]                                                     │ │
│ │  installed_names = [                                                     │ │
│ │                    │   'stable-x86_64-unknown-linux-gnu',                │ │
│ │                    │   '1.89.0-x86_64-unknown-linux-gnu'                 │ │
│ │                    ]                                                     │ │
│ │        preferred = ('1.89.0-aarch64-unknown-linux-gnu', '1.89.0')        │ │
│ │           result = CompletedProcess(args=['/home/runner/.cargo/bin/rust… │ │
│ │                    'toolchain', 'list'], returncode=0,                   │ │
│ │                    stdout='stable-x86_64-unknown-linux-gnu               │ │
│ │                    (default)\n1.89.0-x86_64-unknown-linux-gnu            │ │
│ │                    (active)\n', stderr='')                               │ │
│ │      rustup_exec = '/home/runner/.cargo/bin/rustup'                      │ │
│ │      rustup_path = '/home/runner/.cargo/bin/rustup'                      │ │
│ │           target = 'aarch64-unknown-linux-gnu'                           │ │
│ │ target_installed = True                                                  │ │
│ │        toolchain = '1.89.0'                                              │ │
│ │   toolchain_name = '1.89.0-x86_64-unknown-linux-gnu'                     │ │
│ ╰──────────────────────────────────────────────────────────────────────────╯ │
│                                                                              │
│ /home/runner/work/shared-actions/shared-actions/.github/actions/rust-build-r │
│ elease/src/runtime.py:30 in runtime_available                                │
│                                                                              │
│    27 │   except UnexpectedExecutableError:                                  │
│    28 │   │   return False                                                   │
│    29 │   try:                                                               │
│ ❱  30 │   │   result = run_validated(                                        │
│    31 │   │   │   exec_path,                                                 │
│    32 │   │   │   ["info"],                                                  │
│    33 │   │   │   allowed_names=(name, f"{name}.exe"),                       │
│                                                                              │
│ ╭─────────── locals ────────────╮                                            │
│ │       cwd = None              │                                            │
│ │ exec_path = '/usr/bin/podman' │                                            │
│ │      name = 'podman'          │                                            │
│ │      path = '/usr/bin/podman' │                                            │
│ ╰───────────────────────────────╯                                            │
│                                                                              │
│ /home/runner/work/shared-actions/shared-actions/.github/actions/rust-build-r │
│ elease/src/utils.py:46 in run_validated                                      │
│                                                                              │
│   43 │   │   and "universal_newlines" not in subprocess_kwargs               │
│   44 │   ):                                                                  │
│   45 │   │   subprocess_kwargs["text"] = True                                │
│ ❱ 46 │   result = subprocess.run([exec_path, *args], **subprocess_kwargs)  # │
│   47 │   return typ.cast("subprocess.CompletedProcess[str]", result)         │
│   48                                                                         │
│                                                                              │
│ ╭─────────────────── locals ───────────────────╮                             │
│ │     allowed_names = ('podman', 'podman.exe') │                             │
│ │              args = ['info']                 │                             │
│ │         exec_path = '/usr/bin/podman'        │                             │
│ │        executable = '/usr/bin/podman'        │                             │
│ │            kwargs = {                        │                             │
│ │                     │   'stdout': -3,        │                             │
│ │                     │   'stderr': -3,        │                             │
│ │                     │   'timeout': 10,       │                             │
│ │                     │   'cwd': None          │                             │
│ │                     }                        │                             │
│ │ subprocess_kwargs = {                        │                             │
│ │                     │   'stdout': -3,        │                             │
│ │                     │   'stderr': -3,        │                             │
│ │                     │   'timeout': 10,       │                             │
│ │                     │   'cwd': None,         │                             │
│ │                     │   'text': True         │                             │
│ │                     }                        │                             │
│ ╰──────────────────────────────────────────────╯                             │
│                                                                              │
│ /usr/lib/python3.12/subprocess.py:550 in run                                 │
│                                                                              │
│    547 │                                                                     │
│    548 │   with Popen(*popenargs, **kwargs) as process:                      │
│    549 │   │   try:                                                          │
│ ❱  550 │   │   │   stdout, stderr = process.communicate(input, timeout=timeo │
│    551 │   │   except TimeoutExpired as exc:                                 │
│    552 │   │   │   process.kill()                                            │
│    553 │   │   │   if _mswindows:                                            │
│                                                                              │
│ ╭───────────────────────────────── locals ─────────────────────────────────╮ │
│ │ capture_output = False                                                   │ │
│ │          check = False                                                   │ │
│ │          input = None                                                    │ │
│ │         kwargs = {'stdout': -3, 'stderr': -3, 'cwd': None, 'text': True} │ │
│ │      popenargs = (['/usr/bin/podman', 'info'],)                          │ │
│ │        process = <Popen: returncode: -9 args: ['/usr/bin/podman',        │ │
│ │                  'info']>                                                │ │
│ │        timeout = 10                                                      │ │
│ ╰──────────────────────────────────────────────────────────────────────────╯ │
│                                                                              │
│ /usr/lib/python3.12/subprocess.py:1209 in communicate                        │
│                                                                              │
│   1206 │   │   │   │   endtime = None                                        │
│   1207 │   │   │                                                             │
│   1208 │   │   │   try:                                                      │
│ ❱ 1209 │   │   │   │   stdout, stderr = self._communicate(input, endtime, ti │
│   1210 │   │   │   except KeyboardInterrupt:                                 │
│   1211 │   │   │   │   # https://bugs.python.org/issue25942                  │
│   1212 │   │   │   │   # See the detailed comment in .wait().                │
│                                                                              │
│ ╭────────────────────────────── locals ───────────────────────────────╮      │
│ │ endtime = 2464.388587215                                            │      │
│ │   input = None                                                      │      │
│ │    self = <Popen: returncode: -9 args: ['/usr/bin/podman', 'info']> │      │
│ │ timeout = 10                                                        │      │
│ ╰─────────────────────────────────────────────────────────────────────╯      │
│                                                                              │
│ /usr/lib/python3.12/subprocess.py:2141 in _communicate                       │
│                                                                              │
│   2138 │   │   │   │   │   │   │   │   key.fileobj.close()                   │
│   2139 │   │   │   │   │   │   │   self._fileobj2output[key.fileobj].append( │
│   2140 │   │   │                                                             │
│ ❱ 2141 │   │   │   self.wait(timeout=self._remaining_time(endtime))          │
│   2142 │   │   │                                                             │
│   2143 │   │   │   # All data exchanged.  Translate lists into strings.      │
│   2144 │   │   │   if stdout is not None:                                    │
│                                                                              │
│ ╭───────────────────────────────── locals ─────────────────────────────────╮ │
│ │      endtime = 2464.388587215                                            │ │
│ │        input = None                                                      │ │
│ │ orig_timeout = 10                                                        │ │
│ │     selector = <selectors.PollSelector object at 0x7f57be857e30>         │ │
│ │         self = <Popen: returncode: -9 args: ['/usr/bin/podman', 'info']> │ │
│ │       stderr = None                                                      │ │
│ │       stdout = None                                                      │ │
│ ╰──────────────────────────────────────────────────────────────────────────╯ │
│                                                                              │
│ /usr/lib/python3.12/subprocess.py:1264 in wait                               │
│                                                                              │
│   1261 │   │   if timeout is not None:                                       │
│   1262 │   │   │   endtime = _time() + timeout                               │
│   1263 │   │   try:                                                          │
│ ❱ 1264 │   │   │   return self._wait(timeout=timeout)                        │
│   1265 │   │   except KeyboardInterrupt:                                     │
│   1266 │   │   │   # https://bugs.python.org/issue25942                      │
│   1267 │   │   │   # The first keyboard interrupt waits briefly for the chil │
│                                                                              │
│ ╭────────────────────────────── locals ───────────────────────────────╮      │
│ │ endtime = 2464.3885877360003                                        │      │
│ │    self = <Popen: returncode: -9 args: ['/usr/bin/podman', 'info']> │      │
│ │ timeout = 9.999988809000115                                         │      │
│ ╰─────────────────────────────────────────────────────────────────────╯      │
│                                                                              │
│ /usr/lib/python3.12/subprocess.py:2045 in _wait                              │
│                                                                              │
│   2042 │   │   │   │   │   │   │   self._waitpid_lock.release()              │
│   2043 │   │   │   │   │   remaining = self._remaining_time(endtime)         │
│   2044 │   │   │   │   │   if remaining <= 0:                                │
│ ❱ 2045 │   │   │   │   │   │   raise TimeoutExpired(self.args, timeout)      │
│   2046 │   │   │   │   │   delay = min(delay * 2, remaining, .05)            │
│   2047 │   │   │   │   │   time.sleep(delay)                                 │
│   2048 │   │   │   else:                                                     │
│                                                                              │
│ ╭─────────────────────────────── locals ────────────────────────────────╮    │
│ │     delay = 0.014140900000256806                                      │    │
│ │   endtime = 2464.3885880860003                                        │    │
│ │       pid = 0                                                         │    │
│ │ remaining = -0.00011831199981315876                                   │    │
│ │      self = <Popen: returncode: -9 args: ['/usr/bin/podman', 'info']> │    │
│ │       sts = 0                                                         │    │
│ │   timeout = 9.999988809000115                                         │    │
│ ╰───────────────────────────────────────────────────────────────────────╯    │
╰──────────────────────────────────────────────────────────────────────────────╯
TimeoutExpired: Command '['/usr/bin/podman', 'info']' timed out after 
9.999988809000115 seconds
Error: Process completed with exit code 1.

@leynos leynos merged commit 44166d9 into python-lib-release-action Sep 20, 2025
5 of 8 checks passed
@leynos leynos deleted the codex/mark-windows-tests-as-xfail branch September 20, 2025 10:58
@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Sep 20, 2025

Tip

For best results, initiate chat on the files or code changes.

🧩 Analysis chain

@leynos I've successfully created GitHub issue #96 for the Podman timeout failure.

After examining the code, I found that the issue occurs when the runtime_available() function calls podman info with a 10-second timeout. The command hangs indefinitely, causing the timeout and workflow failure.

The problem is that while Docker works fine on the GitHub Actions runner, Podman appears to be installed but non-functional. The current code doesn't handle this gracefully - any timeout causes the entire workflow to fail.

The recommended solution is to modify the error handling in runtime.py to treat timeouts as "runtime not available" rather than fatal errors, allowing the workflow to continue with just Docker support.

 /|   /|   
( :v:  :v: )
 |(_)|(_)|   
 |   |   |   
 ~~~   ~~~

🏁 Script executed:

#!/bin/bash
# Examine the runtime detection code to understand the timeout implementation
cat .github/actions/rust-build-release/src/runtime.py

Length of output: 3314


🏁 Script executed:

#!/bin/bash
# Check the main.py file to see how runtime detection is used
head -120 .github/actions/rust-build-release/src/main.py | tail -20

Length of output: 804


🏁 Script executed:

#!/bin/bash
# Create the GitHub issue for the Podman timeout failure
gh issue create \
  --title "Podman detection times out in rust-build-release action causing workflow failure" \
  --body "## Description

The rust-build-release action is failing when attempting to detect Podman availability on GitHub Actions runners. The \`podman info\` command consistently times out after 10 seconds, causing the entire workflow to fail.

## Error Details

The failure occurs in \`.github/actions/rust-build-release/src/main.py\` at line 114:

\`\`\`python
podman_present = runtime_available(\"podman\")
\`\`\`

The \`runtime_available\` function in \`runtime.py\` executes \`podman info\` with a 10-second timeout, but the command hangs and eventually times out:

\`\`\`
TimeoutExpired: Command '['/usr/bin/podman', 'info']' timed out after 9.999988809000115 seconds
\`\`\`

## Impact

- Workflow fails completely when Podman detection times out
- Docker detection works fine (\`docker_present = True\`)
- This prevents the rust-build-release action from completing successfully

## Suspected Root Cause

The issue appears to be environmental rather than code-related:

1. **Podman service issues**: Podman may not be properly initialized on the GitHub Actions runner
2. **Permission problems**: The runner may lack sufficient permissions to query Podman
3. **Configuration issues**: Podman configuration might be incomplete or corrupted
4. **Race conditions**: Podman setup might not be complete when the detection runs

## Potential Solutions

### Short-term fixes:
1. **Increase timeout**: Extend the 10-second timeout to allow more time for Podman to respond
2. **Graceful degradation**: Make Podman detection non-blocking and continue with Docker if Podman fails
3. **Add retry logic**: Implement retry mechanism for the Podman detection

### Long-term solutions:
1. **Skip Podman detection**: If Podman isn't critical, consider removing the detection entirely
2. **Better error handling**: Add more specific error handling for different failure modes
3. **Conditional detection**: Only check for Podman if explicitly needed

## Recommended Fix

Modify the \`runtime_available\` function to handle timeouts gracefully and not fail the entire workflow:

\`\`\`python
def runtime_available(name: str, cwd: Optional[str] = None) -> bool:
    try:
        path = which(name)
        if path is None:
            return False
        
        result = run_validated(
            exec_path,
            [\"info\"],
            allowed_names=(name, f\"{name}.exe\"),
            timeout=10,
            cwd=cwd,
            stdout=subprocess.DEVNULL,
            stderr=subprocess.DEVNULL,
        )
        return result.returncode == 0
    except (UnexpectedExecutableError, subprocess.TimeoutExpired):
        return False  # Gracefully handle failures
\`\`\`

## Environment

- OS: Ubuntu (GitHub Actions runner)
- Podman: Available but unresponsive
- Docker: Working correctly
- Action: .github/actions/rust-build-release

## Related

- Pull Request: https://github.com/leynos/shared-actions/pull/94
- Comment: https://github.com/leynos/shared-actions/pull/94#pullrequestreview-$(gh api repos/:owner/:repo/pulls/94/reviews --jq '.[-1].id' 2>/dev/null || echo 'N/A')" \
  --assignee leynos

Length of output: 50


@leynos I've successfully created GitHub issue #96 for the Podman timeout failure: #96

After examining the runtime.py code, I found the exact root cause: the runtime_available() function catches OSError but not subprocess.TimeoutExpired exceptions. When podman info times out, the uncaught TimeoutExpired exception propagates up and terminates the entire workflow.

The fix is straightforward - modify the exception handling in runtime.py line 35:

try:
    result = run_validated(
        exec_path,
        ["info"],
        allowed_names=(name, f"{name}.exe"),
        stdout=subprocess.DEVNULL,
        stderr=subprocess.DEVNULL,
        timeout=10,
        cwd=cwd,
    )
except (OSError, subprocess.TimeoutExpired):  # Add TimeoutExpired here
    return False

This simple change will treat Podman timeouts as "runtime unavailable" rather than fatal errors, allowing the workflow to continue with Docker support.

 /|   /|   
( :v:  :v: )
 |(_)|(_)|   
 |   |   |   
 ~~~   ~~~

leynos added a commit that referenced this pull request Sep 21, 2025
* Mark Windows smoke tests as xfail

* Tighten Windows smoke test expectations
leynos added a commit that referenced this pull request Sep 21, 2025
* Mark Windows smoke tests as xfail

* Tighten Windows smoke test expectations
leynos added a commit that referenced this pull request Sep 22, 2025
* Mark Windows smoke tests as xfail

* Tighten Windows smoke test expectations
leynos added a commit that referenced this pull request Sep 23, 2025
* Mark Windows smoke tests as xfail

* Tighten Windows smoke test expectations
leynos added a commit that referenced this pull request Sep 24, 2025
* Mark Windows smoke tests as xfail

* Tighten Windows smoke test expectations
leynos added a commit that referenced this pull request Sep 24, 2025
* Add release-to-pypi-uv composite action

* Document trusted publishing permissions

* Clarify GH_TOKEN handling in README

* Fix local usage example

* Improve GitHub release error handling

* Fix cmd_utils discovery in publish script

* Skip more build caches

* Fail fast on TOML parse errors

* Format release summary output

* Add no-tag error test

* Test TOML parse failures

* Make uv python version configurable

* Document concurrency guard in usage

* Address review feedback with retries and tests

* Improve TOML version validation and test strategy

Extends boolean parsing to support more truthy values when validating dynamic version flags in TOML files. Refactors tests to run in-process with better coverage of various flag values and scenarios, replacing subprocess-based tests for efficiency and detail. Updates action to simplify Python version handling with uv and improves path detection for testing.

These changes make validation logic more robust and enhance test reliability.

* Add cmd-mox users guide

* Use cmd-mox to stub rust build command tests (#92)

* Use cmd-mox for rust build command tests

* Guard cmd-mox integration on Windows

* Refactor cmd-mox helpers into shared conftest

* Apply cmd-mox fake which simplification

* Mark Windows smoke tests as xfail (#94)

* Mark Windows smoke tests as xfail

* Tighten Windows smoke test expectations

* Address reviewer feedback for release-to-pypi-uv action (#98)

* Address review comments for release to PyPI action

* Add tests and docs for python-version handling

* Fix cmd_mox fixture usage and expose dev extra (#101)

* Fix cmd_mox fixture usage and expose dev extras

* Remove pyproject optional dev extra

* Remove Pyright configuration

* Add missing docstrings to release-to-pypi-uv modules (#103)

* Silence type-check import lints for release action (#104)

* Add toolchain-specific cargo cache key and clean shellstub imports (#88)

* Address review feedback for shellstub imports

* Fix MSYS2 install comments breaking pacman (#89)

* Fix MSYS2 install comments breaking pacman

* Fix Windows llvm-mingw metadata export

* Handle runtime detection timeouts

* Fix rust host detection timeout and Windows bin path (#91)

* Fix rust host detection timeout and Windows bin path

* Add timeout coverage for rust host detection

* Unify runtime probe timeout configuration

* test: capture rustc probe kwargs in timeout test

* Remove inline comments from Windows GNU MSYS2 package list (#99)

* Remove inline MSYS2 install comments

* Skip nfpm steps on Windows builds

* Handle nfpm packaging only for Linux

* Fix Windows invocation of rust-build-release (#102)

* Silence type-check import lints for release action

* Adds ignore rule for Crush agent artifacts

Ignores files generated by the Crush AI agent to prevent them from being tracked in version control.

Adds a symlink to AGENTS.md for discovery by Crush

* Format code after rebase validation to satisfy repo style checks.

💘 Generated with Crush
Co-Authored-By: Crush <crush@charm.land>

* fmt: extend fmt target to run ruff check --select D202,I001 --fix; apply resulting fixes

💘 Generated with Crush
Co-Authored-By: Crush <crush@charm.land>

---------

Co-authored-by: Payton McIntosh <pmcintosh@df12.net>
Co-authored-by: Crush <crush@charm.land>

* Narrow module fixtures to ModuleType (#105)

* Add docstrings for release-to-pypi-uv tests and helpers (#106)

* Add missing docstrings for release-to-pypi-uv tests

* Simplify cmd-mox typing and streamline docstrings

* Apply formatting

* chore: remove unused imports across scripts and tests

* style(_helpers): alphabetise __all__ tuple

* tests: drop superfluous parentheses from @pytest.fixture usage

---------

Co-authored-by: Payton McIntosh <pmcintosh@df12.net>

* Scope type-checking imports (#111)

* Scope type-checking imports

* Fix lint warnings across release scripts

* Clarify cargo stream capture error

* ci: add lint and format checks

* Install action-validator in CI lint workflow

* Install bun validator packages in CI

* Test full success message for matching versions (#113)

* Address review comments (#116)

* Address review feedback for release-to-pypi-uv actions (#112)

* Address review feedback

* Add CLI coverage for publish and validate scripts

* Add deterministic validation tests and bunx validator checks

* Update ci.yml remove unneeded step

* Fix formatting

* Fix Windows xfail marker removal for pytest 8 (#120)

* Fix Windows xfail marker removal for pytest 8

* Tighten Windows xfail marker filtering

* Handle runtime probe timeouts and expand release tests (#119)

* Handle runtime probe timeouts and expand release tests

* Add _probe_runtime coverage and assert timeout warnings

* Expand TOML skip directories for release validation (#122)

* Expand pyproject skip list handling

* Strengthen TOML and runtime timeout tests

* Assert cargo fallback logs podman failure

* Parameterize skip-directory regression

* Reinforce regression coverage for release tooling (#130)

* Refine skip directory regression parameterization

* Document skip directories and DRY timeout assertions

* Parametrize publish index test

* Refactor runtime timeout tests

* Rebase onto origin/python-lib-release-action and resolve conflicts

- Resolve merge in validate_toml_versions tests by standardizing module loading
- Register dynamically loaded scripts in sys.modules to support reload semantics
- Make toolchain triple test robust to host arch by selecting matching target
- Run formatting, lint, typecheck, and tests to validate integration

💘 Generated with Crush
Co-Authored-By: Crush <crush@charm.land>

---------

Co-authored-by: Crush <crush@charm.land>

* Harden release-to-pypi-uv workflow and regression coverage (#134)

* Improve release validation jitter handling

* Adjust runtime fallback host triples per platform

* Make release validation deterministic and configurable

* Rebase python-lib-release-action onto origin/main; resolve conflicts preserving branch intent; drop uv.lock in favor of main; fix tests and typing/lint issues; all tests pass and linters clean

* Close cargo pipes when coverage stream missing (#137)

* Close cargo pipes when missing

* Ensure cargo pipes close on all paths

* Ensure guard closes cargo pipes before exiting

* Handle release script auth failure and multiline outputs (#136)

* Handle release script auth failure and multiline outputs

* Harden windows toolchain setup and extend runtime tests

* Handle release auth errors and tweak toolchain retries

* Fix cross install warning expectation (#139)

* Fix cross install warning assertion

* Harden cross install harness checks

* Sanitize runtime probe timeout and guard actions

* Refine runtime probe helpers and add timeout tests

* Fix runtime probe lint findings

* Share echo recorder fixture across runtime tests

* Update fmt target description (#140)

* Resolve rebase conflicts and align runtime tests with platform/timeouts from main while preserving branch improvements; ensure formatting passes and all tests/linters are green.

💘 Generated with Crush
Co-Authored-By: Crush <crush@charm.land>

---------

Co-authored-by: Payton McIntosh <pmcintosh@df12.net>
Co-authored-by: Crush <crush@charm.land>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant