Skip to content

CI: archive on each OS, receive on every OS (nine pairings) - #76

Open
op-q wants to merge 4 commits into
feat/windows-releasefrom
ci/cross-os-archives
Open

op-q wants to merge 4 commits into
feat/windows-releasefrom
ci/cross-os-archives

Conversation

@op-q

@op-q op-q commented Sep 15, 2026

Copy link
Copy Markdown
Owner

Cross-platform plan, phase 4. Adds a CI workflow plus two #[ignore]d tests, with no product code. It's still a workflow change, so it waits for you. Stacked on #75.

Why split the transfer

Two CI runners can't swap a transfer code mid-run. The wire is platform-neutral, so the only parts that differ by OS are reading a tree (sender) and writing one (receiver). The workflow tests exactly those:

  • produce (Linux, macOS, Windows) builds a tree and archives it the way drop send does. The tree has nested folders, an empty folder and an empty file, 3 MiB of data, Unicode names, a >100-byte name (GNU long-name record), a path deeper than 260 characters, and an executable script. Unix producers add a relative symlink, 10:30 standup.md, nul.txt and trailing dot..
  • consume (Linux, macOS, Windows) receives every OS's archive, as both .tar and .tar.gz, through the real receive path over an in-process relay. It checks byte-exact contents, directories, links (kept on Unix; skipped and not half-made on Windows), executable bits on Unix, and Windows name rewriting (10_30 standup.md, nul_.txt, trailing dot_).

That's 3 producers × 3 consumers, 9 pairings, each for two archive formats.

Verified

  • Linux → Linux, run locally, for both formats.
  • Negative control: with one byte flipped inside the Linux tar, consume fails with nested/deeper/data.bin: contents differ.
  • The other eight pairings run for the first time on this PR.

It runs on PRs that touch tar.rs, untar.rs, payload.rs, recv.rs, names.rs or the test, nightly, and via workflow_dispatch. It is not a required check.

🤖 Generated with Claude Code

https://claude.ai/code/session_01G7Fy45hUvna94cd79WKG8S

A cross-OS transfer can differ by platform in only two places: how the sender
reads a tree, and how the receiver writes one. The wire is the same
everywhere. Two CI runners cannot swap a transfer code, so the transfer is
split in two.

`produce`, on each OS, builds a tree using every kind of name and file that OS
can hold and archives it exactly as `drop send` does. `consume`, on each OS,
receives every OS's archive, tar and gzipped, through the real receive path
over an in-process relay. It checks contents, directories, links (kept on Unix,
skipped on Windows), executable bits, and Windows name rewriting. That is nine
pairings.

The workflow runs on pull requests that touch the tree code, nightly, and on
demand. With one byte of an archive flipped, consume fails naming the file.

Cross-platform plan, phase 4.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01G7Fy45hUvna94cd79WKG8S
@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.

@op-q op-q mentioned this pull request Sep 16, 2026

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant