Prevent case-colliding staged package paths - #134
Conversation
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 08638c04dc
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| raise ValidationError(f"Staged game directory must not be a symlink: {game_dir}") | ||
| if not game_dir.is_dir(): | ||
| raise ValidationError(f"Staged game directory is missing: {game_dir}") | ||
| validate_no_staged_casefold_path_collisions(root, install_root) |
There was a problem hiding this comment.
Prevent failed collision checks from uploading the payload
When this check detects a collision in a push-verification job, validation fails but the same invalid .install tree is still published because both staged-payload upload steps in .github/workflows/push-verification.yml use if: always() (lines 613-618 and 689-694). Thus a Linux-produced artifact can still contain the case-colliding paths and remain impossible to extract on Windows—the exact failure this change intends to prevent—so the payload upload must be gated on successful validation or explicitly skipped after this error.
Useful? React with 👍 / 👎.
Summary
.installicon copies; Meson already stages the canonical lowercase icons fromassets/iconsInvestigation
While downloading
push-linux-x64-payloadfrom Actions run33002644028on Windows,gh run downloadfailed while extractingopenQ4.icnsbecause that path already existed. The artifact central directory contained all four tracked names:OpenQ4.icoOpenQ4.icnsopenQ4.icoopenQ4.icnsA clean Linux checkout can preserve and upload all four, but Windows and other case-insensitive extraction targets cannot represent each pair. The lowercase files are generated/staged by Meson, so no runtime icon is lost by removing the four repository-owned
.installcopies.Validation
python tools/tests/validation_hardening.pypython tools/tests/macos_metal_bridge.pypython tools/tests/macos_package_robustness.pypython tools/tests/packaging_safety.pypython -m py_compile tools/validation/openq4_validate.py tools/tests/validation_hardening.pygit diff --check origin/main...HEADNo external code was incorporated.