etc/plan/gix-error.md
Exn Migration PlanSource issue: GitoxideLabs/gitoxide#2351
Imported on: 2026-04-22
Working assumption: the checkboxes in this file reflect the current gix-error branch in this checkout, not only the historical state of the upstream issue.
Finish the migration from thiserror-based error enums to gix-error / Exn, while preserving three caller-facing properties:
gix_error::ValidationErrorNotARepository pathgix boundaryanyhow / source-chain integration completed in #2383, merged on January 19, 2026.cargo nextest --workflow run without --exclude gix-error.
Evidence: .github/workflows/ci.yml still excludes gix-error.thiserror with gix-error everywhere.
Evidence: 33 crates in this branch still carry a thiserror dependency and/or thiserror::Error usage.NotARepository distinct from generic open failures.
Evidence: gix::open::Error::NotARepository exists and is asserted in tests.gix_error::Error in tests when that simplifies Exn-heavy paths.
Evidence: partially adopted, but not clearly finished as a repo-wide sweep.gix-validate failures identifiable as gix_error::ValidationError.
Evidence: gix-error exports ValidationError, and downstream crates already use it directly.Workspace scan basis:
thiserror dependency present in Cargo.tomlthiserror::Error mentions under src/**/*.rsResult on 2026-04-22:
gix-error punch-throughgix-errorgix-commitgraph to gix-erroranyhow integration for gix-errorgix-actorgix-errorthiserror in Cargo.toml with gix-error.pub type Error = gix_error::Exn<gix_error::Message>; unless the crate needs a more specific concrete error.gix_error::ValidationError.#[from] / #[source] propagation with .or_raise(...) or .ok_or_raise(...).gix_error::Error as the erased boundary type, mainly at gix and in tests that benefit from downcasting or frame inspection.gix-hash - 7gix-url - 3gix-packetline - 3gix-features - 3gix-path - 2gix-attributes - 2gix-quotegix-lock - 1gix-fsgix-bitmapgix-mailmapgix-object - 11gix-config-value - 2gix-shallow - 2gix-refspec - 1gix-ref - 22gix-filter - 18gix-revwalk - 4gix-pathspec - 3gix-prompt - 1gix-traverse - 3gix-config - 11gix-credentials - 5gix-discover - 4gix-index - 11gix-transport - 10gix-worktree-streamgix-submodule - 6gix-diff - 8gix-protocol - 8gix-dir - 1gix-worktree-state - 1gix-archivegix-pack - 23gix-merge - 8gix-status - 3gix-blame - 1gix-odb - 11gix - 138gix-actorgix-chunkgix-commandgix-commitgraphgix-dategix-errorgix-fetchheadgix-fsckgix-globgix-hashtablegix-ignoregix-lfsgix-macrosgix-negotiategix-notegix-rebasegix-revisiongix-secgix-sequencergix-tempfilegix-tixgix-tracegix-tuigix-utilsgix-validategix-worktreegix-error special-case from .github/workflows/ci.yml.gix itself after all plumbing crates beneath it are clean.thiserror.src/**/*.rs file in this workspace mentions thiserror::Error.cargo nextest --workflow no longer excludes gix-error.gix boundary still returns gix_error::Error where type erasure is desired.