NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
crates.io · #1433 most downloaded on crates.io
A crate of the gitoxide project for implementing git protocols
Last release 13 days ago
25 Sep 2026
Ships on a steady schedule
a new release about every 4 weeks
Nearly every release is documented
notes for 56 of 57 stable releases
1 version withdrawn
withdrawn after publishing
4 years old
58 releases · first in 2023
One column per quarter.
Nothing published for this version
4 commits contributed to the release over the course of 1 calendar day.
6 commits contributed to the release over the course of 30 calendar days.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
0c541c7)d2af4ed)ebe9095)cc3ee80)ab4fcb0)ae8845a)
</details>replace maybe-async with bisync. Replace the globally feature-selected maybe-async dependency with bisync 0.3 and re-export the locally selected macro
<csr-id-c3f2244541f0b6419d30782fbae825d33bd5fe16/> replace maybe-async with bisync.
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.
<csr-id-582d7b56cc09cdafaa8db2fb34457f6970c39ce7/> adapt to lifetime-free configuration files in gix-config
Update repository configuration storage, snapshots, overrides, and caches
to use the self-contained gix_config::File representation. Configuration
can now move through repository initialization, cloning, and remote setup
without artificial input lifetimes or conversions to 'static.
BString, PathBuf, OsString, and FullName values
from configuration-derived lookups.Option<Result<T, E>> to
Result<Option<T>, E>, allowing errors to propagate naturally with
?.AsBStr in
configuration setters, converters, remote lookup, and remote saving.Cow construction, into_owned(), and redundant
cloning from configuration consumers.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.
<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)adf4b7a)2619919)maybe-async with bisync. (c3f2244)c16b5a1)43ff87a)55b5158)gix-config (376e946)gix-config (582d7b5)cf3053a)27aec47)e9c973d)d533f0c)1b1541e)
</details>echo object-format in all v2 commands A v2 client must report its object format to the server, otherwise the server assumes SHA-1 and aborts the reque
<csr-id-6a7e5f432f00481dd2260161a83b5b41d4978fed/> echo object-format in all v2 commands A v2 client must report its object format to the server, otherwise the server assumes SHA-1 and aborts the request with a "mismatched object format" error when talking to a SHA-256 repository.
This affects both ls-refs and fetch. A persistent connection retains the object format negotiated during ls-refs, but a stateless transport like HTTP sends each command as its own request, so every v2 command must echo the object-format the server advertised.
So add the echo to Command::default_features so it applies to every v2
command and permit object-format during v2 feature validation.
Also add v2 wire-format sha256 tests for ls-refs and ref-in-want.
<csr-id-96bf6982a8c3f459a10b96314643c50603f6e8f0/> accept sha256 object-format from servers
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
6428edc)d86b01d)048d4a5)da6b267)ed998d1)6a7e5f4)96bf698)155ff6d)9402adc)f7d4f33)
</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-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)ab2fee1)2cb17b2)e10d5f6)3675a8d)adb8328)
</details>remove winnow and replace it with hand-implemented parsers everywhere. This will allow for simplified maintenance and editing (both human and machine)
<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)winnow and replace it with hand-implemented parsers everywhere. (91c854e)4d5ba23)
</details>This is also a breaking change to LsRefsCommand::new() which now takes Option as first parameter.
<csr-id-c86b00b50fa756cce4e117878a6e10de489674d3/> Introduce RefPrefixes type
The RefPrefixes type captures the intent of building a set of
ref-prefix arguments for the ls-refs protocol.
Since refspecs are the natural type that these are built from, as seen
in handshake/mod.rs, a constructor is provided in the form of
RefPrefixes::from_refspecs.
For other, external API users RefSpecs::new and RefSpecs::extend
are provided.
This is also a breaking change to LsRefsCommand::new() which now takes
Option<RefPrefixes> as first parameter.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
f9fbcba)444a92b)package.include patterns more specific so they don't match ignored files (c2c917f)44020e0)9d04035)700ad9e) ([df41a64`](https://github.com/GitoxideLabs/gitoxide/commit/df41a64851de31b5b5581b39efe18af4e5becfbc))82674cb)c86b00b)98bae84)
</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)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>
c389a2c)6183fd0)6bdb331)e8bf096)sha1 and sha256 features to gix. (3832916)gix-hash (e71c703)f7277f3)
</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.
nonempty in gix-protocol<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
ecf90fc)29040a8)nonempty in gix-protocol (78b0a6f)9327b73)
</details>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
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.
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)<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
d66ac10)8bceefb)7ce3c55)f7d0975)
</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)std::ops::ControlFlow where possible<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
cbbdef5)562e684)std::ops::ControlFlow where possible (5c1bd03)0a333e5)c663b3f)7be8f90)9e1ba5e)3bc0c47)211b4fb)
</details>2 commits contributed to the release over the course of 9 calendar days.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
115e208)d6c5b9d)
</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-id-37a42bde69d1a80080f91a78514565508b278876/> <csr-id-0f58b0184b34df3b4e530ce4f7ab26369f882f99/> <csr-id-e5498415a704859fe8385b09e46539372df04d9f/> <csr-id-7e08219644fb84550b82e4c36cdec2d08a06136d/> <csr-id-ab3cce472efc4f6469d99a0d3a425d58ac2140b9/> <csr-id-c26efb9e733cb33a38ef885eded915e17e61bd9c/> <csr-id-0021f9daec773f381c6f10bd310cd0f8c5077d54/> <csr-id-7a60e7846a0e077a1c7f6d560461ee81ae0d4e85/> <csr-id-3b4e06ac9f6b600f58c459a034e6cfaac7221514/> <csr-id-3bc580173ca8f6e95f0e8996a05a451dc199dfa3/> <csr-id-c6d76885bdddc2d6a230618b8ba3f4ebae715987/> <csr-id-149bcfca6a35ebfd7493ee8517905a6b6ca58dd5/>
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
21fecdf)eab774c)9d936fb)ab3cce4)c26efb9)0021f9d)7a60e78)37a42bd)0f58b01)3b4e06a)3bc5801)e549841)c6d7688)149bcfc)93dd630)703644c)7e08219)
</details>make gix-packeline features additive. For good measure, everything that was touched is marked as breaking change.
<csr-id-4c40484391c32b4d42b5904a1a0c42639369673e/> <csr-id-36c2be80e61a7a0ef637a5385e1960de13261984/> <csr-id-541a7a6aab6a56fa2949a5577acbacf6dc59a9dd/> <csr-id-19a005135b91641a19a3a70fd714985ce1203333/> <csr-id-50120de92dab3d8347672df7a43df02291162c9a/> <csr-id-37ab03687a940c89131141b882e5ef1a7fef85be/> <csr-id-f05dfab881481de5de1d23e3266cad9c069f59c5/> <csr-id-b05eba5cca4294b9baeafd0c15885cefd21d0d6c/>
Handshake::ref_map() to produce a ref-map from a V1 or V2 handshake.gix-packeline features additive.
For good measure, everything that was touched is marked as breaking change.<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
82ff92f)3c2b422)service parameter back to not hardcode the handshake for fetches. (c9a97db)server parameter. (36c2be8)0ac3080)Handshake::ref_map() to produce a ref-map from a V1 or V2 handshake. (aeee982)handshake::Outcome into Handshake type. (541a7a6)48fdf5d)19a0051)4c40484)50120de)37ab036)f05dfab)b05eba5)102077b)7ce40ef)87d5419)6e89afa)c2050d0)6566ec9)b6d5822)cbf7445)7289a04)bce8468)gix-packeline features additive. (f2c6a19)fbf9c39)
</details>add gix free trust to easily check the assigned trust level of any given path This is particularly useful on Windows, which makes it easy to probe exi
gix free trust to easily check the assigned trust level of any given path
This is particularly useful on Windows, which makes it easy to probe existing paths
with ownership that might be complex to reproduce otherwise.<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>
a96587c)gix free trust to easily check the assigned trust level of any given path (ab2016f)2a5db88)e4f380e)50fb46f)gix-config. (344218a)
</details><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>Merge pull request #2163 from cruessler/deprecate-in-place-methods (`42f8db5`)
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
49f8d53)89fb308)4da2927)b188a7d)6cc8464)9365cc3)838ff95)42f8db5)gix-ref (44922d0)dc7343c)79ba9d0)651f9fa)4289ae6)202bc6d)d64f257)589d63e)007e3f6)473fe52)428412c)784c046)
</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/>
Clippy helped 1 time to make code idiomatic.
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
5a919c4)65037b5)c2eb0c1)bfb1c34)f8d7c0a)151e3a5)c3f06ae)d2b4c44)28935a5)dbf65c9)8d4c4d1)
</details>3 commits contributed to the release.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
e104545)5f7f805)631f07a)
</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>
futures-lite instead of dep:futures-lite in gix-packetline and
gix-protocol.<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
cc5b696)49fa9f3)db0b095)0bf84db)3b1bef7)c3c6504)46227e6)06bf1e1)5823b22)Cargo.toml files in workspace to gix-features bump (6315536)b5e9059)68e6b2e)1612c73)fc5faf2)19f50d0)11bd59f)420e730)
</details>Resolve Winnow deprecations (`3cd3e2a`)
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>
d248e3d)ada5a94)b41312b)38dff41)5cb5337)gix_fs::stack::ToNormalPathComponents everywhere. (1f98edb)16a248b)8e96ed3)11ac79c)fdc57e7)3cd3e2a)783c4e6)8df0db2)
</details>7 commits contributed to the release over the course of 27 calendar days.
<csr-id-17835bccb066bbc47cc137e8ec5d9fe7d5665af0/>
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
dea106a)1f6390c)af8f201)gix-refspec (6d7dd9b)7ec21bb)rust-version to 1.70 (17835bc)d22937f)
</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-e59fc09f12a1c6b27d878525ff6074ac846aa87e/> move all possible code from gix to gix-protocol.
For now, just move the code down and immediately re-integrate in gix
to be able to use its tests to validate it.
This is a breaking change as some types move and change the layout.
<csr-id-6367c7d0a796aff8ee8778916c1a1ddae68b654d/> Add gix-shallow crate and use it from gix and gix-protocol
That way it's easier to reuse shallow-handling code from plumbing crates.
Note that this is a breaking change as gix-protocol now uses the gix-shallow::Update
type, which doesn't implement a formerly public from_line() method anymore.
Now it is available as fetch::response::shallow_update_from_line().
ref_map from fetch() function.
It's only uses for validation of the ref-maps own state, which
is something that can be separate.fetch() to tests so they are the only ones with delegates.
This is a first step towards creating a multi-step fetch() which can
also be used in the gix crate.<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
beb0ea8)c1ba571)7ea8582)ca54b8c)5c21ebc)a5f0d29)a542775)ref_map from fetch() function. (5950926)ddeb97f)gix to gix-protocol. (e59fc09)gix-shallow crate and use it from gix and gix-protocol (6367c7d)fetch() to tests so they are the only ones with delegates. (212ea9e)d7b1cce)e8b3b41)
</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>
4000197)8ce4912)bc9d994)700cfa5)gix-packetline-blocking copy auto-generated (325588e)7a40648)0f0e4fe)db5c9cf)
</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><csr-id-64ff0a77062d35add1a2dd422bb61075647d1a36/>
<csr-id-24da857dbd236ae1cc75a4efd0816e717b885c7f/> make V1 shallow announcements possible
<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>
24da857)f1364dc)3f7e8ee)795962b)64ff0a7)37c1e4c)af03832)612896d)6c82f31)649f588)beba720)37ba461)fc45c93)2e0ce50)f992fb7)ec69c88)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>
4fe330e)f2b522d)a65a17f)d19af16)0f25841)2e00b5e)winnow a workspace dependency (78a7e32)5871fb1)9fd1090)f6a4eb9)
</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>
6232824)a1b73a6)0470df3)99c00cc)c1d7c02)9fa1054)
</details>3 commits contributed to the release over the course of 1 calendar day.
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>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>A maintenance release without user-facing changes.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
095c673)5755271)
</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>
b050327)52c3bbd)3e5c974)f8ce3d0)
</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>
45b4470)f2e111f)5fc379d)c5c69bd)f26f298)a663e9f)e175b20)516e105)69cb78b)9470554)
</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>
eb6aa8f)6a2e0be)b6c04c8)
</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>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>
<csr-id-aea89c3ad52f1a800abb620e9a4701bdf904ff7d/>
<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>
e1aae19)e78a92b)4454c9d)aea89c3)d38d1cc)1691ba6)98b08f4)ff1542c)prodash to latest version (97f62cb)
</details>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><csr-id-6295dec2bdd6c3bb35e45db7a486651ebfe50369/> V1 negotiation won't hang anymore The logic previously tried to estimate when a pack can be expected, and when a NAK is the end of a block, or the beginning of a pack.
This can be known because a pack (with our settings) needs two things:
done sent by the client<csr-id-c3edef1c0c49accbb037bdf086dade3ed0e5e507/> make it possible to trace incoming and outgoing packetlines. Due to the way this is (and has to be) setup, unfortunately one has to integrate that with two crates, instead of just one.
This changes touches multiple crates, most of which receive a single boolean as last argument to indicate whether the tracing should happen in the first place.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
6295dec)d3fd11e)55d386a)d3dcbe5)d2ba97c)88f8b34)winnow 0.5.24 (abcfb65)51c7abc)5a0d93e)bb3224c)c0e72fb)b65a80b)eb23338)e7de4c7)c3edef1)
</details>bump gix-transport version to prevent it from being picked up. gix-transport v0.37.1 could accidentally be picked up by older, incompatible, gix versi
<csr-id-8011c73ee401bfca03811a249c46a4dd468af1b8/> bump gix-transport version to prevent it from being picked up.
gix-transport v0.37.1 could accidentally be picked up by older, incompatible,
gix versions which now fail to build.
Thus v0.37.1 is now yanked and replaced with v0.38.0 along with a new
release of gix to go with it.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
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>
14ddbd4)68e5432)1347a54)
</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>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>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-ed327f6163f54756e58c20f86a563a97efb256ca/>
prodash::Count to indicate that nothing more than counting is performed, in place of prodash::Progressdyn 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>
1ff3064)8bd0456)375db06)dynification (f658fcc)dyn trait where possible. (072ee32)prodash::Count to indicate that nothing more than counting is performed, in place of prodash::Progress (24dd870)16cac47)444f970)237657e)8c80dba)b213889)659ebe9)8609aec)b46fe9c)0e8edef)prodash (ed327f6)b7560a2)3be2b1c)363ee77)
</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><csr-id-229bd4899213f749a7cc124aa2b82a1368fba40f/>
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
6c62e74)30b2761)f23ea88)229bd48)4604f83)
</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>fetch::Arguments::add_feature() for unconditional additions of arguments that are supposed to be features.
This differentiation is important to support V1 and V2 correctly, which have a different notion of features with V1
special-casing them, and V2 just sees everything as arguments.handshake::Ref::Symbolic now has a tag field.
This allows symbolic refs to be parsed which are in fact pointing
to an annotated tag as in-between object.<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
231ac1c)db63815)e4d2890)f8b1f55)fetch::Arguments::add_feature() for unconditional additions of arguments that are supposed to be features. (d1f9c63)handshake::Ref::Symbolic now has a tag field. (0de7117)
</details>3 commits contributed to the release over the course of 1 calendar day.
A maintenance release without user-facing changes.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
0062971)107a64e)16295b5)c4cc5f2)5cb3589)2fc66b5)9064ea3)
</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>A maintenance release without user-facing changes.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
4aca8c2)68ae3ff)c70e54f)e4dded0)
</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>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)
</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><csr-id-bcad5c22049d56a25ef69d6c7a3344e78f9a1d4d/>
SecondsSinceUnixEpoch type where needed.
Previously we used usize which isn't correct on 32 bit systems.<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
ea9f942)18b0a37)aa16c8c)4f635fc)fe59956)clippy::redundant-closure-for-method-calls lint (bcad5c2)8d2e6a9)SecondsSinceUnixEpoch type where needed. (9f8fa22)
</details>support capabilities^{} syntax to announce caps in empty repos under V1 This is supposed to work for existing code, but doesn't in our case as we real
capabilities^{} syntax to announce caps in empty repos under V1
This is supposed to work for existing code, but doesn't in our case as we really
want to associate a branch. In this case, we can ignore the ref as it's a null
hash anyway.<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
2560a2c)298f3d7)capabilities^{} syntax to announce caps in empty repos under V1 (c8e8b9f)
</details>assure we don't stop early on NAK if READY was sent to handle V1 specialty. Seeing READY means a pack will follow, which is exactly the kind of knowle
<csr-id-88670c2ff995e4478f4a40b2733c6c8ca811fa15/> assure we don't stop early on NAK if READY was sent to handle V1 specialty. Seeing READY means a pack will follow, which is exactly the kind of knowledge we want. Thus we now either listen to the client OR to what the server says.
Note that this remedy relies on multi-ack-detailed, which some very old servers might
not support. For those we would be out-of-luck, but that seems acceptable.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
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><csr-id-877aa2921d8491d301945f86d5a69382e40fb081/> Add fetch::Arguments::is_stateless() to aid proper use of arguments.
When arguments are used, haves are reset every round in stateless protocols, while
everything else is repeated. However, this also means that previously confirmed common
commits aren't repeated unless this is specifically implemented by the user of Arguments.
That caller can now easily determine if negotiations have to be compensated for.
Please note that Arguments explicitly doesn't implement repeating of all prior arguments, which
would also repeat a lot of in-vain haves.
include-tag is now properly handled in V1 fetch arguments
Previously it would be added like it's V2 arguments, which makes using it
in V1 impossible.<csr-id-6a3c02131c9ebca911be5f751e5a6c67fbdbf609/> make V1 stateless negotations work. This is done by working around another V1 negotiation oddity by exploiting client-side knowledge. For very old servers, we probably wouldn't be able to do multi-rounds without dead-locking, but with recent-enough (probably 10 years or so) old git servers all should work fine.
All this to not actually have to implement the V1 strangeness, allowing our code to work smoothly with all permutations of stateless/stateful connections and V1/V2 interactions, with a single high-level implementation essentially.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
9a9fa96)8f15cec)ae845de)6a3c021)include-tag is now properly handled in V1 fetch arguments (c5dc7b4)fetch::Arguments::is_stateless() to aid proper use of arguments. (877aa29)gix-transport (60eaceb)420553a)2578e57)150463c)3ef5c90)9375cd7)facaaf6)
</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>
7ebc9f7)0135158)43ebaf2)
</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-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/>
Clippy helped 1 time to make code idiomatic.
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
serde1 cargo feature to serde and use the weak-deps cargo capability. (b83ee36)d7173b2)e4df557)91134a1)30a1a71)6ebd61e)14e64e7)8dbd0a6)cdef398)19338d9)b574a39)
</details>2 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>
don't assume that credential providers always return credentials or error during handshake. The type-system allows this even though when getting crede
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
5dc1f9f)3016a28)d4c82e7)
</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 any user-facing changes.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
c1f1bfb)c66e298)3836cc0)cc0f506)gix-packetline (4f45814)531dd19)01277a6)
</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>A maintenance release without user-facing changes.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
29a0870)e06f5f5)ac34d2e)gix-transport and add V2 test for unshallow fetching (0eecfab)
</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>
93e75fe)895e482)0f411e9)
</details>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>
ea9fd1d)e6cc618)addd789)94c99c7)
</details>compatibility with 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
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)f872ba8)
</details>fetch::Ref::Symbolic::target is now an option… …to represent the possibility that the server may not be able to strip its namespace if it is not the c
<csr-id-f7f136dbe4f86e7dee1d54835c420ec07c96cd78/>
<csr-id-da68bfb8104ecf58e73e3f99d87f81c90712a2ca/> fetch::Ref::Symbolic::target is now an option… …to represent the possibility that the server may not be able to strip its namespace if it is not the currently set namespace.
Note that the object it points to might still be resolvable and pointing to another namespace.
<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.
<csr-id-02e37f04d7dfeab7067c8273bcd76408cb1f4852/> Support for unborn ls-refs capability if server supports it.
We can also parse it, adding yet another variant to fetch::Refs.
<csr-id-32dc1829a5661f66396d109c8d0a8eaae6b1f532/> use git-credentials in git-protocol
<csr-id-09070a7c17f39383730c3a2b809eec677f79f386/> move fetch::refs(…, protocol, …) to the crate root as ls_refs(…).
This move also removes the protocol parameter as ls-refs is only available
in V2 and the caller is forced to know that after running a
handshake(…) anyway which yields the actual protocol used by the
server.
Note that the client can suggest the version to use when connecting, which is specific to the transport at hand.
<csr-id-35f7b4df164c130fb50fcffcf5de99816c2ca872/> move fetch::Command into the crate root.
This represents much better on how it is actually used, which is for
validation of any Command invoked through the protocol independenty.
<csr-id-a03f8f6cce34618883e8448dd1c31b41c54d9448/> move fetch::agent|indicate_end_of_interaction to crate root
These are generally useful in all interactions, including push.
<csr-id-a3bcf82ae50defa4439862943008647d03d09792/> handshake(…) is now generalized to support git-receive-pack as well.
Note that fetch::handshake() is still present, selecting the correct
service like before, but most of the fetch::Ref parsing is now handled
by handshake::Ref in it's more general location.
There is still fetch::refs(…) which just invokes a V2 ls-refs command
(without that being generalized) as git-receive-pack just supports
V1 at the moment, and making the fetch::LsRefs Command more general
would mean that every command has to be general, at is doesn't matter
anymore if it's used for Fetch or Push.
As long as git won't support V2 for pushes, which it never might, there is no need to introduce this breakage even though it should probably be done before going 1.0.
<csr-id-d05b0b800a553e1e380801fb141e9aa054a6cbd0/> fetch::agent() returns agent string only; fetch() takes agent name as parameter.
<csr-id-aab278f2a3e07edb6d8109e7ffba003b5d5d7857/> don't auto-insert user agent, instead prepare to insert it later.
<csr-id-f957d9a1833af079b01ba6bd6941eb4af6c9e436/> fetch::agent() now returns the agent name, fetch::agent_tuple() returns specific key-value pair.
This is in preparation for allowing user-defined agent strings.
<csr-id-cd867ade55eaec138029c0cf17fa83e0679ef7fc/> fetch::Ref::unpack() returns Option<oid>.
That way the caller has to be aware of the possibility of an unborn
branch (probably the only unborn branch) on the remote.
<csr-id-91f193f73ae37314319f7d055893b95431fd018e/> fetch::Ref::unpack() returns &BStr instead of &BString as ref name.
<csr-id-d2c772e28619f7602ab01285b25e79a7040c9aab/> fetch::Ref::unpack() now returns the peeled object as well.
<csr-id-bab586099a6e21e54932218f7a5c14f8bfc6cabd/> rename fetch::Ref::path to fetch::Ref::full_ref_name.
Previously it was inaccurately named and described due to an
insufficient understanding of the ref database.
<csr-id-99905bacace8aed42b16d43f0f04cae996cb971c/> upgrade bstr to 1.0.1
<csr-id-e91c301342d44cff35ebe12fba4ec10afb4a1922/> replace quick-error with this-error
<csr-id-12589cc6f08e4d7aabae30bcdadaa0c2b4850229/> adapt to changes in git-url and use BString to represent URLs.
They can contain paths, which is why String can't repsent a URL
losslessly.
For HTTP urls these are ultimately UTF-8 strings though.
client::fetch_pack() isn't worth it after all.
The overhead required to make it work isn't worth the logic we are
enabling. Instead, it's OK to re-implement custom logic on the consumer
side based on this one.<csr-id-5f2276b63129163096be3cb229864fc589348da8/> don't enforce V2 as protocol, but smoothly downgrade like git does. For backward compatibility the shared handshake implementation allows the transport to control which protocol versions it wants to support to allow optiomizing for one special case, namely to prevent it to read all V1 refs on old servers but abort instead, closing the connection without delay.
Now we leave this feature for custom transports (who usually come with custom servers) and instead support fallbacks to other protocols if the server demands it.
<csr-id-a8727824a4c38b27d6ad7c73ccaf7a45839c0aa9/> don't pass 'include-tag' as argument by default. This flag always has to be added by the caller based on configuration.
<csr-id-24000fa7ad4607c23f6a4fb4d84d2c85d96ee01f/> don't post packfile-uris capability unless we are able to make use of it.
Turns out that this option can be rejected by a server that advertises
it, so definitely needs more work to make it work.
<csr-id-806b8c2ef392137f3a6ebd0f28da2a3a07a9f3eb/> Parse refs from bytes, not from String. The latter can cause issues around illformed UTF-8 which wouldn't bother git either.
This comes at the expense of not parsing line by line anymore, but instead reading as fast as possible and parsing afterwards.
Performance wise I think it doesn't matter, but it will cause more memory to be used. If this ever becomes a problem, for example during pushes where we are stuck with V1, we can consider implementing our own streaming appreach that works with packet lines instead - they are just not exposed here even though they could.
<csr-id-d7f62b441700c6d3526517c8c4f369cb9a72c102/> support keepalive packets. Keepalive packets are side-band only empty datalines that should just be ignored. This is now happening, allowing longer git operations to work as they will send keepalive packets every 5 seconds, and previously we would choke on it.
Note that empty datalines are never send otherwise, making it a previously unused marker that can safely be skipped.
<csr-id-266395e18d7cf754f51355098c84fd1c969fc972/> Link up Io error as source for error chaining; add Debug to client::fetch::Response
<csr-id-c77bd7a01820110154f2c66cd954c1ccfff173c1/> '(null)' symref targets are turned into direct refs instead… …because that's what 'git' would do if it would care enough. On the client side this means one has to deal with detached heads and it's obvious that these are detached. It's not clear anymore why this is the case, and probably it's good to hide it as the current git behaviour is accidental and may change in future, and do so in a way we predict.
There is the possibility that git would abort the entire fetch/upload-pack operation, but that's already handled correctly by our implementation as well as we understand ERR messages in packet lines.
<csr-id-4b8abb0e8a5326662f36b88f04681bdd0eaa8079/> display the underlying permission denied error as source when failng handshake due to authentication.
<csr-id-5a50d9599f820237866928df6d24a196a9b86fe3/> fetch::Arguments::use_include_tag() allows to signal include-tag.
One can also check for its availability using fetch::Arguments::can_use_include_tag().
Further there was a bugfix that assues V1 capabilities are correctly interpreted to support include-tag.
<csr-id-1c0a6c0edaca4063129c3b06638629b7af17a64c/> due to more specific errors one can differentiate if remote authentication failed repeatedly.
<csr-id-2363bcbd3207d1d16f2f95fbd20a7d7715b92240/> some errors support is_spurious() to tell if retrying is possible.
<csr-id-68c65a9f8b3927d454164a6f72167b47c0facee5/> expose futures_lite for convenience in downstream crates.
<csr-id-aed93d22d7a7faf4d60f1f603830c882175cbcb6/> Allow defaulting fetch::handshake::Outcome.
This is useful in conjunction with std::mem::take().
<csr-id-0bcb2fd4d5d8692a0e91c70bcbcbff9dff60442f/> fetch::Arguments::is_empty() to help decide if arguments should be sent at all.
Furthermore, the Debug trait was added.
<csr-id-31a7089f2583832727e2175ada6fb5c30c3beebe/> make some private methods public to give callers more flexibility. This allows to implement the fetch-negotiation part oneself and break free from constraints of the delegate.
<csr-id-744ed03cf6648e258affab62ef39ffad75c65397/> add client::fetch_pack() allowing to fetch a pack after a handshake.
<csr-id-eaff67c14366f149ccca346acb46af12531a24e6/> helper::main to easily create credential helper implementations
<csr-id-5ba9e1d20a8d523571a153f9f4e3e1a5285335b5/> provide a function to gracefully shut donw a fetch transport
<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-d6b4878d9832a0279e0dd19c1ca520a282289e69/> re-export maybe_async That way, API users can also provide dynamically sync or async APIs.
<csr-id-d2de51d65f9b4ab895e19cc1b307e42a9bb4bbd8/> add fetch::refs() method to invoke ls-refs for V2 and parse the result
<csr-id-35d17b4ea80be611607faa774d1ce0ee9c5000f2/> factor fetch handshake into fetch::handshake() function
<csr-id-0826cc92717faceff62df48a6e86fbb7ca6e90f5/> in-manifest and in-lib feature documentation
prepare_ls_refs in fetch::refs() into FnOnce.<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
Clippy helped 29 times to make code idiomatic.
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
e695eda)0c81769)a517e39)c1f3c9d)7f52823)145103d)4a9a05f)f536bad)a0bc98c)2f75db2)e1861ca)58ab2ae)c857d61)f1fa6dd)6b5c394)9d6f263)719b6bd)2f43a54)f293b63)6776a3f)07aa1bc)84cb256)42c977f)fetch::Ref::unpack() returns Option<oid>. (cd867ad)unborn ls-refs capability if server supports it. (02e37f0)b593806)prodash v21 (a0655dc)306ebef)d7f62b4)fetch::Arguments::is_empty() (df36ede)Debug to client::fetch::Response (266395e)fetch::handshake::Outcome. (aed93d2)fetch::Arguments::is_empty() to help decide if arguments should be sent at all. (0bcb2fd)31a7089)&dyn Any instead of unspecified serialization format, as it's the right way. (779eefe)git-transport (e842843)client::fetch_pack() isn't worth it after all. (f87b7eb)client::fetch_pack() allowing to fetch a pack after a handshake. (744ed03)c3e4b2a)wait-for-done (02245a6)prepare_ls_refs in fetch::refs() into FnOnce. (3a38d1b)45394d5)4720666)git-refspec (ffa24a1)fetch::Ref::unpack() returns &BStr instead of &BString as ref name. (91f193f)fetch::Ref::unpack() now returns the peeled object as well. (d2c772e)fetch::Ref::path to fetch::Ref::full_ref_name. (bab5860)bstr to 1.0.1 (99905ba)32758e8)git-credentials (27c9da5)08c1287)helper::main to easily create credential helper implementations (eaff67c)git-credentials (33f1347)git-credentials (fe1a06d)git-credentials (40cc1dc)077ab57)5ba9e1d)d6b4878)a6105cb)fetch::refs() function in fetch() (37504e6)fetch::refs() method to invoke ls-refs for V2 and parse the result (d2de51d)41a7391)fetch() method (aaa1680)quick-error with this-error (e91c301)fetch::handshake() function (35d17b4)1c5f561)e55b43e)git-transport (2141585)git-url and use BString to represent URLs. (12589cc)caa7a1b)oid type (3930a6f)be84b36)ca78d15)accf89d)a3f2816)4805cfc)packfile-uris capability unless we are able to make use of it. (24000fa)rust-version to 1.64 (55066ce)8c0bca3)7fc00f8)59e9fac)48f5bd2)a5869e0)41d57b9)e313112)6efd0d3)6ccc88a)c9275b9)git-testtools to gix-testtools (b65c33d)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-protocol to gix-protocol (9a35a90)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-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)1fea18f)5b5b380)93bef97)b93f0c4)b34c9fe)ffb5b6a)4381a03)e0b12fe)5ac9fbe)30d8ca1)4b8abb0)08ec3a9)68ce15d)5afa7f5)e6b9906)7114bbb)5f2276b)c57bdde)083909b)fetch::Arguments::use_include_tag() allows to signal include-tag. (5a50d95)a872782)94750e1)1c0a6c0)70ccbb2)is_spurious() to tell if retrying is possible. (2363bcb)git-transport (527c62e)eb4c5f0)eca6705)dadd896)Fixture implementation for async. (b583c2a)7717170)9d8e32d)806b8c2)git-transport (49461b1)6b9632e)7893502)bcd9654)0abab7d)b2c301e)e4648f8)0e4462d)3d8fa8f)0c253b1)fe5721f)665b53e)b5c316e)fetch::refs(…, protocol, …) to the crate root as ls_refs(…). (09070a7)fetch::Command into the crate root. (35f7b4d)fetch::agent|indicate_end_of_interaction to crate root (a03f8f6)handshake(…) is now generalized to support git-receive-pack as well. (a3bcf82)611a139)7691353)f4ff821)0c9c48b)futures_lite for convenience in downstream crates. (68c65a9)git-transport (b46e3bb)git-transport (f88569b)git-transport (226f33a)'static (68dc86f)fetch::agent() returns agent string only; fetch() takes agent name as parameter. (d05b0b8)aab278f)fetch::agent() now returns the agent name, fetch::agent_tuple() returns specific key-value pair. (f957d9a)d071583)423af90)5406630)04cfa63)c4e6849)def53b3)bc9c780)104d922)d232567)702a161)f47c891)3c49400)82fd251)25a7726)f5c36d8)29a043b)3773b92)fd14489)c9eda72)535e967)5c05198)9aa1d3d)1d4600a)1f6e5ab)5869e9f)da0716f)bc64b96)cef0b51)85a3bed)c2660e2)cfa1440)4974eca)39d585d)e2ee3de)31c2351)b1c40b0)Your coding agent can read these notes before it upgrades. Set up the MCP server →