OXYGENHUB

oxy 0.4.4 efad40f9ac8e

Fresh clones of repositories with tags from before a key rotation,
SLSA provenance of a receipt, repositories in buckets that answer
quickly, a quicker log and clean diff, gc that leaves a packed store
alone, and the unreleased work since 0.4.3 (CHANGELOG.md).
Author
Andy McCall @andymccall <[email protected]>
via
agent Claude Code <[email protected]> · delegate for changes, until 2026-11-13 19:00Z · key ea5f78160088
When
· 2026-10-17 11:28 UTC
Signature
✔ signed by Claude Code
Hash
efad40f9ac8e37d85531f9d41f5f9b87e8eb18127b4c8a1b299cad65d4f0adbc
Depends on
34fad4a92451 750251b21a96 8d80356371c5 8fd78eb52ad2 c86270b7c670 e2a5edbf1395 ff0af1ee299d
Depended on by
f05b84d1ad2d
In bookmarks
carried-not-removed doctor-trust identical-sides keyless-tags main merge-remote-bookmark paths-for-resolutions-and-amend push-notes show-stat subrepo-pin-state
In tags
v0.10.0 v0.11.0 v0.4.4 v0.4.5 v0.4.6 v0.5.0 v0.5.1 v0.6.0 v0.7.0 v0.8.0 v0.9.0
Edits
10 atoms, 0 tree operations, 3 files

Browse the tree at this change

modified CHANGELOG.md +13 −1
1 1
# Changelog
2 2
3 -
## Unreleased
3 +
## 0.4.4 (2026-10-17)
4 4
5 +
- **A fresh clone takes tags made before a key rotation (#114).** A tag's signature was checked against the current trust policy with no regard for rotation, so every tag signed by a key since rotated away from was refused, and a fresh `oxy clone` of a repository with such a tag failed (this repository's own v0.1.0). A tag signed by a predecessor of a key the policy names is accepted when it is dated before that key's successor was made; a superseded key makes no new ones, and revoked keys never count.
6 +
7 +
- **SLSA provenance of a receipt (oxygenhub#239).** `oxy receipt export --format slsa` writes what a valid receipt says as an in-toto Statement with an SLSA provenance v1 predicate, in a DSSE envelope signed with your key, the runner's signed receipt riding along inside it. `oxy identity export --pem` writes the public key cosign and other DSSE verifiers check it with.
8 +
9 +
- **Repositories kept in a bucket answer quickly (oxygenhub#228, #234).** A forge serving a repository from GCS or S3 opened a new client for every request, read large packs by range without keeping what it read, asked the bucket for a loose copy of every packed object it read, and asked again and again about objects it lacked. Clients are now shared per bucket and credentials, ranges and sizes are kept on disk, packs are looked in first, and a key found missing is taken as missing for 30 seconds unless this process writes it. On a hosted repository in GCS, negotiate went from 7-10 s to well under a second and bucket requests from about 540 a minute to about 30. The store counts its requests by kind, for a server to show.
10 +
11 +
- **A quicker log and an instant clean diff (#94).** The workspace's state index keeps its changes newest first, and the log takes them as a list, with no map of every change and no sort. A diff whose working copy changes nothing is empty without loading the base. On VS Code at 20 000 commits, `log -n 20` went from 34 ms to 30 ms and a clean `diff` from 48 ms to 30 ms.
12 +
13 +
- **A credential helper that does not read its input works (#115).** An `erase` that exits without reading what oxy sends it failed now and then with Broken pipe; a closed pipe is no error now, as in Git.
14 +
15 +
- **gc leaves a fully packed store as it is.** gc repacks at its harder compression level, and a store that was already one such pack with nothing loose was rewritten every time, the same pack again: 37 seconds for this repository's 48 000 objects on a forge, nightly, under the repository's write lock. Such a store is now left alone.
16 +
5 17
- **A switch names what it takes off disk (#102).** `oxy bookmark switch` and `oxy checkout` printed only how many files they removed, easy to miss when a switch to a bookmark lacking 80 files took an editor's project file with them. They now name the first few removed files, with a warning when twenty or more go.
6 18
7 19
- **Binary files' current versions found without whole closures (#107).** Which replacement of a binary file is live was decided by building each replacing change's entire closure; on a history as long as VS Code's (166,000 commits) each is a hundred thousand changes, the memo could not keep them, and `oxy git verify` spent its day rebuilding them. A bounded walk that keeps nothing answers the same.
…
180 unchanged lines
modified Cargo.lock +4 −4
…
1469 unchanged lines
1470 1470
1471 1471
[[package]]
1472 1472
name = "oxy"
1473 -
version = "0.4.3"
1473 +
version = "0.4.4"
1474 1474
dependencies = [
1475 1475
 "anyhow",
1476 1476
 "clap",
…
11 unchanged lines
1488 1488
1489 1489
[[package]]
1490 1490
name = "oxy-core"
1491 -
version = "0.4.3"
1491 +
version = "0.4.4"
1492 1492
dependencies = [
1493 1493
 "blake3",
1494 1494
 "ed25519-dalek",
…
18 unchanged lines
1513 1513
1514 1514
[[package]]
1515 1515
name = "oxy-server"
1516 -
version = "0.4.3"
1516 +
version = "0.4.4"
1517 1517
dependencies = [
1518 1518
 "axum",
1519 1519
 "axum-server",
…
6 unchanged lines
1526 1526
1527 1527
[[package]]
1528 1528
name = "oxy-strata"
1529 -
version = "0.4.3"
1529 +
version = "0.4.4"
1530 1530
dependencies = [
1531 1531
 "async-trait",
1532 1532
 "bytes",
…
1419 unchanged lines
modified Cargo.toml +1 −1
…
2 unchanged lines
3 3
resolver = "2"
4 4
5 5
[workspace.package]
6 -
version = "0.4.3"
6 +
version = "0.4.4"
7 7
edition = "2021"
8 8
license = "MIT OR Apache-2.0"
9 9
…
37 unchanged lines