Skip to content

chore(deps): update rust crate gix to 0.87 - #31

Open
renovate[bot] wants to merge 1 commit into
mainfrom
renovate/gix-0.x
Open

chore(deps): update rust crate gix to 0.87#31
renovate[bot] wants to merge 1 commit into
mainfrom
renovate/gix-0.x

Conversation

@renovate

@renovate renovate Bot commented Mar 29, 2026

Copy link
Copy Markdown
Contributor

ℹ️ Note

This PR body was truncated due to platform limits.

This PR contains the following updates:

Package Type Update Change
gix workspace.dependencies minor 0.800.87

Release Notes

GitoxideLabs/gitoxide (gix)

v0.87.0: gix v0.87.0

Compare Source

Bug Fixes (BREAKING)
  • remove need-more-recent-msrv as it's not required anymore
    It was mostly meant to be internal, but the name didn't indicate
    this, hence the breaking change.
Test
  • assert fetched pack contents rather than pack checksums
    fetch_pack and fetch_pack_without_local_destination asserted the
    data_hash/index_hash of a pack produced by the host git. Those cover
    the pack's compressed bytes, so they silently encode which zlib
    implementation that git is linked against: with a zlib-ng-linked git
    (Arch, among others) the 219-byte commit in that pack deflates to 152 bytes
    where stock zlib produces 153, making the pack 268 bytes instead of 269 and
    changing both checksums.

    Nothing about the fetch itself differs — re-deflating the very same object
    payloads with stock zlib and re-hashing reproduces the expected checksum
    byte for byte, and every other assertion in both tests already passes.

    Assert the pack's object ids instead, read back from the index that was just
    written. They hash uncompressed content, so they are identical on every host,
    and they are what the checksums were standing in for. num_objects,
    pack_version and index_version are untouched; Entry::crc32 is
    deliberately not used, as it too is computed over compressed bytes.

New Features (BREAKING)
  • add Git-compatible commit signature verification with Commit::verify()
    Breaking because it also adds config::tree::Key::default_value(), which gives Any
    a default_value field.

    Expose repository-aware verification on commits while delegating verifier
    execution and result parsing to gix-object plumbing. Resolve supported
    signature formats, configured programs, trust thresholds, SSH allowed
    signers and revocations, repository-relative paths, and commit verification
    time according to Git configuration.

  • add commit::Info::generation
    That way it's evident if a commit-graph was present for this node.
    Breaking, as it adds a new public field to a structure.

Changed (BREAKING)
  • remove the tree-editor feature toggle

    The workspace MSRV now exceeds Rust 1.75, which stabilized the language feature
    that originally required tree editing to be gated.

    Make tree-editing APIs available unconditionally.

New Features
  • expose git notes in gix::Repository

    Add the notes feature and Repository::notes as the porcelain layer over gix-note
    for repeated queries and mutations.

    Select the default notes ref from core.notesRef, including the GIT_NOTES_REF
    environment override represented in config::tree, and fall back to
    refs/notes/commits. Discover additional display refs from notes.displayRef or
    GIT_NOTES_DISPLAY_REF, expand glob patterns, preserve display order, and avoid
    duplicates.

    For mutations, accept conventional short notes-ref names, write note blobs and
    notes commits, and update refs with compare-and-swap expectations so concurrent
    changes are not silently overwritten.

  • add Repository::delete_local_branches().
    asdf

    Validate the entire batch before changing references, reject branches checked
    out in any worktree, and delete references and reflogs in one transaction
    without requiring commit traversal.

    Remove matching local branch configuration under lock and report when
    configuration cleanup fails after reference deletion. Share checked-out branch
    discovery with fetch updates and use restricted repository opening throughout
    the affected tests.

  • add Git-compatible commit signing via Commit::sign()

    Expose repository-aware commit signing while delegating signature creation
    to gix-object plumbing. Resolve gpg.format, per-format programs, signing
    keys, committer identity fallback, and gpg.ssh.defaultKeyCommand from Git
    configuration, including trusted paths and shell commands.

    Add commit_signing_options_if_enabled() so porcelain callers honor
    commit.gpgSign without resolving signer configuration while signing is
    disabled. Preserve caller control over resolved program arguments and
    environment, including non-interactive GPG operation.

  • add commit signature verification to gix-object via commit::SignedData::verify()

    Add feature-gated plumbing for verifying OpenPGP, X.509, and SSH commit
    signatures with fully resolved programs, arguments, environments, trust
    thresholds, and SSH policy inputs. Keep repository configuration out of
    the object crate while exposing Git-compatible status, identity, key, and
    fingerprint results.

    Stream signed commit data directly to OpenPGP and SSH verifiers without
    reconstructing it. Use a temporary payload only where gpgsm requires a
    file, and cover Git status parsing plus unsupported and mismatched formats.

  • expose Git quoting utilities in gix

  • expose Git-compatible editor selection

    Add `Repository::editor()`` to resolve the interactive editor with Git's
    precedence rules. Honor GIT_EDITOR ahead of trusted core.editor, consider VISUAL
    only for capable terminals, fall back through EDITOR to vi, and report no editor
    for an unconfigured dumb terminal.

    Route GIT_EDITOR through the configuration environment-override framework
    so isolated repositories and environment permissions remain effective. Cover
    precedence, dumb terminals, the no-op editor, and isolation.

  • recognize SHA-256 commit signature headers

    Teach commit parsing and signature extraction about the gpgsig-sha256
    header used by Git when signing SHA-256 commits. Treat it like gpgsig
    when locating the embedded signature while preserving the actual header
    name when reconstructing the signed payload.

    Cover both full commit parsing and token iteration so callers observe
    the signature consistently through either API.

  • add support for GIT_ALLOW_PROTOCOL

  • honor GIT_INDEX_FILE when opening repositories via discover_with_environment_overrides()

    Map GIT_INDEX_FILE to the new gitoxide.core.indexFile configuration key
    and use it for index reads and writes, allowing to implement hooks for the first time.

    As a fix, Repository-local environment overrides are no longer inherited when opening
    submodules, linked worktrees, or their main repository. This prevents an
    alternate index, worktree, or Git directory from leaking into another
    repository.

    The selected index path remains stable until the repository is reloaded, and
    empty index-file overrides are rejected.

  • support cloning a single revision

    A full object ID passed through with_ref_name() produced an object-ID refspec
    mapping and panicked while clone assumed every mapping had a name. Branch and
    tag checkout also retained ordinary clone tracking semantics instead of offering
    a single-revision mode.

    Add PrepareFetch::with_revision() and gix clone --revision for full refs, HEAD,
    and full object IDs. Revision clones use a one source-only implicit refspec,
    detach HEAD to the fetched commit, create no ordinary refs, persist no fetch
    refspec, and disable tag following. Existing with_ref_name() and --ref behavior
    stays unchanged.

    This follows Git commit 3378556 (builtin/clone: teach git-clone(1) the
    --revision= option) and its t/t5621-clone-revision.sh behavior.

  • add config() function

    Factor the non-repository portion of configuration initialization out of
    repository opening and expose it as gix::config(). The new API accepts a future
    git directory and the same open::Options used by open and clone, preserving
    source permissions, conditional includes, environment handling, and override
    precedence.

Chore
  • Stabilize fixtures on Windows
    • Normalize the precomputed diff fixture assets to LF before writing blobs,
      populating the index, and creating commits. Git for Windows may check these
      assets out with CRLF, which changes their object IDs and adds carriage returns
      to index paths, causing fixture setup to fail at git mv cli c.

    • Prevent Git Bash from rewriting revision arguments before Git sees them, and
      normalize the two pathspec baseline cases where Git for Windows applies native
      path validation to repository-format paths. Exclude a glob baseline whose
      backslash behavior is specific to Git for Windows rather than Git paths.

    • Generate pathological .gitmodules entries as configuration data instead
      of trying to create module directories whose names cannot be represented
      on Windows. Use Git Bash bundled Perl for binary fixture construction so
      regeneration does not depend on a separately installed Python interpreter.

    • Also pass a literal carriage return to sed through Bash ANSI-C quoting when
      normalizing the jj diff assets. Unlike GNU sed, BSD sed does not interpret
      backslash-r in a single-quoted expression, so the previous spelling could remove
      a trailing letter r on macOS instead of stripping CRLF endings.

Bug Fixes
  • don't limit is_dirty() to the current working directory

  • resolve the empty pattern in <rev>^{/} like Git, instead of skipping it.
    The parser dropped the find() delegate call whenever the pattern in
    <rev>^{/<pattern>} was empty, turning the whole navigation step into a
    no-op on the grounds that an empty pattern matches everything.

    That reasoning only holds for a commit anchor and a non-negated pattern.
    Git routes <rev>^{/...} through GET_OID_COMMITTISH and searches from
    the peeled commit even when the pattern is empty - object-name.c notes
    "$commit^{/}. Some regex implementation may reject empty regex, but this
    is safe". Thus git rev-parse 'b-tag^{/}' yields the commit the
    annotated tag points at, while gix returned the tag object itself. A
    negated empty pattern matches no commit at all, so Git fails HEAD^{/!-}
    while gix silently succeeded with HEAD.

    Now the parser always forwards the pattern to Navigate::find(), whose
    implementation in gix already handles the empty case correctly on both
    the revparse-regex and the substring fallback paths: it peels the
    anchor to a commit first and treats an empty pattern as match-all, which
    fails naturally when negated. The delegate behind gix revision explain
    makes no assumption about patterns and needs no change.

    The make_rev_spec_parse_repos fixture gains baselines for @^{/},
    @^{/!-} and b-tag^{/}; its archive needs regeneration.

  • correctly handdle GIT_PROTOCOL_FROM_USER when evaluating protocol permissions

    Align helper protocol permissions with Git by applying policy by transport
    name, using the known-safe, ext, and user defaults, and parsing
    GIT_PROTOCOL_FROM_USER as a Git boolean.

  • peel annotated tags before navigating a rev-spec, like in Git.
    <tag>^, <tag>^<n>, <tag>~<n> and <tag>^{/<text>} navigated from the tag
    object itself rather than from the commit it points at. In a repository whose
    annotated b-tag names the merge commit b, Git resolves b-tag^ to d,
    while gix reported "Object 212d0f0 was a tag, but needed it to be a commit",
    and b-tag^{/G} failed with a kind mismatch instead of resolving to g.

    Git routes these forms through GET_OID_COMMITTISH, which dereferences tags
    first. The three navigation sites now peel to a commit the way ^{commit}
    already did, keeping the original object id as the replacement key. Peeling is
    the identity on a commit, so commit anchors resolve and fail exactly as before.
    A blob or tree anchor now reports that it could not be peeled to a commit.

    <tag>~0 still yields the tag. The parser in gix-revision skips the delegate
    call entirely for a zero-length ancestor walk, which is correct for a commit
    anchor and is pinned by a test there; changing it touches the public Navigate
    contract and belongs in its own change.

  • reject ./.. revspec paths that leave the worktree, like in Git.
    At the worktree root, HEAD:./../this resolved to the blob at this while
    HEAD:../this correctly failed. Git rejects both:

    $ git rev-parse 'HEAD:./../this'
    fatal: './../this' is outside repository at '/…/make_basic_repo'
    

    Containment is delegated to Repository::normalize_path(), which normalizes
    against an empty current_dir so that a .. with nothing left to consume
    fails. In gix_path's normalize_inner() a leading . stays in the buffer,
    so .. pushes the empty current_dir onto it, pop() removes the . and
    succeeds — where the same path without the leading . pops an empty buffer,
    gets false, and correctly yields None. Only the worktree root is affected;
    from some/very, HEAD:./../../this already resolved and
    HEAD:./../../../this already failed.

    Dropping the current-directory components before normalizing keeps the fix
    inside the revspec parser.

    The alternative is normalize_inner() itself, which is a two-line change and
    would make the documented promise of Repository::normalize_path() — "Paths
    which traverse outside of the repository are rejected" — true for every
    caller. I left it alone because it also changes callers unrelated to this
    work: gix_submodule::File::path() would start rejecting a .gitmodules
    path = ./../evil that it accepts today, and gix_pathspec::Pattern::normalize()
    would start rejecting ./../x. Both look like improvements, but they belong
    in a change against gix-path, not in this one.

  • resolve ./ and ../ revspec paths against the current directory, like in Git.
    gitrevisions(7) states that a path starting with ./ or ../ is relative to the
    current working directory and gets converted to be relative to the working tree's root
    directory. gix passed these paths on verbatim, so in a repository with dir/g1.txt
    committed, and with the current directory being dir/, git 2.50.1 and gix disagreed:

    revspec git gix
    HEAD:./g1.txt the blob Could not find path "./g1.txt" in tree
    HEAD:../f1.txt the blob at the root Could not find path "../f1.txt" in tree
    :./g1.txt the blob Path "./g1.txt" did not exist in index at stage 0
    HEAD:./ the tree of dir delegate.peel_until(Path("./")) failed

    gix-revision's parser forwards such paths intact on purpose, and the Navigate
    delegate documentation promises the conversion, but the gix implementation of it
    never performed one.

    The tree lookup in peel_until() and index_lookup() now route paths with either
    prefix through Repository::normalize_path(). Like Git, this requires the current
    directory to be inside a worktree, and paths traversing above the worktree stay
    rejected.

  • respect filter driver configuration precedence
    A filter driver declared in user configuration incorrectly won over a
    repository-local declaration with the same name. A regression test demonstrates
    both the local property override and inheritance of a user-level property that
    is not overridden.

    Merge repeated named filter sections in configuration order and replace
    only the properties present in each later section. This matches Git's
    read_convert_config() behavior in convert.c as inspected at cf5497b.

  • respect inherited core.symlinks when cloning.

    Load global configuration with the clone open options before repository
    initialization, and preserve an effective core.symlinks=false as a
    high-precedence override. Combine that result with probed filesystem
    capabilities so either source can disable symlinks.

    Match Git initialization by persisting core.symlinks=false only when the
    filesystem probe fails; never write a local true that masks inherited
    configuration. Add a portable plumbing-built symlink fixture and cover both
    configuration-false/probe-true and configuration-true/probe-false clones.

  • let GIT_WORK_TREE override core.bare

Commit Statistics
  • 79 commits contributed to the release over the course of 30 calendar days.
  • 30 days passed between releases.
  • 26 commits were understood as conventional.
  • 2 unique issues were worked on: #​1353, #​1930
Commit Details
view details
  • #​1353
    • Respect inherited core.symlinks when cloning. (ed9a650)
  • #​1930
    • Support cloning a single revision (b1174b6)
  • Uncategorized
    • Update manifests prior to release (ebe9095)
    • Merge pull request #​2930 from GitoxideLabs/gix-notes (7424676)
    • Expose git notes in gix::Repository (d934f5b)
    • Merge pull request #​2926 from cruessler/remove-object-hash-from-options (b2d919a)
    • Merge pull request #​2924 from abemedia/fix--don't-limit-is_dirty()-to-the-current-working-directory (ea9a6d4)
    • Review (44ba4b4)
    • Don't limit is_dirty() to the current working directory (cb74ef6)
    • Merge pull request #​2905 from GitoxideLabs/various-improvements (f3bbfad)
    • Add Repository::delete_local_branches(). (61c5e1e)
    • Adapt to changes in gix-object (object signing) (723d3de)
    • Add Git-compatible commit signing via Commit::sign() (8017175)
    • Add Git-compatible commit signature verification with Commit::verify() (15809f9)
    • Add commit signature verification to gix-object via commit::SignedData::verify() (5b90699)
    • Expose Git quoting utilities in gix (a9f090e)
    • Expose Git-compatible editor selection (e1c56e4)
    • Recognize SHA-256 commit signature headers (a30f442)
    • Adapt to changes in gix-testtools (0cbe539)
    • Merge pull request #​2919 from cruessler/require-object-hash-in-file-store-at (e5452ba)
    • Adapt to changes in gix-ref (5810922)
    • Merge pull request #​2916 from cruessler/require-object-hash-in-store-at (dd8c759)
    • Adapt to changes in gix-odb (1dc741f)
    • Adapt to changes in gix-odb (a0b93a3)
    • Merge pull request #​2911 from codeAnqiang-ma/fix/empty-regex-revspec (05f905e)
    • Merge pull request #​2910 from codeAnqiang-ma/fix/relative-date-month-rollover (566fea1)
    • Review (a8b1be5)
    • Resolve the empty pattern in <rev>^{/} like Git, instead of skipping it. (6746715)
    • Adapt to changes in gix-date (613ff86)
    • Merge pull request #​2899 from ameyypawar/url-remote-helper (dbd162d)
    • Add support for GIT_ALLOW_PROTOCOL (287ab8f)
    • Correctly handdle GIT_PROTOCOL_FROM_USER when evaluating protocol permissions (77b5848)
    • Adapt to changes in gix-url (2648dc1)
    • Adapt to changes in gix-url (62e140d)
    • Merge pull request #​2895 from abemedia/feat--honor-GIT_INDEX_FILE-via-gitoxide.core.indexFile (aa3b006)
    • Remove the tree-editor feature toggle (3a4350c)
    • Remove need-more-recent-msrv as it's not required anymore (f1c8911)
    • Honor GIT_INDEX_FILE when opening repositories via discover_with_environment_overrides() (f9b3891)
    • Honor GIT_INDEX_FILE via gitoxide.core.indexFile (e1856d0)
    • Merge pull request #​2894 from ameyypawar/refspec-push-source (ef41caa)
    • Adapt to changes in gix-refspec. (9fa50a5)
    • Merge pull request #​2719 from cruessler/blame-untracked-changes (95e0213)
    • Adapt to changes in gix-blame (93d4019)
    • Merge pull request #​2824 from GitoxideLabs/fetch-revision (7a34c17)
    • Merge pull request #​2875 from cruessler/dont-use-feature-gated-method-in-doctest (0760b60)
    • Don't use feature-gated method in doctests without feature-gate (368438c)
    • Merge pull request #​2871 from shuvamk/fix/revspec-peel-tag-before-traversal (d14aefb)
    • Review (e99f637)
    • Peel annotated tags before navigating a rev-spec, like in Git. (232dd1c)
    • Merge pull request #​2870 from shuvamk/fix/revspec-relative-paths (5510bce)
    • Review (dffd5ef)
    • Reject ./.. revspec paths that leave the worktree, like in Git. (92e3133)
    • Resolve ./ and ../ revspec paths against the current directory, like in Git. (6171a05)
    • Merge pull request #​2867 from GitoxideLabs/fix-url-authority-parsing (cc3ee80)
    • Release gix-path v0.12.4, gix-command v0.9.2, gix-config-value v0.19.1, gix-url v0.37.1, gix-credentials v0.39.1, gix-transport v0.58.1 (ab4fcb0)
    • Merge pull request #​2861 from GitoxideLabs/git-filter-config (a7e0a2e)
    • Respect filter driver configuration precedence (4f480b9)
    • Merge pull request #​2855 from EliahKagan/claude/run-ci/detect-uncommitted-fixture-archives (5708de4)
    • Commit the make_clone_with_symlink fixture archive (18e42fa)
    • Merge pull request #​2852 from GitoxideLabs/delta-tree-parallelism (4a6cf9d)
    • Make sure gix-pack uses the parallel feature (79e3478)
    • Merge pull request #​2848 from EliahKagan/claude/run-ci/which (b049777)
    • Quote the shallow clone's file:// URL in the same fixture (3dabe4a)
    • Quote the git path and the URL in the credential-helper baseline (951f40f)
    • Use command -v rather than which to locate git in a fixture (51afc13)
    • Merge pull request #​2846 from GitoxideLabs/open-options-on-clone (50713b0)
    • Add config() function (9923d76)
    • Merge pull request #​2841 from danielcadev/codex/fix-bare-git-work-tree-override (da71d06)
    • Refactor worktree and bare repo handling as it got quite messy (f03905e)
    • Review (275c26a)
    • Let GIT_WORK_TREE override core.bare (639535e)
    • Merge pull request #​2837 from nikicat/fix-pack-checksum-assertions (93ad8f9)
    • Review (03ef906)
    • Assert fetched pack contents rather than pack checksums (29aa7cd)
    • Merge pull request #​2839 from GitoxideLabs/tix-improvements (4b3bf5a)
    • Add commit::Info::generation (e768682)
    • Merge pull request #​2830 from GitoxideLabs/fix-jj-test-on-windows (82711e1)
    • Stabilize fixtures on Windows (75444cb)
    • Merge pull request #​2812 from GitoxideLabs/report-july (ae8845a)

v0.86.0: gix v0.86.0

Compare Source

New Features (BREAKING)
  • use dir-cache for accelerated status calls on Windows
Changed (BREAKING)
  • replace maybe-async with bisync.
    Replace the globally feature-selected maybe-async dependency with bisync 0.3 and
    re-export the locally selected macro mode from gix-protocol.

    Also use it to deduplicate portions which previously couldn't be handled.

  • adapt to lifetime-free configuration files in gix-config
    Update repository configuration storage, snapshots, overrides, and caches
    to use the self-contained gix_config::File representation. Configuration
    can now move through repository initialization, cloning, and remote setup
    without artificial input lifetimes or conversions to 'static.

    • Return owned BString, PathBuf, OsString, and FullName values
      from configuration-derived lookups.
    • Simplify fallible optional access from Option<Result<T, E>> to
      Result<Option<T>, E>, allowing errors to propagate naturally with
      ?.
    • Accept common string and byte-string inputs through AsBStr in
      configuration setters, converters, remote lookup, and remote saving.
    • Remove widespread Cow construction, into_owned(), and redundant
      cloning from configuration consumers.
    • Preserve configuration-key context when converting owned values and
      enriching validation errors.

    Adapt config-tree conversions for the new owned values and optional-result
    shape, including booleans, integers, paths, URLs, refspecs, timeouts,
    compression levels, and reference names.

    Return owned remote names, default remote names, branch tracking
    references, and submodule paths so these results are independent of the
    repository configuration borrow. Protocol feature values likewise use
    owned strings.

    Update repository opening, initialization, cloning, remotes, filters,
    status, submodules, and related tests to use the lifetime-free APIs.

Other
  • update dirwalk::basics for collapsed empty-directory trees
    some/ (a tree of only empty directories) now collapses to an empty
    directory and is skipped when empty directories aren't emitted, matching
    Git which treats a tree with no files as clean. See #​2490.
New Features
  • add tix to the gix CLI
  • add Repository::normalize_path()
    This way, one won't have to use the Pattern + normalize workaround anymore.
  • add discover_opts() as sibling to open_opts().This makes isolated discovery easier, at the cost of less control compared to itsgix::ThreadSafeRepository` counterpart.
  • respect configured zlib compression levels
    Understand and validate core.compression, core.looseCompression and pack.compression, including git's -1 mapping to the zlib default. Apply these settings when writing loose objects and receiving packs.
  • introduce lazy, thread-local evaluation of core.fscache on Windows
  • add Connection::configured_credentials_for_current_url().
    It extracts the URL from the input action, which is relevant in case
    of redirects which changes the initial url.
Chore
  • let archived fixtures bypass Git version gates

    Git-dependent fixture tests currently skip outright when the installed Git is
    incompatible, even when a checked-in archive contains a known-good fixture that
    could run safely. This also keeps 32-bit CI pinned to Debian 12 because Debian
    13 ships affected Git 2.47.x.

    Use the guarded scripted-fixture loaders for minimum-version worktree tests and
    the shared rev-spec fixture, then return 32-bit CI to Debian stable.

    Git 57fb139 introduced reversed :/ traversal in 2.47.x; Git 0ff919e
    restored youngest-first ordering in 2.48.0.

Bug Fixes
  • avoid treating symbolic remote names as URLs
    --- agent

    Configured remotes without an effective fetch URL exposed their symbolic name
    as a local-path URL.

    Only use a remote name as the missing fetch URL when remote-name classification,
    a non-file transport, or native absolute-path detection identifies it as a URL.

    Git baseline: remote.c:remotes_remote_get_1() adds the explicitly supplied name
    as a URL when the remote has no configured URL; t/t5505-remote.sh covers remote
    get-url behavior. This change intentionally diverges for symbolic names.

  • always treat submodule names as relative.
    Previously it would assume they are relative, join them with
    a base path, which could promptly be overridden by an absolute
    submodule name, which is valid for Git as well.

    Code handling submodule paths is now aware and won't accidentally
    break out of the repository anymore.

  • honor credential.protectProtocol for helper exchanges

  • preserve multiple remote URLs
    Configured remotes can have multiple remote..url or remote..pushUrl
    values, but gix::Remote kept only one value because lookup used the singular
    config accessor. That meant the most recent config value won, while Git exposes
    every effective URL and uses the first one for the singular get-url form.

    Add ordered URL storage to gix::Remote and expose Remote::urls(Direction) for
    all effective URLs. Keep Remote::url(Direction) as the singular compatibility
    API, now returning the first effective URL. Fetch URLs used as push fallbacks
    try pushInsteadOf first and then insteadOf, matching Git behavior.

    The regression fixture records Git 2.50.1 behavior with git remote get-url:
    without --all it prints the first configured URL, and with --all it prints all
    configured URLs in order for both fetch and push.

  • keep core.worktree-derived worktree paths in the caller's path namespace
    Since b1c1cce, relative core.worktree values from repository-owned
    configuration were resolved against the symlink-resolved git dir whenever
    that differed from the logical git dir. That is correct when the .git
    directory itself is reached through a symlink (#​2052), but it also fired
    when merely an ancestor directory is a symlink - like /var on macOS,
    where TMPDIR defaults to a path inside the symlinked /var/folders.

    In that case a submodule repository opened through the symlinked path
    would return a canonicalized workdir() while Repository::path() and
    all paths the caller holds remain in the symlinked namespace, breaking
    prefix-based path logic such as
    repo.workdir().strip_prefix(parent_worktree_dir).

    Now the symlink-resolved base is only used when resolving the relative
    worktree path against the logical and the resolved git dir leads to
    different directories on disk. If both denote the same directory, the
    logical path is kept, so all paths of the opened repository remain
    consistent with the path it was opened with.

  • consume open_path_as_is after resolving repository paths

  • Repository::kind() detects linked worktrees of bare repos

  • pass through the allocation limit
    This is particularly important in untrusted repositories, which
    get a reduced allocation limit.

  • gix::open() now handles repo.git directories correctly.
    Previously they were incorrectly assumed to be the actual .git repository
    and treated as such.

  • resolve relative core.worktree from real git dir

Chore (BREAKING)
  • adapt to changes in gix-config
    Marked as breaking explicitly to as we know paramter types were
    changed to use convenience traits.
Commit Statistics
Commit Details
view details
  • #​1622
    • Let archived fixtures bypass Git version gates (1568b31)
  • #​2024
    • Respect configured zlib compression levels (319cec2)
  • #​2052
    • Resolve relative core.worktree from real git dir (b1c1cce)
  • #​2696
    • Preserve multiple remote URLs (5f244b3)
  • Uncategorized
    • Update changelogs prior to release (cb6ec7d)
    • Release gix-trace v0.1.21, gix-validate v0.11.3, gix-path v0.12.3, gix-utils v0.3.5, gix-config-value v0.19.0, gix-prompt v0.16.0, gix-sec v0.14.2, gix-url v0.37.0, gix-credentials v0.39.0, safety bump 18 crates (f0ec710)
    • Merge pull request #​2809 from GitoxideLabs/gix-tix-mvp (443b401)
    • Add tix to the gix CLI (31a94aa)
    • Merge pull request #​2737 from GitoxideLabs/encoding-fallback-pony (2315ede)
    • Adapt to changes in gix-filter (552402f)
    • Merge pull request #​2735 from GitoxideLabs/better-exclude-handling (02cb162)
    • Add Repository::normalize_path() (6fe97a9)
    • Add discover_opts() as sibling to open_opts().` (2f4c488)
    • Merge pull request #​2734 from GitoxideLabs/url-parse-convenience (e7af50e)
    • Adapt to changes in gix-url (271454b)
    • Merge pull request #​2732 from GitoxideLabs/testools-use-archive (a3e9a77)
    • Merge pull request #​2729 from GitoxideLabs/improvements (9949e9f)
    • Avoid treating symbolic remote names as URLs (4d47453)
    • Merge pull request #​2728 from GitoxideLabs/try-bisync (adf4b7a)
    • Replace maybe-async with bisync. (c3f2244)
    • Merge pull request #​2725 from GitoxideLabs/gix-config-improvements (5982dfe)
    • Adapt to changes in gix-config (6aa934a)
    • Merge pull request #​2721 from GitoxideLabs/remove-kstring (e70732a)
    • Adapt to changes in gix-attributes (e11d7a2)
    • Merge pull request #​2722 from GitoxideLabs/reasons (c16b5a1)
    • Replace lint allowances with expectations (43ff87a)
    • Merge pull request #​2667 from GitoxideLabs/lifetime-free-config-parser (55b5158)
    • Adapt to lifetime-free configuration files in gix-config (582d7b5)
    • Merge pull request #​2718 from GitoxideLabs/submodule-name-reject-absolute (402babd)
    • Always treat submodule names as relative. (53515b6)
    • Merge pull request #​2715 from GitoxideLabs/fixup-credentials (299d16b)
    • Adapt the credential command to explicit context options in gix-credentials (f88cf10)
    • Merge pull request #​2714 from GitoxideLabs/fix-credentials-parsing (cf3053a)
    • Honor credential.protectProtocol for helper exchanges (d89bda0)
    • Release gix-path v0.12.2, gix-error v0.2.5, gix-utils v0.3.4, gix-date v0.15.6, gix-url v0.36.2, gix-credentials v0.38.2 (27aec47)
    • Merge pull request #​2698 from GitoxideLabs/multi-remote-url (7056d62)
    • Add missing SHA256 archive (432e2b1)
    • Merge pull request #​2695 from ameyypawar/fix/2024-compression-level (6e1c4a2)
    • Review (f1ac335)
    • Merge pull request #​2697 from mtsgrd/fix/keep-worktree-path-namespace (6e5a5de)
    • Review (1cda1d1)
    • Keep core.worktree-derived worktree paths in the caller's path namespace (24293fc)
    • Merge pull request #​2710 from GitoxideLabs/fix-reload (d5cd537)
    • Merge pull request #​2699 from jason5122/fix-kind-worktree-of-natively-bare-repo (1ff51ca)
    • Consume open_path_as_is after resolving repository paths (8f8d6ab)
    • Review (b36ca4c)
    • Repository::kind() detects linked worktrees of bare repos (54a3c2a)
    • Merge pull request #​2707 from ameyypawar/fix/2703-inflate-error (6d95da6)
    • Adapt to changes in gix-features, use gix-zlib accordingly. (9c2977a)
    • Merge pull request #​2702 from ameyypawar/fix/2694-exn-source-chain (e9c973d)
    • Thanks clippy (d533f0c)
    • Review (dc1fdc3)
    • Merge pull request #​2691 from GitoxideLabs/gix-pack-missing-cap (0052e42)
    • Pass through the allocation limit (0a5c62a)
    • Merge pull request #​2547 from special-bread/windows-status-performance (3e43c42)
    • Apply changed by special-bread (54b5393)
    • Merge pull request #​2687 from ameyypawar/fix/1832-rename-tracker-order-independent (a82b492)
    • Review (32cb1ad)
    • Introduce lazy, thread-local evaluation of core.fscache on Windows (158f899)
    • Review (f2dfdd8)
    • Use dir-cache for accelerated status calls on Windows (7de7a30)
    • Merge pull request #​2686 from GitoxideLabs/try-redirect-re-auth (d8aeaac)
    • Add Connection::configured_credentials_for_current_url(). (a5d4616)
    • Adapt to changes in gix-transport (6a7a717)
    • Merge pull request #​2682 from GitoxideLabs/improvements (f77cb0a)
    • gix::open() now handles repo.git directories correctly. (9fe1050)
    • Merge pull request #​2673 from ameyypawar/fix/2490-empty-dir-collapse (c31dac2)
    • Review (596ab93)
    • Update dirwalk::basics for collapsed empty-directory trees (7e17fcf)
    • Merge pull request #​2671 from GitoxideLabs/fix-worktree-path-resolution (a7625fa)
    • Address auto-review (1e3da34)
    • Merge pull request #​2646 from GitoxideLabs/report (1b1541e)

v0.85.0: gix v0.85.0

Compare Source

Bug Fixes (BREAKING)
  • avoid duplicate network connection when adopting a remote-controlled hash kind.
    Connections can now be created from detached remotes, internally,
    which makes them independent of the underlying repository.

    This is breaking as it comes with a cleanup of Connection lifetimes,
    which will break anyone who stores them in a struct. So hopefully
    nobody is affected.

  • bound the clone object-hash adoption retry
    The clone fetch loop adopts the remote's object format and retries when
    it differs from the freshly initialized local repository. Adoption makes
    the next iteration's hashes match, but if the reopened repository somehow
    still disagrees the loop would re-handshake forever. Track whether we
    already retried and fail with IncompatibleObjectHash on a second mismatch
    instead. The error variant is introduced here, as this is its only user.

    Also silence clippy::never_loop on default (sha1) features, where the
    sha256-gated continue is absent and the loop always returns first pass.

New Features (BREAKING)
  • add leaf-only tree-editor removal via Editor::remove_leaf()
    Motivation comes from gitbutlerapp/gitbutler#14312,
    where callers had to split tree-entry deletions from additions to avoid
    accidentally deleting a newly-added subtree after adding A/one and then deleting
    A.

    Add Editor::remove_leaf() to gix-object and expose it through gix object tree
    editors and cursors. The new API keeps remove() behavior unchanged, remains
    tolerant of absent paths, but returns an error when the target entry exists and
    is a tree.

Bug Fixes
  • adopt the remote's object format when cloning
    A clone into a freshly initialized repository hit an unimplemented!
    panic when the remote used sha256, since the local repository defaults
    to sha1.

    Reconfigure the still-empty local repository to the remote's object
    format and retry the fetch, matching git's behavior of inheriting
    the remote's hash on clone.

    Without the sha256 feature gix_hash::Kind has a single variant, so the
    local and remote hashes can never differ; the mismatch check is compiled
    out entirely in that case.

  • write fetched remote symrefs as direct refs
    Previously gix had made-up behaviour to 'improve' on standard Git,
    but it's clear this isn't backed up or tested well enough to be worth
    the risk of introducing subtle or not so subtle bugs.

  • resolve remote HEAD fetches against remote refs
    Fetching a local transport remote with a refspec like +HEAD:refs/test/repo could
    write a symbolic local ref to the client repository's refs/heads/main when the
    remote HEAD was symbolic and the client happened to have a same-named branch.
    That made the fetched destination resolve to the local branch instead of the
    remote HEAD object.

    Add a fetch regression that creates distinct local and remote
    repositories with matching HEAD target names but different commits, then fetches
    +HEAD:refs/test/repo and asserts the destination is the remote object as a
    direct ref.

    Match Git behavior observed with the local Git checkout: git fetch
    +HEAD:refs/test/repo creates refs/test/repo as the remote HEAD object, and Git's
    remote.c resolves symrefs against the advertised remote ref list.

    Fix the unmapped remote-symbolic-ref fallback to peel born remote symrefs to
    their advertised object id instead of consulting local refs. Mapped symrefs
    still rewrite to their corresponding local tracking ref, and unborn remote refs
    remain symbolic.

  • set trust for GIT_DIR environment discovery
    A Helix user reported that opening a repository with GIT_DIR set could panic in
    gix while discovering a repository through environment overrides. The reported
    reproductions used GIT_DIR=.git with Helix or git --git-dir=.git invoking an
    editor, and the panic came from open_from_paths() expecting git-dir trust to
    have already been determined.

    The GIT_DIR override path in open_with_environment_overrides() already
    determines ownership trust for the effective git directory and selects options
    from the trust mapping, but it did not store that trust in the Options passed to
    open_from_paths(). Store the determined trust there, matching discover_opts(),
    so configuration loading receives an explicit trust value instead of reaching
    the internal expect().

    Git baseline: git --git-dir=<repo/.git> --work-tree=<repo> status --short exits successfully.

  • reject implicit sha1 repos in sha256-only builds
    A missing extensions.objectFormat means legacy Sha1.

    In sha256-only builds, Kind::default() is Sha256, so such repos
    were silently mislabeled as Sha256.

    Resolve the implicit case to Sha1 when supported, else error
    out to avoid any mislabeling.

    Also reject extensions.objectFormat when repositoryFormatVersion is 0,
    matching git, which treats it as an invalid v1-only extension.

  • 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.

Note

PR body was truncated to here.


Configuration

📅 Schedule: (UTC)

  • Branch creation
    • At any time (no schedule defined)
  • Automerge
    • At any time (no schedule defined)

🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.

Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 Ignore: Close this PR and you won't be reminded about this update again.


  • If you want to rebase/retry this PR, check this box

This PR was generated by Mend Renovate. View the repository job log.

@renovate
renovate Bot force-pushed the renovate/gix-0.x branch from 5bd6ac0 to 5b4d360 Compare March 29, 2026 11:25
@github-actions

Copy link
Copy Markdown

Benchmark Results

Status Count
Regressions 0
Improvements 0
No change 0

Download full results from the workflow artifacts.

@renovate renovate Bot changed the title chore(deps): update rust crate gix to 0.81 chore(deps): update rust crate gix to 0.82 Apr 24, 2026
@renovate
renovate Bot force-pushed the renovate/gix-0.x branch from 5b4d360 to 507e30f Compare April 24, 2026 14:54
@renovate renovate Bot changed the title chore(deps): update rust crate gix to 0.82 chore(deps): update rust crate gix to 0.83 Apr 28, 2026
@renovate
renovate Bot force-pushed the renovate/gix-0.x branch from 507e30f to d61bf25 Compare April 28, 2026 05:14
@renovate
renovate Bot force-pushed the renovate/gix-0.x branch from d61bf25 to 10f21c4 Compare May 18, 2026 19:15
@renovate
renovate Bot force-pushed the renovate/gix-0.x branch from 10f21c4 to 50efbf9 Compare May 26, 2026 04:40
@renovate renovate Bot changed the title chore(deps): update rust crate gix to 0.83 chore(deps): update rust crate gix to 0.84 May 26, 2026
@renovate renovate Bot changed the title chore(deps): update rust crate gix to 0.84 chore(deps): update rust crate gix to 0.85 Jun 22, 2026
@renovate
renovate Bot force-pushed the renovate/gix-0.x branch from 50efbf9 to b334323 Compare June 22, 2026 18:44
@renovate
renovate Bot force-pushed the renovate/gix-0.x branch 2 times, most recently from cb0fc45 to e3938a2 Compare July 23, 2026 18:27
@renovate renovate Bot changed the title chore(deps): update rust crate gix to 0.85 chore(deps): update rust crate gix to 0.86 Jul 23, 2026
@renovate
renovate Bot force-pushed the renovate/gix-0.x branch from e3938a2 to 796f139 Compare August 11, 2026 22:57
@renovate
renovate Bot force-pushed the renovate/gix-0.x branch from 796f139 to 98dd39b Compare August 22, 2026 22:28
@renovate renovate Bot changed the title chore(deps): update rust crate gix to 0.86 chore(deps): update rust crate gix to 0.87 Aug 22, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

0 participants