github GitoxideLabs/gitoxide gix-v0.89.0
gix v0.89.0

3 hours ago

Reverted (BREAKING)

  • replace fs with gix-fs

    gix-fs already provides the filesystem helpers and recursive walkers.
    Keeping their duplicate implementation in gix-features adds unnecessary
    filesystem dependencies to the foundational feature crate.

    Remove the fs module and the walkdir and fs-read-dir features. Migrate
    workspace callers to gix_fs, move traversal requests to gix-fs/walkdir,
    and update the manifests, lockfile, traversal documentation, and feature
    check script together.

Changed (BREAKING)

  • use gix::Result throughout the public API

    The error migration left public gix methods, iterators, callbacks, and
    configuration validators returning a mixture of exceptions, I/O errors,
    custom error enums, and even the rejected input itself. Callers still had
    to adapt these separately despite the common gix::Error boundary.

    Use the crate-level Result throughout APIs defined by gix, including
    fallible configuration inputs and owned TryFrom implementations. Keep
    underlying causes, classifications, and diagnostic metadata available
    through gix::Error. Configuration adapters accept arbitrary caller errors
    without panicking or losing their causes. Object kind conversions report
    validation errors. Re-exported plumbing APIs and error types required by
    external traits retain their existing contracts.

    Adapt gitoxide-core and gix-tix callers in the same breaking change,
    removing explicit conversions that became identities.

New Features

  • remove linked worktrees safely

    Expose safe linked-worktree removal through gix, using the gix-worktree
    removal plumbing. Validate the selected worktree, inspect dirty and locked
    states, and preserve the checkout unless the requested removal policy permits
    deleting it.

    Enable removal through worktree-mutation and report progress and cleanup
    outcomes to callers. Keep branch deletion explicit, adding compare-and-swap
    branch removal for callers that have already inspected a target so concurrent
    branch changes are not lost. Cover porcelain removal behavior and conditional
    branch deletion in disposable repositories.

  • add and check out linked worktrees

    Expose Repository::add_worktree() for existing local branches and detached
    commits. Prepare the links, initialize HEAD and its reflog, check out
    the commit, and write the index, rolling back created files on failure or
    interruption.

    Inherit worktree configuration and common attributes before checkout. Enumerate
    the main and linked repositories consistently so additions and branch deletion
    protect branches checked out or reserved by bisect and rebase, while matching
    Git's default namespace behavior.

    Support worktree.useRelativePaths with its repository-format upgrade and
    extensions.relativeWorktrees validation. Compare behavior with Git for
    bare parents, separate Git directories, moved relative links, configuration
    inheritance, invalid destinations, and rollback.

    Format already-registered worktree destinations with Path::display().

Bug Fixes

  • honor section trust when merging submodule overrides

    A report describes reduced-trust repository configuration overriding
    submodule settings, including command-valued updates. Apply the repository's
    existing configurable section filter for worktree, index, and HEAD module
    sources, and retain each copied section's origin metadata.

    Keep trusted API overrides usable and restrict module enumeration to the
    original module definitions. The regressions first reproduced both the trust
    bypass and lost provenance, then covered custom filters and every source.

    Git reference: setup.c::ensure_valid_ownership, submodule-config.c, and
    builtin/submodule--helper.c at d38352cd43ab9745686d697872408bc3249a153f
    distinguish shared module definitions from trusted local overrides.

  • read the target reflog when a symbolic ref has no log

    Reflog specifications such as refs/symref@{0} failed when the symbolic
    reference had no log of its own, even though its final target had one.

    Follow symbolic references only when their own reflog is absent, retaining
    precedence of an existing log. Reuse the reference-following helper for
    chained references, cycle detection, and missing-ref errors.
    The regression compares indexed and dated queries, chained references,
    and existing-log precedence against isolated Git invocations in a
    disposable repository.

    Git reference: /Users/byron/dev/github.com/git/git,
    refs.c::repo_dwim_log() prefers a reference's own log, then its resolved
    target's log. Runtime comparisons used Git 2.54.0 (Apple Git-157).

  • resolve HEAD tracking branches through the current branch

    Repository::rev_parse_single() rejected HEAD@{upstream}, HEAD@{u},
    and HEAD@{push} because it looked for tracking configuration on HEAD
    instead of the currently checked out branch.

    Follow HEAD before looking up tracking configuration, reusing the existing
    symbolic-reference resolution helper and retaining missing-ref errors.
    The regression compares all three tracking aliases with their implicit
    forms and isolated Git invocations in a disposable repository.

    Git reference: /Users/byron/dev/github.com/git/git,
    remote.c::repo_branch_get() treats HEAD as the current branch.
    Runtime comparisons used Git 2.54.0 (Apple Git-157).

  • match equivalent Windows paths when removing worktrees
    The Windows fast-test job failed in Tix associated-branch cleanup:
    C:\Users\RUNNER~1\...\topic was reported as not registered even
    though Git had created the worktree. Git can record the long-name path,
    while callers retain a short-name or verbatim path for the same directory.
    The shared-base removal resolver only compared path components after
    symlink resolution, which does not expand Windows short names.

    After the existing component comparison fails on Windows, compare
    canonical paths when both exist. Apply this at the shared equality helper
    used for target selection and backlink validation. Keep the original
    comparison and missing-path behavior so absent or inaccessible checkouts
    can still be unregistered. Add a Windows regression that registers a
    worktree with Git and removes it via its canonical path, and document
    equivalent path selection.

  • don't apply the caller's GIT_INDEX_FILE or GIT_WORK_TREE to a new clone

  • preserve caller locations in native error adapters

    Passing a #[track_caller] constructor directly to map_err() records
    the FnOnce shim in core as the caller. Use or_error() for native
    error adapters in gix, gix-actor, and gix-config so diagnostics record
    the adapter and use the usual exception formatting, including with
    tree-error.

    Keep Error::from_boxed() inside a closure for boxed trait-object errors,
    which ResultExt does not accept. Add a regression for invalid branch
    merge references and document when constructors still require closures.

  • anchor worktree removal paths to the repository CWD

    A repository opened through a relative path retains the CWD that gives its
    paths meaning. Changing the process CWD before worktree removal made exact
    lookup and suffix disambiguation resolve registrations against the wrong
    location. Registration scans, lock checks, and reopening a selected worktree
    also depended on the process CWD.

    Resolve registered checkout paths with repo.current_dir(). Anchor proxy
    private Git directories and reopened common directories to that captured
    CWD, so enumeration, lookup by ID, locks, status, and removal keep using the
    original repository. Keep caller-supplied relative targets relative to the
    current process CWD. Document that proxy paths are now absolute.

    Extend the isolated relative-path removal test with a CWD change and lock
    checks, and cover absolute lookup, ambiguous suffix disambiguation, repository
    inspection, and main-worktree protection from both main and linked handles.
    The new CWD cases failed before the fix.

Commit Statistics

  • 30 commits contributed to the release over the course of 13 calendar days.
  • 13 days passed between releases.
  • 11 commits were understood as conventional.
  • 2 unique issues were worked on: #3039, #3040

Commit Details

view details
  • #3039
    • Resolve HEAD tracking branches through the current branch (ab83e97)
  • #3040
    • Read the target reflog when a symbolic ref has no log (5146c90)
  • Uncategorized
    • Prepare changelogs prior to release (794eeef)
    • Merge pull request #3042 from cruessler/branch-9 (c2f1925)
    • Merge pull request #3032 from GitoxideLabs/sec-audit (1d7bac7)
    • Honor section trust when merging submodule overrides (c860df3)
    • Replace fs with gix-fs (cf1ba49)
    • Merge pull request #3046 from GitoxideLabs/gix-error-optional-bstr (9272d45)
    • Merge pull request #3047 from GitoxideLabs/revparse-fixes (49885cd)
    • Merge pull request #2938 from GitoxideLabs/tix-improvements (ac6e89f)
    • Match equivalent Windows paths when removing worktrees (9289a4c)
    • Merge pull request #3033 from GitoxideLabs/gix-cli-progress-cleanup (80f4b03)
    • Merge pull request #3035 from any-victor/fix/clone-ignores-caller-repository-env (d2d078f)
    • Review (95043b9)
    • Don't apply the caller's GIT_INDEX_FILE or GIT_WORK_TREE to a new clone (90bdb18)
    • Merge pull request #3022 from GitoxideLabs/release-testtools (f819565)
    • Use existing error helpers for guards and conversions (1c25831)
    • Preserve caller locations in native error adapters (6723b31)
    • Merge pull request #3029 from cruessler/fix-minor-sha-256-issues-in-cli (6c12f2d)
    • Remove outdated note saying SHA-256 is not fully supported (20b201b)
    • Use gix::Result throughout the public API (9a5777e)
    • Merge pull request #3025 from GitoxideLabs/worktree-create (acf906f)
    • Anchor worktree removal paths to the repository CWD (fe2018f)
    • Remove linked worktrees safely (a5e4378)
    • Merge pull request #3026 from GitoxideLabs/status-fix (3f6fcda)
    • Merge pull request #3027 from cruessler/remove-sha-1-default-in-pipeline (06b0098)
    • Merge pull request #2977 from GitoxideLabs/worktree-create (d9f7c85)
    • Fixup! feat(gix): add and check out linked worktrees (ed1f6dd)
    • Add and check out linked worktrees (eec2e3a)
    • Merge pull request #3020 from GitoxideLabs/report-september (5fb3dcf)

Don't miss a new gitoxide release

NewReleases is sending notifications on new releases.