Skip to content

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

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

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.80 → 0.88

Release Notes

GitoxideLabs/gitoxide (gix)

v0.88.0: gix v0.88.0

Compare Source

Bug Fixes (BREAKING)
  • preserve causes across fallible conversions

    Rubber stamp, looked at diff. This is a cleanup commit.
    There is going to be considerable cleanup done later as well.

    Parsers and adapters discarded encoding, integer, date, signature, and
    object-access failures when replacing them with context. Preserve their
    concrete causes so classification and downcasting keep working after
    conversion to gix::Error or an I/O error.

    Return Exn from fallible path, command-line, gitdir, and pack-entry
    conversions where necessary, and adapt their consumers in the same change.
    Packed-ref and reflog errors retain their parser sources and input details;
    reflog recovery reports the actual recovery failure. Loose-object verification
    now propagates lookup and enumeration failures instead of treating every
    lookup error as retryable or silently skipping failed enumeration.

    Remove unnecessary UTF-8 conversions for ASCII suffixes and check span bounds
    before narrowing. Parsers that only return () explicitly destructure it.
    No production map_err() closure still discards a wildcard-bound error.
    Also preserve causes in formatting-only CLI and commit-graph adapters, where
    stringification previously lost checksum corruption classifications.

  • locate vi/vim in Git's core directory on Windows; change Repository::editor() -> Option<gix_command::Prepare>

    On Windows, Git's bundled vi may not be available through PATH. Resolve the
    default editor in Git's core directory first and retain the bare command as
    fallback.

New Features (BREAKING)
  • return the local branches actually deleted

    Callers that needed to know whether branch deletion removed anything had
    to look up each reference separately. That duplicated reference reads and
    could report stale existence information by the time deletion took its
    locks.

    Return sorted, deduplicated full names from the committed reference edits
    whose previous values were observed under lock. Missing branches are
    excluded while their stale local configuration is still removed. Expose
    the same list as deleted in delete::Error::Cleanup so callers can recover
    it when only configuration cleanup fails; retain references as the full
    requested batch.

    The success value changes from () to Vec<FullName>, and Cleanup gains
    a deleted field. Strengthen the existing tests for loose, packed, dangling
    symbolic, duplicate, missing, empty, and linked-worktree branch requests.

Changed (BREAKING)
  • remove redundant error aliases

    rubberstamp

    The crate-by-crate migration retained operation-specific error aliases to
    limit downstream churn. With the migration complete, those names only hide
    the shared error types and keep otherwise empty API namespaces alive.

    Use the underlying gix_error types directly throughout the workspace,
    including indirect aliases, renamed exports, test helpers, and the URL fuzz
    target. Remove namespaces and files that only held forwarding aliases, and
    update documentation and migration guidance to use the canonical types.
    Adjust the source locations recorded in error snapshots after deleting the
    alias declarations.

    Keep gix::{Error, Exn} and gix::error as the central facade, along with
    unrenamed canonical re-exports, required associated types, concrete errors,
    and aliases that add structure. Preserve each Exn parameter, conditional
    error alternative, error message, and source chain. Include all downstream
    adaptations in this breaking change so the stack remains buildable.

  • consolidate public API failures under gix::Error

    rubberstamp

  • raise MSRV to Rust 1.88

    The newly published dua-core 3.3 release used by linked-worktree removal
    requires Rust 1.88, so raise every workspace crate and the advertised badge
    together.

    Keep the MSRV checks buildable by selecting the latest sysinfo and rusqlite
    release lines that support Rust 1.88.

New Features
  • add Repository::config_path()

    Callers with a repository currently have to select local and worktree
    configuration paths themselves before falling back to gix::config_path().
    Expose that selection on Repository, using its common directory for
    Source::Local, its Git directory for Source::Worktree, and its opening
    options with the existing resolver for global sources.

    Keep the worktree path available even when extensions.worktreeConfig is
    disabled, so callers can locate and prepare that physical file. Preserve
    the existing errors for disabled sources and sources without a file.

    Git reference: builtin/config.c and Documentation/git-config.adoc in
    the local Git checkout at 1630431f326e15fcde608827b5ff38422528eb59.
    The executable baseline was Git 2.50.1 (Apple Git-155).

  • expose standalone configuration paths with config_path()

    Callers need to locate a configuration file before starting a
    config_mut() transaction so they can inspect it, prepare its parent
    directory, or load it themselves.

    Extract the existing path selection into gix::config_path(source, options) and use it from config_mut(). Preserve source and environment
    permissions, explicit path overrides, and current-directory anchoring.
    Path lookup succeeds without existing parent directories or valid
    configuration contents, and does not acquire a transaction lock or
    evaluate transaction settings.

    Git reference: v2.55.0-782-g1630431f32, config.c functions
    git_system_config() and git_global_config_paths(), plus the global and
    system override tests in t/t1300-config.sh. The shared resolver retains
    the existing source-specific path and override behavior.

  • add standalone config_mut() transactions

    Callers can load global configuration with gix::config(), but editing
    one physical file previously required a repository. Add a sibling that
    accepts config::Source and open::Options and returns the existing
    config::FileTransaction.

    Share source-path resolution and core.configLockTimeout parsing with
    configuration loading and repository transactions. Honor source and
    environment permissions, preserve source metadata, and keep physical
    edits lossless without persisting includes or runtime overrides.
    Global files use normal filesystem permissions; missing files can be
    created on commit when their parent directory already exists.

  • allow presetting system configuration paths

    Callers that already know the Git-installation and system configuration files
    can now provide both paths through gix::open::Options. The paths flow through
    repository opening and standalone configuration loading, while the existing
    source permissions continue to decide whether each file is read.

    Preset paths replace path discovery, but must not bypass Git's explicit
    GIT_CONFIG_NOSYSTEM switch. Read the permitted environment value once before
    selecting Git-installation and system sources, preserving the behavior already
    implemented by gix_config::Source::storage_location().

  • add worktreeProxy::is_prunable() + fix

    Expose worktree::Proxy::is_prunable() with Git-compatible semantics: locked
    worktrees are retained, while unreadable gitdir files and missing checkout
    targets are prunable. Treat any filesystem entry at locked as a lock,
    including symlinks.

    When opening a proxy as a repository, use the common directory already known
    by its parent instead of relying on the linked worktree’s optional commondir
    file. This prevents incomplete administration from being mistaken for a
    standalone repository and keeps HEAD access routed through the repository ref
    store for backend compatibility.

    Fetch can consequently inspect linked-worktree heads without failing for missing
    checkouts, locks, or missing and malformed commondir files.

  • edit physical configuration files atomically with Repository::config_file_mut()

    Add Repository::config_file_mut() as a transaction over one physical
    configuration file. It acquires a symlink-aware lock before reading, parses
    without expanding includes, preserves formatting and existing permissions, and
    resolves relative paths against the opening CWD.

    Lock acquisition honors the discoverable core.configLockTimeout key
    with Git-compatible parsing and a 1000 ms default. New files also honor
    core.sharedRepository after the process umask, including named, boolean,
    compatibility, and explicit octal modes.

    Committing only writes the file atomically. Repository state changes through
    an explicit full reload, which retains normal Git-compatible validation and
    rebuilds include- and bootstrap-dependent state without a second partial-refresh
    path.

  • add Repository::committer_or_set_fallback()

    Applications that configure gitoxide.committer.*Fallback unconditionally can
    override a complete user.* identity because these keys resolve first.

    Add Repository::committer_or_set_fallback() so callers can provide a
    last-resort identity without changing normal configured-user behavior. Keep the
    generic helper as a wrapper, and document and test the precedence.

Bug Fixes
  • propagate failed fetch ancestry checks
    Looked at this in detail to understand how error handling improvements
    were made. It all makes sense, and teaches me to... not ignore or
    skip over errors, ever, it's basically a bug unless there is a test
    that proves it's not a bug.

    Fetch ref updates discarded commit decoding and traversal setup errors,
    treating any such failure as permission to force the update. A malformed
    local or remote commit could therefore overwrite a ref without a force
    refspec. Traversal errors were also ignored when looking for the ancestor.

    Propagate those failures with their original causes and context. Check
    object kinds explicitly to retain the existing behavior for non-commit
    targets without mistaking corruption for an object-kind mismatch.

  • Keep rust workspace tests inside disposable repositories and isolated environments

    Direct Git launches inherited repository selectors and user configuration even
    when tests supplied a fixture working directory. Tests of default-environment
    APIs and local Git transports also shared the runner's environment. A few
    journey tests wrote beneath source directories or used the source checkout as
    the repository under test.

    Use the shared gix-testtools Git command builder for subprocess setup, isolated
    repository options for fixtures, and isolated child processes where the real
    environment-reading API must be exercised. Scope CWD changes, copy the fixture
    used by an object-write test, and run shell journeys through jtt run. Keep
    journey worktrees and example output within their disposable sandboxes and
    replace the attributes checkout test with a representative fixture repository.
    Prompt examples also run in isolated children and must build successfully; the
    old tests could ignore build failures and execute stale cached binaries.

    The affected Rust crate suites, internal test-tool build, and max-pure journey
    suite pass from a source copy without Git metadata. Signing and Git-daemon
    checks use only disposable keys, repositories, and local sockets.

  • find bundled signature programs on Windows

    Git for Windows makes its bundled gpg, gpgsm, and ssh-keygen available
    by prepending installation directories to PATH. Gitoxide can run outside that
    prepared environment, so bare defaults may not resolve.

    Use gix_path::env::installation_program() for unconfigured defaults on Windows
    and retain the bare name as fallback. Explicit configuration and non-Windows
    behavior stay unchanged.

  • interpolate signature verifier program paths
    Git treats gpg.*.program values as pathnames and expands a leading tilde
    before launching the verifier. Signing already did this, but verification kept
    the raw configured string, which fails with direct program invocation.

    Resolve OpenPGP, X.509, and SSH verifier programs through the existing
    trusted-path handling while preserving defaults and the legacy gpg.program
    fallback.

  • normalize safe-directory paths before trust checks

    Windows canonicalization can produce verbatim paths with a \\?\ prefix while
    included configuration metadata uses an ordinary drive path. Comparing those
    representations directly prevents an explicitly safe config file from being
    promoted to full trust, including after repository reloads.

    Canonicalize both the path under test and configured safe-directory paths
    through the filesystem before exact or wildcard comparison. Retain the existing
    lexical realpath fallback for missing paths.

  • make identity fallbacks true last-resort values

    gitoxide.{author,committer}.*Fallback shared its configuration slot with the
    corresponding environment overrides. This placed application fallbacks before
    user.*, while also placing GIT_{AUTHOR,COMMITTER}_* after role-specific
    configuration.

    Store environment overrides under author.* and committer.*, then resolve
    explicit fallback keys only after user.*. This matches Git precedence and lets
    applications configure fallbacks without replacing a valid user identity.

Commit Statistics
  • 49 commits contributed to the release over the course of 31 calendar days.
  • 32 days passed between releases.
  • 19 commits were understood as conventional.
  • 1 unique issue was worked on: #​2959
Commit Details
view details
  • #​2959
    • Add worktreeProxy::is_prunable() + fix (0af2f91)
  • Uncategorized
    • Merge pull request #​2847 from GitoxideLabs/gix-error-completion (6356013)
    • Preserve causes across fallible conversions (dcf08a4)
    • Propagate failed fetch ancestry checks (0b2a5c4)
    • Add error context without preliminary erasure (9d0329a)
    • Use implicit error conversion at gix API boundaries (ba2c7f2)
    • Use borrowed error inspection throughout the workspace (daf73b5)
    • Remove redundant error aliases (2176245)
    • Consolidate public API failures under gix::Error (b1e31eb)
    • Merge pull request #​3004 from GitoxideLabs/gix-notes-example (a5e8c4d)
    • Add the notes benchmark as a gix Cargo example (2bab44c)
    • Merge pull request #​2989 from GitoxideLabs/error-conversion-review (4b9ff51)
    • Merge pull request #​2996 from GitoxideLabs/credential-helper-non-interactive (2fb9b8a)
    • Merge pull request #​2990 from GitoxideLabs/various-improvements (c609062)
    • Keep rust workspace tests inside disposable repositories and isolated environments (4e0f8ff)
    • Merge pull request #​2992 from GitoxideLabs/fix-message-newline (4f29e0c)
    • Merge pull request #​2984 from justonemorenight/fix/config-path-tilde-parity (92b6508)
    • Auto-review (2742f05)
    • Merge pull request #​2979 from GitoxideLabs/absent-objects-info-dir-fix (dfc8e8c)
    • Merge pull request #​2975 from GitoxideLabs/repo-config-path (283937b)
    • Add Repository::config_path() (76502a0)
    • Merge pull request #​2974 from GitoxideLabs/global-config-path (be7bb02)
    • Expose standalone configuration paths with config_path() (707818c)
    • Merge pull request #​2971 from GitoxideLabs/diff-nullid-fix (d7551f1)
    • Return the local branches actually deleted (3b60097)
    • Add standalone config_mut() transactions (18ac842)
    • Merge pull request #​2970 from GitoxideLabs/better-reftable-error (6b2f33d)
    • Merge pull request #​2963 from GitoxideLabs/gix-notes-perf (4a870be)
    • Merge pull request #​2964 from GitoxideLabs/error-conversion-review (36b6310)
    • Allow presetting system configuration paths (653c002)
    • Merge pull request #​2960 from GitoxideLabs/fetch-in-linked-wt (87727ee)
    • Merge pull request #​2958 from GitoxideLabs/sign-on-windows (c16300c)
    • Find bundled signature programs on Windows (3c45a7d)
    • Merge pull request #​2957 from GitoxideLabs/sign-on-windows (b7bedcf)
    • Interpolate signature verifier program paths (ec63505)
    • Merge pull request #​2949 from GitoxideLabs/error-conversion-review (a095334)
    • Raise MSRV to Rust 1.88 (4b42e0c)
    • Merge pull request #​2929 from GitoxideLabs/config-refresh (b14028d)
    • Normalize safe-directory paths before trust checks (c48fe1e)
    • Edit physical configuration files atomically with Repository::config_file_mut() (913f631)
    • Merge pull request #​2955 from GitoxideLabs/transport-url-encoding (7e35849)
    • Release gix-path v0.12.6, gix-error v0.3.2, gix-command v0.10.1, gix-transport v0.59.2 (888677a)
    • Merge pull request #​2954 from GitoxideLabs/investigate-committer-fallback (ab66595)
    • Make identity fallbacks true last-resort values (d23127a)
    • Add Repository::committer_or_set_fallback() (c355827)
    • Merge pull request #​2944 from GitoxideLabs/error-conversion-review (e3a6fa1)
    • Merge pull request #​2942 from GitoxideLabs/error-conversion-review (a1d5a55)
    • Locate vi/vim in Git's core directory on Windows; change Repository::editor() -> Option<gix_command::Prepare> (b76cc28)
    • Merge pull request #​2940 from GitoxideLabs/vendor-bisync (dda600d)

v0.87.1: gix v0.87.1

Compare Source

New Features
  • add exact note-reference writes via note::Platform::replace_at_ref()
    Add Platform::replace_at_ref() for callers that already have a fully qualified notes
    reference and must avoid refs/notes shorthand expansion.

  • improve remote-name comparison and resolution

    Remote-tracking ref names are not reliable ownership indicators because fetch
    refspecs may use custom destinations. Reverse-map tracking refs against every
    configured remote and require exactly one mapping, reporting both cross-remote
    and within-remote ambiguity like Git.

    Keep path-based inference limited to Reference::remote_name(): select the
    longest configured prefix for names containing multiple slashes while avoiding a
    remote-config query for ordinary one-slash names.

    Allow remote::Name and the borrowed values returned by Remote::name() to compare
    directly and symmetrically with str, String, BStr, and BString using exact byte
    equality.

  • compare attached Ids and References with text

    Delegate attached Id textual equality to ObjectId, preserving symmetric
    canonical comparisons. Let attached references compare directly with
    text, byte strings, and full names by delegating to their stored plumbing
    reference.

    Reference comparisons remain directional because same-name
    references may have different targets.

Commit Statistics
  • 9 commits contributed to the release over the course of 1 calendar day.
  • 2 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 #​2842 from GitoxideLabs/tix-improvements (fbebed7)
    • Off-changelog rename note::Platform::add_to_ref() to ::replace_at_ref() (2c8ddd4)
    • Add exact note-reference writes via note::Platform::replace_at_ref() (716b89b)
    • Merge pull request #​2932 from GitoxideLabs/fundamental-types-comp (6704303)
    • Release gix-error v0.3.1, gix-hash v0.26.2, gix-object v0.64.1, gix-ref v0.67.1, gix-packetline v0.22.1, gix-pack v0.74.1, gix-testtools v0.20.0 (e52fe9d)
    • Improve remote-name comparison and resolution (900a0f6)
    • Use fundamental-type comparisons throughout tests (47536a5)
    • Compare attached Ids and References with text (23bd32d)
    • Merge pull request #​2933 from GitoxideLabs/report-august (b8914ff)

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](https://redirect.github.com/Gitox

❗ Important

✂ 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
@renovate
renovate Bot force-pushed the renovate/gix-0.x branch from 98dd39b to 1ba3832 Compare August 25, 2026 17:05
@renovate
renovate Bot force-pushed the renovate/gix-0.x branch from 1ba3832 to 554ed0b Compare September 2, 2026 19:16
@renovate
renovate Bot force-pushed the renovate/gix-0.x branch from 554ed0b to f8a878b Compare September 15, 2026 13:11
@coderabbitai

coderabbitai Bot commented Sep 15, 2026 •

Copy link
Copy Markdown

Important

Review skipped

Bot user detected.

To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Advanced

Run ID: b545d114-939b-4a35-b0ef-b3dd903dcafd

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
  • Autopilot · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Autopilot is currently an internal CodeRabbit preview.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@renovate
renovate Bot force-pushed the renovate/gix-0.x branch from f8a878b to ecd34cd Compare September 25, 2026 12:13
@renovate renovate Bot changed the title chore(deps): update rust crate gix to 0.87 chore(deps): update rust crate gix to 0.88 Sep 25, 2026
@renovate
renovate Bot force-pushed the renovate/gix-0.x branch from ecd34cd to 9bab0f9 Compare October 1, 2026 05:03
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