NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
crates.io · #1232 most downloaded on crates.io
A git-config file parser and editor from the gitoxide project
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 54 of 56 stable releases
1 version withdrawn
withdrawn after publishing
4 years old
57 releases · first in 2023
One column per quarter.
Nothing published for this version
Nothing published for this version
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)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.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
6428edc)f7d4f33)
</details>keep descendants of ignored directories excluded I looked at this carefully, and ended up having a better comment to provide an example for what this
keep descendants of ignored directories excluded
I looked at this carefully, and ended up having a better comment
to provide an example for what this covers.
Ultimately, this is test extension is still minimal compared to the
behaviour that it enables, scoped status, but I think it's fine
in there interest of less code.
Scoped status walks can enter an ignored directory when a pathspec
matches. If a deeper directory matches a negated rule such as !out/,
the ignore stack previously stopped at that nearer match and exposed its
contents as untracked. Tix uses scoped walks for filesystem refreshes,
so ignored Cargo output appeared after unrelated worktree events and
disappeared after a full refresh.
Continue through negated directory matches to check excluded ancestors.
Keep the nearest negation as the fallback when no ancestor excludes the
path, and preserve the precedence of positive directory matches,
including precious-file handling.
Extend the Git-reference fixture below a negated child directory and
refresh both hash archives. The extended fixture fails with the previous
matcher. All directory-walk, status, and worktree tests pass, as do the
SHA-256 ignore baseline, formatting, and Clippy with -D warnings.
Clippy retains the workspace's existing removed-lint warning.
raise MSRV to Rust 1.88
The newly published dua-core 3.3 release used by linked-worktree removal
requires Rust 1.88, so raise every workspace crate and the advertised badge
together.
Keep the MSRV checks buildable by selecting the latest sysinfo and rusqlite
release lines that support Rust 1.88.
support cloning a single revision
A full object ID passed through with_ref_name() produced an object-ID refspec
mapping and panicked while clone assumed every mapping had a name. Branch and
tag checkout also retained ordinary clone tracking semantics instead of offering
a single-revision mode.
Add PrepareFetch::with_revision() and gix clone --revision for full refs, HEAD,
and full object IDs. Revision clones use a one source-only implicit refspec,
detach HEAD to the fetched commit, create no ordinary refs, persist no fetch
refspec, and disable tag following. Existing with_ref_name() and --ref behavior
stays unchanged.
This follows Git commit 337855629f59 (builtin/clone: teach git-clone(1) the
--revision= option) and its t/t5621-clone-revision.sh behavior.
gix-date (613ff86)<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
10c58bb)575113d)1bc4ce3)gix-testtools (ce9e6bd)278d7ec)sha1 feature in gix to just set what's needed. (16a6fc4)4743361)1980190)e3d5a04)ab2fee1)2cb17b2)3675a8d)adb8328)
</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-id-d4439cd5b5aa82c126198aa57de6a9ebbc15d371/> Limit Commit and Tag parsing to a given gix_hash::Kind
Doing so adds conformity with Git, but also simplifies the parser
which now only parse hex-hashes of a single valid length.
<csr-id-91c854e7b9f41738d0fde825cd474b8c00c1a49b/> remove winnow and replace it with hand-implemented parsers everywhere.
This will allow for simplified maintenance and editing (both human and machine)
down the road, and enable additional performance optimisations.
Parser compbinators to me ultimately were a failed experiment as I couldn't maintain them anyway, with it being too difficult for me to grasp and express everything in its very own kind of language, with a lot of different things to consider.
Note that this also removes detailed errors from all parsers that previously
used winnow, with the option to re-add those if there is demand.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
53f880c)gix_hash::Kind (d4439cd)5127973)winnow and replace it with hand-implemented parsers everywhere. (91c854e)4d5ba23)
</details>accept owned AsKey inputs in raw setters set_raw_value() and set_raw_value_filter() no longer require config's 'event` lifetime internally.
<csr-id-672d7cd853fcb25223d750261aac4e4f0f8e528c/> accept owned AsKey inputs in raw setters
set_raw_value() and set_raw_value_filter() no longer requireconfig's'event` lifetime internally.
This makes the setter APIs consistent with the read-only raw accessors and allows short-lived key inputs, such as String-backed values, to be used without forcing an extra borrow at the call site.
Add a regression test covering short-lived keys passed to set_raw_value()
<csr-id-cf6c4035e40ca8790a010f4e268ffe51004eeecb/> allow &str to be parsed as key properly
Previously there were lifetime issue because the key
needed the same lifetime as the underlying parsed file,
which was hard to accomplish even with &'static str'
as it really needed "&'static &'static str".
However, this also means that owned keys can't be passed anymore.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
f9fbcba)a1ad31b)63b8419)e64e3b8)0396152)444a92b)package.include patterns more specific so they don't match ignored files (c2c917f)44020e0)9d04035)50fb46f)AsKey inputs in raw setters (672d7cd)af1ad55)&str to be parsed as key properly (cf6c403)29c275e)b1102c2)98bae84)
</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>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>2 commits contributed to the release over the course of 10 calendar days.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
ecf90fc)9327b73)
</details>4 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)f7d0975)
</details>6 commits contributed to the release over the course of 21 calendar days.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
cbbdef5)562e684)0a333e5)c663b3f)7be8f90)211b4fb)
</details>4 commits contributed to the release over the course of 12 calendar days.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
115e208)d6c5b9d)
</details>5 commits contributed to the release.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
21fecdf)f8435ea)6bf895c)93dd630)703644c)
</details>2 commits contributed to the release.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
82ff92f)fbf9c39)
</details>3 commits contributed to the release over the course of 1 calendar day.
<csr-id-6f469a6fea59c88e6c69a5f94b0bc8a5977cb75b/>
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
bdcce5f)doc_auto_cfg feature to fix docs.rs documentation. (6f469a6)3313233)
</details>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>
Source::User now produces a directory even if HOME is not set.
This way it's easier to use downstream which may not have typical environment variables
set, particularly on Windows.<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
89fb308)4da2927)b188a7d)6cc8464)9365cc3)838ff95)eee5199)888b763)10a20d6)Source::User now produces a directory even if HOME is not set. (042efa0)dc7343c)79ba9d0)202bc6d)d64f257)473fe52)428412c)784c046)
</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/>
Clippy helped 1 time to make code idiomatic.
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
5a919c4)65037b5)dab97f7)a9a8ea1)dd5f0a4)554ce13)f8d7c0a)gix-config/gix-object benches to changes in criterion (91aef25)gix-config tests to changes in tempfile (eccd13a)151e3a5)648022b)f0ed2cc)c3f06ae)d2b4c44)8d4c4d1)
</details>3 commits contributed to the release.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
e104545)5f7f805)631f07a)
</details>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>File::section_ids() iterator and file::SectionMut::set_trust() #(1912)
That way it's easier to make changes to sections in a mutable instance of
Git configuration.<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>
cc5b696)49fa9f3)db0b095)0bf84db)3b1bef7)c3c6504)6f009d7)46227e6)06bf1e1)359914c)File::section_ids() iterator and file::SectionMut::set_trust() #(1912) (aa91f9a)5823b22)Cargo.toml files in workspace to gix-features bump (6315536)b5e9059)68e6b2e)1612c73)fc5faf2)420e730)
</details>Resolve Winnow deprecations (`3cd3e2a`)
File::remove_section_filter()
The underlying issue isn't fixed, as ids in the lookup table remain even after deletion.
However, for now it was easiest to defensively access this data, while assuring that
the API (still) does what it claims.<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>
File::remove_section_filter() (be80806)ada5a94)b41312b)38dff41)7b17da6), just before ) on same line in function calls (66a5ae1)01bd76d)16a248b)8e96ed3)503098d)11ac79c)fdc57e7)3cd3e2a)783c4e6)8df0db2)
</details>4 commits contributed to the release.
<csr-id-f952c101cc8686e685074e8604e0f332c06d6767/>
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
<csr-id-17835bccb066bbc47cc137e8ec5d9fe7d5665af0/>
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
dea106a)1f6390c)7ec21bb)rust-version to 1.70 (17835bc)e8b3b41)
</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>hasconfig:remotes.*.url:<url-glob><csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
4000197)8ce4912)bc9d994)700cfa5)gix-packetline-blocking copy auto-generated (325588e)7a40648)0f0e4fe)c5955fc)hasconfig:remotes.*.url:<url-glob> (92558a1)gix dev-dependency. It's not really required. (581ef67)23034b0)db5c9cf)
</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-64ff0a77062d35add1a2dd422bb61075647d1a36/>
<csr-id-9c619e48db145928ff6ac420d6bb3d79deefc9f8/> make all filter arguments non-dyn.
Otherwise it can happen that &mut |section| {...} needs to be borrowed
for 'static, which makes it impossible to use.
The coercion seems to be messing with lifetimes.
<csr-id-17573779688e755a786546d5e42ab533088cd726/> remove all workspace dependencies The problem is that with them, we don't notice anymore if the crate changes, because a dependency changes. That also means that older versions of the dependency may stay even though some other crates might pick up a newer version.
Ultimately, this will lead to drift and subtle incompatibilities.
We declare this breaking to enforce a proper re-release.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
Clippy helped 1 time to make code idiomatic.
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
3f7e8ee)48aa74b)9c619e4)795962b)507579e)64ff0a7)37c1e4c)af03832)72daa46)cdac4a9)22fbe70)fe1eb97)93e86f1)012a754)649f588)beba720)37ba461)2e0ce50)f992fb7)ec69c88)46cd1ae)1757377)
</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>
b3ff033)209b6de)
</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>
f2b522d)a65a17f)d19af16)0f25841)2e00b5e)unicode-bom (89d77dc)winnow a workspace dependency (78a7e32)1d37bf6)f5cd3ba)
</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-0dc2a0c467d2bee7f345c68a56e6c89ce10faf9c/> prevent newline amplification A fuzzer found input sized 780kb, but the output becomes 180MB in size, ultimately taking 48s to parse on M1 Pro.
Note that the parsing itself is fast, but we seem to modify the input in such a way that parsing takes way longer than it should. That might be another issue which it will probably find next, let's wait for it.
<csr-id-a9a3545db2b2cfa37f685666046c2ffd5f3fa806/> File::from_globals() now also provides options of the Git installation.
That way, it's usable for learning everything about credentials for example.
<csr-id-0ec2389e4e3c457f87cff2cbdd394a94f7d0d54a/> gix-config convenience initiative
A new gix_config::AsKey trait allows all gix_config::File methods
to receive an implementation of AsKey instead of the tuple of
(section, subsection, value_name). This is the default, and all
methods that take a tuple have been renamed to <name>_by(), note the _by suffix.
The terminology was reworked so that key is now only used to identify a value.
This change also affects the public API of gix, which provides
ways to set values on configuration snapshots which now by default
will only take a AsKey implementation.
Note that gix::config::tree::* keys now also implement AsKey,
which allows them to be used more conveniently when setting values,
too.
<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>
6232824)a1b73a6)0470df3)99c00cc)15f1cf7)mem::usage() expected peak (7dd58b8)ed66357)0dc2a0c)6c0364a)929744a)File::from_globals() now also provides options of the Git installation. (a9a3545)8d89b86)1dfa90d)tar files (dcab79a)5663a2c)gix-config convenience initiative (0ec2389)dbe1f22)9fa1054)2f9f0ac)acc1331)9c65d98)ea12fc2)68cbea8)2cefe77)8da55a3)2d0a352)
</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>
4f98e94)9511416)d6cd449)cd4de83)04ef31e)gix-pack (bad5b48)
</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/>
Clippy helped 1 time to make code idiomatic.
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
095c673)5755271)55f379b)f72ecce)b590a9d)7f6bee5)45edd2e)52efa90)0ce06a6)a5168aa)
</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>
b050327)52c3bbd)3e5c974)f8ce3d0)e09a4ec)e5f815a)29e470b)819d7eb)b3556b2)096fd12)ba3bf65)6281e1a)
</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/>
Clippy helped 1 time to make code idiomatic.
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
45b4470)f2e111f)a663e9f)e175b20)516e105)face359)ae86a6a)53e9b4e)13d5602)7b44c7f)8430442)69cb78b)b7ca4b2)9470554)b8cba96)3edf0fe)
</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-b382f76a4ace08a6e743b292c4f2c383dfd94e8f/> assure excessive amounts of newlines can't lead to amplification. Now we won't read more than 1024 newlines in a row, which leads to a protection from specifically crafted configuration files which can amplify themselves when large amounts of edits happen on them.
If somebody where to create a lot of sections based on one that has a huge amount of newlines before it, this whitespace would be retained with each new section, causing huge files to be created in memory that cause great delays when writing the file back and re-reading it.
Maybe there would have been a way to avoid copying excessive amounts of whitespace when altering a section, or maybe one could also have adjusted the fuzz-test that found it [1]. This would, however, have been much harder and time-consuming to implement for dubious value.
<csr-id-c71d16e45ea4ed68b76a43a7ed653d73f3672878/> greatly reduce peak memory usage when reading files. Previously it was possible to cause a memory consumption of 2.5GB by merely reading a specifically tuned configuration file sized a little less than 1MB, a massive 2500x amplification.
Data structures have been optimized and premature optimizations removed in favor of much more efficient memory usage.
Now the same file causes a 36MB peak memory usage, still quite a lot, but also ~70x less than before.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
eb6aa8f)6a2e0be)4138902)b6c04c8)b382f76)17a81c7)6bb407f)c71d16e)36f4d92)34e4a16)2420547)9cdb461)
</details>5 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)ce44fe3)fee6bde)
</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><csr-id-aea89c3ad52f1a800abb620e9a4701bdf904ff7d/> <csr-id-14460020ff5f5c6f1d5c4089d35d7d6932604d14/> <csr-id-ebc051c1d470bbb063deb9ff57ba058b93f1e8a3/>
GIT_CONFIG_NOSYTEM is treated as boolean.
That way, it can also be deactivated, which is exactly what git
does.<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
Clippy helped 1 time to make code idiomatic.
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
e1aae19)e78a92b)4454c9d)aea89c3)d38d1cc)7ddf948)f89e6c4)0f71709)27490d9)c6d1635)b6d4e99)75f48d6)90219cd)7917c13)file_section test in favor of integrating reasonsable tests with file. (64a4a75)1446002)ebc051c)f5a0296)8053710)1691ba6)c1cfe6e)7549559)35439de)ff1542c)GIT_CONFIG_NOSYTEM is treated as boolean. (1fe600e)
</details>GIT_CONFIG_NOSYSTEM now also affects the installation directory. It makes sense to consider it part of the 'system', and allows for proper isolation o
<csr-id-6738955949d82a66c070dcb65e368652898bd1d2/> GIT_CONFIG_NOSYSTEM now also affects the installation directory.
It makes sense to consider it part of the 'system', and allows for proper
isolation of gix operations, for example in tests.
This is also a fix, as previously it checked for ...NO_SYSTEM, instead of NOSYSTEM.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
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>
55d386a)d3dcbe5)winnow 0.5.24 (abcfb65)51c7abc)5a0d93e)bb3224c)c0e72fb)b65a80b)
</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>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)
</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><csr-id-db0c4017142fd25d26d1c6860972b1ac84b24a6e/>
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
7891fb1)8a60d5b)9c528dc)db0c401)
</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>log dependency in favor of gix-tracedyn 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>
8bd0456)375db06)6135a5e)gix usage for faster compile time (9d33e2f)log dependency in favor of gix-trace (2b8d09f)dynification (f658fcc)dyn trait where possible. (072ee32)5044c3b)363ee77)
</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><csr-id-ef54aab9e5521add4154ee8d902d62612a9d8d4a/>
<csr-id-c51c8daee1ab54130ae3ed83ce67d08f01c4881a/> fix incorrect s/git-config/gix-config/ 3a861c8f049f6502d3bcbdac752659aa1aeda46a just blindly replaced any occurence of "git-config" or "git_config" with "gix-config"/"gix_config".
There is no such thing as a gix-config file. gix-config is a git-config file parser.
<csr-id-66dadf807f41aa9e828639c52a7d220bf4f3df72/> regression that could cause non-linear parsing behaviour.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
30b2761)f23ea88)8f3f358)73c685a)0d258f4)nom to winnow in remaining uses in gix-object, gix-ref, and gix-actor for ~20% more performance. (ef54aab)winnow to latest patch release (8c41848)7735047)c51c8da)66dadf8)a743c5d)0f9af3f)5366f79)e208362)3f8c91f)ee75de1)510192e)
</details>This release fixes a possibility for V1 fetches to deadlock if negotiation would span multiple rounds (see issue #882) for details.
<csr-id-bcad5c22049d56a25ef69d6c7a3344e78f9a1d4d/>
This release fixes a possibility for V1 fetches to deadlock if negotiation would span multiple rounds (see issue #882) for details.
gix level.
This is merely a debug tool to learn about generation numbers.
All commit-graph commands now operate on a repository.<csr-id-c494cfd6f80cf273107c626d0f2cbe054db378ee/> gix --trace to also print tree-like instrumentation
<csr-id-452ed6b79ed0e12ae214af3c8cd49a87dba91c73/> gix fetch --open-negotiation-graph[=limit]
Open the negotiation graph as SVG, after optionally specifying a limit
as rendering/layouting can be very slow.
It's useful to see how the negotiation algorithm is reasoning about each commit.
<csr-id-096838ffa529148b2da3a2382a2d1fdbfe5bee5b/> gix fetch --negotiation-info to provide additional information about the negotiation phase.
<csr-id-bd32e393fedd01e27a4f6984281bcc3182c63b67/> bit revision list --svg to create a visual graph of commits.
It's mainly a test of how well layout-rs performs.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
Clippy helped 1 time to make code idiomatic.
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
gitoxide publishable again (c16b1df)5861afb)corpus --dry-run and --task-sql-suffix and --repo-sql-suffix (4cef57d)0f973ac)gix-trace (bd6e3d7)aa16c8c)361cf96)gix --trace to also print tree-like instrumentation (c494cfd)cfd8e88)a0b4385)a4300c8)fcbda1d)gitoxide version according to what's in git (83f6466)d9e74ff)036e60a)gix fetch --open-negotiation-graph[=limit] (452ed6b)gix fetch --negotiation-info to provide additional information about the negotiation phase. (096838f)gix docs available when using cargo doc (518159d)bit revision list --svg to create a visual graph of commits. (bd32e39)fe59956)2213321)ff8d42a)750b07a)clippy::redundant-closure-for-method-calls lint (bcad5c2)8d2e6a9)gix level. (b82edc8)gix config tree (7aaaebf)
</details>File::push_section() is now infallible.
Previously it used a Result even though it couldn't fail anywhere.<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
4604f83)gix-submodule (f3c4311)b629f8a)File::push_section() is now infallible. (d091c78)6b4a303)ef8ccd9)
</details>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.
The parsing switches from nom to winnow, which eases maintenance and improves performances.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
231ac1c)db63815)e4d2890)daf3389)224121b)1a1e2f5)beac408)63552ee)8db009c)fe997c8)8581d25)9e6ba0f)b790948)5fc1096)083efbc)5f2b68e)0fe3854)d2e06c8)edb4e04)bdcd379)42ae766)b0287a8)a639994)cfc642a)18bee03)6ac1b37)5b3ae94)3d9ae21)
</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>
The main attraction of this release is support for multi-round negotiations thanks to support for the standard negotiations algorithms. Further, gix i
The main attraction of this release is support for multi-round negotiations thanks to support for the standard negotiations algorithms.
Further, gix index entries now lists attributes as well, and there is the new gix attribute query sub-command in the vain of git check-attrs.
gix attributes validate to validate attributes and ignore against git as baseline.
Use this command to test the entire index for ignored paths and their attributes and use
git check-attr and git check-ignore to validate that git agrees. Collect all
mismatches and print them.--statistics for gix excludes query
With it one gets some insights into the work done to fulfil the query.gix attribute query as something similar to git check-attrs.no-repo index from-list to create an index with empty files from the given list.
The list could be created with find . -type f for example.gitoxide on docs.rs<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
just fmt (ffc1276)ae845de)gix (7983f6f)d925896)dbf8aa1)b057500)4507f94)33b7770)a849da8)gix attributes validate to validate attributes and ignore against git as baseline. (e1fcc7f)1d70213)--statistics for gix excludes query (450b232)gix attribute query as something similar to git check-attrs. (bfdcb14)no-repo index from-list to create an index with empty files from the given list. (b8db207)edeb4de)gitoxide on docs.rs (13a0f1e)jwalk to have a better comparison. (d67551d)
</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>
68ae3ff)c70e54f)e4dded0)3ef32af)
</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>A maintenance release without user-facing changes, just to fix installation
A maintenance release without user-facing changes, just to fix installation
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)285ce12)
</details>gix index entries also prints attributes.
gix index entries also prints attributes.gix clone and gix fetch with controls for shallow repositories.ein t trace-path know accepts the trace-file alias.stdout on each write, now this is done only once.gix free index entries into gix index entries.<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
ed63ec0)7bd8823)f37a930)gix index entries also prints attributes. (08e8fc2)dd14a80)gix free index entries into gix index entries. (ca8ebdf)3456c84)gix-worktree (13a070f)69faad0)8d5762c)23ee47f)3d47919)9237121)ee36e5b)bbb4cb0)index.skipHash (f29f35c)3836cc0)cc0f506)c502fa8)531dd19)gix clone and gix fetch with controls for shallow repositories. (9723e1a)ein t query (d5616b6)8ef1cb2)3827ac6)ein t trace-path know accepts the trace-file alias. (f93e964)
</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>This release adds the new ein tool query analytics engine, which maintains a database of a git repository as acceleration data structure to run useful
This release adds the new ein tool query analytics engine, which maintains a database of a git repository as acceleration data structure to run useful queries on.
It's nothing more than an MVP, and was inspired by a program to accelerate Git-Heat-Map.
ein tool query - a git analytics engine.
A tool to build and efficiently maintain a database of information contained
in a git repository, preferably the kind of information that is expensive to obtain,
in order to facilitate queries that would be prohibitive without an accelerating
data structure.gix tree entries with rev-spec support.
Previously it wanted a tree-id, now it can derive it itself.<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
<csr-id-dbc6cbb4363c2532f81b0bd6e351c4577bb9e9a3/>
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
9a9fa96)8f15cec)420553a)2578e57)dbf8aa1)4795fcf)3ef5c90)279dc09)dbc6cbb)13e01f5)
</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>
c9275b9)git-protocol to gix-protocol (823795a)git-features to gix-features (e2dd68a)6461c3d)git-repository to gix (7bed2a9)9e7d792)0f2ed59)
</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>gix clone is now permitted without specifying a destination directory. Note that the implementation doesn't take into account potential redirects and
<csr-id-1d9a5e925890883e9e712db14ac82411ad2fdfc3/>
gix clone <url> is now permitted without specifying a destination directory.
Note that the implementation doesn't take into account potential redirects and renames
as it's implemented only with the first URL it sees (not the redirected ones).http.schannelCheckRevoke<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>
gix clone <url> is now permitted without specifying a destination directory. (b81f650)e22080e)7bba270)gix progress now usees the configuration tree as basis for data. (ea76bf5)f7b8794)1d9a5e9)b93f0c4)9e04685)tabled (7aed326)76c99f3)f8c562a)d336368)ssh related configuration variables. (3f91088)d821fc5)38ae61a)
</details>home in env::home_dir()gix-path for obtaining some shared directories as base for path generation.
This will make system wide configuration available on windows at least when using the migw builds.<csr-id-b83ee366a3c65c717beb587ad809268f1c54b8ad/> Rename serde1 cargo feature to serde and use the weak-deps cargo capability.
With it it's possible to not automatically declare all optional dependencies externally visible
features, and thus re-use feature names that oterwise are also a crate name.
Previously I thought that serde1 is for future-proofing and supporting multiple serde versions
at the same time. However, it's most definitely a burden I wouldn't want anyway, so using
serde seems to be the way to go into the future.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
serde1 cargo feature to serde and use the weak-deps cargo capability. (b83ee36)91134a1)30a1a71)74cb5ee)home in env::home_dir() (13edfe9)8dbd0a6)cdef398)19338d9)23ee47f)3d47919)gix-path for obtaining some shared directories as base for path generation. (da9009f)d0052c1)f9ad837)6932017)
</details>8 commits contributed to the release over the course of 3 calendar days.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
38eed1d)d47cebe)d1e5e12)d1bd513)02c4659)cc48c35)e965b18)877951a)
</details>allow requiring archived scripted fixtures
allow requiring archived scripted fixtures
Add version-aware fixture loaders:
scripted_fixture_read_only_with_git_version()scripted_fixture_read_only_with_args_with_git_version()Both use normal fixture generation when the installed Git version satisfies
the caller-provided predicate. For incompatible versions, they require an
identity-matching archive, ignore GIX_TEST_IGNORE_ARCHIVES, and return None
instead of running the fixture script when no usable archive exists.
git --version each time a metadata directory is created.expand gix-testtools fixture support
Note that I did only skim through git.rs,
considering the details of the implementation secondary to the outcome.
gix.rs was refactored quite a bit, helping to provide more utilities
in other plumbing crates to help with this 'gix' avoidance.
Add deterministic repository snapshots covering HEAD, references, reachable
commits, every index stage, conflict-free index trees, and exact worktree
contents. Provide a portable form which omits platform-specific filesystem modes
for stable cross-platform assertions.
Add writable Git-version-aware fixture APIs for copy and execute creation modes.
Require archived fixtures when the selected Git is incompatible, without running
unsupported scripts or post-processing.
Use the Git executable selected by gix-path consistently for version checks,
helper commands, and fixture scripts, including PATH selection for scripts.
Harden signing fixtures with command-compatible paths, isolated homes, and
complete SSH key pairs.
git --version each time a metadata directory is created. (4314d09)gix-attributes (e11d7a2)This release also fixes compatibility issues that formerly prevented to fetch or clone form https://googlesource.com.
GIT_(COMMITTER|AUTHOR)_(NAME|EMAIL|DATE) with git configuration.
That way it becomes more obvious where values are coming from.<csr-id-98143699bb9481b010e21647f64dcb8a74bd80ad/> auto-enabled verbosity for gix fetch/clone and add --no-verbose.
I found myself always adding (and having to remember to add) the -v flag
for long-running operations so these should be able to default to a
higher verbosity level.
To counter that, there is a new --no-verbose flag to turn that off.
<csr-id-aeb4a1d5cb76316058c7d687e26f5c7db351c09c/> add --strict option to enforce strict checking of configuration.
<csr-id-8c9c243fc574dc17b92a8e2025fbd8efdf2833da/> gix odb stats to calculate statistics on the object database.
This includes the amount of objects along with a listing of where they are
located.
<csr-id-e2b8c5dce7185b5fa194b90f32e642e5c9d1227f/> gix clone --no-tags support.
This is the same as git clone --no-tags.
<csr-id-49f39d6bb487c0254176a5082f2c7851b83952a1/> open::ReplacementObjects is removed in favor of two custom git-configuration flags.
Now it's possible to map the environment variables GIT_REPLACE_REF_BASE and GIT_NO_REPLACE_OBJECTS
to custom git configuration keys which can also be set, namely gitoxide.odb.replaceObjectsRefBase
and gitoxide.odb.noReplaceObjects.
Along with the possibility of disabling the usage of GIT_ prefixed environment variables one
reaches the previous level of control without making object replacement a special case.
<csr-id-becbd8d896a1663f1607be4e86e632773e926f1f/> represent object cache configuration like GITOXIDE_PACK_CACHE_MEMORY in git-configuration.
That way there is a unified system for how to set values, which may be overridable by configuration
variables or not.
With this changes, the explicit application of environment variables for setting the cache isn't required anymore as everything happens using git-configuration, and automatically, while providing full control like before.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
ein t estimate-hours command (4c93de1)3d01252)gix odb stats to calculate statistics on the object database. (8c9c243)c57bdde)083909b)gix clone --no-tags support. (e2b8c5d)gix progress to inform about remote.<name>.tagOpt (3ebb340)70ccbb2)77ab98d)gix fetch/clone and add --no-verbose. (9814369)atty to is-terminal (7304bc1)git-repository (c4f68bf)GITOXIDE_PACK_CACHE_MEMORY in git-configuration. (becbd8d)GIT_(COMMITTER|AUTHOR)_(NAME|EMAIL|DATE) with git configuration. (a4ac9cf)open::ReplacementObjects is removed in favor of two custom git-configuration flags. (49f39d6)9441c26)git-repository (f1a4c8b)872dc1a)--strict option to enforce strict checking of configuration. (aeb4a1d)62cae0e)git-config (1c2e755)bcd9654)
</details>gix_quote::ansi_c::undo().<csr-id-e55f4ee230ed3164df5145c7a2b212464bb9db99/> allow to ignore IO errors when reading configuration files. Sometimes, IO errors can occour consistently when reading from certain paths (on Windows, really), and it should be possible to not only see which path that is but also to ignore them entirely.
Now IO errors contain the path of the failed configuration file. There is also a new option flag to ignore errors (off by default).
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
5dc1f9f)3016a28)ee36e5b)serial_test no default features) (8f2accd)typos tool. (2321eb9)01277a6)
</details>Make reqwest TLS backend configuration easy. We provide the choice of native-tls or rust-tls. If none is provided, the user can configure on their on
<csr-id-3ddbd2de369b521fa3f21935f10fe9c248840893/> Make reqwest TLS backend configuration easy.
We provide the choice of native-tls or rust-tls. If none is
provided, the user can configure on their on similar to how it's done
in gix.
Please note that a choice now has to be made or HTTPS will not be available, so use one of…
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
reqwest TLS backend configuration easy. (3ddbd2d)
</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>This releases fixes gix fetch so that it is able to clone or fetch pytorch or other repositories on case-insensitive file systems.
This releases fixes gix fetch so that it is able to clone or fetch pytorch or other repositories on case-insensitive file systems.
It's also an attempt to trigger CI to build binary releases.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
665b53e)c76572b)gitoxide.http.connectTimeout for more control for git clients (2ab80e4)no_proxy environment variable support (f0625de)3d9fb6c)0ec5220)1c012f4)f5499a5)1afaebd)
</details>A maintenance release without user-facing changes.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
93e75fe)895e482)0f411e9)
</details>gix remote ref-map --show-unmapped-remote-refs. That way it's more obvious to see what was filtered out by ref-specs.
<csr-id-e973dfeaf17ca63385496202e9fdcdd912e20f42/> gix remote ref-map --show-unmapped-remote-refs.
That way it's more obvious to see what was filtered out by ref-specs.
It's also great to validate that server-side filtering via ref-prefix will not send refs that are referred to by symbolic refs that are not filtered out. That should be fine as it's all about objects, it's just something to deal with as we may have to deal with symbolic refs that aren't in the set of refs the server sent to us.
<csr-id-b1edb9e3537df86669714f03666f4a88e0ac3709/> diff algorithm is controlled by git configuration diff.algorithm
<csr-id-20259da4ddf9fabfb2d2bd4e2274c0ed42bdb0e5/> ein t hours allows to specify the amount of worker threads.
<csr-id-3a053284cfefe27873dcc5b4f74d63a560bb5d41/> collect stderr and print it afterwards to avoid intersection with line progress.
Previously it would happen that stderr would be printed directly and mix
with the line progress (as in -v) which also prints to stderr.
Now errors are collected and output at the end once the line renderer was already shutdown.
lock_mode from all methods dealing with reference edits.
It is now read from core.filesRefLockTimeout accordingly.gix remote --url in favor of determining the intention similar to git fetch<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>
443a75a)gix remote ref-map --show-unmapped-remote-refs. (e973dfe)diff.algorithm (30d32e7)c8ef759)stderr and print it afterwards to avoid intersection with line progress. (3a05328)clone and print once entire clone is done (9a476df)gix clone (23a5e8b)63947ae)f5e2eeb)core.checkState (8b2aba1)de13c66)gix progress (0e9bd41)d10a82e)init.defaultBranch - now used by custom initialization. (4d6d7bb)gix fetch (c47dcc6)d034882)gix remote --url in favor of determining the intention similar to git fetch (92bbe33)--url for arbitrary urls when fetching (8c7351c)gix fetch (5b72d27)fd18320)lock_mode from all methods dealing with reference edits. (3a0fb1b)7076891)3c188b2)eade88f)6abd5a4)5c0d0ab)65e6496)b42b08a)317e02a)gix progress show (92e082a)ein t hours allows to specify the amount of worker threads. (20259da)ba17db0)index.version for when we can write V4 indices. (da96d34)ad44982)1ec27f8)extension.worktreeConfig (fe1e646)c4e6849)init.templateDir to gix progress (9fab050)ea2136b)def53b3)diff.algorithm (b1edb9e)fa27570)f53f942)git-diff for a 2x speedup when calculating line changes (296f3b6)gix progress records (b05a2e7)de4fe06)6225f35)da5f63c)c8d0345)8c24386)67f2247)01ab5ca)09d767a)507dc7e)1a1e862)clone. variables (8b804a3)702a161)53acf25)f47c891)3c49400)c5c0ac5)8ef3fcb)8dadd70)b862fc5)25a7726)
</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)56c005b)8ef1cb2)
</details>A maintenance release to restore MSRV (1.64) support.
A maintenance release to restore MSRV (1.64) support.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
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)c56d336)
</details>Support for lossy load mode. There is a lot of breaking changes as file::from_paths::Options now became file::Options, and the same goes for the error…
<csr-id-69ec5940d3f37eb4dace8f1ed7616b5988984d15/> <csr-id-9cd99337333f5ef4b30e0ec9461fc087699576e6/> <csr-id-0076dcf9b37f1d633bdad5573b40d34a9fbaba90/> <csr-id-a8604a237782f8d60a185d4730db57bad81424a6/> <csr-id-55c00d880535a1f8c37cb7d4405d39ff5a7654a0/> <csr-id-32d5b3c695d868ba93755123a25b276bfbe55e0a/> <csr-id-949622e461eb2116393ec6f4633ec0cb2e1695b5/> <csr-id-bcacfc9bcf19a0339541b24e84de68d95291c62b/> <csr-id-41f118d2aa560188fd3399d2390aa43794b0af75/> <csr-id-f7f136dbe4f86e7dee1d54835c420ec07c96cd78/>
A maintenance release without user-facing changes.
<csr-id-0c98ec8fc7d8cc3195472a04fde4a681f620725f/> subsections are identified as &BStr in entire API.
Technically they can be any value (except for newlines and unescaped double quotes),
and these values might be paths and everything that comes with it, like
illformed UTF8. In order to be able to represent everything that
git can represent, we don't enforce UTF8 anymore for subsection names.
Note that section names and key names are required to be valid UTF8 (and even alphanumeric ascii), which makes illformed UTF8 very unlikely there.
<csr-id-a93a156655d640ae63ff7c35b0a1f5d67a5ca20f/> Simplify specifying keys when mutating config values.
<csr-id-895ce40aabbe6d6af5b681a0d0942303fd6549a2/> File::rename_section() with validation of input arguments.
<csr-id-4a01d983f54a7713dea523f6032cbf5bb2b9dde8/> improve normalization; assure no extra copies are made on query.
We now return our own content, rather than the originals with their
lifetimes, meaning we bind lifetimes of returned values to our own
File instance. This allows them to be referenced more often, and
smarter normalization assures we don't copy in the simple cases
either.
More tests were added as well.
This is breaking as lifetime changes can cause distruptions, and
values?_as() was removed as well as it's somewhat duplicate
to higher-level APIs and it wasn't tested at all.
<csr-id-c9933c0b0f51d21dc8244b2acc33d7dc8a33f6ce/> Remove git-config test utilities from git-path.
<csr-id-2faad43d11283ff06381c51d2466307cfb8736ff/> transfer knowledge about configuration and its usage into the type system. That way it's possible to use configuration overrides, even though ultimately being strings, in a type-safe manner and leverage code-completion while at it.
In that process, we also change Repository::(committer|Author)() to return
Option<Result<...>> to be able to account for date parse errors.
<csr-id-2b36d99eaf3ed24ce4cb736a3dd48440dc0c73b7/> File::new_section() and related now returns their id as well.
That way it's possible to more easily interact with it later, for instance
when one wants to delete it.
<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-b6cd6ace412b0c0df4bacbe7ed7ef6608f27909c/> file::SectionMut::push() now supports values without key-value separator.
These make a difference as those without = are considered boolean
true.
Currently pushing onto a section is the only way to write them.
<csr-id-d003c0f139d61e3bd998a0283a9c7af25a60db02/> Support for lossy load mode.
There is a lot of breaking changes as file::from_paths::Options now
became file::init::Options, and the same goes for the error type.
<csr-id-1ea26d80f392114349d25ebf88a7b260ee822aa1/> add _filter() versions to most access methods.
That way it's possible to filter values by their origin.
Note that the remove_section() methods now return the entire
removed section, not just the body, which yields more information
than before including section metadata.
<csr-id-cfd974f46d2cbb99e7784a05f5e358fed0d4bcab/> section names are now validated.
<csr-id-6ba2f8060768978ad7204e162fb2253ca8843879/> filtering supportort for parse::Events.
That way it's possible to construct Files which are not destined to be
written back as they only keep events necessary for value access,
greatly reducing allocations.
<csr-id-311d4b447daf8d4364670382a20901468748d34d/> change mostily internal uses of [u8] to BString/BStr
<csr-id-edd226719cd04a480274cb7d983b6d5d8bfdbb13/> Path-interpolation makes home-dir configurable.
That way the caller has full control over how the environment is used,
which also allows more fine-grained control over which config files
can be included.
<csr-id-266d4379e9132fd7dd21e6c8fccb36e125069d6e/> Make realpath() easier to use by introducing realpath_opt().
That way there is consistency about how many symlinks to follow.
<csr-id-27fb1ce27d2985eb1ee8bee5fffaf759902571fb/> Add Kind::GitInstallation for a way to obtain special git-installation configuration paths.
Note that these are lazily cached as they call the git binary.
<csr-id-99905bacace8aed42b16d43f0f04cae996cb971c/> upgrade bstr to 1.0.1
<csr-id-2b2357e9cc54539e0dbe7c0e22802f2b884160d8/> Add File::set_raw_value() to unconditionally set single values, and make the value itself easier to provide.
<csr-id-17c83d55f8942788aac5eb1bea22a48daa045bf4/> add File::resolve_includes() and move its error type to file::includes.
<csr-id-5221676e28f2b6cc1a7ef1bdd5654b880965f38c/> add File::from_bytes_owned() and remove File::from_path_with_buf()
<csr-id-98d45c2f59863fdee033b38e757cec09593f6892/> remove File::from_env_paths().
It's replaced by its more comfortable new_globals().
<csr-id-230a523593afcfb8720db965ff56265aaceea772/> untangle file::init::… Option and Error types.
This moves types to where they belong which is more specific instead
of having a catch-all Error and Options type.
<csr-id-3f3ff11a6ebe9775ee5ae7fc0ec18a94b5b46d61/> rename parse::Comment::(comment_tag|comment) to ::tag|text and parse::Section::section_header to ::header.
<csr-id-6f4eea936d64fb9827277c160f989168e7b1dba2/> Associate file::Metadata with each File.
This is the first step towards knowing more about the source of each
value to filter them based on some properties.
This breaks various methods handling the instantiation of configuration
files as file::Metadata typically has to be provided by the caller
now or be associated with each path to read configuration from.
<csr-id-b672ed7667a334be3d45c59f4727f12797b340da/> rename file::SectionBody to file::section::Body.
<csr-id-3bea26d7d2a9b5751c6c15e1fa9a924b67e0159e/> Remove File::sections_by_name_with_header() as ::sections_by_name() now returns entire sections.
<csr-id-41b3e622ee71943c285eadc518150fc7b6c92361/> create resolve_includes options to make space for more options when loading paths.
<csr-id-cabc8ef0e31c954642525e7693009a7fe4b4c465/> rename path::Options into path::Context.
It's not an option if it's required context to perform a certain
operation.
<csr-id-3de0cfd81523e4ba7cc362d8625f85ebf8fd9172/> All accessors in File are now using impl AsRef<str> where possible for added comfort.
<csr-id-3d25fe6c7a52529488fab19c927d64a1bc75838f/> Much more comfortable API file::*Mut types thanks to impl Into/AsRef.
<csr-id-393b392d515661e5c3e60629319fdab771c3d3f0/> Rename Mutable* into $1Mut for consistency.
<csr-id-0a7391a6575f4035c51a46d34fa20c69e9d078e9/> conform APIs of file::MutableValue and file::MutableMultiValue.
There are more renames and removals than worth mentioning here given the
current adoption of the crate.
<csr-id-83a0922f06081312b79908835dac2b7f4e849bb3/> rename file::MutableSection::set_leading_space() to set_leading_whitespace().
The corresponding getter was renamed as well to leading_whitespace().
<csr-id-219cf7ae0b35b3ac92f97974be52cd022698e01f/> Enforce parse::section::Header::new() by making its fields private.
<csr-id-4f6cd8cf65c2d8698bffe327a19031c342b229a6/> Add File::write_to() and File::to_bstring(); remove some TryFrom impls.
Now File can be serialized in a streaming fashion and without the
possibility for UTF8 conversion issues.
Note that Display is still imlpemented with the usual caveats.
<csr-id-0e392f81e99c8c0ff29f41b9b86afd57cd99c245/> remove Integer::to_bstring() as well as some TryFrom impls.
Note that it can still display itself like before via
std::fmt::Display.
<csr-id-b22732a2ab17213c4a1020859ec41f25ccabfbfc/> remove Boolean::to_bstring() along with a few From impls.
These were superfluous and aren't useful in practice.
Note that serialization is still implemented via Display.
<csr-id-65c520c4de8187884f87059adf5cef9cbdcd90a2/> allocation free File::sections_by_name() and File::sections_by_name_with_header().
<csr-id-ac57c4479e7b6867e8b8e71f7cf76de759dc64a2/> Path::interpolate() now takes path::interpolate::Options instead of three parameters.
<csr-id-0915051798dd782b40617a1aa16abd71f6db1175/> remove String type in favor of referring to the File::string() method.
The wrapper had no effect whatsoever except for adding complexity.
<csr-id-9cadc6f0cbaad0ac23f5469db2f040aecfbfb82c/> Simplify Boolean to be a wrapper around bool.
Previously it tried hard not to degenerate information, making it a
complicated type.
However, in practice nobody cares about the exact makeup of the boolean, and there is no need to serialize a boolean faithfully either.
Instead, those who want to set a value just set any value as a string, no need for type safety there, and we take care of escaping values properly on write.
<csr-id-703922dd4e1e5b27835298217ff4eb8ef1dc57ce/> Use bitflags for color::Attribute instead of Vec of enums.
This is less wasteful and sufficient for git, so it should be sufficient
for us, especially since attributes are indeed a set and declaring
one twice has no effect.
<csr-id-3fc4ac04f46f869c6e3a94ce4bb8a5737aa0c524/> simplify Color API.
For now we only parse and serialize for display, but more uses are
enabled when needed and trivially.
<csr-id-14149eea54e2e8a25ac0ccdb2f6efe624f6eaa22/> remove parse::Events::from_path and File::at
The latter has been replaced with File::from_path_with_buf(…) and
is a low-level way to load just a single config file, purposefully
uncomfortable as it will not resolve includes.
The initialization API will need some time to stabilize.
<csr-id-73adceeae12270c0d470d4b7271c1fd6089d5c2d/> Slim down API surface of parse::Events.
It's more of a 'dumb' structure now than before, merely present
to facilitate typical parsing than something special on its own.
<csr-id-2e47167e4a963743494b2df6b0c15800cb876dd0/> remove File::new() method in favor of File::default().
<csr-id-ea6765093b5475912ba1aa81d4440cbf5dd49fb6/> rename parse::event::List to parse::Events
<csr-id-89f5fca843d999c5bea35fb3fe2a03dc3588f74e/> rename parse::State to parse::event::List
<csr-id-3cdb0890b71e62cfa92b1ed1760c88cb547ec729/> move value::* into the crate root, except for Error and normalize_*().
<csr-id-748d921efd7469d5c19e40ddcb9099e2462e3bbc/> rename value::parse::Error to value::Error.
<csr-id-7e8a22590297f2f4aab76b53be512353637fb651/> rename value::TrueVariant to value::boolean::True
<csr-id-8bcaec0599cf085a73b344f4f53fc023f6e31430/> rename IntegerSuffix to integer::Suffix
<csr-id-d085037ad9c067af7ce3ba3ab6e5d5ddb45b4057/> rename value::Color(Attribute|Value) to value::color::Attribute and value::color::Name.
<csr-id-a0f6252343a62b0b55eef02888ac00c09100687a/> Turn parse::ParseOrIoError into parse::state::from_path::Error
<csr-id-b6b31e9c8dd8b3dc4860431069bb1cf5eacd1702/> rename parse::ParsedComment into parse::Comment
<csr-id-239cbfb450a8cddfc5bec1de21f3dc54fab914ce/> rename parse::Section* related types.
These are now located in section::*.
<csr-id-60af4c9ecb1b99f21df0e8facc33e5f6fc70c424/> rename parse::Parser to parse::State.
Furthermore, make State the entry point for all parsing, removing
all free-standing functions that returned a State.
<csr-id-3724850e0411f1f76e52c6c767fd8cebe8aea0f6/> rename parser module to parse
<csr-id-58b22152a0295998935abb43563e9096589ef53e/> rename normalize_cow() to normalize() and move all normalize* functions from values to the value module
<csr-id-767bedccdae1f3e6faf853d59ecf884a06cc3827/> move Path from values to value module
<csr-id-6033f3f93d2356399a661567353a83a044662699/> Move Boolean and String from values into value module
<csr-id-d4444e18042891b0fe5b9c6e6813fed26df6c560/> move values::Integer into value module
<csr-id-38f31174e8c117af675cdfbc21926133b821ec38/> move Color to own value module
<csr-id-aa630ad6ec2c6306d3307d5c77e272cb24b00ddd/> remove values::Bytes - use values::String instead.
Note that these values are always normalized and it's only possible
to get a raw values using the raw_value() API.
<csr-id-553f87225363903e6acdb3e7eaa8cc66a91110f1/> File::len() -> File::num_values()
The same is true for Section::len() which now is
Section::num_values().
<csr-id-c7fcb5e1db225aefc3eeab4f29f3fb85c670894a/> GitConfig::from_paths(…, <option>) is now owned.
The type is Copy, so no need to pass it by reference.
<csr-id-38dfdcf80f9b7368ccaa10f4b78b2129849848d0/> remove values::*Error in favor of value::parse::Error.
This makes it easier to work with errors in practice, we are either
interested in the value that failed to parse to try something else
or want a nice user message.
Having one decode error type facilitates that.
<csr-id-a98a7a7af69482e9ef63f106184049049939459d/> switch from quickerror to thiserror. This allows for generic types for sources of errors and allows to workaround a limitation with associated type constraints in the MSRV of 1.54.
Using thiserror makes this work and brings the crate more closely to the rest of the gitoxide crates (which now prefer thiserror over quickerror).
<csr-id-a86b2541561674df5dbef4120d3e03483cb80117/> remove all get_ prefixes from methods
That way the API is more idiomatic and fits better into the
existing gitoxide crates.
<csr-id-f9aaac11f0734afbd791132369eb5601bfc7efe9/> use lookup::Error and lookup::existing::Error
Use the newly introduced structured error to replace the 'catch-all'
GitConfigError while getting closer to naming conventions in other
gitoxide crates.
<csr-id-8836f5ada0078febf8aeb0e6b59d0fc4c588bc28/> File::section(...) could panic due to invlid expectation.
This has been fixed to prevent panics.
<csr-id-839f776454d7a8522c0f2887c90fc41b20576bd9/> File::boolean() now correctly handles implicit bools across sections.
This means it will return the last implicit value as true, instead of
ignoring it to fall back onto an explicit boolean value that might be
false.
<csr-id-7d92c61abc2c54f4a64c35b37bcd1843a8d1da9c/> file::SectionMut::push() now properly creates empty values.
Previously, when calling .push("key", None), the resulting internal
state would be slighly wrong causing certain invariants and expectations
to be unfulfilled even though it might have looked OK to most users.
Now it will uphold the invariant for empty values, those without an
= character.
<csr-id-9c1e639979a9615fd8334ce0e3a809df137776f6/> greatly improve whitespace handling when removing values. Previously, newlines would remain past a value, and whitespace could remain before one.
Now both are removed to simulate removing an actual line.
<csr-id-e533993e8f861ba7a6600aab114ddfecc8a85ee2/> File::remove_section() was fixed to allow re-adding a similarly named section.
We also add File::remove_section_by_id() to make it possible to remove
specific sections.
<csr-id-08c50a47fa901457194539c7db74ad47ab2f8b60/> Properly handle boolean values such that a is true but a= is false.
This is even consistent when no booleans are used, such that a has no
value as if it is not present, it's only available for booleans which
must be specified.
<csr-id-7c585162454c476fe93f032c8a2329cffd7c054f/> Keep track of a severe limitation and prepare tests for fixing it.
This also changes behaviour, but merely removes a hack in Boolean
which considered empty strings true, even though they are supposed to be
false.
<csr-id-6c1588fd1a2fa80fd866787cbf4bcc6e5b51abe6/> maintain insertion order of includes on per-section basis at least. Note that git inserts values right after the include directive, 'splitting' the section, but we don't do that and insert new values after the section. Probably no issue in practice while keeping our implementation simple.
<csr-id-f7bd2caceb87a179288030e0771da2e4ed6bd1e4/> maintain newline format depending on what's present or use platform default.
Previously implicit newlines when adding new sections or keys to
sections was always \n which isn't correct on windows.
Now the newline style is detected and used according to what's present, or in the lack of content, defaults to what's correct for the platform.
<csr-id-0d07ef1aa4a9e238c20249d4ae2ed19e6740308a/> validate incoming conifguration keys when interpreting envirnoment variables.
<csr-id-6b901843cb18b3d31f8b0b84bb9ebbae279aff19/> Boolean can use numbers to indicate true or false, drops support for one and zero.
<csr-id-94dde44e8dd1a0b8d4e11f2627a3f6b345a15989/> file::MutableSection::remove() now actually removes keys and values.
<csr-id-048b92531eb877a5a128e702504891bf1e31becf/> file::MutableMultiValue escapes input values and maintains key separator specific whitespace.
<csr-id-f911707b455ba6f3800b85f667f91e4d56027b91/> value normalization (via value::normalize() handles escape sequences.
The latter ones are \n, \t and \b which are the only supported
ones in values of git-config files.
<csr-id-44dfec07480cc2ac6fd01674b748cc03af51fed1/> stable sort order for File::sections_by_name_with_header()
<csr-id-1ea919d5ff81ab7b01b8201386ef63c7e081b537/> count newlines (for error display) in multi-line values as well
<csr-id-1e71e71c984289f0d7e0a39379ee6728918b7dc5/> auto-normalize string values to support quote removal in case of strings. Related to https://github.com/starship/starship/pull/3883 .
<csr-id-36e2fc0aff4e6aaa35335da90108918882d4cd16/> Use std::env::var_os() to avoid potential decode errors
<csr-id-469406dc0d9fece4a06230ef0d8018846202f0ad/> fix usage example in README.md
<csr-id-61af06b905926849abce19677ff4b9ac05d625a3/>
<csr-id-4b424ab73d20833deb0c674eeeeaaa8cc2358932/> add File::write_to_filter() to have a filter select the section to write.
This way, one can selectively write sections to a file, based on the section's origin
or other meta-data.
For convenience sake, most mutating methods on SectionMut can now be chained as well.
<csr-id-3fa86e1d01a75688cd8948a39ba415bcebfef02d/> add File::set_meta() to affect what metadata new sections receive.
That way it's possible to better control the metadata associated with new sections,
given that the config file metadata may not truly reflect its identity anymore since it
can be a combination from many different files with various sources.
<csr-id-5b9bffe8a5eec738e892224a7e18f98c8430d8a4/> SectionMut::push_with_comment(key, comment) to add a new variable with a comment.
This is useful for providing more information about a value at hand, especially if it was
added programmatically and then shows up in the configuration.
<csr-id-e4bf8f0072e60a7a2df94690c8d0b13b1f3038bb/> Add the Source::EnvOverride to have a place for 'terminal' overrides.
That way environment variables represented via git-configuration
can be integrated into git configuration, making clearer what's
going to happen even when looking at the configuration via
gix config.
The implementation has to be careful though about assureing there
is no more specific configuration key, like http.<URL>.proxy that
would override the one from the environment, which always has
the final word.
<csr-id-5fa95460db843f7dcfe68002b303b8b7649846dd/> comfort API like string_by_key(key) takes a key like "remote.origin.url", add section_by_key("remote.origin") as well.
That way it's the most comfortable way to query values and very
similar to how git does it, too.
Additionally, sections can be obtained by section key, both mutably and immutably for completeness.
<csr-id-7d7bd02d4e0678565f58c5da83fd1ad88c60e911/> read worktree specific configuration of main worktrees. Supporting this is useful when interacting with worktrees that have been created with sparse worktree support, which moves some configuration values into those for the worktree at hand.
Note that linked worktrees are not supported - for that use
git-repository instead.
<csr-id-aa5d66f60bd6c9ef404ebc120b613e0cf055b2c9/> add parse::section::header::is_valid_subsection() function.
It can be useful to validate subsection names without having to
construct an entire Header (which also includes a name).
<csr-id-5df2a2a5a9addbda7dcc68b2f8f7f4a48d9720c6/> Add various methods to iterate sections along with their id, and mutate them.
As section names are not unique, it was previously not possible to
iterate sections and then mutate them as one wouldn't be able to refer
to the exact section that was just traversed, after all, there can be
many sections named remote "origin".
With the new methods it's possible to uniquely refer to each section for mutation and removal.
<csr-id-9937d0e00df3a523484c7ae2850be2712a1a4c9a/> File::set_raw_value_filter() to set values only in sections passing a filter.
<csr-id-17455c9d93ad38bfee2560f5a4e60324dee3b4e5/> File::section_mut_or_create_new_filter() to allow chosing which sections to add values to.
<csr-id-5902f54b93101a6290fcf89f9f13fdbea3678e00/> File::section_mut_or_create_new(…) to obtain an existing or new section for mutation.
<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-1bc96bf378d198b012efce9ec9e5b244a91f62bc/> following includes is now non-fatal by default Otherwise it would be relatively easy to fail gitoxide startup, and we want to be closer to the behaviour in git which ignores most of the errors.
<csr-id-f9ce1b5411f1ac788f71060ecf785dda9dfd87bf/> File::from_git_dir() as comfortable way to instantiate most complete git configuration.
<csr-id-14a68a6a78a09f8ae56e30e3b7501de66ef31fdc/> File now compares actual content, ignoring whitespace and comments.
<csr-id-7dadfd82494d47e36d3f570988eaf3c6b628977f/> File::new_environment_overrides() to easily instantiate overrides from the environment.
<csr-id-146eeb064822839bc46fd37a247a1b9a84f64e40/> File::new_globals() can instantiate non-local configuration with zero-configuration.
<csr-id-e701e053fd05850973930be0cefe73e8f3604d40/> Source::storage_location() to know where files should be located.
<csr-id-fff088485dd5067976cc93d525903b39aafea76a/> file::ValueMut::(section|into_section_mut)() to go from value to the owning section.
This can be useful if the value was obtained using raw_value_mut().
<csr-id-f5f2d9b3fef98d9100d713f9291510fa4aa27867/> Source::is_in_repository() to find out if a source is in the repository.
<csr-id-91e718f0e116052b64ca436d7c74cea79529e696/> parse::key to parse a remote.origin.url-like key to identify a value
<csr-id-26147a7a61a695eda680808ee4aab44a890b2964/> Add File::detect_newline_style(), which does at it says.
<csr-id-0ad1c9a5280cc172432b5258e0f79898721bac68/> File::frontmatter() and File::sections_and_postmatter().
<csr-id-fc7e311b423c5fffb8240d9d0f917ae7139a6133/> parse::Event::to_bstr_lossy() to get a glimpse at event content.
<csr-id-09966a8ea4eaa3e0805e04188de86dd1bac9f388/> File::append() can append one file to another rather losslessly.
The loss happens as we, maybe for the wrong reasons, automatically
insert newlines where needed which can only be done while we still know
the file boundaries.
<csr-id-56ae5744e8957e617f3a0ebc4d725846b18d93f8/> file::Section::meta() to access a section's metadata.
<csr-id-6f97bf0c3e7164855cf5aa53462dbc39c430e03f/> File::sections() to obtain an iterator over all sections, in order.
<csr-id-5418bc70e67476f8778656f2d577f1f9aa65ffbe/> place spaces around key = value pairs, or whatever is used in the source configuration.
<csr-id-8118644625dc25b616e5f33c85f5100d600766e4/> proper escaping of value bytes to allow round-tripping after mutation
<csr-id-9f59356b4f6a1f5f7f35a62c9fbe4859bf8e8e5f/> whitespace in newly pushed keys is derived from first section value. That way, newly added key-value pairs look like they should assuming all keys have the same indentation as the first key in the section.
If there is no key, then the default whitespace will be double-tabs like what's commmon in git.
<csr-id-db1f34dfb855058ac08e97d4715876b5db712f61/> File::from_str() implementation, to support let config: File = "[core]".parse()?
<csr-id-9157717c2fb143b5decbdf60d18cc2bd99dde775/> whitespace in mutable sections can be finely controlled, and is derived from existing sections
<csr-id-ae3895c7882e0a543a44693faee5f760b49b54d7/> parse::Header::new(…) with sub-section name validation
<csr-id-d087f12eec73626eb327eaacef8ebb3836b02381/> Add parse::(Event|section::Header|Comment)::write_to(…).
Now it's possible to serialize these types in a streaming fashion and
without arbitrarily enforcing UTF-8 on it
<csr-id-5a8f242ee98793e2467e7bc9806f8780b9d320ce/> serde1 feature to add limited serde support
<csr-id-4726bb524c1b0935d35770c907d40a0a16dbb8b5/> GitConfig::integers()
Get multiple fully validated integer values, with their suffix
interpreted and checked for overflow.
<csr-id-ae22a4de486676f11469cec84be403903758b48b/> add GitConfig::integer()
A way to quickly obtain a valid integer with suffixes resolved
and overflow checked.
<csr-id-bfc263797226d027e04daaf6426e57183773d7c3/> GitConfig::strings() for multi-value strings.
<csr-id-7c75eac149c6ecb99c3dd7355d76d8d3e8b59cd0/> GitConfig::path() for direct access to paths.
Very similar to string(), but as path, whose query can never fail.
<csr-id-dc3dc3b41b5de3ec17429769747bf99bb2bdd03d/> support for try_value(), boolean() and string() access. Support for a convenient way of knowing if a value does or doesn't exist via try_value()`, which can only fail if the conversion fails.
Lastly, string() is a special case which doesn't fail as there is
no conversion, and boolean() allows to obtain a plain boolean value
if it was a valid boolean representation.
<csr-id-13554f8d21beb241e0fbdeb56b8414957cbee28a/> new hierarchical errors for value lookup
<csr-id-031bd2f401199a05d6465c0260ceed3cc849c7ac/> add suppport for android
Do not interpolate ~user/ on Android (Termux).
There is no meaning of it. It is single user system.
<csr-id-e4d6685064ad2b433f8acd3a74b320bf0169a994/> Add git_config::values::Path for a typesafe git path
Add a Path type to the git_config::values which
can be interpolated according to gits own path interpolation
rules.
<csr-id-e822f566dcff3f6c784c206dff2fbc5f82d543be/> implement a draft for subsection fetching
sections_by_name_with_header to allow iterating over tuples of
section header and section bodygit-config now uses git-config-value.GitConfig::from_paths(<paths>, …) accepts more inputs
<paths> is more flexible and is easier to use.<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
47d8162)6776a3f)8adf0d8)84cb256)4163c7f)a359cfd)GitConfig::from_paths(…, <option>) is now owned. (c7fcb5e)std::env::var_os() to avoid potential decode errors (36e2fc0)GitConfig::from_paths(<paths>, …) accepts more inputs (b04a346)72a5a02)GitConfig::integers() (4726bb5)GitConfig::integer() (ae22a4d)c139479)4408f17)GitConfig::strings() for multi-value strings. (bfc2637)7ea17e1)43a34a5)97e53f6)GitConfig::path() for direct access to paths. (7c75eac)values::*Error in favor of value::parse::Error. (38dfdcf)4612fca)732c0fa)try_value(), boolean() and string() access. ([dc3dc3b`](https://github.com/GitoxideLabs/gitoxide/commit/dc3dc3b41b5de3ec17429769747bf99bb2bdd03d))4496b5a)a98a7a7)8aef1d3)get_ prefixes from methods (a86b254)lookup::Error and lookup::existing::Error (f9aaac1)13554f8)cc2d810)f158648)git-path crate instead of git_features::path (47e607d)5fc5459)50ff7aa)06b86e0)4dc6594)5e0f889)330d0a1)Permissions as there is no need for that here. (1954ef0)1bc96bf)989603e)File::from_git_dir() as comfortable way to instantiate most complete git configuration. (f9ce1b5)acb4520)ec21e95)Env test utility into git-testtools (bd3f4d0)b073e29)e4d8fd7)dac1463)cfda0c3)3d89a46)8a7fb15)fbcf40e)97e5ede)ee10dd5)9c248ee)File now compares actual content, ignoring whitespace and comments. (14a68a6)6c1588f)f5580a3)4e47df5)File::resolve_includes() and move its error type to file::includes. (17c83d5)File::from_bytes_owned() and remove File::from_path_with_buf() (5221676)from_paths_metadata() . (612645f)61ecaca)File::new_environment_overrides() to easily instantiate overrides from the environment. (7dadfd8)45c964a)File::from_env_paths(). (98d45c2)File::new_globals() can instantiate non-local configuration with zero-configuration. (146eeb0)Source in accordance for what git actually does. (97374e4)Source::storage_location() to know where files should be located. (e701e05)file::ValueMut::(section|into_section_mut)() to go from value to the owning section. (fff0884)Source::is_in_repository() to find out if a source is in the repository. (f5f2d9b)parse::key to parse a remote.origin.url-like key to identify a value (91e718f)f7bd2ca)3c06f88)File::detect_newline_style(), which does at it says. (26147a7)78e85d9)5e8127b)88c6b18)file::init::… Option and Error types. (230a523)lossy load mode. (d003c0f)withfilter support. ([32d5b3c`](https://github.com/GitoxideLabs/gitoxide/commit/32d5b3c695d868ba93755123a25b276bfbe55e0a))a50a396)File::frontmatter() and File::sections_and_postmatter(). (0ad1c9a)_filter() versions to most access methods. (1ea26d8)50c1753)df94c67)parse::Comment::(comment_tag|comment) to ::tag|text and parse::Section::section_header to ::header. (3f3ff11)parse::Event::to_bstr_lossy() to get a glimpse at event content. (fc7e311)c70e135)25ed92e)File::append() can append one file to another rather losslessly. (09966a8)4665e87)file::Section::meta() to access a section's metadata. (56ae574)d60025e)File::sections() to obtain an iterator over all sections, in order. (6f97bf0)file::Metadata with each File. (6f4eea9)file::SectionBody to file::section::Body. (b672ed7)File::sections_by_name_with_header() as ::sections_by_name() now returns entire sections. (3bea26d)9aa5acd)resolve_includes options to make space for more options when loading paths. (41b3e62)path::Options into path::Context. (cabc8ef)207e483)0d07ef1)9750b7a)9cb9acb)Source type to allow knowing where a particular value is from. (c92d5c6)Boolean can use numbers to indicate true or false, drops support for one and zero. (6b90184)File are now using impl AsRef<str> where possible for added comfort. (3de0cfd)file::*Mut types thanks to impl Into/AsRef. (3d25fe6)Mutable* into $1Mut for consistency. (393b392)file::MutableSection::remove() now actually removes keys and values. (94dde44)ac843cb)701266e)file::MutableValue and file::MutableMultiValue. (0a7391a)file::MutableMultiValue escapes input values and maintains key separator specific whitespace. (048b925)key = value pairs, or whatever is used in the source configuration. (5418bc7)a7eff01)15cd1d2)511985a)7e03b83)8118644)afa736a)MutableValue showing that it's too buggy right now (5e6f9d9)file::MutableSection::set_leading_space() to set_leading_whitespace(). (83a0922)9f59356)File::from_str() implementation, to support let config: File = "[core]".parse()? (db1f34d)9157717)c88eea8)a0d6caa)ee9ac95)59ec7f7)a93a156)File::rename_section() with validation of input arguments. (895ce40)9a2f597)12cf005)parse::section::Header::new() by making its fields private. (219cf7a)parse::Header::new(…) with sub-section name validation (ae3895c)cfd974f)parse::section::Header (00592f6)00d1a9b)9fac8e0)78bb93c)File::write_to() and File::to_bstring(); remove some TryFrom impls. (4f6cd8c)Integer::to_bstring() as well as some TryFrom impls. (0e392f8)Boolean::to_bstring() along with a few From impls. (b22732a)parse::(Event|section::Header|Comment)::write_to(…). (d087f12)3d7fc18)value::normalize() handles escape sequences. (f911707)cf3bf4a)b92bd58)file::mutating (2d5703e)File::sections_by_name_with_header() (44dfec0)file::raw module (6acf4a4)b979a3b)eafc6ce)7aa8a0b)File::sections_by_name() and File::sections_by_name_with_header(). (65c520c)2abffd6)539c2f6)f1668e9)2599680)879fad5)b2b82da)ba69124)33efef6)700d6aa)Path::interpolate() now takes path::interpolate::Options instead of three parameters. (ac57c44)from_env (c8693f9)a7d7751)95fc20a)a361c7f)8e84fda)File::raw_multi_value() to File::raw_values() ([9cd9933](https://gitYour coding agent can read these notes before it upgrades. Set up the MCP server →