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 togix::Erroror an I/O error.Return
Exnfrom 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 productionmap_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/vimin Git's core directory on Windows; changeRepository::editor() -> Option<gix_command::Prepare>On Windows, Git's bundled
vimay 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 asdeletedindelete::Error::Cleanupso callers can recover
it when only configuration cleanup fails; retainreferencesas the full
requested batch.The success value changes from
()toVec<FullName>, andCleanupgains
adeletedfield. 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_errortypes 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}andgix::erroras the central facade, along with
unrenamed canonical re-exports, required associated types, concrete errors,
and aliases that add structure. Preserve eachExnparameter, 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-core3.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
sysinfoandrusqlite
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 togix::config_path().
Expose that selection onRepository, using its common directory for
Source::Local, its Git directory forSource::Worktree, and its opening
options with the existing resolver for global sources.Keep the worktree path available even when
extensions.worktreeConfigis
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.candDocumentation/git-config.adocin
the local Git checkout at1630431f326e15fcde608827b5ff38422528eb59.
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 fromconfig_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.cfunctions
git_system_config()andgit_global_config_paths(), plus the global and
system override tests int/t1300-config.sh. The shared resolver retains
the existing source-specific path and override behavior. -
add standalone
config_mut()transactionsCallers can load global configuration with
gix::config(), but editing
one physical file previously required a repository. Add a sibling that
acceptsconfig::Sourceandopen::Optionsand returns the existing
config::FileTransaction.Share source-path resolution and
core.configLockTimeoutparsing 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 throughgix::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_NOSYSTEMswitch. Read the permitted environment value once before
selecting Git-installation and system sources, preserving the behavior already
implemented bygix_config::Source::storage_location(). -
add
worktreeProxy::is_prunable()+ fixExpose
worktree::Proxy::is_prunable()with Git-compatible semantics: locked
worktrees are retained, while unreadablegitdirfiles and missing checkout
targets are prunable. Treat any filesystem entry atlockedas 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 optionalcommondir
file. This prevents incomplete administration from being mistaken for a
standalone repository and keepsHEADaccess 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 malformedcommondirfiles. -
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.*Fallbackunconditionally can
override a completeuser.*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-testtoolsGit 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 throughjtt 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-purejourney
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, andssh-keygenavailable
by prepending installation directories toPATH. 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 treatsgpg.*.programvalues 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 legacygpg.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}.*Fallbackshared its configuration slot with the
corresponding environment overrides. This placed application fallbacks before
user.*, while also placingGIT_{AUTHOR,COMMITTER}_*after role-specific
configuration.Store environment overrides under
author.*andcommitter.*, then resolve
explicit fallback keys only afteruser.*. 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)
- Add
- 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
gixAPI 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
gixCargo 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/vimin Git's core directory on Windows; changeRepository::editor() -> Option<gix_command::Prepare>(b76cc28) - Merge pull request #2940 from GitoxideLabs/vendor-bisync (dda600d)