Skip to content

chore: add release infrastructure and rename crate back to iceberg-datafusion - #32

Draft
andygrove wants to merge 3 commits into
apache:mainfrom
andygrove:andygrove/init-command
Draft

andygrove wants to merge 3 commits into
apache:mainfrom
andygrove:andygrove/init-command

Conversation

@andygrove

@andygrove andygrove commented Oct 1, 2026 •

Copy link
Copy Markdown
Member

Which issue does this PR close?

Rationale for this change

This repository was split out of apache/iceberg-rust. That project keeps its release tooling at the repository level, so none of it came over with the crate, and there's currently no way to produce an ASF source release.

#30 proposes keeping the crate's original crates.io name, iceberg-datafusion, so that releases continue its existing version line. The release tooling is written for that name, so this PR also does the rename.

What changes are included in this PR?

Three commits:

  1. Rename the crate back to iceberg-datafusion (library iceberg_datafusion). datafusion-iceberg collides on crates.io with the unrelated datafusion_iceberg crate. The change is mechanical: manifests, Cargo.lock and use paths.

  2. Add release infrastructure in dev/release/, adapted from apache/datafusion and apache/datafusion-ballista:

    • create-tarball.sh: checks that the RC tag exists and that its Cargo.toml has the release version. It creates the source tarball with git archive, runs RAT on it, signs it, writes checksums, uploads it to dist/dev/datafusion and prints the vote email.
    • verify-release-candidate.sh: checks the signature and checksums, then runs cargo fmt --check, cargo test --workspace --locked and cargo publish --dry-run in a sandbox with the pinned toolchain.
    • release-tarball.sh: moves an approved RC to dist/release/datafusion.
    • generate-changelog.py: writes dev/changelog/<version>.md from merged PRs.
    • run-rat.sh, check-rat-report.py and rat_exclude_files.txt: the Apache RAT license audit. RAT is pinned to 0.16.1 and its jar to a SHA-512.
    • README.md: the release process.

    The commit also:

    • adds a RAT job to CI. It audits a git archive of the PR, which is exactly what a release tarball contains.
    • restores LICENSE and NOTICE symlinks in crates/datafusion, so the published crate includes them again (Adapt project for new repo (make it compile + tests passing) #2 removed them).
    • adds the ASF license header to .gitignore, the only file RAT flagged.
  3. Exclude CLAUDE.md from RAT, as Comet and datafusion-python do. docs: add AGENTS.md for coding agents #34 adds it as a symlink to AGENTS.md, and RAT reads symlinks in a tarball as files without a license header.

Not included:

  • Making RAT a required status check in .asf.yaml. That can follow once the job has run here.
  • Publishing still needs iceberg to be a crates.io release rather than a git revision (see Add release infrastructure #31). Step 1 of the README and verify-release-candidate.sh both check for this.

What is the testing strategy for this PR?

These scripts only run at release time, so I exercised each one locally. svn and the dist downloads were stubbed, and signing used either a stub or a throwaway key, so nothing was uploaded.

  • create-tarball.sh: rejects an unknown tag, and a tag whose Cargo.toml version doesn't match. On the happy path the tarball passes RAT, the checksums verify, and the expected svn commands are issued.
  • verify-release-candidate.sh: ran end to end against an RC signed with a throwaway key and served from a local directory. The signature verifies after importing KEYS into an empty keyring, and the checksums verify. cargo fmt and all tests pass in the sandbox. cargo publish --dry-run then fails with "dependency iceberg does not specify a version", which is the expected result while iceberg is a git dependency.
  • release-tarball.sh: cancels on "n". On "y" it issues the expected svn commands and cleans up.
  • generate-changelog.py: generated a changelog for bf53e29..a2bc942 from the GitHub API.
  • run-rat.sh: passes on a git archive of this branch, flags a file without a header, and rejects a corrupted RAT jar.
  • Other checks: shellcheck and actionlint are clean. cargo package --list -p iceberg-datafusion includes LICENSE and NOTICE. fmt, clippy and tests pass after the rename.

Are there any user-facing changes?

The crate is renamed back to iceberg-datafusion, with import path iceberg_datafusion. Nothing was ever published as datafusion-iceberg, so no released version changes. Users upgrading from iceberg-datafusion 0.10.x keep their dependency name and imports.

crates.io treats `-` and `_` as equivalent, so `datafusion-iceberg`
collides with the existing, unrelated `datafusion_iceberg` crate.

Restore `iceberg-datafusion`, the name this crate was published under
from apache/iceberg-rust. The workspace version already continues that
version line, and existing users keep their `iceberg_datafusion::`
imports.

Part of apache#30.
Add dev/release/ scripts and documentation for producing ASF source
releases, adapted from apache/datafusion:

- create-tarball.sh, release-tarball.sh and verify-release-candidate.sh
  to create, verify and publish release candidates
- generate-changelog.py to write dev/changelog/<version>.md
- run-rat.sh, check-rat-report.py and rat_exclude_files.txt for the
  Apache RAT license audit, plus a RAT job in CI
- README.md describing the release process

Restore the LICENSE and NOTICE symlinks in crates/datafusion so the
published crate includes them. Add the ASF license header to
.gitignore, the only file RAT flagged.

Closes apache#31.
apache#34 adds CLAUDE.md as a symlink to AGENTS.md. RAT reads symlinks in a
source tarball as files without a license header, so exclude it, as
apache/datafusion-comet and apache/datafusion-python do. AGENTS.md
itself carries the header and is still checked.
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.

Add release infrastructure

1 participant