chore(deps): update rust crate gix to 0.86 - #31
Open
renovate[bot] wants to merge 1 commit into
Open
Conversation
renovate
Bot
force-pushed
the
renovate/gix-0.x
branch
from
March 29, 2026 11:25
5bd6ac0 to
5b4d360
Compare
Benchmark Results
Download full results from the workflow artifacts. |
renovate
Bot
force-pushed
the
renovate/gix-0.x
branch
from
April 24, 2026 14:54
5b4d360 to
507e30f
Compare
renovate
Bot
force-pushed
the
renovate/gix-0.x
branch
from
April 28, 2026 05:14
507e30f to
d61bf25
Compare
renovate
Bot
force-pushed
the
renovate/gix-0.x
branch
from
May 18, 2026 19:15
d61bf25 to
10f21c4
Compare
renovate
Bot
force-pushed
the
renovate/gix-0.x
branch
from
May 26, 2026 04:40
10f21c4 to
50efbf9
Compare
renovate
Bot
force-pushed
the
renovate/gix-0.x
branch
from
June 22, 2026 18:44
50efbf9 to
b334323
Compare
renovate
Bot
force-pushed
the
renovate/gix-0.x
branch
2 times, most recently
from
July 23, 2026 18:27
cb0fc45 to
e3938a2
Compare
renovate
Bot
force-pushed
the
renovate/gix-0.x
branch
from
August 11, 2026 22:57
e3938a2 to
796f139
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This PR contains the following updates:
0.80→0.86Release Notes
GitoxideLabs/gitoxide (gix)
v0.86.0: gix v0.86.0Compare Source
New Features (BREAKING)
Changed (BREAKING)
replace
maybe-asyncwithbisync.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-configUpdate repository configuration storage, snapshots, overrides, and caches
to use the self-contained
gix_config::Filerepresentation. Configurationcan now move through repository initialization, cloning, and remote setup
without artificial input lifetimes or conversions to
'static.BString,PathBuf,OsString, andFullNamevaluesfrom configuration-derived lookups.
Option<Result<T, E>>toResult<Option<T>, E>, allowing errors to propagate naturally with?.AsBStrinconfiguration setters, converters, remote lookup, and remote saving.
Cowconstruction,into_owned(), and redundantcloning from configuration consumers.
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
some/(a tree of only empty directories) now collapses to an emptydirectory and is skipped when empty directories aren't emitted, matching
Git which treats a tree with no files as clean. See #2490.
New Features
Repository::normalize_path()This way, one won't have to use the
Pattern + normalizeworkaround anymore.discover_opts()as sibling toopen_opts().This makes isolated discovery easier, at the cost of less control compared to itsgix::ThreadSafeRepository` counterpart.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.
core.fscacheon WindowsConnection::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
57fb139introduced reversed :/ traversal in 2.47.x; Git0ff919erestored 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::Remotekept only one value because lookup used the singularconfig 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::Remoteand exposeRemote::urls(Direction)forall 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 namespaceSince
b1c1cce, relativecore.worktreevalues from repository-ownedconfiguration were resolved against the symlink-resolved git dir whenever
that differed from the logical git dir. That is correct when the
.gitdirectory itself is reached through a symlink (#2052), but it also fired
when merely an ancestor directory is a symlink - like
/varon macOS,where
TMPDIRdefaults to a path inside the symlinked/var/folders.In that case a submodule repository opened through the symlinked path
would return a canonicalized
workdir()whileRepository::path()andall 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 repospass through the allocation limit
This is particularly important in untrusted repositories, which
get a reduced allocation limit.
gix::open()now handlesrepo.gitdirectories correctly.Previously they were incorrectly assumed to be the actual
.gitrepositoryand treated as such.
resolve relative core.worktree from real git dir
Chore (BREAKING)
gix-configMarked as breaking explicitly to as we know paramter types were
changed to use convenience traits.
Commit Statistics
Commit Details
view details
1568b31)319cec2)b1c1cce)5f244b3)cb6ec7d)f0ec710)443b401)31a94aa)2315ede)gix-filter(552402f)02cb162)Repository::normalize_path()(6fe97a9)discover_opts()as sibling toopen_opts().` (2f4c488)e7af50e)271454b)a3e9a77)9949e9f)4d47453)adf4b7a)maybe-asyncwithbisync. (c3f2244)5982dfe)gix-config(6aa934a)e70732a)gix-attributes(e11d7a2)c16b5a1)43ff87a)55b5158)gix-config(582d7b5)402babd)53515b6)299d16b)gix-credentials(f88cf10)cf3053a)d89bda0)27aec47)7056d62)432e2b1)6e1c4a2)f1ac335)6e5a5de)1cda1d1)core.worktree-derived worktree paths in the caller's path namespace (24293fc)d5cd537)1ff51ca)8f8d6ab)b36ca4c)Repository::kind()detects linked worktrees of bare repos (54a3c2a)6d95da6)gix-features, usegix-zlibaccordingly. (9c2977a)e9c973d)d533f0c)dc1fdc3)0052e42)0a5c62a)3e43c42)54b5393)a82b492)32cb1ad)core.fscacheon Windows (158f899)f2dfdd8)7de7a30)d8aeaac)Connection::configured_credentials_for_current_url(). (a5d4616)gix-transport(6a7a717)f77cb0a)gix::open()now handlesrepo.gitdirectories correctly. (9fe1050)c31dac2)596ab93)7e17fcf)a7625fa)1e3da34)1b1541e)v0.85.0: gix v0.85.0Compare 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
Connectionlifetimes,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
continueis 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
gixhad 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 --shortexits 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-levelNotADirectoryerror whenrefs/heads/Aalready exists as a loose ref. Thatlookup is asking whether the longer ref exists; the path-prefix collision
matters to creation/update code, but find should report absence for that
candidate.
Git reference:
refs/refs-internal.hdocumentsENOTDIRas the case where aref prefix is not a directory, alongside
ENOENTfor non-existing refs. Forlookup, both mean the requested ref candidate was not found.
write new remote sections to the local config file.
Add support for
gix_object::Write::*with_known_id()and use it.This means the
Repository::write_object()won't recalculate the hash.handle relative worktree gidir files
Git 2.48 can link worktrees with relative paths. In that layout the checkout
.git file points at the private git dir relative to the checkout, while
worktrees//gitdir points back to the checkout relative to the private git
dir.
Discovery already handled the checkout-side gitdir file, but paths read from the
private git dir were treated as-is. That made discovery from .git/worktrees/
and Repository::worktrees() proxy base resolution produce relative paths
anchored to the process cwd instead of the gitdir file location.
Git reference: /Users/byron/dev/github.com/git/git
worktree.c:write_worktree_linking_files writes both relative links with
relative_path(), and t/t2400-worktree-add.sh covers the resulting relativefiles.
fetching and cloning with refspecs that are tags (in shallow clones)
Fix shallow clone refspecs for explicit tag refs
When a shallow clone was created with
with_ref_name(), the clonesetup treated the requested name as a branch and generated a refspec
under
refs/heads/. For tag names this produced an unmatched requiredmapping like
+refs/heads/<tag>:refs/remotes/origin/<tag>.Resolve the requested ref name against the remote before constructing
the shallow single-ref refspec. Branches continue to map to
refs/remotes/<remote>/*, while tags and other non-branch refs map tothemselves.
Baseline Git behavior was checked with
/Users/byron/dev/github.com/git/git:non-shallow
--branch <tag>clones keep the normal branch wildcardfetch refspec, while shallow
--depth 1 --branch <tag>clones store+refs/tags/<tag>:refs/tags/<tag>.reject deleted prior checkout branches
Commit Statistics
Commit Details
view details
9ad2e24)6b5c2ea)6730316)da6b267)9929ece)ed998d1)325d2a1)470e689)77e11be)28b726d)e7c7484)a8c5257)00f64fc)fa42565)3755396)590b206)f051396)Editor::remove_leaf()(cd610db)73ffc99)847eb4a)5217d66)52d26d7)discovery_optsto inform aboutupwards::Optionstrust handling. (7ba53e1)f1f8b6f)2a5b8d4)5dfb44d)3b4a6bc)c391a12)14a1a11)ad9354e)b859b92)b0155ce)4f089fc)9f432ef)5aadd6e)137794d)b5b2d54)bc4064c)69caccd)gix_object::Write::*with_known_id()and use it. (2bd9dfe)a209dc1)1d80b47)bd2881e)3dd621c)0c1645a)find_custom_refnameas in Git (7734fb0)92c8130)a4be01b)f7d4f33)v0.84.0: gix v0.84.0Compare Source
New Features (BREAKING)
Also make turn
destination_must_be_emptyintoOption<bool>New Features
SHA-256support for object-format parsing.Bug Fixes
Follow submodule gitdir files when opening and perform basic validation
Modern submodules store a .git file in the worktree whose gitdir: value points
at the repository to open. The previous resolver treated every non-directory
.git path like an uninitialized submodule and fell back to .git/modules/,
which can open the wrong repository after a submodule gitdir is relocated or
renamed. That shows up as phantom submodule HEAD changes in gix status.
Git baseline: Git setup.c::read_gitfile_gently() parses gitdir:
files and resolves relative targets against the .git file location;
submodule.c::submodule_to_gitdir() consults that gitfile before falling back to
the name-derived .git/modules path.
Update Submodule::git_dir_try_old_form() to validate the submodule name, then
follow worktree .git files when present while preserving the old-form directory
and uninitialized fallback behavior. Validate present gitdir file targets for
direct state/open/status queries so broken submodule checkouts are reported
if the gitlink doesn't point to a directory.
For status ignore=all, still parse valid gitdir files to keep state accurate,
but skip target validation and fall back without error if the gitdir file itself
is malformed or unreadable. Derive State::is_old_form directly from whether
the worktree .git path is a directory so a divergent modern gitlink is not
misclassified as old form.
Repository::is_dirty()won't fail on unborn repositoriesCommit Statistics
Commit Details
view details
Repository::is_dirty()won't fail on unborn repositories (1f82a9f)82c483a)87433ed)f962ed1)d80c534)9013c3f)8606b7a)e75fbfa)2d4a6f2)31c2de3)b8510b2)object_hashtogix::create::Options(b123b4c)db925ec)ba7d9a4)5a37fbd)is_dirty()does when there are modifications. (3406b1d)8af2691)SHA-256support for object-format parsing. (011316e)a791ea3)a8f7717)278d7ec)0ec3bb7)justfileand automate feature tests (db7b97b)sha1feature ingixto just set what's needed. (16a6fc4)4743361)1980190)e3d5a04)ab2fee1)2cb17b2)3675a8d)3af9b4a)d3e4c17)1d9bae2)c2ae6cd)23af41a)gix_object::Data(4309fa4)adb8328)v0.83.0: gix v0.83.0Compare Source
Bug Fixes
$COMMON_DIR/info/excludeto make excludes work in worktrees.It turns out there is no per-worktree excludes file either.
Chore (BREAKING)
prodashandcrosstermionto the latest version.This will fix the
cargo denyissue as it brings in a newerlrucrate.Bug Fixes (BREAKING)
remove
winnowand replace it with hand-implemented parsers everywhere.This will allow for simplified maintenance and editing (both human and machine)
down the road, and enable additional performance optimisations.
Parser compbinators to me ultimately were a failed experiment as I couldn't maintain
them anyway, with it being too difficult for me to grasp and express everything
in its very own kind of language, with a lot of different things to consider.
Note that this also removes detailed errors from all parsers that previously
used
winnow, with the option to re-add those if there is demand.Commit Statistics
Commit Details
view details
gix-object(91bfab0)winnowand replace it with hand-implemented parsers everywhere. (91c854e)4d5ba23)2c3a08e)gix-error(2e2a126)v0.82.0: gix v0.82.0 - hardenedCompare Source
Advisories with fixes
Bug Fixes
Correctly use
$COMMON_DIR/info/excludeto make excludes work in worktrees.It turns out there is no per-worktree excludes file either.
do not open
.gitmodulefiles through symlinksThis could lead to places outside of the repository that are attacker controller.
don't follow submodule names with relative paths in them
This made it possible to trick submodule repos to be opened outside of the
actual repository.
Restore
Category::to_full_name()to be able to produce any full name.Previously it learned to reject certain invalid branch names, but this has to
be done separately and led to some unpleasant changes in
gixas well.reject
refs/heads/HEADas branch name during repo initialisationAlso document that
refs/heads/HEADis allowed ifFullNamewas createddirectly.
Tree::peel_to_entry()peel to the final tree entry (and only if it's a tree)deduplicate entry-finding logic
The logic for finding entries is duplicated 3 times.
Use
std::ops::ControlFlowfor simpler, callback-friendly code.std::path::Componenthas infallible conversion to&[u8]Instead of relying on a fallible path and using a default value,
we can convert directly between a
Componentand a&[u8].Chore (BREAKING)
prodashandcrosstermionto the latest version.This will fix the
cargo denyissue as it brings in a newerlrucrate.New Features (BREAKING)
alloc_init_bytesto handle untrusted inputThis breaking change is intended to force a decision about how
much memory allocation an untrusted party can command by tempering
with binary file formats.
imara-diff-v2with git sliders processingThe slider post-processing imrpoves the diff quality for about 8% slower diffs.
Line-counts, however, will be 50% faster to compute.
Other
New Features
This can be controlled via
gitoxide.objects.allocLimitIfReducedTrust.GIX_ALLOC_BYTESand pass them togix-odbfor reading untrusted inputsha256togixDocumentation
Commit Statistics
Commit Details
view details
f9fbcba)63b8419)0396152).gitmodulefiles through symlinks (52485a9)d2e193f)95b0399)alloc_init_bytesto handle untrusted input (91d0c26)alloc_limittests to validate limit for loose objects as well. (9473d32)alloc_limit_bytestogix-index(054494f)GIX_ALLOC_BYTESand pass them togix-odbfor reading untrusted input (acffd6b)392336f)7d50c30)d9b358b)gix-object(6df1d55)6f47e98)gix-traverse(a1bd845)2a5db88)e4f380e)imara-diff-v2with git sliders processing (8094f5d)444a92b)package.includepatterns more specific so they don't match ignored files (c2c917f)e51c40b)Category::to_full_name()to be able to produce any full name. (5b229c6)420c5df)6a5a0ec)refs/heads/HEADas branch name during repo initialisation (1adc44c)a298901)3542230)8a2b474)50fb46f)gix-config. (344218a)af1ad55)gix-config(7bda16a)ec66ceb](https://redirect.github.com/GitoxideLabs/gitoxide/cConfiguration
📅 Schedule: (UTC)
🚦 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.
This PR was generated by Mend Renovate. View the repository job log.