NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
crates.io · #1364 most downloaded on crates.io
Implements git packs and related data structures
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 58 stable releases
1 version withdrawn
withdrawn after publishing
4 years old
59 releases · first in 2023
One column per quarter.
Nothing published for this version
Nothing published for this version
2 commits contributed to the release.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
expose index-less parallel pack traversal (cache Tree, Context, Options) Re-export cache::{Tree, traverse::{Context, Options}} at cache so external ca
<csr-id-40a4ca7d1802361850a6a4a6aef91c8c2c5d730f/> expose index-less parallel pack traversal (cache Tree, Context, Options)
Re-export cache::delta::{Tree, traverse::{Context, Options}} at cache so
external callers can build a delta Tree directly from a pack header scan and
resolve all of its objects in parallel via Tree::traverse -- without a
pre-built .idx. This is the index-less companion to the already-public,
idx-verified index::File::traverse_with_index.
Minimal surface by design: the delta module stays pub(crate), so only the
three already-documented items a caller names become public -- pub mod delta
would instead expose the module's internal error types and constructors and fail
#![deny(missing_docs)]. Tree::from_offsets_in_pack (already public) builds the
tree straight from the pack; with_capacity/add_root/add_child remain for
callers who assemble it by ascending pack offset themselves.
Additive and non-breaking; cargo doc is clean under -D warnings, and a
doc-test anchors the index-less path (Tree::from_offsets_in_pack). Shape
approved in #2922.
<csr-id-916f5d8c32deb0a03bb6a01c8d8e9c4b6c69d186/> validate delta base sizes during entry decoding <!-- agent --> Reject delta instruction streams whose declared base size differs from the resolved base object. The regression demonstrates that a REF_DELTA could previously reconstruct successfully despite lying about its base size.
Git reference: patch_delta() compares the decoded source size with src_size before applying instructions, observed at cf5497b14c5a.
<csr-id-d7bbb8e053c3ce9c24fe0a4bf1aaaca7b7a58270/> resolve delta trees lazily in a lock-free pool <!-- agent --> --- Summary of findings
The lazy, stealable resolver fixes the pathological phpstan pack without regressing the Linux best case. At 16 threads, phpstan falls from the 98.38-second baseline resolver time to 22.70 seconds, while the Linux best-case resolver improves slightly from 11.81 to 11.33 seconds. Charged peak memory on phpstan falls from 13.14 GB to 2.16 GB, and the Linux best case falls from 1.96 GB to 1.76 GB.
Across the measured packs, gix resolver speedup at 16 threads ranges from 10.80x to 12.48x over its new serial path. On phpstan, gix is 1.07x faster than Git at one thread and 2.31x faster at 16 threads. On the identical 10.9M-object Linux payload, gix's SHA-256 resolver is 2.72x to 2.99x faster than its SHA-1 resolver, confirming that the slow SHA-1 implementation dominates much of the remaining absolute cost.
The Git SHA-256 comparison was initially unfair: the local Git build used the portable SHA256_BLK backend while RustCrypto selected ARMv8 SHA-2 instructions. Rebuilding Git with OpenSSL reduced its eight-thread wall time from 144.15 to 40.45 seconds and user CPU time from 471.94 to 99.81 seconds. All final Git SHA-256 comparisons use that faster backend.
--- Pathological phpstan pack
The pack contains 100.7k objects but expands to 174.6 GB because one root ends in a deep, expensive delta tree. The previous resolver takes 98.53 seconds wall clock and has a 13.14 GB peak memory footprint.
The new resolver takes 283.41, 71.94, 36.42, and 22.83 seconds wall clock at 1, 4, 8, and 16 threads. Its resolver speedups are 3.94x, 7.81x, and 12.48x relative to one thread, remaining nearly linear through eight threads. Peak memory footprint is 0.68, 0.75, 1.17, and 2.16 GB respectively. Thus the fastest run is 4.31x faster than the old wall time while using 84% less charged peak memory.
Git was measured at 1, 2, 4, 8, and 16 threads while keeping its aggregate delta-base cache allowance at least as large as the default eight-thread allowance of 8 times 96 MiB. Git takes 304.51, 168.06, 98.80, 65.41, and 52.79 seconds, for 5.77x one-to-sixteen-thread scaling. At equal thread counts, gix is 1.07x, 1.37x, 1.80x, and 2.31x faster at 1, 4, 8, and 16 threads.
At the nearest wall-time operating points, gix at four threads takes 71.94 seconds with a 0.75 GB peak footprint, while Git at eight threads takes 65.41 seconds with a 1.90 GB peak footprint. gix therefore uses 61% less charged working memory near Git-matching throughput.
--- Linux best-case pack
The 7.6M-object fixture expands to 95.6 GB and guards the already-friendly case. The old implementation takes 13.68 seconds wall clock and 11.81 seconds in the resolver. The new implementation takes 137.48, 36.75, 19.81, and 13.16 seconds wall clock at 1, 4, 8, and 16 threads; resolver scaling reaches 11.97x at 16 threads.
The 16-thread result is slightly faster than the old implementation, with 11.33 seconds in the resolver, and lowers peak footprint from 1.96 to 1.76 GB. Peak footprint remains effectively constant from one through 16 threads. Git takes 156.65, 60.48, 45.48, and 42.97 seconds at the same thread counts, so gix's advantage grows from 1.14x to 3.27x.
--- SHA-1 and SHA-256 sibling packs
The sibling packs contain 10.9M objects, expand to 146.7 GB, and preserve the same compressed payload and delta topology. This isolates hashing from work distribution.
For SHA-1, gix takes 212.57, 56.58, 30.60, and 20.74 seconds wall clock at 1, 4, 8, and 16 threads. Resolver scaling reaches 11.36x at 16 threads. The default eight-thread Git run takes 125.11 seconds, while gix takes 30.60 seconds at eight threads and 20.74 seconds at 16.
For SHA-256, gix takes 72.47, 21.83, 12.58, and 8.67 seconds wall clock. Resolver scaling reaches 10.80x at 16 threads. Against OpenSSL-backed Git, gix is 1.21x, 2.02x, 3.22x, and 5.61x faster at equal thread counts. Git improves from 87.85 seconds at one thread to 40.45 seconds at eight, then regresses to 48.68 seconds at 16 with 204.81 seconds of system CPU.
--- Hasher and scheduler interpretation
On identical pack data, gix SHA-256 resolver time is 70.31 seconds at one thread versus 210.35 seconds for SHA-1, and 6.51 seconds at 16 threads versus 18.51 seconds for SHA-1. SHA-256 is therefore 2.99x faster serially and 2.84x faster at 16 threads, with a 2.72x to 2.99x advantage throughout the measured range.
The similar 10.80x to 12.48x gix scaling across pathological, best-case, SHA-1, and SHA-256 packs argues against lock contention being the main high-thread limitation. The remaining flattening is consistent with finite parallel work, scheduling overhead, memory bandwidth, and hashing cost.
--- Memory interpretation
The resolver no longer materializes the unresolved internal-node frontier. It resolves a child only when a worker starts it, shares immutable bases between sibling tasks, and recycles the final base reference. A linear chain therefore needs roughly two object buffers per active worker instead of retaining every intermediate base.
macOS max RSS includes clean file-backed pages. gix maps the pack, so its reported RSS can include most of a multi-gigabyte pack even when those pages are reclaimable; Git reads through bounded pread buffers. Peak memory footprint better represents charged working memory here. On phpstan, gix max RSS grows from 7.20 to 8.90 GB across 1 to 16 threads, but charged footprint grows from only 0.68 to 2.16 GB. On the Linux best case, footprint stays at 1.76 GB across the same range.
--- Implementation
Use lock-free local deques and a shared root injector so idle workers can steal branches from the last expensive root without every worker hoarding roots. Enable this resolver through the gix parallel feature.
Regression tests prove that internal siblings are not all materialized before descent and that two workers can concurrently resolve children from one remaining root. The scheduler follows the proven Git index-pack principles of bounded live delta bases and keeping independent delta work available, informed by builtin/index-pack.c at cf5497b14c.
<csr-id-64b9efefb9a538a0c40f3413d6c758a17bbc2daf/> resolve in-pack ref deltas while indexing Valid packs may encode a base inside the same pack with REF_DELTA and may place the delta before that base. The streaming lookup previously treated an object-database miss as fatal, while index construction rejected every remaining ref delta.
Keep lookup misses in the stream and park ref-delta children by base object ID until traversal resolves the matching object. This preserves external thin-pack injection and reuses the existing delta tree for forward and chained references.
Git reference: a23bace963d508bd96983cc637131392d3face18, builtin/index-pack.c and t/t5300-pack-object.sh.
object_hash from Options
This forces callers to explicitly choose a hash, eliminating the risk
that Sha1 is implicitly chosen for them in SHA-1/SHA-256 builds
through Default::default() without them being aware of it or noticing.
This comes at the cost of callers having to always pass the hash, but
that seems like a reasonable trade-off.<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
64b9efe)d7bbb8e)916f5d8)ebe9095)b2d919a)object_hash from Options (c055803)f3bbfad)gix-testtools (0cbe539)c4426f0)dcb8ccd)40a4ca7)dd8c759)gix-odb (1dc741f)9c12c2d)cc3ee80)ab4fcb0)4a6cf9d)9b787f6)ae8845a)
</details>cap remaining gix-pack allocations
gix_hash::Kind in
Entry::from_bytes() instead of accepting a raw hash length. This keeps callers
from passing unsupported or inconsistent hash lengths and lets the decoder derive
the ref-delta base id length from the selected object format.<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
0ba5af4)5850141)ace687c)842bc44)cb6ec7d)f0ec710)c16b5a1)43ff87a)cf3053a)27aec47)6e1c4a2)f1ac335)f26c18a)6d95da6)gix-features, use gix-zlib accordingly. (9c2977a)0052e42)09642c6)223f673)6391b3e)938506b)5d4c52b)b69f0a6)b2a0fd6)3d511c3)d785bbc)mmap2 to avoid potential for unsoundness (eda41b1)1b1541e)
</details>cap aggregate delta data allocation in gix-pack A ClusterFuzz data_file testcase could build a malformed delta chain whose individual entry sizes stay
<csr-id-6de909bec54270cf2433eb944af20ed0e7bd7467/> cap aggregate delta data allocation in gix-pack A ClusterFuzz data_file testcase could build a malformed delta chain whose individual entry sizes stayed below the configured fuzz allocation cap, but whose aggregate decompressed delta payload size reached multi-gigabyte scale. The fuzz harness then attempted to reserve that aggregate buffer and aborted with libFuzzer out-of-memory.
Reject aggregate delta payload sizes once they exceed File::with_alloc_limit_bytes(), matching the existing protection for individual decoded object sizes. Add the minimized ClusterFuzz testcase to the data_file artefacts so the known input remains available to the fuzz target and artifact smoke test.
index::Version::hash() method.
It's not useful either as there is no relationship between the Version
of the index file and the hash to use.<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
6428edc)cdafa6a)14025af)bbf6fe3)aa319aa)70d38bf)6de909b)4f862a5)index::Version::hash() method. (ee91e31)gix-pack (4f1bb83)f7d4f33)
</details>Add SHA-256 support This means that if compiled in, SHA-256 packs can now be read and used.
<csr-id-3e389020600415ad9fd0de38835534bfe4889ba0/> reject truncated delta headers within their own data range ClusterFuzz reported a panic in gix-pack's data_file fuzz target for testcase clusterfuzz-testcase-minimized-gix-pack-data_file-6499869547364352. The minimized pack could reach File::decode_entry() and panic while applying a relocated delta instruction range with the slice error 'slice index starts at 11 but ends at 9'.
The first delta decoding pass stored all decompressed delta instructions contiguously, but decoded each delta's base and result size headers from the remaining combined instruction buffer. If a malformed delta header continued past that delta's declared decompressed size, header parsing could consume bytes from the following delta and produce an invalid instruction range for the current delta.
Limit delta size-header parsing to the current delta's decompressed instruction range so truncated malformed headers become delta corruption errors instead of cross-delta ranges. Add the ClusterFuzz artifact and a regression that exercises the same offsets as the data_file fuzz target.
It's notable that it doesn't reproduce when run in debug mode or with the test-suite, but it does reproduce with the fuzzer, and it's fixed now (hence does not reproduce). To keep the suite simple, I removed the extra test.
<csr-id-176d07b9bd00bc83d310f0034452a1448414c55f/> accept non-canonical pack entry size headers C Git accepts overlong pack entry size encodings, and real servers can send them when reusing existing pack data. Accept these headers while recording the actual header length consumed from the pack.
Keeping the actual header length avoids recomputing a canonical length from the decoded size, which would break pack offset reconstruction and ofs-delta base offset calculations for non-canonical entries.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
10c58bb)176d07b)575113d)gix-testtools (ce9e6bd)8af2691)04c894e)278d7ec)0ec3bb7)justfile and automate feature tests (db7b97b)24cdbb0)c5db356)af84752)89a27bf)8e562c7)3e38902)ab2fee1)2cb17b2)e10d5f6)3675a8d)23af41a)gix_object::Data (4309fa4)gix-testtoolsand rename hash_kind -> object_hash (d9648e8)adb8328)
</details>3 commits contributed to the release over the course of 2 calendar days.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
53f880c)gix-object (91bfab0)4d5ba23)
</details>enforce the specification of alloc_init_bytes to handle untrusted input This breaking change is intended to force a decision about how much memory all…
alloc_init_bytes to handle untrusted input
This breaking change is intended to force a decision about how
much memory allocation an untrusted party can command by tempering
with binary file formats.data
Previously we'd hardcode a memory map, but now this is parameterised
with a trait to allow accessing data in a more abstract form.
This is primarily meant to speedup fuzz testing,
but may also be useful later for portability.leb64 and secure leb64_from_read from overflows<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)63b8419)7429b15)e64e3b8)0396152)alloc_init_bytes to handle untrusted input (91d0c26)1dc8ede)leb64 and secure leb64_from_read from overflows (c0ab0f4)cf5279d)data (3ef3916)392336f)7d50c30)d9b358b)gix-object (6df1d55)2a5db88)e4f380e)444a92b)3e05ca3)package.include patterns more specific so they don't match ignored files (c2c917f)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)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)5932e88)GIX_TEST_FIXTURE_HASH for gix-commitgraph and gix-pack. (d51b858)9327b73)
</details>6 commits contributed to the release over the course of 19 calendar days.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
d66ac10)8bceefb)7ce3c55)e8612b5)gix-error (a304f13)f7d0975)
</details>Use std::ControlFlow where possible
std::ops::ControlFlow where possiblegix-error instead of thiserror<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)4c6a7a7)gix-chunk (e6e90ff)gix-error instead of thiserror (0c68131)0a333e5)c663b3f)
</details>2 commits contributed to the release.
<csr-id-d99352bd3b7c75791826b40df20afdd4b0d8b26e/>
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
7be8f90)c0cf38f)d99352b)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>1 commit contributed to the release.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
21fecdf)
</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>
82ff92f)fbf9c39)
</details>3 commits contributed to the release over the course of 1 calendar day.
<csr-id-6f469a6fea59c88e6c69a5f94b0bc8a5977cb75b/>
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
bdcce5f)doc_auto_cfg feature to fix docs.rs documentation. (6f469a6)3313233)
</details>16 commits contributed to the release over the course of 99 calendar days.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
49f8d53)89fb308)4da2927)b188a7d)6cc8464)9365cc3)838ff95)752d6dc)0e7aa81)dc7343c)79ba9d0)202bc6d)d64f257)473fe52)428412c)784c046)
</details>14 commits contributed to the release over the course of 79 calendar days.
<csr-id-fce70950006892f51b32af233656be6fe5de9df3/>
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
5a919c4)65037b5)dab97f7)a9a8ea1)c2eb0c1)bfb1c34)52906fb)56ca4bf)fce7095)f8d7c0a)151e3a5)c3f06ae)d2b4c44)8d4c4d1)
</details>3 commits contributed to the release over the course of 1 calendar day.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
e104545)5f7f805)631f07a)
</details>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)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)5823b22)Cargo.toml files in workspace to gix-features bump (6315536)b5e9059)68e6b2e)1612c73)fc5faf2)420e730)
</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.
git_hash::verify::Error instead of bespoke duplicated versions
thereof, and occasionally returning an ObjectId instead of ()
for convenience.<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
Clippy helped 1 time to make code idiomatic.
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
d248e3d)ada5a94)b41312b)38dff41)4660f7a)4501086)gix_object::{try_ =>}compute_hash users (3d7e379)fbf6cc8)5095f44)4f2b649)54e5764)6c02b0a)gix_hash::Hasher::finalize() (4e935ce)gix_hash (baa1430)7b17da6), just before ) on same line in function calls (66a5ae1)16a248b)8e96ed3)8df0db2)
</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-id-17835bccb066bbc47cc137e8ec5d9fe7d5665af0/>
<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>
dea106a)1f6390c)7ec21bb)rust-version to 1.70 (17835bc)1ca480a)9193b05)0ab4f64)gix-traverse (1de4e70)d22937f)
</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)A maintenance release without user-facing changes.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
beb0ea8)c1ba571)7ea8582)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)54ea266)664e28c)aeaebec)dc0a73a)<= on 32-bit for some size assertions (fc13fc3)7a40648)0f0e4fe)1411289)izip! doctest ignore (0783e9c)db5c9cf)
</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-64ff0a77062d35add1a2dd422bb61075647d1a36/>
<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>
f1364dc)3f7e8ee)b36d7ef)2d1fbce)795962b)64ff0a7)37c1e4c)gix-diff (3fd9fab)af03832)gix-diff (5c1f010)93e86f1)012a754)d69c617)gix-features (ee80b2b)649f588)beba720)37ba461)2e0ce50)c3a7dcf)29ad2df)f992fb7)ec69c88)
</details>A maintenance release without user-facing changes.
A maintenance release without user-facing changes.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
b3ff033)209b6de)
</details>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)
</details>assure duplicate packs and indices aren't overwriting existing ones. That way, on Windows there is no chance for access-denied errors. Maybe there are
<csr-id-a2da5373fada6c1a90d139bba6db7b238ae6504c/>
<csr-id-36d96f124bae7282da69883dc4c8e145261fb0f9/> assure duplicate packs and indices aren't overwriting existing ones. That way, on Windows there is no chance for access-denied errors. Maybe there are other advantages as well even for Unix.
Since packs are usually written rarely, in comparison to loose objects, the extra file accesss seems acceptable.
<csr-id-36d1b69ae6d8765936ebb0dc590a14704dc41e64/> do not write empty packs and indices
Failure can occour on Windows as it's likely such a pack or index is already opened
during negotiation. Then, when an empty fetch via --depth 1 is repeated,
a temporary file would be renamed onto one an mmapped pack or index, causing
a failure.
Now packs or indices aren't written anymore if they are empty.
<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>
6232824)a1b73a6)0470df3)99c00cc)15f1cf7)bf3d82a)ab02aa9)a2da537)8d89b86)1dfa90d)tar files (dcab79a)9fa1054)9923542)ecfde07)f36b9bd)2f9f0ac)acc1331)9c65d98)ea12fc2)68cbea8)
</details>don't panic when unknown entry types are encountered. Related to https://github.com/helix-editor/helix/issues/10660 which runs into object types that
<csr-id-b32a847e10b742834169fac56c284645c1ed28f3/> don't panic when unknown entry types are encountered. Related to https://github.com/helix-editor/helix/issues/10660 which runs into object types that are unknown.
I have looked into this and couldn't find evidence of a new pack-entry type in the Git codebase.
It also looks like that Git will never write packs that aren't V2
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
4f98e94)9511416)04ef31e)gix-pack (bad5b48)b32a847)
</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>
topo more similar to Ancestors, but also rename Ancestors to Simple<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>
095c673)5755271)b590a9d)gix-traverse (1cfeb11)topo more similar to Ancestors, but also rename Ancestors to Simple (2a9c178)gix-traverse (6154bf3)7f6bee5)
</details>assure memory maps are created with MAP_PRIVATE That way, the mmap process should work under more circumstances.
<csr-id-39879af6eaf2bf4fe159a5c6371c98d516c4febe/>
MAP_PRIVATE
That way, the mmap process should work under more circumstances.<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
MAP_PRIVATE (88061a1)b050327)52c3bbd)3e5c974)5722e3a)39879af)f8ce3d0)9e9b9fe)
</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>
45b4470)f2e111f)13d5602)7b44c7f)8430442)684fa5c)2a9ef4e)d4d478b)2482023)0be338f)b8cba96)
</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>
A maintenance release without user-facing changes.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
unsafe (4017e69)eb6aa8f)6a2e0be)b6c04c8)39f35da)3ef3bc2)2a663a0)c85a981)6587eea)ItemSliceMut::get_mut() bound-check to debug-code only. (911c05f)ef21617)
</details>3 commits contributed to the release.
<csr-id-3bd09ef120945a9669321ea856db4079a5dab930/>
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
972241f)8c492d7)rust-version manifest field back to 1.65. (3bd09ef)
</details>add 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-aea89c3ad52f1a800abb620e9a4701bdf904ff7d/>
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
e1aae19)e78a92b)4454c9d)aea89c3)gix-hash (859a092)1691ba6)7549559)35439de)98b08f4)
</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>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)51c7abc)115c993)Node an unsafe constructor (c4807de)Clone impl of ItemSliceSend and make it Sync instead (43bca11)Node private to resolve.rs (7301ca1)Node into resolve.rs (d655ee1)ItemSliceSend::get_mut() from Node::into_child_iter() (d27857d)Item-typed variable from node to item (d6b8977)f528ae8)f4c3380)5a0d93e)bb3224c)2b80d84)a0cc80d)613f018)4f5ab36)6e5ef3b)17a7c6a)c684b26)ff99a18)gix-object (203d69c)c8bd660)82b01c2)gix-object::Find trait (d6e7201)c0e72fb)b65a80b)
</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>
68e5432)1347a54)345712d)b842691)gix-features (9e7c3e1)
</details>4 commits contributed to the release.
<csr-id-f952c101cc8686e685074e8604e0f332c06d6767/>
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
A maintenance release without user-facing changes.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
7891fb1)8a60d5b)
</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-ed327f6163f54756e58c20f86a563a97efb256ca/>
generate and streaming-input feature toggles.
That way, it's possible to not compile a bunch of code in gix if
the writing of packs isn't required.<csr-id-96a07e08e6090222cf398b46aa8d46b56f81f14d/> Use Vec::resize() instead of set_len()
Otherwise it's possible for uninitialized memory to be used as if it was initialized,
which can lead to strange behaviour.
As the buffer is re-used, it's not actually zeroing that much memory either.
<csr-id-24dd870919ba444aa8099c63a78ea120d47ec28e/> use prodash::Count to indicate that nothing more than counting is performed, in place of prodash::Progress
<csr-id-4b74996b19176cb0f00860b3db5a27819d63e7d0/> Make usage of decompression context explicit. That way, the context can be reused which is more efficient than recreating it from scratch for every little delta to decompress.
This leads to a performance gain of 1.3%.
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)6135a5e)generate and streaming-input feature toggles. (0357b6c)dynification (f658fcc)dyn trait where possible. (072ee32)prodash::Count to indicate that nothing more than counting is performed, in place of prodash::Progress (24dd870)prodash (ed327f6)04494c6)9ad9c5b)Vec::resize() instead of set_len() (96a07e0)4b74996)363ee77)
</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><csr-id-93feea269eebd114e866e6f29f4a73c0096df9e0/>
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
6c62e74)30b2761)f23ea88)8f3f358)73c685a)93feea2)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>
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 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/>
Clippy helped 1 time to make code idiomatic.
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
4aca8c2)68ae3ff)c70e54f)e4dded0)8a46a7e)33f95ba)3ef32af)b19a56d)3821089)
</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>
69c6a36)c143cf4)gix-path across all crates (73c1292)
</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>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)6fc7497)
</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-bcad5c22049d56a25ef69d6c7a3344e78f9a1d4d/>
tracing spans for common operations.
This is just the beginning and more crates will integrate with it over time.<csr-id-b9eb40730b53f788d2e4bffe4ef6d9028440782e/> revert 3a2d5286084597d4c68549903709cda77dda4357 to fix 'incorrect data check' error. This error could occour in heavily threaded code for unknown reason. But maybe it's due to threads somehow not cleaning up their reused decompressor properly (maybe related to the zlib-ng version). It's strange and sad as this really costs performnace for no good reason.
<csr-id-8817c248dd7c6453ced654d4df304f98ff18ecda/> don't crash when object validation failed during verification. When objects can't be serialized, they will trigger an error that manifests as IO error. Previously we didn't think of the possibility that writing to an im-memory buffer could fail would indeed panic during verification.
This is now fixed.
<csr-id-cd747f9292fb034e7fd5ee6c5a94a4e53df42e86/> ScopedJoinHandle is not always available
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
ea9f942)18b0a37)5a9a7a3)b9eb407)5861afb)8817c24)aa16c8c)4f635fc)tracing spans for common operations. (3cffa26)fe59956)cd747f9)clippy::redundant-closure-for-method-calls lint (bcad5c2)
</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>
2560a2c)298f3d7)fdee9a2)gix-traverse (1f682fd)
</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><csr-id-3a2d5286084597d4c68549903709cda77dda4357/> improve performance by reducing the trashing of zlib::Inflate.
Previously, for every zlib inflate operation, we would allocate memory
due to the creation of a decompressor.
This is now avoided by reusing thread-local copies of such a decompressor, which is reused and reset instead.
<csr-id-14e7ea0217af8a04ed2b50ff7b13c28335c29022/> improve performance by avoiding zeroying buffers.
Previously we would use resize(new_len, 0) to resize buffers, even though
these values would then be overwritten (or the buffer isn't available).
Now we use set_len(new_len) after calling reserve to do the same, but safe
a memset.
<csr-id-977e135bfa00bdbc1a8f8324f85347ec9078c84f/> static linked list delta cache with memory cap Previously, the 64 slot big LRU cache for pack deltas didn't use any memory limit which could lead to memory exhaustion in the face of untypical, large objects.
Now we add a generous default limit to do better in such situations. It's worth noting though that that even without any cache, the working set of buffers to do delta resolution takes considerable memory, despite trying to keep it minimal.
Note that for bigger objects, the cache is now not used at all, which probably leads to terrible performance as not even the base object can be cached.
<csr-id-f89cbc675b0acc67322e289e7b3a17288b9eae27/> check for interrupt more often Previously when traversing a pack it could appear to hang as checks were only performed on chunk or base (of a delta-tree) level.
Now interrupt checks are performed more often to stop all work much quicker.
<csr-id-923692bcda698b45d3d1ad518b29f6d30b23fbc0/> memory capped hashmap as pack delta cache won't trash memory as much. Previously it would take a buffer from the free-list, copy data into it, and when exceeding the capacity loose it entirely. Now the freelist is handled correctly.
<csr-id-d22dd8fcc22e8dbe30524a1bdddc09bc841db341/> index-backed tree traversal with a form of work-stealing. When delta-trees are unbalanced, in pathological cases it's possible that that one thread ends up with more than half of the work. In this case it's required that it manages to spawn its own threads to parallelize the work it has.
<csr-id-0fa04bcbdf3102c5435e64cfef894a1bfc8d6e7b/> make current thread-count accessible in slice-workers. Threads started for working on an entry in a slice can now see the amount of threads left for use (and manipulate that variable) which effectively allows them to implement their own parallelization on top of the current one.
This is useful if there is there is very imbalanced work within the slice itself.
While at it, we also make consumer functions mutable as they exsit per thread.
<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>
de1f6c2)d22dd8f)14e7ea0)0fa04bc)969cc77)977e135)f89cbc6)923692b)9a9fa96)just fmt (ffc1276)8f15cec)ae845de)9525ac8)d9d9bc0)zlib::Inflate. (3a2d528)420553a)89a8cfe)2578e57)dbf8aa1)2087032)3ef5c90)3eff567)9375cd7)facaaf6)78d28a7)996ba6b)2f275d5)gix-features (c48bbe3)4f879bf)
</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>
7ebc9f7)0135158)43ebaf2)
</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-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)69faad0)gix-object (efeb29d)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)typos tool. (a69f873)
</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>
c1f1bfb)c66e298)3836cc0)01277a6)
</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>
29a0870)e06f5f5)
</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><csr-id-ce182d6dae7e277d104893f0eec3285709946233/> don't over-estimate the number of objects to be received in the indexing phase. Previously, it would work with a number that is pessimistically duplicated as each object could in theory be a ref-delta, which then causes another base to be added to the stream, duplicating the amount of objects we need to account for in the acceleration data structure, which unfortunatelly cannot actually grow dynamically without violating invariants.
Now we simply don't try to estimata the number of ref-deltas (which don't exist here anymore) at this stage.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
0f411e9)gix-pack (6db30ef)ce182d6)
</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-3ba25202240d13fdda998581297616afe06422ca/>
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
ea9fd1d)e6cc618)3cfbf89)addd789)94c99c7)d686d94)dashmap in favor of own sharded concurrent hashmap. (3ba2520)gix-tempfile (bfcd1e3)gix-features (a0ed614)gix-features, use process::count_with_decimals() (3968133)56c005b)
</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)
</details>add wasm feature toggle to let parts of git-pack build on wasm32. It's a breaking change because we also start using the dep: syntax for declaring ref…
<csr-id-ebc7f47708a63c3df4415ba0e702660d976dfb3e/> <csr-id-2290d006705ff47ad780b009fe58ee422b3285af/> <csr-id-598698b88c194bc0e6ef69539f9fa7246ebfab70/> <csr-id-b46347fd3d50886eeca500e31e1e12b354711309/> <csr-id-591afd56d9862a6348ef8b3af61798004b36aa19/> <csr-id-2f2d856efe733d3cf81110c0e0607d2e7c40d968/> <csr-id-9b9f10ad862b5e097c836c51df1eb98607df5ae1/> <csr-id-e0b8636f96e4bfe1bc72b5aa6ad4c4c8538ff92c/> <csr-id-71c628d46088ab455b54eb2330d24dcff96c911d/> <csr-id-8fe461281842b58aa11437445637c6e587bedd63/> <csr-id-e6ff1a885889cf88f6b34b1193aa03d8bce16af5/> <csr-id-f48630ba8f745c2ec61a1e3c51fa63a1789a088c/> <csr-id-f7f136dbe4f86e7dee1d54835c420ec07c96cd78/> <csr-id-25209454d3f7e27e12e8ddca92e43b1ff01d58aa/> <csr-id-c800fdd331e6d7a0b8d756ba822915259f26e9e8/>
<csr-id-6c4c196c9bc6c2171dc4dc58b69bd5ef53226e29/> add wasm feature toggle to let parts of git-pack build on wasm32.
It's a breaking change because we also start using the dep: syntax for declaring
references to optional dependencies, which will prevent them from being automatically
available as features.
Besides that, it adds the wasm feature toggle to allow compiling to wasm32 targets.
<csr-id-95210cb2ba85f75148b4ef48ccea9d9f8a0a0114/> Provide optional candidates for ambigious entries during lookup_prefix()
The candidate entries are all entries matching a given prefix.
<csr-id-37f3a675d7fa931f5d3f38e91df74ec0b517422b/> move data::ResolveBase into data::decode_entry::; unify decode_entry|decode_header::Error into decode::Error.
<csr-id-99905bacace8aed42b16d43f0f04cae996cb971c/> upgrade bstr to 1.0.1
<csr-id-8c5ae77f06a64c57df9a9ad1190266896a223dbe/> Remove deprecated compound and linked object databases The dynamic/general store is the only maintained can-do-it-all DB now.
<csr-id-a79a7fb638b45df88af0d0d5fc9ada6d824bc328/> Improve method signatures of cache::Tree::*
<csr-id-91d047658b114f372735116c9d8e6962a3873137/> cleanup and unify verify_integrity() method signature
Previously they used many different ways of handling their parameters
despite all boiling down to calling the same 'index::File::traverse()`
method.
This allows for more reuse of Options structs and generally makes
clearer how these optinos are used.
<csr-id-2cf7727228e1d8094ffd2eec6746006348c39eab/> index::File::traverse() now returns an Outcome struct instead of tuple of 3 fields
<csr-id-bf04644ab75ed1969507f957dc8d4868790d462d/> remove Option<impl Progress> in favor of impl Progress
<csr-id-6829e5e5d6aed1e6c87647144e2dd76a1e4b9f1f/> multi-index integrity check; use integrity::Outcome for various integrity checks
<csr-id-d851bede97801096d188ff6af06c98a79fe276db/> remove unnecessary Arc around should_interrupt flag
<csr-id-c2679a03358b9c19d63ed1af1cd57324c6381447/> remove Sha1 mentions in index::verify::Mode::* variants
The hash is repository defined and not hard-coded
<csr-id-80b120d3278e46429f848df7af3db13413c36649/> introduce index::File::verify_integrity(…, pack: Option<PackContext>, …), replacing tuple
This allows for more documentation on what input is required there and
generally makes for an easier to use API.
<csr-id-79dc0d5ba6fa31ddd5c075693ffdc6496c1eaded/> rename oid::try_from() to try_from_bytes(), add from_bytes_unchecked()
This change was done in the name of consistency, as from_bytes() is
used in many other git-* crates
<csr-id-2ef9a8424af51310db8c1e6df31dde9953ed3d21/> Change accessors named hash_kind() to object_hash() for consistency
<csr-id-b76f6be6c5baa6cf613a174241f007e92bf5ba36/> consistently use object_hash instead of hash_kind
<csr-id-629412b4cb192614b7eff08dbf203e3448c902c1/> data::Entry::from_read() now takes a hash lengths as parameter That way ref-deltas can be interepreted without hard-coding SHA1
<csr-id-851dc2c52fa8e204ba2d5ced8fb0959a889869d8/> data::Entry::from_bytes(…, hash_len) takes new parameter The hash-len tells it how to interpret ref-delta objects, which store the complete hash of the base object.
This is now entirely configurable.
<csr-id-db8c8c41b4ced0fc296d3877883d801e77d550ae/> index::File::at() with git_hash::Kind parameter
It will allow to assume different hashes even in the index file format
which isn't yet capable of storing this information.
<csr-id-e6a3c9f72332b524b143bc94ee9df0a6db11e864/> data::File::at() and Bundle::at() now have hash_kind parameter
It's used to configure the kind of hash to assume when reading packs and
indices.
<csr-id-82b9b33bd5f4c3c1721a5093de2cedc62cb10565/> move bundle::Location to data::entry::Location
The latter place best describes its purpose.
<csr-id-3f05fea55dc8acce1ed62ecbe4e0a1394f2720b7/> remove make_object_cache parameter from git_pack::data::output::count::objects()
It now is an implementation detail of the Find trait.
<csr-id-e7526b2a7b51cbac4018e1ab3b623a85987fadc2/> parallel utilities now use Send + Clone insted of Send + Sync
This helps to assure that thread-local computations always work with the
kind of types we provide. The ones that are carrying out actions are
notably not Sync anymore.
We cater to that by defining our bounds accordingly, but for those
who want to use other utilities that need Sync, using types like
Repository and thread_local!() is the only way to make this
work.
<csr-id-e8b091943f0c9a26317da0003f7fcdf5a56ef21a/> Rename gix->ein and gixp->gix
<csr-id-ec58bef84d620360dc52e34e173ace1310f74c85/> reduce memory usage for pack resolution by 18%… …compared to where it started out before.
This is the result of using u32 intead of usize where possible, leveraging the object limit of u32 in packs.
This change makes the biggest difference by not keeping the decompressed memory of leaf nodes alive for longer than needed, at the cost of some code duplication which could be extracted into a function if one was inclined to deal with the boilerplate and lots of generics.
<csr-id-49d168a8859c6b5a9e7ef58cd836093212c2c7ad/> Allow verification of empty packs and indices. Empty packs are fine, even though the implementation should probably assure to not write them, or remove them after having been written.
<csr-id-a745512185fb0a46e35daaa6d28829aec05edb55/> increase pack-receive performance using a BufWriter Previously the NamedTempFile would receive every little write request for millions of objects, consuming considerable amounts of time.
Now a buf writer alleviates this issue entirely.
<csr-id-0b6ed60f842f0a36f61f187651080540a358758e/> bundle::write::Error is now publicly available
<csr-id-d9451e8d7fc39c252042f9d2447061262c16ae7a/> downgrade dashmap to 4.0 to avoid unsoundness. See https://github.com/xacrimon/dashmap/issues/167 for tracking progress on resolving the issue.
<csr-id-42e0487286c1f745837c0ce337ed7c9d86b14516/> support Rust 1.52
<csr-id-84ade1d23060f10bf6c8529f8f693d06660b4f4e/> Allow resolution of in-pack ref-deltas This finally allows delta tree caches to be used on typical small packs returned by GitHub.
<csr-id-ba92cc09ba41fe4c9a9097bfeb8d18016408fcdf/> don't try to short-cut detection of large offsets when writing index files The code incorrectly assumed that the input is sorted by offsets, with the largest offset being last, even though by all means that's not the case.
<csr-id-6d3f52dc13d7243a6bce6dab89a985114a75d94b/> Avoid the dashmap being cloned for each thread Intead, share it by reference, it's sync after all.
This issue was introduced when switching to a Send + Clone model,
instead of Send + Sync, to allow thread-local caches in database
handles of all kinds.
<csr-id-b605c1fa0494b10872d3c2e6ecce0e39f1a90a9e/> linked::Store now assures unique IDs across compound stores
<csr-id-20b3994206aa5bc5e35cbbc9c8f8f99187077f79/> Adjust size-hints of resolving entries iterator and use the upper bound in delta tree The delta-tree is a data structure that actually heavily relies on favorable allocation and a known amount of objects in order to provide front and back buffers. However, this is an implementation detail and they don't have to stay consistent at all especially after growing the buffer by pushing to it.
Interestingly, the VecDeque internally over-allocates as well which
definitely helps the example of as_mut_slices(), otherwise
it could also suffer from the assertions that trigger here.
<csr-id-d8fe8141e80a9e9a433b5e1a072b850325c806c8/> don't put more objects into the pack cache than needed Previously when accessing a packed object, it would store the base object into the pack cache (if it wasn't retrieved from there) which is great if that operation is free.
Since it isn't, it's better not to stress the cache with puts and trash more objects than necessary.
Now only the last decompressed object will be put into the LRU cache.
<csr-id-faf6f813927720c5adf62102f9ce46606ff2617c/> don't include submodules in count… …to avoid dealing with missing objects.
It's still a good idea to handle these gracefully though, git itself seems to ignore them.
<csr-id-d792ea543246632bf1ca8d0e1d239bbe7f07e219/> use enumerations to advertise progress ids publicly. Previously these were an implementation detail which also means they couldn't be relied upon.
Thanks to an intermediate enumeration, they become part of the public API and their actual value is not exposed.
<csr-id-f0e40ecddaf1211f76ed60ef30cf03dcfd53a7ab/> add wasm feature toggle to allow compilation to wasm32-unknown-unknown
<csr-id-a85dcddba29a453bbea87ac865b8aedc97f41aed/> add data::File::resolve_header() to obtain object information without decompressing it.
<csr-id-c8835c6edae784c9ffcb69a674c0a6545dbb2af3/> upgrade to prodash 21.1 and add Ids to all progress instances.
That way callers can identify progress they are interested in, say, for
selective visualizations.
<csr-id-450257eb596465352fb363a5c8c514f544e7f9ac/> Bundle::write… also produces a .keep file
These files are placed before moving the coresponding pack and index
files into place to prevent them from being picked up for collection
while their refs are still being placed.
The caller is responsible for deleting them once refs integrate the contained objects into the commit graph.
<csr-id-6836cb148cbadf919bdac2e0e77bdec34caa9307/> more efficient distribution of tasks to threads during pack resolution. This clearly is a peak-performance optimization as it will now efficiently distribut tree-root nodes to threads one at a time by means of shared memory, which is accessed mutably yet safely.
This change can also further reduce peak memory usage as it will not keep buffers of more resolved deltas then necessary, as it only handles one at a time per thread.
<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-503b1a1f8d4f39b44c166209d7a8ba8d74137859/> index::File::lookup_prefix(…)
<csr-id-cb83beedd1aa389f6774e2296f79273e8c8f14f4/> git-hash::Prefix::from_id() A way to obtain a prefix of an object id, with all non-prefix bytes set to zero.
<csr-id-16208306ab49ade30d8ffd6b067ebd8eefd84cd4/> in-manifest and in-lib documentation of feature toggles
<csr-id-b80dec2323b81fb2172df76c7d897a4b5e6bdfea/> zero-objects check for index and multi-index integrity validation
<csr-id-56fc99fb9c1cab61abd03c10e1b4af0d6e491bbf/> support for fan-checking in index and multi-index integrity verification
<csr-id-28e3ea8612112f6a04cfaff591565eca5a1ffba2/> introduce type for entry indices within an index or multi-index That way it's a littl emore descriptive than a bare u32.
<csr-id-58c2edb76755ab71e10eef4cd9a51533825c291f/> git_pack::Find::try_find_cached(…, pack_cache) With this method it's easier to bypass local caches and control the cache oneself entirely.
<csr-id-e25f4eadec679406aad6df10026e27e4832c2482/> A simplified version of the Find trait
It's meant for the next generation of object db handles which keep a
local cache of all the details of the actual object database.
<csr-id-60c9fad8002b4e3f6b9607bba6361871752f4d3d/> control pack and object cache size in megabytes
<csr-id-50cf610e8939812c3d2268c48835e2dac67d0c31/> cache::Object trait for caching and retrieving whole objects
<csr-id-5a8c2da6cb1e2accf7cfdccc16bc3a1d0b2a7dbc/> object cache size is configurable
<csr-id-d6c44e6ab8f436020d4fb235e423b018fd1e7a9f/> dynamically sized full-object speeds up diff-based object counting… …which is what happens when counting objects for fetches where only changed objects should be sent.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
Clippy helped 26 times to make code idiomatic.
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
2f2d856)52b38bc)e695eda)0c81769)a517e39)4eebaac)4a9a05f)f536bad)a0bc98c)d8fe814)2f75db2)e1861ca)58ab2ae)c857d61)6b5c394)9d6f263)719b6bd)2f43a54)e8b0919)b605c1f)c800fdd)52d4fe5)b88f253)52a4dcd)dde5c6b)8ad25c5)ad36fb9)62d3f10)22d35bd)7eff6bf)bundle::Location to data::entry::Location (82b9b33)ed0c266)12db899)make_object_cache parameter from git_pack::data::output::count::objects() (3f05fea)f48630b)5fa1a9d)58c2edb)3310d8f)Find::try_find(…) (ebc7f47)1bb4253)2290d00)Find trait (e25f4ea)dfdd6fb)7517482)91e6d38)f223ecb)235a27a)2e16f13)4f6b030)5dc1f81)4137327)1bea1d4)542c0df)50fde01)f7d5c7f)bfc8069)565a7ae)6a68ed7)93dc660)2fc6751)5457761)9ce1e7f)index::File::traverse() now returns an Outcome struct instead of tuple of 3 fields (2cf7727)c361ee3)3a76a28)b80dec2)56fc99f)8f9a55b)d2bea27)e3dfa12)bb35c69)Option<impl Progress> in favor of impl Progress (bf04644)integrity::Outcome for various integrity checks (6829e5e)Arc around should_interrupt flag (d851bed)index::verify::Mode::* variants (c2679a0)index::File::verify_integrity(…, pack: Option<PackContext>, …), replacing tuple (80b120d)853d468)ce044ef)28e3ea8)data::Id typedef (e0b8636)710780c)10a24c1)73fbc91)eafdff4)1c99903)c2a6918)254f618)a54f552)oid::try_from() to try_from_bytes(), add from_bytes_unchecked() (79dc0d5)hash_kind() to object_hash() for consistency (2ef9a84)754a663)Default implementation for user of Tree::traverse (9da20e9)d548f72)9bf25cc)object_hash instead of hash_kind (b76f6be)ca35246)0cae25b)629412b)851dc2c)7331e99)07aa1bc)e6ff1a8)index::File::at() with git_hash::Kind parameter (db8c8c4)data::File::at() and Bundle::at() now have hash_kind parameter (e6a3c9f)b71ea6a)82fec95)bf62067)69f1d2a)8b8b4c5)8c9c7fc)44ea5c3)ac46765)743d696)a363de9)6ae49e3)e7e40c3)24a9790)3ca04e3)99023bb)fac8efa)b2d2ae2)edf02ae)1a2a049)5e085ec)4b4f9f8)47860b7)831397c)84ade1d)38426a1)7db7195)80a4a7a)6c06659)cache::Tree::* (a79a7fb)verify_integrity() method signature (91d0476)7b2ab26)e3977fe)7721b5f)35bdee4)7558844)52e3c6f)4122306)memmap2 instead of filebuffer (d9011c7) ([d71bd9d`](https://github.com/GitoxideLabs/gitoxide/commit/d71bd9ded1e5e5a61a27be3d55f4b85ee4049bcf))8240622)index::File::lookup_prefix(…) (503b1a1)d09fd9b)927b2ac)b558f11)69cb6d1)cff6f9f)5bc548e)75efa79)cb83bee)467453a)814de07)f95c1a0)84cb256)cc2d810)git-path crate instead of git_features::path (47e607d)7e76796)f86eacc)e5f6943)bba4c68)de2d587)4b320e7)c28404b)5ffe54f)4db4754)8a63076)a76a0e1)0340896)candidates for ambigious entries during lookup_prefix() (95210cb)a2f9fa4)b593806)prodash v21 (a0655dc)pack- (e489b10)a745512)index::write::Outcome::index_kind -> ::index_version. (b46347f)72ce7fd)bundle::write::Error is now publicly available (0b6ed60)bundle::write::Options::index_kind -> ::index_version. (591afd5)bstr to 1.0.1 (99905ba)caa7a1b)3877920)6d3f52d)bcb3d37)f9232ac)70179e2)faf6f81)60c9fad)71c628d)8fe4612)50cf610)5a8c2da)d6c44e6)80c6994)2664d73)rust-version to 1.64 (55066ce)8c0bca3)59e9fac)48f5bd2)a5869e0)41d57b9)e313112)6efd0d3)6ccc88a)c9275b9)git-testtools to gix-testtools (b65c33d)git-pack to gix-pack (1ee81ad)git-pack to gix-pack (134d70d)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-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 `giYour coding agent can read these notes before it upgrades. Set up the MCP server →