| 1 |
# Changelog |
| 2 |
|
| 3 |
## Unreleased |
| 4 |
|
| 5 |
- **A remote's bookmarks work like local ones (#48).** |
| 6 |
- `origin/NAME` names a remote's bookmark wherever a bookmark is expected, and `oxy bookmark list --all` lists those with no local bookmark. |
| 7 |
- `oxy bookmark switch NAME` makes a local bookmark from `origin/NAME` when there is none (`REMOTE/NAME` picks another remote). |
| 8 |
- `oxy pull` updates every local bookmark the remote has too, not only the current one, and names the others it moved. |
| 9 |
- `oxy clone` checks out the remote's default bookmark (servers now name it in `refs`), says how many other bookmarks the remote has, and takes `--recursive` to clone the subrepos. A clone, switch or pull says when subrepos are not at their pins. |
| 10 |
- **A newer repository format names the oxy that cannot read it (#49).** Instead of "unsupported format version 2", oxy says the data was written by a newer oxy, and gives its own version and path, which shows an older copy earlier on `PATH`. |
| 11 |
|
| 12 |
- **Sign in once per hub: `oxy auth login`, `status` and `logout` (#47).** `oxy auth login https://oxygenhub.io` signs in through the browser, and every repository on that hub then clones, fetches and pushes with the token, subrepos included. Nothing secret goes into a checkout any more. |
| 13 |
- The token is kept in `~/.config/oxy/credentials.toml`, readable by you only, or in the system keyring through a Git credential helper (`oxy config --user auth.helper libsecret`). |
| 14 |
- `--with-token` reads a token from standard input, for CI and scripts. `oxy auth logout` also revokes the token on the hub. |
| 15 |
- A token goes over `https` only (plain `http` only to this machine), never to another host after a redirect. A credentials file that others can read is ignored. |
| 16 |
- Lookup order: `remote.<name>.token`, `OXY_TOKEN`, the store, then an enclosing checkout's remote on the same hub. Clones no longer copy a token into a subrepo's configuration. |
| 17 |
- Identity secret keys are now created owner-only, rather than tightened just after being written. |
| 18 |
|
| 19 |
Measured on the Linux kernel's tree (95 943 files); `docs/benchmarks.md` has the tables. |
| 20 |
|
| 21 |
- **Faster than Git on the first commit, a clean status, fsck, gc and the pack's size.** |
| 22 |
- **First commit:** 21.9 s (Git 33.7 s). |
| 23 |
- **Clean status:** 0.17 to 0.19 s (Git 0.22 s). |
| 24 |
- **fsck:** 8.2 s (Git 12.6 s). |
| 25 |
- **gc:** 33.7 s (Git 70 s). |
| 26 |
- **The pack:** 293.5 MB (Git's 295.5 MB). |
| 27 |
- **Level with Git on a local clone (about 17 s).** Status with one file changed, diff, commit, log, blame and checkout are two to six times faster than at 0.1.0. They are still behind Git: |
| 28 |
- **Status with one file changed:** 0.41 s, against 0.22 s. |
| 29 |
- **Commit:** 0.67 s, against 0.21 s. |
| 30 |
- **Blame:** 0.16 s, against 0.07 s. |
| 31 |
- **Checkout:** 0.74 s, against 0.35 s. |
| 32 |
- **A project's `.gitignore` files count**, below `.oxyignore`. A project coming from Git no longer commits its build output, and `!` in `.oxyignore` can bring back what `.gitignore` leaves out. Ignore rules still apply to untracked paths only. |
| 33 |
- **A folder holding a repository of its own is named.** `oxy status`, `oxy commit` and `status --json` (`untracked_nested`) name a folder with its own `.git` or `.oxy`, rather than skipping it silently. They say how to track its files, keep it as a subrepo, or leave it out. |
| 34 |
- **`oxy rebase CHANGE --onto T --into-working-copy`.** Where a rebase would be conflicted, the target is merged into the current bookmark instead, and the conflict is resolved in the working copy, as after `oxy merge`. |
| 35 |
- **mimalloc is the allocator.** Most of the speed above came from it: status, walks and index loads allocate many small values from every thread. |
| 36 |
- **Internals.** Each item below is a cache and is rebuilt when it does not check: |
| 37 |
- the workspace manifest is a checksummed binary file; |
| 38 |
- the state index is decoded lazily, caught up by replaying a few changes, and kept for the last two states; |
| 39 |
- the store caches change metadata; |
| 40 |
- a pack can carry a trained zstd dictionary. |
| 41 |
|
| 42 |
## 0.1.0 (2026-09-30) |
| 43 |
|
| 44 |
- **The first builds for people to download.** |
| 45 |
- Linux x86_64 and arm64 (glibc 2.28 or later) as `.tar.gz` and `.deb`. |
| 46 |
- macOS x86_64 and arm64. |
| 47 |
- Windows x86_64. |
| 48 |
|
| 49 |
All are cross-compiled from Linux with `scripts/dist.sh`, with SHA256SUMS. A prerelease: formats may still change before 1.0. |