Skip to content

gitoxide

vgix-ref-v0.65.0 scope: gix-ref Bugfix

This release fixes issues for SREs watching stability and regressions.

Published 1mo Version Control
✓ No known CVEs patched
Read the diff → Tool health → What is this tool? →

✓ No known CVEs patched in this version

Topics

blazingly-fast built-with-rust cli git version-control

Summary

AI summary

Broad release touches Commit Details, Commit Statistics, Bug Fixes, and https://www.conventionalcommits.org.

Full changelog

Bug Fixes

  • tolerate NUL suffixes in symbolic ref files
    Loose symbolic ref files can contain bytes after a NUL terminator. Git treats
    those bytes as invisible when reading the referent, so a HEAD file like
    'ref: refs/heads/main\0...' still resolves to refs/heads/main.

    gitoxide read the entire line until CR/LF before validating the symbolic target,
    which made the embedded NUL fail refname validation.

    Match Git by stopping symbolic target parsing at the first NUL byte, while
    leaving direct object ref parsing unchanged.

    Git baseline: local Git checkout 7760f83b59, refs/files-backend.c
    parse_loose_ref_contents() uses C-string semantics for symbolic referents;
    'git symbolic-ref HEAD' returns refs/heads/main for a HEAD containing
    'ref: refs/heads/main\0codex-hidden-head-metadata: status-clean-demo'.

  • skip name validation in packed-refs binary search to unlock performance

  • handle loose ref path-prefix collisions
    The GitButler branch creation flow reported that
    repo.try_find_reference("refs/heads/A/new") could fail with a low-level
    NotADirectory error when refs/heads/A already exists as a loose ref. That
    lookup is asking whether the longer ref exists; the path-prefix collision
    matters to creation/update code, but find should report absence for that
    candidate.

    Git reference: refs/refs-internal.h documents ENOTDIR as the case where a
    ref prefix is not a directory, alongside ENOENT for non-existing refs. For
    lookup, both mean the requested ref candidate was not found.

Commit Statistics

  • 9 commits contributed to the release over the course of 27 calendar days.
  • 27 days passed between releases.
  • 3 commits were understood as conventional.
  • 0 issues like '(#ID)' were seen in commit messages

Commit Details

view details
  • Uncategorized
    • Merge pull request #2658 from GitoxideLabs/compliant-ref-parser (1514b0f)
    • Tolerate NUL suffixes in symbolic ref files (5d702e3)
    • Merge pull request #2604 from nikicat/skip-validation-in-binary-search (66f70f3)
    • Review (a8b885d)
    • Skip name validation in packed-refs binary search to unlock performance (c3ee599)
    • Merge pull request #2645 from GitoxideLabs/try-find-reference-path-prefix-collision (4f089fc)
    • Handle Windows ref path-prefix collisions in ref_contents (c9191ab)
    • Handle loose ref path-prefix collisions (9f432ef)
    • Merge pull request #2618 from GitoxideLabs/report (f7d4f33)

Weekly OSS security release digest.

The CVE patches and breaking changes that affected production tools this week. One email, every Sunday.

No spam, unsubscribe anytime.

Share this release

Track gitoxide

Get notified when new releases ship.

Sign up free

About gitoxide

An idiomatic, lean, fast & safe pure Rust implementation of Git

All releases →

Related context

Related tools

Earlier breaking changes

  • vgix-v0.84.0 Allow checkouts of empty repositories; `destination_must_be_empty` becomes `Option<bool>`
  • vgix-worktree-stream-v0.33.0 Changes API of `Stream::add_entry_from_path` to require `hash_kind` argument.
  • vgix-object-v0.61.0 Renames `Data::hash_kind` to `Data::object_hash` for consistency.

Beta — feedback welcome: [email protected]