NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
crates.io · #1202 most downloaded on crates.io
Immutable and mutable git objects with decoding and encoding support
Last release today
08 Oct 2026
Ships on a steady schedule
a new release about every 4 weeks
Nearly every release is documented
notes for 57 of 59 stable releases
1 version withdrawn
withdrawn after publishing
4 years old
60 releases · first in 2023
One column per quarter.
Nothing published for this version
Nothing published for this version
2 commits contributed to the release.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
add explicit commit signing to gix-object <!-- agent --> Add plumbing for signing commits through external OpenPGP, X.509, and SSH programs under the
<csr-id-ca7563e17a53344ae07f3cfc1742023fb72fdd7d/> add explicit commit signing to gix-object <!-- agent --> Add plumbing for signing commits through external OpenPGP, X.509, and SSH programs under the shared signature feature. Accept fully resolved signer options so callers control the program, key, environment, and arguments without introducing repository configuration into the object crate.
Replace an existing signature using the hash-appropriate commit header, normalize signer output, and report process and malformed-output failures with context. Cover every supported format, SHA-256 headers, replacement, literal SSH keys, and verify generated signatures through the sibling plumbing verifier as well as the external reference programs.
<csr-id-5b90699525c939ccab570f884e4dd567a7161d16/> add commit signature verification to gix-object via commit::SignedData::verify()
<!-- agent -->
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.
<csr-id-a30f44225ce0190e4a537bfe61127a0cd9f2763b/> recognize SHA-256 commit signature headers <!-- agent --> 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.
<csr-id-c6cf668e9c25f8a73cbb0318a5dd56fa5952f825/> add tree::name_order() for git-style tree-entry comparison
<csr-id-e5370e63b8fcadef7e1e1e2cb28f781999444c70/> support Assisted-by commit trailers, count them as attributions. <!-- agent -->
Expose Assisted-by predicates and iterators alongside Co-authored-by, and include agent assistance in the general attribution stream without treating assistants as authors.
<csr-id-f2e90e985650cc6148c2fcb0453acac3aae1889d/> expose commit message blocks via Commit::body()::message_blocks()
This allows parsing messages that have been concatenated, and each message
has its own trailers.
<csr-id-26d231b4bc6f32a53b62e9d115445092cd90a1d2/> support signing and verifying annotated tags
Breaking as it renames Tag::pgp_signature to signature.
<!-- agent -->
Extend gix-object signature support from commits to annotated tags.
Signature infrastructure
gix_object::signature module.signature feature.Annotated tags
Tag::sign() and TagRef::sign().<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
ebe9095)7424676)Tree::bisect_entry() to be more succinct (579544e)f3bbfad)26d231b)ca7563e)commit::SignedData::verify() (5b90699)a30f442)gix-testtools (0cbe539)tree::name_order() for git-style tree-entry comparison (c6cf668)2a4d996)Store::at() where possible (17fea2a)2fadbc7)e5370e6)Commit::body()::message_blocks() (f2e90e9)ae8845a)
</details>impl gix_object::Write for find::Never to enable gix_odb::Proxy . This makes in-memory databases fully functional and avoids writing duplicate code ev
gix_object::Write for find::Never to enable gix_odb::memory::Proxy<Never>.
This makes in-memory databases fully functional and avoids writing duplicate code
everywhere.<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
Clippy helped 1 time to make code idiomatic.
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
842bc44)cb6ec7d)f0ec710)c16b5a1)43ff87a)cf3053a)27aec47)e9c973d)d533f0c)a82b492)gix_object::Write for find::Never to enable gix_odb::memory::Proxy<Never>. (5a4c328)1b1541e)
</details>Keep rust workspace tests inside disposable repositories and isolated environments
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.
migrate errors to 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.
<csr-id-cd610db8801f101132ba6c3c26a112a1d45a5fd7/> add leaf-only tree-editor removal via Editor::remove_leaf()
Motivation comes from https://github.com/gitbutlerapp/gitbutler/pull/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.
<csr-id-879694aa32b0829792d50a4ef7f47c7de50cf0c8/> Add Write::*_with_known_id() variants.
Add write_buf_with_known_id() and write_stream_with_known_id() to the
Write trait without default bodies.
That way it's possible to precompute the hash and avoid recomputing it here.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
6428edc)f051396)Editor::remove_leaf() (cd610db)69caccd)Write::*_with_known_id() variants. (879694a)f7d4f33)
</details>rename Data::hash_kind to Data::object_hash for consistency The new name is now used everywhere and more descriptive and clear.
Data::hash_kind to Data::object_hash for consistency
The new name is now used everywhere and more descriptive and clear.<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
10c58bb)278d7ec)sha1 and sha256 forwardings for all crates (09b982c)1cd36be)ab2fee1)2cb17b2)e10d5f6)3675a8d)23af41a)b358d31)Data::hash_kind to Data::object_hash for consistency (7aff98b)gix-testtoolsand rename hash_kind -> object_hash (d9648e8)adb8328)
</details>Limit Commit and Tag parsing to a given gix_hash::Kind Doing so adds conformity with Git, but also simplifies the parser which now only parse hex-hash
<csr-id-d4439cd5b5aa82c126198aa57de6a9ebbc15d371/> Limit Commit and Tag parsing to a given gix_hash::Kind
Doing so adds conformity with Git, but also simplifies the parser
which now only parse hex-hashes of a single valid length.
<csr-id-91c854e7b9f41738d0fde825cd474b8c00c1a49b/> remove winnow and 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.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
53f880c)gix-object (91bfab0)gix_hash::Kind (d4439cd)winnow and replace it with hand-implemented parsers everywhere. (91c854e)4d5ba23)
</details>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 t
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.
gix editor command
Provide a small plumbing command that opens zero or more paths withRepository::editor()'s Git-compatible selection. Prepare editor definitions withgix editor command (d930653)<csr-id-c7908d1d9566ff313ded9860e7a1a19303814de5/> detect trailers when they are the sole body content
<csr-id-06a124818b856620463b2b3f0a2ccae7baa66368/> allow tree-parsing with entries whose paths has leading spaces work again Related to https://github.com/gitbutlerapp/gitbutler/issues/13198
<csr-id-b37fef12302160b448191103b1d344e6adf0af6a/> deduplicate entry-finding logic The logic for finding entries is duplicated 3 times.
Use std::ops::ControlFlow for simpler, callback-friendly code.
<csr-id-24faf05da0dd86f67f868e44b011fafc8bea28cd/> remove now-unused dependency gix-path
<csr-id-0e173d6e75df6cfcce86e1f198e4b582d4709909/> std::path::Component has infallible conversion to &[u8]
Instead of relying on a fallible path and using a default value,
we can convert directly between a Component and a &[u8].
hash_kind to TreeRefIter and Data for SHA-256 supportcommit::message::Body to parse multi-line trailers
Also add more tests for more complete compliance with git interpret-trailers.
Note that the new behaviour is more conforming, which means that trailer
blocks must be parseable in full to be be recognised.<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
f9fbcba)a1ad31b)63b8419)e64e3b8)0396152)465b366)gix-object (c148ed2)7d50c30)d9b358b)hash_kind to TreeRefIter and Data for SHA-256 support (3b156e8)444a92b)package.include patterns more specific so they don't match ignored files (c2c917f)c261237)commit::message::Body to parse multi-line trailers (e3995bb)fb3c526)c7908d1)e51c40b)06a1248)44020e0)9d04035)29c275e)b1102c2)de3f064)fc09ed2)b37fef1)98bae84)7eb98cb)6abbe82)2ce6dde)gix-path (24faf05)std::path::Component has infallible conversion to &[u8] (0e173d6)
</details>remove gix tix screen selection Remove the plumbing CLI screen-mode option now that the interactive history always owns the alternate screen. The auto
remove gix tix screen selection
Remove the plumbing CLI screen-mode option now that the interactive history always owns the alternate screen. The automatic and half-screen modes depended on inline rendering behavior that is being retired from gix-tix.
Stop accepting --screen for gix tix and its aliases, and remove the mode validation and translation into gix-tix. Construct the reduced gix-tix options directly from the remaining quit and hidden-revision arguments. Keep a command-line regression assertion so the removed option cannot silently return as an ignored argument.
delegate tix commands through gix-tix
Embed the complete gix-tix Clap platform in the plumbing command instead of maintaining a second parser and dispatcher. This keeps standalone and plumbing invocations aligned, adds worktree-tip parity, and makes amend and spill available through gix tix without duplicating their execution logic.
show other worktree checkouts in tix
Decorate commits checked out by other main or linked worktrees with light-blue name@ labels, replacing the ordinary branch label. Keep the checkout from which tix was opened represented by the graph @ marker and its ordinary local reference, and use directory basenames for other detached worktrees. Keep other-worktree labels visible on the selected row when references are hidden.
Add -w/--worktrees to include every successfully resolved worktree HEAD, including the current checkout, alongside implicit or explicit traversal tips without weakening hidden-revision exclusions. Discover worktrees from their private Git metadata so stale checkout directories remain useful, while malformed, unborn, or inaccessible entries are logged and skipped.
Watch linked HEAD and worktree membership changes so decorations and optional tips stay current, while ignoring unrelated linked indexes, logs, and metadata. Document the behavior and cover current, attached, detached, stale, malformed, hidden-reference, CLI, and watcher cases.
sha1 and sha256 features to gix.
This way one can control which hashes are compiled in exactly,
while having reasonable defaults automatically.<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
8620420)c389a2c)16bb905)888feb7)6183fd0)575e957)6bdb331)e8bf096)sha1 and sha256 features to gix. (3832916)gix-hash (e71c703)f7277f3)
</details>support cloning a single revision
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 337855629f59 (builtin/clone: teach git-clone(1) the
--revision= option) and its t/t5621-clone-revision.sh behavior.
gix-date (613ff86)keep descendants of ignored directories excluded
I looked at this carefully, and ended up having a better comment
to provide an example for what this covers.
Ultimately, this is test extension is still minimal compared to the
behaviour that it enables, scoped status, but I think it's fine
in there interest of less code.
Scoped status walks can enter an ignored directory when a pathspec
matches. If a deeper directory matches a negated rule such as !out/,
the ignore stack previously stopped at that nearer match and exposed its
contents as untracked. Tix uses scoped walks for filesystem refreshes,
so ignored Cargo output appeared after unrelated worktree events and
disappeared after a full refresh.
Continue through negated directory matches to check excluded ancestors.
Keep the nearest negation as the fallback when no ancestor excludes the
path, and preserve the precedence of positive directory matches,
including precious-file handling.
Extend the Git-reference fixture below a negated child directory and
refresh both hash archives. The extended fixture fails with the previous
matcher. All directory-walk, status, and worktree tests pass, as do the
SHA-256 ignore baseline, formatting, and Clippy with -D warnings.
Clippy retains the workspace's existing removed-lint warning.
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.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
ecf90fc)228caf7)GIX_TEST_FIXTURE_HASH for gix-commitgraph and gix-pack. (d51b858)9327b73)
</details>11 commits contributed to the release over the course of 30 calendar days.
gix-testtools (0cbe539)Store::at() where possible (17fea2a)GIX_TEST_FIXTURE_HASH for more tests (bbea2c4)<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
d66ac10)8bceefb)7ce3c55)f7d0975)
</details>4 commits contributed to the release over the course of 16 calendar days.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
cbbdef5)562e684)0a333e5)c663b3f)
</details>4 commits contributed to the release over the course of 5 calendar days.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
7be8f90)d914d95)4edc5dd)211b4fb)
</details>gix dirwalk as a way to run gix-dir directly This is mostly for testing walks specifically, without needing them as part of gix clean or gix status.
gix dirwalk as a way to run gix-dir directly
This is mostly for testing walks specifically, without needing them as part
of gix clean or gix status.gix merge tree --message '' to allow creating commits
This is useful for controlling cherry-picks precisely.<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
1322a36)gix dirwalk as a way to run gix-dir directly (add4cf4)ab2fee1)2cb17b2)e10d5f6)0771cb2)gix merge tree --message '' to allow creating commits (6ab327e)
</details><csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
115e208)d6c5b9d)
</details>expose raw commit/tag actor headers for round-tripping. Note that this means you have to call CommitRef::commiter|author()? and TagRef::tagger()? inst
<csr-id-1955b5b1a436518c036cfc9bf642170f9c7b6540/> expose raw commit/tag actor headers for round-tripping.
Note that this means you have to call CommitRef::commiter|author()? and TagRef::tagger()? instead
of assuming pre-parsed fields.
This PR makes signature handling truly lossless for "creative" emails and other info. We now stash the raw name <email> slice on IdentityRef/SignatureRef and fall back to it when rewriting, so even commits with embedded angle brackets round-trip cleanly (might want to expand to other malformed characters before merging? Parsing and serialization honor that flag but still keep strict validation for normal input. I also added regression coverage for these scenarios.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
21fecdf)f8435ea)6bf895c)f471ac5)6f7b23a)1955b5b)93dd630)703644c)
</details>2 commits contributed to the release.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
82ff92f)fbf9c39)
</details>3 commits contributed to the release over the course of 1 calendar day.
<csr-id-6f469a6fea59c88e6c69a5f94b0bc8a5977cb75b/>
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
bdcce5f)doc_auto_cfg feature to fix docs.rs documentation. (6f469a6)3313233)
</details>9 commits contributed to the release over the course of 70 calendar days.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
89fb308)8699d0f)4da2927)b188a7d)6cc8464)e9cd429)9365cc3)838ff95)dc7343c)
</details>A maintenance release without user-facing changes.
A maintenance release without user-facing changes.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
79ba9d0)gix-ref release (5315180)651f9fa)4289ae6)202bc6d)
</details>Make Commit parsing more lenient so it can read older commits with botched gpg signatures, see this commit for details.
Make Commit parsing more lenient so it can read older commits with botched gpg signatures, see this commit for details.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
d64f257)5e0122d)ef73c6b)8ad43f1)a0660fe)a86f67b)589d63e)007e3f6)473fe52)428412c)784c046)
</details>4 commits contributed to the release over the course of 12 calendar days.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
5a919c4)65037b5)dab97f7)a9a8ea1)c2eb0c1)bfb1c34)f8d7c0a)gix-config/gix-object benches to changes in criterion (91aef25)151e3a5)3820a0f)6c6dfd0)c9a312e)8d4c4d1)
</details>3 commits contributed to the release over the course of 1 calendar day.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
e104545)5f7f805)631f07a)
</details>Allow round-tripping for Trees Change the internal representation of EntryMode to fix a round-trip issue.
<csr-id-a168807b2d354bdcd51f1c4758d2407dab98362f/>
<csr-id-c97d1d4e350db9d1499fb58db13afe8ffc9ebae6/> Store the raw time in Commit
<csr-id-5bfc2f540aac5be997159e93783d56ed147b0a2f/> Allow round-tripping for Trees
Change the internal representation of EntryMode to fix a round-trip
issue.
Prior to this change, both b"040000" and b"40000" mapped to
0o40000u16.
After this change,
b"040000" is represented by 0o140000b"40000" is represented by 0o40000<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
103819d)cc5b696)49fa9f3)db0b095)0bf84db)3b1bef7)c3c6504)gix-date and gix-actor (afdf1a5)70097c0)c97d1d4)46227e6)06bf1e1)5823b22)Cargo.toml files in workspace to gix-features bump (6315536)b5e9059)68e6b2e)1612c73)fc5faf2)c13a403)38e1055)6307f57)5bfc2f5)a168807)420e730)
</details>Resolve Winnow deprecations (`3cd3e2a`)
<csr-id-866affde8ef17f201884b8a4b36cc4c7f449d6fe/>
commit::ExtraHeaders::find_pos(), and expose "gpgsig" header name.
That way it it's easier to manipulate existing extra-header fields.CommitRef|TagRef|BlobRef::into_owned() as shortcut.
Otherwise one would have to know it converts into Commit via From.<csr-id-f69890cafd08db95231a02d08fbbcb02689e99c4/> Support empty tags with or without trailing NL When representing an annotated tag with an empty commit message, we used to only support a tag ending with two newlines (one after the tagger line + one after the empty commit message).
This was due to a misconception that annotated tags ending with a single
NL shouldn't exist in the wild since there isn't an obvious way to
create them from with git.
This misconception shows up in the discussion thread for
issue 603
It turns out that both encodings of empty annotated tags appear in the wild.
We must be able to parse either and roundtrip for either.
Before PR 604, we
used to special case the empty tag msg case and not add a NL.
To be able to represent b"", b"\n", b"\n\n"..., we special case
any message that is a pure sequence of b'\n' and actually parse the
b'\n' into the tag's message.
This allows us to calculate the correct size that matches the number of bytes that git would produce, as well as round-trip to and from the commit encoding.
The existing tests (in particular round_trip for empty.txt and
empty_missing_nl.txt) convince me that the logic is sound.
Also, the size being 139 bytes for empty_missing_nl.txt and 140
bytes for empty.txt matches the output of cat file | wc -l for each
file.
gix_object::compute_hash fallible
compute_stream_hash is already fallible, so we don’t want to keep
the try_* prefix on the fallible API.git_hash::verify::Error instead of bespoke duplicated versions
thereof, and occasionally returning an ObjectId instead of ()
for convenience.<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
Clippy helped 1 time to make code idiomatic.
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
b41312b)38dff41)4660f7a)4501086)a68f115)gix_object::{try_ =>}compute_hash users (3d7e379)gix_object::compute_hash fallible (b5ac93a)fbf6cc8)gix_object::try_compute_hash for migration (f2b07c0)5095f44)4f2b649)54e5764)gix_hash::Hasher::finalize() (4e935ce)gix_hash (baa1430)gix_object::compute_hash in a test and benchmark (7805ffe)gix_object::object_hasher helper (cf261d5)c8c42b4)e5e2c6f)7b17da6)01bd76d)6caee49)f69890c)16a248b)8e96ed3)b4fe425)commit::ExtraHeaders::find_pos(), and expose "gpgsig" header name. (bf85128)Repository::commit() now explains how to create a commit without ref updates. (866affd)CommitRef|TagRef|BlobRef::into_owned() as shortcut. (527fd3d)11ac79c)fdc57e7)0e71412)3cd3e2a)783c4e6)8df0db2)
</details>allow credential fill with gix credential fill to run without a repo
<csr-id-6f469a6fea59c88e6c69a5f94b0bc8a5977cb75b/>
gix credential fill to run without a repo<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
<csr-id-17835bccb066bbc47cc137e8ec5d9fe7d5665af0/>
tree::Entry to EntryRef with FromTreeRefIter::offset_to_next_entry().
Add a function to help resume the iterator without holding onto the data directly.<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
dea106a)1f6390c)7ec21bb)rust-version to 1.70 (17835bc)af704f5)tree::Entry to EntryRef with From (9f26645)0ab4f64)TreeRefIter::offset_to_next_entry(). (8141765)d22937f)
</details>A maintenance release without user-facing changes.
A maintenance release without user-facing changes.
But actually, TreeRefIter now has methods to lookup entries, also recursively.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
c1ba571)7ea8582)39227a9)d7f4991)54e399f)08a86dc)2de935d)579a6f2)32632e9)1c6e4ae)7e66a4a)0cf6d3a)d121fe7)e8b3b41)
</details>add a gix commit sign prototype
gix commit sign prototypegix branch list<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
8699d0f)82f788e)gix commit sign prototype (aacc326)4da2927)6cc8464)gix-blame (a721e74)gix-blame (268dac4)525873f)04650a7)6651548)e537611)gix branch list (58b5060)c149116)gix tag list when JSON is requested (fb2766b)
</details>tree::EntryMode.
This makes it easier to reason about.FindExt now supports empty trees and empty blobs natively.tree::Editor::get() to get entries directly from the editor.
This is useful if in the middle of an edit you'd like to lookup what's there
to choose a non-conflicting name, for example.gix-odb::Write trait to gix-object::Write.
There it's far more useful and plumbing crates are enabled to write
objects without pulling in gix-odb as dependency.<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
8ce4912)bc9d994)0b7abfb)tree::EntryMode. (cd61c25)700cfa5)gix-packetline-blocking copy auto-generated (325588e)7a40648)0f0e4fe)3fb989b)gix-object and gix-odb (96488f7)gix-odb::Write trait to gix-object::Write. (7325c58)FindExt now supports empty trees and empty blobs natively. (29aad45)tree::Editor::get() to get entries directly from the editor. (e2ea398)db5c9cf)
</details>add first debug version of gix tag list
<csr-id-37d3bf24ac1a79302f3e97b97372e4ad381c45e2/> add first debug version of gix tag list
<csr-id-ab52a49a555ab25e6cf632cb0b080eab72958a7d/> gix revision list --long-hashes for faster iteration.
The performance of the short-hash generation was improved as well.
<csr-id-c5bc49f2a02e9b28c2466ea4c7ae711d091ffc96/> support for commitgraph list from..to to exercise the new 'hide' capability.
<csr-id-1df1ebb34dd3e2101d8a112dda66f6bac5261ea7/> Enable precious file parsing in gix CLI by default, allow overrides.
That's pretty neat as one can now set GIX_PARSE_PRECIOUS=0 in the environment
to disable precious file parsing, good to see what difference it makes.
It's also possible to do this wiht gix -c gitoxide.parsePrecious=0.
<csr-id-36a6ffeea7bbde7fb3689ddf2a107e09a50e602c/> add support for multiple blame ranges like gix blame -L <range> -L <other-range> ...
Update the blame subcommand to handle multiple line ranges. This allows specifying multiple -L options similar to the usage of git.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
c7af04d)750ae9b)gix tag list (37d3bf2)c2eb0c1)bfb1c34)dd5f0a4)f933f80)gix revision list --long-hashes for faster iteration. (ab52a49)gix-blame (4afc51d)76eddf8)3e5365c)92febae)commitgraph list from..to to exercise the new 'hide' capability. (c5bc49f)5f9de52)gix CLI by default, allow overrides. (1df1ebb)de13b16)d4461e7)gix blame -L <range> -L <other-range> ... (36a6ffe)gix-blame (8143d69)
</details><csr-id-64ff0a77062d35add1a2dd422bb61075647d1a36/>
TreeRef::to_owned() and Tree::into_owned() for a convenient way to get a fully-owned Treetree::Editor
With it it's easy to alter existing trees or build entirely new ones,
efficiently.Default implementation to Tree<csr-id-4a6bbb1b79991f400be814c68fb45e8e5980a00c/> keep multi-line header value newlines verbatim Previously they were normalized to \n which made round-trips degenerate information.
It's notable that we explicitly do NOT normalize the newline at the very last line of the multi-line header as its part of that line, even though it's also relevant to make the header field valid. The reason is that these can also be written with \r\n, and we don't want to degenerate that information.
<csr-id-cdac4a9b04959b0fc71009b5c828cdcb10a38828/> remove workspace lints from Cargo manifests of fuzz-projects. They are not part of the parent workspace.
<csr-id-a085b7e435317f566f6763f4155243ba3309cd82/> Tree|TreeRef::write_to() will now assure the most basic sanity of entry names.
Previously, it would allow null-bytes in the name which would corrupt the written tree.
Now this is forbidden.
For some reason, it disallowed newlines, but that is now allowed as validation is should
be handled on a higher level.
<csr-id-17573779688e755a786546d5e42ab533088cd726/> remove all workspace dependencies The problem is that with them, we don't notice anymore if the crate changes, because a dependency changes. That also means that older versions of the dependency may stay even though some other crates might pick up a newer version.
Ultimately, this will lead to drift and subtle incompatibilities.
We declare this breaking to enforce a proper re-release.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
Clippy helped 1 time to make code idiomatic.
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
3f7e8ee)795962b)64ff0a7)37c1e4c)af03832)f35b109)7fcf91a)4a6bbb1)9db3f9c)72daa46)cdac4a9)d69c617)TreeRef::to_owned() and Tree::into_owned() for a convenient way to get a fully-owned Tree (7c48556)39d8e03)b5dc45f)Tree|TreeRef::write_to() will now assure the most basic sanity of entry names. (a085b7e)tree::Editor::cursor() to allow speedier creation of sub-trees. (91fa478)tree::Editor (14dfcf0)Default implementation to Tree (71bf808)649f588)beba720)37ba461)2e0ce50)c3a7dcf)29ad2df)f992fb7)ec69c88)c3f173c)1b600f3)bfd5009)f4898b9)0a3ce48)46cd1ae)1757377)
</details>A maintenance release without user-facing changes.
A maintenance release without user-facing changes.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
b3ff033)209b6de)
</details>4 commits contributed to the release.
<csr-id-f952c101cc8686e685074e8604e0f332c06d6767/>
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
A maintenance release without user-facing changes.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
Clippy helped 1 time to make code idiomatic.
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
d19af16)0f25841)2e00b5e)winnow a workspace dependency (78a7e32)12313f2)ae2b733)1d37bf6)f5cd3ba)5871fb1)9fd1090)
</details>A maintenance release without user-facing changes.
A maintenance release without user-facing changes.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
6c5861d)bf3d82a)255920e)9717a25)gix-actor (8dca2d4)1e79c5c)c1d7c02)1dfa90d)tar files (dcab79a)9fa1054)9c65d98)ea12fc2)68cbea8)
</details>A maintenance release without user-facing changes.
A maintenance release without user-facing changes.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
4f98e94)9511416)d3588ca)
</details>allow parsing of commits with broken timestamp. Instead, default to UTC just like Git.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
add first 'debug' version of gix diff file
<csr-id-dd366a52d46078729a6e36468211b97c92c2921d/>
gix diff file<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
Clippy helped 1 time to make code idiomatic.
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
b10cc6f)1039ae9)dd366a5)gix diff file (dbb1532)dce127e)gix-blame (8a31d88)36a846f)7059609)--since (330711d)gix-blame (e7084d8)6acca19)147eb41)16a248b)8e96ed3)
</details>A maintenance release without user-facing changes.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
b050327)52c3bbd)3e5c974)f8ce3d0)
</details>Move off deprecated take_until[01] (`52ede06`)
EntryMode.
This helps testing for one, but might also be useful in other contexts.
After all, this is a plumbing crate.EntryMode canonicalization
This means that mode.kind() and mode.is_* will also work correctly
if the underlying mode wasn't canonicalized, which could happen when
looking at trees that were stored with very old versions of Git.<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
45b4470)f2e111f)5fc379d)c5c69bd)f26f298)a663e9f)e175b20)516e105)face359)ae86a6a)69cb78b)52ede06)9470554)35d2083)
</details>add gix env to print paths relevant to the Git installation.
gix blame -L start,endgix env to print paths relevant to the Git installation.gix blame to the CLI
That way it's possible to see the blame result of any file in the
repository.<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
90fef01)gix blame -L start,end (4a78395)851a7c4)31d83a4). for consistency (ddddf02)gix env to print paths relevant to the Git installation. (75d689f)278125a)6ed9976)4ffe6eb)gix blame to the CLI (80e5804)
</details>A maintenance release without user-facing changes.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
eb6aa8f)6a2e0be)
</details>3 commits contributed to the release.
<csr-id-3bd09ef120945a9669321ea856db4079a5dab930/>
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
972241f)8c492d7)rust-version manifest field back to 1.65. (3bd09ef)
</details>add first 'debug' version of gix log It's primarily meant to better understand gix blame.
gix log
It's primarily meant to better understand gix blame.--tree-favor to gix merge tree|commit.
With it one can decide which side to favor in case of
irreconcilable tree-conflicts.gix merge file now uses THEIRS instead of OURS where needed<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
gix merge file now uses THEIRS instead of OURS where needed (0727b56)29cb775)gix log (c7e04e9)520c832)gix-diff (960773e)--tree-favor to gix merge tree|commit. (471e046)e8ce25f)
</details><csr-id-aea89c3ad52f1a800abb620e9a4701bdf904ff7d/> <csr-id-de400fd0c4959ed60009a2fd71a88d7bcf6d5191/>
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
7d81a76)e1aae19)e78a92b)4454c9d)aea89c3)7d21ce9)5a02529)e2f42dd)2297ca1)8ee1194)5828f37)7df919b)de400fd)1691ba6)7549559)35439de)b6f2b81)
</details>Expose the decoded path, query pairs, and fragment of Git remote URLs separately. Consumers can identify repository paths and inspect HTTP(S) paramete
add Url::path_query_fragment()
Expose the decoded path, query pairs, and fragment of Git remote URLs
separately. Consumers can identify repository paths and inspect HTTP(S)
parameters without implementing scheme-specific splitting and decoding.
Recognize delimiters before decoding and reuse validated original spelling
to borrow decoded bytes. Preserve encoded separators, nested escapes,
ordered duplicate query keys, and literal percent text after construction
or mutation. Query pairs use form decoding (+ becomes space); SSH/SCP
paths, existing accessors, and serialization keep their behavior.
Reference Git's connect.c::parse_connect_url() and url.c at
1630431f326e. Use fetch-pack --diag-url to check SSH delimiters;
standalone url-parse does not model that transport.
migrate errors to gix-error
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.
Url::path_query_fragment() (cd90fe1)gix merge commit --debug
This yields additional debugging information with details about detected conflicts.gix merge commitsgix merge tree to merge trees similarly to git merge-tree.<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
0b7abfb)gix merge commit --debug (0a5993f)905e5b4)gix merge commits (4a5afc7)a876533)gix (8d590f3)3fb989b)gix merge tree to merge trees similarly to git merge-tree. (84707c2)80e006b)
</details><csr-id-1838cbd36f4c19e07080529ec05ecf6c81218686/> support for querying only the header of an object with the FindHeader trait.
That way one can know its decompressed size and its kind.
We also add a FindObjectOrHeader trait for use as dyn trait object that
can find objects and access their headers.
<csr-id-f984c4c58ca3a47469c1af66f9991c989f0d3e49/> Add Find and Exists trait and extension FindExt to easily find objects.
This is more convenient than having to rely on closures all the time.
Note that Contains::contains was renamed to Exists::exists()
verbose-object-parsing-errors is enabled, it will now once again
provide greater details as to where and why the parsing failed.Copy to Data, BlobRef and TreeRefIterEntryKind.
Please note that EntryKind and EntryMode can be converted from and to each other.<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
55d386a)d3dcbe5)winnow 0.5.24 (abcfb65)51c7abc)dfb3f18)FindHeader trait. (1838cbd)5a0d93e)bb3224c)c372321)ff99a18)EntryKind. (3ac5d0b)55729a5)5825250)53309be)f633f9e)48ef17e)5d78ab3)c8bd660)Copy to Data, BlobRef and TreeRefIter (d25fbae)Find and Exists trait and extension FindExt to easily find objects. (f984c4c)c0e72fb)b65a80b)
</details>support for listing worktrees with gix worktree list
<csr-id-28ac6572722f7ea31795dc0417521c70bcb6ec8f/> <csr-id-786bfec7c2cf25a68705b6ef09ba6390600742b8/>
<csr-id-c7213bcf2cf6be4058a78dbd86bbab4c5ad4afa7/> support for listing worktrees with gix worktree list
<csr-id-0c554e096cf2bf0a2bb91397143f524219693a3b/> add first 'debug' version of gix diff tree.
It's primarily meant to better understand gix blame.
<csr-id-9c8bc03de99e6494abd9755deef7e7be5577bce2/> add new gix cat command.
It only prints things without fuzz.
Inspired by https://youtu.be/JYH5ILv5g1g?si=bHLBPFJiZyRUTl6u&t=211.
<csr-id-3da2da9d7993adc16b19fc63e7524c768a6e2e7f/> add gix merge-file with similar features as git merge-file
<csr-id-7249291016253647c920852fb37eb9e29d615775/> gix merge-base for the CLI
For now it only supports the standard merge-base, but more derivatives
can be added easily on demand.
gix clean warning and help for worktree fixgit clean options
-r/--repositories and --skip-hidden-repositories to make it
clearer what their relationship is, avoid creating the false
impression that repositories are never deleted in the absence of
-r/--repositories, and note that --skip-hidden-repositories
is sometimes needed to preserve not only separate repositories but
the (probably rarer) case of hidden nested worktrees of the current
repository.<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
gix commit-graph is (49bca2a)48aa74b)0bebe52)f186c23)6777ecb)gix diff tree. (0c554e0)31bdd2e)gix cat command. (9c8bc03)5ffccd2)gix merge-file with similar features as git merge-file (3da2da9)e0b09d2)d69c617)649f588)gix merge-base for the CLI (7249291)beba720)f992fb7)ec69c88)472fe5f)786bfec)25a3f1b)b31d6b7)5871fb1)time to jiff (28ac657)a9aac4f)gix clean warning and help for worktree fix (6eb4ea6)c241422)33eacfb)gix worktree list (c7213bc)
</details>compute_stream_hash method as lower-level way of hashing objects.encode::loose_header() now supports large objects even on 32 bit systems.
Previously, larger than 4GB files wouldn't be supported, which causes problems when
genrating hashes even when streaming data.<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
68e5432)1347a54)429e7b2)compute_stream_hash method as lower-level way of hashing objects. (5bb55de)995bc84)b842691)encode::loose_header() now supports large objects even on 32 bit systems. (9283a9d)
</details>preserve allocation failure sources
preserve allocation failure sources
rubberstamp
Keep the original TryReserveError inside the OutOfMemory I/O error so structured classification can distinguish allocator failure without treating malformed stream metadata as corruption.
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.
<csr-id-202f3e48a96b38d32b11d28449358c7d1f3546ff/>
mailmap check similar to git check-mailmap.
That way it becomes a little easier to maybe try out other special cases
in the wild.gix clone with --ref support.
--ref is similar to --branch, but was renamed as it also supports
tags for example.<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
Clippy helped 1 time to make code idiomatic.
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
f107014)mailmap check (3e08fa3)mailmap check similar to git check-mailmap. (2a56387)9fa1054)ecfde07)gix clone with --ref support. (9bf01e4)2f9f0ac)acc1331)bb30e52)bf5a111)src/plumbing/main.rs (4596a39)0b5dc74)202f3e4)
</details>A maintenance release without user-facing changes.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
7891fb1)8a60d5b)
</details>6 commits contributed to the release over the course of 30 calendar days.
Store::at() where possible (17fea2a)<csr-id-886d6b58e4612ac21cc660ea4ddf1dd0b49d1c6e/> checkout respects options for core.protectHFS and core.protectNTFS.
This also adds gitoxide.core.protectWindows as a way to enforce
additional restrictions that are usually only available on Windows.
Note that core.protectNFS is always enabled by default, just like
it is in Git.
<csr-id-addf446f052ff74edcdb083f2b2968b313daa940/> more robustness in the face of a trampling-herd of threads loading a single index. The motivating example is here: https://github.com/praetorian-inc/noseyparker/issues/179
Previously, it was possible for a trampling herd of threads to consolidate the disk state. Most of them would be 'needs-init' threads which could notice that the initialization already happened, and just use that.
But a thread might be late for the party and somehow manages to not get any newly loaded index, and thus tries to consolidate with what's on disk again. Then it would again determine no change, and return nothing, causing the caller to abort and not find objects it should find because it wouldn't see the index that it should have seen.
The reason the thread got into this mess is that the 'is-load-ongoing' flagging was racy itself, so it would not wait for ongoing loads and just conclude nothing happened. An extra delay (by yielding) now assures it either seees the loading state and waits for it, sees the newly loaded indices.
Note that this issue can be reproduced with:
'./target/release/gix -r repo-with-one-pack -t10 --trace odb stats --extra-header-lookup'
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
d6cd449)79dce79)core.protectHFS and core.protectNTFS. (886d6b5)f3d5a69)04ef31e)addf446)
</details>dyn trait where possible.
This reduces compile time due to avoiding duplication.<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
8bd0456)375db06)dynification (f658fcc)dyn trait where possible. (072ee32)363ee77)
</details>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 t
migrate errors to gix-error
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.
<csr-id-84c74ffa698d35f8395c63db6acd3d0e6700d07f/> add gix status --ignored support
<csr-id-66e87cd31c060c3f97ac685ee0541c408f600362/> add gix status --index-worktree-renames
This enables rename-tracking between worktree and index, something
that Git also doesn't do or doesn't do by default.
It is, however, available in git2.
<csr-id-61c002bc4ca5b5345c411e561fdcb492e7ae1d97/> gix status with submodule and rewrite support.
Submodule changes are now picked up as long as the submodule is
in the index.
Further, it's possible to enable rename-tracking between
index and worktree separately.
<csr-id-98b368095ec99d1bc287da7f9294a9fce424deed/> add gix is-clean|is-changed
It's a good way to compare the time it takes to run a full status
compared to a quick is-dirty check.
<csr-id-afd20caadb40b6b793f2099b7232669f9a8f9086/> gix submodules list --dirty-suffix for dirty-information
This is a submodule-centric and greatly simplified way of obtaining
describe information with dirty-suffix.
Note that status information is also possible, but it seems
hard to display nicely, which this command isn't great at
in the first place.
<csr-id-58231b418fa39ea122ef41bb7691289f5b0be855/> add gix commit describe --dirty-suffix
That way a suffix will be added depending on the dirty-state of the repository.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
55f379b)f72ecce)3e5c974)gix status --format to communicate the current format is very simple. (23bea36)gix status --ignored support (84c74ff)gix status --index-worktree-renames (66e87cd)f8ce3d0)gix status with submodule and rewrite support. (61c002b)gix is-clean|is-changed (98b3680)gix submodules list --dirty-suffix for dirty-information (afd20ca)gix commit describe --dirty-suffix (58231b4)
</details><csr-id-ef54aab9e5521add4154ee8d902d62612a9d8d4a/> <csr-id-353b1a788a7c5a627ec73185f841ea4893a147a5/> <csr-id-7649b185c93877e8c8b3cebedf685be8e94a0d9d/>
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
30b2761)f23ea88)0d258f4)nom to winnow in remaining uses in gix-object, gix-ref, and gix-actor for ~20% more performance. (ef54aab)02587fc)winnow to latest patch release (8c41848)be1f4b5)62f7bc6)93fc441)df226dd)a07590c)3f8c91f)12f03db)f0cbf81)9ed7df0)86ea47f)b3f0418)fee441d)b37a909)ac0e81c)86d7fd1)ee75de1)353b1a7)4a4fa0f)7649b18)b37affe)fb95ead)2f9c0dd)
</details>add gix clean --patterns-for-entries|-m to help with wildcards.
gix clean --patterns-for-entries|-m to help with wildcards.gix clean<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
d53504a)-n argument as no-op to make them more compatible. (8959b21)gix clean --patterns-for-entries|-m to help with wildcards. (9863d75)ed79aa7)e25d7eb)cebeedf)454e6b9)4ac597a)4fd6ab8)abe0043)c0c4d59)cc8d008)1ecc96d)fcd585b)face359)gix clean (e8597f3)d4d478b)2482023)39f35da)3ef3bc2)
</details>A maintenance release without user-facing changes.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
4604f83)gix-submodule (f3c4311)6b4a303)ef8ccd9)
</details>7 commits contributed to the release.
<csr-id-7f7353e4525adc308e97b82d27bd301e48da6016/>
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
231ac1c)db63815)422747d)e4d2890)f8b1f55)7f7353e)f852243)
</details>TreeRef::bisect_entry() to correctly find an entry by name
TreeRef::bisect_entry() to correctly find an entry by nameCopy for tree::EntryRef<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
16295b5)c4cc5f2)5cb3589)7734736)TreeRef::bisect_entry() to correctly find an entry by name (424d347)2fc66b5)3f914e8)Copy for tree::EntryRef (437fedc)9064ea3)
</details>Add rev parse --reference. It's similar to git rev-parse --symbolic-full-name.
rev parse --reference.
It's similar to git rev-parse --symbolic-full-name.<csr-id-59b8104a5320d946abc9f5736fa76696cef1459d/> mark gix::interrupt::init_handler() as unsafe
The passed interrupt() argument will be called from a signal
handler, so that needs to be documented and the call sites need to
state that they fulfill the contract.
Thanks to @Manishearth for pointing this out.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
4454c9d)a78caba)0fe20e8)rev parse --reference. (193ffcd)1691ba6)4917beb)gix::interrupt::init_handler() as unsafe (59b8104)
</details>Kind for easier object classification.
This allows to avoid having to think about where to right type lives
for comparisons or matches in simple cases that are about one specific object type.<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
68ae3ff)c70e54f)e4dded0)b82868d)Kind for easier object classification. (695de56)
</details>gix rev parse --format to provide different versions of the same content. This only applies to blobs, but allows to obtain different versions of the s
<csr-id-4aea9b097fb08e504cdfc4a7c3b7511a308dc074/> <csr-id-c6e83cf69f1a17e9ba3010bcce3a4ddd3305424c/> <csr-id-8f795e8abf706a24fe104500bf15efaa2bc07b15/> <csr-id-8dfbb4ba531d86894a59e2b85ec29cd3133c8c4d/> <csr-id-f9ae1bc6b514b6bbcda2c672f7b7ccbd999356a0/> <csr-id-886289f98003f935d774a40f6db746ae70649936/>
<csr-id-cf51a4de2d06eb28435ef8e386131710003b6928/> gix rev parse --format to provide different versions of the same content.
This only applies to blobs, but allows to obtain different versions of the same blob
like:
--trace mode, greatly increase message-buffer size.
That way, it's much less likely that messages will get lost
due to being overwritten before they can be displayed every
100ms or so.GITOXIDE_* environment variables to GIX_#<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
8156340)GITOXIDE_* environment variables to GIX_# (2189cee)5fdc9df)gix rev parse --format to provide different versions of the same content. (cf51a4d)51c7abc)dfb3f18)gix-diff (1706e23)diff::resource_cache() low-level utility for rapid in-memory diffing of combinations of resources. (4aea9b0)5ce9784)c6e83cf)5a0d93e)be1fa2f)bb3224c)1f9aca5)fsck connectivity into just fsck much like git fsck (7ab5c76)7a88b42)8f795e8)48ef17e)--tree-style raw. (8dfbb4b)e7de4c7)-c options are given on the command-line. (f9ae1bc)--trace mode, greatly increase message-buffer size. (b230078)16170d9)gix free discover to inform about repository discovery. (886289f)fb81093)7f2bc08)eab22bd)
</details>A maintenance release without user-facing changes.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
27e8c18)00f96fb)b407461)57a5cd1)
</details>This release includes an overhaul of the url parsing implementation, allowing more urls to be parsed correctly and refining the error messages for inv
This release includes an overhaul of the url parsing implementation, allowing more urls to be parsed correctly and refining the error messages for
invalid ones. Improvements include the added support for ssh aliases (github:byron/gitoxide has previously been parsed as local path), adjustments
around the interpretation of colons in file names (previously we disallowed colons that were not followed up with a slash character) and some smaller
changes that bring the interpretation of file urls more in line with Git's implementation.
There are still many (edge) cases in Git's url parsing implementation which are not handled correctly by Gitoxide. If you notice any such deviation please open a new issue to help us making Gitoxide even more correct.
gix status auto-writes changed indices.
This prevents expensive operations to re-occour.gix status -s/--statistics to obtain additional information on what happened.
This is useful for understanding performance characteristics in detail.<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
681c607)fdd2df8)215c3ac)70923a0)b842691)f929d42)gix status auto-writes changed indices. (46e5919)gix status -s/--statistics to obtain additional information on what happened. (7ba2fa1)
</details><csr-id-bcad5c22049d56a25ef69d6c7a3344e78f9a1d4d/>
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
ea9f942)18b0a37)just fmt (871dd0b)aa16c8c)4f635fc)fe59956)clippy::redundant-closure-for-method-calls lint (bcad5c2)8d2e6a9)gix-actor (4a80e86)gix-date (d575336)
</details>This release contains a security fix which assure URLs like 'ssh://-oProxyCommand=open$IFS-aCalculator/foo' will not execute attacker-controlled strin…
<csr-id-d3ac691446c9d029eb4f04d111887fa06720939d/> <csr-id-ed327f6163f54756e58c20f86a563a97efb256ca/>
This release contains a security fix which assure URLs like 'ssh://-oProxyCommand=open$IFS-aCalculator/foo' will not execute attacker-controlled
strings. The above can, on MacOS, launch the calculator app when using it with gix clone for example, up to v0.29.0.
gix status with basic index-worktree comparisongix free index from-list and gix index from-tree gain --skip-hash.
This flag can be derived from options, but thus far we have no higher-level
writing of the index so this has to do to see the difference in performance.dyn trait where possible.
This reduces compile time due to avoiding duplication.<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
Clippy helped 1 time to make code idiomatic.
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
4ef9a32)ein and gix now share some code via the gitoxide library. (d3ac691)54a8495)gix status with basic index-worktree comparison (f094f71)dynification (f658fcc)dyn trait where possible. (072ee32)prodash (ed327f6)b7560a2)4bfd1cc)0d6d4ec)gix-index and pass skip-hash through for performance.. (713cd59)gix free index from-list and gix index from-tree gain --skip-hash. (3ff5ac0)index.skipHash (773b6e3)
</details>A maintenance release without user-facing changes.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
9a9fa96)just fmt (ffc1276)8f15cec)67da689)0269eed)420553a)89a8cfe)2578e57)dbf8aa1)4795fcf)2087032)3ef5c90)9375cd7)b057500)facaaf6)
</details>sorting of tree entries is now according to specificiation. This means tree entries are compared as if they had a / appended to it.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
add encode::compute_hash() for an easy way to obtain object hashes.
encode::compute_hash() for an easy way to obtain object hashes.<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
Clippy helped 1 time to make code idiomatic.
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
91134a1)30a1a71)6ebd61e)14e64e7)69faad0)encode::compute_hash() for an easy way to obtain object hashes. (ebf3fd4)
</details>gix submodule subcommand for simple submodule listing and information retrieval
gix submodule subcommand for simple submodule listing and information retrievalgix index entries --recurse-subomdules to also list submodules.gix index entries with styles and pathspecs.
This adds support for more simple git style, which is faster and thus
allows for more direct comparisons to git ls-files.gix commit verify-signature to do something akin to git ... --show-signature.<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
8f3f358)gix submodule subcommand for simple submodule listing and information retrieval (1ccbe16)0d258f4)36f7b78)gix index entries --recurse-subomdules to also list submodules. (6bc69e3)a3afaa4)gix (ca972a2)Defaults::from_environment() when parsing pathspecs. (2a99034)gix index entries (22477bd)9f4dfe0)gix index entries with styles and pathspecs. (c30ac0c)f194cfc)f584d76)gix (a201f0d)b37affe)gix commit verify-signature to do something akin to git ... --show-signature. (cd6cfe4)c7d9129)gix-archive (feba76d)b629f8a).gitmodule file abstraction (6a2e6a4)
</details><csr-id-b83ee366a3c65c717beb587ad809268f1c54b8ad/> Rename serde1 cargo feature to serde and use the weak-deps cargo capability.
With it it's possible to not automatically declare all optional dependencies externally visible
features, and thus re-use feature names that oterwise are also a crate name.
Previously I thought that serde1 is for future-proofing and supporting multiple serde versions
at the same time. However, it's most definitely a burden I wouldn't want anyway, so using
serde seems to be the way to go into the future.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
serde1 cargo feature to serde and use the weak-deps cargo capability. (b83ee36)8dbd0a6)7f06458)cdef398)19338d9)b574a39)
</details>8 commits contributed to the release over the course of 29 calendar days.
gix archive<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
1dda48b)4a9d0f1)gix archive, which is where it should shine. (567b1a4)gix archive (32bbb8b)b19a56d)3fbd7b0)3fd5e16)fa04378)
</details>A maintenance release without user-facing changes.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
This release fixes a possibility for V1 fetches to deadlock if negotiation would span multiple rounds (see issue #882) for details.
<csr-id-bcad5c22049d56a25ef69d6c7a3344e78f9a1d4d/>
This release fixes a possibility for V1 fetches to deadlock if negotiation would span multiple rounds (see issue #882) for details.
gix level.
This is merely a debug tool to learn about generation numbers.
All commit-graph commands now operate on a repository.<csr-id-c494cfd6f80cf273107c626d0f2cbe054db378ee/> gix --trace to also print tree-like instrumentation
<csr-id-452ed6b79ed0e12ae214af3c8cd49a87dba91c73/> gix fetch --open-negotiation-graph[=limit]
Open the negotiation graph as SVG, after optionally specifying a limit
as rendering/layouting can be very slow.
It's useful to see how the negotiation algorithm is reasoning about each commit.
<csr-id-096838ffa529148b2da3a2382a2d1fdbfe5bee5b/> gix fetch --negotiation-info to provide additional information about the negotiation phase.
<csr-id-bd32e393fedd01e27a4f6984281bcc3182c63b67/> bit revision list --svg to create a visual graph of commits.
It's mainly a test of how well layout-rs performs.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
Clippy helped 1 time to make code idiomatic.
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
gitoxide publishable again (c16b1df)5861afb)corpus --dry-run and --task-sql-suffix and --repo-sql-suffix (4cef57d)0f973ac)gix-trace (bd6e3d7)aa16c8c)361cf96)gix --trace to also print tree-like instrumentation (c494cfd)cfd8e88)a0b4385)a4300c8)fcbda1d)gitoxide version according to what's in git (83f6466)d9e74ff)036e60a)gix fetch --open-negotiation-graph[=limit] (452ed6b)gix fetch --negotiation-info to provide additional information about the negotiation phase. (096838f)gix docs available when using cargo doc (518159d)bit revision list --svg to create a visual graph of commits. (bd32e39)fe59956)2213321)ff8d42a)750b07a)clippy::redundant-closure-for-method-calls lint (bcad5c2)8d2e6a9)gix level. (b82edc8)gix config tree (7aaaebf)
</details>A maintenance release without user-facing changes.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
e6cc618)addd789)94c99c7)
</details>A maintenance release without user-facing changes.
A maintenance release without user-facing changes.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
add tree::EntryMode::is_blob_or_link(). Returns true if the entry points to a blob or a symlink.
tree::EntryMode::is_blob_or_link().
Returns true if the entry points to a blob or a symlink.<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
Allow ObjectId, oid, ChangeId, Prefix, HexDisplay, and ReverseHexDisplay to compare with str and String values without allocating, reusing the existin
compare hash types with text
Allow ObjectId, oid, ChangeId, Prefix, HexDisplay, and ReverseHexDisplay to
compare with str and String values without allocating, reusing the existing
stack encoders and Kind::hex_buf().
Make full object and change ID comparisons symmetric but intentionally less
lenient than parsing: only their exact canonical lowercase spelling compares
equal. Uppercase input remains parseable, but treating differently-cased strings
as equal through the same hash would violate PartialEq transitivity even though
the strings differ from each other.
Keep Prefix and truncated display comparisons directional, with the hash value
on the left, because their text omits the hash kind or remaining digest and
therefore cannot uniquely identify the structural value. This prevents distinct
hashes from forming non-transitive equality chains through a shared textual
prefix.
bstr v1.3, use *.as_bytes() instead of .as_ref().
as_ref() relies on a known target type which isn't always present. However, once
there is only one implementation, that's no problem, but when that changes compilation
fails due to ambiguity.<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
9604783)bstr v1.3, use *.as_bytes() instead of .as_ref(). (135d317)
</details>Allow 'refactor' and 'other' in conventional messages if they have breaking changes (`4eebaac`)
<csr-id-2290d006705ff47ad780b009fe58ee422b3285af/> <csr-id-598698b88c194bc0e6ef69539f9fa7246ebfab70/> <csr-id-9c8a36f35b1e8dad66befb102e5a8670b4a6c2b2/> <csr-id-5d57c1f7e3b9a84f7b46a4378015572155f3104b/> <csr-id-3b9d66c932075feb08cdf2967f7698daef9fd3ff/> <csr-id-ec3be19c8d007565b814b4757f17811ec0e9de2c/> <csr-id-899c57927ce4ba2e1b5d8182f9e731c2a9094cba/> <csr-id-f7f136dbe4f86e7dee1d54835c420ec07c96cd78/> <csr-id-322b2901382192d3b4ac0fbae32381a9abb49fa9/>
<csr-id-3d8fa8fef9800b1576beab8a5bc39b821157a5ed/> upgrade edition to 2021 in most crates. MSRV for this is 1.56, and we are now at 1.60 so should be compatible. This isn't more than a patch release as it should break nobody who is adhering to the MSRV, but let's be careful and mark it breaking.
Note that git-features and git-pack are still on edition 2018
as they make use of a workaround to support (safe) mutable access
to non-overlapping entries in a slice which doesn't work anymore
in edition 2021.
bstr to 1.0.1commit::ref_iter::Token::into_id() to *::try_into_id()
This makes the method more consistent.<csr-id-14d613303b8663daac1ab1eed8413266594050c3/> Object::try_into_blob_ref() as alternative to consuming *::try_into_blob()
<csr-id-5095df949d30b57b09bd68355743d255a897365f/> add tree::EntryMode::is_blob() to quickly determine if an entry is a blob.
<csr-id-b1c40b0364ef092cd52d03b34f491b254816b18d/> use docsrs feature in code to show what is feature-gated automatically on docs.rs
<csr-id-517677147f1c17304c62cf97a1dd09f232ebf5db/> pass --cfg docsrs when compiling for https://docs.rs
<csr-id-4f4bba23a13f11050e35887da004e48148d68aea/> tree::EntryMode::as_str() to display itself as a string.
<csr-id-0d22ab459ce14bc57549270142595d8ebd98ea41/> TagRefIter::tagger().
Additionally ergonomics have been improved as the iterator is now
Copy, similarly to the other iterators.
<csr-id-a39bf71531ee0a6c8db082758d3212c805ce2bf0/> support for trimming of whitespace around name and email It's separated from parsing to assure we can round-trip, but it's made easy to obtain trimmed results using new methods.
This high-level git-repository will also trim by default now.
<csr-id-8f1b42b193098f6e116b3522a3df08d5d1b42a0a/> CommitRef::time()
A shortcut to allow for fluid retrival of the committer.time.
<csr-id-c51a9252f8a038bf995d50cdbfc8356362020bbc/> CommitRefIter::(author|committer)(), better usability
The methods returning an iterator are now consuming, which allows
them to be nested by callers.
<csr-id-91065cd790f559f4a661ecd9c2d2f649922682e3/> CommitRefIter::parent_ids()
Allocation-free parent retrieval.
<csr-id-5c573bf9abfc10227d5a900100e84d7f8f6c0504/> in-manifest and in-lib feature documentation
<csr-id-eb36a3dda83a46ad59078a904f4e277f298a24e1/> Add sorting mode to ancestor traversal #270
<csr-id-a0bb6529216160d14e67b97206a51140099fd245/> add Data object
This is typed data baked by a slice for conversion into parsed ObjectRef's
for example.
This is usually the result of a Find operation on an object database.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
Clippy helped 17 times to make code idiomatic.
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
52b38bc)e695eda)0c81769)a517e39)4eebaac)4a9a05f)f536bad)a0bc98c)e1861ca)58ab2ae)c857d61)6b5c394)9d6f263)719b6bd)BodyRef::without_trailer() for more obvious access than *body or body.as_ref() (f0ea526)ef3fc6d)CommitRef::message_trailers() as shortcut… (5324391)c3b0161)BodyRef::trailers() allows iterating trailer tokens and values (175e1cb)3953c24)MessageRef::body() methods (1714d05)7055dc8)b439186)35313b9)cd11704)d9afc22)13646e8)d1e6f62)909f668)1ec47de)d0a956f)13e7c3a)cd3fc99)001e8c2)f4b8a0d)625be8d)message() method and MessageRef type… (6150b2d)598698b)6776a3f)a88981b)5eb0230)ea169a6)84cb256)TagRefIter::tagger(). (0d22ab4)caa7a1b)oid where possible in git-odb (68a709e)be84b36)ca78d15)accf89d)a3f2816)fdbe704)git_hash::*::Digest to Id (188d90a)rust-version to 1.64 (55066ce)6340296)8c0bca3)e313112)6efd0d3)6ccc88a)c9275b9)git-testtools to gix-testtools (b65c33d)fb92865)git-pack to gix-pack (1ee81ad)git-odb to gix-odb (476e2ad)git-index to gix-index (86db5e0)git-diff to gix-diff (49a163e)git-commitgraph to gix-commitgraph (f1dd0a3)git-mailmap to gix-mailmap (2e28c56)git-discover to gix-discover (53adfe1)git-chunk to gix-chunk (59194e3)git-bitmap to gix-bitmap (75f2a07)git-protocol to gix-protocol (823795a)git-refspec to gix-refspec (c958802)git-revision to gix-revision (ee0ee84)git-transport to gix-transport (b2ccf71)git-credentials to gix-credentials (6b18abc)git-prompt to gix-prompt (6a4654e)git-command to gix-command (d26b8e0)git-packetline to gix-packetline (5cbd22c)git-worktree to gix-worktree (73a1282)git-hashtable to gix-hashtable (26a0c98)git-worktree to gix-worktree (108bb1a)git-url to gix-url (b50817a)git-date to gix-date (9a79ff2)git-attributes to gix-attributes (4a8b3b8)git-quote to gix-quote (648025b)git-config to gix-config (3a861c8)git-ref to gix-ref (1f5f695)git-lock to gix-lock (2028e78)git-tempfile to gix-tempfile (b6cc3eb)git-object to gix-object (fc86a1e)git-object to gix-object (2320358)git-actor to gix-actor (4dc9b44)git-validate to gix-validate (5e40ad0)git-hash to gix-hash (4a9d025)git-features to gix-features (e2dd68a)git-glob to gix-glob (35b2a3a)git-sec to gix-sec (eabbb92)git-path to gix-path (d3bbcfc)git-config-value to gix-config-value (622b3e1)109f434)1ecfb7f)c196d20)7c846d2)1e544e8)39ed9ed)bac57dd)hex_to_id() (6fa950d)1fea18f)0e3d0a5)d679f5b)5ac9fbe)30d8ca1)e6b9906)7114bbb)7717170)bcd9654)b2c301e)e4648f8)a5b1d73)0a6d888)Tag at the cost of some duplication (dd0a23d)parents in Commit to match typical single-ancestor chains (7242d1f)c02a6bd)6003fa2)0e4462d)3d8fa8f)f0dfa4c)3bd3380)d071583)423af90)5406630)1919e8e)Object::try_into_blob_ref() as alternative to consuming *::try_into_blob() (14d6133)104d922)d232567)702a161)93917cb)1dc2a5d)2df3c73)c89c7ff)82fd251)30712dc)tree::EntryMode::is_blob() to quickly determine if an entry is a blob. (5095df9)25a7726)29a043b)fd14489)c9eda72)e10554d)9aa1d3d)1d4600a)1f6e5ab)5869e9f)da0716f)bc64b96)cef0b51)85a3bed)867fc20)cfa1440)4974eca)e2ee3de)31c2351)b1c40b0)f7f136d)5176771)bd5f3e8)c96473d)c06ae1c)232784a)2f506c7)ce885ad)9b9ea02)6da8250)7b61506)4737b1e)3c50625)085e76b)89ea12b)daa71c3)e1003d5)a22b1d8)598c853)654cf39)7cb1972)56d7ad7)ef9242b)f0cbb24)3079e11)b2df941)77b7cd9)40c48c3)c35e62e)08fe550)e959af8)0db19b8)b7e3a4a)ad3c803)8f57c29)d78aab7)373cbc8)8900d69)4624725)6add377)eb36a3d)commit::ref_iter::Token::into_id() to *::try_into_id() (fda2a8d)7dd2313)d3f9227)acd3737)ec38950)5982406)ee737cd)f606fa9)f69b2d6)39b40c8)ac8015d)3d1565a)d88e377)bab9fb5)0e02953)59ffbd9)a474395)21541b3)bf0106e)d78d382)4ea1126)e56af5a)883343b)d4fc81f)commit() for a possible less-allocating future (0fd01f7)c569f83)33a8fb3)a98d298)2c55ea7)49f5453)6efd90d)c5de433)78bacf9)7c559d6)058f68a)70e11c2)2fd23ed)b201b32)216dd0f)472e13b)60b9365)e603306)45d3934](https://github.com/GitoxideLabs/gitoxide/commit/45d393438eac2c7ecd4767092Your coding agent can read these notes before it upgrades. Set up the MCP server →