NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
crates.io · #1365 most downloaded on crates.io
Calculate differences between various git objects
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 52 of 53 stable releases
1 version withdrawn
withdrawn after publishing
4 years old
54 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.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
support shell commands in external blob diffs <!-- agent --> Treat configured external diff commands as shell command lines instead of executable path
<csr-id-752f16f284796630aecdab558c8bd2f40eda8d29/> support shell commands in external blob diffs <!-- agent --> Treat configured external diff commands as shell command lines instead of executable paths that require manual argument splitting.
Git diff drivers may contain a program followed by arguments. Passing such values through the shell-aware gix-command preparation path preserves that configuration while still appending Git diff arguments and environment variables in the established platform code.
Add coverage for a configured command containing an argument so custom diff drivers and text-conversion commands are launched as configured.
gix-blame as well, but first I want to
properly understand this part of the gix-diff machinery.<csr-id-43cf77fdb52b547e727343644264fe60c05e6589/> Refactor tree-merge change matching and resolution.
Breaking because of added ResolutionFailure variants.
<!-- agent --> The tree-merge implementation previously combined side-diff collection, path matching, scheduling, and the complete conflict-resolution matrix in a single function. It also duplicated change collection for both sides and represented pair outcomes with independent boolean flags.
Keep the public tree() entry point as a small facade and move the merge engine into focused private modules. Collect each ancestor-to-side diff through one helper that constructs a SideState containing the flat change list and its matching tree together. Isolate path and rename candidate matching, including identical-change suppression, from classification into pairs that the resolution matrix understands.
Represent the result of handling each paired change explicitly as a ChangeDisposition. This preserves the important distinction between a change that was merely processed and one whose effect is present in the editor, without duplicating the final state transition in the scheduler. Replace the type-specific side-picking helpers with generic pick() and pick_mut() helpers as well.
These boundaries make the state machine easier to review and reduce the chance that a future rename or forced-resolution fix accidentally changes collection, matching, and application at once. They also remove duplicated setup while keeping the exhaustive resolution match in one place, where its symmetry remains visible. The public API and all recorded merge results remain unchanged.
Tree merging combines a flat change schedule with per-side path indexes. Valid Git operations can therefore arrive in different orders or expose structural relationships before the leaf changes that ultimately apply them. Several resolver branches treated those relationships as physical occupancy or as content changes for the same identity, leading to hangs, assertions, duplicate entries, lost siblings, or merge results that depended on diff and side order.
Separate unique-path occupancy from PassedRewrittenDirectory scheduling so a side-qualified name can terminate below directory rewrites. Prune empty path nodes back to the root, and allow a deferred rewrite to insert only its new destination because its source is already indexed.
Resolve the structural cases at their actual identity boundaries:
Forced Ancestor and Ours resolution continues to apply only the selected side. Git-backed baselines cover both directions, forced policies, modes, symlinks, gitlinks, nested directories, and documented index-only deviations. The resulting suite contains 155 directional baseline cases, and the Cartesian model reaches 210/210 Git/gix agreement for trees and path/mode results.
Deferred tree changes may be reconsidered after another conflict has already consumed or pruned the same path-tree node. This is valid when rename detection has ambiguous identical sources, when structural conflicts overlap, or when a change follows a detected directory rename. The editor and conflict records still contain the required state, but strict bookkeeping removals and older same-path assertions turned these schedules into debug panics, hangs, or side-order-dependent duplicate content.
Make cleanup idempotent wherever absence is already the required end state: add/add type conflicts, same-source rewrites, blocking conflict destinations, delete/rewrite sources, and changes deferred through directory renames. Accept cross-path structural matches from ambiguous rewrite candidates and let the existing conservative unknown-conflict fallback handle them.
Preserve each rewrite input mode when blob content is identical so executable mode changes remain visible to the merge. Make unique-path selection respect childless tracked directories and qualify the first blocking file component, which guarantees termination instead of varying an ineffective descendant suffix forever. Finally, when a deferred addition is relocated to a unique conflict path, remove its temporary original path from the side index before marking it processed so a later descendant cannot relocate the same content a second time.
The minimized and accumulated fuzz inputs now complete without failure.
Git-backed regressions cover ambiguous sources, consumed nodes, repeated
rename/delete candidates, mode-only rewrite collisions, unique paths below
files, and nested rename destinations in both side orderings. The final tree
baseline contains 165 directional cases with 130 intentionally skipped forced
resolution checks, and reversing the nested relocation case retains exactly
a/a/a and a~A without inventing a~A_0.
<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>
d2af4ed)ebe9095)7424676)5c8d935)227619a)5e600cb)6ade0d4)f3bbfad)752f16f)gix-testtools (0cbe539)gix_object::tree::name_order instead of copy of the same function (db1f7d4)2a4d996)Store::at() where possible (17fea2a)f33e250)43cf77f)cc3ee80)ab4fcb0)ae8845a)
</details>add a benchmark for the rewrite tracker specifically.
<csr-id-cea5ea77b57f840de618e1d15508add8293f30f2/> prefer file-name matches when pairing rename candidates, like Git When several sources are equally viable for a destination - identical ids in the identity pass, or equal similarity in the similarity pass - prefer the one whose file name matches the destination's, in the spirit of Git's basename-driven matching. This makes the now-deterministic choice also the semantically better one, where previously the pairing among identical candidates was arbitrary.
The tree-merge baseline had recorded the arbitrary pairings in its three deviating cases, along with their consequences. These expectations are updated to the improved outcomes:
All other 114 baseline cases are unchanged, in SHA-1 and SHA-256. Note that in the identity pass, when no file-name match exists, the scan now covers the whole same-id range before falling back to the first eligible candidate, where it stopped previously.
<csr-id-1acc43d14af57e7711407af8172d43a75733ae16/> make rename tracking independent of the input order The rewrites tracker sorted its items with a same-id tiebreak on the path byte-range offsets, which are assigned in the order changes are pushed. As changes can arrive nondeterministically - the index-worktree status feeds the tracker from a dirwalk thread and an index-traversal thread - the matcher could pick different sources for identical-content candidates between runs.
Sort by each item's observable identity instead (id, then location, change-kind, relation and entry-mode), a total order that is independent of push order. Items that still compare equal are identical in every observed field and thus interchangeable for matching.
Adds permutation tests for the rename and exhaustive-copy paths, and updates the realistic_renames_2 snapshot where two same-id entries now emit in path order (a pure reorder).
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
842bc44)cb6ec7d)f0ec710)2315ede)gix-filter (552402f)c16b5a1)43ff87a)cf3053a)27aec47)a82b492)32cb1ad)b65c7ef)gix_odb::memory::Proxy<gix_object::Never> where applicable (3880993)1b1541e)
</details>2 commits contributed to the release over the course of 27 calendar days.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
6428edc)f7d4f33)
</details>20 commits contributed to the release over the course of 28 calendar days.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
10c58bb)575113d)gix-testtools (ce9e6bd)278d7ec)sha1 and sha256 forwardings for all crates (09b982c)1cd36be)4743361)e3d5a04)ab2fee1)2cb17b2)e10d5f6)3675a8d)3af9b4a)d3e4c17)23af41a)gix_object::Data (4309fa4)gix-testtoolsand rename hash_kind -> object_hash (d9648e8)7fbb9be)3660cef)adb8328)
</details>7 commits contributed to the release.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
53f880c)4d5ba23)0748449)85daa23)f5859cf)8996e5a)dc6fe6b)
</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.
imara-diff-v2 with git sliders processing
The slider post-processing imrpoves the diff quality for about 8% slower diffs.
Line-counts, however, will be 50% faster to compute.<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>
f9fbcba)a78304c)7d50c30)gix-diff-tests crate (a9ed60e)gix-object (6df1d55)2a5db88)e4f380e)cff3c16)1be2d4d)imara-diff-v2 with git sliders processing (8094f5d)feadcad)444a92b)package.include patterns more specific so they don't match ignored files (c2c917f)8f091d1)ecf0c17)imara-diff 0.1 and 0.2 (fd49295)26a5f65)0fc914f)98bae84)
</details>add sha1 and sha256 features to gix. This way one can control which hashes are compiled in exactly, while having reasonable defaults automatically.
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)6a7287c)cargo machete CI job including exclusions (abd0724)f7277f3)
</details>skip subtrees with identical oids Add a short-circuit check to the core gix-diff algorithm to skip identical subtrees based on oid. This substantially
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
ecf90fc)e441fa9)e63d487)228caf7)GIX_TEST_FIXTURE_HASH for gix-commitgraph and gix-pack. (d51b858)9327b73)
</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-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
d66ac10)5eff1cf)1c62a8e)8bceefb)7ce3c55)31454c6)f7d0975)
</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.
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)
</details>6 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)9e1ba5e)3bc0c47)211b4fb)
</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>
115e208)d6c5b9d)
</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>
21fecdf)a046e26)5130610)1e3efab)c0be918)imara-diff 0.2 in diff slider test (618c37a)111b625)4d3a6b1)8228fc0)33e808c)3a607a7)cb66d19)3e40438)de2c6fc)c60267a)614d93d)93dd630)703644c)
</details>6 commits contributed to the release.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
82ff92f)ab44f45)fb2ee84)9a9bd29)gix-diff to validate that diff-algorithms match (diff-slider problem) (94dac4b)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>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-e4eb98e2dc0d77d54e23b29113d0294e0e005553/> make non-UTF8 unified diffs possible again.
<csr-id-f4e630f3c6732144397b44763979a6e8f844872d/> compare symlinks with blobs as long as these aren't read from the worktree (without support)
<csr-id-ec26d3287f6b81daccf068d944966e216ea98d12/> textconf programs are now always run through a shell. This is based on what Git does, see https://github.com/git/git/commit/41a457e4f814a0e514548b3178e7692129f0fcfe .
This originally surfaced in https://github.com/gitbutlerapp/gitbutler/issues/9540 .
DiffLineType and HunkHeader
This commit modifies the public API of ConsumeHunk::consume_hunk to
use the new types DiffLineType and HunkHeader. It also shifts
responsibility for adding newlines to the API's consumer.<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
89fb308)4da2927)b188a7d)6cc8464)9365cc3)838ff95)382dc5d)e4eb98e)a78bf84)f4e630f)f7f087c)91a611f)DiffLineType and HunkHeader (0924bd3)dc7343c)79ba9d0)202bc6d)d64f257)9946611)ec26d32)784c046)
</details>add explicit accessors for common fields
Sink that implements git's diffing improvement heuristics<csr-id-0d102f4bdf1450f9c5f8d4176707c73b499bd665/> blob::UnifiedDiff now produces non-overlapping hunks.
Previously it was possible to see two hunks with overlapping context lines
due to an off-by-one error.
<csr-id-4f271796041655d80ab0435a76281446e21ad8cd/> remove blob::GitDiff Sink as it doesn't work concistently.
Against better judgement I was compelled to merge this implementation in,
assuming one test must be enough given that it is a transcription.
This, however, wasn't the case and there is strong evidence that it produces diffs that aren't correct.
<csr-id-0eaced934a4d52d80d680222fc0c9f7aae74f056/> improve rename tracking performance characteristics to make exponential runtime less likely. This optimizes specifically for the case where there are a lot of added files, but no deletion to pair it up with.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
Clippy helped 2 times to make code idiomatic.
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
blob::GitDiff Sink as it doesn't work concistently. (4f27179)5a919c4)65037b5)5335c84)f87967d)5e64298)79b8f06)ChangeRef::field() (fad0118)bd01893)08e7777)blob::UnifiedDiff now produces non-overlapping hunks. (0d102f4)3094214)0eaced9)fd49eee)GitDiff compatible to strings and bytes. (5505646)5e699d2)Sink that implements git's diffing improvement heuristics (c84296b)imara-diff to the latest version. (732adb8)648022b)f0ed2cc)c3f06ae)d2b4c44)28935a5)dbf65c9)800738a)4408166)8d4c4d1)
</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-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
e104545)5f7f805)631f07a)
</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>
cc5b696)49fa9f3)db0b095)0bf84db)3b1bef7)c3c6504)b5e9059)68e6b2e)420e730)
</details>add blob::Resource::intern_source_strip_newline_separators() That way it will be easier to have typical Git-style patches diffs around files that don'
blob::platform::Resource::intern_source_strip_newline_separators()
That way it will be easier to have typical Git-style patches diffs around
files that don't end with a newline.blob::UnifiedDiff as Sink to build unified diffs.blob::Platform::filter_mode public.
There isn't a reason not to allow changes to this field.blob::UnifiedDiff::new(...newline...) is now an Enum.
That way one can specify where newlines should be added.<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)gix_object::{try_ =>}compute_hash users (3d7e379)fbf6cc8)5fa79d9)c70d912)7b17da6), just before ) on same line in function calls (66a5ae1)01bd76d)7255a5f)blob::Platform::filter_mode public. (807c2de)16a248b)8e96ed3)914bf28)blob::platform::Resource::intern_source_strip_newline_separators() (37582b0)daa6d4a)blob::UnifiedDiff::new(...newline...) is now an Enum. (1091e29)cc7b614)gix-command (28f712e)1a69c40)blob::UnifiedDiff as Sink to build unified diffs. (1ccbeef)imara-diff::UnifiedDiffBuilder as basis. (df7a926)8df0db2)
</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-id-17835bccb066bbc47cc137e8ec5d9fe7d5665af0/>
index() to diff two indices
It comes with pathspec support to allow for easier integration into
the status() machinery.index::Change::Unmerged as it doesn't matter to Git either.<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
dea106a)7570daa)1f6390c)7ec21bb)rust-version to 1.70 (17835bc)af704f5)index::Change::Unmerged as it doesn't matter to Git either. (0963abe)0ab4f64)index() to diff two indices (3b8c971)gix-traverse (1de4e70)d22937f)
</details>enforce diff.renamelimit even for identical name matching The problem here is that our implementation avoids using a hashmap, but pays the price by ha
<csr-id-d281ba6b180d052aa6df43f43696a84819218d4d/> enforce diff.renamelimit even for identical name matching
The problem here is that our implementation avoids using a hashmap,
but pays the price by having bad performance if there are too many
possible candidates (binary search doesn't seem to be up to the task).
This can lead to impossibly long runtimes, so for now, limit it explicitly.
<csr-id-d3f5f27732ec5dfb496a3f9d0dd17a3a79d408f3/> add support for not tracking single empty files.
Empty files are equivalent to having no content, which also means
such files have no identity to speak off. This definitely helps
with false positives of .gitignore for instance, which can be empty
to tell Git to track a directory.
On top of that, Git has a heuristic to do rename tracking of small files by similarity as the similarity may be off of files just have a couple of lines to speak about.
Note that empty files that are renamed as part of a whole directory will still be tracked as renames.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
c1ba571)7ea8582)520c832)d3f5f27)diff.renamelimit even for identical name matching (d281ba6)34efe03)ed757ea)e8b3b41)
</details>add tree_with_rewrites::Change(Ref)::source_mode_and_id|mode_and_id()
tree_with_rewrites::Change(Ref)::source_mode_and_id|mode_and_id()tree::EntryMode.
This makes it easier to reason about.tree_with_rewrites::Change typestree_with_rewrites::Change(Ref)::previous_location()
That way, it's also possible to obtain the previous location in case of rewrites.tree::State::buf1|2.
This allows to re-use that memory at least, making this kind of state a little more useful.
Also, these fields can certainly be considered stable.tree() diffing now also recognizes merge mode changes as modification.<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
4000197)8ce4912)bc9d994)0b7abfb)tree_with_rewrites::Change(Ref)::source_mode_and_id|mode_and_id() (5db2d2d)tree::EntryMode. (cd61c25)tree() diffing now also recognizes merge mode changes as modification. (e00e454)7a40648)0f0e4fe)3fb989b)ba7b811)tree_with_rewrites::Change types (6740520)tree_with_rewrites::Change(Ref)::previous_location() (76e6762)tree::State::buf1|2. (eb55c00)db5c9cf)
</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-991c9391541d1a4ff3d3e135884139e706fa5f51/> <csr-id-64ff0a77062d35add1a2dd422bb61075647d1a36/> <csr-id-989276fa12cac8682fbcbdf52a945d41cb922a3f/>
gix to the plumbing
level, to allow it to be used there as well.blob::pipeline::WorktreeRoots::is_unset()
That way it's easy to determine if a worktree root has any root set.<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)155b5e1)53fa8ab)4cff32c)tree::function::diff (991c939)795962b)64ff0a7)37c1e4c)f2e813d)tree() function to diff a tree. (989276f)af03832)7be142d)cebef0b)2261de4)9efa09f)blob::pipeline::WorktreeRoots::is_unset() (fe7ecd0)93e86f1)012a754)649f588)beba720)37ba461)2e0ce50)f992fb7)ec69c88)
</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>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>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>blob::Platform::clear_resource_cache_keep_allocation().
It allows to keep a free-list of buffers around after clearing, to help
prevent re-allocating and growing bufers over and over.<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
jj (7ef1e88)f2b522d)a65a17f)d19af16)0f25841)6990afd)f8c5d9c)242fedc)blob::Platform::clear_resource_cache_keep_allocation(). (7f868d1)7b7902e)12251eb)63936e5)imara-diff to the one that fixes a potential issue with pointers (55cffe4)
</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)15f1cf7)f87322e)gix-testtools (f5a9884)bf3d82a)36f221b)e6c8cd6)7330844)a4bb7b9)8d89b86)1dfa90d)tar files (dcab79a)9fa1054)9c65d98)ea12fc2)68cbea8)2cefe77)
</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)d6cd449)79dce79)gix-worktree (1ca6a3c)977346e)54ac559)fe24c89)41bf65a)
</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>
topo more similar to Ancestors, but also rename Ancestors to Simple<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
095c673)5755271)9680e57)f72ecce)b590a9d)gix-traverse (1cfeb11)topo more similar to Ancestors, but also rename Ancestors to Simple (2a9c178)gix-traverse (6154bf3)
</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-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
b050327)52c3bbd)3e5c974)f8ce3d0)80a6cb8)e20b6b1)
</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/>
Clippy helped 1 time to make code idiomatic.
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
45b4470)f2e111f)13d5602)7b44c7f)8430442)684fa5c)2a9ef4e)0be338f)8a62fb5)b8cba96)
</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>
0878344)eb6aa8f)6a2e0be)b6c04c8)39f35da)3ef3bc2)
</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>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-aea89c3ad52f1a800abb620e9a4701bdf904ff7d/>
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
e1aae19)e78a92b)gix-tempfile in gix-diff (0afe927)4454c9d)aea89c3)1691ba6)7549559)35439de)98b08f4)
</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-ebe66dbc5720bb47a6c3810333060e17d6b58085/> add blob::Platform and blob::Pipeline for diff-content conversions and caching.
The Pipeline provides ways to obtain content for use with a diffing algorithm,
and the Platform is a way to cache such content to efficiently perform MxN matrix
diffing, and possibly to prepare running external diff programs as well.
<csr-id-e2745fd20203bf26a30b563f2817e342df7c4742/> provider new rename-tracking faciliites. They generalize reneame tracking to the point where it can work for different kinds of changes.
There is still some way to go until it is truly correct though, as it still lacks worktree conversions and diff filters.
gix-object::Find trait<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>
d3fd11e)55d386a)d3dcbe5)5fdc9df)223278d)51c7abc)dfb3f18)feca5d0)blob::Platform and blob::Pipeline for diff-content conversions and caching. (ebe66db)5a0d93e)fc23775)bb3224c)c87f2cc)e2745fd)ff99a18)gix-object (203d69c)c8bd660)82b01c2)gix-object::Find trait (2637f8f)gix_object and gix_odb. (24e319e)c0e72fb)b65a80b)
</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>
68e5432)1347a54)995bc84)
</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>
7891fb1)8a60d5b)
</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>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>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>blob feature (enabled by default)<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
6c62e74)30b2761)f23ea88)8f3f358)73c685a)8d0d8e0)blob feature (enabled by default) (7766cf9)4604f83)
</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>
0062971)107a64e)16295b5)c4cc5f2)5cb3589)2fc66b5)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>A maintenance release without user-facing changes.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
68ae3ff)c70e54f)e4dded0)
</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)
</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)aa16c8c)4f635fc)fe59956)clippy::redundant-closure-for-method-calls lint (bcad5c2)
</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>
2560a2c)298f3d7)fdee9a2)gix-traverse (1f682fd)
</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)8f15cec)67da689)0269eed)420553a)2578e57)3ef5c90)9375cd7)facaaf6)4f879bf)
</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/>
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)91134a1)30a1a71)6ebd61e)14e64e7)8dbd0a6)cdef398)19338d9)b574a39)
</details>A maintenance release without any user-facing changes.
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>
5dc1f9f)3016a28)79ed875)
</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>
ea9fd1d)e6cc618)addd789)94c99c7)8ef1cb2)
</details>reproduce a diff issue and fix it Diffs could be quite wrong and this is a small repro along with the fix.
<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.
<csr-id-2ad0e8b984a874e0a591b01e9d46f2f24a541a97/> tree::Recorder::track_location() to track no location or filenames only.
Previously the recorder would track full paths, but now it's possible to configure it
to track no paths or file names only.
That way it's possible to use the implementation in custom delegate implementations or otherwise tune the computational cost according to actual needs.
<csr-id-507196e63875100e705573f3b4aab110b7876852/> add tree::visit::Change::(oid_and_mode|mode)() methods.
These methods allow to easily access the current object id and mode
of a change, as well as the mode separately.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
8b3e42f)35415c5)tree::Recorder::track_location() to track no location or filenames only. (2ad0e8b)tree::visit::Change::(oid_and_mode|mode)() methods. (507196e)
</details>Allow 'refactor' and 'other' in conventional messages if they have breaking changes (`4eebaac`)
<csr-id-ebc7f47708a63c3df4415ba0e702660d976dfb3e/> <csr-id-2290d006705ff47ad780b009fe58ee422b3285af/> <csr-id-fed47d45b7e39958921a230b485b5b0384c8672f/> <csr-id-f7f136dbe4f86e7dee1d54835c420ec07c96cd78/> <csr-id-533e887e80c5f7ede8392884562e1c5ba56fb9a8/>
<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-16b553367518153b8f5b0bb6b23d2fcefcaac801/> re-export the imara-diff crate as git_diff::blob::*.
It's flexible API needs nothing more and can be wrapped into more
convenient APIs from higher-level crates.
Note that despite being limited to blob, technically imara-diff
can handle diffing any kind of sequence.
<csr-id-68a336502351ce16b804e7c099479bc974c3787c/> remove text::with(…) as it's not usable in practice.
The only viable API for now, and not a bad one at that, is the one
imara-diff provides.
<csr-id-ee26ddfe645ca39024795f85bb8e1cab6b6f5863/> replace similar with imara-diff.
The latter clearly has a more complex call signature, but that also
makes it far more powerful which will pay off with better performance.
<csr-id-8c5ae77f06a64c57df9a9ad1190266896a223dbe/> Remove deprecated compound and linked object databases The dynamic/general store is the only maintained can-do-it-all DB now.
wasm feature toggle to allow compilation to wasm32-unknown-unknownsimilar crate.
This is a first and maybe the last step towards providing diffing
functionality, and it seems like the right choice to keep this in
similar and contribute there as needed. All algorithms are well
described and thus shouldn't be git-specific per-se, and similar
is the best the community has to offer.<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
Clippy helped 3 times to make code idiomatic.
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
04b9ca0)e695eda)0c81769)a517e39)4eebaac)4a9a05f)f536bad)a0bc98c)e1861ca)58ab2ae)c857d61)6b5c394)9d6f263)719b6bd)6776a3f)git-odb (5b0e2b9) ([d71bd9d`](https://github.com/GitoxideLabs/gitoxide/commit/d71bd9ded1e5e5a61a27be3d55f4b85ee4049bcf))8240622)60c136c)rust-version to 1.64 (55066ce)8c0bca3)a5869e0)41d57b9)e313112)6efd0d3)6ccc88a)e49aed9)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-diff to gix-diff (95cce04)git-commitgraph to gix-commitgraph (f1dd0a3)git-mailmap to gix-mailmap (2e28c56)git-discover to gix-discover (53adfe1)git-lfs to gix-lfs (b9225c8)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-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)4bc19d1)wasm feature toggle to allow compilation to wasm32-unknown-unknown (f0e40ec)c196d20)7c846d2)1e544e8)39ed9ed)bac57dd)234ec14)1fea18f)ffb5b6a)4381a03)0e3d0a5)5ac9fbe)30d8ca1)e6b9906)7114bbb)c57bdde)083909b)git-testtools (4eb842c)7717170)bcd9654)b2c301e)e4648f8)0e4462d)3d8fa8f)7c5b37d)f0cab31)f5f3a9e)255be4d)imara-diff crate as git_diff::blob::*. (16b5533)text::with(…) as it's not usable in practice. (68a3365)bd971e7)395a590)d071583)423af90)5406630)1919e8e)c4e6849)def53b3)381924c)fa27570)f53f942)lines module to text. (fed47d4)similar with imara-diff. (ee26ddf)104d922)d232567)702a161)53acf25)25a7726)f5c36d8)29a043b)fd14489)Change type (8e46f54)1f6e5ab)5869e9f)da0716f)bc64b96)51dc828)2571831)fc6b958)34e899a)cef0b51)85a3bed)6d9533d)0661d48)bfdcb13)cfa1440)4974eca)e2ee3de)31c2351)f7f136d)533e887)bd5f3e8)c96473d)c06ae1c)232784a)ce885ad)9b9ea02)6da8250)7b61506)4e7b343)ef905d4)e9fcb70)aa639d8)4737b1e)3c50625)085e76b)89ea12b)target_os = "windows" in favor of cfg(windows) and negations (91d5402)a22b1d8)598c853)654cf39)b1bfc8f)e058bda)0eb2372)350df01)b612021)27df580)8c5ae77)e58dc30)f0cbb24)1b76119)8f57c29)d78aab7)373cbc8)8900d69)4624725)7d2e20c)7dd2313)d3f9227)acd3737)ec38950)f606fa9)f69b2d6)39b40c8)0e02953)59ffbd9)a474395)01f7b72)21541b3)bf0106e)d39fabb)17c411f)d4fc81f)cedae8d)49f5453)85f1a48)6efd90d)ab6554b)2e2e798)70e11c2)fa5cd06)iter adjustments (461dc53)708fc5a)3ad0829)5e0edba)41b218f)c40faca)f123f69)c67291f)7006150)b327590)4b71e15)e21142b)c52a491)1687e59)28e58f6)a5be31c)22337ce)9790c15)7ee278b)ae02dab)a77a71c)a92f1e6)866f86f)7e802a0)2958145)769c649)721303d)ea224e9)6a1b16a)5d7ee6a)fcf2e8f)fa8b4e8)9373cd6)087e853)c85d59a)ad89320)684de4b)d91b241)3f2f8de)3fb8377)84897fd)082f8d0)f0aeee1)cceff1c)d9514ee)ca48e06)9e09dd5)6e6453d)2f573f3)c0318cf)76af15b)60f72f5)5c791af)3609356)11db16b)1a9af50)c684382)d35e654](https://github.com/GitoxideLabs/gitoxide/commit/d35e654747f96cec93bdecd1314ce3Your coding agent can read these notes before it upgrades. Set up the MCP server →