OXYGENHUB
# e5f8920bc8d0 oxygen / CHANGELOG.md
3.3 KiB · Markdown · last changed Sign in once per hub: oxy auth login, status and logout (closes #47) 1 month ago renderedsource blame history raw

Changelog

Unreleased

  • 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.
    • 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).
    • --with-token reads a token from standard input, for CI and scripts. oxy auth logout also revokes the token on the hub.
    • 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.
    • 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.
    • Identity secret keys are now created owner-only, rather than tightened just after being written.

Measured on the Linux kernel's tree (95 943 files); docs/benchmarks.md has the tables.

  • Faster than Git on the first commit, a clean status, fsck, gc and the pack's size.
    • First commit: 21.9 s (Git 33.7 s).
    • Clean status: 0.17 to 0.19 s (Git 0.22 s).
    • fsck: 8.2 s (Git 12.6 s).
    • gc: 33.7 s (Git 70 s).
    • The pack: 293.5 MB (Git's 295.5 MB).
  • 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:
    • Status with one file changed: 0.41 s, against 0.22 s.
    • Commit: 0.67 s, against 0.21 s.
    • Blame: 0.16 s, against 0.07 s.
    • Checkout: 0.74 s, against 0.35 s.
  • 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.
  • 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.
  • 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.
  • mimalloc is the allocator. Most of the speed above came from it: status, walks and index loads allocate many small values from every thread.
  • Internals. Each item below is a cache and is rebuilt when it does not check:
    • the workspace manifest is a checksummed binary file;
    • the state index is decoded lazily, caught up by replaying a few changes, and kept for the last two states;
    • the store caches change metadata;
    • a pack can carry a trained zstd dictionary.

0.1.0 (2026-09-30)

  • The first builds for people to download.

    • Linux x86_64 and arm64 (glibc 2.28 or later) as .tar.gz and .deb.
    • macOS x86_64 and arm64.
    • Windows x86_64.

    All are cross-compiled from Linux with scripts/dist.sh, with SHA256SUMS. A prerelease: formats may still change before 1.0.