Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
26 changes: 20 additions & 6 deletions RELEASING.md
Original file line number Diff line number Diff line change
Expand Up @@ -64,22 +64,36 @@ format.
`## [<version>] - <YYYY-MM-DD>` heading plus a link reference at the
bottom. The workflow greps for that date and refuses to publish without
it.
2. `make package-ota` on a clean tree.
3. Merge the PR, then tag and push:
2. **Raise the CLI's requirement to match**, in the same change:
`rpi-loader-ota`'s version in `cli/Cargo.toml`, then a `cargo check` in
`cli/` for its lockfile. This is not optional and not a follow-up — a
path dependency has to satisfy the version written beside it, so
leaving the CLI asking for the old one fails *every* job with
`failed to select a version`, not just the packaging one.
3. `make package-ota` on a clean tree.
4. Merge the PR, then tag and push:

```sh
git checkout main && git pull
git tag ota-v<version> && git push origin ota-v<version>
```
4. Approve the parked workflow.
5. Approve the parked workflow.

**The CLI depends on this package, so it has to be published first.**
`cargo package` on the CLI resolves `rpi-loader-ota` from crates.io — the
path dependency is stripped when packaging, which is the point of writing
both a `version` and a `path` — and a version that is not there yet fails
the CLI's release before it starts. That is also why CI's package job is
the first thing to go red if this package is ever bumped without being
released.
the CLI's release before it starts.

**So `package verifies` is red from step 2 until step 5, and that is the
expected state rather than a fault.** Once step 2 has raised the CLI's
requirement, every other job is green and that one job asks crates.io for
a version this release has not published yet. It cannot be made to pass
earlier: publishing is what fixes it. Since the ruleset lists it among the
required checks, merging in step 4 needs `gh pr merge --admin` — the one
place in either release where a protection is deliberately stepped over,
and the reason to do the publish immediately rather than leaving `main`
sitting in that state.

**What counts as breaking:** the Rust API as usual, and the bundle format
itself. A change to the container's bytes is breaking in a way a semver
Expand Down
2 changes: 1 addition & 1 deletion cli/Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion cli/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ serialport = { version = "4.9.0", default-features = false }
# The bundle container, shared with whatever firmware installs one. The
# whole point of it being a crate rather than a module here is that the
# packer and the parser cannot drift apart.
rpi-loader-ota = { version = "0.1.0", path = "../ota" }
rpi-loader-ota = { version = "0.2.0", path = "../ota" }
# Reading `bundle.toml`. `display` is off because nothing here writes TOML.
serde = { version = "1.0.229", features = ["derive"] }
toml = { version = "1.1.4", default-features = false, features = ["parse", "serde"] }
Expand Down
3 changes: 2 additions & 1 deletion ota/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ wire protocol; this is a library, its consumers are firmware projects in
other repositories, and tying it to that version would bump their
dependency every time a command-line flag was renamed.

## [Unreleased]
## [0.2.0] - 2026-09-02

### Added

Expand Down Expand Up @@ -87,4 +87,5 @@ First release.
same way the packer checksummed the entry, and can skip rewriting one
whose bytes have not changed.

[0.2.0]: https://github.com/joeferner/rpi-loader/releases/tag/ota-v0.2.0
[0.1.0]: https://github.com/joeferner/rpi-loader/releases/tag/ota-v0.1.0
2 changes: 1 addition & 1 deletion ota/Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion ota/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "rpi-loader-ota"
version = "0.1.0"
version = "0.2.0"
edition = "2024"
description = "Over-the-air update bundle format for bare-metal Raspberry Pi firmware — one container, packed on a host and validated on the device"
license = "MIT OR Apache-2.0"
Expand Down
Loading