From 070f5f68976217c4fec84cae8516c3f5b716e513 Mon Sep 17 00:00:00 2001 From: Sebastian Thiel Date: Sun, 27 Apr 2025 10:02:31 +0200 Subject: [PATCH 001/166] prepare new testtools release --- Cargo.lock | 547 ++++++++++++++++++++++------------------- tests/tools/Cargo.toml | 10 +- 2 files changed, 303 insertions(+), 254 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index c938256c75e..5061f0ec45e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -353,7 +353,7 @@ dependencies = [ "bitflags 2.9.0", "cexpr", "clang-sys", - "itertools 0.10.5", + "itertools 0.12.1", "lazy_static", "lazycell", "log", @@ -918,15 +918,6 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "930c7171c8df9fb1782bdf9b918ed9ed2d33d1d22300abb754f9085bc48bf8e8" -[[package]] -name = "deranged" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c9e6a11ca8224451684bc0d7d5a7adbf8f2fd6887261a1cfc3c0432f9d4068e" -dependencies = [ - "powerfmt", -] - [[package]] name = "derive_arbitrary" version = "1.4.1" @@ -1095,6 +1086,9 @@ name = "faster-hex" version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2a2b11eda1d40935b26cf18f6833c526845ae8c41e58d09af6adeb6f0269183" +dependencies = [ + "serde", +] [[package]] name = "faster-hex" @@ -1335,7 +1329,7 @@ dependencies = [ "gix-features 0.42.1", "is-terminal", "once_cell", - "prodash 29.0.2", + "prodash", "serde_derive", "terminal_size", "tracing", @@ -1444,7 +1438,7 @@ dependencies = [ "once_cell", "parking_lot", "pretty_assertions", - "prodash 29.0.2", + "prodash", "regex", "serde", "serial_test", @@ -1457,16 +1451,16 @@ dependencies = [ [[package]] name = "gix-actor" -version = "0.31.5" +version = "0.34.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0e454357e34b833cc3a00b6efbbd3dd4d18b24b9fb0c023876ec2645e8aa3f2" +checksum = "f438c87d4028aca4b82f82ba8d8ab1569823cfb3e5bc5fa8456a71678b2a20e7" dependencies = [ "bstr", - "gix-date 0.8.7", - "gix-utils 0.1.14", + "gix-date 0.9.4", + "gix-utils 0.2.0", "itoa", - "thiserror 1.0.69", - "winnow 0.6.26", + "thiserror 2.0.12", + "winnow", ] [[package]] @@ -1483,7 +1477,7 @@ dependencies = [ "pretty_assertions", "serde", "thiserror 2.0.12", - "winnow 0.7.7", + "winnow", ] [[package]] @@ -1511,18 +1505,18 @@ dependencies = [ [[package]] name = "gix-attributes" -version = "0.22.5" +version = "0.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebccbf25aa4a973dd352564a9000af69edca90623e8a16dad9cbc03713131311" +checksum = "e4e25825e0430aa11096f8b65ced6780d4a96a133f81904edceebb5344c8dd7f" dependencies = [ "bstr", - "gix-glob 0.16.5", - "gix-path 0.10.14", - "gix-quote 0.4.15", + "gix-glob 0.19.0", + "gix-path 0.10.17 (registry+https://github.com/rust-lang/crates.io-index)", + "gix-quote 0.5.0", "gix-trace 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", "kstring", "smallvec", - "thiserror 1.0.69", + "thiserror 2.0.12", "unicode-bom", ] @@ -1616,16 +1610,15 @@ dependencies = [ [[package]] name = "gix-commitgraph" -version = "0.24.3" +version = "0.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "133b06f67f565836ec0c473e2116a60fb74f80b6435e21d88013ac0e3c60fc78" +checksum = "043cbe49b7a7505150db975f3cb7c15833335ac1e26781f615454d9d640a28fe" dependencies = [ "bstr", "gix-chunk 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", - "gix-features 0.38.2", - "gix-hash 0.14.2", + "gix-hash 0.17.0", "memmap2", - "thiserror 1.0.69", + "thiserror 2.0.12", ] [[package]] @@ -1662,7 +1655,7 @@ dependencies = [ "smallvec", "thiserror 2.0.12", "unicode-bom", - "winnow 0.7.7", + "winnow", ] [[package]] @@ -1714,14 +1707,14 @@ dependencies = [ [[package]] name = "gix-date" -version = "0.8.7" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9eed6931f21491ee0aeb922751bd7ec97b4b2fe8fbfedcb678e2a2dce5f3b8c0" +checksum = "daa30058ec7d3511fbc229e4f9e696a35abd07ec5b82e635eff864a2726217e4" dependencies = [ "bstr", "itoa", - "thiserror 1.0.69", - "time", + "jiff", + "thiserror 2.0.12", ] [[package]] @@ -1808,18 +1801,18 @@ dependencies = [ [[package]] name = "gix-discover" -version = "0.32.0" +version = "0.39.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc27c699b63da66b50d50c00668bc0b7e90c3a382ef302865e891559935f3dbf" +checksum = "f7fb8a4349b854506a3915de18d3341e5f1daa6b489c8affc9ca0d69efe86781" dependencies = [ "bstr", "dunce", - "gix-fs 0.11.3", - "gix-hash 0.14.2", - "gix-path 0.10.14", - "gix-ref 0.44.1", - "gix-sec 0.10.11", - "thiserror 1.0.69", + "gix-fs 0.14.0", + "gix-hash 0.17.0", + "gix-path 0.10.17 (registry+https://github.com/rust-lang/crates.io-index)", + "gix-ref 0.51.0", + "gix-sec 0.10.12", + "thiserror 2.0.12", ] [[package]] @@ -1843,16 +1836,27 @@ dependencies = [ [[package]] name = "gix-features" -version = "0.38.2" +version = "0.40.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac7045ac9fe5f9c727f38799d002a7ed3583cd777e3322a7c4b43e3cf437dc69" +checksum = "8bfdd4838a8d42bd482c9f0cb526411d003ee94cc7c7b08afe5007329c71d554" dependencies = [ - "gix-hash 0.14.2", + "gix-hash 0.16.0", "gix-trace 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", "gix-utils 0.1.14", "libc", - "prodash 28.0.0", - "sha1_smol", +] + +[[package]] +name = "gix-features" +version = "0.41.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "016d6050219458d14520fe22bdfdeb9cb71631dec9bc2724767c983f60109634" +dependencies = [ + "gix-path 0.10.17 (registry+https://github.com/rust-lang/crates.io-index)", + "gix-trace 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "gix-utils 0.2.0", + "libc", + "prodash", "walkdir", ] @@ -1873,11 +1877,23 @@ dependencies = [ "libc", "once_cell", "parking_lot", - "prodash 29.0.2", + "prodash", "thiserror 2.0.12", "walkdir", ] +[[package]] +name = "gix-features" +version = "0.42.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56f4399af6ec4fd9db84dd4cf9656c5c785ab492ab40a7c27ea92b4241923fed" +dependencies = [ + "gix-trace 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "gix-utils 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libc", + "prodash", +] + [[package]] name = "gix-fetchhead" version = "0.0.0" @@ -1906,15 +1922,29 @@ dependencies = [ [[package]] name = "gix-fs" -version = "0.11.3" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2bfe6249cfea6d0c0e0990d5226a4cb36f030444ba9e35e0639275db8f98575" +checksum = "182e7fa7bfdf44ffb7cfe7451b373cdf1e00870ac9a488a49587a110c562063d" dependencies = [ "fastrand", - "gix-features 0.38.2", + "gix-features 0.40.0", "gix-utils 0.1.14", ] +[[package]] +name = "gix-fs" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "951e886120dc5fa8cac053e5e5c89443f12368ca36811b2e43d1539081f9c111" +dependencies = [ + "bstr", + "fastrand", + "gix-features 0.41.1", + "gix-path 0.10.17 (registry+https://github.com/rust-lang/crates.io-index)", + "gix-utils 0.2.0", + "thiserror 2.0.12", +] + [[package]] name = "gix-fs" version = "0.15.0" @@ -1931,6 +1961,20 @@ dependencies = [ "thiserror 2.0.12", ] +[[package]] +name = "gix-fs" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67a0637149b4ef24d3ea55f81f77231401c8463fae6da27331c987957eb597c7" +dependencies = [ + "bstr", + "fastrand", + "gix-features 0.42.1 (registry+https://github.com/rust-lang/crates.io-index)", + "gix-path 0.10.17 (registry+https://github.com/rust-lang/crates.io-index)", + "gix-utils 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "thiserror 2.0.12", +] + [[package]] name = "gix-fsck" version = "0.11.1" @@ -1944,14 +1988,14 @@ dependencies = [ [[package]] name = "gix-glob" -version = "0.16.5" +version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74908b4bbc0a0a40852737e5d7889f676f081e340d5451a16e5b4c50d592f111" +checksum = "20972499c03473e773a2099e5fd0c695b9b72465837797a51a43391a1635a030" dependencies = [ "bitflags 2.9.0", "bstr", - "gix-features 0.38.2", - "gix-path 0.10.14", + "gix-features 0.41.1", + "gix-path 0.10.17 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1969,12 +2013,24 @@ dependencies = [ [[package]] name = "gix-hash" -version = "0.14.2" +version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f93d7df7366121b5018f947a04d37f034717e113dcf9ccd85c34b58e57a74d5e" +checksum = "e81c5ec48649b1821b3ed066a44efb95f1a268b35c1d91295e61252539fbe9f8" dependencies = [ "faster-hex 0.9.0", - "thiserror 1.0.69", + "thiserror 2.0.12", +] + +[[package]] +name = "gix-hash" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "834e79722063958b03342edaa1e17595cd2939bb2b3306b3225d0815566dcb49" +dependencies = [ + "faster-hex 0.9.0", + "gix-features 0.41.1", + "sha1-checked", + "thiserror 2.0.12", ] [[package]] @@ -1991,12 +2047,22 @@ dependencies = [ ] [[package]] -name = "gix-hashtable" -version = "0.5.2" +name = "gix-hash" +version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ddf80e16f3c19ac06ce415a38b8591993d3f73aede049cb561becb5b3a8e242" +checksum = "8d4900562c662852a6b42e2ef03442eccebf24f047d8eab4f23bc12ef0d785d8" +dependencies = [ + "faster-hex 0.10.0", + "gix-features 0.42.1 (registry+https://github.com/rust-lang/crates.io-index)", + "sha1-checked", + "thiserror 2.0.12", +] + +[[package]] +name = "gix-hashtable" +version = "0.8.1" dependencies = [ - "gix-hash 0.14.2", + "gix-hash 0.18.0", "hashbrown 0.14.5", "parking_lot", ] @@ -2004,21 +2070,23 @@ dependencies = [ [[package]] name = "gix-hashtable" version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5b5cb3c308b4144f2612ff64e32130e641279fcf1a84d8d40dad843b4f64904" dependencies = [ - "gix-hash 0.18.0", + "gix-hash 0.18.0 (registry+https://github.com/rust-lang/crates.io-index)", "hashbrown 0.14.5", "parking_lot", ] [[package]] name = "gix-ignore" -version = "0.11.4" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e447cd96598460f5906a0f6c75e950a39f98c2705fc755ad2f2020c9e937fab7" +checksum = "9a27c8380f493a10d1457f756a3f81924d578fc08d6535e304dfcafbf0261d18" dependencies = [ "bstr", - "gix-glob 0.16.5", - "gix-path 0.10.14", + "gix-glob 0.19.0", + "gix-path 0.10.17 (registry+https://github.com/rust-lang/crates.io-index)", "gix-trace 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", "unicode-bom", ] @@ -2040,30 +2108,30 @@ dependencies = [ [[package]] name = "gix-index" -version = "0.33.1" +version = "0.39.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a9a44eb55bd84bb48f8a44980e951968ced21e171b22d115d1cdcef82a7d73f" +checksum = "855bece2d4153453aa5d0a80d51deea1ce8cd6a3b4cf213da85ac344ccb908a7" dependencies = [ "bitflags 2.9.0", "bstr", "filetime", "fnv", "gix-bitmap 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)", - "gix-features 0.38.2", - "gix-fs 0.11.3", - "gix-hash 0.14.2", - "gix-lock 14.0.0", - "gix-object 0.42.3", - "gix-traverse 0.39.2", - "gix-utils 0.1.14", - "gix-validate 0.8.5", + "gix-features 0.41.1", + "gix-fs 0.14.0", + "gix-hash 0.17.0", + "gix-lock 17.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "gix-object 0.48.0", + "gix-traverse 0.45.0", + "gix-utils 0.2.0", + "gix-validate 0.9.4", "hashbrown 0.14.5", "itoa", "libc", "memmap2", "rustix 0.38.44", "smallvec", - "thiserror 1.0.69", + "thiserror 2.0.12", ] [[package]] @@ -2115,13 +2183,13 @@ version = "0.0.0" [[package]] name = "gix-lock" -version = "14.0.0" +version = "16.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3bc7fe297f1f4614774989c00ec8b1add59571dc9b024b4c00acb7dedd4e19d" +checksum = "9739815270ff6940968441824d162df9433db19211ca9ba8c3fc1b50b849c642" dependencies = [ - "gix-tempfile 14.0.2", + "gix-tempfile 16.0.0", "gix-utils 0.1.14", - "thiserror 1.0.69", + "thiserror 2.0.12", ] [[package]] @@ -2134,6 +2202,17 @@ dependencies = [ "thiserror 2.0.12", ] +[[package]] +name = "gix-lock" +version = "17.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "570f8b034659f256366dc90f1a24924902f20acccd6a15be96d44d1269e7a796" +dependencies = [ + "gix-tempfile 17.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "gix-utils 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "thiserror 2.0.12", +] + [[package]] name = "gix-macros" version = "0.1.5" @@ -2210,21 +2289,23 @@ version = "0.0.0" [[package]] name = "gix-object" -version = "0.42.3" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25da2f46b4e7c2fa7b413ce4dffb87f69eaf89c2057e386491f4c55cadbfe386" +checksum = "4943fcdae6ffc135920c9ea71e0362ed539182924ab7a85dd9dac8d89b0dd69a" dependencies = [ "bstr", - "gix-actor 0.31.5", - "gix-date 0.8.7", - "gix-features 0.38.2", - "gix-hash 0.14.2", - "gix-utils 0.1.14", - "gix-validate 0.8.5", + "gix-actor 0.34.0", + "gix-date 0.9.4", + "gix-features 0.41.1", + "gix-hash 0.17.0", + "gix-hashtable 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", + "gix-path 0.10.17 (registry+https://github.com/rust-lang/crates.io-index)", + "gix-utils 0.2.0", + "gix-validate 0.9.4", "itoa", "smallvec", - "thiserror 1.0.69", - "winnow 0.6.26", + "thiserror 2.0.12", + "winnow", ] [[package]] @@ -2250,7 +2331,7 @@ dependencies = [ "smallvec", "termtree", "thiserror 2.0.12", - "winnow 0.7.7", + "winnow", ] [[package]] @@ -2366,32 +2447,33 @@ dependencies = [ [[package]] name = "gix-path" -version = "0.10.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c40f12bb65a8299be0cfb90fe718e3be236b7a94b434877012980863a883a99f" +version = "0.10.17" dependencies = [ "bstr", - "gix-trace 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "gix-testtools", + "gix-trace 0.1.12", + "gix-validate 0.10.0", "home", + "known-folders", "once_cell", + "serial_test", "thiserror 2.0.12", + "windows 0.61.1", + "winreg", ] [[package]] name = "gix-path" version = "0.10.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c091d2e887e02c3462f52252c5ea61150270c0f2657b642e8d0d6df56c16e642" dependencies = [ "bstr", - "gix-testtools", - "gix-trace 0.1.12", - "gix-validate 0.10.0", + "gix-trace 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "gix-validate 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", "home", - "known-folders", "once_cell", - "serial_test", "thiserror 2.0.12", - "windows 0.61.1", - "winreg", ] [[package]] @@ -2452,17 +2534,17 @@ dependencies = [ "maybe-async", "serde", "thiserror 2.0.12", - "winnow 0.7.7", + "winnow", ] [[package]] name = "gix-quote" -version = "0.4.15" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e49357fccdb0c85c0d3a3292a9f6db32d9b3535959b5471bb9624908f4a066c6" +checksum = "1b005c550bf84de3b24aa5e540a23e6146a1c01c7d30470e35d75a12f827f969" dependencies = [ "bstr", - "gix-utils 0.1.14", + "gix-utils 0.2.0", "thiserror 2.0.12", ] @@ -2481,24 +2563,23 @@ version = "0.0.0" [[package]] name = "gix-ref" -version = "0.44.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3394a2997e5bc6b22ebc1e1a87b41eeefbcfcff3dbfa7c4bd73cb0ac8f1f3e2e" -dependencies = [ - "gix-actor 0.31.5", - "gix-date 0.8.7", - "gix-features 0.38.2", - "gix-fs 0.11.3", - "gix-hash 0.14.2", - "gix-lock 14.0.0", - "gix-object 0.42.3", - "gix-path 0.10.14", - "gix-tempfile 14.0.2", - "gix-utils 0.1.14", - "gix-validate 0.8.5", +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2e1f7eb6b7ce82d2d19961f74bd637bab3ea79b1bc7bfb23dbefc67b0415d8b" +dependencies = [ + "gix-actor 0.34.0", + "gix-features 0.41.1", + "gix-fs 0.14.0", + "gix-hash 0.17.0", + "gix-lock 17.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "gix-object 0.48.0", + "gix-path 0.10.17 (registry+https://github.com/rust-lang/crates.io-index)", + "gix-tempfile 17.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "gix-utils 0.2.0", + "gix-validate 0.9.4", "memmap2", - "thiserror 1.0.69", - "winnow 0.6.26", + "thiserror 2.0.12", + "winnow", ] [[package]] @@ -2521,7 +2602,7 @@ dependencies = [ "memmap2", "serde", "thiserror 2.0.12", - "winnow 0.7.7", + "winnow", ] [[package]] @@ -2579,17 +2660,17 @@ dependencies = [ [[package]] name = "gix-revwalk" -version = "0.13.2" +version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b030ccaab71af141f537e0225f19b9e74f25fefdba0372246b844491cab43e0" +checksum = "2dc7c3d7e5cdc1ab8d35130106e4af0a4f9f9eca0c81f4312b690780e92bde0d" dependencies = [ - "gix-commitgraph 0.24.3", - "gix-date 0.8.7", - "gix-hash 0.14.2", - "gix-hashtable 0.5.2", - "gix-object 0.42.3", + "gix-commitgraph 0.27.0", + "gix-date 0.9.4", + "gix-hash 0.17.0", + "gix-hashtable 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", + "gix-object 0.48.0", "smallvec", - "thiserror 1.0.69", + "thiserror 2.0.12", ] [[package]] @@ -2608,12 +2689,12 @@ dependencies = [ [[package]] name = "gix-sec" -version = "0.10.11" +version = "0.10.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d84dae13271f4313f8d60a166bf27e54c968c7c33e2ffd31c48cafe5da649875" +checksum = "47aeb0f13de9ef2f3033f5ff218de30f44db827ac9f1286f9ef050aacddd5888" dependencies = [ "bitflags 2.9.0", - "gix-path 0.10.14", + "gix-path 0.10.17 (registry+https://github.com/rust-lang/crates.io-index)", "libc", "windows-sys 0.52.0", ] @@ -2708,11 +2789,11 @@ dependencies = [ [[package]] name = "gix-tempfile" -version = "14.0.2" +version = "16.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "046b4927969fa816a150a0cda2e62c80016fe11fb3c3184e4dddf4e542f108aa" +checksum = "2558f423945ef24a8328c55d1fd6db06b8376b0e7013b1bb476cc4ffdf678501" dependencies = [ - "gix-fs 0.11.3", + "gix-fs 0.13.0", "libc", "once_cell", "parking_lot", @@ -2736,6 +2817,19 @@ dependencies = [ "tempfile", ] +[[package]] +name = "gix-tempfile" +version = "17.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c750e8c008453a2dba67a2b0d928b7716e05da31173a3f5e351d5457ad4470aa" +dependencies = [ + "gix-fs 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libc", + "once_cell", + "parking_lot", + "tempfile", +] + [[package]] name = "gix-testtools" version = "0.16.0" @@ -2745,11 +2839,11 @@ dependencies = [ "document-features", "fastrand", "fs_extra", - "gix-discover 0.32.0", - "gix-fs 0.11.3", - "gix-lock 14.0.0", - "gix-tempfile 14.0.2", - "gix-worktree 0.34.1", + "gix-discover 0.39.0", + "gix-fs 0.14.0", + "gix-lock 16.0.0", + "gix-tempfile 16.0.0", + "gix-worktree 0.40.0", "io-close", "is_ci", "once_cell", @@ -2757,7 +2851,7 @@ dependencies = [ "serial_test", "tar", "tempfile", - "winnow 0.7.7", + "winnow", "xz2", ] @@ -2810,19 +2904,19 @@ dependencies = [ [[package]] name = "gix-traverse" -version = "0.39.2" +version = "0.45.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e499a18c511e71cf4a20413b743b9f5bcf64b3d9e81e9c3c6cd399eae55a8840" +checksum = "36c0b049f8bdb61b20016694102f7b507f2e1727e83e9c5e6dad4f7d84ff7384" dependencies = [ "bitflags 2.9.0", - "gix-commitgraph 0.24.3", - "gix-date 0.8.7", - "gix-hash 0.14.2", - "gix-hashtable 0.5.2", - "gix-object 0.42.3", - "gix-revwalk 0.13.2", + "gix-commitgraph 0.27.0", + "gix-date 0.9.4", + "gix-hash 0.17.0", + "gix-hashtable 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", + "gix-object 0.48.0", + "gix-revwalk 0.19.0", "smallvec", - "thiserror 1.0.69", + "thiserror 2.0.12", ] [[package]] @@ -2883,6 +2977,16 @@ dependencies = [ "unicode-normalization", ] +[[package]] +name = "gix-utils" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "189f8724cf903e7fd57cfe0b7bc209db255cacdcb22c781a022f52c3a774f8d0" +dependencies = [ + "fastrand", + "unicode-normalization", +] + [[package]] name = "gix-utils" version = "0.3.0" @@ -2892,14 +2996,24 @@ dependencies = [ "unicode-normalization", ] +[[package]] +name = "gix-utils" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5351af2b172caf41a3728eb4455326d84e0d70fe26fc4de74ab0bd37df4191c5" +dependencies = [ + "fastrand", + "unicode-normalization", +] + [[package]] name = "gix-validate" -version = "0.8.5" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82c27dd34a49b1addf193c92070bcbf3beaf6e10f16a78544de6372e146a0acf" +checksum = "34b5f1253109da6c79ed7cf6e1e38437080bb6d704c76af14c93e2f255234084" dependencies = [ "bstr", - "thiserror 1.0.69", + "thiserror 2.0.12", ] [[package]] @@ -2911,23 +3025,33 @@ dependencies = [ "thiserror 2.0.12", ] +[[package]] +name = "gix-validate" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77b9e00cacde5b51388d28ed746c493b18a6add1f19b5e01d686b3b9ece66d4d" +dependencies = [ + "bstr", + "thiserror 2.0.12", +] + [[package]] name = "gix-worktree" -version = "0.34.1" +version = "0.40.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26f7326ebe0b9172220694ea69d344c536009a9b98fb0f9de092c440f3efe7a6" +checksum = "f7760dbc4b79aa274fed30adc0d41dca6b917641f26e7867c4071b1fb4dc727b" dependencies = [ "bstr", - "gix-attributes 0.22.5", - "gix-features 0.38.2", - "gix-fs 0.11.3", - "gix-glob 0.16.5", - "gix-hash 0.14.2", - "gix-ignore 0.11.4", - "gix-index 0.33.1", - "gix-object 0.42.3", - "gix-path 0.10.14", - "gix-validate 0.8.5", + "gix-attributes 0.25.0", + "gix-features 0.41.1", + "gix-fs 0.14.0", + "gix-glob 0.19.0", + "gix-hash 0.17.0", + "gix-ignore 0.14.0", + "gix-index 0.39.0", + "gix-object 0.48.0", + "gix-path 0.10.17 (registry+https://github.com/rust-lang/crates.io-index)", + "gix-validate 0.9.4", ] [[package]] @@ -3692,7 +3816,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc2f4eb4bc735547cfed7c0a4922cbd04a4655978c09b54f1f7b228750664c34" dependencies = [ "cfg-if", - "windows-targets 0.48.5", + "windows-targets 0.52.6", ] [[package]] @@ -3961,12 +4085,6 @@ dependencies = [ "num-traits", ] -[[package]] -name = "num-conv" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" - [[package]] name = "num-integer" version = "0.1.46" @@ -3985,15 +4103,6 @@ dependencies = [ "autocfg", ] -[[package]] -name = "num_threads" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c7398b9c8b70908f6371f47ed36737907c87c52af34c268fed0bf0ceb92ead9" -dependencies = [ - "libc", -] - [[package]] name = "objc2-core-foundation" version = "0.3.1" @@ -4245,12 +4354,6 @@ dependencies = [ "portable-atomic", ] -[[package]] -name = "powerfmt" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" - [[package]] name = "ppv-lite86" version = "0.2.21" @@ -4289,12 +4392,6 @@ dependencies = [ "unicode-ident", ] -[[package]] -name = "prodash" -version = "28.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "744a264d26b88a6a7e37cbad97953fa233b94d585236310bcbc88474b4092d79" - [[package]] name = "prodash" version = "29.0.2" @@ -4911,12 +5008,6 @@ dependencies = [ "sha1", ] -[[package]] -name = "sha1_smol" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbfa15b3dddfee50a0fff136974b3e1bde555604ba463834a7eb7deb6417705d" - [[package]] name = "sharded-slab" version = "0.1.7" @@ -5251,39 +5342,6 @@ dependencies = [ "once_cell", ] -[[package]] -name = "time" -version = "0.3.41" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a7619e19bc266e0f9c5e6686659d394bc57973859340060a69221e57dbc0c40" -dependencies = [ - "deranged", - "itoa", - "libc", - "num-conv", - "num_threads", - "powerfmt", - "serde", - "time-core", - "time-macros", -] - -[[package]] -name = "time-core" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9e9a38711f559d9e3ce1cdb06dd7c5b8ea546bc90052da6d06bb76da74bb07c" - -[[package]] -name = "time-macros" -version = "0.2.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3526739392ec93fd8b359c8e98514cb3e8e021beb4e5f597b00a0221f8ed8a49" -dependencies = [ - "num-conv", - "time-core", -] - [[package]] name = "tinystr" version = "0.7.6" @@ -5398,7 +5456,7 @@ dependencies = [ "serde", "serde_spanned", "toml_datetime", - "winnow 0.7.7", + "winnow", ] [[package]] @@ -5817,7 +5875,7 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" dependencies = [ - "windows-sys 0.48.0", + "windows-sys 0.59.0", ] [[package]] @@ -6278,15 +6336,6 @@ version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" -[[package]] -name = "winnow" -version = "0.6.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e90edd2ac1aa278a5c4599b1d89cf03074b610800f866d4026dc199d7929a28" -dependencies = [ - "memchr", -] - [[package]] name = "winnow" version = "0.7.7" diff --git a/tests/tools/Cargo.toml b/tests/tools/Cargo.toml index 4397c9dd12d..75c419ce970 100644 --- a/tests/tools/Cargo.toml +++ b/tests/tools/Cargo.toml @@ -25,11 +25,11 @@ default = [] xz = ["dep:xz2"] [dependencies] -gix-lock = "14.0.0" -gix-discover = "0.32.0" -gix-worktree = "0.34.0" -gix-fs = "0.11" -gix-tempfile = { version = "^14.0.0", default-features = false, features = ["signals"] } +gix-lock = "16.0.0" +gix-discover = "0.39.0" +gix-worktree = "0.40.0" +gix-fs = "0.14.0" +gix-tempfile = { version = "16.0.0", default-features = false, features = ["signals"] } winnow = { version = "0.7.7", features = ["simd"] } fastrand = "2.0.0" From c5c726e64f01b3a927ec5dc0e9917a4470d9cc5c Mon Sep 17 00:00:00 2001 From: Sebastian Thiel Date: Sun, 27 Apr 2025 10:09:55 +0200 Subject: [PATCH 002/166] Release gix-testtools v0.16.0 --- tests/tools/CHANGELOG.md | 1393 ++++++++++++++++++++++++++++---------- 1 file changed, 1033 insertions(+), 360 deletions(-) diff --git a/tests/tools/CHANGELOG.md b/tests/tools/CHANGELOG.md index bfd742f3d41..2c848defd51 100644 --- a/tests/tools/CHANGELOG.md +++ b/tests/tools/CHANGELOG.md @@ -5,6 +5,681 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## 0.16.0 (2025-04-27) + +### Changed + + - In gix-testtools use `ignore` and `index` via `gix_worktree` + This removes the `gix-ignore` and `gix-index` direct dependencies + of `gix-testtools`, by having `gix_testtools` use them through + `gix-worktree`, accessing `gix_worktree::ignore` for `gix_ignore` + and `gix_worktree::index` for `gix_index`. + + The rationale is that various other gix-* dependencies were used + this way already, and also that this specific change appears to + have been planned, based on the TODO comment in ddaacda (#1413). + +### New Features + + - Show unexpected stderr in `umask` panic message + Because `gix_testtools::umask()` is only suitable for use in tests, + where signaling an error with a panic is typically acceptable, it + panics rather than returning an `Error` to indicate errors. To + avoid leading to the use of a potentially inaccurate umask value, + it treats as an error any departure from the typical output of + the `umask` command: in addition to treating a nonzero exit status + as an error, it also treats anything it cannot strictly parse on + stdout as an error, as well as anything at all written to stderr as + an error. The latter is to avoid a situation where a warning is + printed that is could be significant to some umask use cases. + + Warnings from `umask` are rare, as well as from the shell that is + used as an intermediary for running the command (since no external + `umask` command need exist and, often, does not) when it is used + just to run `umask`. When they do occur, they are sometimes from + the dynamic linker, such as a warning about a shared library listed + in the `LD_PRELOAD` environment variable that cannot be used by + the shell program. To understand and distinguish such errors, it is + useful to show the text that was sent to stderr, since tests are + sometimes run in environments that are nontrivial to reproduce + otherwise. For example, running tests with `cross` produces an + environment that is not in all respects the same as what one gets + with `docker exec -it `, even if `` is the + same still-running container being used to run the tests. + + This modifies `gix_testtools::umask()` so that when it panics due + anything being written to stderr, it shows what was written. + - Add `jtt bash-program` (`jtt bp`) to show `bash_program()` + This adds a `bash-program` subcommand, abbreviated `bp`, to the + `gix-testools` program (`jtt`) to check what the `bash_program()` + library function gives. + + This is intended for diagnostic use and should probably not be used + in scripting. Currently it shows the quoted debug repreesentation + of the path. + - Document `gix_testtools::bash_program()` and make it public + To make it easier for users of `gix-testtools` to diagnose problems + or verify that the fallback for running fixutre scripts without + usable shebangs (which is effectively how any fixture shell script + is run on Windows), the formerly private `bash_program()` is now + public. + + However, it is not recommend to rely on this specific value or on + observed behavior of how it is computed. The details may change at + any time. + + The purpose of `bash_program()` and how it is used internally by + `gix-testtools` is also now documented explicitly. Broad details of + how it searches or guesses what path to use are likewise documented, + with a caveat that changes to them are not considered breaking. + - Look for bash in `(git root)/bin`, then `(git root)/usr/bin` + This changes `bash_program()` so that it will find the `bash.exe` + provided by Git for Windows that is most reliable for our use in + runinng test fixture scripts, of those that are available. First + it uses the shim, but falls back to the non-shim if the shim is + not available. If neither is found, then the fallback of using the + simple command `bash.exe` (which triggers a path search when run) + continues to be used. + - Prefer `/` over `\` in `bash.exe` path (for fixtures) + Starting in #1712, `gix-testtools` looks for `bash.exe` on Windows + in one of its common locations as provided by Git for Windows, by + taking the path given by `git --exec-path`, going up by three + components, and going down to `bin/bash.exe` under that. But the + `bin` and `bash.exe` components were appended in a way that used + `\` directory separators. + + Ordinarily, that would be ideal, since `\` is the primary directory + separator on Windows. However, in this case, appending with `\` + produces a path that is harder to read (especially in diagostic + messages), and that may cause problems if it is processed by a + shell or in a way that is intended to operate similarly to shell + processing of `\`. + + A path that does not explicitly prefer `/` but instead uses + `PathBuf::push` will have `\` in front of the new components, but + will still usually have `/` in front of the old components. This is + because, aside from the unusual case that the `GIT_EXEC_PATH` + environment vairable is set explicitly and its value uses all `\` + separators, the output of `git --exec-path`, which we use to find + where `git` installed on Windows, uses `/` separators. + + The effect of this change seems to be fairly minor, with existing + test fixtures having worked before it was done. This is partly + because, on Windows, the value of `argv[0]` that the shell + actually sees -- and that populates `$0` when no script name is + available, as happens in `bash -c '...'` with no subsequent + arguments -- is translated by an MSYS DLL such as `msys-2.0.dll` + (or, for Cygwin, `cygwin1.dll`) into a Unix-style path meaningful + to the shell. + + This also refactors for clarity, and adds new tests related to the + change. + - Add `gix_testtools::umask`, safe but only meant for tests + This implements a function for tests to safely read the current + process umask without the usual race condition of doing so, at the + expense of using subprocesses to do it. This just calls a shell and + runs `umask` from it (which is expected to be a builtin and, on + many systems, is available as a builtin but not an executable). + + Even though this is safe, including thread-safe, it is unlikely to + be suitable for use outside of tests, because of its use of + `expect` and assertions when there are errors, combined with the + possibly slow speed of using subprocesses. + + Given that this is effecitvely running a tiny shell script to do + the work, why is it not instead a fixture script that is named in + a `.gitignore` file so that it is not tracked? The reason is that + the outcomes of running such fixture scripts are still saved across + separate test runs, but it is useful to be able to run the tests + with differnt umasks, e.g. `(umask 077; cargo nextest run ...)`. + + The immediate purpose is in forthcoming tests that, when checkout + sets +x on an existing file, it doesn't set excessive permissions. + The fix to pass such a test is not currently planned to use the + umask explicitly. But the tests will use it, at least to detect + when they cannot really verify the code under test on the grounds + that they are running with an excessively permissive umask that + doesn't allow behavior that only occurs with a generally reasonable + umask to be observed. + - Add `size_ok` for asserting size is not too big + This compares using `==` on 64-bit targets and `<=` on 32-bit + targets. + + As noted in the documentation comment, when assertions about data + stuructures' sizes are being done to safeguard against them growing + too big, then it may be acceptable to use `<=` if the structure is + smaller on 32-bit targets, but it is still valuable to be able to + use `==` on 64-bit targets in the same assertions, since this + guards against a data structure becoming smaller, other changes + causing the smaller size to be important for memory usage or speed, + but then the data structure growing again, up to its original size. + An unconditional `<=` will not catch this, while `size_ok` usually + will. + + A related reason to do a `==` on 64-bit systems is so that the + expected value being compared to remains tied to the code. It can + otherwise become unclear what the expected value's significance is + and whether it ought to be updated. + - Recognize `GIX_TEST_CREATE_ARCHIVES_EVEN_ON_CI` + When `gix-testtools` runs fixtures, it now recognizes a new + environment variable, `GIX_TEST_CREATE_ARCHIVES_EVEN_ON_CI`, + specifying that archives should be generated even when on CI. + + By default, they are still not generated when on CI. It may make + sense to enable this: + + - If automatically testing archive creation, or + + - As a way to check that all intended generated arhives are committed + (which is the motivating use case for this feature), or + + - If actually using CI to generate archives that will be uploaded + as artifacts, or + + - In unusual non-CI environments that are mis-detected as CI + (though that should usually be investigated and fixed, since some + software performs destructive operations more readily without + interactive checks when CI is detected). + + The usual reason for not generating archives on CI is that they + would not typically be preserved. Thus refraining from generating + them on CI remains the default behavior. + + Like the `GIX_TEST_IGNORE_ARCHIVES` environment variable, the new + variable `GIX_TEST_CREATE_ARCHIVES_EVEN_ON_CI` is currently + interpreted as "true" based solely on its presence. This is to say + that is actual value is currently not examined. + +### Bug Fixes + + - fix check to detect `git-lfs` managed files that weren't checked out. + Previously it would detect them incorrectly due to a find-and-replace + error. + - create a more local lock when creating writable fixtures. + Previously, the lock location would block all writers from executing + a fixture even though they wouldn't step on each others feet. + + Now, a script destination is used to assure locks are created close + to the destination when creating writable fixtures, typically removing + the need for multiple writers to wait on each other unnecessarily. + - Run test fixture scripts on Windows with Git Bash + Rather than hard-coding `bash` on all systems as the fallback + interpreter when a fixture script cannot be run directly, this + falls back in an operating system specific manner: + + - Except on Windows, always fall back to `bash`, as before. + + - On Windows, run `git --exec-path` to find the `git-core` + directory. Then check if a `bash.exe` exists at the expected + location relative to that. In Git for Windows installations, + this will usually work. If so, use that path (with `..` + components resolved away). + + - On Windows, if a specific `bash.exe` is not found in that way, + then fall back to using the relative path `bash.exe`. This is to + preserve the ability to run `bash` on Windows systems where it + may have worked before even without `bash.exe` in an expected + location provided by a Git for Windows installation. + + (The distinction between `bash` and `bash.exe` is only slightly + significant: we check for the existence of the interpreter without + initially running it, and that check requires the full filename. + It is called `bash.exe` elsewhere for consistency both with the + checked-for executable and for consistencey with how we run most + other programs on Windows, e.g., the `git` vs. `git.exe`.) + + This fixes #1359. That bug is not currently observed on CI, but + this change is verified to fix it on a local test system where it + previously always occurred when running the test suite from + PowerShell in an unmodified environment. The fix applies both with + `GIX_TEST_IGNORE_ARCHIVES` unset, in which case there are now no + failures, and with `GIX_TEST_IGNORE_ARCHIVES=1`, in which case the + failures are now limited to the 15 cases tracked in #1358. + + Previously, fixture scripts had been run on Windows with whatever + `bash` was found in a `PATH` search, which had two problems: + + - On most Windows systems, even if no WSL distribution is installed + and even if WSL itself is not set up, the `System32` directory + contains a `bash.exe` program associated with WSL. This program + attempts to use WSL to run `bash` in an installed distribution. + The `wsl.exe` program also provides this functionality and is + favored for this purpose, but the `bash.exe` program is still + present and is likely to remain for many years for compatibility. + + Even when this `bash` is usable, it is not suited for running + most shell scripts meant to operate on the native Windows system. + In particular, it is not suitable for running our fixture + scripts, which need to use the native `git` to prepare fixtures + to be used natively, among other requirements that would not be + satisfied with WSL (except when the tests are actually running in + WSL). + + Since some fixtures are `.gitignore`d because creating them on + the test system (rather than another system) is part of the test, + this has caused breakage in most Windows environments unless + `PATH` is modified -- either explicitly or by testing in an MSYS2 + environment, such as the Git Bash environment -- whether or not + `GIX_TEST_IGNORE_ARCHIVES` is set. This was the cause of #1359. + + - Although using a Git Bash environment or otherwise adjusting the + path *currently* works, the reasons it works are subtle and rely + on non-guaranteed behavior of `std::process::Command` path search + that may change without warning. + + On Windows, processes are created by calling the `CreateProcessW` + API function. `CreateProcessW` is capable of performing a `PATH` + search, but this `PATH` search is not secure in most uses, since + it includes the current directory (and searches it before `PATH` + directories) unless `NoDefaultCurrentDirectoryInExePath` is set + in the caller's environment. + + While it is the most relevant to security, the CWD is not the + only location `CreateProcessW` searches before searching `PATH` + directories (and regardless of where, if anywhere, they may also + appear in `PATH`). Another such location is the `System32` + directory. This is to say that, even when another directory with + `bash.exe` precedes `System32` in `PATH`, an executable search + will still find the WSL-associated `bash.exe` in `System32` + unless it deviates from the algorithm `CreateProcessW` uses. + + To avoid including the CWD in the search, `std::process::Command` + performs its own path search, then passes the resolved path to + `CreateProcessW`. The path search it performs is currently almost + the same the algorithm `CreateProcessW` uses, other than not + automatically including the CWD. But there are some other subtle + differences. + + One such difference is that, when the `Command` instance is + configured to create a modified child environment (for example, + by `env` calls), the `PATH` for the child is searched early on. + This precedes a search of the `System32` directory. It is done + even if none of the customizations of the child environment + modify its `PATH`. + + This behavior is not guaranteed, and it may change at any time. + It is also the behavior we rely on inadvertently every time we + run `bash` on Windows with a `std::process::Command` instance + constructed by passing `bash` or `bash.exe` as the `program` + argument: it so happens that we are also customizing the child + environment, and due to implementation details in the Rust + standard library, this manages to find a non-WSL `bash` when + the tests are run in Git Bash, in GitHub Actions jobs, and in + some other cases. + + If in the future this is not done, or narrowed to be done only + when `PATH` is one of the environment variables customized for + the child process, then putting the directory with the desired + `bash.exe` earlier than the `System32` directory in `PATH` will + no longer prevent `std::proces::Command` from finding the + `bash.exe` in `System32` as `CreateProcessW` would and using it. + Then it would be nontrivial to run the test suite on Windows. + + For references and other details, see #1359 and comments including: + https://github.com/GitoxideLabs/gitoxide/issues/1359#issuecomment-2316614616 + + On the approach of finding the Git for Windows `bash.exe` relative + to the `git-core` directory, see the GitPython pull request + https://github.com/gitpython-developers/GitPython/pull/1791, its + comments, and the implementation of the approach by @emanspeaks: + https://github.com/gitpython-developers/GitPython/blob/f065d1fba422a528a133719350e027f1241273df/git/cmd.py#L398-L403 + + Two possible future enhancements are *not* included in this commit: + + 1. This only modifies how test fixture scripts are run. It only + affects the behavior of `gix-testtools`, and not of any other + gitoxide crates such as `gix-command`. This is because: + + - While gitoxide uses information from `git` to find out where + it is installed, mainly so we know where to find installation + level configuration, we cannot in assume that `git` is present + at all. Unlike GitPython, gitoxide is usable without `git`. + + - We know our test fixture scripts are all (at least currently) + `bash` scripts, and this seems likely for other software that + currently uses this functionality of `gix-testtools`. But + scripts that are run as hooks, or as custom commands, or + filters, etc., are often written in other languages, such as + Perl. (The fallback here does not examine leading `#!` lines.) + + - Although a `bash.exe` located at the usual place relative to + (but outside of) the `git-core` directory is usually suitable, + there may be scenarios where running an executable found this + way is not safe. Limiting it to `gix-testtools` pending + further research may help mitigate this risk. + + 2. As in other runs of `git` by `gix-testools`, this calls + `git.exe`, letting `std::process::Command` do an executable + search, but not trying any additional locations where Git is + known sometimes to be installed. This does not find `git.exe` in + as many situations as `gix_path::env::exe_invocation` does. + + The reasons for not (or not quite yet) including that change are: + + - It would add `gix-path` as a dependency of `gix-testtools`. + + - Finding `git` in a `std::process::Command` path search is an + established (though not promised) approach in `gix-testtools`, + including to run `git --exec-path` (to find `git-daemon`). + + - It is not immediately obvious that `exe_invocation` behavior + is semantically correct for `gix-testtools`, though it most + likely is reasonable. + + The main issue is that, in many cases where `git` itself runs + scripts, it prepends the path to the `git-core` directory to + the `PATH` environment variable for the script. This directory + has a `git` (or `git.exe`) executable in it, so scripts run + an equivalent `git` associated with the same installation. + + In contrast, when we run test fixture scripts with a + `bash.exe` associated with a Git for Windows installation, we + do not customize its path. Since top-level scripts written to + use `git` but not to be used *by* `git` are usually written + without the expectation of such an environment, prepending + this will not necessarily be an improvement. + - Double the fixture lock timeout + This increases the lock timeout used in `gix-testtools` from 3 min + 6 min. This seems to fix #1605. + - Unset other env vars related to `GIT_DIR` for fixtures + This removes other environment variables that have an effect + conceptually related to `GIT_DIR` even when `GIT_DIR` is not set. + Most of them change where `git` will look for files that are + ordinarily in a repository's `.git` directory. In contrast, + `GIT_WORK_TREE` changes where the working tree is found. + + These would rarely be set in the environment in which the tests are + run, but it makes sense to unset them for the same reason as + unsetting `GIT_DIR`, which is already done. + + The new `remove_env` calls are roughly in the order in which the + variables they unset are listed in git(1). + + This deliberately does not attempt to unset every possible + environment variable that git(1) documents as affecting its + behavior. This is for four reasons: + + - Some variables may be set on the test machine without envisioning + this usage, but should still be kept, such as those that cause + more or less traversal than usual to be done. For example, if + `GIT_CEILING_DIRECTORIES` or even `GIT_DISCOVERY_ACROSS_FILESYSTEM` + are set, it may be for a good reason. + + - Some variables will have no default unless other variables that + are being modified here are changed again after the changes here. + In particular, `GIT_CONFIG_SYSTEM` only has an effect if + `GIT_CONFIG_NOSYSTEM` is not set. We set `GIT_CONFIG_NOSYSTEM` to + `1`, so if it is unset then a fixture script has unset it, in + which case it is presumably intended that `GIT_CONFIG_SYSTEM` + have some effect (if the fixture script doesn't change/unset it). + + - Some variables are useful for extra debugging and make sense to + set when running the test fixtures under foreseeable conditions. + For example, the effects of all `GIT_TRACE*` variables are + intentionally preserved. + + - For a few variables, such as `GIT_DEFAULT_HASH`, it is unlikely + that they would be wanted in the test environment, but even more + unlikely that they would be set in that environment without the + intention of experimenting with their effect on fixtures. + + However, this is not to say that all environment variables that + would make sense to remove have necessarily been removed. + + The removed variables here differ from those removed for the `git` + invocation in `gix-path/src/env/git/mod.rs` for two reasons: + + - That is a single `git` invocation for a specific command, so the + environment variables that ought to affect it must be kept, and + others can be removed. But here, arbitrary fixtures need to work, + and they provide almost all of their own environment as needed. + + - Setting an unusual value of `GIT_DIR` there that `git` cannot + take to be a usable repository also prevents the variables + that override `GIT_DIR` for specific files from being used. (But + maybe those should be unset there anyway, for clarity?) + - Append to preexisting `MSYS` env var even if ill-formed + The value of an environment variable as obtained by the facilities + in `std::env` is not always well-formed Unicode. Specifically, on + Windows the values of environment variables, like paths, are + natively UTF-16LE strings except that unpaired surrogate code + points can also occur. An `&OsStr` on Windows may accordingly not + quite be UTF-8. + + When the `MSYS` variable is absent, we treat this the same as when + it is present but empty. However, as described in #1574, an `MSYS` + variable that is present but whose value contains an unpaired + surrogate would also be replaced entirely, rather than appending to + its old value. + + This changes that, to instead append, retaining whatever was there + even if it was ill-formed Unicode. + + An alternative change could be to panic when the old value is + ill-formed Unicode. This commit allows and appends to the old + value, rather than panicking or keeping and documenting the + previous behavior of discarding the old value, because the appended + sequence ` winsymlinks:nativestrict` is effective at causing + fixture scripts to attempt to create actual symlinks even if + the preceding code point is an unpaired Unicode high surrogate. + - Omit other high-scoped config in fixtures + In addition to keeping fixture scripts from receiving global and + system scope Git configuration variables, as was already done, this + also omits configuration variables from high scopes similar to or + above the system scope, associated with the Git installation but + separate from the system scope. + + The main and possibly only case where this happens is the "unknown" + scope associated with an Apple Git installation on macOS. This is a + file usually located under `/Library` or `/Applications`. + + This is done by using `GIT_CONFIG_NOSYSTEM`, which suppresses both + the system scope and this separate "unknown" scope, instead of by + settng `GIT_CONFIG_SYSTEM` to a path like `/dev/null`. The latter + approach continues to be used to omit global scope config via + `GIT_CONFIG_GLOBAL` (as `git` recognized no `GIT_CONFIG_NOGLOBAL`). + - Omit system/global config in fixtures regardless of contents + This uses the null device, `/dev/null` on Unix-like systems and + `NUL` on Windows, as the value of `GIT_CONFIG_SYSTEM` and + `GIT_CONFIG_GLOBAL` when `gix-testtols` runs test fixture shell + scripts. + + `/dev/null` is explicitly recommended for this purpose, when + setting those environment variables for the purpose of preventing + configuration files from being read, in the Git documentation: + + - https://git-scm.com/docs/git#Documentation/git.txt-codeGITCONFIGGLOBALcode + + On Windows, `NUL` is an analogue of `/dev/null`. Even in the + unusual scenario that a `\\?\` prefixed UNC path is used to create + an actual file named `NUL` in the directory the fixture script + operates in, the relative path `NUL` still resolves to the null + device and not to that file. + + The previous behavior was to use a value of `:` on Unix-like + systems or `-` on Windows. But these were really just unusual but + valid paths, such that files of those names could exist in any + location. `git` furthermore treats them as paths: a `:` is not + special in these environment variables because they hold a single + path rather than a list of paths, and a `-` is not special (for + example, it does not specify stdin) because it appears in an + environment variable rather than a command-line argument. + + While `:` and `-` are unusual filenames, this code is used in + testing, including of edge cases where unusual files may be used. + So this change may make the test tools slightly more robust. + - Let `gix_testtools::Env` undo multiple changes to the same var + Previously, an `Env` instance would restore the original state on + drop if no more than one modification was made to any one variable + through it, but would restore an intermediate state if the same + variable was ever set multiple times, unset multiple times, or both + set and unset in any order. + + The state it would restore for each variable was its state + immediately before the most recent modification (through the `Env` + instance) that affected it, rather than its original state before + the first time it was modified through that `Env` instance. + + This fixes that by undoing the changes in the opposite of the order + they were made. + - assure archives are unique if their generator-scripts are called with arguments. + Previously there was a race condition that would cause archives to be created either with + or without arguments, depending on which test was run first. + + After its creation, they wouldn't be looked at again as on disk they would already be available + in their usable form. + +### Other + + - Fix description of `gix_testtools::Env::unset` + The `unset` method inadvertently had the same docstring as `set`, + even though this was not correct for `unset`. This fixes that, and + also rewords the `Env` docstring to better account for the ability + to unset. + +### New Features (BREAKING) + + - on Windows, also instruct msys to create real symlinks + This will only reliably work on with developer setups, but that + seems fair to assume. + If this causes problems, it's fine to make it opt-in as well. + +### Bug Fixes (BREAKING) + + - don't panic, instead provide an error when fixture script fails. + This makes introspection easier, even though we still have to print to + script output to stderr in order to make it legible. + +### Commit Statistics + + + + - 104 commits contributed to the release over the course of 296 calendar days. + - 307 days passed between releases. + - 22 commits were understood as [conventional](https://www.conventionalcommits.org). + - 2 unique issues were worked on: [#1440](https://github.com/GitoxideLabs/gitoxide/issues/1440), [#1443](https://github.com/GitoxideLabs/gitoxide/issues/1443) + +### Thanks Clippy + + + +[Clippy](https://github.com/rust-lang/rust-clippy) helped 6 times to make code idiomatic. + +### Commit Details + + + +
view details + + * **[#1440](https://github.com/GitoxideLabs/gitoxide/issues/1440)** + - Assure archives are unique if their generator-scripts are called with arguments. ([`8a0fedb`](https://github.com/GitoxideLabs/gitoxide/commit/8a0fedb22bad576ea11017777f476947f366e5f5)) + * **[#1443](https://github.com/GitoxideLabs/gitoxide/issues/1443)** + - On Windows, also instruct msys to create real symlinks ([`0899c2e`](https://github.com/GitoxideLabs/gitoxide/commit/0899c2ee36a714573b223ae85114fb7284fc661e)) + * **Uncategorized** + - Prepare new testtools release ([`070f5f6`](https://github.com/GitoxideLabs/gitoxide/commit/070f5f68976217c4fec84cae8516c3f5b716e513)) + - Merge pull request #1935 from pierrechevalier83/fix_1923 ([`3b1bef7`](https://github.com/GitoxideLabs/gitoxide/commit/3b1bef7cc40e16b61bcc117ca90ebae21df7c7b1)) + - J fmt ([`c3c6504`](https://github.com/GitoxideLabs/gitoxide/commit/c3c650448f92bcb27194ce0a51f7d604ce87920d)) + - Thanks clippy ([`6f009d7`](https://github.com/GitoxideLabs/gitoxide/commit/6f009d781da9e931d44b113a925a80e77e8788af)) + - Merge pull request #1968 from GitoxideLabs/dependabot/cargo/cargo-bd18780e40 ([`46227e6`](https://github.com/GitoxideLabs/gitoxide/commit/46227e6d1ddc0879662730e5bb21a8597716b1ca)) + - Bump the cargo group with 40 updates ([`06bf1e1`](https://github.com/GitoxideLabs/gitoxide/commit/06bf1e1552de65ce692911bdc4c501d487bbc3d7)) + - Merge pull request #1825 from DianaNites/diananites-reftable ([`edb449c`](https://github.com/GitoxideLabs/gitoxide/commit/edb449c9dd60f74562dc78a33e41cfcb5d7be81e)) + - Don't panic, instead provide an error when fixture script fails. ([`692caeb`](https://github.com/GitoxideLabs/gitoxide/commit/692caeba599110d61da66cbbff545f2bc16748d5)) + - Merge pull request #1949 from GitoxideLabs/dependabot/cargo/cargo-6893e2988a ([`b5e9059`](https://github.com/GitoxideLabs/gitoxide/commit/b5e905991155ace32ef21464e69a8369a773f02b)) + - Bump the cargo group with 21 updates ([`68e6b2e`](https://github.com/GitoxideLabs/gitoxide/commit/68e6b2e54613fe788d645ea8c942c71a39c6ede1)) + - Merge pull request #1895 from EliahKagan/run-ci/s390x ([`705b86d`](https://github.com/GitoxideLabs/gitoxide/commit/705b86d59d6f18e76dcc5278f54b0e4838437d9d)) + - Move `env` subcommand to `internal-tools` ([`809fb2f`](https://github.com/GitoxideLabs/gitoxide/commit/809fb2f3fa2ceaef7fbcad5222ec6b892a086a9b)) + - Test `gix_testtools::umask()` on Android targets ([`c19bf1d`](https://github.com/GitoxideLabs/gitoxide/commit/c19bf1de76a3d6afc7740bdbc35181276bfcb58d)) + - Add `env` testtools subcommand to show the environment ([`8d596b4`](https://github.com/GitoxideLabs/gitoxide/commit/8d596b4179f37fbecf09291f29c15103851b63f2)) + - Show unexpected stderr in `umask` panic message ([`07022ee`](https://github.com/GitoxideLabs/gitoxide/commit/07022eee3d2e4a9257a07976a9871ae756493c96)) + - Merge pull request #1864 from EliahKagan/run-ci/bash-program ([`97d50a3`](https://github.com/GitoxideLabs/gitoxide/commit/97d50a3c2218a777919a7b06ac19e87100382b71)) + - Add `jtt bash-program` (`jtt bp`) to show `bash_program()` ([`720a23f`](https://github.com/GitoxideLabs/gitoxide/commit/720a23f873508fc574c0f0e9b212dbd0dd76b8bb)) + - Document `gix_testtools::bash_program()` and make it public ([`47234b6`](https://github.com/GitoxideLabs/gitoxide/commit/47234b66c5de20b6ea701c3f215d832c86d770c1)) + - Look for bash in `(git root)/bin`, then `(git root)/usr/bin` ([`0b45baf`](https://github.com/GitoxideLabs/gitoxide/commit/0b45bafe2026a2404183f50460d36ec4d40e8e14)) + - Look for bash in `(git root)/usr/bin`, not `(git root)/bin` ([`73d30d7`](https://github.com/GitoxideLabs/gitoxide/commit/73d30d7a1e61388a415b27552aa2596abb0238b5)) + - Prefer `/` over `\` in `bash.exe` path (for fixtures) ([`ba76201`](https://github.com/GitoxideLabs/gitoxide/commit/ba76201f619d32a3606609d14e3bb0f1dfb100b7)) + - Merge pull request #1854 from GitoxideLabs/montly-report ([`16a248b`](https://github.com/GitoxideLabs/gitoxide/commit/16a248beddbfbd21621f2bb57aaa82dca35acb19)) + - Thanks clippy ([`8e96ed3`](https://github.com/GitoxideLabs/gitoxide/commit/8e96ed37db680855d194c10673ba2dab28655d95)) + - Merge pull request #1822 from epage/w7 ([`11ac79c`](https://github.com/GitoxideLabs/gitoxide/commit/11ac79c068181d4ed9f6a404e4875ad7c206520c)) + - Upgrade to Winnow 0.7 ([`fdc57e7`](https://github.com/GitoxideLabs/gitoxide/commit/fdc57e79af6f7922d91ad8d7796943821f637124)) + - Upgrade to Winnow 0.6.26 ([`783c4e6`](https://github.com/GitoxideLabs/gitoxide/commit/783c4e698234b8afaf8fbd25057aca11c5c66e75)) + - Merge pull request #1815 from EliahKagan/quadratic ([`ffb73b5`](https://github.com/GitoxideLabs/gitoxide/commit/ffb73b5f69dbe86ff88f1c473af65f368a6bcbe5)) + - Comment forthcoming dependency changes for gix-testtools ([`6990f76`](https://github.com/GitoxideLabs/gitoxide/commit/6990f76a88b0a629a1bd578979218f5e791a862e)) + - Merge pull request #1764 from EliahKagan/finalize-entry ([`12f672f`](https://github.com/GitoxideLabs/gitoxide/commit/12f672f20f622a8488356a12df2d773851a683d4)) + - Refactor ([`4d5e656`](https://github.com/GitoxideLabs/gitoxide/commit/4d5e656fc0103e11ac2ed64305dd2430c6ed4648)) + - Fix an MSRV incompatibility ([`61174e5`](https://github.com/GitoxideLabs/gitoxide/commit/61174e585304ff34536c7ec5f325b734e3822161)) + - Add `gix_testtools::umask`, safe but only meant for tests ([`8e7fb99`](https://github.com/GitoxideLabs/gitoxide/commit/8e7fb99111f2dc9710ae4533f47341138bd58ade)) + - Merge pull request #1752 from GitoxideLabs/git-shell ([`1ca480a`](https://github.com/GitoxideLabs/gitoxide/commit/1ca480aa4093328a7e047e770fdffdb8cc6d8e8d)) + - Make a note to use `env::git_login_shell()` in testtools when available. ([`3aff1e5`](https://github.com/GitoxideLabs/gitoxide/commit/3aff1e57ba25b39774db4b1dd051bfe9c110911e)) + - Thanks clippy ([`9193b05`](https://github.com/GitoxideLabs/gitoxide/commit/9193b05b2528f62d829447ccc50314bd4cffc415)) + - Merge pull request #1733 from GitoxideLabs/fix-testools ([`df5cead`](https://github.com/GitoxideLabs/gitoxide/commit/df5cead220c193a9ceb8b78c8d6225368293416d)) + - Fix check to detect `git-lfs` managed files that weren't checked out. ([`93cb5ba`](https://github.com/GitoxideLabs/gitoxide/commit/93cb5ba03d364efcbb4110c2bd207f3d8de9b292)) + - Merge pull request #1705 from GitoxideLabs/merge ([`520c832`](https://github.com/GitoxideLabs/gitoxide/commit/520c832cfcfb34eb7617be55ebe2719ab35595fd)) + - Create a more local lock when creating writable fixtures. ([`8b694a6`](https://github.com/GitoxideLabs/gitoxide/commit/8b694a68cf60f5dd296733761d10fff612b4fc5e)) + - Merge pull request #1712 from EliahKagan/run-ci/git-bash ([`fadf106`](https://github.com/GitoxideLabs/gitoxide/commit/fadf106c735837c627f072ee37a9f7587f987bf2)) + - Fix an ambiguous `expect` message ([`1f6a866`](https://github.com/GitoxideLabs/gitoxide/commit/1f6a8669a64b15fbe7021c6906f88f5b7c7c142e)) + - Run test fixture scripts on Windows with Git Bash ([`fe3f2d1`](https://github.com/GitoxideLabs/gitoxide/commit/fe3f2d128a1478af97999025b46c7b146e778524)) + - Refine `EXEC_PATH` validation in `spawn_git_daemon` ([`479c06b`](https://github.com/GitoxideLabs/gitoxide/commit/479c06b372224a33d29e8b12fd59d96ab29fc60f)) + - Run `cargo fmt` ([`da03932`](https://github.com/GitoxideLabs/gitoxide/commit/da0393213dd0b08958da847e856b96028d038b46)) + - Use consistent `git` command name in gix-testtools ([`e30c070`](https://github.com/GitoxideLabs/gitoxide/commit/e30c0700c3e64b87c20b4695ccfb41f05f961129)) + - Rename `parse_gix_version` to `parse_git_version` ([`01737ad`](https://github.com/GitoxideLabs/gitoxide/commit/01737ad7b76f16d84c2d8a43d70e1c92f8514867)) + - Merge pull request #1687 from EliahKagan/run-ci/32bit ([`aeaebec`](https://github.com/GitoxideLabs/gitoxide/commit/aeaebec7b1e07ce94429987c4f2466799c24cb67)) + - Add `size_ok` for asserting size is not too big ([`77c3c59`](https://github.com/GitoxideLabs/gitoxide/commit/77c3c59d1f3be76f228ada15304d5af1f3f03a14)) + - Merge pull request #1612 from Byron/merge ([`37c1e4c`](https://github.com/GitoxideLabs/gitoxide/commit/37c1e4c919382c9d213bd5ca299ed659d63ab45d)) + - Thanks clippy ([`af03832`](https://github.com/GitoxideLabs/gitoxide/commit/af0383254422b70d53f27572c415eea2e4154447)) + - Merge pull request #1606 from EliahKagan/fixture-timeout ([`8c9e827`](https://github.com/GitoxideLabs/gitoxide/commit/8c9e827bc7727a8b0bcf36d2195120a2fc509d51)) + - Double the fixture lock timeout ([`39323c3`](https://github.com/GitoxideLabs/gitoxide/commit/39323c34ec232ea686f8cfb227f87e23336467cb)) + - Merge pull request #1594 from EliahKagan/comments ([`ab8880f`](https://github.com/GitoxideLabs/gitoxide/commit/ab8880fbdf0f7af7b483f4e1f9adbb8e374183ee)) + - Copyedit `configure_command` comment ([`56dbcd5`](https://github.com/GitoxideLabs/gitoxide/commit/56dbcd5632d8a4adf7189196a4bb3942a9fe1f4d)) + - Merge pull request #1592 from EliahKagan/tools-cfgcmd ([`5e783de`](https://github.com/GitoxideLabs/gitoxide/commit/5e783de0620d7c15992fcaa28c97f0ec04020b18)) + - Note that how we set `MSYS` ignores `env`/`env_remove` calls ([`4a25ef5`](https://github.com/GitoxideLabs/gitoxide/commit/4a25ef5030a868164eaf12ffe9603fbcc1a89d01)) + - Use more compact notation ([`0e1e6a9`](https://github.com/GitoxideLabs/gitoxide/commit/0e1e6a9bba4390906326c0a074f082e93b8345fe)) + - Broaden `args` param of `configure_command` ([`c202084`](https://github.com/GitoxideLabs/gitoxide/commit/c2020848f1be737c06669aeb977383559077b446)) + - Merge pull request #1590 from EliahKagan/run-ci/check-clean ([`4f92140`](https://github.com/GitoxideLabs/gitoxide/commit/4f92140febf4e9a13d7490b36c04fbf3fc63a5ad)) + - Merge pull request #1591 from EliahKagan/run-ci/deps-via-worktree ([`c485a2b`](https://github.com/GitoxideLabs/gitoxide/commit/c485a2bcdf3a07fd690fda4e02366bb52c2638ee)) + - Thanks clippy ([`94c6d70`](https://github.com/GitoxideLabs/gitoxide/commit/94c6d704ae216b12f7132c17876e0526097e86e6)) + - Recognize `GIX_TEST_CREATE_ARCHIVES_EVEN_ON_CI` ([`03d5a68`](https://github.com/GitoxideLabs/gitoxide/commit/03d5a6873e1b6d44227f709e91ac447e29abfac3)) + - Rename create_archive_if_{not_on_ci -> we_should} ([`8b51b3a`](https://github.com/GitoxideLabs/gitoxide/commit/8b51b3a0cb1edafc7b041f1037b3dfab4cdc3640)) + - Copyedit `create_archive_if_not_on_ci` comments ([`6963b37`](https://github.com/GitoxideLabs/gitoxide/commit/6963b376bbb0cff3e9331aaf924e96c1428d3892)) + - In gix-testtools use `ignore` and `index` via `gix_worktree` ([`f7f24e5`](https://github.com/GitoxideLabs/gitoxide/commit/f7f24e537246a47498d41f06816c14f17ea4ee48)) + - Merge pull request #1581 from EliahKagan/fixture-env ([`4044ffb`](https://github.com/GitoxideLabs/gitoxide/commit/4044ffb956a8a3842eaa6c5479be00a2bf2ae7e3)) + - Merge pull request #1580 from EliahKagan/msys ([`d00235a`](https://github.com/GitoxideLabs/gitoxide/commit/d00235a906e9155691f5fc3126b868dda515cd69)) + - Unset other env vars related to `GIT_DIR` for fixtures ([`9d4dd12`](https://github.com/GitoxideLabs/gitoxide/commit/9d4dd121498907e820f82051d840deefa719ab26)) + - Remove `configure_command_msys*` tests at least for now ([`c38d9b9`](https://github.com/GitoxideLabs/gitoxide/commit/c38d9b9f666cfd0858e46c0f600f4bc17259bb85)) + - Append to preexisting `MSYS` env var even if ill-formed ([`8dc5d7a`](https://github.com/GitoxideLabs/gitoxide/commit/8dc5d7aa736059aa45a17dfdc76d9d4c9993f996)) + - Start testing how the MSYS env var is customized ([`fbd4908`](https://github.com/GitoxideLabs/gitoxide/commit/fbd4908d8506254e3901bdce66e474ca08ff230b)) + - Merge pull request #1571 from EliahKagan/fixture-config ([`0e2f831`](https://github.com/GitoxideLabs/gitoxide/commit/0e2f831836ca13d7bc62d416c32e413b9823fe60)) + - Run `cargo fmt` ([`91e065c`](https://github.com/GitoxideLabs/gitoxide/commit/91e065cbbaad4454f9116d43e5a43a0d20bfd866)) + - Omit other high-scoped config in fixtures ([`a879d22`](https://github.com/GitoxideLabs/gitoxide/commit/a879d2214ae40be7692fa00360c8151bb8e2e88e)) + - Test that env for fixture scripts has only command-scope config ([`d576b32`](https://github.com/GitoxideLabs/gitoxide/commit/d576b321008d7e19180cfcd6a8d132352600bc91)) + - Merge pull request #1570 from EliahKagan/tools-nulldev ([`6f128dd`](https://github.com/GitoxideLabs/gitoxide/commit/6f128dd6adf9148e859a0cd027ff1c0ba0b619c0)) + - Minor refactors ([`50fcd7e`](https://github.com/GitoxideLabs/gitoxide/commit/50fcd7eb2dee0a8f57b1ffcf01868379571c1afb)) + - Don't assert that `tempfile::TempDir` cleans up ([`15bb2e3`](https://github.com/GitoxideLabs/gitoxide/commit/15bb2e36b17b57ae08d263b8e550e4655aad74c8)) + - Avoid `File::create_new` for compatibility with project MSRV ([`40ac226`](https://github.com/GitoxideLabs/gitoxide/commit/40ac226e6d44a05c8731e4eaf647bb5d6a9dda79)) + - Thanks clippy ([`2d7abaf`](https://github.com/GitoxideLabs/gitoxide/commit/2d7abaf8a816ecc3ec8a006223d4b636eab7a1b6)) + - Omit system/global config in fixtures regardless of contents ([`3cf9fc1`](https://github.com/GitoxideLabs/gitoxide/commit/3cf9fc12cb8ebb9bf04e4f5bd2aee884c18d672f)) + - Verify that we really write the strangely named test files ([`d7dca27`](https://github.com/GitoxideLabs/gitoxide/commit/d7dca27b81e4890cd0c597af275890df3d76b048)) + - Test on Windows with an actual file called `NUL` ([`f71d596`](https://github.com/GitoxideLabs/gitoxide/commit/f71d5966c204a2f3d1b48d59bad5b880caab717a)) + - Refactor the test for readability ([`7186eed`](https://github.com/GitoxideLabs/gitoxide/commit/7186eed39c40df82de2dd61530b6232c34b91ca9)) + - Fix assertion messages and expected exit status ([`a2dc5d8`](https://github.com/GitoxideLabs/gitoxide/commit/a2dc5d85a2ea61da4b4baddcd183b170763ed610)) + - Test that the system/global scopes are really cleared ([`d5b61df`](https://github.com/GitoxideLabs/gitoxide/commit/d5b61df18c5ab184e242f4e9d5d08730f7cd4fe7)) + - Start testing that we clear system/global scopes for fixtures ([`85c5e2f`](https://github.com/GitoxideLabs/gitoxide/commit/85c5e2fea1dbba8b8603bde7209bc8604042c55e)) + - Merge pull request #1560 from EliahKagan/run-ci/env-lifo ([`2972ea8`](https://github.com/GitoxideLabs/gitoxide/commit/2972ea8c3a03b8d6be2abdbd371c3f06dbdd67a4)) + - Merge pull request #1557 from Byron/merge-base ([`649f588`](https://github.com/GitoxideLabs/gitoxide/commit/649f5882cbebadf1133fa5f310e09b4aab77217e)) + - Move new tests up into a `tests` subdirectory ([`555164f`](https://github.com/GitoxideLabs/gitoxide/commit/555164f2387f77348ab876d05a77c142a69cacfa)) + - Let `gix_testtools::Env` undo multiple changes to the same var ([`581957e`](https://github.com/GitoxideLabs/gitoxide/commit/581957ea3d810da7529b818604067d16fc025631)) + - Add tests for `gix_testtools::Env` ([`505151c`](https://github.com/GitoxideLabs/gitoxide/commit/505151c9a9f61d9706a803d1cd7b25eaa1a99417)) + - Fix description of `gix_testtools::Env::unset` ([`3b17305`](https://github.com/GitoxideLabs/gitoxide/commit/3b173054c76f5113f36beca3ba5a3a44642e1915)) + - Allow empty-docs ([`beba720`](https://github.com/GitoxideLabs/gitoxide/commit/beba7204a50a84b30e3eb81413d968920599e226)) + - Merge branch 'global-lints' ([`37ba461`](https://github.com/GitoxideLabs/gitoxide/commit/37ba4619396974ec9cc41d1e882ac5efaf3816db)) + - Workspace Clippy lint management ([`2e0ce50`](https://github.com/GitoxideLabs/gitoxide/commit/2e0ce506968c112b215ca0056bd2742e7235df48)) + - Merge pull request #1546 from nyurik/semilocons ([`f992fb7`](https://github.com/GitoxideLabs/gitoxide/commit/f992fb773b443454015bd14658cfaa2f3ac07997)) + - Add missing semicolons ([`ec69c88`](https://github.com/GitoxideLabs/gitoxide/commit/ec69c88fc119f3aa1967a7e7f5fca30e3ce97595)) + - Update manifests (by cargo-smart-release) ([`0470df3`](https://github.com/GitoxideLabs/gitoxide/commit/0470df3b8ebb136b219f0057f1e9a7031975cce5)) + - Merge branch 'fix-windows-tests' ([`c2753b8`](https://github.com/GitoxideLabs/gitoxide/commit/c2753b8425c285c6b53f46eba9bc3584aa85eb01)) + - Fix gix-archive tests for when symlinks are allowed ([`93e088a`](https://github.com/GitoxideLabs/gitoxide/commit/93e088a619db0d4b81e444922f375de65c94a317)) + - Merge branch 'fix-1440' ([`f87322e`](https://github.com/GitoxideLabs/gitoxide/commit/f87322e185704d9d4368ae88e95892635a976e4a)) +
+ ## 0.15.0 (2024-06-23) Now by default, `tar` files will be written which works better when checking them into @@ -20,7 +695,7 @@ Git. Those who need the previous behaviour, can use the `xz` feature instead. - - 3 commits contributed to the release. + - 4 commits contributed to the release. - 1 commit was understood as [conventional](https://www.conventionalcommits.org). - 0 issues like '(#ID)' were seen in commit messages @@ -31,9 +706,10 @@ Git. Those who need the previous behaviour, can use the `xz` feature instead.
view details * **Uncategorized** - - Update changelog prior to `gix-testtools` release ([`88eb841`](https://github.com/Byron/gitoxide/commit/88eb841b7e3991b6f228390433f58333c6d4b85f)) - - Merge branch 'tar-only' ([`1dfa90d`](https://github.com/Byron/gitoxide/commit/1dfa90d641306b4099a6ecd52e2056b231467807)) - - Make `xz2` optional to write uncompressed tar files by default. ([`55382c0`](https://github.com/Byron/gitoxide/commit/55382c0aa6f04a3bb689299c613df2a39f261289)) + - Release gix-testtools v0.15.0 ([`78b8e41`](https://github.com/GitoxideLabs/gitoxide/commit/78b8e4110abd303511bad3fab469e7458f31f75a)) + - Update changelog prior to `gix-testtools` release ([`88eb841`](https://github.com/GitoxideLabs/gitoxide/commit/88eb841b7e3991b6f228390433f58333c6d4b85f)) + - Merge branch 'tar-only' ([`1dfa90d`](https://github.com/GitoxideLabs/gitoxide/commit/1dfa90d641306b4099a6ecd52e2056b231467807)) + - Make `xz2` optional to write uncompressed tar files by default. ([`55382c0`](https://github.com/GitoxideLabs/gitoxide/commit/55382c0aa6f04a3bb689299c613df2a39f261289))
## 0.14.0 (2024-06-22) @@ -44,8 +720,7 @@ A maintenance release with updated dependencies, and possibly minor improvements - - 22 commits contributed to the release over the course of 175 calendar days. - - 176 days passed between releases. + - 22 commits contributed to the release. - 0 commits were understood as [conventional](https://www.conventionalcommits.org). - 0 issues like '(#ID)' were seen in commit messages @@ -56,28 +731,28 @@ A maintenance release with updated dependencies, and possibly minor improvements
view details * **Uncategorized** - - Release gix-testtools v0.14.0 ([`f6eaba3`](https://github.com/Byron/gitoxide/commit/f6eaba3a465720819f2ef7844648699195dd8341)) - - Prepare changelog prior to release of `gix-testtools` ([`ae012ba`](https://github.com/Byron/gitoxide/commit/ae012ba8627a8ea2f0145c53c42972db1d875662)) - - Merge branch 'gix-testtools-license-file' ([`c50af65`](https://github.com/Byron/gitoxide/commit/c50af65bf84963cb430538915f8eca9bd4481012)) - - Update `gix-testtools` dependencies to the latest version. ([`ddaacda`](https://github.com/Byron/gitoxide/commit/ddaacda6667092ccea100180f70d2ccb9bb79dbc)) - - Add include directive to test-tools, to avoid CHANGELOG.md ([`c668bdd`](https://github.com/Byron/gitoxide/commit/c668bdd0b29f513df75c96f09c84abac612b8e6a)) - - Fix missing license files in the released gix-testtools crate ([`ef73ed4`](https://github.com/Byron/gitoxide/commit/ef73ed4644855ba53cc2b73674ee8df51ae7c053)) - - Merge branch 'main' into config-key-take-2 ([`9fa1054`](https://github.com/Byron/gitoxide/commit/9fa1054a01071180d7b08c8c2b5bd61e9d0d32da)) - - Release gix-fs v0.11.1, gix-glob v0.16.3 ([`2cefe77`](https://github.com/Byron/gitoxide/commit/2cefe77203131878d0d8f5346f20f0e25b76cbea)) - - Release gix-features v0.38.2, gix-actor v0.31.2, gix-validate v0.8.5, gix-object v0.42.2, gix-command v0.3.7, gix-filter v0.11.2, gix-fs v0.11.0, gix-revwalk v0.13.1, gix-traverse v0.39.1, gix-worktree-stream v0.13.0, gix-archive v0.13.0, gix-tempfile v14.0.0, gix-lock v14.0.0, gix-ref v0.44.0, gix-config v0.37.0, gix-prompt v0.8.5, gix-index v0.33.0, gix-worktree v0.34.0, gix-diff v0.44.0, gix-discover v0.32.0, gix-pathspec v0.7.5, gix-dir v0.5.0, gix-macros v0.1.5, gix-mailmap v0.23.1, gix-negotiate v0.13.1, gix-pack v0.51.0, gix-odb v0.61.0, gix-transport v0.42.1, gix-protocol v0.45.1, gix-revision v0.27.1, gix-status v0.10.0, gix-submodule v0.11.0, gix-worktree-state v0.11.0, gix v0.63.0, gitoxide-core v0.38.0, gitoxide v0.36.0, safety bump 19 crates ([`4f98e94`](https://github.com/Byron/gitoxide/commit/4f98e94e0e8b79ed2899b35bef40f3c30b3025b0)) - - Merge pull request #1365 from EliahKagan/no-fixture-lfs ([`c4e0a82`](https://github.com/Byron/gitoxide/commit/c4e0a82ec9948ed0d9876a50b156d1ba30e2ad77)) - - Remove LFS CI step and modify docs/comments ([`3283445`](https://github.com/Byron/gitoxide/commit/3283445424566579e2c2b31731f82d3f948a5c48)) - - Release gix-trace v0.1.9, gix-utils v0.1.12, gix-packetline-blocking v0.17.4, gix-filter v0.11.1, gix-fs v0.10.2, gix-traverse v0.39.0, gix-worktree-stream v0.12.0, gix-archive v0.12.0, gix-config v0.36.1, gix-url v0.27.3, gix-index v0.32.0, gix-worktree v0.33.0, gix-diff v0.43.0, gix-pathspec v0.7.3, gix-dir v0.4.0, gix-pack v0.50.0, gix-odb v0.60.0, gix-transport v0.42.0, gix-protocol v0.45.0, gix-status v0.9.0, gix-worktree-state v0.10.0, gix v0.62.0, gix-fsck v0.4.0, gitoxide-core v0.37.0, gitoxide v0.35.0, safety bump 14 crates ([`095c673`](https://github.com/Byron/gitoxide/commit/095c6739b2722a8b9af90776b435ef2da454c0e6)) - - Release gix-date v0.8.5, gix-hash v0.14.2, gix-trace v0.1.8, gix-utils v0.1.11, gix-features v0.38.1, gix-actor v0.31.0, gix-validate v0.8.4, gix-object v0.42.0, gix-path v0.10.7, gix-glob v0.16.2, gix-quote v0.4.12, gix-attributes v0.22.2, gix-command v0.3.6, gix-filter v0.11.0, gix-fs v0.10.1, gix-chunk v0.4.8, gix-commitgraph v0.24.2, gix-hashtable v0.5.2, gix-revwalk v0.13.0, gix-traverse v0.38.0, gix-worktree-stream v0.11.0, gix-archive v0.11.0, gix-config-value v0.14.6, gix-tempfile v13.1.1, gix-lock v13.1.1, gix-ref v0.43.0, gix-sec v0.10.6, gix-config v0.36.0, gix-prompt v0.8.4, gix-url v0.27.2, gix-credentials v0.24.2, gix-ignore v0.11.2, gix-bitmap v0.2.11, gix-index v0.31.0, gix-worktree v0.32.0, gix-diff v0.42.0, gix-discover v0.31.0, gix-pathspec v0.7.1, gix-dir v0.2.0, gix-macros v0.1.4, gix-mailmap v0.23.0, gix-negotiate v0.13.0, gix-pack v0.49.0, gix-odb v0.59.0, gix-packetline v0.17.4, gix-transport v0.41.2, gix-protocol v0.44.2, gix-revision v0.27.0, gix-refspec v0.23.0, gix-status v0.7.0, gix-submodule v0.10.0, gix-worktree-state v0.9.0, gix v0.60.0, safety bump 26 crates ([`b050327`](https://github.com/Byron/gitoxide/commit/b050327e76f234b19be921b78b7b28e034319fdb)) - - Merge pull request #1290 from epage/winnow ([`a663e9f`](https://github.com/Byron/gitoxide/commit/a663e9fcdb5a3aedc9200da77ebae17d5c3e7135)) - - Update winnow to 0.6 ([`e175b20`](https://github.com/Byron/gitoxide/commit/e175b20d431faa6859fbcc52f78400e50f91cad1)) - - Use winnow BStr ([`47d0374`](https://github.com/Byron/gitoxide/commit/47d0374e86cab4d498d955ac73bd7468cd5fcda9)) - - Update winnow to 0.5.40 ([`516e105`](https://github.com/Byron/gitoxide/commit/516e105db5f22e1483b4b8a886cc4f3929ad7f6a)) - - Merge pull request #1267 from epage/winnow ([`69cb78b`](https://github.com/Byron/gitoxide/commit/69cb78bd865a372c580b386766d7b61e5ca9303a)) - - Update from winnow 0.5.31 to 0.5.36 ([`9470554`](https://github.com/Byron/gitoxide/commit/94705546cf0e4c8e38bcc96999cfa79cd8ee1acd)) - - Release gix-utils v0.1.9, gix-features v0.38.0, gix-actor v0.30.0, gix-object v0.41.0, gix-path v0.10.4, gix-glob v0.16.0, gix-attributes v0.22.0, gix-command v0.3.3, gix-packetline-blocking v0.17.3, gix-filter v0.9.0, gix-fs v0.10.0, gix-commitgraph v0.24.0, gix-revwalk v0.12.0, gix-traverse v0.37.0, gix-worktree-stream v0.9.0, gix-archive v0.9.0, gix-config-value v0.14.4, gix-tempfile v13.0.0, gix-lock v13.0.0, gix-ref v0.41.0, gix-sec v0.10.4, gix-config v0.34.0, gix-url v0.27.0, gix-credentials v0.24.0, gix-ignore v0.11.0, gix-index v0.29.0, gix-worktree v0.30.0, gix-diff v0.40.0, gix-discover v0.29.0, gix-mailmap v0.22.0, gix-negotiate v0.12.0, gix-pack v0.47.0, gix-odb v0.57.0, gix-pathspec v0.6.0, gix-packetline v0.17.3, gix-transport v0.41.0, gix-protocol v0.44.0, gix-revision v0.26.0, gix-refspec v0.22.0, gix-status v0.5.0, gix-submodule v0.8.0, gix-worktree-state v0.7.0, gix v0.58.0, safety bump 39 crates ([`eb6aa8f`](https://github.com/Byron/gitoxide/commit/eb6aa8f502314f886fc4ea3d52ab220763968208)) - - Release gix-date v0.8.3, gix-hash v0.14.1, gix-trace v0.1.6, gix-features v0.37.1, gix-actor v0.29.1, gix-validate v0.8.3, gix-object v0.40.1, gix-path v0.10.3, gix-glob v0.15.1, gix-quote v0.4.10, gix-attributes v0.21.1, gix-command v0.3.2, gix-packetline-blocking v0.17.2, gix-utils v0.1.8, gix-filter v0.8.1, gix-fs v0.9.1, gix-chunk v0.4.7, gix-commitgraph v0.23.1, gix-hashtable v0.5.1, gix-revwalk v0.11.1, gix-traverse v0.36.1, gix-worktree-stream v0.8.1, gix-archive v0.8.1, gix-config-value v0.14.3, gix-tempfile v12.0.1, gix-lock v12.0.1, gix-ref v0.40.1, gix-sec v0.10.3, gix-config v0.33.1, gix-prompt v0.8.2, gix-url v0.26.1, gix-credentials v0.23.1, gix-ignore v0.10.1, gix-bitmap v0.2.10, gix-index v0.28.1, gix-worktree v0.29.1, gix-diff v0.39.1, gix-discover v0.28.1, gix-macros v0.1.3, gix-mailmap v0.21.1, gix-negotiate v0.11.1, gix-pack v0.46.1, gix-odb v0.56.1, gix-pathspec v0.5.1, gix-packetline v0.17.2, gix-transport v0.40.1, gix-protocol v0.43.1, gix-revision v0.25.1, gix-refspec v0.21.1, gix-status v0.4.1, gix-submodule v0.7.1, gix-worktree-state v0.6.1, gix v0.57.1 ([`972241f`](https://github.com/Byron/gitoxide/commit/972241f1904944e8b6e84c6aa1649a49be7a85c3)) - - Fixup `gix-testtools` manifest to allow releasing all other crates. ([`9587972`](https://github.com/Byron/gitoxide/commit/95879729c411337cb5f6f5fd699b8a6d61e83a78)) + - Release gix-testtools v0.14.0 ([`f6eaba3`](https://github.com/GitoxideLabs/gitoxide/commit/f6eaba3a465720819f2ef7844648699195dd8341)) + - Prepare changelog prior to release of `gix-testtools` ([`ae012ba`](https://github.com/GitoxideLabs/gitoxide/commit/ae012ba8627a8ea2f0145c53c42972db1d875662)) + - Merge branch 'gix-testtools-license-file' ([`c50af65`](https://github.com/GitoxideLabs/gitoxide/commit/c50af65bf84963cb430538915f8eca9bd4481012)) + - Update `gix-testtools` dependencies to the latest version. ([`ddaacda`](https://github.com/GitoxideLabs/gitoxide/commit/ddaacda6667092ccea100180f70d2ccb9bb79dbc)) + - Add include directive to test-tools, to avoid CHANGELOG.md ([`c668bdd`](https://github.com/GitoxideLabs/gitoxide/commit/c668bdd0b29f513df75c96f09c84abac612b8e6a)) + - Fix missing license files in the released gix-testtools crate ([`ef73ed4`](https://github.com/GitoxideLabs/gitoxide/commit/ef73ed4644855ba53cc2b73674ee8df51ae7c053)) + - Merge branch 'main' into config-key-take-2 ([`9fa1054`](https://github.com/GitoxideLabs/gitoxide/commit/9fa1054a01071180d7b08c8c2b5bd61e9d0d32da)) + - Release gix-fs v0.11.1, gix-glob v0.16.3 ([`2cefe77`](https://github.com/GitoxideLabs/gitoxide/commit/2cefe77203131878d0d8f5346f20f0e25b76cbea)) + - Release gix-features v0.38.2, gix-actor v0.31.2, gix-validate v0.8.5, gix-object v0.42.2, gix-command v0.3.7, gix-filter v0.11.2, gix-fs v0.11.0, gix-revwalk v0.13.1, gix-traverse v0.39.1, gix-worktree-stream v0.13.0, gix-archive v0.13.0, gix-tempfile v14.0.0, gix-lock v14.0.0, gix-ref v0.44.0, gix-config v0.37.0, gix-prompt v0.8.5, gix-index v0.33.0, gix-worktree v0.34.0, gix-diff v0.44.0, gix-discover v0.32.0, gix-pathspec v0.7.5, gix-dir v0.5.0, gix-macros v0.1.5, gix-mailmap v0.23.1, gix-negotiate v0.13.1, gix-pack v0.51.0, gix-odb v0.61.0, gix-transport v0.42.1, gix-protocol v0.45.1, gix-revision v0.27.1, gix-status v0.10.0, gix-submodule v0.11.0, gix-worktree-state v0.11.0, gix v0.63.0, gitoxide-core v0.38.0, gitoxide v0.36.0, safety bump 19 crates ([`4f98e94`](https://github.com/GitoxideLabs/gitoxide/commit/4f98e94e0e8b79ed2899b35bef40f3c30b3025b0)) + - Merge pull request #1365 from EliahKagan/no-fixture-lfs ([`c4e0a82`](https://github.com/GitoxideLabs/gitoxide/commit/c4e0a82ec9948ed0d9876a50b156d1ba30e2ad77)) + - Remove LFS CI step and modify docs/comments ([`3283445`](https://github.com/GitoxideLabs/gitoxide/commit/3283445424566579e2c2b31731f82d3f948a5c48)) + - Release gix-trace v0.1.9, gix-utils v0.1.12, gix-packetline-blocking v0.17.4, gix-filter v0.11.1, gix-fs v0.10.2, gix-traverse v0.39.0, gix-worktree-stream v0.12.0, gix-archive v0.12.0, gix-config v0.36.1, gix-url v0.27.3, gix-index v0.32.0, gix-worktree v0.33.0, gix-diff v0.43.0, gix-pathspec v0.7.3, gix-dir v0.4.0, gix-pack v0.50.0, gix-odb v0.60.0, gix-transport v0.42.0, gix-protocol v0.45.0, gix-status v0.9.0, gix-worktree-state v0.10.0, gix v0.62.0, gix-fsck v0.4.0, gitoxide-core v0.37.0, gitoxide v0.35.0, safety bump 14 crates ([`095c673`](https://github.com/GitoxideLabs/gitoxide/commit/095c6739b2722a8b9af90776b435ef2da454c0e6)) + - Release gix-date v0.8.5, gix-hash v0.14.2, gix-trace v0.1.8, gix-utils v0.1.11, gix-features v0.38.1, gix-actor v0.31.0, gix-validate v0.8.4, gix-object v0.42.0, gix-path v0.10.7, gix-glob v0.16.2, gix-quote v0.4.12, gix-attributes v0.22.2, gix-command v0.3.6, gix-filter v0.11.0, gix-fs v0.10.1, gix-chunk v0.4.8, gix-commitgraph v0.24.2, gix-hashtable v0.5.2, gix-revwalk v0.13.0, gix-traverse v0.38.0, gix-worktree-stream v0.11.0, gix-archive v0.11.0, gix-config-value v0.14.6, gix-tempfile v13.1.1, gix-lock v13.1.1, gix-ref v0.43.0, gix-sec v0.10.6, gix-config v0.36.0, gix-prompt v0.8.4, gix-url v0.27.2, gix-credentials v0.24.2, gix-ignore v0.11.2, gix-bitmap v0.2.11, gix-index v0.31.0, gix-worktree v0.32.0, gix-diff v0.42.0, gix-discover v0.31.0, gix-pathspec v0.7.1, gix-dir v0.2.0, gix-macros v0.1.4, gix-mailmap v0.23.0, gix-negotiate v0.13.0, gix-pack v0.49.0, gix-odb v0.59.0, gix-packetline v0.17.4, gix-transport v0.41.2, gix-protocol v0.44.2, gix-revision v0.27.0, gix-refspec v0.23.0, gix-status v0.7.0, gix-submodule v0.10.0, gix-worktree-state v0.9.0, gix v0.60.0, safety bump 26 crates ([`b050327`](https://github.com/GitoxideLabs/gitoxide/commit/b050327e76f234b19be921b78b7b28e034319fdb)) + - Merge pull request #1290 from epage/winnow ([`a663e9f`](https://github.com/GitoxideLabs/gitoxide/commit/a663e9fcdb5a3aedc9200da77ebae17d5c3e7135)) + - Update winnow to 0.6 ([`e175b20`](https://github.com/GitoxideLabs/gitoxide/commit/e175b20d431faa6859fbcc52f78400e50f91cad1)) + - Use winnow BStr ([`47d0374`](https://github.com/GitoxideLabs/gitoxide/commit/47d0374e86cab4d498d955ac73bd7468cd5fcda9)) + - Update winnow to 0.5.40 ([`516e105`](https://github.com/GitoxideLabs/gitoxide/commit/516e105db5f22e1483b4b8a886cc4f3929ad7f6a)) + - Merge pull request #1267 from epage/winnow ([`69cb78b`](https://github.com/GitoxideLabs/gitoxide/commit/69cb78bd865a372c580b386766d7b61e5ca9303a)) + - Update from winnow 0.5.31 to 0.5.36 ([`9470554`](https://github.com/GitoxideLabs/gitoxide/commit/94705546cf0e4c8e38bcc96999cfa79cd8ee1acd)) + - Release gix-utils v0.1.9, gix-features v0.38.0, gix-actor v0.30.0, gix-object v0.41.0, gix-path v0.10.4, gix-glob v0.16.0, gix-attributes v0.22.0, gix-command v0.3.3, gix-packetline-blocking v0.17.3, gix-filter v0.9.0, gix-fs v0.10.0, gix-commitgraph v0.24.0, gix-revwalk v0.12.0, gix-traverse v0.37.0, gix-worktree-stream v0.9.0, gix-archive v0.9.0, gix-config-value v0.14.4, gix-tempfile v13.0.0, gix-lock v13.0.0, gix-ref v0.41.0, gix-sec v0.10.4, gix-config v0.34.0, gix-url v0.27.0, gix-credentials v0.24.0, gix-ignore v0.11.0, gix-index v0.29.0, gix-worktree v0.30.0, gix-diff v0.40.0, gix-discover v0.29.0, gix-mailmap v0.22.0, gix-negotiate v0.12.0, gix-pack v0.47.0, gix-odb v0.57.0, gix-pathspec v0.6.0, gix-packetline v0.17.3, gix-transport v0.41.0, gix-protocol v0.44.0, gix-revision v0.26.0, gix-refspec v0.22.0, gix-status v0.5.0, gix-submodule v0.8.0, gix-worktree-state v0.7.0, gix v0.58.0, safety bump 39 crates ([`eb6aa8f`](https://github.com/GitoxideLabs/gitoxide/commit/eb6aa8f502314f886fc4ea3d52ab220763968208)) + - Release gix-date v0.8.3, gix-hash v0.14.1, gix-trace v0.1.6, gix-features v0.37.1, gix-actor v0.29.1, gix-validate v0.8.3, gix-object v0.40.1, gix-path v0.10.3, gix-glob v0.15.1, gix-quote v0.4.10, gix-attributes v0.21.1, gix-command v0.3.2, gix-packetline-blocking v0.17.2, gix-utils v0.1.8, gix-filter v0.8.1, gix-fs v0.9.1, gix-chunk v0.4.7, gix-commitgraph v0.23.1, gix-hashtable v0.5.1, gix-revwalk v0.11.1, gix-traverse v0.36.1, gix-worktree-stream v0.8.1, gix-archive v0.8.1, gix-config-value v0.14.3, gix-tempfile v12.0.1, gix-lock v12.0.1, gix-ref v0.40.1, gix-sec v0.10.3, gix-config v0.33.1, gix-prompt v0.8.2, gix-url v0.26.1, gix-credentials v0.23.1, gix-ignore v0.10.1, gix-bitmap v0.2.10, gix-index v0.28.1, gix-worktree v0.29.1, gix-diff v0.39.1, gix-discover v0.28.1, gix-macros v0.1.3, gix-mailmap v0.21.1, gix-negotiate v0.11.1, gix-pack v0.46.1, gix-odb v0.56.1, gix-pathspec v0.5.1, gix-packetline v0.17.2, gix-transport v0.40.1, gix-protocol v0.43.1, gix-revision v0.25.1, gix-refspec v0.21.1, gix-status v0.4.1, gix-submodule v0.7.1, gix-worktree-state v0.6.1, gix v0.57.1 ([`972241f`](https://github.com/GitoxideLabs/gitoxide/commit/972241f1904944e8b6e84c6aa1649a49be7a85c3)) + - Fixup `gix-testtools` manifest to allow releasing all other crates. ([`9587972`](https://github.com/GitoxideLabs/gitoxide/commit/95879729c411337cb5f6f5fd699b8a6d61e83a78))
## 0.13.0 (2023-12-29) @@ -122,10 +797,9 @@ A maintenance release with updated dependencies, and possibly minor improvements - - 50 commits contributed to the release over the course of 218 calendar days. - - 243 days passed between releases. + - 50 commits contributed to the release. - 8 commits were understood as [conventional](https://www.conventionalcommits.org). - - 1 unique issue was worked on: [#960](https://github.com/Byron/gitoxide/issues/960) + - 1 unique issue was worked on: [#960](https://github.com/GitoxideLabs/gitoxide/issues/960) ### Commit Details @@ -133,58 +807,58 @@ A maintenance release with updated dependencies, and possibly minor improvements
view details - * **[#960](https://github.com/Byron/gitoxide/issues/960)** - - Try to prevent 'git' reading user and system configuration ([`33be0e0`](https://github.com/Byron/gitoxide/commit/33be0e032e4802b0d8e261cccf19ecb9244ffb36)) + * **[#960](https://github.com/GitoxideLabs/gitoxide/issues/960)** + - Try to prevent 'git' reading user and system configuration ([`33be0e0`](https://github.com/GitoxideLabs/gitoxide/commit/33be0e032e4802b0d8e261cccf19ecb9244ffb36)) * **Uncategorized** - - Release gix-testtools v0.13.0 ([`edb12ff`](https://github.com/Byron/gitoxide/commit/edb12ff7216fdc9b0cf9960949b5794e6fa3cd08)) - - Set `gix-testtools` package versions so that it can be released ([`793c2af`](https://github.com/Byron/gitoxide/commit/793c2afbb5e4a5c817b06c15103310781769abfd)) - - Release gix-testtools v0.13.0 ([`7fe620d`](https://github.com/Byron/gitoxide/commit/7fe620d6135e7619c5484aeca7ca8823bee585e1)) - - Release gix-date v0.8.2, gix-hash v0.14.0, gix-trace v0.1.5, gix-features v0.37.0, gix-actor v0.29.0, gix-validate v0.8.2, gix-object v0.40.0, gix-path v0.10.2, gix-glob v0.15.0, gix-quote v0.4.9, gix-attributes v0.21.0, gix-command v0.3.1, gix-packetline-blocking v0.17.1, gix-utils v0.1.7, gix-filter v0.8.0, gix-fs v0.9.0, gix-chunk v0.4.6, gix-commitgraph v0.23.0, gix-hashtable v0.5.0, gix-revwalk v0.11.0, gix-traverse v0.36.0, gix-worktree-stream v0.8.0, gix-archive v0.8.0, gix-config-value v0.14.2, gix-tempfile v12.0.0, gix-lock v12.0.0, gix-ref v0.40.0, gix-sec v0.10.2, gix-config v0.33.0, gix-prompt v0.8.1, gix-url v0.26.0, gix-credentials v0.23.0, gix-ignore v0.10.0, gix-bitmap v0.2.9, gix-index v0.28.0, gix-worktree v0.29.0, gix-diff v0.39.0, gix-discover v0.28.0, gix-macros v0.1.2, gix-mailmap v0.21.0, gix-negotiate v0.11.0, gix-pack v0.46.0, gix-odb v0.56.0, gix-pathspec v0.5.0, gix-packetline v0.17.1, gix-transport v0.40.0, gix-protocol v0.43.0, gix-revision v0.25.0, gix-refspec v0.21.0, gix-status v0.4.0, gix-submodule v0.7.0, gix-worktree-state v0.6.0, gix v0.57.0, gix-fsck v0.2.0, gitoxide-core v0.35.0, gitoxide v0.33.0, safety bump 40 crates ([`e1aae19`](https://github.com/Byron/gitoxide/commit/e1aae191d7421c748913c92e2c5883274331dd20)) - - Merge branch 'maintenance' ([`4454c9d`](https://github.com/Byron/gitoxide/commit/4454c9d66c32a1de75a66639016c73edbda3bd34)) - - Upgrade testtools dependencies to latest feasible version ([`29c5904`](https://github.com/Byron/gitoxide/commit/29c59045425dcfc23392e0b766d6d6ca399b00a4)) - - Merge branch 'main' into fix-1183 ([`1691ba6`](https://github.com/Byron/gitoxide/commit/1691ba669537f4a39ebb0891747dc509a6aedbef)) - - Merge branch 'archive-handling' ([`7549559`](https://github.com/Byron/gitoxide/commit/7549559fcbf42249939f41fd7aa34b4449eb1fec)) - - Write informative message if archives are ignored due to script change. ([`06d4682`](https://github.com/Byron/gitoxide/commit/06d4682c9fed696fee09234223814016a6453a6d)) - - Release gix-date v0.8.1, gix-hash v0.13.2, gix-trace v0.1.4, gix-features v0.36.1, gix-actor v0.28.1, gix-validate v0.8.1, gix-object v0.39.0, gix-path v0.10.1, gix-glob v0.14.1, gix-quote v0.4.8, gix-attributes v0.20.1, gix-command v0.3.0, gix-packetline-blocking v0.17.0, gix-utils v0.1.6, gix-filter v0.7.0, gix-fs v0.8.1, gix-chunk v0.4.5, gix-commitgraph v0.22.1, gix-hashtable v0.4.1, gix-revwalk v0.10.0, gix-traverse v0.35.0, gix-worktree-stream v0.7.0, gix-archive v0.7.0, gix-config-value v0.14.1, gix-tempfile v11.0.1, gix-lock v11.0.1, gix-ref v0.39.0, gix-sec v0.10.1, gix-config v0.32.0, gix-prompt v0.8.0, gix-url v0.25.2, gix-credentials v0.22.0, gix-ignore v0.9.1, gix-bitmap v0.2.8, gix-index v0.27.0, gix-worktree v0.28.0, gix-diff v0.38.0, gix-discover v0.27.0, gix-macros v0.1.1, gix-mailmap v0.20.1, gix-negotiate v0.10.0, gix-pack v0.45.0, gix-odb v0.55.0, gix-pathspec v0.4.1, gix-packetline v0.17.0, gix-transport v0.39.0, gix-protocol v0.42.0, gix-revision v0.24.0, gix-refspec v0.20.0, gix-status v0.3.0, gix-submodule v0.6.0, gix-worktree-state v0.5.0, gix v0.56.0, gix-fsck v0.1.0, gitoxide-core v0.34.0, gitoxide v0.32.0, safety bump 27 crates ([`55d386a`](https://github.com/Byron/gitoxide/commit/55d386a2448aba1dd22c73fb63b3fd5b3a8401c9)) - - Merge branch 'adjustments-for-cargo' ([`8156340`](https://github.com/Byron/gitoxide/commit/8156340724b1b7cb15824f88c75f6ddd7302cff5)) - - Rename `GITOXIDE_*` environment variables to `GIX_#` ([`2189cee`](https://github.com/Byron/gitoxide/commit/2189cee47f99350b368390eaa2a01961bb77c250)) - - Upgrade to `winnow` 0.5.24 ([`abcfb65`](https://github.com/Byron/gitoxide/commit/abcfb659786425ec09eff6b644cd2ad36b7d6bc4)) - - Release gix-hash v0.13.1, gix-features v0.36.0, gix-actor v0.28.0, gix-object v0.38.0, gix-glob v0.14.0, gix-attributes v0.20.0, gix-command v0.2.10, gix-filter v0.6.0, gix-fs v0.8.0, gix-commitgraph v0.22.0, gix-revwalk v0.9.0, gix-traverse v0.34.0, gix-worktree-stream v0.6.0, gix-archive v0.6.0, gix-tempfile v11.0.0, gix-lock v11.0.0, gix-ref v0.38.0, gix-config v0.31.0, gix-url v0.25.0, gix-credentials v0.21.0, gix-diff v0.37.0, gix-discover v0.26.0, gix-ignore v0.9.0, gix-index v0.26.0, gix-mailmap v0.20.0, gix-negotiate v0.9.0, gix-pack v0.44.0, gix-odb v0.54.0, gix-pathspec v0.4.0, gix-packetline v0.16.7, gix-transport v0.37.0, gix-protocol v0.41.0, gix-revision v0.23.0, gix-refspec v0.19.0, gix-worktree v0.27.0, gix-status v0.2.0, gix-submodule v0.5.0, gix-worktree-state v0.4.0, gix v0.55.0, safety bump 37 crates ([`68e5432`](https://github.com/Byron/gitoxide/commit/68e54326e527a55dd5b5079921fc251615833040)) - - Release gix-features v0.35.0, gix-actor v0.27.0, gix-object v0.37.0, gix-glob v0.13.0, gix-attributes v0.19.0, gix-filter v0.5.0, gix-fs v0.7.0, gix-commitgraph v0.21.0, gix-revwalk v0.8.0, gix-traverse v0.33.0, gix-worktree-stream v0.5.0, gix-archive v0.5.0, gix-tempfile v10.0.0, gix-lock v10.0.0, gix-ref v0.37.0, gix-config v0.30.0, gix-url v0.24.0, gix-credentials v0.20.0, gix-diff v0.36.0, gix-discover v0.25.0, gix-ignore v0.8.0, gix-index v0.25.0, gix-mailmap v0.19.0, gix-negotiate v0.8.0, gix-pack v0.43.0, gix-odb v0.53.0, gix-pathspec v0.3.0, gix-transport v0.37.0, gix-protocol v0.40.0, gix-revision v0.22.0, gix-refspec v0.18.0, gix-status v0.1.0, gix-submodule v0.4.0, gix-worktree v0.26.0, gix-worktree-state v0.3.0, gix v0.54.0, gitoxide-core v0.32.0, gitoxide v0.30.0, safety bump 37 crates ([`7891fb1`](https://github.com/Byron/gitoxide/commit/7891fb17348ec2f4c997665f9a25be36e2713da4)) - - Release gix-date v0.8.0, gix-hash v0.13.0, gix-features v0.34.0, gix-actor v0.26.0, gix-object v0.36.0, gix-path v0.10.0, gix-glob v0.12.0, gix-attributes v0.18.0, gix-packetline-blocking v0.16.6, gix-filter v0.4.0, gix-fs v0.6.0, gix-commitgraph v0.20.0, gix-hashtable v0.4.0, gix-revwalk v0.7.0, gix-traverse v0.32.0, gix-worktree-stream v0.4.0, gix-archive v0.4.0, gix-config-value v0.14.0, gix-tempfile v9.0.0, gix-lock v9.0.0, gix-ref v0.36.0, gix-sec v0.10.0, gix-config v0.29.0, gix-prompt v0.7.0, gix-url v0.23.0, gix-credentials v0.19.0, gix-diff v0.35.0, gix-discover v0.24.0, gix-ignore v0.7.0, gix-index v0.24.0, gix-macros v0.1.0, gix-mailmap v0.18.0, gix-negotiate v0.7.0, gix-pack v0.42.0, gix-odb v0.52.0, gix-pathspec v0.2.0, gix-packetline v0.16.6, gix-transport v0.36.0, gix-protocol v0.39.0, gix-revision v0.21.0, gix-refspec v0.17.0, gix-submodule v0.3.0, gix-worktree v0.25.0, gix-worktree-state v0.2.0, gix v0.53.0, safety bump 39 crates ([`8bd0456`](https://github.com/Byron/gitoxide/commit/8bd045676bb2cdc02624ab93e73ff8518064ca38)) - - Merge branch `dyn`ification ([`f658fcc`](https://github.com/Byron/gitoxide/commit/f658fcc52dc2200ae34ca53dc10be97fb9012057)) - - Use `dyn` trait where possible. ([`072ee32`](https://github.com/Byron/gitoxide/commit/072ee32f693a31161cd6a843da6582d13efbb20b)) - - Merge branch 'gix-submodule' ([`363ee77`](https://github.com/Byron/gitoxide/commit/363ee77400805f473c9ad66eadad9214e7ab66f4)) - - Release gix-date v0.7.3, gix-hash v0.12.0, gix-features v0.33.0, gix-actor v0.25.0, gix-object v0.35.0, gix-path v0.9.0, gix-glob v0.11.0, gix-quote v0.4.7, gix-attributes v0.17.0, gix-command v0.2.9, gix-packetline-blocking v0.16.5, gix-filter v0.3.0, gix-fs v0.5.0, gix-commitgraph v0.19.0, gix-hashtable v0.3.0, gix-revwalk v0.6.0, gix-traverse v0.31.0, gix-worktree-stream v0.3.0, gix-archive v0.3.0, gix-config-value v0.13.0, gix-tempfile v8.0.0, gix-lock v8.0.0, gix-ref v0.35.0, gix-sec v0.9.0, gix-config v0.28.0, gix-prompt v0.6.0, gix-url v0.22.0, gix-credentials v0.18.0, gix-diff v0.34.0, gix-discover v0.23.0, gix-ignore v0.6.0, gix-bitmap v0.2.7, gix-index v0.22.0, gix-mailmap v0.17.0, gix-negotiate v0.6.0, gix-pack v0.41.0, gix-odb v0.51.0, gix-pathspec v0.1.0, gix-packetline v0.16.5, gix-transport v0.35.0, gix-protocol v0.38.0, gix-revision v0.20.0, gix-refspec v0.16.0, gix-submodule v0.2.0, gix-worktree v0.24.0, gix-worktree-state v0.1.0, gix v0.52.0, gitoxide-core v0.31.0, gitoxide v0.29.0, safety bump 41 crates ([`30b2761`](https://github.com/Byron/gitoxide/commit/30b27615047692d3ced1b2d9c2ac15a80f79fbee)) - - Switch `nom` to `winnow` in remaining uses in `gix-object`, `gix-ref`, and `gix-actor` for ~20% more performance. ([`ef54aab`](https://github.com/Byron/gitoxide/commit/ef54aab9e5521add4154ee8d902d62612a9d8d4a)) - - Refactor and fixes ([`02587fc`](https://github.com/Byron/gitoxide/commit/02587fc879c54b2b3e62ffbe1ab4c29591ea0d80)) - - Upgrade `winnow` to latest patch release ([`8c41848`](https://github.com/Byron/gitoxide/commit/8c4184817e4e4364c34badc8ff0a71c6ae952efd)) - - Switch errors to StrContext ([`df226dd`](https://github.com/Byron/gitoxide/commit/df226dd31df2c591c6470ed70098202112e13dae)) - - Show more error details in parse tests failures ([`266864f`](https://github.com/Byron/gitoxide/commit/266864f35dc9ee96b81d22281c8f267fd7c059a4)) - - Minor cleanup possible with 0.5 ([`a07590c`](https://github.com/Byron/gitoxide/commit/a07590cb46423cb0422c18b9fc04b153c0fd53b1)) - - Upgrade to Winnow 0.5 ([`3f8c91f`](https://github.com/Byron/gitoxide/commit/3f8c91fa463fbb53d54b2bf359e0dee7387afa00)) - - Upgrade to Winnow 0.4 ([`86ea47f`](https://github.com/Byron/gitoxide/commit/86ea47f28079c51f874b0d662867040b92f88d14)) - - Resolve remaining winnow 0.3 deprecations ([`fee441d`](https://github.com/Byron/gitoxide/commit/fee441da875d52b1a0cb557d2fa58cee9c29e16a)) - - Switch gix to winnow 0.3 ([`ee75de1`](https://github.com/Byron/gitoxide/commit/ee75de1e6035305fc23bdef2522ae5081272ac82)) - - Merge branch 'limit-git' ([`68d9e80`](https://github.com/Byron/gitoxide/commit/68d9e809d4e746fd7beaddeabd3313d59a4cbdfd)) - - Merge branch 'dev-on-linux' ([`6b4a303`](https://github.com/Byron/gitoxide/commit/6b4a30330fe49fc97daa73f55bf56580cc0597aa)) - - Better debug output when fixture script script fails ([`11cb431`](https://github.com/Byron/gitoxide/commit/11cb4317c75864bf310f4964edba7cf487a604f9)) - - Release gix-features v0.32.1, gix-actor v0.24.1, gix-validate v0.7.7, gix-object v0.33.1, gix-path v0.8.4, gix-glob v0.10.1, gix-quote v0.4.6, gix-attributes v0.16.0, gix-command v0.2.8, gix-packetline-blocking v0.16.4, gix-filter v0.2.0, gix-fs v0.4.1, gix-chunk v0.4.4, gix-commitgraph v0.18.1, gix-hashtable v0.2.4, gix-revwalk v0.4.1, gix-traverse v0.30.1, gix-worktree-stream v0.2.0, gix-archive v0.2.0, gix-config-value v0.12.5, gix-tempfile v7.0.1, gix-utils v0.1.5, gix-lock v7.0.2, gix-ref v0.33.1, gix-sec v0.8.4, gix-prompt v0.5.4, gix-url v0.21.1, gix-credentials v0.17.1, gix-diff v0.33.1, gix-discover v0.22.1, gix-ignore v0.5.1, gix-bitmap v0.2.6, gix-index v0.21.1, gix-mailmap v0.16.1, gix-negotiate v0.5.1, gix-pack v0.40.1, gix-odb v0.50.1, gix-packetline v0.16.4, gix-transport v0.34.1, gix-protocol v0.36.1, gix-revision v0.18.1, gix-refspec v0.14.1, gix-worktree v0.23.0, gix v0.50.0, safety bump 5 crates ([`16295b5`](https://github.com/Byron/gitoxide/commit/16295b58e2581d2e8b8b762816f52baabe871c75)) - - Adjust package versions (by cargo-smart-release) ([`c70e54f`](https://github.com/Byron/gitoxide/commit/c70e54f163c312c87753a506eeaad462e8579bfb)) - - Merge branch 'integrate-filtering' ([`b19a56d`](https://github.com/Byron/gitoxide/commit/b19a56dcfa9bea86332a84aa4e8fad445e7d1724)) - - Don't let scripts run on (potentially) partially extracted archives and don't create archives on windows ([`ed1407c`](https://github.com/Byron/gitoxide/commit/ed1407c85525a524bcfa0a4a021a22de339e6149)) - - Curtail `bstr` features to exactly what's needed. ([`7f7db97`](https://github.com/Byron/gitoxide/commit/7f7db9794c23b87c8ea50b7bcf38955c9d977624)) - - Upgrade memmap2 and fastrand dependencies ([`6fc7497`](https://github.com/Byron/gitoxide/commit/6fc74971ac6838cbfd9c869ba3746713001d7a38)) - - Release gix-date v0.6.0, gix-hash v0.11.3, gix-trace v0.1.1, gix-features v0.31.0, gix-actor v0.22.0, gix-path v0.8.2, gix-glob v0.9.0, gix-quote v0.4.5, gix-attributes v0.14.0, gix-chunk v0.4.3, gix-commitgraph v0.17.0, gix-config-value v0.12.2, gix-fs v0.3.0, gix-tempfile v7.0.0, gix-utils v0.1.3, gix-lock v7.0.0, gix-validate v0.7.6, gix-object v0.31.0, gix-ref v0.31.0, gix-sec v0.8.2, gix-config v0.24.0, gix-command v0.2.6, gix-prompt v0.5.2, gix-url v0.20.0, gix-credentials v0.16.0, gix-diff v0.31.0, gix-discover v0.20.0, gix-hashtable v0.2.2, gix-ignore v0.4.0, gix-bitmap v0.2.5, gix-revwalk v0.2.0, gix-traverse v0.28.0, gix-index v0.19.0, gix-mailmap v0.14.0, gix-negotiate v0.3.0, gix-pack v0.38.0, gix-odb v0.48.0, gix-packetline v0.16.3, gix-transport v0.33.0, gix-protocol v0.34.0, gix-revision v0.16.0, gix-refspec v0.12.0, gix-worktree v0.20.0, gix v0.47.0, gitoxide-core v0.29.0, gitoxide v0.27.0, safety bump 30 crates ([`ea9f942`](https://github.com/Byron/gitoxide/commit/ea9f9424e777f10da0e33bb9ffbbefd01c4c5a74)) - - Merge branch 'help-874-redundant-closures' ([`fe59956`](https://github.com/Byron/gitoxide/commit/fe59956ad667303a923d7cfd9ffd72283df41d78)) - - Add `clippy::redundant-closure-for-method-calls` lint ([`bcad5c2`](https://github.com/Byron/gitoxide/commit/bcad5c22049d56a25ef69d6c7a3344e78f9a1d4d)) - - Release gix-date v0.5.1, gix-hash v0.11.2, gix-features v0.30.0, gix-actor v0.21.0, gix-path v0.8.1, gix-glob v0.8.0, gix-quote v0.4.4, gix-attributes v0.13.0, gix-chunk v0.4.2, gix-commitgraph v0.16.0, gix-config-value v0.12.1, gix-fs v0.2.0, gix-tempfile v6.0.0, gix-utils v0.1.2, gix-lock v6.0.0, gix-validate v0.7.5, gix-object v0.30.0, gix-ref v0.30.0, gix-sec v0.8.1, gix-config v0.23.0, gix-command v0.2.5, gix-prompt v0.5.1, gix-url v0.19.0, gix-credentials v0.15.0, gix-diff v0.30.0, gix-discover v0.19.0, gix-hashtable v0.2.1, gix-ignore v0.3.0, gix-bitmap v0.2.4, gix-traverse v0.26.0, gix-index v0.17.0, gix-mailmap v0.13.0, gix-revision v0.15.0, gix-negotiate v0.2.0, gix-pack v0.36.0, gix-odb v0.46.0, gix-packetline v0.16.2, gix-transport v0.32.0, gix-protocol v0.33.0, gix-refspec v0.11.0, gix-worktree v0.18.0, gix v0.45.0, safety bump 29 crates ([`9a9fa96`](https://github.com/Byron/gitoxide/commit/9a9fa96fa8a722bddc5c3b2270b0edf8f6615141)) - - Allow gix-testtools to refer to the local crates that don't cause cycles. ([`082a6fc`](https://github.com/Byron/gitoxide/commit/082a6fc65ae08ea0fda11a3340941d58ead4036a)) - - Merge branch 'fix-docs' ([`420553a`](https://github.com/Byron/gitoxide/commit/420553a10d780e0b2dc466cac120989298a5f187)) - - Cleaning up documentation ([`2578e57`](https://github.com/Byron/gitoxide/commit/2578e576bfa365d194a23a1fb0bf09be230873de)) - - Merge branch 'auto-clippy' ([`dbf8aa1`](https://github.com/Byron/gitoxide/commit/dbf8aa19d19109195d0274928eae4b94f248cd88)) - - Autofix map-or-unwrap clippy lint (and manual fix what was left) ([`2087032`](https://github.com/Byron/gitoxide/commit/2087032b5956dcd82bce6ac57e530e8724b57f17)) - - Auto-fix clippy to remove explicit iter looping ([`3eff567`](https://github.com/Byron/gitoxide/commit/3eff567c683b5c650c14792b68968cbdbc90ec5c)) + - Release gix-testtools v0.13.0 ([`edb12ff`](https://github.com/GitoxideLabs/gitoxide/commit/edb12ff7216fdc9b0cf9960949b5794e6fa3cd08)) + - Set `gix-testtools` package versions so that it can be released ([`793c2af`](https://github.com/GitoxideLabs/gitoxide/commit/793c2afbb5e4a5c817b06c15103310781769abfd)) + - Release gix-testtools v0.13.0 ([`7fe620d`](https://github.com/GitoxideLabs/gitoxide/commit/7fe620d6135e7619c5484aeca7ca8823bee585e1)) + - Release gix-date v0.8.2, gix-hash v0.14.0, gix-trace v0.1.5, gix-features v0.37.0, gix-actor v0.29.0, gix-validate v0.8.2, gix-object v0.40.0, gix-path v0.10.2, gix-glob v0.15.0, gix-quote v0.4.9, gix-attributes v0.21.0, gix-command v0.3.1, gix-packetline-blocking v0.17.1, gix-utils v0.1.7, gix-filter v0.8.0, gix-fs v0.9.0, gix-chunk v0.4.6, gix-commitgraph v0.23.0, gix-hashtable v0.5.0, gix-revwalk v0.11.0, gix-traverse v0.36.0, gix-worktree-stream v0.8.0, gix-archive v0.8.0, gix-config-value v0.14.2, gix-tempfile v12.0.0, gix-lock v12.0.0, gix-ref v0.40.0, gix-sec v0.10.2, gix-config v0.33.0, gix-prompt v0.8.1, gix-url v0.26.0, gix-credentials v0.23.0, gix-ignore v0.10.0, gix-bitmap v0.2.9, gix-index v0.28.0, gix-worktree v0.29.0, gix-diff v0.39.0, gix-discover v0.28.0, gix-macros v0.1.2, gix-mailmap v0.21.0, gix-negotiate v0.11.0, gix-pack v0.46.0, gix-odb v0.56.0, gix-pathspec v0.5.0, gix-packetline v0.17.1, gix-transport v0.40.0, gix-protocol v0.43.0, gix-revision v0.25.0, gix-refspec v0.21.0, gix-status v0.4.0, gix-submodule v0.7.0, gix-worktree-state v0.6.0, gix v0.57.0, gix-fsck v0.2.0, gitoxide-core v0.35.0, gitoxide v0.33.0, safety bump 40 crates ([`e1aae19`](https://github.com/GitoxideLabs/gitoxide/commit/e1aae191d7421c748913c92e2c5883274331dd20)) + - Merge branch 'maintenance' ([`4454c9d`](https://github.com/GitoxideLabs/gitoxide/commit/4454c9d66c32a1de75a66639016c73edbda3bd34)) + - Upgrade testtools dependencies to latest feasible version ([`29c5904`](https://github.com/GitoxideLabs/gitoxide/commit/29c59045425dcfc23392e0b766d6d6ca399b00a4)) + - Merge branch 'main' into fix-1183 ([`1691ba6`](https://github.com/GitoxideLabs/gitoxide/commit/1691ba669537f4a39ebb0891747dc509a6aedbef)) + - Merge branch 'archive-handling' ([`7549559`](https://github.com/GitoxideLabs/gitoxide/commit/7549559fcbf42249939f41fd7aa34b4449eb1fec)) + - Write informative message if archives are ignored due to script change. ([`06d4682`](https://github.com/GitoxideLabs/gitoxide/commit/06d4682c9fed696fee09234223814016a6453a6d)) + - Release gix-date v0.8.1, gix-hash v0.13.2, gix-trace v0.1.4, gix-features v0.36.1, gix-actor v0.28.1, gix-validate v0.8.1, gix-object v0.39.0, gix-path v0.10.1, gix-glob v0.14.1, gix-quote v0.4.8, gix-attributes v0.20.1, gix-command v0.3.0, gix-packetline-blocking v0.17.0, gix-utils v0.1.6, gix-filter v0.7.0, gix-fs v0.8.1, gix-chunk v0.4.5, gix-commitgraph v0.22.1, gix-hashtable v0.4.1, gix-revwalk v0.10.0, gix-traverse v0.35.0, gix-worktree-stream v0.7.0, gix-archive v0.7.0, gix-config-value v0.14.1, gix-tempfile v11.0.1, gix-lock v11.0.1, gix-ref v0.39.0, gix-sec v0.10.1, gix-config v0.32.0, gix-prompt v0.8.0, gix-url v0.25.2, gix-credentials v0.22.0, gix-ignore v0.9.1, gix-bitmap v0.2.8, gix-index v0.27.0, gix-worktree v0.28.0, gix-diff v0.38.0, gix-discover v0.27.0, gix-macros v0.1.1, gix-mailmap v0.20.1, gix-negotiate v0.10.0, gix-pack v0.45.0, gix-odb v0.55.0, gix-pathspec v0.4.1, gix-packetline v0.17.0, gix-transport v0.39.0, gix-protocol v0.42.0, gix-revision v0.24.0, gix-refspec v0.20.0, gix-status v0.3.0, gix-submodule v0.6.0, gix-worktree-state v0.5.0, gix v0.56.0, gix-fsck v0.1.0, gitoxide-core v0.34.0, gitoxide v0.32.0, safety bump 27 crates ([`55d386a`](https://github.com/GitoxideLabs/gitoxide/commit/55d386a2448aba1dd22c73fb63b3fd5b3a8401c9)) + - Merge branch 'adjustments-for-cargo' ([`8156340`](https://github.com/GitoxideLabs/gitoxide/commit/8156340724b1b7cb15824f88c75f6ddd7302cff5)) + - Rename `GITOXIDE_*` environment variables to `GIX_#` ([`2189cee`](https://github.com/GitoxideLabs/gitoxide/commit/2189cee47f99350b368390eaa2a01961bb77c250)) + - Upgrade to `winnow` 0.5.24 ([`abcfb65`](https://github.com/GitoxideLabs/gitoxide/commit/abcfb659786425ec09eff6b644cd2ad36b7d6bc4)) + - Release gix-hash v0.13.1, gix-features v0.36.0, gix-actor v0.28.0, gix-object v0.38.0, gix-glob v0.14.0, gix-attributes v0.20.0, gix-command v0.2.10, gix-filter v0.6.0, gix-fs v0.8.0, gix-commitgraph v0.22.0, gix-revwalk v0.9.0, gix-traverse v0.34.0, gix-worktree-stream v0.6.0, gix-archive v0.6.0, gix-tempfile v11.0.0, gix-lock v11.0.0, gix-ref v0.38.0, gix-config v0.31.0, gix-url v0.25.0, gix-credentials v0.21.0, gix-diff v0.37.0, gix-discover v0.26.0, gix-ignore v0.9.0, gix-index v0.26.0, gix-mailmap v0.20.0, gix-negotiate v0.9.0, gix-pack v0.44.0, gix-odb v0.54.0, gix-pathspec v0.4.0, gix-packetline v0.16.7, gix-transport v0.37.0, gix-protocol v0.41.0, gix-revision v0.23.0, gix-refspec v0.19.0, gix-worktree v0.27.0, gix-status v0.2.0, gix-submodule v0.5.0, gix-worktree-state v0.4.0, gix v0.55.0, safety bump 37 crates ([`68e5432`](https://github.com/GitoxideLabs/gitoxide/commit/68e54326e527a55dd5b5079921fc251615833040)) + - Release gix-features v0.35.0, gix-actor v0.27.0, gix-object v0.37.0, gix-glob v0.13.0, gix-attributes v0.19.0, gix-filter v0.5.0, gix-fs v0.7.0, gix-commitgraph v0.21.0, gix-revwalk v0.8.0, gix-traverse v0.33.0, gix-worktree-stream v0.5.0, gix-archive v0.5.0, gix-tempfile v10.0.0, gix-lock v10.0.0, gix-ref v0.37.0, gix-config v0.30.0, gix-url v0.24.0, gix-credentials v0.20.0, gix-diff v0.36.0, gix-discover v0.25.0, gix-ignore v0.8.0, gix-index v0.25.0, gix-mailmap v0.19.0, gix-negotiate v0.8.0, gix-pack v0.43.0, gix-odb v0.53.0, gix-pathspec v0.3.0, gix-transport v0.37.0, gix-protocol v0.40.0, gix-revision v0.22.0, gix-refspec v0.18.0, gix-status v0.1.0, gix-submodule v0.4.0, gix-worktree v0.26.0, gix-worktree-state v0.3.0, gix v0.54.0, gitoxide-core v0.32.0, gitoxide v0.30.0, safety bump 37 crates ([`7891fb1`](https://github.com/GitoxideLabs/gitoxide/commit/7891fb17348ec2f4c997665f9a25be36e2713da4)) + - Release gix-date v0.8.0, gix-hash v0.13.0, gix-features v0.34.0, gix-actor v0.26.0, gix-object v0.36.0, gix-path v0.10.0, gix-glob v0.12.0, gix-attributes v0.18.0, gix-packetline-blocking v0.16.6, gix-filter v0.4.0, gix-fs v0.6.0, gix-commitgraph v0.20.0, gix-hashtable v0.4.0, gix-revwalk v0.7.0, gix-traverse v0.32.0, gix-worktree-stream v0.4.0, gix-archive v0.4.0, gix-config-value v0.14.0, gix-tempfile v9.0.0, gix-lock v9.0.0, gix-ref v0.36.0, gix-sec v0.10.0, gix-config v0.29.0, gix-prompt v0.7.0, gix-url v0.23.0, gix-credentials v0.19.0, gix-diff v0.35.0, gix-discover v0.24.0, gix-ignore v0.7.0, gix-index v0.24.0, gix-macros v0.1.0, gix-mailmap v0.18.0, gix-negotiate v0.7.0, gix-pack v0.42.0, gix-odb v0.52.0, gix-pathspec v0.2.0, gix-packetline v0.16.6, gix-transport v0.36.0, gix-protocol v0.39.0, gix-revision v0.21.0, gix-refspec v0.17.0, gix-submodule v0.3.0, gix-worktree v0.25.0, gix-worktree-state v0.2.0, gix v0.53.0, safety bump 39 crates ([`8bd0456`](https://github.com/GitoxideLabs/gitoxide/commit/8bd045676bb2cdc02624ab93e73ff8518064ca38)) + - Merge branch `dyn`ification ([`f658fcc`](https://github.com/GitoxideLabs/gitoxide/commit/f658fcc52dc2200ae34ca53dc10be97fb9012057)) + - Use `dyn` trait where possible. ([`072ee32`](https://github.com/GitoxideLabs/gitoxide/commit/072ee32f693a31161cd6a843da6582d13efbb20b)) + - Merge branch 'gix-submodule' ([`363ee77`](https://github.com/GitoxideLabs/gitoxide/commit/363ee77400805f473c9ad66eadad9214e7ab66f4)) + - Release gix-date v0.7.3, gix-hash v0.12.0, gix-features v0.33.0, gix-actor v0.25.0, gix-object v0.35.0, gix-path v0.9.0, gix-glob v0.11.0, gix-quote v0.4.7, gix-attributes v0.17.0, gix-command v0.2.9, gix-packetline-blocking v0.16.5, gix-filter v0.3.0, gix-fs v0.5.0, gix-commitgraph v0.19.0, gix-hashtable v0.3.0, gix-revwalk v0.6.0, gix-traverse v0.31.0, gix-worktree-stream v0.3.0, gix-archive v0.3.0, gix-config-value v0.13.0, gix-tempfile v8.0.0, gix-lock v8.0.0, gix-ref v0.35.0, gix-sec v0.9.0, gix-config v0.28.0, gix-prompt v0.6.0, gix-url v0.22.0, gix-credentials v0.18.0, gix-diff v0.34.0, gix-discover v0.23.0, gix-ignore v0.6.0, gix-bitmap v0.2.7, gix-index v0.22.0, gix-mailmap v0.17.0, gix-negotiate v0.6.0, gix-pack v0.41.0, gix-odb v0.51.0, gix-pathspec v0.1.0, gix-packetline v0.16.5, gix-transport v0.35.0, gix-protocol v0.38.0, gix-revision v0.20.0, gix-refspec v0.16.0, gix-submodule v0.2.0, gix-worktree v0.24.0, gix-worktree-state v0.1.0, gix v0.52.0, gitoxide-core v0.31.0, gitoxide v0.29.0, safety bump 41 crates ([`30b2761`](https://github.com/GitoxideLabs/gitoxide/commit/30b27615047692d3ced1b2d9c2ac15a80f79fbee)) + - Switch `nom` to `winnow` in remaining uses in `gix-object`, `gix-ref`, and `gix-actor` for ~20% more performance. ([`ef54aab`](https://github.com/GitoxideLabs/gitoxide/commit/ef54aab9e5521add4154ee8d902d62612a9d8d4a)) + - Refactor and fixes ([`02587fc`](https://github.com/GitoxideLabs/gitoxide/commit/02587fc879c54b2b3e62ffbe1ab4c29591ea0d80)) + - Upgrade `winnow` to latest patch release ([`8c41848`](https://github.com/GitoxideLabs/gitoxide/commit/8c4184817e4e4364c34badc8ff0a71c6ae952efd)) + - Switch errors to StrContext ([`df226dd`](https://github.com/GitoxideLabs/gitoxide/commit/df226dd31df2c591c6470ed70098202112e13dae)) + - Show more error details in parse tests failures ([`266864f`](https://github.com/GitoxideLabs/gitoxide/commit/266864f35dc9ee96b81d22281c8f267fd7c059a4)) + - Minor cleanup possible with 0.5 ([`a07590c`](https://github.com/GitoxideLabs/gitoxide/commit/a07590cb46423cb0422c18b9fc04b153c0fd53b1)) + - Upgrade to Winnow 0.5 ([`3f8c91f`](https://github.com/GitoxideLabs/gitoxide/commit/3f8c91fa463fbb53d54b2bf359e0dee7387afa00)) + - Upgrade to Winnow 0.4 ([`86ea47f`](https://github.com/GitoxideLabs/gitoxide/commit/86ea47f28079c51f874b0d662867040b92f88d14)) + - Resolve remaining winnow 0.3 deprecations ([`fee441d`](https://github.com/GitoxideLabs/gitoxide/commit/fee441da875d52b1a0cb557d2fa58cee9c29e16a)) + - Switch gix to winnow 0.3 ([`ee75de1`](https://github.com/GitoxideLabs/gitoxide/commit/ee75de1e6035305fc23bdef2522ae5081272ac82)) + - Merge branch 'limit-git' ([`68d9e80`](https://github.com/GitoxideLabs/gitoxide/commit/68d9e809d4e746fd7beaddeabd3313d59a4cbdfd)) + - Merge branch 'dev-on-linux' ([`6b4a303`](https://github.com/GitoxideLabs/gitoxide/commit/6b4a30330fe49fc97daa73f55bf56580cc0597aa)) + - Better debug output when fixture script script fails ([`11cb431`](https://github.com/GitoxideLabs/gitoxide/commit/11cb4317c75864bf310f4964edba7cf487a604f9)) + - Release gix-features v0.32.1, gix-actor v0.24.1, gix-validate v0.7.7, gix-object v0.33.1, gix-path v0.8.4, gix-glob v0.10.1, gix-quote v0.4.6, gix-attributes v0.16.0, gix-command v0.2.8, gix-packetline-blocking v0.16.4, gix-filter v0.2.0, gix-fs v0.4.1, gix-chunk v0.4.4, gix-commitgraph v0.18.1, gix-hashtable v0.2.4, gix-revwalk v0.4.1, gix-traverse v0.30.1, gix-worktree-stream v0.2.0, gix-archive v0.2.0, gix-config-value v0.12.5, gix-tempfile v7.0.1, gix-utils v0.1.5, gix-lock v7.0.2, gix-ref v0.33.1, gix-sec v0.8.4, gix-prompt v0.5.4, gix-url v0.21.1, gix-credentials v0.17.1, gix-diff v0.33.1, gix-discover v0.22.1, gix-ignore v0.5.1, gix-bitmap v0.2.6, gix-index v0.21.1, gix-mailmap v0.16.1, gix-negotiate v0.5.1, gix-pack v0.40.1, gix-odb v0.50.1, gix-packetline v0.16.4, gix-transport v0.34.1, gix-protocol v0.36.1, gix-revision v0.18.1, gix-refspec v0.14.1, gix-worktree v0.23.0, gix v0.50.0, safety bump 5 crates ([`16295b5`](https://github.com/GitoxideLabs/gitoxide/commit/16295b58e2581d2e8b8b762816f52baabe871c75)) + - Adjust package versions (by cargo-smart-release) ([`c70e54f`](https://github.com/GitoxideLabs/gitoxide/commit/c70e54f163c312c87753a506eeaad462e8579bfb)) + - Merge branch 'integrate-filtering' ([`b19a56d`](https://github.com/GitoxideLabs/gitoxide/commit/b19a56dcfa9bea86332a84aa4e8fad445e7d1724)) + - Don't let scripts run on (potentially) partially extracted archives and don't create archives on windows ([`ed1407c`](https://github.com/GitoxideLabs/gitoxide/commit/ed1407c85525a524bcfa0a4a021a22de339e6149)) + - Curtail `bstr` features to exactly what's needed. ([`7f7db97`](https://github.com/GitoxideLabs/gitoxide/commit/7f7db9794c23b87c8ea50b7bcf38955c9d977624)) + - Upgrade memmap2 and fastrand dependencies ([`6fc7497`](https://github.com/GitoxideLabs/gitoxide/commit/6fc74971ac6838cbfd9c869ba3746713001d7a38)) + - Release gix-date v0.6.0, gix-hash v0.11.3, gix-trace v0.1.1, gix-features v0.31.0, gix-actor v0.22.0, gix-path v0.8.2, gix-glob v0.9.0, gix-quote v0.4.5, gix-attributes v0.14.0, gix-chunk v0.4.3, gix-commitgraph v0.17.0, gix-config-value v0.12.2, gix-fs v0.3.0, gix-tempfile v7.0.0, gix-utils v0.1.3, gix-lock v7.0.0, gix-validate v0.7.6, gix-object v0.31.0, gix-ref v0.31.0, gix-sec v0.8.2, gix-config v0.24.0, gix-command v0.2.6, gix-prompt v0.5.2, gix-url v0.20.0, gix-credentials v0.16.0, gix-diff v0.31.0, gix-discover v0.20.0, gix-hashtable v0.2.2, gix-ignore v0.4.0, gix-bitmap v0.2.5, gix-revwalk v0.2.0, gix-traverse v0.28.0, gix-index v0.19.0, gix-mailmap v0.14.0, gix-negotiate v0.3.0, gix-pack v0.38.0, gix-odb v0.48.0, gix-packetline v0.16.3, gix-transport v0.33.0, gix-protocol v0.34.0, gix-revision v0.16.0, gix-refspec v0.12.0, gix-worktree v0.20.0, gix v0.47.0, gitoxide-core v0.29.0, gitoxide v0.27.0, safety bump 30 crates ([`ea9f942`](https://github.com/GitoxideLabs/gitoxide/commit/ea9f9424e777f10da0e33bb9ffbbefd01c4c5a74)) + - Merge branch 'help-874-redundant-closures' ([`fe59956`](https://github.com/GitoxideLabs/gitoxide/commit/fe59956ad667303a923d7cfd9ffd72283df41d78)) + - Add `clippy::redundant-closure-for-method-calls` lint ([`bcad5c2`](https://github.com/GitoxideLabs/gitoxide/commit/bcad5c22049d56a25ef69d6c7a3344e78f9a1d4d)) + - Release gix-date v0.5.1, gix-hash v0.11.2, gix-features v0.30.0, gix-actor v0.21.0, gix-path v0.8.1, gix-glob v0.8.0, gix-quote v0.4.4, gix-attributes v0.13.0, gix-chunk v0.4.2, gix-commitgraph v0.16.0, gix-config-value v0.12.1, gix-fs v0.2.0, gix-tempfile v6.0.0, gix-utils v0.1.2, gix-lock v6.0.0, gix-validate v0.7.5, gix-object v0.30.0, gix-ref v0.30.0, gix-sec v0.8.1, gix-config v0.23.0, gix-command v0.2.5, gix-prompt v0.5.1, gix-url v0.19.0, gix-credentials v0.15.0, gix-diff v0.30.0, gix-discover v0.19.0, gix-hashtable v0.2.1, gix-ignore v0.3.0, gix-bitmap v0.2.4, gix-traverse v0.26.0, gix-index v0.17.0, gix-mailmap v0.13.0, gix-revision v0.15.0, gix-negotiate v0.2.0, gix-pack v0.36.0, gix-odb v0.46.0, gix-packetline v0.16.2, gix-transport v0.32.0, gix-protocol v0.33.0, gix-refspec v0.11.0, gix-worktree v0.18.0, gix v0.45.0, safety bump 29 crates ([`9a9fa96`](https://github.com/GitoxideLabs/gitoxide/commit/9a9fa96fa8a722bddc5c3b2270b0edf8f6615141)) + - Allow gix-testtools to refer to the local crates that don't cause cycles. ([`082a6fc`](https://github.com/GitoxideLabs/gitoxide/commit/082a6fc65ae08ea0fda11a3340941d58ead4036a)) + - Merge branch 'fix-docs' ([`420553a`](https://github.com/GitoxideLabs/gitoxide/commit/420553a10d780e0b2dc466cac120989298a5f187)) + - Cleaning up documentation ([`2578e57`](https://github.com/GitoxideLabs/gitoxide/commit/2578e576bfa365d194a23a1fb0bf09be230873de)) + - Merge branch 'auto-clippy' ([`dbf8aa1`](https://github.com/GitoxideLabs/gitoxide/commit/dbf8aa19d19109195d0274928eae4b94f248cd88)) + - Autofix map-or-unwrap clippy lint (and manual fix what was left) ([`2087032`](https://github.com/GitoxideLabs/gitoxide/commit/2087032b5956dcd82bce6ac57e530e8724b57f17)) + - Auto-fix clippy to remove explicit iter looping ([`3eff567`](https://github.com/GitoxideLabs/gitoxide/commit/3eff567c683b5c650c14792b68968cbdbc90ec5c))
## 0.12.0 (2023-04-29) @@ -203,8 +877,7 @@ A maintenance release with updated dependencies, and possibly minor improvements - - 7 commits contributed to the release over the course of 61 calendar days. - - 68 days passed between releases. + - 7 commits contributed to the release. - 2 commits were understood as [conventional](https://www.conventionalcommits.org). - 0 issues like '(#ID)' were seen in commit messages @@ -215,13 +888,13 @@ A maintenance release with updated dependencies, and possibly minor improvements
view details * **Uncategorized** - - Release gix-discover v0.18.1, gix-worktree v0.17.1, gix-testtools v0.12.0 ([`f7b6c6f`](https://github.com/Byron/gitoxide/commit/f7b6c6f27c090cbc584fbd3f5403da5ac1a9ff02)) - - Prepare changelogs prior to release of gix-testtools ([`fc45f1b`](https://github.com/Byron/gitoxide/commit/fc45f1b417bf545d4a0a105c40b37f92c24decad)) - - Upgrade dependencies ([`b973f19`](https://github.com/Byron/gitoxide/commit/b973f19274bb2d8218e5ff63ce0a81f34985f54c)) - - Accept paths in scripted_fixture_writable ([`efcbf0d`](https://github.com/Byron/gitoxide/commit/efcbf0d1cb1c9d77eaf04fbcf6e86dc101c886d2)) - - Add note about shortcomings of `Creation::CopyFromReadOnly` mode. ([`b2e3223`](https://github.com/Byron/gitoxide/commit/b2e322332ac017824e90d260d7041504c38ab57f)) - - Fix minor typos ([`cc48c35`](https://github.com/Byron/gitoxide/commit/cc48c35d0ecf35824910c5b6ecc62fe9b2aff1b5)) - - Prepare for git-tempfile release ([`56c005b`](https://github.com/Byron/gitoxide/commit/56c005b13c44376f71e61781e73c0bf93416d0e4)) + - Release gix-discover v0.18.1, gix-worktree v0.17.1, gix-testtools v0.12.0 ([`f7b6c6f`](https://github.com/GitoxideLabs/gitoxide/commit/f7b6c6f27c090cbc584fbd3f5403da5ac1a9ff02)) + - Prepare changelogs prior to release of gix-testtools ([`fc45f1b`](https://github.com/GitoxideLabs/gitoxide/commit/fc45f1b417bf545d4a0a105c40b37f92c24decad)) + - Upgrade dependencies ([`b973f19`](https://github.com/GitoxideLabs/gitoxide/commit/b973f19274bb2d8218e5ff63ce0a81f34985f54c)) + - Accept paths in scripted_fixture_writable ([`efcbf0d`](https://github.com/GitoxideLabs/gitoxide/commit/efcbf0d1cb1c9d77eaf04fbcf6e86dc101c886d2)) + - Add note about shortcomings of `Creation::CopyFromReadOnly` mode. ([`b2e3223`](https://github.com/GitoxideLabs/gitoxide/commit/b2e322332ac017824e90d260d7041504c38ab57f)) + - Fix minor typos ([`cc48c35`](https://github.com/GitoxideLabs/gitoxide/commit/cc48c35d0ecf35824910c5b6ecc62fe9b2aff1b5)) + - Prepare for git-tempfile release ([`56c005b`](https://github.com/GitoxideLabs/gitoxide/commit/56c005b13c44376f71e61781e73c0bf93416d0e4))
## 0.11.0 (2023-02-20) @@ -330,9 +1003,9 @@ A maintenance release with updated dependencies, and possibly minor improvements - - 247 commits contributed to the release over the course of 938 calendar days. + - 247 commits contributed to the release. - 23 commits were understood as [conventional](https://www.conventionalcommits.org). - - 20 unique issues were worked on: [#198](https://github.com/Byron/gitoxide/issues/198), [#266](https://github.com/Byron/gitoxide/issues/266), [#293](https://github.com/Byron/gitoxide/issues/293), [#298](https://github.com/Byron/gitoxide/issues/298), [#301](https://github.com/Byron/gitoxide/issues/301), [#331](https://github.com/Byron/gitoxide/issues/331), [#364](https://github.com/Byron/gitoxide/issues/364), [#366](https://github.com/Byron/gitoxide/issues/366), [#382](https://github.com/Byron/gitoxide/issues/382), [#384](https://github.com/Byron/gitoxide/issues/384), [#391](https://github.com/Byron/gitoxide/issues/391), [#393](https://github.com/Byron/gitoxide/issues/393), [#427](https://github.com/Byron/gitoxide/issues/427), [#450](https://github.com/Byron/gitoxide/issues/450), [#470](https://github.com/Byron/gitoxide/issues/470), [#488](https://github.com/Byron/gitoxide/issues/488), [#509](https://github.com/Byron/gitoxide/issues/509), [#607](https://github.com/Byron/gitoxide/issues/607), [#650](https://github.com/Byron/gitoxide/issues/650), [#XXX](https://github.com/Byron/gitoxide/issues/XXX) + - 20 unique issues were worked on: [#198](https://github.com/GitoxideLabs/gitoxide/issues/198), [#266](https://github.com/GitoxideLabs/gitoxide/issues/266), [#293](https://github.com/GitoxideLabs/gitoxide/issues/293), [#298](https://github.com/GitoxideLabs/gitoxide/issues/298), [#301](https://github.com/GitoxideLabs/gitoxide/issues/301), [#331](https://github.com/GitoxideLabs/gitoxide/issues/331), [#364](https://github.com/GitoxideLabs/gitoxide/issues/364), [#366](https://github.com/GitoxideLabs/gitoxide/issues/366), [#382](https://github.com/GitoxideLabs/gitoxide/issues/382), [#384](https://github.com/GitoxideLabs/gitoxide/issues/384), [#391](https://github.com/GitoxideLabs/gitoxide/issues/391), [#393](https://github.com/GitoxideLabs/gitoxide/issues/393), [#427](https://github.com/GitoxideLabs/gitoxide/issues/427), [#450](https://github.com/GitoxideLabs/gitoxide/issues/450), [#470](https://github.com/GitoxideLabs/gitoxide/issues/470), [#488](https://github.com/GitoxideLabs/gitoxide/issues/488), [#509](https://github.com/GitoxideLabs/gitoxide/issues/509), [#607](https://github.com/GitoxideLabs/gitoxide/issues/607), [#650](https://github.com/GitoxideLabs/gitoxide/issues/650), [#XXX](https://github.com/GitoxideLabs/gitoxide/issues/XXX) ### Thanks Clippy @@ -346,274 +1019,274 @@ A maintenance release with updated dependencies, and possibly minor improvements
view details - * **[#198](https://github.com/Byron/gitoxide/issues/198)** - - Fix windows tests by transforming line endings ([`e276d77`](https://github.com/Byron/gitoxide/commit/e276d777eb7a88dc424badbf88a929b5f567e5de)) - * **[#266](https://github.com/Byron/gitoxide/issues/266)** - - A failing test to show the handle-stability doesn't quite work yet ([`5562e88`](https://github.com/Byron/gitoxide/commit/5562e8888cd8ac8fc3d89a41f8e8cc5cec7b8ca6)) - - Refactor ([`c499843`](https://github.com/Byron/gitoxide/commit/c499843485a8af102cb4d3594c4e6014976c5aa0)) - * **[#293](https://github.com/Byron/gitoxide/issues/293)** - - REUC reading works ([`29c1af9`](https://github.com/Byron/gitoxide/commit/29c1af9b2d7b9879a806fc84cfc89ed6c0d7f083)) - - Use parking_lot mutex to avoid poison errors ([`d8ca74f`](https://github.com/Byron/gitoxide/commit/d8ca74f358e802916353f545b90127f9a7bb5137)) - - Base setup for index testing ([`aa60fdf`](https://github.com/Byron/gitoxide/commit/aa60fdf3d86e08877c88f9e4973f546642ed1370)) - * **[#298](https://github.com/Byron/gitoxide/issues/298)** - - Upgrade dependencies ([`b039d39`](https://github.com/Byron/gitoxide/commit/b039d39613bb14d49670c4d8b586f76ffb420d03)) - - Upgrade parking_lot and cargo_toml ([`f95c1a0`](https://github.com/Byron/gitoxide/commit/f95c1a0d9c19bcc6feb9b8739a09d86f9970a0e0)) - * **[#301](https://github.com/Byron/gitoxide/issues/301)** - - Allow to re-execute scripts into temp directories. ([`449b6c1`](https://github.com/Byron/gitoxide/commit/449b6c1555fc2832c712ba51cd41ab9ed79e0b15)) - - Don't print archive message if archive is excluded ([`c6bd30e`](https://github.com/Byron/gitoxide/commit/c6bd30e81997931d1f65a62924d20fe5e74b8521)) - - Support unique directories for different platforms ([`0b385b3`](https://github.com/Byron/gitoxide/commit/0b385b31cf95d500f9ec2d05be0894956e40e4a1)) - - Use git exclude information to determine if archives should be generated ([`4a3dccc`](https://github.com/Byron/gitoxide/commit/4a3dccc7fc7a5e190d88af8c7eb0713edbada55f)) - - Add TODO ([`778fd77`](https://github.com/Byron/gitoxide/commit/778fd7703920e6a2693beb59aad611f3c9fab106)) - - Publicly accessible `Result` type ([`f1635c3`](https://github.com/Byron/gitoxide/commit/f1635c3ee36678cff9f26135946c281bf4a75331)) - - Refactor ([`9ea1e44`](https://github.com/Byron/gitoxide/commit/9ea1e4474a3ce803da7a56e1fc1748f65c11a876)) - * **[#331](https://github.com/Byron/gitoxide/issues/331)** - - Expose `on_ci` in the top-level. ([`654b521`](https://github.com/Byron/gitoxide/commit/654b521323a5822cbb86e57bee159d90576fa5ff)) - - Move `Env` test utility into `git-testtools` ([`bd3f4d0`](https://github.com/Byron/gitoxide/commit/bd3f4d014dd7df7a1e25defa8eea7253eec1560a)) - * **[#364](https://github.com/Byron/gitoxide/issues/364)** - - Add test-tools changelog prior to release ([`1ebc16a`](https://github.com/Byron/gitoxide/commit/1ebc16a6ac9ef188c188a52737820773aa949cee)) - * **[#366](https://github.com/Byron/gitoxide/issues/366)** - - Quickfix for unintentionally using 'unicode' feature of bytecode ([`fb5593a`](https://github.com/Byron/gitoxide/commit/fb5593a7272498ae042b6c8c7605faa3d253fa10)) - * **[#382](https://github.com/Byron/gitoxide/issues/382)** - - Simplify state tests ([`fc61c0d`](https://github.com/Byron/gitoxide/commit/fc61c0d4f7cb3cd9073418e4d8edc55cd14f5fb3)) - * **[#384](https://github.com/Byron/gitoxide/issues/384)** - - Enforce signal handler setup to cleanup tempfiles on abort ([`1caf3ae`](https://github.com/Byron/gitoxide/commit/1caf3ae2cabee776dc45a687f00ce386c27ab87d)) - - No need to isolate archives by crate name ([`19d46f3`](https://github.com/Byron/gitoxide/commit/19d46f35440419b9911b6e2bca2cfc975865dce9)) - - Provide some more information when using archives; debug windows more ([`4f5b1fd`](https://github.com/Byron/gitoxide/commit/4f5b1fd5e6440208c460388a9d69d664d6d8d0d7)) - - Protect test generation from multi-process races ([`1aec924`](https://github.com/Byron/gitoxide/commit/1aec924f009fd16b953cd1313b9408558b1c7aeb)) - - Definitely don't follow symlnks ([`1343448`](https://github.com/Byron/gitoxide/commit/13434481c44efbc170cb74dd9057807c3ee58e01)) - - Make sure existing files aren't written into ([`9b5a8a2`](https://github.com/Byron/gitoxide/commit/9b5a8a243d49b6567d1db31050d3bf3123dd54d3)) - - Extraction of tar archives with identity check ([`07c1f07`](https://github.com/Byron/gitoxide/commit/07c1f0752fefbd3e49ef414bced2ca6bbc844448)) - - Assure there are no archive file-name clashes across crates ([`c30bebf`](https://github.com/Byron/gitoxide/commit/c30bebf4f0272fe728e18b1932e419128f63ed44)) - - Actual compression of archives ([`5dd3d82`](https://github.com/Byron/gitoxide/commit/5dd3d82aa68c9024cd1742043a3c56cd6b0665fd)) - - Simple creation of test-archives ([`f1e107a`](https://github.com/Byron/gitoxide/commit/f1e107aa864107e02309b15b41da8d8f962e19a6)) - - Make sure archives are handled by git-lfs ([`f744a6c`](https://github.com/Byron/gitoxide/commit/f744a6cc8b453ea349664540af4be0566e376528)) - - Frame for extracting and generating archives ([`92c7044`](https://github.com/Byron/gitoxide/commit/92c7044cfbc3054b237ea7c79da981bb91908812)) - - Further partition generated test directories by script name ([`e141ddb`](https://github.com/Byron/gitoxide/commit/e141ddbdd2e0677e921856b30096733530fde569)) - - Auto-set commit.gpgsign=false when executing git ([`c23feb6`](https://github.com/Byron/gitoxide/commit/c23feb64ad157180cfba8a11c882b829733ea8f6)) - * **[#391](https://github.com/Byron/gitoxide/issues/391)** - - Also write a failure marker if archive creation failed ([`7f88c7f`](https://github.com/Byron/gitoxide/commit/7f88c7f9d908df39ad4e710402783dca35eb758f)) - - Auto-clean test fixtures on re-run if they failed previously ([`3617ff4`](https://github.com/Byron/gitoxide/commit/3617ff411224a691057eb1c39c4144b932b33f51)) - * **[#393](https://github.com/Byron/gitoxide/issues/393)** - - Add support for disabling archive usage ([`624ad2e`](https://github.com/Byron/gitoxide/commit/624ad2ef42172556efe942129f6f46dd627250d5)) - * **[#427](https://github.com/Byron/gitoxide/issues/427)** - - Make fmt ([`4b320e7`](https://github.com/Byron/gitoxide/commit/4b320e773368ac5e8c38dd8a779ef3d6d2d024ec)) - * **[#450](https://github.com/Byron/gitoxide/issues/450)** - - Add `Env::unset()` for convenience ([`09da4c5`](https://github.com/Byron/gitoxide/commit/09da4c5eeff5c6657beb9c53c168f90e74d6f758)) - - Upgrade `bstr` to `1.0.1` ([`99905ba`](https://github.com/Byron/gitoxide/commit/99905bacace8aed42b16d43f0f04cae996cb971c)) - - Allow multiple scripts to run at the same time, if they are not the same. ([`cba9ede`](https://github.com/Byron/gitoxide/commit/cba9edeb403aae4d77087de4167cbabe72525d92)) - - Make tests more robust; fix windows tests ([`1983fbc`](https://github.com/Byron/gitoxide/commit/1983fbc39be3da5598cf3af6fb97f6ea0bc3ec6b)) - * **[#470](https://github.com/Byron/gitoxide/issues/470)** - - Update changelogs prior to release ([`caa7a1b`](https://github.com/Byron/gitoxide/commit/caa7a1bdef74d7d3166a7e38127a59f5ab3cfbdd)) - * **[#488](https://github.com/Byron/gitoxide/issues/488)** - - Provide `GIT_VERSION` information along with a way to skip a test based on it. ([`2317856`](https://github.com/Byron/gitoxide/commit/231785644194cd3be0b0dab06224a39ecf0ed714)) - * **[#509](https://github.com/Byron/gitoxide/issues/509)** - - Some unit tests for the time when something truly unparseable shows up ([`94fc0d6`](https://github.com/Byron/gitoxide/commit/94fc0d60d21c22a0d36f5de986cd9443755141bf)) - - Be more verbose when git version parsing fails ([`9c2f1b5`](https://github.com/Byron/gitoxide/commit/9c2f1b5d03fbcf5dd08c2469ea17da426ea6670c)) - * **[#607](https://github.com/Byron/gitoxide/issues/607)** - - Don't overwrite unexpanded `git-lfs` pointer files. ([`761b7d7`](https://github.com/Byron/gitoxide/commit/761b7d71977a5aa4876010faa61ab88f0dba6eab)) - - Improve documentation to inform about the need for `git-lfs`. ([`519db50`](https://github.com/Byron/gitoxide/commit/519db50eac6576906f266a6f0b980f88098e3f9f)) - * **[#650](https://github.com/Byron/gitoxide/issues/650)** - - Allow execution of scripts without 'bash'. ([`15ecd84`](https://github.com/Byron/gitoxide/commit/15ecd841cfe7c77bbdfdfa232dd51a44c4940bbc)) - - Rename `scripted_fixture_*` to not contain 'repo' in the name. ([`dbf6c8c`](https://github.com/Byron/gitoxide/commit/dbf6c8c87cdca8169ac01aa89aefe56a33215142)) - * **[#XXX](https://github.com/Byron/gitoxide/issues/XXX)** - - `_with_args(…)` functions now allow non-static strings ([`004dab1`](https://github.com/Byron/gitoxide/commit/004dab17deab4c360adb5ac428f6b4951c974fe3)) + * **[#198](https://github.com/GitoxideLabs/gitoxide/issues/198)** + - Fix windows tests by transforming line endings ([`e276d77`](https://github.com/GitoxideLabs/gitoxide/commit/e276d777eb7a88dc424badbf88a929b5f567e5de)) + * **[#266](https://github.com/GitoxideLabs/gitoxide/issues/266)** + - A failing test to show the handle-stability doesn't quite work yet ([`5562e88`](https://github.com/GitoxideLabs/gitoxide/commit/5562e8888cd8ac8fc3d89a41f8e8cc5cec7b8ca6)) + - Refactor ([`c499843`](https://github.com/GitoxideLabs/gitoxide/commit/c499843485a8af102cb4d3594c4e6014976c5aa0)) + * **[#293](https://github.com/GitoxideLabs/gitoxide/issues/293)** + - REUC reading works ([`29c1af9`](https://github.com/GitoxideLabs/gitoxide/commit/29c1af9b2d7b9879a806fc84cfc89ed6c0d7f083)) + - Use parking_lot mutex to avoid poison errors ([`d8ca74f`](https://github.com/GitoxideLabs/gitoxide/commit/d8ca74f358e802916353f545b90127f9a7bb5137)) + - Base setup for index testing ([`aa60fdf`](https://github.com/GitoxideLabs/gitoxide/commit/aa60fdf3d86e08877c88f9e4973f546642ed1370)) + * **[#298](https://github.com/GitoxideLabs/gitoxide/issues/298)** + - Upgrade dependencies ([`b039d39`](https://github.com/GitoxideLabs/gitoxide/commit/b039d39613bb14d49670c4d8b586f76ffb420d03)) + - Upgrade parking_lot and cargo_toml ([`f95c1a0`](https://github.com/GitoxideLabs/gitoxide/commit/f95c1a0d9c19bcc6feb9b8739a09d86f9970a0e0)) + * **[#301](https://github.com/GitoxideLabs/gitoxide/issues/301)** + - Allow to re-execute scripts into temp directories. ([`449b6c1`](https://github.com/GitoxideLabs/gitoxide/commit/449b6c1555fc2832c712ba51cd41ab9ed79e0b15)) + - Don't print archive message if archive is excluded ([`c6bd30e`](https://github.com/GitoxideLabs/gitoxide/commit/c6bd30e81997931d1f65a62924d20fe5e74b8521)) + - Support unique directories for different platforms ([`0b385b3`](https://github.com/GitoxideLabs/gitoxide/commit/0b385b31cf95d500f9ec2d05be0894956e40e4a1)) + - Use git exclude information to determine if archives should be generated ([`4a3dccc`](https://github.com/GitoxideLabs/gitoxide/commit/4a3dccc7fc7a5e190d88af8c7eb0713edbada55f)) + - Add TODO ([`778fd77`](https://github.com/GitoxideLabs/gitoxide/commit/778fd7703920e6a2693beb59aad611f3c9fab106)) + - Publicly accessible `Result` type ([`f1635c3`](https://github.com/GitoxideLabs/gitoxide/commit/f1635c3ee36678cff9f26135946c281bf4a75331)) + - Refactor ([`9ea1e44`](https://github.com/GitoxideLabs/gitoxide/commit/9ea1e4474a3ce803da7a56e1fc1748f65c11a876)) + * **[#331](https://github.com/GitoxideLabs/gitoxide/issues/331)** + - Expose `on_ci` in the top-level. ([`654b521`](https://github.com/GitoxideLabs/gitoxide/commit/654b521323a5822cbb86e57bee159d90576fa5ff)) + - Move `Env` test utility into `git-testtools` ([`bd3f4d0`](https://github.com/GitoxideLabs/gitoxide/commit/bd3f4d014dd7df7a1e25defa8eea7253eec1560a)) + * **[#364](https://github.com/GitoxideLabs/gitoxide/issues/364)** + - Add test-tools changelog prior to release ([`1ebc16a`](https://github.com/GitoxideLabs/gitoxide/commit/1ebc16a6ac9ef188c188a52737820773aa949cee)) + * **[#366](https://github.com/GitoxideLabs/gitoxide/issues/366)** + - Quickfix for unintentionally using 'unicode' feature of bytecode ([`fb5593a`](https://github.com/GitoxideLabs/gitoxide/commit/fb5593a7272498ae042b6c8c7605faa3d253fa10)) + * **[#382](https://github.com/GitoxideLabs/gitoxide/issues/382)** + - Simplify state tests ([`fc61c0d`](https://github.com/GitoxideLabs/gitoxide/commit/fc61c0d4f7cb3cd9073418e4d8edc55cd14f5fb3)) + * **[#384](https://github.com/GitoxideLabs/gitoxide/issues/384)** + - Enforce signal handler setup to cleanup tempfiles on abort ([`1caf3ae`](https://github.com/GitoxideLabs/gitoxide/commit/1caf3ae2cabee776dc45a687f00ce386c27ab87d)) + - No need to isolate archives by crate name ([`19d46f3`](https://github.com/GitoxideLabs/gitoxide/commit/19d46f35440419b9911b6e2bca2cfc975865dce9)) + - Provide some more information when using archives; debug windows more ([`4f5b1fd`](https://github.com/GitoxideLabs/gitoxide/commit/4f5b1fd5e6440208c460388a9d69d664d6d8d0d7)) + - Protect test generation from multi-process races ([`1aec924`](https://github.com/GitoxideLabs/gitoxide/commit/1aec924f009fd16b953cd1313b9408558b1c7aeb)) + - Definitely don't follow symlnks ([`1343448`](https://github.com/GitoxideLabs/gitoxide/commit/13434481c44efbc170cb74dd9057807c3ee58e01)) + - Make sure existing files aren't written into ([`9b5a8a2`](https://github.com/GitoxideLabs/gitoxide/commit/9b5a8a243d49b6567d1db31050d3bf3123dd54d3)) + - Extraction of tar archives with identity check ([`07c1f07`](https://github.com/GitoxideLabs/gitoxide/commit/07c1f0752fefbd3e49ef414bced2ca6bbc844448)) + - Assure there are no archive file-name clashes across crates ([`c30bebf`](https://github.com/GitoxideLabs/gitoxide/commit/c30bebf4f0272fe728e18b1932e419128f63ed44)) + - Actual compression of archives ([`5dd3d82`](https://github.com/GitoxideLabs/gitoxide/commit/5dd3d82aa68c9024cd1742043a3c56cd6b0665fd)) + - Simple creation of test-archives ([`f1e107a`](https://github.com/GitoxideLabs/gitoxide/commit/f1e107aa864107e02309b15b41da8d8f962e19a6)) + - Make sure archives are handled by git-lfs ([`f744a6c`](https://github.com/GitoxideLabs/gitoxide/commit/f744a6cc8b453ea349664540af4be0566e376528)) + - Frame for extracting and generating archives ([`92c7044`](https://github.com/GitoxideLabs/gitoxide/commit/92c7044cfbc3054b237ea7c79da981bb91908812)) + - Further partition generated test directories by script name ([`e141ddb`](https://github.com/GitoxideLabs/gitoxide/commit/e141ddbdd2e0677e921856b30096733530fde569)) + - Auto-set commit.gpgsign=false when executing git ([`c23feb6`](https://github.com/GitoxideLabs/gitoxide/commit/c23feb64ad157180cfba8a11c882b829733ea8f6)) + * **[#391](https://github.com/GitoxideLabs/gitoxide/issues/391)** + - Also write a failure marker if archive creation failed ([`7f88c7f`](https://github.com/GitoxideLabs/gitoxide/commit/7f88c7f9d908df39ad4e710402783dca35eb758f)) + - Auto-clean test fixtures on re-run if they failed previously ([`3617ff4`](https://github.com/GitoxideLabs/gitoxide/commit/3617ff411224a691057eb1c39c4144b932b33f51)) + * **[#393](https://github.com/GitoxideLabs/gitoxide/issues/393)** + - Add support for disabling archive usage ([`624ad2e`](https://github.com/GitoxideLabs/gitoxide/commit/624ad2ef42172556efe942129f6f46dd627250d5)) + * **[#427](https://github.com/GitoxideLabs/gitoxide/issues/427)** + - Make fmt ([`4b320e7`](https://github.com/GitoxideLabs/gitoxide/commit/4b320e773368ac5e8c38dd8a779ef3d6d2d024ec)) + * **[#450](https://github.com/GitoxideLabs/gitoxide/issues/450)** + - Add `Env::unset()` for convenience ([`09da4c5`](https://github.com/GitoxideLabs/gitoxide/commit/09da4c5eeff5c6657beb9c53c168f90e74d6f758)) + - Upgrade `bstr` to `1.0.1` ([`99905ba`](https://github.com/GitoxideLabs/gitoxide/commit/99905bacace8aed42b16d43f0f04cae996cb971c)) + - Allow multiple scripts to run at the same time, if they are not the same. ([`cba9ede`](https://github.com/GitoxideLabs/gitoxide/commit/cba9edeb403aae4d77087de4167cbabe72525d92)) + - Make tests more robust; fix windows tests ([`1983fbc`](https://github.com/GitoxideLabs/gitoxide/commit/1983fbc39be3da5598cf3af6fb97f6ea0bc3ec6b)) + * **[#470](https://github.com/GitoxideLabs/gitoxide/issues/470)** + - Update changelogs prior to release ([`caa7a1b`](https://github.com/GitoxideLabs/gitoxide/commit/caa7a1bdef74d7d3166a7e38127a59f5ab3cfbdd)) + * **[#488](https://github.com/GitoxideLabs/gitoxide/issues/488)** + - Provide `GIT_VERSION` information along with a way to skip a test based on it. ([`2317856`](https://github.com/GitoxideLabs/gitoxide/commit/231785644194cd3be0b0dab06224a39ecf0ed714)) + * **[#509](https://github.com/GitoxideLabs/gitoxide/issues/509)** + - Some unit tests for the time when something truly unparseable shows up ([`94fc0d6`](https://github.com/GitoxideLabs/gitoxide/commit/94fc0d60d21c22a0d36f5de986cd9443755141bf)) + - Be more verbose when git version parsing fails ([`9c2f1b5`](https://github.com/GitoxideLabs/gitoxide/commit/9c2f1b5d03fbcf5dd08c2469ea17da426ea6670c)) + * **[#607](https://github.com/GitoxideLabs/gitoxide/issues/607)** + - Don't overwrite unexpanded `git-lfs` pointer files. ([`761b7d7`](https://github.com/GitoxideLabs/gitoxide/commit/761b7d71977a5aa4876010faa61ab88f0dba6eab)) + - Improve documentation to inform about the need for `git-lfs`. ([`519db50`](https://github.com/GitoxideLabs/gitoxide/commit/519db50eac6576906f266a6f0b980f88098e3f9f)) + * **[#650](https://github.com/GitoxideLabs/gitoxide/issues/650)** + - Allow execution of scripts without 'bash'. ([`15ecd84`](https://github.com/GitoxideLabs/gitoxide/commit/15ecd841cfe7c77bbdfdfa232dd51a44c4940bbc)) + - Rename `scripted_fixture_*` to not contain 'repo' in the name. ([`dbf6c8c`](https://github.com/GitoxideLabs/gitoxide/commit/dbf6c8c87cdca8169ac01aa89aefe56a33215142)) + * **[#XXX](https://github.com/GitoxideLabs/gitoxide/issues/XXX)** + - `_with_args(…)` functions now allow non-static strings ([`004dab1`](https://github.com/GitoxideLabs/gitoxide/commit/004dab17deab4c360adb5ac428f6b4951c974fe3)) * **Uncategorized** - - Release gix-testtools v0.11.0 ([`dfe2402`](https://github.com/Byron/gitoxide/commit/dfe24026f9b1d85b8ab01e69dfec6a4188091850)) - - `gix-testtools` use the latest dependencies ([`00286c9`](https://github.com/Byron/gitoxide/commit/00286c9cf63b5eba9534ef7639805545ec40eb03)) - - Merge branch 'rename-crates' into inform-about-gix-rename ([`c9275b9`](https://github.com/Byron/gitoxide/commit/c9275b99ea43949306d93775d9d78c98fb86cfb1)) - - Note that crates have been renamed from `git-*` to `gix-*`. ([`e14dc7d`](https://github.com/Byron/gitoxide/commit/e14dc7d475373d2c266e84ff8f1826c68a34ab92)) - - Rename `git-testtools` to `gix-testtools` ([`b65c33d`](https://github.com/Byron/gitoxide/commit/b65c33d256cfed65d11adeff41132e3e58754089)) - - Adjust to renaming of `git-pack` to `gix-pack` ([`1ee81ad`](https://github.com/Byron/gitoxide/commit/1ee81ad310285ee4aa118118a2be3810dbace574)) - - Adjust to renaming of `git-odb` to `gix-odb` ([`476e2ad`](https://github.com/Byron/gitoxide/commit/476e2ad1a64e9e3f0d7c8651d5bcbee36cd78241)) - - Adjust to renaming of `git-index` to `gix-index` ([`86db5e0`](https://github.com/Byron/gitoxide/commit/86db5e09fc58ce66b252dc13b8d7e2c48e4d5062)) - - Adjust to renaming of `git-diff` to `gix-diff` ([`49a163e`](https://github.com/Byron/gitoxide/commit/49a163ec8b18f0e5fcd05a315de16d5d8be7650e)) - - Adjust to renaming of `git-commitgraph` to `gix-commitgraph` ([`f1dd0a3`](https://github.com/Byron/gitoxide/commit/f1dd0a3366e31259af029da73228e8af2f414244)) - - Adjust to renaming of `git-mailmap` to `gix-mailmap` ([`2e28c56`](https://github.com/Byron/gitoxide/commit/2e28c56bb9f70de6f97439818118d3a25859698f)) - - Adjust to renaming of `git-lfs` to `gix-lfs` ([`b9225c8`](https://github.com/Byron/gitoxide/commit/b9225c830daf1388484ee7e05f727990fdeff43c)) - - Adjust to renaming of `git-chunk` to `gix-chunk` ([`59194e3`](https://github.com/Byron/gitoxide/commit/59194e3a07853eae0624ebc4907478d1de4f7599)) - - Adjust to renaming of `git-bitmap` to `gix-bitmap` ([`75f2a07`](https://github.com/Byron/gitoxide/commit/75f2a079b17489f62bc43e1f1d932307375c4f9d)) - - Adjust to renaming for `git-protocol` to `gix-protocol` ([`823795a`](https://github.com/Byron/gitoxide/commit/823795addea3810243cab7936cd8ec0137cbc224)) - - Adjust to renaming of `git-refspec` to `gix-refspec` ([`c958802`](https://github.com/Byron/gitoxide/commit/c9588020561577736faa065e7e5b5bb486ca8fe1)) - - Adjust to renaming of `git-revision` to `gix-revision` ([`ee0ee84`](https://github.com/Byron/gitoxide/commit/ee0ee84607c2ffe11ee75f27a31903db68afed02)) - - Adjust to renaming of `git-transport` to `gix-transport` ([`b2ccf71`](https://github.com/Byron/gitoxide/commit/b2ccf716dc4425bb96651d4d58806a3cc2da219e)) - - Adjust to renaming of `git-credentials` to `gix-credentials` ([`6b18abc`](https://github.com/Byron/gitoxide/commit/6b18abcf2856f02ab938d535a65e51ac282bf94a)) - - Adjust to renaming of `git-prompt` to `gix-prompt` ([`6a4654e`](https://github.com/Byron/gitoxide/commit/6a4654e0d10ab773dd219cb4b731c0fc1471c36d)) - - Adjust to renaming of `git-command` to `gix-command` ([`d26b8e0`](https://github.com/Byron/gitoxide/commit/d26b8e046496894ae06b0bbfdba77196976cd975)) - - Adjust to renaming of `git-packetline` to `gix-packetline` ([`5cbd22c`](https://github.com/Byron/gitoxide/commit/5cbd22cf42efb760058561c6c3bbcd4dab8c8be1)) - - Adjust to renaming of `git-worktree` to `gix-worktree` ([`73a1282`](https://github.com/Byron/gitoxide/commit/73a12821b3d9b66ec1714d07dd27eb7a73e3a544)) - - Adjust to renamining of `git-hashtable` to `gix-hashtable` ([`26a0c98`](https://github.com/Byron/gitoxide/commit/26a0c98d0a389b03e3dc7bfc758b37155e285244)) - - Adjust to renaming of `git-url` to `gix-url` ([`b50817a`](https://github.com/Byron/gitoxide/commit/b50817aadb143e19f61f64e19b19ec1107d980c6)) - - Adjust to renaming of `git-date` to `gix-date` ([`9a79ff2`](https://github.com/Byron/gitoxide/commit/9a79ff2d5cc74c1efad9f41e21095ae498cce00b)) - - Adjust to renaminig of `git-quote` to `gix-quote` ([`648025b`](https://github.com/Byron/gitoxide/commit/648025b7ca94411fdd0d90c53e5faede5fde6c8d)) - - Adjust to renaming of `git-config` to `gix-config` ([`3a861c8`](https://github.com/Byron/gitoxide/commit/3a861c8f049f6502d3bcbdac752659aa1aeda46a)) - - Adjust to renaming of `git-ref` to `gix-ref` ([`1f5f695`](https://github.com/Byron/gitoxide/commit/1f5f695407b034377d94b172465ff573562b3fc3)) - - Adjust to renaming of `git-lock` to `gix-lock` ([`2028e78`](https://github.com/Byron/gitoxide/commit/2028e7884ae1821edeec81612f501e88e4722b17)) - - Adjust to renaming of `git-tempfile` to `gix-tempfile` ([`b6cc3eb`](https://github.com/Byron/gitoxide/commit/b6cc3ebb5137084a6327af16a7d9364d8f092cc9)) - - Adjust to renaming of `git-object` to `gix-object` ([`fc86a1e`](https://github.com/Byron/gitoxide/commit/fc86a1e710ad7bf076c25cc6f028ddcf1a5a4311)) - - Adjust to renaming of `git-actor` to `gix-actor` ([`4dc9b44`](https://github.com/Byron/gitoxide/commit/4dc9b44dc52f2486ffa2040585c6897c1bf55df4)) - - Adjust to renaming of `git-validate` to `gix-validate` ([`5e40ad0`](https://github.com/Byron/gitoxide/commit/5e40ad078af3d08cbc2ca81ce755c0ed8a065b4f)) - - Adjust to renaming of `git-hash` to `gix-hash` ([`4a9d025`](https://github.com/Byron/gitoxide/commit/4a9d0257110c3efa61d08c8457c4545b200226d1)) - - Adjust to renaming of `git-features` to `gix-features` ([`e2dd68a`](https://github.com/Byron/gitoxide/commit/e2dd68a417aad229e194ff20dbbfd77668096ec6)) - - Adjust to renaming of `git-glob` to `gix-glob` ([`35b2a3a`](https://github.com/Byron/gitoxide/commit/35b2a3acbc8f2a03f151bc0a3863163844e0ca86)) - - Adjust to renaming of `git-sec` to `gix-sec` ([`eabbb92`](https://github.com/Byron/gitoxide/commit/eabbb923bd5a32fc80fa80f96cfdc2ab7bb2ed17)) - - Adapt to renaming of `git-path` to `gix-path` ([`d3bbcfc`](https://github.com/Byron/gitoxide/commit/d3bbcfccad80fc44ea8e7bf819f23adaca06ba2d)) - - Adjust to rename of `git-config-value` to `gix-config-value` ([`622b3e1`](https://github.com/Byron/gitoxide/commit/622b3e1d0bffa0f8db73697960f9712024fac430)) - - Merge branch 'unc-paths' ([`ff0387e`](https://github.com/Byron/gitoxide/commit/ff0387e9975e61a2d796b86f4d857c3b8528c94b)) - - `set_current_dir()` to change the CWD and reset it to previous version on drop. ([`fb68bff`](https://github.com/Byron/gitoxide/commit/fb68bffcb26582d508db946f72234bfd847a3a11)) - - Thanks clippy ([`bac57dd`](https://github.com/Byron/gitoxide/commit/bac57dd05ea2d5a4ee45ef9350fa3f2e19474bc0)) - - Remove `hex_to_id()` and add various `*_standalone()` versions of existing methods. ([`21bd607`](https://github.com/Byron/gitoxide/commit/21bd6075ca36ca49b3c85d0431ec11f68e6e9f9c)) - - Break cyclical dev dependencies ([`1fea18f`](https://github.com/Byron/gitoxide/commit/1fea18f5f8b4189a23dc4fa3f041a672f6fbcfb3)) - - Release git-date v0.4.1, git-features v0.26.1, git-glob v0.5.2, git-attributes v0.8.1, git-tempfile v3.0.1, git-ref v0.23.1, git-sec v0.6.1, git-config v0.15.1, git-prompt v0.3.1, git-url v0.13.1, git-discover v0.12.1, git-index v0.12.2, git-mailmap v0.9.1, git-pack v0.30.1, git-odb v0.40.1, git-transport v0.25.3, git-protocol v0.26.2, git-revision v0.10.1, git-refspec v0.7.1, git-worktree v0.12.1, git-repository v0.33.0 ([`5b5b380`](https://github.com/Byron/gitoxide/commit/5b5b3809faa71c658db38b40dfc410224d08a367)) - - Merge branch 'patch-1' ([`b93f0c4`](https://github.com/Byron/gitoxide/commit/b93f0c49fc677b6c19aea332cbfc1445ce475375)) - - Thanks clippy ([`b34c9fe`](https://github.com/Byron/gitoxide/commit/b34c9fe58223862712eacc1cb7353e497a4b9778)) - - Release git-date v0.4.0, git-actor v0.17.0, git-object v0.26.0, git-traverse v0.22.0, git-index v0.12.0, safety bump 15 crates ([`0e3d0a5`](https://github.com/Byron/gitoxide/commit/0e3d0a56d7e6a60c6578138f2690b4fa54a2072d)) - - Release git-features v0.26.0, git-actor v0.16.0, git-attributes v0.8.0, git-object v0.25.0, git-ref v0.22.0, git-config v0.14.0, git-command v0.2.1, git-url v0.13.0, git-credentials v0.9.0, git-diff v0.25.0, git-discover v0.11.0, git-traverse v0.21.0, git-index v0.11.0, git-mailmap v0.8.0, git-pack v0.29.0, git-odb v0.39.0, git-transport v0.25.0, git-protocol v0.26.0, git-revision v0.9.0, git-refspec v0.6.0, git-worktree v0.11.0, git-repository v0.31.0, safety bump 24 crates ([`5ac9fbe`](https://github.com/Byron/gitoxide/commit/5ac9fbe265a5b61c533a2a6b3abfed2bdf7f89ad)) - - Adapt to changes in `git-worktree` ([`5a97bb5`](https://github.com/Byron/gitoxide/commit/5a97bb5365573895500f0adeb73c482b797051c4)) - - Merge branch 'adjustments-for-cargo' ([`f8c562a`](https://github.com/Byron/gitoxide/commit/f8c562a559e6dc3377583cc7200585dad7c3d481)) - - Release git-testtools v0.10.0 ([`926ba5b`](https://github.com/Byron/gitoxide/commit/926ba5bf1a5f1b665e0791d12496b8a88bf60be5)) - - Release git-date v0.3.1, git-features v0.25.0, git-actor v0.15.0, git-glob v0.5.1, git-path v0.7.0, git-attributes v0.7.0, git-config-value v0.10.0, git-lock v3.0.1, git-validate v0.7.1, git-object v0.24.0, git-ref v0.21.0, git-sec v0.6.0, git-config v0.13.0, git-prompt v0.3.0, git-url v0.12.0, git-credentials v0.8.0, git-diff v0.24.0, git-discover v0.10.0, git-traverse v0.20.0, git-index v0.10.0, git-mailmap v0.7.0, git-pack v0.28.0, git-odb v0.38.0, git-packetline v0.14.1, git-transport v0.24.0, git-protocol v0.25.0, git-revision v0.8.0, git-refspec v0.5.0, git-worktree v0.10.0, git-repository v0.30.0, safety bump 26 crates ([`e6b9906`](https://github.com/Byron/gitoxide/commit/e6b9906c486b11057936da16ed6e0ec450a0fb83)) - - Merge branch 'main' into read-split-index ([`c57bdde`](https://github.com/Byron/gitoxide/commit/c57bdde6de37eca9672ea715962bbd02aa3eb055)) - - Merge branch 'adjustments-for-cargo' ([`083909b`](https://github.com/Byron/gitoxide/commit/083909bc7eb902eeee2002034fdb6ed88280dc5c)) - - Thanks clippy ([`f1160fb`](https://github.com/Byron/gitoxide/commit/f1160fb42acf59b37cbeda546a7079af3c9bc050)) - - Release git-hash v0.10.1, git-hashtable v0.1.0 ([`7717170`](https://github.com/Byron/gitoxide/commit/771717095d9a67b0625021eb0928828ab686e772)) - - Merge branch 'main' into http-config ([`bcd9654`](https://github.com/Byron/gitoxide/commit/bcd9654e56169799eb706646da6ee1f4ef2021a9)) - - Release git-hash v0.10.0, git-features v0.24.0, git-date v0.3.0, git-actor v0.14.0, git-glob v0.5.0, git-path v0.6.0, git-quote v0.4.0, git-attributes v0.6.0, git-config-value v0.9.0, git-tempfile v3.0.0, git-lock v3.0.0, git-validate v0.7.0, git-object v0.23.0, git-ref v0.20.0, git-sec v0.5.0, git-config v0.12.0, git-command v0.2.0, git-prompt v0.2.0, git-url v0.11.0, git-credentials v0.7.0, git-diff v0.23.0, git-discover v0.9.0, git-bitmap v0.2.0, git-traverse v0.19.0, git-index v0.9.0, git-mailmap v0.6.0, git-chunk v0.4.0, git-pack v0.27.0, git-odb v0.37.0, git-packetline v0.14.0, git-transport v0.23.0, git-protocol v0.24.0, git-revision v0.7.0, git-refspec v0.4.0, git-worktree v0.9.0, git-repository v0.29.0, git-commitgraph v0.11.0, gitoxide-core v0.21.0, gitoxide v0.19.0, safety bump 28 crates ([`b2c301e`](https://github.com/Byron/gitoxide/commit/b2c301ef131ffe1871314e19f387cf10a8d2ac16)) - - Merge branch 'git-lfs-improvements' ([`4c1685b`](https://github.com/Byron/gitoxide/commit/4c1685b971bb18117897a2c958ac2434bcb4f9e8)) - - Merge branch 'jpgrayson/main' ([`b242853`](https://github.com/Byron/gitoxide/commit/b242853abd790e5234b2f18b4aaeddb8f6f4d36f)) - - Disable tag.gpgSign in test scripts ([`1ce3190`](https://github.com/Byron/gitoxide/commit/1ce3190000f6211ce31468c7603d491bb5b90293)) - - Merge branch 'version2021' ([`0e4462d`](https://github.com/Byron/gitoxide/commit/0e4462df7a5166fe85c23a779462cdca8ee013e8)) - - Upgrade edition to 2021 in most crates. ([`3d8fa8f`](https://github.com/Byron/gitoxide/commit/3d8fa8fef9800b1576beab8a5bc39b821157a5ed)) - - Release git-glob v0.4.2, git-config-value v0.8.2, git-lock v2.2.0, git-ref v0.19.0, git-config v0.11.0, git-discover v0.8.0, git-index v0.8.0, git-transport v0.22.0, git-protocol v0.23.0, git-worktree v0.8.0, git-repository v0.28.0, gitoxide-core v0.20.0, gitoxide v0.18.0, safety bump 9 crates ([`0c253b1`](https://github.com/Byron/gitoxide/commit/0c253b15143dcedfe4c66d64ab1ea6e097030651)) - - Merge branch 'main' into http-config ([`f4ff821`](https://github.com/Byron/gitoxide/commit/f4ff821fd4233dd1dc1a449af4d4600becf3b4ac)) - - Merge branch 'async-fetch' ([`0c9c48b`](https://github.com/Byron/gitoxide/commit/0c9c48b3b91a1396eb1796f288a2cb10380d1f14)) - - Let's be very conservative regarding maximum lock times ([`ba83945`](https://github.com/Byron/gitoxide/commit/ba83945bf885fd14b841323655991554af8b33d1)) - - This should work on windows (when launching the git-daemon) ([`52f4095`](https://github.com/Byron/gitoxide/commit/52f4095812f311abeb0184bfb70b133de64a6b62)) - - Make sure we can shut-down the daemon by starting it directly ([`4924b33`](https://github.com/Byron/gitoxide/commit/4924b33b40fa874ec3cc22476680ffce3eb30c84)) - - `spawn_git_daemon()` to spawn a git daemon hosting a working directoy… ([`221f137`](https://github.com/Byron/gitoxide/commit/221f1374aa004a76693cfb1529daab930a5a9dd7)) - - Release git-features v0.23.1, git-glob v0.4.1, git-config-value v0.8.1, git-tempfile v2.0.6, git-object v0.22.1, git-ref v0.18.0, git-sec v0.4.2, git-config v0.10.0, git-prompt v0.1.1, git-url v0.10.1, git-credentials v0.6.1, git-diff v0.21.0, git-discover v0.7.0, git-index v0.7.0, git-pack v0.25.0, git-odb v0.35.0, git-transport v0.21.1, git-protocol v0.22.0, git-refspec v0.3.1, git-worktree v0.7.0, git-repository v0.26.0, git-commitgraph v0.10.0, gitoxide-core v0.19.0, gitoxide v0.17.0, safety bump 9 crates ([`d071583`](https://github.com/Byron/gitoxide/commit/d071583c5576fdf5f7717765ffed5681792aa81f)) - - Merge branch 'main' into write-sparse-index (upgrade to Rust 1.65) ([`5406630`](https://github.com/Byron/gitoxide/commit/5406630466145990b5adbdadb59151036993060d)) - - Thanks clippy ([`04cfa63`](https://github.com/Byron/gitoxide/commit/04cfa635a65ae34ad6d22391f2febd2ca7eabca9)) - - Merge branch 'main' into write-sparse-index ([`c4e6849`](https://github.com/Byron/gitoxide/commit/c4e68496c368611ebe17c6693d06c8147c28c717)) - - Merge branch 'gix-clone' ([`def53b3`](https://github.com/Byron/gitoxide/commit/def53b36c3dec26fa78939ab0584fe4ff930909c)) - - Assure the 'file' protocol is always allowed ([`7086101`](https://github.com/Byron/gitoxide/commit/7086101d3950b3e5ecb143b78185f2988cfb8fe8)) - - Release git-hash v0.9.11, git-features v0.23.0, git-actor v0.13.0, git-attributes v0.5.0, git-object v0.22.0, git-ref v0.17.0, git-sec v0.4.1, git-config v0.9.0, git-url v0.10.0, git-credentials v0.6.0, git-diff v0.20.0, git-discover v0.6.0, git-traverse v0.18.0, git-index v0.6.0, git-mailmap v0.5.0, git-pack v0.24.0, git-odb v0.34.0, git-packetline v0.13.1, git-transport v0.21.0, git-protocol v0.21.0, git-revision v0.6.0, git-refspec v0.3.0, git-worktree v0.6.0, git-repository v0.25.0, safety bump 24 crates ([`104d922`](https://github.com/Byron/gitoxide/commit/104d922add61ab21c534c24ce8ed37cddf3e275a)) - - Merge branch 'main' into new-http-impl ([`702a161`](https://github.com/Byron/gitoxide/commit/702a161ef11fc959611bf44b70e9ffe04561c7ad)) - - Merge branch 'fetch-pack' ([`3c49400`](https://github.com/Byron/gitoxide/commit/3c49400809c7c2120f4ce704c19a0421545b5acd)) - - Merge branch 'main' into fetch-pack ([`93917cb`](https://github.com/Byron/gitoxide/commit/93917cb6ecbb30daf3d20bb5a7c65e12211f084f)) - - Increase the waiting time on MacOS for file base locks ([`67777a8`](https://github.com/Byron/gitoxide/commit/67777a81f8d9d0335475e4fe4cbf770c328bd24f)) - - Merge branch 'diff' ([`25a7726`](https://github.com/Byron/gitoxide/commit/25a7726377fbe400ea3c4927d04e9dec99802b7b)) - - Release git-hash v0.9.10, git-features v0.22.5, git-date v0.2.0, git-actor v0.12.0, git-glob v0.4.0, git-path v0.5.0, git-quote v0.3.0, git-attributes v0.4.0, git-config-value v0.8.0, git-tempfile v2.0.5, git-validate v0.6.0, git-object v0.21.0, git-ref v0.16.0, git-sec v0.4.0, git-config v0.8.0, git-discover v0.5.0, git-traverse v0.17.0, git-index v0.5.0, git-worktree v0.5.0, git-testtools v0.9.0, git-command v0.1.0, git-prompt v0.1.0, git-url v0.9.0, git-credentials v0.5.0, git-diff v0.19.0, git-mailmap v0.4.0, git-chunk v0.3.2, git-pack v0.23.0, git-odb v0.33.0, git-packetline v0.13.0, git-transport v0.20.0, git-protocol v0.20.0, git-revision v0.5.0, git-refspec v0.2.0, git-repository v0.24.0, git-commitgraph v0.9.0, gitoxide-core v0.18.0, gitoxide v0.16.0, safety bump 28 crates ([`29a043b`](https://github.com/Byron/gitoxide/commit/29a043be6808a3e9199a9b26bd076fe843afe4f4)) - - Merge branch 'filter-refs' ([`fd14489`](https://github.com/Byron/gitoxide/commit/fd14489f729172d615d0fa1e8dbd605e9eacf69d)) - - Make fmt ([`535e967`](https://github.com/Byron/gitoxide/commit/535e967666c6da657ff1b7eff7c64ab27cafb182)) - - Merge branch 'filter-refs-by-spec' ([`5c05198`](https://github.com/Byron/gitoxide/commit/5c051986bd89590a9287d85d84c713d83dfab83a)) - - Merge branch 'main' into filter-refs-by-spec ([`1f6e5ab`](https://github.com/Byron/gitoxide/commit/1f6e5ab15f5fd8d23719b13e6aea59cd231ac0fe)) - - Merge branch 'fix-522' ([`5869e9f`](https://github.com/Byron/gitoxide/commit/5869e9ff2508d5a93c07635277af8764fcb57713)) - - Release git-hash v0.9.9 ([`da0716f`](https://github.com/Byron/gitoxide/commit/da0716f8c27b4f29cfff0e5ce7fcb3d7240f4aeb)) - - Merge branch 'main' into index-from-tree ([`bc64b96`](https://github.com/Byron/gitoxide/commit/bc64b96a2ec781c72d1d4daad38aa7fb8b74f99b)) - - Merge branch 'main' into filter-refs-by-spec ([`51dc828`](https://github.com/Byron/gitoxide/commit/51dc8282fb77b519ff7d2c94c6bd73af306cfe8b)) - - Release git-diff v0.18.1, git-discover v0.4.2, git-traverse v0.16.4, git-repository v0.23.1 ([`2571831`](https://github.com/Byron/gitoxide/commit/2571831e5939bf4ea6f19537b0c1ccd71dc99088)) - - Merge branch 'main' into filter-refs-by-spec ([`56ba481`](https://github.com/Byron/gitoxide/commit/56ba481f4c48f74f10397feb1b6dc3d7dd3704fb)) - - Merge branch 'joelparkerhenderson/main' ([`239cb8a`](https://github.com/Byron/gitoxide/commit/239cb8a7c25f89ad087f201982585ab4c904c77b)) - - Fix format ([`1b00ab1`](https://github.com/Byron/gitoxide/commit/1b00ab1d2a38e0ee33570714760a21cc8ca3785e)) - - Fix git_version_from_bytes to handle trailing newline ([`14e4e66`](https://github.com/Byron/gitoxide/commit/14e4e66fe064114f3d9f1dc07ce34497abf8374e)) - - Merge branch 'main' into filter-refs-by-spec ([`a36c05d`](https://github.com/Byron/gitoxide/commit/a36c05d281269f3f8b297e7adc463bfb3c306663)) - - Merge branch 'main' into filter-refs-by-spec ([`cef0b51`](https://github.com/Byron/gitoxide/commit/cef0b51ade2a3301fa09ede7a425aa1fe3527e78)) - - Release git-worktree v0.4.3, git-testtools v0.8.0 ([`b2e4bf2`](https://github.com/Byron/gitoxide/commit/b2e4bf2c11ff2c3c32efcb91837fb5677714bdf9)) - - Release git-attributes v0.3.3, git-ref v0.15.3, git-index v0.4.3, git-worktree v0.4.3, git-testtools v0.8.0 ([`baad4ce`](https://github.com/Byron/gitoxide/commit/baad4ce51fe0e8c0c1de1b08148d8303878ca37b)) - - Prepare changelogs prior to release of git-testtools ([`7668e38`](https://github.com/Byron/gitoxide/commit/7668e38fab8891ed7e73fae3a6f5a8772e0f0d0b)) - - Merge branch 'main' into filter-refs-by-spec ([`cfa1440`](https://github.com/Byron/gitoxide/commit/cfa144031dbcac2707ab0cec012bc35e78f9c475)) - - Release git-date v0.0.5, git-hash v0.9.8, git-features v0.22.2, git-actor v0.11.3, git-glob v0.3.2, git-quote v0.2.1, git-attributes v0.3.2, git-tempfile v2.0.4, git-lock v2.1.1, git-validate v0.5.5, git-object v0.20.2, git-ref v0.15.2, git-sec v0.3.1, git-config v0.7.0, git-credentials v0.4.0, git-diff v0.17.2, git-discover v0.4.1, git-bitmap v0.1.2, git-index v0.4.2, git-mailmap v0.3.2, git-chunk v0.3.1, git-traverse v0.16.2, git-pack v0.21.2, git-odb v0.31.2, git-packetline v0.12.7, git-url v0.7.2, git-transport v0.19.2, git-protocol v0.19.0, git-revision v0.4.2, git-refspec v0.1.0, git-worktree v0.4.2, git-repository v0.22.0, safety bump 4 crates ([`4974eca`](https://github.com/Byron/gitoxide/commit/4974eca96d525d1ee4f8cad79bb713af7a18bf9d)) - - Merge branch 'main' into remote-ls-refs ([`e2ee3de`](https://github.com/Byron/gitoxide/commit/e2ee3ded97e5c449933712883535b30d151c7c78)) - - Thanks clippy ([`9aa8277`](https://github.com/Byron/gitoxide/commit/9aa827785c25e63dd1b351a7cc553f140fb93c2e)) - - Merge branch 'docsrs-show-features' ([`31c2351`](https://github.com/Byron/gitoxide/commit/31c235140cad212d16a56195763fbddd971d87ce)) - - Uniformize deny attributes ([`f7f136d`](https://github.com/Byron/gitoxide/commit/f7f136dbe4f86e7dee1d54835c420ec07c96cd78)) - - Remove default link to cargo doc everywhere ([`533e887`](https://github.com/Byron/gitoxide/commit/533e887e80c5f7ede8392884562e1c5ba56fb9a8)) - - Merge branch 'main' into remote-ls-refs ([`bd5f3e8`](https://github.com/Byron/gitoxide/commit/bd5f3e8db7e0bb4abfb7b0f79f585ab82c3a14ab)) - - Release git-date v0.0.3, git-actor v0.11.1, git-attributes v0.3.1, git-tempfile v2.0.3, git-object v0.20.1, git-ref v0.15.1, git-config v0.6.1, git-diff v0.17.1, git-discover v0.4.0, git-bitmap v0.1.1, git-index v0.4.1, git-mailmap v0.3.1, git-traverse v0.16.1, git-pack v0.21.1, git-odb v0.31.1, git-packetline v0.12.6, git-url v0.7.1, git-transport v0.19.1, git-protocol v0.18.1, git-revision v0.4.0, git-worktree v0.4.1, git-repository v0.21.0, safety bump 5 crates ([`c96473d`](https://github.com/Byron/gitoxide/commit/c96473dce21c3464aacbc0a62d520c1a33172611)) - - Release git-hash v0.9.7, git-features v0.22.1 ([`232784a`](https://github.com/Byron/gitoxide/commit/232784a59ded3e8016e4257c7e146ad385cdd64a)) - - Merge branch 'main' into remote-ls-refs ([`c4bf958`](https://github.com/Byron/gitoxide/commit/c4bf9585d815bc342e5fb383336cc654280dd34f)) - - Fix CI for good ([`e0c0b8c`](https://github.com/Byron/gitoxide/commit/e0c0b8c7c1898b2bc11a915e8e4fb8426295ccbb)) - - Merge branch 'rev-parse-delegate' ([`2f506c7`](https://github.com/Byron/gitoxide/commit/2f506c7c2988477b0f97d272a9ac9ed47b236457)) - - Merge pull request #2 from SidneyDouw/main ([`ce885ad`](https://github.com/Byron/gitoxide/commit/ce885ad4c3324c09c83751c32e014f246c748766)) - - Merge branch 'Byron:main' into main ([`9b9ea02`](https://github.com/Byron/gitoxide/commit/9b9ea0275f8ff5862f24cf5a4ca53bb1cd610709)) - - Merge branch 'main' into rev-parse-delegate ([`6da8250`](https://github.com/Byron/gitoxide/commit/6da82507588d3bc849217c11d9a1d398b67f2ed6)) - - Add docs related to archives. ([`f409a2a`](https://github.com/Byron/gitoxide/commit/f409a2ae88f2b0d80c7d160563c07935993203a6)) - - Add documentation to test-tools. ([`074b283`](https://github.com/Byron/gitoxide/commit/074b2833d15c8483bd89e4bde4486c0c7df14637)) - - Merge branch 'main' into pathspec ([`7b61506`](https://github.com/Byron/gitoxide/commit/7b615060712565f515515e35a3e8346278ad770c)) - - Make fmt ([`47724c0`](https://github.com/Byron/gitoxide/commit/47724c0edb382c036a3fc99884becfd2b0740d4b)) - - Release git-hash v0.9.6, git-features v0.22.0, git-date v0.0.2, git-actor v0.11.0, git-glob v0.3.1, git-path v0.4.0, git-attributes v0.3.0, git-tempfile v2.0.2, git-object v0.20.0, git-ref v0.15.0, git-sec v0.3.0, git-config v0.6.0, git-credentials v0.3.0, git-diff v0.17.0, git-discover v0.3.0, git-index v0.4.0, git-mailmap v0.3.0, git-traverse v0.16.0, git-pack v0.21.0, git-odb v0.31.0, git-url v0.7.0, git-transport v0.19.0, git-protocol v0.18.0, git-revision v0.3.0, git-worktree v0.4.0, git-repository v0.20.0, git-commitgraph v0.8.0, gitoxide-core v0.15.0, gitoxide v0.13.0, safety bump 22 crates ([`4737b1e`](https://github.com/Byron/gitoxide/commit/4737b1eea1d4c9a8d5a69fb63ecac5aa5d378ae5)) - - Merge branch 'config-cascade' ([`f144eaf`](https://github.com/Byron/gitoxide/commit/f144eaf5863ae5cac63103f0db51c35fcf03a948)) - - Thanks clippy ([`49f5a54`](https://github.com/Byron/gitoxide/commit/49f5a5415c119267ea37e20fb198df80f621cbde)) - - Merge pull request #1 from Byron/main ([`085e76b`](https://github.com/Byron/gitoxide/commit/085e76b121291ed9bd324139105d2bd4117bedf8)) - - Merge branch 'main' into pathspec ([`89ea12b`](https://github.com/Byron/gitoxide/commit/89ea12b558bcc056b892193ee8fb44b8664b5da4)) - - Merge branch 'main' into cont_include_if ([`41ea8ba`](https://github.com/Byron/gitoxide/commit/41ea8ba78e74f5c988148367386a1f4f304cb951)) - - Release git-path v0.3.0, safety bump 14 crates ([`400c9be`](https://github.com/Byron/gitoxide/commit/400c9bec49e4ec5351dc9357b246e7677a63ea35)) - - Release git-date v0.0.1, git-hash v0.9.5, git-features v0.21.1, git-actor v0.10.1, git-path v0.2.0, git-attributes v0.2.0, git-ref v0.14.0, git-sec v0.2.0, git-config v0.5.0, git-credentials v0.2.0, git-discover v0.2.0, git-pack v0.20.0, git-odb v0.30.0, git-url v0.6.0, git-transport v0.18.0, git-protocol v0.17.0, git-revision v0.2.1, git-worktree v0.3.0, git-repository v0.19.0, safety bump 13 crates ([`a417177`](https://github.com/Byron/gitoxide/commit/a41717712578f590f04a33d27adaa63171f25267)) - - Release git-sec v0.1.2, git-discover v0.1.3, cargo-smart-release v0.10.2 ([`6cd365e`](https://github.com/Byron/gitoxide/commit/6cd365e2cf6851f5cdecc22f3b1667440ad011b0)) - - Merge branch 'main' into SidneyDouw-pathspec ([`a22b1d8`](https://github.com/Byron/gitoxide/commit/a22b1d88a21311d44509018729c3ef1936cf052a)) - - Release git-path v0.1.3, git-discover v0.1.2, git-repository v0.18.1, cargo-smart-release v0.10.1 ([`b7399cc`](https://github.com/Byron/gitoxide/commit/b7399cc44ee419355a649a7b0ba7b352cd48b400)) - - Release git-path v0.1.2, git-sec v0.1.1, git-config v0.4.0, git-discover v0.1.1, git-pack v0.19.1, git-repository v0.18.0, cargo-smart-release v0.10.0, safety bump 2 crates ([`ceb6dff`](https://github.com/Byron/gitoxide/commit/ceb6dff13362a2b4318a551893217c1d11643b9f)) - - Merge branch 'main' into git_includeif ([`598c853`](https://github.com/Byron/gitoxide/commit/598c853087fcf8f77299aa5b9803bcec705c0cd0)) - - Release git-hash v0.9.4, git-features v0.21.0, git-actor v0.10.0, git-glob v0.3.0, git-path v0.1.1, git-attributes v0.1.0, git-sec v0.1.0, git-config v0.3.0, git-credentials v0.1.0, git-validate v0.5.4, git-object v0.19.0, git-diff v0.16.0, git-lock v2.1.0, git-ref v0.13.0, git-discover v0.1.0, git-index v0.3.0, git-mailmap v0.2.0, git-traverse v0.15.0, git-pack v0.19.0, git-odb v0.29.0, git-packetline v0.12.5, git-url v0.5.0, git-transport v0.17.0, git-protocol v0.16.0, git-revision v0.2.0, git-worktree v0.2.0, git-repository v0.17.0, safety bump 20 crates ([`654cf39`](https://github.com/Byron/gitoxide/commit/654cf39c92d5aa4c8d542a6cadf13d4acef6a78e)) - - Make fmt ([`e043807`](https://github.com/Byron/gitoxide/commit/e043807abf364ca46d00760e2f281528efe20c75)) - - Merge branch 'refs-and-worktrees' ([`8131227`](https://github.com/Byron/gitoxide/commit/8131227ddff6f36919b6a0f7b33792ebde0f8ae9)) - - Thanks clippy ([`60cf67c`](https://github.com/Byron/gitoxide/commit/60cf67cb081b91932d9943b9c525cac2c0cf0782)) - - Merge branch 'main' into git_includeif ([`b1bfc8f`](https://github.com/Byron/gitoxide/commit/b1bfc8fe8efb6d8941f54dddd0fcad99aa13ed6c)) - - Merge branch 'basic-worktree-support' ([`e058bda`](https://github.com/Byron/gitoxide/commit/e058bdabf8449b6a6fdff851e3929137d9b71568)) - - Merge branch 'main' into git_includeif ([`05eb340`](https://github.com/Byron/gitoxide/commit/05eb34023933918c51c03cf2afd774db89cc5a33)) - - Merge branch 'main' into msrv-for-windows ([`7cb1972`](https://github.com/Byron/gitoxide/commit/7cb19729133325bdfacedf44cdc0500cbcf36684)) - - Make fmt ([`251b6df`](https://github.com/Byron/gitoxide/commit/251b6df5dbdda24b7bdc452085f808f3acef69d8)) - - Merge branch 'worktree-stack' ([`98da8ba`](https://github.com/Byron/gitoxide/commit/98da8ba52cef8ec27f705fcbc84773e5bacc4e10)) - - Set the time to wait for lock to longest expected runtime of fixture scripts ([`eea3988`](https://github.com/Byron/gitoxide/commit/eea3988462a61e8a64d646a15d062d13fdbfb615)) - - More robust archive creation on windows ([`e7b2d8f`](https://github.com/Byron/gitoxide/commit/e7b2d8f446b41b26b518abf7d1b048605ef2bbe8)) - - Merge branch 'main' into repo-status ([`0eb2372`](https://github.com/Byron/gitoxide/commit/0eb23721dca78f6e6bf864c5c3a3e44df8b419f0)) - - Merge branch 'test-archive-support' ([`350df01`](https://github.com/Byron/gitoxide/commit/350df01042d6ca8b93f8737fa101e69b50535a0f)) - - Thanks clippy ([`658862e`](https://github.com/Byron/gitoxide/commit/658862eeb042073632f5a3f203e264a47151d454)) - - Thanks clippy ([`c8d218c`](https://github.com/Byron/gitoxide/commit/c8d218c6399f52fb1a57eca22005196d1c686774)) - - Release git-testtools v0.6.0 ([`45386a0`](https://github.com/Byron/gitoxide/commit/45386a0b135656681dbdf8c47ad888b50e68f151)) - - Release git-hash v0.9.3, git-features v0.20.0, git-config v0.2.0, safety bump 12 crates ([`f0cbb24`](https://github.com/Byron/gitoxide/commit/f0cbb24b2e3d8f028be0e773f9da530da2656257)) - - Thanks clippy ([`1038dab`](https://github.com/Byron/gitoxide/commit/1038dab842b32ec1359a53236b241a91427ccb65)) - - Add `fixture_bytes` to test tools ([`85e3820`](https://github.com/Byron/gitoxide/commit/85e3820caa106a32c3406fd1e9e4c67fb0033bc5)) - - Commit to using 'unicode' feature of bstr as git-object wants it too ([`471fa62`](https://github.com/Byron/gitoxide/commit/471fa62b142ba744541d7472464d62826f5c6b93)) - - Release git-hash v0.9.2, git-object v0.17.1, git-pack v0.16.1 ([`0db19b8`](https://github.com/Byron/gitoxide/commit/0db19b8deaf11a4d4cbc03fa3ae40eea104bc302)) - - Release git-hash v0.9.1, git-features v0.19.1, git-actor v0.8.0, git-config v0.1.10, git-object v0.17.0, git-diff v0.13.0, git-tempfile v1.0.4, git-chunk v0.3.0, git-traverse v0.12.0, git-pack v0.16.0, git-odb v0.26.0, git-packetline v0.12.3, git-url v0.3.5, git-transport v0.15.0, git-protocol v0.14.0, git-ref v0.11.0, git-repository v0.14.0, cargo-smart-release v0.8.0, safety bump 4 crates ([`373cbc8`](https://github.com/Byron/gitoxide/commit/373cbc877f7ad60dac682e57c52a7b90f108ebe3)) - - Release git-bitmap v0.0.1, git-hash v0.9.0, git-features v0.19.0, git-index v0.1.0, safety bump 9 crates ([`4624725`](https://github.com/Byron/gitoxide/commit/4624725f54a34dd6b35d3632fb3516965922f60a)) - - Ensure tests use 'merge.ff false' and recreate fixtures on each run ([`1d5ab44`](https://github.com/Byron/gitoxide/commit/1d5ab44145ccbc2064ee8cc7acebb62db82c45aa)) - - Release git-hash v0.8.0, git-features v0.17.0, git-actor v0.6.0, git-object v0.15.0, git-diff v0.11.0, git-traverse v0.10.0, git-pack v0.13.0, git-odb v0.23.0, git-packetline v0.12.0, git-transport v0.13.0, git-protocol v0.12.0, git-ref v0.9.0, git-repository v0.11.0, git-commitgraph v0.6.0, gitoxide-core v0.12.0, gitoxide v0.10.0, cargo-smart-release v0.5.0, safety bump 16 crates ([`0e02953`](https://github.com/Byron/gitoxide/commit/0e029537a7f6242d02ccf7e63d8d92f5246e6c5e)) - - Adjusting changelogs prior to release of git-hash v0.7.0, git-features v0.16.5, git-actor v0.5.3, git-validate v0.5.3, git-object v0.14.1, git-diff v0.10.0, git-tempfile v1.0.3, git-lock v1.0.1, git-traverse v0.9.0, git-pack v0.12.0, git-odb v0.22.0, git-packetline v0.11.0, git-url v0.3.4, git-transport v0.12.0, git-protocol v0.11.0, git-ref v0.8.0, git-repository v0.10.0, cargo-smart-release v0.4.0, safety bump 3 crates ([`a474395`](https://github.com/Byron/gitoxide/commit/a47439590e36b1cb8b516b6053fd5cbfc42efed7)) - - Merge branch 'changelog-generation' ([`bf0106e`](https://github.com/Byron/gitoxide/commit/bf0106ea21734d4e59d190b424c22743c22da966)) - - Merge branch 'repository-integration' ([`49f5453`](https://github.com/Byron/gitoxide/commit/49f5453629646ac24d752f53c532e5f67eb09374)) - - Bump git-hash v0.6.0 ([`6efd90d`](https://github.com/Byron/gitoxide/commit/6efd90db54f7f7441b76159dba3be80c15657a3d)) - - Merge branch 'Byron:main' into main ([`dc58eca`](https://github.com/Byron/gitoxide/commit/dc58eca510e5a067acdeaad4b595a34b4598a0cd)) - - Release git-testtools v0.5.0 ([`86e0a92`](https://github.com/Byron/gitoxide/commit/86e0a92c7dc3b69a766aeac1b675b148d61a7ec5)) - - Upgrade to nom-7 ([`f0aa3e1`](https://github.com/Byron/gitoxide/commit/f0aa3e1b5b407b2afd187c9cb622676fcddaf706)) - - Apply nightly rustfmt rules. ([`5e0edba`](https://github.com/Byron/gitoxide/commit/5e0edbadb39673d4de640f112fa306349fb11814)) - - (cargo-release) version 0.4.0 ([`70ef344`](https://github.com/Byron/gitoxide/commit/70ef3442775b54ba9e4ee9ebfffb37af9804cc5b)) - - (cargo-release) version 0.5.0 ([`ae02dab`](https://github.com/Byron/gitoxide/commit/ae02dabae961089a92a21e6a60a7006de4b56dad)) - - [pack] refactor ([`9ee1e22`](https://github.com/Byron/gitoxide/commit/9ee1e22fa5c5d97ff626f0dfc44706272433bfef)) - - [ref] packed refs header line parsing ([`fde5543`](https://github.com/Byron/gitoxide/commit/fde5543ad22395e27266db02a5442a33d16e68c5)) - - [tools] fix create writable fixture ([`bf7783d`](https://github.com/Byron/gitoxide/commit/bf7783dd9ccc9ac433b978b9dded0d38f7351494)) - - [ref] on the way towards realistic transactions… ([`c808cb1`](https://github.com/Byron/gitoxide/commit/c808cb17b2fea12e018fabb789862e9b7703e49b)) - - [ref] on the way to setup the first transaction test ([`29c0b51`](https://github.com/Byron/gitoxide/commit/29c0b51625e2c7e3a8d60075bb925126a024dc83)) - - Bump once_cell from 1.7.2 to 1.8.0 ([`bd323d9`](https://github.com/Byron/gitoxide/commit/bd323d911b6becf8b379343c6ef56ec46e28fa28)) - - (cargo-release) version 0.3.0 ([`6b33678`](https://github.com/Byron/gitoxide/commit/6b33678f83e6d261ca15c4a7634ff5b4e66d81dd)) - - Merge branch 'dependabot/cargo/crc-2.0.0' ([`683c44d`](https://github.com/Byron/gitoxide/commit/683c44db682d8dbef401286963e84cdca145abc8)) - - (cargo-release) version 0.2.0 ([`3286e42`](https://github.com/Byron/gitoxide/commit/3286e42547b59df6365087cbae9ce1c9c959faad)) - - Manually fix crc in tooling ([`48fa9bc`](https://github.com/Byron/gitoxide/commit/48fa9bc80876a0186f43add6c6d3477385241f5e)) - - Bump crc from 1.8.1 to 2.0.0 ([`07f08ac`](https://github.com/Byron/gitoxide/commit/07f08ac1ea04ec278993ad1a5fc1d4f243bf8eb7)) - - (cargo-release) version 0.4.0 ([`866f86f`](https://github.com/Byron/gitoxide/commit/866f86f59e66652968dcafc1a57912f9849cb21d)) - - [git-ref] the first failing test ([`7e802a0`](https://github.com/Byron/gitoxide/commit/7e802a0576230dfc666c253d484ea255f265f92f)) - - Prepare test utilities for release… ([`d35e654`](https://github.com/Byron/gitoxide/commit/d35e654747f96cec93bdecd1314ce325129cbc44)) - - [tree-diff] Beginning of more nested test-suite… ([`b8a90e7`](https://github.com/Byron/gitoxide/commit/b8a90e7c9347b0eefdbef6f4c724cc0561cd79c9)) - - Fix debug assert, thanks gitpython ([`fe954b9`](https://github.com/Byron/gitoxide/commit/fe954b9f6d26bd8629f24a01bd2a06f9800deed0)) - - Revert "FAIL: try to disable GPG signing with environment variables…" ([`e326352`](https://github.com/Byron/gitoxide/commit/e326352eec7bd1aae13f770328979e5730ffc32b)) - - Try to disable GPG signing with environment variables… ([`29bf8ca`](https://github.com/Byron/gitoxide/commit/29bf8ca8399b6d4941aa242b9f08c74e59a179bb)) - - Thanks, cargo audit ([`4f293f5`](https://github.com/Byron/gitoxide/commit/4f293f5036c44a69ccacf102d35202adad83bbe0)) - - Thanks clippy ([`002792a`](https://github.com/Byron/gitoxide/commit/002792a8bc2512c92c16fd28662c26c9b3a12572)) - - Set environment in testtools to freeze repositories generation scripts ([`eaad3ab`](https://github.com/Byron/gitoxide/commit/eaad3ab69338115439a553ba1062160dc3a08082)) - - Faster repeated tests if fixtures don't change ([`792277f`](https://github.com/Byron/gitoxide/commit/792277f241446086dd6c9b78f688363d4e66e5a7)) - - Allow the use of shared test utilities across crates ([`b117626`](https://github.com/Byron/gitoxide/commit/b117626df6da714c24d2b7914301678e89d2d0cb)) - - The first test with the new and nice and cheap journey test tool ([`d3c99e1`](https://github.com/Byron/gitoxide/commit/d3c99e1cf3125ab107e12718b39ac9b7c9a9165c)) + - Release gix-testtools v0.11.0 ([`dfe2402`](https://github.com/GitoxideLabs/gitoxide/commit/dfe24026f9b1d85b8ab01e69dfec6a4188091850)) + - `gix-testtools` use the latest dependencies ([`00286c9`](https://github.com/GitoxideLabs/gitoxide/commit/00286c9cf63b5eba9534ef7639805545ec40eb03)) + - Merge branch 'rename-crates' into inform-about-gix-rename ([`c9275b9`](https://github.com/GitoxideLabs/gitoxide/commit/c9275b99ea43949306d93775d9d78c98fb86cfb1)) + - Note that crates have been renamed from `git-*` to `gix-*`. ([`e14dc7d`](https://github.com/GitoxideLabs/gitoxide/commit/e14dc7d475373d2c266e84ff8f1826c68a34ab92)) + - Rename `git-testtools` to `gix-testtools` ([`b65c33d`](https://github.com/GitoxideLabs/gitoxide/commit/b65c33d256cfed65d11adeff41132e3e58754089)) + - Adjust to renaming of `git-pack` to `gix-pack` ([`1ee81ad`](https://github.com/GitoxideLabs/gitoxide/commit/1ee81ad310285ee4aa118118a2be3810dbace574)) + - Adjust to renaming of `git-odb` to `gix-odb` ([`476e2ad`](https://github.com/GitoxideLabs/gitoxide/commit/476e2ad1a64e9e3f0d7c8651d5bcbee36cd78241)) + - Adjust to renaming of `git-index` to `gix-index` ([`86db5e0`](https://github.com/GitoxideLabs/gitoxide/commit/86db5e09fc58ce66b252dc13b8d7e2c48e4d5062)) + - Adjust to renaming of `git-diff` to `gix-diff` ([`49a163e`](https://github.com/GitoxideLabs/gitoxide/commit/49a163ec8b18f0e5fcd05a315de16d5d8be7650e)) + - Adjust to renaming of `git-commitgraph` to `gix-commitgraph` ([`f1dd0a3`](https://github.com/GitoxideLabs/gitoxide/commit/f1dd0a3366e31259af029da73228e8af2f414244)) + - Adjust to renaming of `git-mailmap` to `gix-mailmap` ([`2e28c56`](https://github.com/GitoxideLabs/gitoxide/commit/2e28c56bb9f70de6f97439818118d3a25859698f)) + - Adjust to renaming of `git-lfs` to `gix-lfs` ([`b9225c8`](https://github.com/GitoxideLabs/gitoxide/commit/b9225c830daf1388484ee7e05f727990fdeff43c)) + - Adjust to renaming of `git-chunk` to `gix-chunk` ([`59194e3`](https://github.com/GitoxideLabs/gitoxide/commit/59194e3a07853eae0624ebc4907478d1de4f7599)) + - Adjust to renaming of `git-bitmap` to `gix-bitmap` ([`75f2a07`](https://github.com/GitoxideLabs/gitoxide/commit/75f2a079b17489f62bc43e1f1d932307375c4f9d)) + - Adjust to renaming for `git-protocol` to `gix-protocol` ([`823795a`](https://github.com/GitoxideLabs/gitoxide/commit/823795addea3810243cab7936cd8ec0137cbc224)) + - Adjust to renaming of `git-refspec` to `gix-refspec` ([`c958802`](https://github.com/GitoxideLabs/gitoxide/commit/c9588020561577736faa065e7e5b5bb486ca8fe1)) + - Adjust to renaming of `git-revision` to `gix-revision` ([`ee0ee84`](https://github.com/GitoxideLabs/gitoxide/commit/ee0ee84607c2ffe11ee75f27a31903db68afed02)) + - Adjust to renaming of `git-transport` to `gix-transport` ([`b2ccf71`](https://github.com/GitoxideLabs/gitoxide/commit/b2ccf716dc4425bb96651d4d58806a3cc2da219e)) + - Adjust to renaming of `git-credentials` to `gix-credentials` ([`6b18abc`](https://github.com/GitoxideLabs/gitoxide/commit/6b18abcf2856f02ab938d535a65e51ac282bf94a)) + - Adjust to renaming of `git-prompt` to `gix-prompt` ([`6a4654e`](https://github.com/GitoxideLabs/gitoxide/commit/6a4654e0d10ab773dd219cb4b731c0fc1471c36d)) + - Adjust to renaming of `git-command` to `gix-command` ([`d26b8e0`](https://github.com/GitoxideLabs/gitoxide/commit/d26b8e046496894ae06b0bbfdba77196976cd975)) + - Adjust to renaming of `git-packetline` to `gix-packetline` ([`5cbd22c`](https://github.com/GitoxideLabs/gitoxide/commit/5cbd22cf42efb760058561c6c3bbcd4dab8c8be1)) + - Adjust to renaming of `git-worktree` to `gix-worktree` ([`73a1282`](https://github.com/GitoxideLabs/gitoxide/commit/73a12821b3d9b66ec1714d07dd27eb7a73e3a544)) + - Adjust to renamining of `git-hashtable` to `gix-hashtable` ([`26a0c98`](https://github.com/GitoxideLabs/gitoxide/commit/26a0c98d0a389b03e3dc7bfc758b37155e285244)) + - Adjust to renaming of `git-url` to `gix-url` ([`b50817a`](https://github.com/GitoxideLabs/gitoxide/commit/b50817aadb143e19f61f64e19b19ec1107d980c6)) + - Adjust to renaming of `git-date` to `gix-date` ([`9a79ff2`](https://github.com/GitoxideLabs/gitoxide/commit/9a79ff2d5cc74c1efad9f41e21095ae498cce00b)) + - Adjust to renaminig of `git-quote` to `gix-quote` ([`648025b`](https://github.com/GitoxideLabs/gitoxide/commit/648025b7ca94411fdd0d90c53e5faede5fde6c8d)) + - Adjust to renaming of `git-config` to `gix-config` ([`3a861c8`](https://github.com/GitoxideLabs/gitoxide/commit/3a861c8f049f6502d3bcbdac752659aa1aeda46a)) + - Adjust to renaming of `git-ref` to `gix-ref` ([`1f5f695`](https://github.com/GitoxideLabs/gitoxide/commit/1f5f695407b034377d94b172465ff573562b3fc3)) + - Adjust to renaming of `git-lock` to `gix-lock` ([`2028e78`](https://github.com/GitoxideLabs/gitoxide/commit/2028e7884ae1821edeec81612f501e88e4722b17)) + - Adjust to renaming of `git-tempfile` to `gix-tempfile` ([`b6cc3eb`](https://github.com/GitoxideLabs/gitoxide/commit/b6cc3ebb5137084a6327af16a7d9364d8f092cc9)) + - Adjust to renaming of `git-object` to `gix-object` ([`fc86a1e`](https://github.com/GitoxideLabs/gitoxide/commit/fc86a1e710ad7bf076c25cc6f028ddcf1a5a4311)) + - Adjust to renaming of `git-actor` to `gix-actor` ([`4dc9b44`](https://github.com/GitoxideLabs/gitoxide/commit/4dc9b44dc52f2486ffa2040585c6897c1bf55df4)) + - Adjust to renaming of `git-validate` to `gix-validate` ([`5e40ad0`](https://github.com/GitoxideLabs/gitoxide/commit/5e40ad078af3d08cbc2ca81ce755c0ed8a065b4f)) + - Adjust to renaming of `git-hash` to `gix-hash` ([`4a9d025`](https://github.com/GitoxideLabs/gitoxide/commit/4a9d0257110c3efa61d08c8457c4545b200226d1)) + - Adjust to renaming of `git-features` to `gix-features` ([`e2dd68a`](https://github.com/GitoxideLabs/gitoxide/commit/e2dd68a417aad229e194ff20dbbfd77668096ec6)) + - Adjust to renaming of `git-glob` to `gix-glob` ([`35b2a3a`](https://github.com/GitoxideLabs/gitoxide/commit/35b2a3acbc8f2a03f151bc0a3863163844e0ca86)) + - Adjust to renaming of `git-sec` to `gix-sec` ([`eabbb92`](https://github.com/GitoxideLabs/gitoxide/commit/eabbb923bd5a32fc80fa80f96cfdc2ab7bb2ed17)) + - Adapt to renaming of `git-path` to `gix-path` ([`d3bbcfc`](https://github.com/GitoxideLabs/gitoxide/commit/d3bbcfccad80fc44ea8e7bf819f23adaca06ba2d)) + - Adjust to rename of `git-config-value` to `gix-config-value` ([`622b3e1`](https://github.com/GitoxideLabs/gitoxide/commit/622b3e1d0bffa0f8db73697960f9712024fac430)) + - Merge branch 'unc-paths' ([`ff0387e`](https://github.com/GitoxideLabs/gitoxide/commit/ff0387e9975e61a2d796b86f4d857c3b8528c94b)) + - `set_current_dir()` to change the CWD and reset it to previous version on drop. ([`fb68bff`](https://github.com/GitoxideLabs/gitoxide/commit/fb68bffcb26582d508db946f72234bfd847a3a11)) + - Thanks clippy ([`bac57dd`](https://github.com/GitoxideLabs/gitoxide/commit/bac57dd05ea2d5a4ee45ef9350fa3f2e19474bc0)) + - Remove `hex_to_id()` and add various `*_standalone()` versions of existing methods. ([`21bd607`](https://github.com/GitoxideLabs/gitoxide/commit/21bd6075ca36ca49b3c85d0431ec11f68e6e9f9c)) + - Break cyclical dev dependencies ([`1fea18f`](https://github.com/GitoxideLabs/gitoxide/commit/1fea18f5f8b4189a23dc4fa3f041a672f6fbcfb3)) + - Release git-date v0.4.1, git-features v0.26.1, git-glob v0.5.2, git-attributes v0.8.1, git-tempfile v3.0.1, git-ref v0.23.1, git-sec v0.6.1, git-config v0.15.1, git-prompt v0.3.1, git-url v0.13.1, git-discover v0.12.1, git-index v0.12.2, git-mailmap v0.9.1, git-pack v0.30.1, git-odb v0.40.1, git-transport v0.25.3, git-protocol v0.26.2, git-revision v0.10.1, git-refspec v0.7.1, git-worktree v0.12.1, git-repository v0.33.0 ([`5b5b380`](https://github.com/GitoxideLabs/gitoxide/commit/5b5b3809faa71c658db38b40dfc410224d08a367)) + - Merge branch 'patch-1' ([`b93f0c4`](https://github.com/GitoxideLabs/gitoxide/commit/b93f0c49fc677b6c19aea332cbfc1445ce475375)) + - Thanks clippy ([`b34c9fe`](https://github.com/GitoxideLabs/gitoxide/commit/b34c9fe58223862712eacc1cb7353e497a4b9778)) + - Release git-date v0.4.0, git-actor v0.17.0, git-object v0.26.0, git-traverse v0.22.0, git-index v0.12.0, safety bump 15 crates ([`0e3d0a5`](https://github.com/GitoxideLabs/gitoxide/commit/0e3d0a56d7e6a60c6578138f2690b4fa54a2072d)) + - Release git-features v0.26.0, git-actor v0.16.0, git-attributes v0.8.0, git-object v0.25.0, git-ref v0.22.0, git-config v0.14.0, git-command v0.2.1, git-url v0.13.0, git-credentials v0.9.0, git-diff v0.25.0, git-discover v0.11.0, git-traverse v0.21.0, git-index v0.11.0, git-mailmap v0.8.0, git-pack v0.29.0, git-odb v0.39.0, git-transport v0.25.0, git-protocol v0.26.0, git-revision v0.9.0, git-refspec v0.6.0, git-worktree v0.11.0, git-repository v0.31.0, safety bump 24 crates ([`5ac9fbe`](https://github.com/GitoxideLabs/gitoxide/commit/5ac9fbe265a5b61c533a2a6b3abfed2bdf7f89ad)) + - Adapt to changes in `git-worktree` ([`5a97bb5`](https://github.com/GitoxideLabs/gitoxide/commit/5a97bb5365573895500f0adeb73c482b797051c4)) + - Merge branch 'adjustments-for-cargo' ([`f8c562a`](https://github.com/GitoxideLabs/gitoxide/commit/f8c562a559e6dc3377583cc7200585dad7c3d481)) + - Release git-testtools v0.10.0 ([`926ba5b`](https://github.com/GitoxideLabs/gitoxide/commit/926ba5bf1a5f1b665e0791d12496b8a88bf60be5)) + - Release git-date v0.3.1, git-features v0.25.0, git-actor v0.15.0, git-glob v0.5.1, git-path v0.7.0, git-attributes v0.7.0, git-config-value v0.10.0, git-lock v3.0.1, git-validate v0.7.1, git-object v0.24.0, git-ref v0.21.0, git-sec v0.6.0, git-config v0.13.0, git-prompt v0.3.0, git-url v0.12.0, git-credentials v0.8.0, git-diff v0.24.0, git-discover v0.10.0, git-traverse v0.20.0, git-index v0.10.0, git-mailmap v0.7.0, git-pack v0.28.0, git-odb v0.38.0, git-packetline v0.14.1, git-transport v0.24.0, git-protocol v0.25.0, git-revision v0.8.0, git-refspec v0.5.0, git-worktree v0.10.0, git-repository v0.30.0, safety bump 26 crates ([`e6b9906`](https://github.com/GitoxideLabs/gitoxide/commit/e6b9906c486b11057936da16ed6e0ec450a0fb83)) + - Merge branch 'main' into read-split-index ([`c57bdde`](https://github.com/GitoxideLabs/gitoxide/commit/c57bdde6de37eca9672ea715962bbd02aa3eb055)) + - Merge branch 'adjustments-for-cargo' ([`083909b`](https://github.com/GitoxideLabs/gitoxide/commit/083909bc7eb902eeee2002034fdb6ed88280dc5c)) + - Thanks clippy ([`f1160fb`](https://github.com/GitoxideLabs/gitoxide/commit/f1160fb42acf59b37cbeda546a7079af3c9bc050)) + - Release git-hash v0.10.1, git-hashtable v0.1.0 ([`7717170`](https://github.com/GitoxideLabs/gitoxide/commit/771717095d9a67b0625021eb0928828ab686e772)) + - Merge branch 'main' into http-config ([`bcd9654`](https://github.com/GitoxideLabs/gitoxide/commit/bcd9654e56169799eb706646da6ee1f4ef2021a9)) + - Release git-hash v0.10.0, git-features v0.24.0, git-date v0.3.0, git-actor v0.14.0, git-glob v0.5.0, git-path v0.6.0, git-quote v0.4.0, git-attributes v0.6.0, git-config-value v0.9.0, git-tempfile v3.0.0, git-lock v3.0.0, git-validate v0.7.0, git-object v0.23.0, git-ref v0.20.0, git-sec v0.5.0, git-config v0.12.0, git-command v0.2.0, git-prompt v0.2.0, git-url v0.11.0, git-credentials v0.7.0, git-diff v0.23.0, git-discover v0.9.0, git-bitmap v0.2.0, git-traverse v0.19.0, git-index v0.9.0, git-mailmap v0.6.0, git-chunk v0.4.0, git-pack v0.27.0, git-odb v0.37.0, git-packetline v0.14.0, git-transport v0.23.0, git-protocol v0.24.0, git-revision v0.7.0, git-refspec v0.4.0, git-worktree v0.9.0, git-repository v0.29.0, git-commitgraph v0.11.0, gitoxide-core v0.21.0, gitoxide v0.19.0, safety bump 28 crates ([`b2c301e`](https://github.com/GitoxideLabs/gitoxide/commit/b2c301ef131ffe1871314e19f387cf10a8d2ac16)) + - Merge branch 'git-lfs-improvements' ([`4c1685b`](https://github.com/GitoxideLabs/gitoxide/commit/4c1685b971bb18117897a2c958ac2434bcb4f9e8)) + - Merge branch 'jpgrayson/main' ([`b242853`](https://github.com/GitoxideLabs/gitoxide/commit/b242853abd790e5234b2f18b4aaeddb8f6f4d36f)) + - Disable tag.gpgSign in test scripts ([`1ce3190`](https://github.com/GitoxideLabs/gitoxide/commit/1ce3190000f6211ce31468c7603d491bb5b90293)) + - Merge branch 'version2021' ([`0e4462d`](https://github.com/GitoxideLabs/gitoxide/commit/0e4462df7a5166fe85c23a779462cdca8ee013e8)) + - Upgrade edition to 2021 in most crates. ([`3d8fa8f`](https://github.com/GitoxideLabs/gitoxide/commit/3d8fa8fef9800b1576beab8a5bc39b821157a5ed)) + - Release git-glob v0.4.2, git-config-value v0.8.2, git-lock v2.2.0, git-ref v0.19.0, git-config v0.11.0, git-discover v0.8.0, git-index v0.8.0, git-transport v0.22.0, git-protocol v0.23.0, git-worktree v0.8.0, git-repository v0.28.0, gitoxide-core v0.20.0, gitoxide v0.18.0, safety bump 9 crates ([`0c253b1`](https://github.com/GitoxideLabs/gitoxide/commit/0c253b15143dcedfe4c66d64ab1ea6e097030651)) + - Merge branch 'main' into http-config ([`f4ff821`](https://github.com/GitoxideLabs/gitoxide/commit/f4ff821fd4233dd1dc1a449af4d4600becf3b4ac)) + - Merge branch 'async-fetch' ([`0c9c48b`](https://github.com/GitoxideLabs/gitoxide/commit/0c9c48b3b91a1396eb1796f288a2cb10380d1f14)) + - Let's be very conservative regarding maximum lock times ([`ba83945`](https://github.com/GitoxideLabs/gitoxide/commit/ba83945bf885fd14b841323655991554af8b33d1)) + - This should work on windows (when launching the git-daemon) ([`52f4095`](https://github.com/GitoxideLabs/gitoxide/commit/52f4095812f311abeb0184bfb70b133de64a6b62)) + - Make sure we can shut-down the daemon by starting it directly ([`4924b33`](https://github.com/GitoxideLabs/gitoxide/commit/4924b33b40fa874ec3cc22476680ffce3eb30c84)) + - `spawn_git_daemon()` to spawn a git daemon hosting a working directoy… ([`221f137`](https://github.com/GitoxideLabs/gitoxide/commit/221f1374aa004a76693cfb1529daab930a5a9dd7)) + - Release git-features v0.23.1, git-glob v0.4.1, git-config-value v0.8.1, git-tempfile v2.0.6, git-object v0.22.1, git-ref v0.18.0, git-sec v0.4.2, git-config v0.10.0, git-prompt v0.1.1, git-url v0.10.1, git-credentials v0.6.1, git-diff v0.21.0, git-discover v0.7.0, git-index v0.7.0, git-pack v0.25.0, git-odb v0.35.0, git-transport v0.21.1, git-protocol v0.22.0, git-refspec v0.3.1, git-worktree v0.7.0, git-repository v0.26.0, git-commitgraph v0.10.0, gitoxide-core v0.19.0, gitoxide v0.17.0, safety bump 9 crates ([`d071583`](https://github.com/GitoxideLabs/gitoxide/commit/d071583c5576fdf5f7717765ffed5681792aa81f)) + - Merge branch 'main' into write-sparse-index (upgrade to Rust 1.65) ([`5406630`](https://github.com/GitoxideLabs/gitoxide/commit/5406630466145990b5adbdadb59151036993060d)) + - Thanks clippy ([`04cfa63`](https://github.com/GitoxideLabs/gitoxide/commit/04cfa635a65ae34ad6d22391f2febd2ca7eabca9)) + - Merge branch 'main' into write-sparse-index ([`c4e6849`](https://github.com/GitoxideLabs/gitoxide/commit/c4e68496c368611ebe17c6693d06c8147c28c717)) + - Merge branch 'gix-clone' ([`def53b3`](https://github.com/GitoxideLabs/gitoxide/commit/def53b36c3dec26fa78939ab0584fe4ff930909c)) + - Assure the 'file' protocol is always allowed ([`7086101`](https://github.com/GitoxideLabs/gitoxide/commit/7086101d3950b3e5ecb143b78185f2988cfb8fe8)) + - Release git-hash v0.9.11, git-features v0.23.0, git-actor v0.13.0, git-attributes v0.5.0, git-object v0.22.0, git-ref v0.17.0, git-sec v0.4.1, git-config v0.9.0, git-url v0.10.0, git-credentials v0.6.0, git-diff v0.20.0, git-discover v0.6.0, git-traverse v0.18.0, git-index v0.6.0, git-mailmap v0.5.0, git-pack v0.24.0, git-odb v0.34.0, git-packetline v0.13.1, git-transport v0.21.0, git-protocol v0.21.0, git-revision v0.6.0, git-refspec v0.3.0, git-worktree v0.6.0, git-repository v0.25.0, safety bump 24 crates ([`104d922`](https://github.com/GitoxideLabs/gitoxide/commit/104d922add61ab21c534c24ce8ed37cddf3e275a)) + - Merge branch 'main' into new-http-impl ([`702a161`](https://github.com/GitoxideLabs/gitoxide/commit/702a161ef11fc959611bf44b70e9ffe04561c7ad)) + - Merge branch 'fetch-pack' ([`3c49400`](https://github.com/GitoxideLabs/gitoxide/commit/3c49400809c7c2120f4ce704c19a0421545b5acd)) + - Merge branch 'main' into fetch-pack ([`93917cb`](https://github.com/GitoxideLabs/gitoxide/commit/93917cb6ecbb30daf3d20bb5a7c65e12211f084f)) + - Increase the waiting time on MacOS for file base locks ([`67777a8`](https://github.com/GitoxideLabs/gitoxide/commit/67777a81f8d9d0335475e4fe4cbf770c328bd24f)) + - Merge branch 'diff' ([`25a7726`](https://github.com/GitoxideLabs/gitoxide/commit/25a7726377fbe400ea3c4927d04e9dec99802b7b)) + - Release git-hash v0.9.10, git-features v0.22.5, git-date v0.2.0, git-actor v0.12.0, git-glob v0.4.0, git-path v0.5.0, git-quote v0.3.0, git-attributes v0.4.0, git-config-value v0.8.0, git-tempfile v2.0.5, git-validate v0.6.0, git-object v0.21.0, git-ref v0.16.0, git-sec v0.4.0, git-config v0.8.0, git-discover v0.5.0, git-traverse v0.17.0, git-index v0.5.0, git-worktree v0.5.0, git-testtools v0.9.0, git-command v0.1.0, git-prompt v0.1.0, git-url v0.9.0, git-credentials v0.5.0, git-diff v0.19.0, git-mailmap v0.4.0, git-chunk v0.3.2, git-pack v0.23.0, git-odb v0.33.0, git-packetline v0.13.0, git-transport v0.20.0, git-protocol v0.20.0, git-revision v0.5.0, git-refspec v0.2.0, git-repository v0.24.0, git-commitgraph v0.9.0, gitoxide-core v0.18.0, gitoxide v0.16.0, safety bump 28 crates ([`29a043b`](https://github.com/GitoxideLabs/gitoxide/commit/29a043be6808a3e9199a9b26bd076fe843afe4f4)) + - Merge branch 'filter-refs' ([`fd14489`](https://github.com/GitoxideLabs/gitoxide/commit/fd14489f729172d615d0fa1e8dbd605e9eacf69d)) + - Make fmt ([`535e967`](https://github.com/GitoxideLabs/gitoxide/commit/535e967666c6da657ff1b7eff7c64ab27cafb182)) + - Merge branch 'filter-refs-by-spec' ([`5c05198`](https://github.com/GitoxideLabs/gitoxide/commit/5c051986bd89590a9287d85d84c713d83dfab83a)) + - Merge branch 'main' into filter-refs-by-spec ([`1f6e5ab`](https://github.com/GitoxideLabs/gitoxide/commit/1f6e5ab15f5fd8d23719b13e6aea59cd231ac0fe)) + - Merge branch 'fix-522' ([`5869e9f`](https://github.com/GitoxideLabs/gitoxide/commit/5869e9ff2508d5a93c07635277af8764fcb57713)) + - Release git-hash v0.9.9 ([`da0716f`](https://github.com/GitoxideLabs/gitoxide/commit/da0716f8c27b4f29cfff0e5ce7fcb3d7240f4aeb)) + - Merge branch 'main' into index-from-tree ([`bc64b96`](https://github.com/GitoxideLabs/gitoxide/commit/bc64b96a2ec781c72d1d4daad38aa7fb8b74f99b)) + - Merge branch 'main' into filter-refs-by-spec ([`51dc828`](https://github.com/GitoxideLabs/gitoxide/commit/51dc8282fb77b519ff7d2c94c6bd73af306cfe8b)) + - Release git-diff v0.18.1, git-discover v0.4.2, git-traverse v0.16.4, git-repository v0.23.1 ([`2571831`](https://github.com/GitoxideLabs/gitoxide/commit/2571831e5939bf4ea6f19537b0c1ccd71dc99088)) + - Merge branch 'main' into filter-refs-by-spec ([`56ba481`](https://github.com/GitoxideLabs/gitoxide/commit/56ba481f4c48f74f10397feb1b6dc3d7dd3704fb)) + - Merge branch 'joelparkerhenderson/main' ([`239cb8a`](https://github.com/GitoxideLabs/gitoxide/commit/239cb8a7c25f89ad087f201982585ab4c904c77b)) + - Fix format ([`1b00ab1`](https://github.com/GitoxideLabs/gitoxide/commit/1b00ab1d2a38e0ee33570714760a21cc8ca3785e)) + - Fix git_version_from_bytes to handle trailing newline ([`14e4e66`](https://github.com/GitoxideLabs/gitoxide/commit/14e4e66fe064114f3d9f1dc07ce34497abf8374e)) + - Merge branch 'main' into filter-refs-by-spec ([`a36c05d`](https://github.com/GitoxideLabs/gitoxide/commit/a36c05d281269f3f8b297e7adc463bfb3c306663)) + - Merge branch 'main' into filter-refs-by-spec ([`cef0b51`](https://github.com/GitoxideLabs/gitoxide/commit/cef0b51ade2a3301fa09ede7a425aa1fe3527e78)) + - Release git-worktree v0.4.3, git-testtools v0.8.0 ([`b2e4bf2`](https://github.com/GitoxideLabs/gitoxide/commit/b2e4bf2c11ff2c3c32efcb91837fb5677714bdf9)) + - Release git-attributes v0.3.3, git-ref v0.15.3, git-index v0.4.3, git-worktree v0.4.3, git-testtools v0.8.0 ([`baad4ce`](https://github.com/GitoxideLabs/gitoxide/commit/baad4ce51fe0e8c0c1de1b08148d8303878ca37b)) + - Prepare changelogs prior to release of git-testtools ([`7668e38`](https://github.com/GitoxideLabs/gitoxide/commit/7668e38fab8891ed7e73fae3a6f5a8772e0f0d0b)) + - Merge branch 'main' into filter-refs-by-spec ([`cfa1440`](https://github.com/GitoxideLabs/gitoxide/commit/cfa144031dbcac2707ab0cec012bc35e78f9c475)) + - Release git-date v0.0.5, git-hash v0.9.8, git-features v0.22.2, git-actor v0.11.3, git-glob v0.3.2, git-quote v0.2.1, git-attributes v0.3.2, git-tempfile v2.0.4, git-lock v2.1.1, git-validate v0.5.5, git-object v0.20.2, git-ref v0.15.2, git-sec v0.3.1, git-config v0.7.0, git-credentials v0.4.0, git-diff v0.17.2, git-discover v0.4.1, git-bitmap v0.1.2, git-index v0.4.2, git-mailmap v0.3.2, git-chunk v0.3.1, git-traverse v0.16.2, git-pack v0.21.2, git-odb v0.31.2, git-packetline v0.12.7, git-url v0.7.2, git-transport v0.19.2, git-protocol v0.19.0, git-revision v0.4.2, git-refspec v0.1.0, git-worktree v0.4.2, git-repository v0.22.0, safety bump 4 crates ([`4974eca`](https://github.com/GitoxideLabs/gitoxide/commit/4974eca96d525d1ee4f8cad79bb713af7a18bf9d)) + - Merge branch 'main' into remote-ls-refs ([`e2ee3de`](https://github.com/GitoxideLabs/gitoxide/commit/e2ee3ded97e5c449933712883535b30d151c7c78)) + - Thanks clippy ([`9aa8277`](https://github.com/GitoxideLabs/gitoxide/commit/9aa827785c25e63dd1b351a7cc553f140fb93c2e)) + - Merge branch 'docsrs-show-features' ([`31c2351`](https://github.com/GitoxideLabs/gitoxide/commit/31c235140cad212d16a56195763fbddd971d87ce)) + - Uniformize deny attributes ([`f7f136d`](https://github.com/GitoxideLabs/gitoxide/commit/f7f136dbe4f86e7dee1d54835c420ec07c96cd78)) + - Remove default link to cargo doc everywhere ([`533e887`](https://github.com/GitoxideLabs/gitoxide/commit/533e887e80c5f7ede8392884562e1c5ba56fb9a8)) + - Merge branch 'main' into remote-ls-refs ([`bd5f3e8`](https://github.com/GitoxideLabs/gitoxide/commit/bd5f3e8db7e0bb4abfb7b0f79f585ab82c3a14ab)) + - Release git-date v0.0.3, git-actor v0.11.1, git-attributes v0.3.1, git-tempfile v2.0.3, git-object v0.20.1, git-ref v0.15.1, git-config v0.6.1, git-diff v0.17.1, git-discover v0.4.0, git-bitmap v0.1.1, git-index v0.4.1, git-mailmap v0.3.1, git-traverse v0.16.1, git-pack v0.21.1, git-odb v0.31.1, git-packetline v0.12.6, git-url v0.7.1, git-transport v0.19.1, git-protocol v0.18.1, git-revision v0.4.0, git-worktree v0.4.1, git-repository v0.21.0, safety bump 5 crates ([`c96473d`](https://github.com/GitoxideLabs/gitoxide/commit/c96473dce21c3464aacbc0a62d520c1a33172611)) + - Release git-hash v0.9.7, git-features v0.22.1 ([`232784a`](https://github.com/GitoxideLabs/gitoxide/commit/232784a59ded3e8016e4257c7e146ad385cdd64a)) + - Merge branch 'main' into remote-ls-refs ([`c4bf958`](https://github.com/GitoxideLabs/gitoxide/commit/c4bf9585d815bc342e5fb383336cc654280dd34f)) + - Fix CI for good ([`e0c0b8c`](https://github.com/GitoxideLabs/gitoxide/commit/e0c0b8c7c1898b2bc11a915e8e4fb8426295ccbb)) + - Merge branch 'rev-parse-delegate' ([`2f506c7`](https://github.com/GitoxideLabs/gitoxide/commit/2f506c7c2988477b0f97d272a9ac9ed47b236457)) + - Merge pull request #2 from SidneyDouw/main ([`ce885ad`](https://github.com/GitoxideLabs/gitoxide/commit/ce885ad4c3324c09c83751c32e014f246c748766)) + - Merge branch 'Byron:main' into main ([`9b9ea02`](https://github.com/GitoxideLabs/gitoxide/commit/9b9ea0275f8ff5862f24cf5a4ca53bb1cd610709)) + - Merge branch 'main' into rev-parse-delegate ([`6da8250`](https://github.com/GitoxideLabs/gitoxide/commit/6da82507588d3bc849217c11d9a1d398b67f2ed6)) + - Add docs related to archives. ([`f409a2a`](https://github.com/GitoxideLabs/gitoxide/commit/f409a2ae88f2b0d80c7d160563c07935993203a6)) + - Add documentation to test-tools. ([`074b283`](https://github.com/GitoxideLabs/gitoxide/commit/074b2833d15c8483bd89e4bde4486c0c7df14637)) + - Merge branch 'main' into pathspec ([`7b61506`](https://github.com/GitoxideLabs/gitoxide/commit/7b615060712565f515515e35a3e8346278ad770c)) + - Make fmt ([`47724c0`](https://github.com/GitoxideLabs/gitoxide/commit/47724c0edb382c036a3fc99884becfd2b0740d4b)) + - Release git-hash v0.9.6, git-features v0.22.0, git-date v0.0.2, git-actor v0.11.0, git-glob v0.3.1, git-path v0.4.0, git-attributes v0.3.0, git-tempfile v2.0.2, git-object v0.20.0, git-ref v0.15.0, git-sec v0.3.0, git-config v0.6.0, git-credentials v0.3.0, git-diff v0.17.0, git-discover v0.3.0, git-index v0.4.0, git-mailmap v0.3.0, git-traverse v0.16.0, git-pack v0.21.0, git-odb v0.31.0, git-url v0.7.0, git-transport v0.19.0, git-protocol v0.18.0, git-revision v0.3.0, git-worktree v0.4.0, git-repository v0.20.0, git-commitgraph v0.8.0, gitoxide-core v0.15.0, gitoxide v0.13.0, safety bump 22 crates ([`4737b1e`](https://github.com/GitoxideLabs/gitoxide/commit/4737b1eea1d4c9a8d5a69fb63ecac5aa5d378ae5)) + - Merge branch 'config-cascade' ([`f144eaf`](https://github.com/GitoxideLabs/gitoxide/commit/f144eaf5863ae5cac63103f0db51c35fcf03a948)) + - Thanks clippy ([`49f5a54`](https://github.com/GitoxideLabs/gitoxide/commit/49f5a5415c119267ea37e20fb198df80f621cbde)) + - Merge pull request #1 from Byron/main ([`085e76b`](https://github.com/GitoxideLabs/gitoxide/commit/085e76b121291ed9bd324139105d2bd4117bedf8)) + - Merge branch 'main' into pathspec ([`89ea12b`](https://github.com/GitoxideLabs/gitoxide/commit/89ea12b558bcc056b892193ee8fb44b8664b5da4)) + - Merge branch 'main' into cont_include_if ([`41ea8ba`](https://github.com/GitoxideLabs/gitoxide/commit/41ea8ba78e74f5c988148367386a1f4f304cb951)) + - Release git-path v0.3.0, safety bump 14 crates ([`400c9be`](https://github.com/GitoxideLabs/gitoxide/commit/400c9bec49e4ec5351dc9357b246e7677a63ea35)) + - Release git-date v0.0.1, git-hash v0.9.5, git-features v0.21.1, git-actor v0.10.1, git-path v0.2.0, git-attributes v0.2.0, git-ref v0.14.0, git-sec v0.2.0, git-config v0.5.0, git-credentials v0.2.0, git-discover v0.2.0, git-pack v0.20.0, git-odb v0.30.0, git-url v0.6.0, git-transport v0.18.0, git-protocol v0.17.0, git-revision v0.2.1, git-worktree v0.3.0, git-repository v0.19.0, safety bump 13 crates ([`a417177`](https://github.com/GitoxideLabs/gitoxide/commit/a41717712578f590f04a33d27adaa63171f25267)) + - Release git-sec v0.1.2, git-discover v0.1.3, cargo-smart-release v0.10.2 ([`6cd365e`](https://github.com/GitoxideLabs/gitoxide/commit/6cd365e2cf6851f5cdecc22f3b1667440ad011b0)) + - Merge branch 'main' into SidneyDouw-pathspec ([`a22b1d8`](https://github.com/GitoxideLabs/gitoxide/commit/a22b1d88a21311d44509018729c3ef1936cf052a)) + - Release git-path v0.1.3, git-discover v0.1.2, git-repository v0.18.1, cargo-smart-release v0.10.1 ([`b7399cc`](https://github.com/GitoxideLabs/gitoxide/commit/b7399cc44ee419355a649a7b0ba7b352cd48b400)) + - Release git-path v0.1.2, git-sec v0.1.1, git-config v0.4.0, git-discover v0.1.1, git-pack v0.19.1, git-repository v0.18.0, cargo-smart-release v0.10.0, safety bump 2 crates ([`ceb6dff`](https://github.com/GitoxideLabs/gitoxide/commit/ceb6dff13362a2b4318a551893217c1d11643b9f)) + - Merge branch 'main' into git_includeif ([`598c853`](https://github.com/GitoxideLabs/gitoxide/commit/598c853087fcf8f77299aa5b9803bcec705c0cd0)) + - Release git-hash v0.9.4, git-features v0.21.0, git-actor v0.10.0, git-glob v0.3.0, git-path v0.1.1, git-attributes v0.1.0, git-sec v0.1.0, git-config v0.3.0, git-credentials v0.1.0, git-validate v0.5.4, git-object v0.19.0, git-diff v0.16.0, git-lock v2.1.0, git-ref v0.13.0, git-discover v0.1.0, git-index v0.3.0, git-mailmap v0.2.0, git-traverse v0.15.0, git-pack v0.19.0, git-odb v0.29.0, git-packetline v0.12.5, git-url v0.5.0, git-transport v0.17.0, git-protocol v0.16.0, git-revision v0.2.0, git-worktree v0.2.0, git-repository v0.17.0, safety bump 20 crates ([`654cf39`](https://github.com/GitoxideLabs/gitoxide/commit/654cf39c92d5aa4c8d542a6cadf13d4acef6a78e)) + - Make fmt ([`e043807`](https://github.com/GitoxideLabs/gitoxide/commit/e043807abf364ca46d00760e2f281528efe20c75)) + - Merge branch 'refs-and-worktrees' ([`8131227`](https://github.com/GitoxideLabs/gitoxide/commit/8131227ddff6f36919b6a0f7b33792ebde0f8ae9)) + - Thanks clippy ([`60cf67c`](https://github.com/GitoxideLabs/gitoxide/commit/60cf67cb081b91932d9943b9c525cac2c0cf0782)) + - Merge branch 'main' into git_includeif ([`b1bfc8f`](https://github.com/GitoxideLabs/gitoxide/commit/b1bfc8fe8efb6d8941f54dddd0fcad99aa13ed6c)) + - Merge branch 'basic-worktree-support' ([`e058bda`](https://github.com/GitoxideLabs/gitoxide/commit/e058bdabf8449b6a6fdff851e3929137d9b71568)) + - Merge branch 'main' into git_includeif ([`05eb340`](https://github.com/GitoxideLabs/gitoxide/commit/05eb34023933918c51c03cf2afd774db89cc5a33)) + - Merge branch 'main' into msrv-for-windows ([`7cb1972`](https://github.com/GitoxideLabs/gitoxide/commit/7cb19729133325bdfacedf44cdc0500cbcf36684)) + - Make fmt ([`251b6df`](https://github.com/GitoxideLabs/gitoxide/commit/251b6df5dbdda24b7bdc452085f808f3acef69d8)) + - Merge branch 'worktree-stack' ([`98da8ba`](https://github.com/GitoxideLabs/gitoxide/commit/98da8ba52cef8ec27f705fcbc84773e5bacc4e10)) + - Set the time to wait for lock to longest expected runtime of fixture scripts ([`eea3988`](https://github.com/GitoxideLabs/gitoxide/commit/eea3988462a61e8a64d646a15d062d13fdbfb615)) + - More robust archive creation on windows ([`e7b2d8f`](https://github.com/GitoxideLabs/gitoxide/commit/e7b2d8f446b41b26b518abf7d1b048605ef2bbe8)) + - Merge branch 'main' into repo-status ([`0eb2372`](https://github.com/GitoxideLabs/gitoxide/commit/0eb23721dca78f6e6bf864c5c3a3e44df8b419f0)) + - Merge branch 'test-archive-support' ([`350df01`](https://github.com/GitoxideLabs/gitoxide/commit/350df01042d6ca8b93f8737fa101e69b50535a0f)) + - Thanks clippy ([`658862e`](https://github.com/GitoxideLabs/gitoxide/commit/658862eeb042073632f5a3f203e264a47151d454)) + - Thanks clippy ([`c8d218c`](https://github.com/GitoxideLabs/gitoxide/commit/c8d218c6399f52fb1a57eca22005196d1c686774)) + - Release git-testtools v0.6.0 ([`45386a0`](https://github.com/GitoxideLabs/gitoxide/commit/45386a0b135656681dbdf8c47ad888b50e68f151)) + - Release git-hash v0.9.3, git-features v0.20.0, git-config v0.2.0, safety bump 12 crates ([`f0cbb24`](https://github.com/GitoxideLabs/gitoxide/commit/f0cbb24b2e3d8f028be0e773f9da530da2656257)) + - Thanks clippy ([`1038dab`](https://github.com/GitoxideLabs/gitoxide/commit/1038dab842b32ec1359a53236b241a91427ccb65)) + - Add `fixture_bytes` to test tools ([`85e3820`](https://github.com/GitoxideLabs/gitoxide/commit/85e3820caa106a32c3406fd1e9e4c67fb0033bc5)) + - Commit to using 'unicode' feature of bstr as git-object wants it too ([`471fa62`](https://github.com/GitoxideLabs/gitoxide/commit/471fa62b142ba744541d7472464d62826f5c6b93)) + - Release git-hash v0.9.2, git-object v0.17.1, git-pack v0.16.1 ([`0db19b8`](https://github.com/GitoxideLabs/gitoxide/commit/0db19b8deaf11a4d4cbc03fa3ae40eea104bc302)) + - Release git-hash v0.9.1, git-features v0.19.1, git-actor v0.8.0, git-config v0.1.10, git-object v0.17.0, git-diff v0.13.0, git-tempfile v1.0.4, git-chunk v0.3.0, git-traverse v0.12.0, git-pack v0.16.0, git-odb v0.26.0, git-packetline v0.12.3, git-url v0.3.5, git-transport v0.15.0, git-protocol v0.14.0, git-ref v0.11.0, git-repository v0.14.0, cargo-smart-release v0.8.0, safety bump 4 crates ([`373cbc8`](https://github.com/GitoxideLabs/gitoxide/commit/373cbc877f7ad60dac682e57c52a7b90f108ebe3)) + - Release git-bitmap v0.0.1, git-hash v0.9.0, git-features v0.19.0, git-index v0.1.0, safety bump 9 crates ([`4624725`](https://github.com/GitoxideLabs/gitoxide/commit/4624725f54a34dd6b35d3632fb3516965922f60a)) + - Ensure tests use 'merge.ff false' and recreate fixtures on each run ([`1d5ab44`](https://github.com/GitoxideLabs/gitoxide/commit/1d5ab44145ccbc2064ee8cc7acebb62db82c45aa)) + - Release git-hash v0.8.0, git-features v0.17.0, git-actor v0.6.0, git-object v0.15.0, git-diff v0.11.0, git-traverse v0.10.0, git-pack v0.13.0, git-odb v0.23.0, git-packetline v0.12.0, git-transport v0.13.0, git-protocol v0.12.0, git-ref v0.9.0, git-repository v0.11.0, git-commitgraph v0.6.0, gitoxide-core v0.12.0, gitoxide v0.10.0, cargo-smart-release v0.5.0, safety bump 16 crates ([`0e02953`](https://github.com/GitoxideLabs/gitoxide/commit/0e029537a7f6242d02ccf7e63d8d92f5246e6c5e)) + - Adjusting changelogs prior to release of git-hash v0.7.0, git-features v0.16.5, git-actor v0.5.3, git-validate v0.5.3, git-object v0.14.1, git-diff v0.10.0, git-tempfile v1.0.3, git-lock v1.0.1, git-traverse v0.9.0, git-pack v0.12.0, git-odb v0.22.0, git-packetline v0.11.0, git-url v0.3.4, git-transport v0.12.0, git-protocol v0.11.0, git-ref v0.8.0, git-repository v0.10.0, cargo-smart-release v0.4.0, safety bump 3 crates ([`a474395`](https://github.com/GitoxideLabs/gitoxide/commit/a47439590e36b1cb8b516b6053fd5cbfc42efed7)) + - Merge branch 'changelog-generation' ([`bf0106e`](https://github.com/GitoxideLabs/gitoxide/commit/bf0106ea21734d4e59d190b424c22743c22da966)) + - Merge branch 'repository-integration' ([`49f5453`](https://github.com/GitoxideLabs/gitoxide/commit/49f5453629646ac24d752f53c532e5f67eb09374)) + - Bump git-hash v0.6.0 ([`6efd90d`](https://github.com/GitoxideLabs/gitoxide/commit/6efd90db54f7f7441b76159dba3be80c15657a3d)) + - Merge branch 'Byron:main' into main ([`dc58eca`](https://github.com/GitoxideLabs/gitoxide/commit/dc58eca510e5a067acdeaad4b595a34b4598a0cd)) + - Release git-testtools v0.5.0 ([`86e0a92`](https://github.com/GitoxideLabs/gitoxide/commit/86e0a92c7dc3b69a766aeac1b675b148d61a7ec5)) + - Upgrade to nom-7 ([`f0aa3e1`](https://github.com/GitoxideLabs/gitoxide/commit/f0aa3e1b5b407b2afd187c9cb622676fcddaf706)) + - Apply nightly rustfmt rules. ([`5e0edba`](https://github.com/GitoxideLabs/gitoxide/commit/5e0edbadb39673d4de640f112fa306349fb11814)) + - (cargo-release) version 0.4.0 ([`70ef344`](https://github.com/GitoxideLabs/gitoxide/commit/70ef3442775b54ba9e4ee9ebfffb37af9804cc5b)) + - (cargo-release) version 0.5.0 ([`ae02dab`](https://github.com/GitoxideLabs/gitoxide/commit/ae02dabae961089a92a21e6a60a7006de4b56dad)) + - [pack] refactor ([`9ee1e22`](https://github.com/GitoxideLabs/gitoxide/commit/9ee1e22fa5c5d97ff626f0dfc44706272433bfef)) + - [ref] packed refs header line parsing ([`fde5543`](https://github.com/GitoxideLabs/gitoxide/commit/fde5543ad22395e27266db02a5442a33d16e68c5)) + - [tools] fix create writable fixture ([`bf7783d`](https://github.com/GitoxideLabs/gitoxide/commit/bf7783dd9ccc9ac433b978b9dded0d38f7351494)) + - [ref] on the way towards realistic transactions… ([`c808cb1`](https://github.com/GitoxideLabs/gitoxide/commit/c808cb17b2fea12e018fabb789862e9b7703e49b)) + - [ref] on the way to setup the first transaction test ([`29c0b51`](https://github.com/GitoxideLabs/gitoxide/commit/29c0b51625e2c7e3a8d60075bb925126a024dc83)) + - Bump once_cell from 1.7.2 to 1.8.0 ([`bd323d9`](https://github.com/GitoxideLabs/gitoxide/commit/bd323d911b6becf8b379343c6ef56ec46e28fa28)) + - (cargo-release) version 0.3.0 ([`6b33678`](https://github.com/GitoxideLabs/gitoxide/commit/6b33678f83e6d261ca15c4a7634ff5b4e66d81dd)) + - Merge branch 'dependabot/cargo/crc-2.0.0' ([`683c44d`](https://github.com/GitoxideLabs/gitoxide/commit/683c44db682d8dbef401286963e84cdca145abc8)) + - (cargo-release) version 0.2.0 ([`3286e42`](https://github.com/GitoxideLabs/gitoxide/commit/3286e42547b59df6365087cbae9ce1c9c959faad)) + - Manually fix crc in tooling ([`48fa9bc`](https://github.com/GitoxideLabs/gitoxide/commit/48fa9bc80876a0186f43add6c6d3477385241f5e)) + - Bump crc from 1.8.1 to 2.0.0 ([`07f08ac`](https://github.com/GitoxideLabs/gitoxide/commit/07f08ac1ea04ec278993ad1a5fc1d4f243bf8eb7)) + - (cargo-release) version 0.4.0 ([`866f86f`](https://github.com/GitoxideLabs/gitoxide/commit/866f86f59e66652968dcafc1a57912f9849cb21d)) + - [git-ref] the first failing test ([`7e802a0`](https://github.com/GitoxideLabs/gitoxide/commit/7e802a0576230dfc666c253d484ea255f265f92f)) + - Prepare test utilities for release… ([`d35e654`](https://github.com/GitoxideLabs/gitoxide/commit/d35e654747f96cec93bdecd1314ce325129cbc44)) + - [tree-diff] Beginning of more nested test-suite… ([`b8a90e7`](https://github.com/GitoxideLabs/gitoxide/commit/b8a90e7c9347b0eefdbef6f4c724cc0561cd79c9)) + - Fix debug assert, thanks gitpython ([`fe954b9`](https://github.com/GitoxideLabs/gitoxide/commit/fe954b9f6d26bd8629f24a01bd2a06f9800deed0)) + - Revert "FAIL: try to disable GPG signing with environment variables…" ([`e326352`](https://github.com/GitoxideLabs/gitoxide/commit/e326352eec7bd1aae13f770328979e5730ffc32b)) + - Try to disable GPG signing with environment variables… ([`29bf8ca`](https://github.com/GitoxideLabs/gitoxide/commit/29bf8ca8399b6d4941aa242b9f08c74e59a179bb)) + - Thanks, cargo audit ([`4f293f5`](https://github.com/GitoxideLabs/gitoxide/commit/4f293f5036c44a69ccacf102d35202adad83bbe0)) + - Thanks clippy ([`002792a`](https://github.com/GitoxideLabs/gitoxide/commit/002792a8bc2512c92c16fd28662c26c9b3a12572)) + - Set environment in testtools to freeze repositories generation scripts ([`eaad3ab`](https://github.com/GitoxideLabs/gitoxide/commit/eaad3ab69338115439a553ba1062160dc3a08082)) + - Faster repeated tests if fixtures don't change ([`792277f`](https://github.com/GitoxideLabs/gitoxide/commit/792277f241446086dd6c9b78f688363d4e66e5a7)) + - Allow the use of shared test utilities across crates ([`b117626`](https://github.com/GitoxideLabs/gitoxide/commit/b117626df6da714c24d2b7914301678e89d2d0cb)) + - The first test with the new and nice and cheap journey test tool ([`d3c99e1`](https://github.com/GitoxideLabs/gitoxide/commit/d3c99e1cf3125ab107e12718b39ac9b7c9a9165c))
## 0.10.0 (2022-12-28) From 9b12d5007ca3ec98d061b6d2b94c7cdda4fcd3e4 Mon Sep 17 00:00:00 2001 From: Sebastian Thiel Date: Sun, 27 Apr 2025 10:20:08 +0200 Subject: [PATCH 003/166] fix: unify the dependency graph by choosing the right versions, upgrading to `gix-features 0.42` This is what should silence audit failures. --- Cargo.lock | 565 ++++++++++++++++------------------------- tests/tools/Cargo.toml | 10 +- tests/tools/src/lib.rs | 3 +- 3 files changed, 222 insertions(+), 356 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 5061f0ec45e..bbf92b69cd8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1081,15 +1081,6 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7360491ce676a36bf9bb3c56c1aa791658183a54d2744120f27285738d90465a" -[[package]] -name = "faster-hex" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2a2b11eda1d40935b26cf18f6833c526845ae8c41e58d09af6adeb6f0269183" -dependencies = [ - "serde", -] - [[package]] name = "faster-hex" version = "0.10.0" @@ -1451,14 +1442,17 @@ dependencies = [ [[package]] name = "gix-actor" -version = "0.34.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f438c87d4028aca4b82f82ba8d8ab1569823cfb3e5bc5fa8456a71678b2a20e7" +version = "0.35.1" dependencies = [ "bstr", - "gix-date 0.9.4", - "gix-utils 0.2.0", + "document-features", + "gix-date 0.10.1", + "gix-hash 0.18.0", + "gix-testtools", + "gix-utils 0.3.0", "itoa", + "pretty_assertions", + "serde", "thiserror 2.0.12", "winnow", ] @@ -1466,16 +1460,13 @@ dependencies = [ [[package]] name = "gix-actor" version = "0.35.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b300e6e4f31f3f6bd2de5e2b0caab192ced00dc0fcd0f7cc56e28c575c8e1ff" dependencies = [ "bstr", - "document-features", - "gix-date 0.10.1", - "gix-hash 0.18.0", - "gix-testtools", - "gix-utils 0.3.0", + "gix-date 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)", + "gix-utils 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "itoa", - "pretty_assertions", - "serde", "thiserror 2.0.12", "winnow", ] @@ -1505,16 +1496,18 @@ dependencies = [ [[package]] name = "gix-attributes" -version = "0.25.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4e25825e0430aa11096f8b65ced6780d4a96a133f81904edceebb5344c8dd7f" +version = "0.26.0" dependencies = [ "bstr", - "gix-glob 0.19.0", - "gix-path 0.10.17 (registry+https://github.com/rust-lang/crates.io-index)", - "gix-quote 0.5.0", - "gix-trace 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "document-features", + "gix-fs 0.15.0", + "gix-glob 0.20.0", + "gix-path 0.10.17", + "gix-quote 0.6.0", + "gix-testtools", + "gix-trace 0.1.12", "kstring", + "serde", "smallvec", "thiserror 2.0.12", "unicode-bom", @@ -1523,17 +1516,15 @@ dependencies = [ [[package]] name = "gix-attributes" version = "0.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7e26b3ac280ddb25bb6980d34f4a82ee326f78bf2c6d4ea45eef2d940048b8e" dependencies = [ "bstr", - "document-features", - "gix-fs 0.15.0", - "gix-glob 0.20.0", - "gix-path 0.10.17", - "gix-quote 0.6.0", - "gix-testtools", - "gix-trace 0.1.12", + "gix-glob 0.20.0 (registry+https://github.com/rust-lang/crates.io-index)", + "gix-path 0.10.17 (registry+https://github.com/rust-lang/crates.io-index)", + "gix-quote 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "gix-trace 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", "kstring", - "serde", "smallvec", "thiserror 2.0.12", "unicode-bom", @@ -1610,29 +1601,29 @@ dependencies = [ [[package]] name = "gix-commitgraph" -version = "0.27.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "043cbe49b7a7505150db975f3cb7c15833335ac1e26781f615454d9d640a28fe" +version = "0.28.0" dependencies = [ "bstr", - "gix-chunk 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", - "gix-hash 0.17.0", + "document-features", + "gix-chunk 0.4.11", + "gix-date 0.10.1", + "gix-hash 0.18.0", + "gix-testtools", "memmap2", + "serde", "thiserror 2.0.12", ] [[package]] name = "gix-commitgraph" version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e05050fd6caa6c731fe3bd7f9485b3b520be062d3d139cb2626e052d6c127951" dependencies = [ "bstr", - "document-features", - "gix-chunk 0.4.11", - "gix-date 0.10.1", - "gix-hash 0.18.0", - "gix-testtools", + "gix-chunk 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", + "gix-hash 0.18.0 (registry+https://github.com/rust-lang/crates.io-index)", "memmap2", - "serde", "thiserror 2.0.12", ] @@ -1707,29 +1698,30 @@ dependencies = [ [[package]] name = "gix-date" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "daa30058ec7d3511fbc229e4f9e696a35abd07ec5b82e635eff864a2726217e4" +version = "0.10.1" dependencies = [ "bstr", + "document-features", + "gix-hash 0.18.0", + "gix-testtools", "itoa", "jiff", + "once_cell", + "pretty_assertions", + "serde", + "smallvec", "thiserror 2.0.12", ] [[package]] name = "gix-date" version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a98593f1f1e14b9fa15c5b921b2c465e904d698b9463e21bb377be8376c3c1a" dependencies = [ "bstr", - "document-features", - "gix-hash 0.18.0", - "gix-testtools", "itoa", "jiff", - "once_cell", - "pretty_assertions", - "serde", "smallvec", "thiserror 2.0.12", ] @@ -1799,22 +1791,6 @@ dependencies = [ "thiserror 2.0.12", ] -[[package]] -name = "gix-discover" -version = "0.39.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7fb8a4349b854506a3915de18d3341e5f1daa6b489c8affc9ca0d69efe86781" -dependencies = [ - "bstr", - "dunce", - "gix-fs 0.14.0", - "gix-hash 0.17.0", - "gix-path 0.10.17 (registry+https://github.com/rust-lang/crates.io-index)", - "gix-ref 0.51.0", - "gix-sec 0.10.12", - "thiserror 2.0.12", -] - [[package]] name = "gix-discover" version = "0.40.1" @@ -1835,29 +1811,19 @@ dependencies = [ ] [[package]] -name = "gix-features" -version = "0.40.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bfdd4838a8d42bd482c9f0cb526411d003ee94cc7c7b08afe5007329c71d554" -dependencies = [ - "gix-hash 0.16.0", - "gix-trace 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "gix-utils 0.1.14", - "libc", -] - -[[package]] -name = "gix-features" -version = "0.41.1" +name = "gix-discover" +version = "0.40.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "016d6050219458d14520fe22bdfdeb9cb71631dec9bc2724767c983f60109634" +checksum = "dccfe3e25b4ea46083916c56db3ba9d1e6ef6dce54da485f0463f9fc0fe1837c" dependencies = [ + "bstr", + "dunce", + "gix-fs 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", + "gix-hash 0.18.0 (registry+https://github.com/rust-lang/crates.io-index)", "gix-path 0.10.17 (registry+https://github.com/rust-lang/crates.io-index)", - "gix-trace 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "gix-utils 0.2.0", - "libc", - "prodash", - "walkdir", + "gix-ref 0.52.1 (registry+https://github.com/rust-lang/crates.io-index)", + "gix-sec 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "thiserror 2.0.12", ] [[package]] @@ -1888,10 +1854,12 @@ version = "0.42.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "56f4399af6ec4fd9db84dd4cf9656c5c785ab492ab40a7c27ea92b4241923fed" dependencies = [ + "gix-path 0.10.17 (registry+https://github.com/rust-lang/crates.io-index)", "gix-trace 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", "gix-utils 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "libc", "prodash", + "walkdir", ] [[package]] @@ -1920,31 +1888,6 @@ dependencies = [ "thiserror 2.0.12", ] -[[package]] -name = "gix-fs" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "182e7fa7bfdf44ffb7cfe7451b373cdf1e00870ac9a488a49587a110c562063d" -dependencies = [ - "fastrand", - "gix-features 0.40.0", - "gix-utils 0.1.14", -] - -[[package]] -name = "gix-fs" -version = "0.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "951e886120dc5fa8cac053e5e5c89443f12368ca36811b2e43d1539081f9c111" -dependencies = [ - "bstr", - "fastrand", - "gix-features 0.41.1", - "gix-path 0.10.17 (registry+https://github.com/rust-lang/crates.io-index)", - "gix-utils 0.2.0", - "thiserror 2.0.12", -] - [[package]] name = "gix-fs" version = "0.15.0" @@ -1986,18 +1929,6 @@ dependencies = [ "gix-testtools", ] -[[package]] -name = "gix-glob" -version = "0.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20972499c03473e773a2099e5fd0c695b9b72465837797a51a43391a1635a030" -dependencies = [ - "bitflags 2.9.0", - "bstr", - "gix-features 0.41.1", - "gix-path 0.10.17 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "gix-glob" version = "0.20.0" @@ -2012,25 +1943,15 @@ dependencies = [ ] [[package]] -name = "gix-hash" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e81c5ec48649b1821b3ed066a44efb95f1a268b35c1d91295e61252539fbe9f8" -dependencies = [ - "faster-hex 0.9.0", - "thiserror 2.0.12", -] - -[[package]] -name = "gix-hash" -version = "0.17.0" +name = "gix-glob" +version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "834e79722063958b03342edaa1e17595cd2939bb2b3306b3225d0815566dcb49" +checksum = "2926b03666e83b8d01c10cf06e5733521aacbd2d97179a4c9b1fdddabb9e937d" dependencies = [ - "faster-hex 0.9.0", - "gix-features 0.41.1", - "sha1-checked", - "thiserror 2.0.12", + "bitflags 2.9.0", + "bstr", + "gix-features 0.42.1 (registry+https://github.com/rust-lang/crates.io-index)", + "gix-path 0.10.17 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2038,7 +1959,7 @@ name = "gix-hash" version = "0.18.0" dependencies = [ "document-features", - "faster-hex 0.10.0", + "faster-hex", "gix-features 0.42.1", "gix-testtools", "serde", @@ -2052,7 +1973,7 @@ version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8d4900562c662852a6b42e2ef03442eccebf24f047d8eab4f23bc12ef0d785d8" dependencies = [ - "faster-hex 0.10.0", + "faster-hex", "gix-features 0.42.1 (registry+https://github.com/rust-lang/crates.io-index)", "sha1-checked", "thiserror 2.0.12", @@ -2078,19 +1999,6 @@ dependencies = [ "parking_lot", ] -[[package]] -name = "gix-ignore" -version = "0.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a27c8380f493a10d1457f756a3f81924d578fc08d6535e304dfcafbf0261d18" -dependencies = [ - "bstr", - "gix-glob 0.19.0", - "gix-path 0.10.17 (registry+https://github.com/rust-lang/crates.io-index)", - "gix-trace 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "unicode-bom", -] - [[package]] name = "gix-ignore" version = "0.15.0" @@ -2107,31 +2015,16 @@ dependencies = [ ] [[package]] -name = "gix-index" -version = "0.39.0" +name = "gix-ignore" +version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "855bece2d4153453aa5d0a80d51deea1ce8cd6a3b4cf213da85ac344ccb908a7" +checksum = "ae358c3c96660b10abc7da63c06788dfded603e717edbd19e38c6477911b71c8" dependencies = [ - "bitflags 2.9.0", "bstr", - "filetime", - "fnv", - "gix-bitmap 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)", - "gix-features 0.41.1", - "gix-fs 0.14.0", - "gix-hash 0.17.0", - "gix-lock 17.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "gix-object 0.48.0", - "gix-traverse 0.45.0", - "gix-utils 0.2.0", - "gix-validate 0.9.4", - "hashbrown 0.14.5", - "itoa", - "libc", - "memmap2", - "rustix 0.38.44", - "smallvec", - "thiserror 2.0.12", + "gix-glob 0.20.0 (registry+https://github.com/rust-lang/crates.io-index)", + "gix-path 0.10.17 (registry+https://github.com/rust-lang/crates.io-index)", + "gix-trace 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "unicode-bom", ] [[package]] @@ -2163,6 +2056,34 @@ dependencies = [ "thiserror 2.0.12", ] +[[package]] +name = "gix-index" +version = "0.40.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d505aea7d7c4267a3153cb90c712a89970b4dd02a2cb3205be322891f530b5" +dependencies = [ + "bitflags 2.9.0", + "bstr", + "filetime", + "fnv", + "gix-bitmap 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)", + "gix-features 0.42.1 (registry+https://github.com/rust-lang/crates.io-index)", + "gix-fs 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", + "gix-hash 0.18.0 (registry+https://github.com/rust-lang/crates.io-index)", + "gix-lock 17.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "gix-object 0.49.1 (registry+https://github.com/rust-lang/crates.io-index)", + "gix-traverse 0.46.1 (registry+https://github.com/rust-lang/crates.io-index)", + "gix-utils 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "gix-validate 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hashbrown 0.14.5", + "itoa", + "libc", + "memmap2", + "rustix 1.0.5", + "smallvec", + "thiserror 2.0.12", +] + [[package]] name = "gix-index-tests" version = "0.0.0" @@ -2181,17 +2102,6 @@ dependencies = [ name = "gix-lfs" version = "0.0.0" -[[package]] -name = "gix-lock" -version = "16.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9739815270ff6940968441824d162df9433db19211ca9ba8c3fc1b50b849c642" -dependencies = [ - "gix-tempfile 16.0.0", - "gix-utils 0.1.14", - "thiserror 2.0.12", -] - [[package]] name = "gix-lock" version = "17.1.0" @@ -2287,27 +2197,6 @@ dependencies = [ name = "gix-note" version = "0.0.0" -[[package]] -name = "gix-object" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4943fcdae6ffc135920c9ea71e0362ed539182924ab7a85dd9dac8d89b0dd69a" -dependencies = [ - "bstr", - "gix-actor 0.34.0", - "gix-date 0.9.4", - "gix-features 0.41.1", - "gix-hash 0.17.0", - "gix-hashtable 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", - "gix-path 0.10.17 (registry+https://github.com/rust-lang/crates.io-index)", - "gix-utils 0.2.0", - "gix-validate 0.9.4", - "itoa", - "smallvec", - "thiserror 2.0.12", - "winnow", -] - [[package]] name = "gix-object" version = "0.49.1" @@ -2334,6 +2223,27 @@ dependencies = [ "winnow", ] +[[package]] +name = "gix-object" +version = "0.49.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d957ca3640c555d48bb27f8278c67169fa1380ed94f6452c5590742524c40fbb" +dependencies = [ + "bstr", + "gix-actor 0.35.1 (registry+https://github.com/rust-lang/crates.io-index)", + "gix-date 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)", + "gix-features 0.42.1 (registry+https://github.com/rust-lang/crates.io-index)", + "gix-hash 0.18.0 (registry+https://github.com/rust-lang/crates.io-index)", + "gix-hashtable 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", + "gix-path 0.10.17 (registry+https://github.com/rust-lang/crates.io-index)", + "gix-utils 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "gix-validate 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "itoa", + "smallvec", + "thiserror 2.0.12", + "winnow", +] + [[package]] name = "gix-odb" version = "0.69.1" @@ -2420,7 +2330,7 @@ dependencies = [ "async-std", "bstr", "document-features", - "faster-hex 0.10.0", + "faster-hex", "futures-io", "futures-lite", "gix-hash 0.18.0", @@ -2439,7 +2349,7 @@ version = "0.19.0" dependencies = [ "bstr", "document-features", - "faster-hex 0.10.0", + "faster-hex", "gix-trace 0.1.12", "serde", "thiserror 2.0.12", @@ -2539,21 +2449,21 @@ dependencies = [ [[package]] name = "gix-quote" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b005c550bf84de3b24aa5e540a23e6146a1c01c7d30470e35d75a12f827f969" +version = "0.6.0" dependencies = [ "bstr", - "gix-utils 0.2.0", + "gix-utils 0.3.0", "thiserror 2.0.12", ] [[package]] name = "gix-quote" version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a375a75b4d663e8bafe3bf4940a18a23755644c13582fa326e99f8f987d83fd" dependencies = [ "bstr", - "gix-utils 0.3.0", + "gix-utils 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "thiserror 2.0.12", ] @@ -2561,27 +2471,6 @@ dependencies = [ name = "gix-rebase" version = "0.0.0" -[[package]] -name = "gix-ref" -version = "0.51.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2e1f7eb6b7ce82d2d19961f74bd637bab3ea79b1bc7bfb23dbefc67b0415d8b" -dependencies = [ - "gix-actor 0.34.0", - "gix-features 0.41.1", - "gix-fs 0.14.0", - "gix-hash 0.17.0", - "gix-lock 17.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "gix-object 0.48.0", - "gix-path 0.10.17 (registry+https://github.com/rust-lang/crates.io-index)", - "gix-tempfile 17.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "gix-utils 0.2.0", - "gix-validate 0.9.4", - "memmap2", - "thiserror 2.0.12", - "winnow", -] - [[package]] name = "gix-ref" version = "0.52.1" @@ -2605,6 +2494,27 @@ dependencies = [ "winnow", ] +[[package]] +name = "gix-ref" +version = "0.52.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1b7985657029684d759f656b09abc3e2c73085596d5cdb494428823970a7762" +dependencies = [ + "gix-actor 0.35.1 (registry+https://github.com/rust-lang/crates.io-index)", + "gix-features 0.42.1 (registry+https://github.com/rust-lang/crates.io-index)", + "gix-fs 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", + "gix-hash 0.18.0 (registry+https://github.com/rust-lang/crates.io-index)", + "gix-lock 17.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "gix-object 0.49.1 (registry+https://github.com/rust-lang/crates.io-index)", + "gix-path 0.10.17 (registry+https://github.com/rust-lang/crates.io-index)", + "gix-tempfile 17.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "gix-utils 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "gix-validate 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "memmap2", + "thiserror 2.0.12", + "winnow", +] + [[package]] name = "gix-ref-tests" version = "0.0.0" @@ -2658,21 +2568,6 @@ dependencies = [ "thiserror 2.0.12", ] -[[package]] -name = "gix-revwalk" -version = "0.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dc7c3d7e5cdc1ab8d35130106e4af0a4f9f9eca0c81f4312b690780e92bde0d" -dependencies = [ - "gix-commitgraph 0.27.0", - "gix-date 0.9.4", - "gix-hash 0.17.0", - "gix-hashtable 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", - "gix-object 0.48.0", - "smallvec", - "thiserror 2.0.12", -] - [[package]] name = "gix-revwalk" version = "0.20.1" @@ -2688,15 +2583,18 @@ dependencies = [ ] [[package]] -name = "gix-sec" -version = "0.10.12" +name = "gix-revwalk" +version = "0.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47aeb0f13de9ef2f3033f5ff218de30f44db827ac9f1286f9ef050aacddd5888" +checksum = "1bc756b73225bf005ddeb871d1ca7b3c33e2417d0d53e56effa5a36765b52b28" dependencies = [ - "bitflags 2.9.0", - "gix-path 0.10.17 (registry+https://github.com/rust-lang/crates.io-index)", - "libc", - "windows-sys 0.52.0", + "gix-commitgraph 0.28.0 (registry+https://github.com/rust-lang/crates.io-index)", + "gix-date 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)", + "gix-hash 0.18.0 (registry+https://github.com/rust-lang/crates.io-index)", + "gix-hashtable 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", + "gix-object 0.49.1 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec", + "thiserror 2.0.12", ] [[package]] @@ -2712,6 +2610,18 @@ dependencies = [ "windows-sys 0.59.0", ] +[[package]] +name = "gix-sec" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0dabbc78c759ecc006b970339394951b2c8e1e38a37b072c105b80b84c308fd" +dependencies = [ + "bitflags 2.9.0", + "gix-path 0.10.17 (registry+https://github.com/rust-lang/crates.io-index)", + "libc", + "windows-sys 0.59.0", +] + [[package]] name = "gix-sequencer" version = "0.0.0" @@ -2787,21 +2697,6 @@ dependencies = [ "thiserror 2.0.12", ] -[[package]] -name = "gix-tempfile" -version = "16.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2558f423945ef24a8328c55d1fd6db06b8376b0e7013b1bb476cc4ffdf678501" -dependencies = [ - "gix-fs 0.13.0", - "libc", - "once_cell", - "parking_lot", - "signal-hook", - "signal-hook-registry", - "tempfile", -] - [[package]] name = "gix-tempfile" version = "17.1.0" @@ -2827,6 +2722,8 @@ dependencies = [ "libc", "once_cell", "parking_lot", + "signal-hook", + "signal-hook-registry", "tempfile", ] @@ -2839,11 +2736,11 @@ dependencies = [ "document-features", "fastrand", "fs_extra", - "gix-discover 0.39.0", - "gix-fs 0.14.0", - "gix-lock 16.0.0", - "gix-tempfile 16.0.0", - "gix-worktree 0.40.0", + "gix-discover 0.40.1 (registry+https://github.com/rust-lang/crates.io-index)", + "gix-fs 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", + "gix-lock 17.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "gix-tempfile 17.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "gix-worktree 0.41.0 (registry+https://github.com/rust-lang/crates.io-index)", "io-close", "is_ci", "once_cell", @@ -2904,17 +2801,15 @@ dependencies = [ [[package]] name = "gix-traverse" -version = "0.45.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36c0b049f8bdb61b20016694102f7b507f2e1727e83e9c5e6dad4f7d84ff7384" +version = "0.46.1" dependencies = [ "bitflags 2.9.0", - "gix-commitgraph 0.27.0", - "gix-date 0.9.4", - "gix-hash 0.17.0", - "gix-hashtable 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", - "gix-object 0.48.0", - "gix-revwalk 0.19.0", + "gix-commitgraph 0.28.0", + "gix-date 0.10.1", + "gix-hash 0.18.0", + "gix-hashtable 0.8.1", + "gix-object 0.49.1", + "gix-revwalk 0.20.1", "smallvec", "thiserror 2.0.12", ] @@ -2922,14 +2817,16 @@ dependencies = [ [[package]] name = "gix-traverse" version = "0.46.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39094185f6d9a4d81101130fbbf7f598a06441d774ae3b3ae7930a613bbe1157" dependencies = [ "bitflags 2.9.0", - "gix-commitgraph 0.28.0", - "gix-date 0.10.1", - "gix-hash 0.18.0", - "gix-hashtable 0.8.1", - "gix-object 0.49.1", - "gix-revwalk 0.20.1", + "gix-commitgraph 0.28.0 (registry+https://github.com/rust-lang/crates.io-index)", + "gix-date 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)", + "gix-hash 0.18.0 (registry+https://github.com/rust-lang/crates.io-index)", + "gix-hashtable 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", + "gix-object 0.49.1 (registry+https://github.com/rust-lang/crates.io-index)", + "gix-revwalk 0.20.1 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec", "thiserror 2.0.12", ] @@ -2967,26 +2864,6 @@ dependencies = [ "url", ] -[[package]] -name = "gix-utils" -version = "0.1.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff08f24e03ac8916c478c8419d7d3c33393da9bb41fa4c24455d5406aeefd35f" -dependencies = [ - "fastrand", - "unicode-normalization", -] - -[[package]] -name = "gix-utils" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "189f8724cf903e7fd57cfe0b7bc209db255cacdcb22c781a022f52c3a774f8d0" -dependencies = [ - "fastrand", - "unicode-normalization", -] - [[package]] name = "gix-utils" version = "0.3.0" @@ -3006,16 +2883,6 @@ dependencies = [ "unicode-normalization", ] -[[package]] -name = "gix-validate" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34b5f1253109da6c79ed7cf6e1e38437080bb6d704c76af14c93e2f255234084" -dependencies = [ - "bstr", - "thiserror 2.0.12", -] - [[package]] name = "gix-validate" version = "0.10.0" @@ -3035,25 +2902,6 @@ dependencies = [ "thiserror 2.0.12", ] -[[package]] -name = "gix-worktree" -version = "0.40.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7760dbc4b79aa274fed30adc0d41dca6b917641f26e7867c4071b1fb4dc727b" -dependencies = [ - "bstr", - "gix-attributes 0.25.0", - "gix-features 0.41.1", - "gix-fs 0.14.0", - "gix-glob 0.19.0", - "gix-hash 0.17.0", - "gix-ignore 0.14.0", - "gix-index 0.39.0", - "gix-object 0.48.0", - "gix-path 0.10.17 (registry+https://github.com/rust-lang/crates.io-index)", - "gix-validate 0.9.4", -] - [[package]] name = "gix-worktree" version = "0.41.0" @@ -3073,6 +2921,25 @@ dependencies = [ "serde", ] +[[package]] +name = "gix-worktree" +version = "0.41.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54f1916f8d928268300c977d773dd70a8746b646873b77add0a34876a8c847e9" +dependencies = [ + "bstr", + "gix-attributes 0.26.0 (registry+https://github.com/rust-lang/crates.io-index)", + "gix-features 0.42.1 (registry+https://github.com/rust-lang/crates.io-index)", + "gix-fs 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", + "gix-glob 0.20.0 (registry+https://github.com/rust-lang/crates.io-index)", + "gix-hash 0.18.0 (registry+https://github.com/rust-lang/crates.io-index)", + "gix-ignore 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", + "gix-index 0.40.0 (registry+https://github.com/rust-lang/crates.io-index)", + "gix-object 0.49.1 (registry+https://github.com/rust-lang/crates.io-index)", + "gix-path 0.10.17 (registry+https://github.com/rust-lang/crates.io-index)", + "gix-validate 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "gix-worktree-state" version = "0.19.0" diff --git a/tests/tools/Cargo.toml b/tests/tools/Cargo.toml index 75c419ce970..a3b7acce7c2 100644 --- a/tests/tools/Cargo.toml +++ b/tests/tools/Cargo.toml @@ -25,11 +25,11 @@ default = [] xz = ["dep:xz2"] [dependencies] -gix-lock = "16.0.0" -gix-discover = "0.39.0" -gix-worktree = "0.40.0" -gix-fs = "0.14.0" -gix-tempfile = { version = "16.0.0", default-features = false, features = ["signals"] } +gix-lock = "17.1.0" +gix-discover = "0.40.1" +gix-worktree = "0.41.0" +gix-fs = "0.15.0" +gix-tempfile = { version = "17.1.0", default-features = false, features = ["signals"] } winnow = { version = "0.7.7", features = ["simd"] } fastrand = "2.0.0" diff --git a/tests/tools/src/lib.rs b/tests/tools/src/lib.rs index 19f71bb6584..8572046e43b 100644 --- a/tests/tools/src/lib.rs +++ b/tests/tools/src/lib.rs @@ -219,8 +219,7 @@ pub fn spawn_git_daemon(working_dir: impl AsRef) -> std::io::Result Date: Sun, 27 Apr 2025 10:30:00 +0200 Subject: [PATCH 004/166] Release gix-testtools v0.16.1 --- Cargo.lock | 2 +- tests/tools/CHANGELOG.md | 266 ++++++++++----------------------------- tests/tools/Cargo.toml | 2 +- 3 files changed, 71 insertions(+), 199 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index bbf92b69cd8..d09e41872ae 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2729,7 +2729,7 @@ dependencies = [ [[package]] name = "gix-testtools" -version = "0.16.0" +version = "0.16.1" dependencies = [ "bstr", "crc", diff --git a/tests/tools/CHANGELOG.md b/tests/tools/CHANGELOG.md index 2c848defd51..e20c2c77d99 100644 --- a/tests/tools/CHANGELOG.md +++ b/tests/tools/CHANGELOG.md @@ -5,8 +5,35 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## 0.16.1 (2025-04-27) + +### Bug Fixes + + - unify the dependency graph by choosing the right versions, upgrading to `gix-features 0.42` + This is what should silence audit failures. + +### Commit Statistics + + + + - 1 commit contributed to the release. + - 1 commit was understood as [conventional](https://www.conventionalcommits.org). + - 0 issues like '(#ID)' were seen in commit messages + +### Commit Details + + + +
view details + + * **Uncategorized** + - Unify the dependency graph by choosing the right versions, upgrading to `gix-features 0.42` ([`9b12d50`](https://github.com/GitoxideLabs/gitoxide/commit/9b12d5007ca3ec98d061b6d2b94c7cdda4fcd3e4)) +
+ ## 0.16.0 (2025-04-27) + + ### Changed - In gix-testtools use `ignore` and `index` via `gix_worktree` @@ -169,29 +196,25 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 sense to enable this: - If automatically testing archive creation, or - - - As a way to check that all intended generated arhives are committed +- As a way to check that all intended generated arhives are committed (which is the motivating use case for this feature), or - - - If actually using CI to generate archives that will be uploaded +- If actually using CI to generate archives that will be uploaded as artifacts, or - - - In unusual non-CI environments that are mis-detected as CI +- In unusual non-CI environments that are mis-detected as CI (though that should usually be investigated and fixed, since some software performs destructive operations more readily without interactive checks when CI is detected). - - The usual reason for not generating archives on CI is that they - would not typically be preserved. Thus refraining from generating - them on CI remains the default behavior. - - Like the `GIX_TEST_IGNORE_ARCHIVES` environment variable, the new - variable `GIX_TEST_CREATE_ARCHIVES_EVEN_ON_CI` is currently - interpreted as "true" based solely on its presence. This is to say - that is actual value is currently not examined. ### Bug Fixes + + + + + + + + - fix check to detect `git-lfs` managed files that weren't checked out. Previously it would detect them incorrectly due to a find-and-replace error. @@ -208,38 +231,17 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 falls back in an operating system specific manner: - Except on Windows, always fall back to `bash`, as before. - - - On Windows, run `git --exec-path` to find the `git-core` +- On Windows, run `git --exec-path` to find the `git-core` directory. Then check if a `bash.exe` exists at the expected location relative to that. In Git for Windows installations, this will usually work. If so, use that path (with `..` components resolved away). - - - On Windows, if a specific `bash.exe` is not found in that way, +- On Windows, if a specific `bash.exe` is not found in that way, then fall back to using the relative path `bash.exe`. This is to preserve the ability to run `bash` on Windows systems where it may have worked before even without `bash.exe` in an expected location provided by a Git for Windows installation. - - (The distinction between `bash` and `bash.exe` is only slightly - significant: we check for the existence of the interpreter without - initially running it, and that check requires the full filename. - It is called `bash.exe` elsewhere for consistency both with the - checked-for executable and for consistencey with how we run most - other programs on Windows, e.g., the `git` vs. `git.exe`.) - - This fixes #1359. That bug is not currently observed on CI, but - this change is verified to fix it on a local test system where it - previously always occurred when running the test suite from - PowerShell in an unmodified environment. The fix applies both with - `GIX_TEST_IGNORE_ARCHIVES` unset, in which case there are now no - failures, and with `GIX_TEST_IGNORE_ARCHIVES=1`, in which case the - failures are now limited to the 15 cases tracked in #1358. - - Previously, fixture scripts had been run on Windows with whatever - `bash` was found in a `PATH` search, which had two problems: - - - On most Windows systems, even if no WSL distribution is installed +- On most Windows systems, even if no WSL distribution is installed and even if WSL itself is not set up, the `System32` directory contains a `bash.exe` program associated with WSL. This program attempts to use WSL to run `bash` in an installed distribution. @@ -261,8 +263,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 `PATH` is modified -- either explicitly or by testing in an MSYS2 environment, such as the Git Bash environment -- whether or not `GIX_TEST_IGNORE_ARCHIVES` is set. This was the cause of #1359. - - - Although using a Git Bash environment or otherwise adjusting the +- Although using a Git Bash environment or otherwise adjusting the path *currently* works, the reasons it works are subtle and rely on non-guaranteed behavior of `std::process::Command` path search that may change without warning. @@ -314,19 +315,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 no longer prevent `std::proces::Command` from finding the `bash.exe` in `System32` as `CreateProcessW` would and using it. Then it would be nontrivial to run the test suite on Windows. - - For references and other details, see #1359 and comments including: - https://github.com/GitoxideLabs/gitoxide/issues/1359#issuecomment-2316614616 - - On the approach of finding the Git for Windows `bash.exe` relative - to the `git-core` directory, see the GitPython pull request - https://github.com/gitpython-developers/GitPython/pull/1791, its - comments, and the implementation of the approach by @emanspeaks: - https://github.com/gitpython-developers/GitPython/blob/f065d1fba422a528a133719350e027f1241273df/git/cmd.py#L398-L403 - - Two possible future enhancements are *not* included in this commit: - - 1. This only modifies how test fixture scripts are run. It only +1. This only modifies how test fixture scripts are run. It only affects the behavior of `gix-testtools`, and not of any other gitoxide crates such as `gix-command`. This is because: @@ -347,22 +336,22 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 there may be scenarios where running an executable found this way is not safe. Limiting it to `gix-testtools` pending further research may help mitigate this risk. - - 2. As in other runs of `git` by `gix-testools`, this calls - `git.exe`, letting `std::process::Command` do an executable - search, but not trying any additional locations where Git is - known sometimes to be installed. This does not find `git.exe` in - as many situations as `gix_path::env::exe_invocation` does. - - The reasons for not (or not quite yet) including that change are: - - - It would add `gix-path` as a dependency of `gix-testtools`. - - - Finding `git` in a `std::process::Command` path search is an +- We know our test fixture scripts are all (at least currently) + `bash` scripts, and this seems likely for other software that + currently uses this functionality of `gix-testtools`. But + scripts that are run as hooks, or as custom commands, or + filters, etc., are often written in other languages, such as + Perl. (The fallback here does not examine leading `#!` lines.) +- Although a `bash.exe` located at the usual place relative to + (but outside of) the `git-core` directory is usually suitable, + there may be scenarios where running an executable found this + way is not safe. Limiting it to `gix-testtools` pending + further research may help mitigate this risk. +- It would add `gix-path` as a dependency of `gix-testtools`. +- Finding `git` in a `std::process::Command` path search is an established (though not promised) approach in `gix-testtools`, including to run `git --exec-path` (to find `git-daemon`). - - - It is not immediately obvious that `exe_invocation` behavior +- It is not immediately obvious that `exe_invocation` behavior is semantically correct for `gix-testtools`, though it most likely is reasonable. @@ -378,156 +367,35 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 use `git` but not to be used *by* `git` are usually written without the expectation of such an environment, prepending this will not necessarily be an improvement. - - Double the fixture lock timeout - This increases the lock timeout used in `gix-testtools` from 3 min - 6 min. This seems to fix #1605. - - Unset other env vars related to `GIT_DIR` for fixtures - This removes other environment variables that have an effect - conceptually related to `GIT_DIR` even when `GIT_DIR` is not set. - Most of them change where `git` will look for files that are - ordinarily in a repository's `.git` directory. In contrast, - `GIT_WORK_TREE` changes where the working tree is found. - - These would rarely be set in the environment in which the tests are - run, but it makes sense to unset them for the same reason as - unsetting `GIT_DIR`, which is already done. - - The new `remove_env` calls are roughly in the order in which the - variables they unset are listed in git(1). - - This deliberately does not attempt to unset every possible - environment variable that git(1) documents as affecting its - behavior. This is for four reasons: - - - Some variables may be set on the test machine without envisioning +- Some variables may be set on the test machine without envisioning this usage, but should still be kept, such as those that cause more or less traversal than usual to be done. For example, if `GIT_CEILING_DIRECTORIES` or even `GIT_DISCOVERY_ACROSS_FILESYSTEM` are set, it may be for a good reason. - - - Some variables will have no default unless other variables that +- Some variables will have no default unless other variables that are being modified here are changed again after the changes here. In particular, `GIT_CONFIG_SYSTEM` only has an effect if `GIT_CONFIG_NOSYSTEM` is not set. We set `GIT_CONFIG_NOSYSTEM` to `1`, so if it is unset then a fixture script has unset it, in which case it is presumably intended that `GIT_CONFIG_SYSTEM` have some effect (if the fixture script doesn't change/unset it). - - - Some variables are useful for extra debugging and make sense to +- Some variables are useful for extra debugging and make sense to set when running the test fixtures under foreseeable conditions. For example, the effects of all `GIT_TRACE*` variables are intentionally preserved. - - - For a few variables, such as `GIT_DEFAULT_HASH`, it is unlikely +- For a few variables, such as `GIT_DEFAULT_HASH`, it is unlikely that they would be wanted in the test environment, but even more unlikely that they would be set in that environment without the intention of experimenting with their effect on fixtures. - - However, this is not to say that all environment variables that - would make sense to remove have necessarily been removed. - - The removed variables here differ from those removed for the `git` - invocation in `gix-path/src/env/git/mod.rs` for two reasons: - - - That is a single `git` invocation for a specific command, so the +- That is a single `git` invocation for a specific command, so the environment variables that ought to affect it must be kept, and others can be removed. But here, arbitrary fixtures need to work, and they provide almost all of their own environment as needed. - - - Setting an unusual value of `GIT_DIR` there that `git` cannot +- Setting an unusual value of `GIT_DIR` there that `git` cannot take to be a usable repository also prevents the variables that override `GIT_DIR` for specific files from being used. (But maybe those should be unset there anyway, for clarity?) - - Append to preexisting `MSYS` env var even if ill-formed - The value of an environment variable as obtained by the facilities - in `std::env` is not always well-formed Unicode. Specifically, on - Windows the values of environment variables, like paths, are - natively UTF-16LE strings except that unpaired surrogate code - points can also occur. An `&OsStr` on Windows may accordingly not - quite be UTF-8. - - When the `MSYS` variable is absent, we treat this the same as when - it is present but empty. However, as described in #1574, an `MSYS` - variable that is present but whose value contains an unpaired - surrogate would also be replaced entirely, rather than appending to - its old value. - - This changes that, to instead append, retaining whatever was there - even if it was ill-formed Unicode. - - An alternative change could be to panic when the old value is - ill-formed Unicode. This commit allows and appends to the old - value, rather than panicking or keeping and documenting the - previous behavior of discarding the old value, because the appended - sequence ` winsymlinks:nativestrict` is effective at causing - fixture scripts to attempt to create actual symlinks even if - the preceding code point is an unpaired Unicode high surrogate. - - Omit other high-scoped config in fixtures - In addition to keeping fixture scripts from receiving global and - system scope Git configuration variables, as was already done, this - also omits configuration variables from high scopes similar to or - above the system scope, associated with the Git installation but - separate from the system scope. - - The main and possibly only case where this happens is the "unknown" - scope associated with an Apple Git installation on macOS. This is a - file usually located under `/Library` or `/Applications`. - - This is done by using `GIT_CONFIG_NOSYSTEM`, which suppresses both - the system scope and this separate "unknown" scope, instead of by - settng `GIT_CONFIG_SYSTEM` to a path like `/dev/null`. The latter - approach continues to be used to omit global scope config via - `GIT_CONFIG_GLOBAL` (as `git` recognized no `GIT_CONFIG_NOGLOBAL`). - - Omit system/global config in fixtures regardless of contents - This uses the null device, `/dev/null` on Unix-like systems and - `NUL` on Windows, as the value of `GIT_CONFIG_SYSTEM` and - `GIT_CONFIG_GLOBAL` when `gix-testtols` runs test fixture shell - scripts. - - `/dev/null` is explicitly recommended for this purpose, when - setting those environment variables for the purpose of preventing - configuration files from being read, in the Git documentation: - - - https://git-scm.com/docs/git#Documentation/git.txt-codeGITCONFIGGLOBALcode - - On Windows, `NUL` is an analogue of `/dev/null`. Even in the - unusual scenario that a `\\?\` prefixed UNC path is used to create - an actual file named `NUL` in the directory the fixture script - operates in, the relative path `NUL` still resolves to the null - device and not to that file. - - The previous behavior was to use a value of `:` on Unix-like - systems or `-` on Windows. But these were really just unusual but - valid paths, such that files of those names could exist in any - location. `git` furthermore treats them as paths: a `:` is not - special in these environment variables because they hold a single - path rather than a list of paths, and a `-` is not special (for - example, it does not specify stdin) because it appears in an - environment variable rather than a command-line argument. - - While `:` and `-` are unusual filenames, this code is used in - testing, including of edge cases where unusual files may be used. - So this change may make the test tools slightly more robust. - - Let `gix_testtools::Env` undo multiple changes to the same var - Previously, an `Env` instance would restore the original state on - drop if no more than one modification was made to any one variable - through it, but would restore an intermediate state if the same - variable was ever set multiple times, unset multiple times, or both - set and unset in any order. - - The state it would restore for each variable was its state - immediately before the most recent modification (through the `Env` - instance) that affected it, rather than its original state before - the first time it was modified through that `Env` instance. - - This fixes that by undoing the changes in the opposite of the order - they were made. - - assure archives are unique if their generator-scripts are called with arguments. - Previously there was a race condition that would cause archives to be created either with - or without arguments, depending on which test was run first. - - After its creation, they wouldn't be looked at again as on disk they would already be available - in their usable form. +- https://git-scm.com/docs/git#Documentation/git.txt-codeGITCONFIGGLOBALcode ### Other @@ -554,7 +422,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - - 104 commits contributed to the release over the course of 296 calendar days. + - 105 commits contributed to the release over the course of 296 calendar days. - 307 days passed between releases. - 22 commits were understood as [conventional](https://www.conventionalcommits.org). - 2 unique issues were worked on: [#1440](https://github.com/GitoxideLabs/gitoxide/issues/1440), [#1443](https://github.com/GitoxideLabs/gitoxide/issues/1443) @@ -576,6 +444,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 * **[#1443](https://github.com/GitoxideLabs/gitoxide/issues/1443)** - On Windows, also instruct msys to create real symlinks ([`0899c2e`](https://github.com/GitoxideLabs/gitoxide/commit/0899c2ee36a714573b223ae85114fb7284fc661e)) * **Uncategorized** + - Release gix-testtools v0.16.0 ([`c5c726e`](https://github.com/GitoxideLabs/gitoxide/commit/c5c726e64f01b3a927ec5dc0e9917a4470d9cc5c)) - Prepare new testtools release ([`070f5f6`](https://github.com/GitoxideLabs/gitoxide/commit/070f5f68976217c4fec84cae8516c3f5b716e513)) - Merge pull request #1935 from pierrechevalier83/fix_1923 ([`3b1bef7`](https://github.com/GitoxideLabs/gitoxide/commit/3b1bef7cc40e16b61bcc117ca90ebae21df7c7b1)) - J fmt ([`c3c6504`](https://github.com/GitoxideLabs/gitoxide/commit/c3c650448f92bcb27194ce0a51f7d604ce87920d)) @@ -680,6 +549,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Merge branch 'fix-1440' ([`f87322e`](https://github.com/GitoxideLabs/gitoxide/commit/f87322e185704d9d4368ae88e95892635a976e4a)) + +The usual reason for not generating archives on CI is that theywould not typically be preserved. Thus refraining from generatingthem on CI remains the default behavior.Like the GIX_TEST_IGNORE_ARCHIVES environment variable, the newvariable GIX_TEST_CREATE_ARCHIVES_EVEN_ON_CI is currentlyinterpreted as “true” based solely on its presence. This is to saythat is actual value is currently not examined.(The distinction between bash and bash.exe is only slightlysignificant: we check for the existence of the interpreter withoutinitially running it, and that check requires the full filename.It is called bash.exe elsewhere for consistency both with thechecked-for executable and for consistencey with how we run mostother programs on Windows, e.g., the git vs. git.exe.)This fixes #1359. That bug is not currently observed on CI, butthis change is verified to fix it on a local test system where itpreviously always occurred when running the test suite fromPowerShell in an unmodified environment. The fix applies both withGIX_TEST_IGNORE_ARCHIVES unset, in which case there are now nofailures, and with GIX_TEST_IGNORE_ARCHIVES=1, in which case thefailures are now limited to the 15 cases tracked in #1358.Previously, fixture scripts had been run on Windows with whateverbash was found in a PATH search, which had two problems:For references and other details, see #1359 and comments including:https://github.com/GitoxideLabs/gitoxide/issues/1359#issuecomment-2316614616On the approach of finding the Git for Windows bash.exe relativeto the git-core directory, see the GitPython pull requesthttps://github.com/gitpython-developers/GitPython/pull/1791, itscomments, and the implementation of the approach by @emanspeaks:https://github.com/gitpython-developers/GitPython/blob/f065d1fba422a528a133719350e027f1241273df/git/cmd.py#L398-L403Two possible future enhancements are not included in this commit:As in other runs of git by gix-testools, this callsgit.exe, letting std::process::Command do an executablesearch, but not trying any additional locations where Git isknown sometimes to be installed. This does not find git.exe inas many situations as gix_path::env::exe_invocation does.The reasons for not (or not quite yet) including that change are: Double the fixture lock timeoutThis increases the lock timeout used in gix-testtools from 3 min6 min. This seems to fix #1605. Unset other env vars related to GIT_DIR for fixturesThis removes other environment variables that have an effectconceptually related to GIT_DIR even when GIT_DIR is not set.Most of them change where git will look for files that areordinarily in a repository’s .git directory. In contrast,GIT_WORK_TREE changes where the working tree is found.These would rarely be set in the environment in which the tests arerun, but it makes sense to unset them for the same reason asunsetting GIT_DIR, which is already done.The new remove_env calls are roughly in the order in which thevariables they unset are listed in git(1).This deliberately does not attempt to unset every possibleenvironment variable that git(1) documents as affecting itsbehavior. This is for four reasons:However, this is not to say that all environment variables thatwould make sense to remove have necessarily been removed.The removed variables here differ from those removed for the gitinvocation in gix-path/src/env/git/mod.rs for two reasons: Append to preexisting MSYS env var even if ill-formedThe value of an environment variable as obtained by the facilitiesin std::env is not always well-formed Unicode. Specifically, onWindows the values of environment variables, like paths, arenatively UTF-16LE strings except that unpaired surrogate codepoints can also occur. An &OsStr on Windows may accordingly notquite be UTF-8.When the MSYS variable is absent, we treat this the same as whenit is present but empty. However, as described in #1574, an MSYSvariable that is present but whose value contains an unpairedsurrogate would also be replaced entirely, rather than appending toits old value.This changes that, to instead append, retaining whatever was thereeven if it was ill-formed Unicode.An alternative change could be to panic when the old value isill-formed Unicode. This commit allows and appends to the oldvalue, rather than panicking or keeping and documenting theprevious behavior of discarding the old value, because the appendedsequence winsymlinks:nativestrict is effective at causingfixture scripts to attempt to create actual symlinks even ifthe preceding code point is an unpaired Unicode high surrogate. Omit other high-scoped config in fixturesIn addition to keeping fixture scripts from receiving global andsystem scope Git configuration variables, as was already done, thisalso omits configuration variables from high scopes similar to orabove the system scope, associated with the Git installation butseparate from the system scope.The main and possibly only case where this happens is the “unknown”scope associated with an Apple Git installation on macOS. This is afile usually located under /Library or /Applications.This is done by using GIT_CONFIG_NOSYSTEM, which suppresses boththe system scope and this separate “unknown” scope, instead of bysettng GIT_CONFIG_SYSTEM to a path like /dev/null. The latterapproach continues to be used to omit global scope config viaGIT_CONFIG_GLOBAL (as git recognized no GIT_CONFIG_NOGLOBAL). Omit system/global config in fixtures regardless of contentsThis uses the null device, /dev/null on Unix-like systems andNUL on Windows, as the value of GIT_CONFIG_SYSTEM andGIT_CONFIG_GLOBAL when gix-testtols runs test fixture shellscripts./dev/null is explicitly recommended for this purpose, whensetting those environment variables for the purpose of preventingconfiguration files from being read, in the Git documentation:On Windows, NUL is an analogue of /dev/null. Even in theunusual scenario that a \\?\ prefixed UNC path is used to createan actual file named NUL in the directory the fixture scriptoperates in, the relative path NUL still resolves to the nulldevice and not to that file.The previous behavior was to use a value of : on Unix-likesystems or - on Windows. But these were really just unusual butvalid paths, such that files of those names could exist in anylocation. git furthermore treats them as paths: a : is notspecial in these environment variables because they hold a singlepath rather than a list of paths, and a - is not special (forexample, it does not specify stdin) because it appears in anenvironment variable rather than a command-line argument.While : and - are unusual filenames, this code is used intesting, including of edge cases where unusual files may be used.So this change may make the test tools slightly more robust. Let gix_testtools::Env undo multiple changes to the same varPreviously, an Env instance would restore the original state ondrop if no more than one modification was made to any one variablethrough it, but would restore an intermediate state if the samevariable was ever set multiple times, unset multiple times, or bothset and unset in any order.The state it would restore for each variable was its stateimmediately before the most recent modification (through the Envinstance) that affected it, rather than its original state beforethe first time it was modified through that Env instance.This fixes that by undoing the changes in the opposite of the orderthey were made. assure archives are unique if their generator-scripts are called with arguments.Previously there was a race condition that would cause archives to be created either withor without arguments, depending on which test was run first.After its creation, they wouldn’t be looked at again as on disk they would already be availablein their usable form. + ## 0.15.0 (2024-06-23) Now by default, `tar` files will be written which works better when checking them into diff --git a/tests/tools/Cargo.toml b/tests/tools/Cargo.toml index a3b7acce7c2..988a26d504b 100644 --- a/tests/tools/Cargo.toml +++ b/tests/tools/Cargo.toml @@ -3,7 +3,7 @@ lints.workspace = true [package] name = "gix-testtools" description = "Shared code for gitoxide crates to facilitate testing" -version = "0.16.0" +version = "0.16.1" authors = ["Sebastian Thiel "] edition = "2021" license = "MIT OR Apache-2.0" From f1890313c42d8f5b347feef1f48ec53f054dff08 Mon Sep 17 00:00:00 2001 From: Bart Dubbeldam Date: Sun, 27 Apr 2025 10:53:22 +0200 Subject: [PATCH 005/166] feat!: Add `BlameRanges` to enable multi-range blame support This update replaces single-range handling with the `BlameRanges` type, allowing multiple 1-based inclusive line ranges to be specified for blame operations. It hides some of the implementation details of the range logic, prepares for compatibility with `git` behavior, and adds tests to validate multi-range scenarios. --- gix-blame/src/file/function.rs | 33 ++--- gix-blame/src/lib.rs | 2 +- gix-blame/src/types.rs | 134 +++++++++++++++++++- gix-blame/tests/blame.rs | 78 +++++++++++- gix-blame/tests/fixtures/make_blame_repo.sh | 1 + 5 files changed, 215 insertions(+), 33 deletions(-) diff --git a/gix-blame/src/file/function.rs b/gix-blame/src/file/function.rs index 12ef57d374d..05293053231 100644 --- a/gix-blame/src/file/function.rs +++ b/gix-blame/src/file/function.rs @@ -94,11 +94,15 @@ pub fn file( return Ok(Outcome::default()); } - let range_in_blamed_file = one_based_inclusive_to_zero_based_exclusive_range(options.range, num_lines_in_blamed)?; - let mut hunks_to_blame = vec![UnblamedHunk { - range_in_blamed_file: range_in_blamed_file.clone(), - suspects: [(suspect, range_in_blamed_file)].into(), - }]; + let ranges = options.range.to_zero_based_exclusive(num_lines_in_blamed)?; + let mut hunks_to_blame = Vec::with_capacity(ranges.len()); + + for range in ranges { + hunks_to_blame.push(UnblamedHunk { + range_in_blamed_file: range.clone(), + suspects: [(suspect, range)].into(), + }); + } let (mut buf, mut buf2) = (Vec::new(), Vec::new()); let commit = find_commit(cache.as_ref(), &odb, &suspect, &mut buf)?; @@ -342,25 +346,6 @@ pub fn file( }) } -/// This function assumes that `range` has 1-based inclusive line numbers and converts it to the -/// format internally used: 0-based line numbers stored in ranges that are exclusive at the -/// end. -fn one_based_inclusive_to_zero_based_exclusive_range( - range: Option>, - max_lines: u32, -) -> Result, Error> { - let Some(range) = range else { return Ok(0..max_lines) }; - if range.start == 0 { - return Err(Error::InvalidLineRange); - } - let start = range.start - 1; - let end = range.end; - if start >= max_lines || end > max_lines || start == end { - return Err(Error::InvalidLineRange); - } - Ok(start..end) -} - /// Pass ownership of each unblamed hunk of `from` to `to`. /// /// This happens when `from` didn't actually change anything in the blamed file. diff --git a/gix-blame/src/lib.rs b/gix-blame/src/lib.rs index d2c7a5243d7..aca4299d41c 100644 --- a/gix-blame/src/lib.rs +++ b/gix-blame/src/lib.rs @@ -17,7 +17,7 @@ mod error; pub use error::Error; mod types; -pub use types::{BlameEntry, Options, Outcome, Statistics}; +pub use types::{BlameEntry, BlameRanges, Options, Outcome, Statistics}; mod file; pub use file::function::file; diff --git a/gix-blame/src/types.rs b/gix-blame/src/types.rs index bc01e4d8bec..e8f7f5fc5f9 100644 --- a/gix-blame/src/types.rs +++ b/gix-blame/src/types.rs @@ -8,16 +8,142 @@ use gix_object::bstr::BString; use smallvec::SmallVec; use crate::file::function::tokens_for_diffing; +use crate::Error; + +/// A type to represent one or more line ranges to blame in a file. +/// +/// This type handles the conversion between git's 1-based inclusive ranges and the internal +/// 0-based exclusive ranges used by the blame algorithm. +/// +/// # Examples +/// +/// ```rust +/// use gix_blame::BlameRanges; +/// +/// // Blame lines 20 through 40 (inclusive) +/// let range = BlameRanges::from_range(20..41); +/// +/// // Blame multiple ranges +/// let mut ranges = BlameRanges::new(); +/// ranges.add_range(1..5); // Lines 1-4 +/// ranges.add_range(10..15); // Lines 10-14 +/// ``` +/// +/// # Line Number Representation +/// +/// This type uses 1-based inclusive ranges to mirror `git`'s behaviour: +/// - A range of `20..41` represents 21 lines, spanning from line 20 up to and including line 40 +/// - This will be converted to `19..40` internally as the algorithm uses 0-based ranges that are exclusive at the end +/// +/// # Empty Ranges +/// +/// An empty `BlameRanges` (created via `BlameRanges::new()` or `BlameRanges::default()`) means +/// to blame the entire file, similar to running `git blame` without line number arguments. +#[derive(Debug, Clone, Default)] +pub struct BlameRanges { + /// The ranges to blame, stored as 1-based inclusive ranges + /// An empty Vec means blame the entire file + ranges: Vec>, +} + +impl BlameRanges { + /// Create a new empty BlameRanges instance. + /// + /// An empty instance means to blame the entire file. + pub fn new() -> Self { + Self { ranges: Vec::new() } + } + + /// Add a single range to blame. + /// + /// The range should be 1-based inclusive. + /// If the new range overlaps with or is adjacent to an existing range, + /// they will be merged into a single range. + pub fn add_range(&mut self, new_range: Range) { + self.merge_range(new_range); + } + + /// Create from a single range. + /// + /// The range should be 1-based inclusive, similar to git's line number format. + pub fn from_range(range: Range) -> Self { + Self { ranges: vec![range] } + } + + /// Create from multiple ranges. + /// + /// All ranges should be 1-based inclusive. + /// Overlapping or adjacent ranges will be merged. + pub fn from_ranges(ranges: Vec>) -> Self { + let mut result = Self::new(); + for range in ranges { + result.merge_range(range); + } + result + } + + /// Attempts to merge the new range with any existing ranges. + /// If no merge is possible, adds it as a new range. + fn merge_range(&mut self, new_range: Range) { + // First check if this range can be merged with any existing range + for range in &mut self.ranges { + // Check if ranges overlap or are adjacent + if new_range.start <= range.end && range.start <= new_range.end { + // Merge the ranges by taking the minimum start and maximum end + range.start = range.start.min(new_range.start); + range.end = range.end.max(new_range.end); + return; + } + } + // If no overlap found, add as new range + self.ranges.push(new_range); + } + + /// Convert the 1-based inclusive ranges to 0-based exclusive ranges. + /// + /// This is used internally by the blame algorithm to convert from git's line number format + /// to the internal format used for processing. + /// + /// # Errors + /// + /// Returns `Error::InvalidLineRange` if: + /// - Any range starts at 0 (must be 1-based) + /// - Any range extends beyond the file's length + /// - Any range has the same start and end + pub fn to_zero_based_exclusive(&self, max_lines: u32) -> Result>, Error> { + if self.ranges.is_empty() { + let range = 0..max_lines; + return Ok(vec![range]); + } + + let mut result = Vec::with_capacity(self.ranges.len()); + for range in &self.ranges { + if range.start == 0 { + return Err(Error::InvalidLineRange); + } + let start = range.start - 1; + let end = range.end; + if start >= max_lines || end > max_lines || start == end { + return Err(Error::InvalidLineRange); + } + result.push(start..end); + } + Ok(result) + } + + /// Returns true if no specific ranges are set (meaning blame entire file) + pub fn is_empty(&self) -> bool { + self.ranges.is_empty() + } +} /// Options to be passed to [`file()`](crate::file()). #[derive(Default, Debug, Clone)] pub struct Options { /// The algorithm to use for diffing. pub diff_algorithm: gix_diff::blob::Algorithm, - /// A 1-based inclusive range, in order to mirror `git`’s behaviour. `Some(20..40)` represents - /// 21 lines, spanning from line 20 up to and including line 40. This will be converted to - /// `19..40` internally as the algorithm uses 0-based ranges that are exclusive at the end. - pub range: Option>, + /// The ranges to blame in the file. + pub range: BlameRanges, /// Don't consider commits before the given date. pub since: Option, } diff --git a/gix-blame/tests/blame.rs b/gix-blame/tests/blame.rs index 2956d59b933..83f2ff510df 100644 --- a/gix-blame/tests/blame.rs +++ b/gix-blame/tests/blame.rs @@ -1,5 +1,6 @@ use std::path::PathBuf; +use gix_blame::BlameRanges; use gix_hash::ObjectId; use gix_object::bstr; @@ -193,7 +194,7 @@ macro_rules! mktest { format!("{}.txt", $case).as_str().into(), gix_blame::Options { diff_algorithm: gix_diff::blob::Algorithm::Histogram, - range: None, + range: BlameRanges::default(), since: None, }, )? @@ -264,7 +265,7 @@ fn diff_disparity() { format!("{case}.txt").as_str().into(), gix_blame::Options { diff_algorithm: gix_diff::blob::Algorithm::Histogram, - range: None, + range: BlameRanges::default(), since: None, }, ) @@ -296,7 +297,7 @@ fn line_range() { "simple.txt".into(), gix_blame::Options { diff_algorithm: gix_diff::blob::Algorithm::Histogram, - range: Some(1..2), + range: BlameRanges::from_range(1..2), since: None, }, ) @@ -327,7 +328,7 @@ fn since() { "simple.txt".into(), gix_blame::Options { diff_algorithm: gix_diff::blob::Algorithm::Histogram, - range: None, + range: BlameRanges::default(), since: Some(gix_date::parse("2025-01-31", None).unwrap()), }, ) @@ -342,6 +343,75 @@ fn since() { assert_eq!(lines_blamed, baseline); } +#[test] +fn multiple_ranges_using_add_range() { + let Fixture { + odb, + mut resource_cache, + suspect, + } = Fixture::new().unwrap(); + + let mut ranges = BlameRanges::new(); + ranges.add_range(1..2); // Lines 1-2 + ranges.add_range(1..1); // Duplicate range, should be ignored + ranges.add_range(4..4); // Line 4 + + let lines_blamed = gix_blame::file( + &odb, + suspect, + None, + &mut resource_cache, + "simple.txt".into(), + gix_blame::Options { + diff_algorithm: gix_diff::blob::Algorithm::Histogram, + range: ranges, + since: None, + }, + ) + .unwrap() + .entries; + + assert_eq!(lines_blamed.len(), 3); // Should have 3 lines total (2 from first range + 1 from second range) + + let git_dir = fixture_path().join(".git"); + let baseline = Baseline::collect(git_dir.join("simple-lines-multiple-1-2-and-4.baseline")).unwrap(); + + assert_eq!(lines_blamed, baseline); +} + +#[test] +fn multiple_ranges_usingfrom_ranges() { + let Fixture { + odb, + mut resource_cache, + suspect, + } = Fixture::new().unwrap(); + + let ranges = BlameRanges::from_ranges(vec![1..2, 1..1, 4..4]); + + let lines_blamed = gix_blame::file( + &odb, + suspect, + None, + &mut resource_cache, + "simple.txt".into(), + gix_blame::Options { + diff_algorithm: gix_diff::blob::Algorithm::Histogram, + range: ranges, + since: None, + }, + ) + .unwrap() + .entries; + + assert_eq!(lines_blamed.len(), 3); // Should have 3 lines total (2 from first range + 1 from second range) + + let git_dir = fixture_path().join(".git"); + let baseline = Baseline::collect(git_dir.join("simple-lines-multiple-1-2-and-4.baseline")).unwrap(); + + assert_eq!(lines_blamed, baseline); +} + fn fixture_path() -> PathBuf { gix_testtools::scripted_fixture_read_only("make_blame_repo.sh").unwrap() } diff --git a/gix-blame/tests/fixtures/make_blame_repo.sh b/gix-blame/tests/fixtures/make_blame_repo.sh index aa366230fff..fe5ca4f1af0 100755 --- a/gix-blame/tests/fixtures/make_blame_repo.sh +++ b/gix-blame/tests/fixtures/make_blame_repo.sh @@ -227,6 +227,7 @@ git merge branch-that-has-earlier-commit || true git blame --porcelain simple.txt > .git/simple.baseline git blame --porcelain -L 1,2 simple.txt > .git/simple-lines-1-2.baseline +git blame --porcelain -L 1,2 -L 4 simple.txt > .git/simple-lines-multiple-1-2-and-4.baseline git blame --porcelain --since 2025-01-31 simple.txt > .git/simple-since.baseline git blame --porcelain multiline-hunks.txt > .git/multiline-hunks.baseline git blame --porcelain deleted-lines.txt > .git/deleted-lines.baseline From 8143d692e51c8d1b3d8c2323e83676e1be122f13 Mon Sep 17 00:00:00 2001 From: Bart Dubbeldam Date: Sun, 27 Apr 2025 22:36:46 +0200 Subject: [PATCH 006/166] adapt to changes in `gix-blame` --- src/plumbing/main.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/plumbing/main.rs b/src/plumbing/main.rs index 7e858fd1d8a..68cf57afe21 100644 --- a/src/plumbing/main.rs +++ b/src/plumbing/main.rs @@ -11,7 +11,7 @@ use anyhow::{anyhow, Context, Result}; use clap::{CommandFactory, Parser}; use gitoxide_core as core; use gitoxide_core::{pack::verify, repository::PathsOrPatterns}; -use gix::bstr::{io::BufReadExt, BString}; +use gix::{bstr::{io::BufReadExt, BString}}; use crate::{ plumbing::{ @@ -1578,7 +1578,7 @@ pub fn main() -> Result<()> { &file, gix::blame::Options { diff_algorithm, - range, + range: range.map(BlameRanges::from_range).unwrap_or_default(), since, }, out, From 36a6ffeea7bbde7fb3689ddf2a107e09a50e602c Mon Sep 17 00:00:00 2001 From: Bart Dubbeldam Date: Sun, 27 Apr 2025 11:21:48 +0200 Subject: [PATCH 007/166] feat: add support for multiple blame ranges like `gix blame -L -L ...` Update the blame subcommand to handle multiple line ranges. This allows specifying multiple `-L` options similar to the usage of git. --- src/plumbing/main.rs | 4 ++-- src/plumbing/options/mod.rs | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/plumbing/main.rs b/src/plumbing/main.rs index 68cf57afe21..d0d69d0ca9d 100644 --- a/src/plumbing/main.rs +++ b/src/plumbing/main.rs @@ -1560,7 +1560,7 @@ pub fn main() -> Result<()> { Subcommands::Blame { statistics, file, - range, + ranges, since, } => prepare_and_run( "blame", @@ -1578,7 +1578,7 @@ pub fn main() -> Result<()> { &file, gix::blame::Options { diff_algorithm, - range: range.map(BlameRanges::from_range).unwrap_or_default(), + range: gix::blame::BlameRanges::from_ranges(ranges), since, }, out, diff --git a/src/plumbing/options/mod.rs b/src/plumbing/options/mod.rs index ab12f3f691b..fd8445c9b48 100644 --- a/src/plumbing/options/mod.rs +++ b/src/plumbing/options/mod.rs @@ -168,8 +168,8 @@ pub enum Subcommands { /// The file to create the blame information for. file: std::ffi::OsString, /// Only blame lines in the given 1-based inclusive range ',', e.g. '20,40'. - #[clap(short='L', value_parser=AsRange)] - range: Option>, + #[clap(short='L', value_parser=AsRange, action=clap::ArgAction::Append)] + ranges: Vec>, /// Don't consider commits before the given date. #[clap(long, value_parser=AsTime, value_name = "DATE")] since: Option, From d4461e700657d049a8cbc1552f328e35b27c92c3 Mon Sep 17 00:00:00 2001 From: Sebastian Thiel Date: Sun, 27 Apr 2025 22:10:25 +0200 Subject: [PATCH 008/166] refactor - cargo fmt - apply some IDE suggestions - partition tests more - run doc-tests - use RangeInclusive for a less confusing representation --- gix-blame/Cargo.toml | 3 - gix-blame/src/types.rs | 71 +++++++------- gix-blame/tests/blame.rs | 179 ++++++++++++++++++------------------ src/plumbing/main.rs | 2 +- src/plumbing/options/mod.rs | 2 +- src/shared.rs | 8 +- 6 files changed, 134 insertions(+), 131 deletions(-) diff --git a/gix-blame/Cargo.toml b/gix-blame/Cargo.toml index 9aaf563cbf9..6731854c123 100644 --- a/gix-blame/Cargo.toml +++ b/gix-blame/Cargo.toml @@ -10,9 +10,6 @@ authors = ["Christoph Rüßler ", "Sebastian Thi edition = "2021" rust-version = "1.70" -[lib] -doctest = false - [dependencies] gix-commitgraph = { version = "^0.28.0", path = "../gix-commitgraph" } gix-revwalk = { version = "^0.20.1", path = "../gix-revwalk" } diff --git a/gix-blame/src/types.rs b/gix-blame/src/types.rs index e8f7f5fc5f9..d60b723e598 100644 --- a/gix-blame/src/types.rs +++ b/gix-blame/src/types.rs @@ -1,18 +1,18 @@ +use gix_hash::ObjectId; +use gix_object::bstr::BString; +use smallvec::SmallVec; +use std::ops::RangeInclusive; use std::{ num::NonZeroU32, ops::{AddAssign, Range, SubAssign}, }; -use gix_hash::ObjectId; -use gix_object::bstr::BString; -use smallvec::SmallVec; - use crate::file::function::tokens_for_diffing; use crate::Error; /// A type to represent one or more line ranges to blame in a file. /// -/// This type handles the conversion between git's 1-based inclusive ranges and the internal +/// It handles the conversion between git's 1-based inclusive ranges and the internal /// 0-based exclusive ranges used by the blame algorithm. /// /// # Examples @@ -21,18 +21,18 @@ use crate::Error; /// use gix_blame::BlameRanges; /// /// // Blame lines 20 through 40 (inclusive) -/// let range = BlameRanges::from_range(20..41); +/// let range = BlameRanges::from_range(20..=40); /// /// // Blame multiple ranges /// let mut ranges = BlameRanges::new(); -/// ranges.add_range(1..5); // Lines 1-4 -/// ranges.add_range(10..15); // Lines 10-14 +/// ranges.add_range(1..=4); // Lines 1-4 +/// ranges.add_range(10..=14); // Lines 10-14 /// ``` /// /// # Line Number Representation /// /// This type uses 1-based inclusive ranges to mirror `git`'s behaviour: -/// - A range of `20..41` represents 21 lines, spanning from line 20 up to and including line 40 +/// - A range of `20..=40` represents 21 lines, spanning from line 20 up to and including line 40 /// - This will be converted to `19..40` internally as the algorithm uses 0-based ranges that are exclusive at the end /// /// # Empty Ranges @@ -43,59 +43,60 @@ use crate::Error; pub struct BlameRanges { /// The ranges to blame, stored as 1-based inclusive ranges /// An empty Vec means blame the entire file - ranges: Vec>, + ranges: Vec>, } +/// Lifecycle impl BlameRanges { /// Create a new empty BlameRanges instance. /// /// An empty instance means to blame the entire file. pub fn new() -> Self { - Self { ranges: Vec::new() } - } - - /// Add a single range to blame. - /// - /// The range should be 1-based inclusive. - /// If the new range overlaps with or is adjacent to an existing range, - /// they will be merged into a single range. - pub fn add_range(&mut self, new_range: Range) { - self.merge_range(new_range); + Self::default() } /// Create from a single range. /// - /// The range should be 1-based inclusive, similar to git's line number format. - pub fn from_range(range: Range) -> Self { + /// The range is 1-based, similar to git's line number format. + pub fn from_range(range: RangeInclusive) -> Self { Self { ranges: vec![range] } } /// Create from multiple ranges. /// - /// All ranges should be 1-based inclusive. + /// All ranges are 1-based. /// Overlapping or adjacent ranges will be merged. - pub fn from_ranges(ranges: Vec>) -> Self { + pub fn from_ranges(ranges: Vec>) -> Self { let mut result = Self::new(); for range in ranges { result.merge_range(range); } result } +} + +impl BlameRanges { + /// Add a single range to blame. + /// + /// The range should be 1-based inclusive. + /// If the new range overlaps with or is adjacent to an existing range, + /// they will be merged into a single range. + pub fn add_range(&mut self, new_range: RangeInclusive) { + self.merge_range(new_range); + } /// Attempts to merge the new range with any existing ranges. - /// If no merge is possible, adds it as a new range. - fn merge_range(&mut self, new_range: Range) { - // First check if this range can be merged with any existing range + /// If no merge is possible, add it as a new range. + fn merge_range(&mut self, new_range: RangeInclusive) { + // Check if this range can be merged with any existing range for range in &mut self.ranges { // Check if ranges overlap or are adjacent - if new_range.start <= range.end && range.start <= new_range.end { - // Merge the ranges by taking the minimum start and maximum end - range.start = range.start.min(new_range.start); - range.end = range.end.max(new_range.end); + if new_range.start() <= range.end() && range.start() <= new_range.end() { + *range = *range.start().min(new_range.start())..=*range.end().max(new_range.end()); return; } } - // If no overlap found, add as new range + // If no overlap found, add it as a new range self.ranges.push(new_range); } @@ -118,11 +119,11 @@ impl BlameRanges { let mut result = Vec::with_capacity(self.ranges.len()); for range in &self.ranges { - if range.start == 0 { + if *range.start() == 0 { return Err(Error::InvalidLineRange); } - let start = range.start - 1; - let end = range.end; + let start = range.start() - 1; + let end = *range.end(); if start >= max_lines || end > max_lines || start == end { return Err(Error::InvalidLineRange); } diff --git a/gix-blame/tests/blame.rs b/gix-blame/tests/blame.rs index 83f2ff510df..99e5105f6df 100644 --- a/gix-blame/tests/blame.rs +++ b/gix-blame/tests/blame.rs @@ -281,37 +281,6 @@ fn diff_disparity() { } } -#[test] -fn line_range() { - let Fixture { - odb, - mut resource_cache, - suspect, - } = Fixture::new().unwrap(); - - let lines_blamed = gix_blame::file( - &odb, - suspect, - None, - &mut resource_cache, - "simple.txt".into(), - gix_blame::Options { - diff_algorithm: gix_diff::blob::Algorithm::Histogram, - range: BlameRanges::from_range(1..2), - since: None, - }, - ) - .unwrap() - .entries; - - assert_eq!(lines_blamed.len(), 2); - - let git_dir = fixture_path().join(".git"); - let baseline = Baseline::collect(git_dir.join("simple-lines-1-2.baseline")).unwrap(); - - assert_eq!(lines_blamed, baseline); -} - #[test] fn since() { let Fixture { @@ -343,73 +312,109 @@ fn since() { assert_eq!(lines_blamed, baseline); } -#[test] -fn multiple_ranges_using_add_range() { - let Fixture { - odb, - mut resource_cache, - suspect, - } = Fixture::new().unwrap(); +mod blame_ranges { + use crate::{fixture_path, Baseline, Fixture}; + use gix_blame::BlameRanges; - let mut ranges = BlameRanges::new(); - ranges.add_range(1..2); // Lines 1-2 - ranges.add_range(1..1); // Duplicate range, should be ignored - ranges.add_range(4..4); // Line 4 + #[test] + fn line_range() { + let Fixture { + odb, + mut resource_cache, + suspect, + } = Fixture::new().unwrap(); - let lines_blamed = gix_blame::file( - &odb, - suspect, - None, - &mut resource_cache, - "simple.txt".into(), - gix_blame::Options { - diff_algorithm: gix_diff::blob::Algorithm::Histogram, - range: ranges, - since: None, - }, - ) - .unwrap() - .entries; + let lines_blamed = gix_blame::file( + &odb, + suspect, + None, + &mut resource_cache, + "simple.txt".into(), + gix_blame::Options { + diff_algorithm: gix_diff::blob::Algorithm::Histogram, + range: BlameRanges::from_range(1..=2), + since: None, + }, + ) + .unwrap() + .entries; - assert_eq!(lines_blamed.len(), 3); // Should have 3 lines total (2 from first range + 1 from second range) + assert_eq!(lines_blamed.len(), 2); - let git_dir = fixture_path().join(".git"); - let baseline = Baseline::collect(git_dir.join("simple-lines-multiple-1-2-and-4.baseline")).unwrap(); + let git_dir = fixture_path().join(".git"); + let baseline = Baseline::collect(git_dir.join("simple-lines-1-2.baseline")).unwrap(); - assert_eq!(lines_blamed, baseline); -} + assert_eq!(lines_blamed, baseline); + } -#[test] -fn multiple_ranges_usingfrom_ranges() { - let Fixture { - odb, - mut resource_cache, - suspect, - } = Fixture::new().unwrap(); + #[test] + fn multiple_ranges_using_add_range() { + let Fixture { + odb, + mut resource_cache, + suspect, + } = Fixture::new().unwrap(); - let ranges = BlameRanges::from_ranges(vec![1..2, 1..1, 4..4]); + let mut ranges = BlameRanges::new(); + ranges.add_range(1..=2); // Lines 1-2 + ranges.add_range(1..=1); // Duplicate range, should be ignored + ranges.add_range(4..=4); // Line 4 - let lines_blamed = gix_blame::file( - &odb, - suspect, - None, - &mut resource_cache, - "simple.txt".into(), - gix_blame::Options { - diff_algorithm: gix_diff::blob::Algorithm::Histogram, - range: ranges, - since: None, - }, - ) - .unwrap() - .entries; + let lines_blamed = gix_blame::file( + &odb, + suspect, + None, + &mut resource_cache, + "simple.txt".into(), + gix_blame::Options { + diff_algorithm: gix_diff::blob::Algorithm::Histogram, + range: ranges, + since: None, + }, + ) + .unwrap() + .entries; - assert_eq!(lines_blamed.len(), 3); // Should have 3 lines total (2 from first range + 1 from second range) + assert_eq!(lines_blamed.len(), 3); // Should have 3 lines total (2 from first range + 1 from second range) - let git_dir = fixture_path().join(".git"); - let baseline = Baseline::collect(git_dir.join("simple-lines-multiple-1-2-and-4.baseline")).unwrap(); + let git_dir = fixture_path().join(".git"); + let baseline = Baseline::collect(git_dir.join("simple-lines-multiple-1-2-and-4.baseline")).unwrap(); - assert_eq!(lines_blamed, baseline); + assert_eq!(lines_blamed, baseline); + } + + #[test] + fn multiple_ranges_usingfrom_ranges() { + let Fixture { + odb, + mut resource_cache, + suspect, + } = Fixture::new().unwrap(); + + let ranges = BlameRanges::from_ranges(vec![1..=2, 1..=1, 4..=4]); + + let lines_blamed = gix_blame::file( + &odb, + suspect, + None, + &mut resource_cache, + "simple.txt".into(), + gix_blame::Options { + diff_algorithm: gix_diff::blob::Algorithm::Histogram, + range: ranges, + since: None, + }, + ) + .unwrap() + .entries; + + assert_eq!(lines_blamed.len(), 3); // Should have 3 lines total (2 from first range + 1 from second range) + + let git_dir = fixture_path().join(".git"); + let baseline = Baseline::collect(git_dir.join("simple-lines-multiple-1-2-and-4.baseline")).unwrap(); + + assert_eq!(lines_blamed, baseline); + } } fn fixture_path() -> PathBuf { diff --git a/src/plumbing/main.rs b/src/plumbing/main.rs index d0d69d0ca9d..894b4e2031a 100644 --- a/src/plumbing/main.rs +++ b/src/plumbing/main.rs @@ -11,7 +11,7 @@ use anyhow::{anyhow, Context, Result}; use clap::{CommandFactory, Parser}; use gitoxide_core as core; use gitoxide_core::{pack::verify, repository::PathsOrPatterns}; -use gix::{bstr::{io::BufReadExt, BString}}; +use gix::bstr::{io::BufReadExt, BString}; use crate::{ plumbing::{ diff --git a/src/plumbing/options/mod.rs b/src/plumbing/options/mod.rs index fd8445c9b48..beab5743928 100644 --- a/src/plumbing/options/mod.rs +++ b/src/plumbing/options/mod.rs @@ -169,7 +169,7 @@ pub enum Subcommands { file: std::ffi::OsString, /// Only blame lines in the given 1-based inclusive range ',', e.g. '20,40'. #[clap(short='L', value_parser=AsRange, action=clap::ArgAction::Append)] - ranges: Vec>, + ranges: Vec>, /// Don't consider commits before the given date. #[clap(long, value_parser=AsTime, value_name = "DATE")] since: Option, diff --git a/src/shared.rs b/src/shared.rs index 765e9df6936..9dbbfc77790 100644 --- a/src/shared.rs +++ b/src/shared.rs @@ -413,7 +413,7 @@ mod clap { pub struct AsRange; impl TypedValueParser for AsRange { - type Value = std::ops::Range; + type Value = std::ops::RangeInclusive; fn parse_ref(&self, cmd: &Command, arg: Option<&Arg>, value: &OsStr) -> Result { StringValueParser::new() @@ -424,7 +424,7 @@ mod clap { let end = u32::from_str(end)?; if start <= end { - return Ok(start..end); + return Ok(start..=end); } } @@ -474,11 +474,11 @@ mod value_parser_tests { #[derive(Debug, clap::Parser)] pub struct Cmd { #[clap(long, short='l', value_parser = AsRange)] - pub arg: Option>, + pub arg: Option>, } let c = Cmd::parse_from(["cmd", "-l=1,10"]); - assert_eq!(c.arg, Some(1..10)); + assert_eq!(c.arg, Some(1..=10)); } #[test] From b40ba17c2f7d8c09181ab198c6b89bba976b727b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christoph=20R=C3=BC=C3=9Fler?= Date: Tue, 29 Apr 2025 14:11:40 +0200 Subject: [PATCH 009/166] feat: Add `commit::Either::commit_time()` --- gix-traverse/src/commit/mod.rs | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/gix-traverse/src/commit/mod.rs b/gix-traverse/src/commit/mod.rs index 35bca8f2b6a..027dc1d6a18 100644 --- a/gix-traverse/src/commit/mod.rs +++ b/gix-traverse/src/commit/mod.rs @@ -77,7 +77,7 @@ pub enum Either<'buf, 'cache> { } impl Either<'_, '_> { - /// Get a commits `tree_id` by either getting it from a [`gix_commitgraph::Graph`], if + /// Get a commit’s `tree_id` by either getting it from a [`gix_commitgraph::Graph`], if /// present, or a [`gix_object::CommitRefIter`] otherwise. pub fn tree_id(self) -> Result { match self { @@ -85,6 +85,15 @@ impl Either<'_, '_> { Self::CachedCommit(commit) => Ok(commit.root_tree_id().into()), } } + + /// Get a commit’s `commit_time` by either getting it from a [`gix_commitgraph::Graph`], if + /// present, or a [`gix_object::CommitRefIter`] otherwise. + pub fn commit_time(self) -> Result { + match self { + Self::CommitRefIter(commit_ref_iter) => commit_ref_iter.committer().map(|c| c.seconds()), + Self::CachedCommit(commit) => Ok(commit.committer_timestamp() as gix_date::SecondsSinceUnixEpoch), + } + } } /// Find information about a commit by either getting it from a [`gix_commitgraph::Graph`], if From f59a7946eda3c6bbdb2c5710eabf32df0b1ac63d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christoph=20R=C3=BC=C3=9Fler?= Date: Tue, 29 Apr 2025 14:12:39 +0200 Subject: [PATCH 010/166] Make use of `gix_traverse::commit::Either::commit_time()` This removes a local implementation of it. --- gix-blame/src/file/function.rs | 18 ++++-------------- 1 file changed, 4 insertions(+), 14 deletions(-) diff --git a/gix-blame/src/file/function.rs b/gix-blame/src/file/function.rs index 05293053231..76e8f68e4fe 100644 --- a/gix-blame/src/file/function.rs +++ b/gix-blame/src/file/function.rs @@ -106,8 +106,9 @@ pub fn file( let (mut buf, mut buf2) = (Vec::new(), Vec::new()); let commit = find_commit(cache.as_ref(), &odb, &suspect, &mut buf)?; - let mut queue: gix_revwalk::PriorityQueue = gix_revwalk::PriorityQueue::new(); - queue.insert(commit_time(commit)?, suspect); + let mut queue: gix_revwalk::PriorityQueue = + gix_revwalk::PriorityQueue::new(); + queue.insert(commit.commit_time()?, suspect); let mut out = Vec::new(); let mut diff_state = gix_diff::tree::State::default(); @@ -126,7 +127,7 @@ pub fn file( } let commit = find_commit(cache.as_ref(), &odb, &suspect, &mut buf)?; - let commit_time = commit_time(commit)?; + let commit_time = commit.commit_time()?; if let Some(since) = options.since { if commit_time < since.seconds { @@ -651,17 +652,6 @@ fn find_path_entry_in_commit( Ok(res.map(|e| e.oid)) } -type CommitTime = i64; - -fn commit_time(commit: gix_traverse::commit::Either<'_, '_>) -> Result { - match commit { - gix_traverse::commit::Either::CommitRefIter(commit_ref_iter) => { - commit_ref_iter.committer().map(|c| c.seconds()) - } - gix_traverse::commit::Either::CachedCommit(commit) => Ok(commit.committer_timestamp() as i64), - } -} - type ParentIds = SmallVec<[(gix_hash::ObjectId, i64); 2]>; fn collect_parents( From 9c3e2880f2996dde9bbdd0c83b498f831054e56f Mon Sep 17 00:00:00 2001 From: Sebastian Thiel Date: Tue, 29 Apr 2025 22:07:31 +0200 Subject: [PATCH 011/166] refactor - minor rewording of doc strings. --- gix-traverse/src/commit/mod.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gix-traverse/src/commit/mod.rs b/gix-traverse/src/commit/mod.rs index 027dc1d6a18..59c51e72c23 100644 --- a/gix-traverse/src/commit/mod.rs +++ b/gix-traverse/src/commit/mod.rs @@ -86,7 +86,7 @@ impl Either<'_, '_> { } } - /// Get a commit’s `commit_time` by either getting it from a [`gix_commitgraph::Graph`], if + /// Get a committer timestamp by either getting it from a [`gix_commitgraph::Graph`], if /// present, or a [`gix_object::CommitRefIter`] otherwise. pub fn commit_time(self) -> Result { match self { From 3ef6b5595f6d71d27a00b178fbe356257fe4b8a5 Mon Sep 17 00:00:00 2001 From: Sebastian Thiel Date: Tue, 29 Apr 2025 22:46:50 +0200 Subject: [PATCH 012/166] feat: add `EntryRef::kind()` as shortcut for `EntryRef::mode().kind()`. --- gix/src/object/tree/iter.rs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/gix/src/object/tree/iter.rs b/gix/src/object/tree/iter.rs index 572f0a71f90..7ea75fd6054 100644 --- a/gix/src/object/tree/iter.rs +++ b/gix/src/object/tree/iter.rs @@ -15,6 +15,11 @@ impl<'repo, 'a> EntryRef<'repo, 'a> { self.inner.mode } + /// The kind of object to which [`id()`][Self::id()] is pointing, as shortcut to [self.mode().kind()](Self::mode()). + pub fn kind(&self) -> gix_object::tree::EntryKind { + self.inner.mode.kind() + } + /// The name of the file in the parent tree. pub fn filename(&self) -> &gix_object::bstr::BStr { self.inner.filename From 4408166bf56197a67419277a4ef8feeba9060fee Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 1 May 2025 09:02:42 +0000 Subject: [PATCH 013/166] Bump the cargo group with 12 updates Bumps the cargo group with 12 updates: | Package | From | To | | --- | --- | --- | | [clap_complete](https://github.com/clap-rs/clap) | `4.5.47` | `4.5.48` | | [rustix](https://github.com/bytecodealliance/rustix) | `1.0.5` | `1.0.7` | | [syn](https://github.com/dtolnay/syn) | `2.0.100` | `2.0.101` | | [insta](https://github.com/mitsuhiko/insta) | `1.42.2` | `1.43.1` | | [async-executor](https://github.com/smol-rs/async-executor) | `1.13.1` | `1.13.2` | | [openssl-sys](https://github.com/sfackler/rust-openssl) | `0.9.107` | `0.9.108` | | [quinn-udp](https://github.com/quinn-rs/quinn) | `0.5.11` | `0.5.12` | | [synstructure](https://github.com/mystor/synstructure) | `0.13.1` | `0.13.2` | | [toml](https://github.com/toml-rs/toml) | `0.8.20` | `0.8.22` | | [toml_datetime](https://github.com/toml-rs/toml) | `0.6.8` | `0.6.9` | | [toml_edit](https://github.com/toml-rs/toml) | `0.22.24` | `0.22.26` | | [webpki-roots](https://github.com/rustls/webpki-roots) | `0.26.8` | `0.26.10` | Updates `clap_complete` from 4.5.47 to 4.5.48 - [Release notes](https://github.com/clap-rs/clap/releases) - [Changelog](https://github.com/clap-rs/clap/blob/master/CHANGELOG.md) - [Commits](https://github.com/clap-rs/clap/compare/clap_complete-v4.5.47...clap_complete-v4.5.48) Updates `rustix` from 1.0.5 to 1.0.7 - [Release notes](https://github.com/bytecodealliance/rustix/releases) - [Changelog](https://github.com/bytecodealliance/rustix/blob/main/CHANGES.md) - [Commits](https://github.com/bytecodealliance/rustix/compare/v1.0.5...v1.0.7) Updates `syn` from 2.0.100 to 2.0.101 - [Release notes](https://github.com/dtolnay/syn/releases) - [Commits](https://github.com/dtolnay/syn/compare/2.0.100...2.0.101) Updates `insta` from 1.42.2 to 1.43.1 - [Release notes](https://github.com/mitsuhiko/insta/releases) - [Changelog](https://github.com/mitsuhiko/insta/blob/master/CHANGELOG.md) - [Commits](https://github.com/mitsuhiko/insta/compare/1.42.2...1.43.1) Updates `async-executor` from 1.13.1 to 1.13.2 - [Release notes](https://github.com/smol-rs/async-executor/releases) - [Changelog](https://github.com/smol-rs/async-executor/blob/master/CHANGELOG.md) - [Commits](https://github.com/smol-rs/async-executor/compare/v1.13.1...v1.13.2) Updates `openssl-sys` from 0.9.107 to 0.9.108 - [Release notes](https://github.com/sfackler/rust-openssl/releases) - [Commits](https://github.com/sfackler/rust-openssl/compare/openssl-sys-v0.9.107...openssl-sys-v0.9.108) Updates `quinn-udp` from 0.5.11 to 0.5.12 - [Release notes](https://github.com/quinn-rs/quinn/releases) - [Commits](https://github.com/quinn-rs/quinn/compare/quinn-udp-0.5.11...quinn-udp-0.5.12) Updates `synstructure` from 0.13.1 to 0.13.2 - [Commits](https://github.com/mystor/synstructure/commits) Updates `toml` from 0.8.20 to 0.8.22 - [Commits](https://github.com/toml-rs/toml/compare/toml-v0.8.20...toml-v0.8.22) Updates `toml_datetime` from 0.6.8 to 0.6.9 - [Commits](https://github.com/toml-rs/toml/compare/toml_datetime-v0.6.8...toml_datetime-v0.6.9) Updates `toml_edit` from 0.22.24 to 0.22.26 - [Commits](https://github.com/toml-rs/toml/compare/v0.22.24...v0.22.26) Updates `webpki-roots` from 0.26.8 to 0.26.10 - [Release notes](https://github.com/rustls/webpki-roots/releases) - [Commits](https://github.com/rustls/webpki-roots/compare/v/0.26.8...v/0.26.10) --- updated-dependencies: - dependency-name: clap_complete dependency-version: 4.5.48 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: cargo - dependency-name: rustix dependency-version: 1.0.7 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: cargo - dependency-name: syn dependency-version: 2.0.101 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: cargo - dependency-name: insta dependency-version: 1.43.1 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: cargo - dependency-name: async-executor dependency-version: 1.13.2 dependency-type: indirect update-type: version-update:semver-patch dependency-group: cargo - dependency-name: openssl-sys dependency-version: 0.9.108 dependency-type: indirect update-type: version-update:semver-patch dependency-group: cargo - dependency-name: quinn-udp dependency-version: 0.5.12 dependency-type: indirect update-type: version-update:semver-patch dependency-group: cargo - dependency-name: synstructure dependency-version: 0.13.2 dependency-type: indirect update-type: version-update:semver-patch dependency-group: cargo - dependency-name: toml dependency-version: 0.8.22 dependency-type: indirect update-type: version-update:semver-patch dependency-group: cargo - dependency-name: toml_datetime dependency-version: 0.6.9 dependency-type: indirect update-type: version-update:semver-patch dependency-group: cargo - dependency-name: toml_edit dependency-version: 0.22.26 dependency-type: indirect update-type: version-update:semver-patch dependency-group: cargo - dependency-name: webpki-roots dependency-version: 0.26.10 dependency-type: indirect update-type: version-update:semver-patch dependency-group: cargo ... Signed-off-by: dependabot[bot] --- Cargo.lock | 160 +++++++++++++++------------------- Cargo.toml | 2 +- gix-diff/tests/Cargo.toml | 2 +- gix-index/Cargo.toml | 2 +- gix-prompt/Cargo.toml | 2 +- gix-ref/tests/Cargo.toml | 2 +- gix-traverse/tests/Cargo.toml | 2 +- gix/Cargo.toml | 2 +- 8 files changed, 77 insertions(+), 97 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index d09e41872ae..c9c3de2b29b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -177,14 +177,15 @@ dependencies = [ [[package]] name = "async-executor" -version = "1.13.1" +version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30ca9a001c1e8ba5149f91a74362376cc6bc5b919d92d988668657bd570bdcec" +checksum = "bb812ffb58524bdd10860d7d974e2f01cc0950c2438a74ee5ec2e2280c6c4ffa" dependencies = [ "async-task", "concurrent-queue", "fastrand", "futures-lite", + "pin-project-lite", "slab", ] @@ -285,7 +286,7 @@ checksum = "e539d3fca749fcee5236ab05e93a52867dd549cc157c8cb7f99595f3cedffdb5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -363,7 +364,7 @@ dependencies = [ "regex", "rustc-hash 1.1.0", "shlex", - "syn 2.0.100", + "syn 2.0.101", "which", ] @@ -569,9 +570,9 @@ dependencies = [ [[package]] name = "clap_complete" -version = "4.5.47" +version = "4.5.48" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c06f5378ea264ad4f82bbc826628b5aad714a75abf6ece087e923010eb937fb6" +checksum = "be8c97f3a6f02b9e24cadc12aaba75201d18754b53ea0a9d99642f806ccdb4c9" dependencies = [ "clap", ] @@ -585,7 +586,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -926,7 +927,7 @@ checksum = "30542c1ad912e0e3d22a1935c290e12e8a29d704a420177a31faad4a601a0800" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -953,7 +954,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -2050,7 +2051,7 @@ dependencies = [ "itoa", "libc", "memmap2", - "rustix 1.0.5", + "rustix 1.0.7", "serde", "smallvec", "thiserror 2.0.12", @@ -2079,7 +2080,7 @@ dependencies = [ "itoa", "libc", "memmap2", - "rustix 1.0.5", + "rustix 1.0.7", "smallvec", "thiserror 2.0.12", ] @@ -2129,7 +2130,7 @@ version = "0.1.5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", "trybuild", ] @@ -2411,7 +2412,7 @@ dependencies = [ "gix-config-value", "gix-testtools", "parking_lot", - "rustix 1.0.5", + "rustix 1.0.7", "serial_test", "thiserror 2.0.12", ] @@ -3375,7 +3376,7 @@ checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -3420,14 +3421,12 @@ dependencies = [ [[package]] name = "insta" -version = "1.42.2" +version = "1.43.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50259abbaa67d11d2bcafc7ba1d094ed7a0c70e3ce893f0d0997f73558cb3084" +checksum = "154934ea70c58054b556dd430b99a98c2a7ff5309ac9891597e339b5c28f4371" dependencies = [ "console", - "linked-hash-map", "once_cell", - "pin-project", "similar", ] @@ -3556,7 +3555,7 @@ checksum = "199b7932d97e325aff3a7030e141eafe7f2c6268e1d1b24859b753a627f45254" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -3683,7 +3682,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc2f4eb4bc735547cfed7c0a4922cbd04a4655978c09b54f1f7b228750664c34" dependencies = [ "cfg-if", - "windows-targets 0.52.6", + "windows-targets 0.48.5", ] [[package]] @@ -3729,12 +3728,6 @@ dependencies = [ "vcpkg", ] -[[package]] -name = "linked-hash-map" -version = "0.5.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" - [[package]] name = "linux-raw-sys" version = "0.4.15" @@ -3812,7 +3805,7 @@ checksum = "5cf92c10c7e361d6b99666ec1c6f9805b0bea2c3bd8c78dc6fe98ac5bd78db11" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -4034,7 +4027,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -4045,9 +4038,9 @@ checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" [[package]] name = "openssl-sys" -version = "0.9.107" +version = "0.9.108" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8288979acd84749c744a9014b4382d42b8f7b2592847b5afb2ed29e5d16ede07" +checksum = "e145e1651e858e820e4860f7b9c5e169bc1d8ce1c86043be79fa7b7634821847" dependencies = [ "cc", "libc", @@ -4114,26 +4107,6 @@ version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b687ff7b5da449d39e418ad391e5e08da53ec334903ddbb921db208908fc372c" -[[package]] -name = "pin-project" -version = "1.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677f1add503faace112b9f1373e43e9e054bfdd22ff1a63c1bc485eaec6a6a8a" -dependencies = [ - "pin-project-internal", -] - -[[package]] -name = "pin-project-internal" -version = "1.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.100", -] - [[package]] name = "pin-project-lite" version = "0.2.16" @@ -4247,7 +4220,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "664ec5419c51e34154eec046ebcba56312d5a2fc3b09a06da188e1ad21afadf6" dependencies = [ "proc-macro2", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -4333,9 +4306,9 @@ dependencies = [ [[package]] name = "quinn-udp" -version = "0.5.11" +version = "0.5.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "541d0f57c6ec747a90738a52741d3221f7960e8ac2f0ff4b1a63680e033b4ab5" +checksum = "ee4e529991f949c5e25755532370b8af5d114acae52326361d68d47af64aa842" dependencies = [ "cfg_aliases", "libc", @@ -4578,9 +4551,9 @@ dependencies = [ [[package]] name = "rustix" -version = "1.0.5" +version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d97817398dd4bb2e6da002002db259209759911da105da92bec29ccb12cf58bf" +checksum = "c71e83d6afe7ff64890ec6b71d6a69bb8a610ab78ce364b3352876bb4c801266" dependencies = [ "bitflags 2.9.0", "errno", @@ -4793,7 +4766,7 @@ checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -4851,7 +4824,7 @@ checksum = "5d69265a08751de7844521fd15003ae0a888e035773ba05695c5c759a6f89eef" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -4973,7 +4946,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d904e7009df136af5297832a3ace3370cd14ff1546a232f4f185036c2736fcac" dependencies = [ "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -5013,7 +4986,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -5041,9 +5014,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.100" +version = "2.0.101" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b09a44accad81e1ba1cd74a32461ba89dee89095ba17b32f5d03683b1b1fc2a0" +checksum = "8ce2b7fc941b3a24138a0a7cf8e858bfc6a992e7978a068a5c760deb0ed43caf" dependencies = [ "proc-macro2", "quote", @@ -5061,13 +5034,13 @@ dependencies = [ [[package]] name = "synstructure" -version = "0.13.1" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -5130,7 +5103,7 @@ dependencies = [ "fastrand", "getrandom 0.3.2", "once_cell", - "rustix 1.0.5", + "rustix 1.0.7", "windows-sys 0.59.0", ] @@ -5149,7 +5122,7 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "45c6481c4829e4cc63825e62c49186a34538b7b2750b73b266581ffb612fb5ed" dependencies = [ - "rustix 1.0.5", + "rustix 1.0.7", "windows-sys 0.59.0", ] @@ -5185,7 +5158,7 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -5196,7 +5169,7 @@ checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -5294,9 +5267,9 @@ dependencies = [ [[package]] name = "toml" -version = "0.8.20" +version = "0.8.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd87a5cdd6ffab733b2f74bc4fd7ee5fff6634124999ac278c35fc78c6120148" +checksum = "05ae329d1f08c4d17a59bed7ff5b5a769d062e64a62d34a3261b219e62cd5aae" dependencies = [ "serde", "serde_spanned", @@ -5306,26 +5279,33 @@ dependencies = [ [[package]] name = "toml_datetime" -version = "0.6.8" +version = "0.6.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" +checksum = "3da5db5a963e24bc68be8b17b6fa82814bb22ee8660f192bb182771d498f09a3" dependencies = [ "serde", ] [[package]] name = "toml_edit" -version = "0.22.24" +version = "0.22.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17b4795ff5edd201c7cd6dca065ae59972ce77d1b80fa0a84d94950ece7d1474" +checksum = "310068873db2c5b3e7659d2cc35d21855dbafa50d1ce336397c666e3cb08137e" dependencies = [ "indexmap", "serde", "serde_spanned", "toml_datetime", + "toml_write", "winnow", ] +[[package]] +name = "toml_write" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfb942dfe1d8e29a7ee7fcbde5bd2b9a25fb89aa70caea2eba3bee836ff41076" + [[package]] name = "tower" version = "0.5.2" @@ -5372,7 +5352,7 @@ checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -5630,7 +5610,7 @@ dependencies = [ "log", "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", "wasm-bindgen-shared", ] @@ -5665,7 +5645,7 @@ checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -5701,9 +5681,9 @@ dependencies = [ [[package]] name = "webpki-roots" -version = "0.26.8" +version = "0.26.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2210b291f7ea53617fbafcc4939f10914214ec15aace5ba62293a668f322c5c9" +checksum = "37493cadf42a2a939ed404698ded7fb378bf301b5011f973361779a3a74f8c93" dependencies = [ "rustls-pki-types", ] @@ -5742,7 +5722,7 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" dependencies = [ - "windows-sys 0.59.0", + "windows-sys 0.48.0", ] [[package]] @@ -5835,7 +5815,7 @@ checksum = "9107ddc059d5b6fbfbffdfa7a7fe3e22a226def0b2608f72e9d552763d3e1ad7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -5846,7 +5826,7 @@ checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -5857,7 +5837,7 @@ checksum = "29bee4b38ea3cde66011baa44dba677c432a78593e202392d1e9070cf2a7fca7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -5868,7 +5848,7 @@ checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -6250,7 +6230,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0d65cbf2f12c15564212d48f4e3dfb87923d25d611f2aed18f4cb23f0413d89e" dependencies = [ "libc", - "rustix 1.0.5", + "rustix 1.0.7", ] [[package]] @@ -6288,7 +6268,7 @@ checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", "synstructure", ] @@ -6318,7 +6298,7 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -6329,7 +6309,7 @@ checksum = "6352c01d0edd5db859a63e2605f4ea3183ddbd15e2c4a9e7d32184df75e4f154" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -6349,7 +6329,7 @@ checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", "synstructure", ] @@ -6378,7 +6358,7 @@ checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index ca10fdaaaaf..559c4367fe2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -156,7 +156,7 @@ gix-features = { version = "^0.42.1", path = "gix-features" } gix = { version = "^0.72.1", path = "gix", default-features = false } clap = { version = "4.5.37", features = ["derive", "cargo"] } -clap_complete = "4.5.47" +clap_complete = "4.5.48" prodash = { version = "29.0.2", optional = true } is-terminal = { version = "0.4.0", optional = true } env_logger = { version = "0.11.8", default-features = false } diff --git a/gix-diff/tests/Cargo.toml b/gix-diff/tests/Cargo.toml index 892ed4dfa22..2485ee5e60d 100644 --- a/gix-diff/tests/Cargo.toml +++ b/gix-diff/tests/Cargo.toml @@ -29,6 +29,6 @@ gix-filter = { path = "../../gix-filter" } gix-traverse = { path = "../../gix-traverse" } gix-testtools = { path = "../../tests/tools" } -insta = "1.40.0" +insta = "1.43.1" shell-words = "1" pretty_assertions = "1.4.0" diff --git a/gix-index/Cargo.toml b/gix-index/Cargo.toml index 622e2ce197f..4d6458780d2 100644 --- a/gix-index/Cargo.toml +++ b/gix-index/Cargo.toml @@ -51,7 +51,7 @@ bitflags = "2" document-features = { version = "0.2.0", optional = true } [target.'cfg(not(windows))'.dependencies] -rustix = { version = "1.0.5", default-features = false, features = [ +rustix = { version = "1.0.7", default-features = false, features = [ "std", "fs", ] } diff --git a/gix-prompt/Cargo.toml b/gix-prompt/Cargo.toml index 19a6b56d5b2..8abda1c8014 100644 --- a/gix-prompt/Cargo.toml +++ b/gix-prompt/Cargo.toml @@ -21,7 +21,7 @@ gix-config-value = { version = "^0.15.0", path = "../gix-config-value" } thiserror = "2.0.0" [target.'cfg(unix)'.dependencies] -rustix = { version = "1.0.5", features = ["termios"] } +rustix = { version = "1.0.7", features = ["termios"] } parking_lot = "0.12.1" [dev-dependencies] diff --git a/gix-ref/tests/Cargo.toml b/gix-ref/tests/Cargo.toml index 9ec1578b984..ee88ea4fedd 100644 --- a/gix-ref/tests/Cargo.toml +++ b/gix-ref/tests/Cargo.toml @@ -32,4 +32,4 @@ gix-hash = { path = "../../gix-hash" } gix-validate = { path = "../../gix-validate" } gix-lock = { path = "../../gix-lock" } gix-object = { path = "../../gix-object" } -insta = "1.42.1" +insta = "1.43.1" diff --git a/gix-traverse/tests/Cargo.toml b/gix-traverse/tests/Cargo.toml index 12227e0b393..029c4dba5ec 100644 --- a/gix-traverse/tests/Cargo.toml +++ b/gix-traverse/tests/Cargo.toml @@ -15,7 +15,7 @@ name = "traverse" path = "traverse/main.rs" [dev-dependencies] -insta = "1.40.0" +insta = "1.43.1" gix-traverse = { path = ".." } gix-testtools = { path = "../../tests/tools" } gix-odb = { path = "../../gix-odb" } diff --git a/gix/Cargo.toml b/gix/Cargo.toml index cc7156538ca..fb447cf5bfa 100644 --- a/gix/Cargo.toml +++ b/gix/Cargo.toml @@ -404,7 +404,7 @@ walkdir = "2.3.2" serial_test = { version = "3.1.0", default-features = false } async-std = { version = "1.12.0", features = ["attributes"] } termtree = "0.5.1" -insta = "1.40.0" +insta = "1.43.1" [package.metadata.docs.rs] features = [ From 2d2365e605e568e88e0c01917a12de4e7fd724f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christoph=20R=C3=BC=C3=9Fler?= Date: Thu, 1 May 2025 11:56:54 +0200 Subject: [PATCH 014/166] Remove obsolete comment --- gix-blame/src/file/function.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/gix-blame/src/file/function.rs b/gix-blame/src/file/function.rs index 76e8f68e4fe..fbbb5c4248f 100644 --- a/gix-blame/src/file/function.rs +++ b/gix-blame/src/file/function.rs @@ -401,7 +401,6 @@ fn coalesce_blame_entries(lines_blamed: Vec) -> Vec { // As of 2024-09-19, the check below only is in `git`, but not in `libgit2`. && previous_source_range.end == current_source_range.start { - // let combined_range = let coalesced_entry = BlameEntry { start_in_blamed_file: previous_blamed_range.start as u32, start_in_source_file: previous_source_range.start as u32, From 4423cae45570f73a11ca34867794c5a05c342524 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christoph=20R=C3=BC=C3=9Fler?= Date: Thu, 1 May 2025 11:58:05 +0200 Subject: [PATCH 015/166] Make mutation more idiomatic --- gix-blame/src/file/mod.rs | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/gix-blame/src/file/mod.rs b/gix-blame/src/file/mod.rs index bbca9681837..7470d71e037 100644 --- a/gix-blame/src/file/mod.rs +++ b/gix-blame/src/file/mod.rs @@ -357,10 +357,8 @@ fn process_changes( impl UnblamedHunk { fn shift_by(mut self, suspect: ObjectId, offset: Offset) -> Self { - if let Some(position) = self.suspects.iter().position(|entry| entry.0 == suspect) { - if let Some((_, ref mut range_in_suspect)) = self.suspects.get_mut(position) { - *range_in_suspect = range_in_suspect.shift_by(offset); - } + if let Some(entry) = self.suspects.iter_mut().find(|entry| entry.0 == suspect) { + entry.1 = entry.1.shift_by(offset); } self } @@ -407,20 +405,16 @@ impl UnblamedHunk { /// This is like [`Self::pass_blame()`], but easier to use in places where the 'passing' is /// done 'inline'. fn passed_blame(mut self, from: ObjectId, to: ObjectId) -> Self { - if let Some(position) = self.suspects.iter().position(|entry| entry.0 == from) { - if let Some((ref mut commit_id, _)) = self.suspects.get_mut(position) { - *commit_id = to; - } + if let Some(entry) = self.suspects.iter_mut().find(|entry| entry.0 == from) { + entry.0 = to; } self } /// Transfer all ranges from the commit at `from` to the commit at `to`. fn pass_blame(&mut self, from: ObjectId, to: ObjectId) { - if let Some(position) = self.suspects.iter().position(|entry| entry.0 == from) { - if let Some((ref mut commit_id, _)) = self.suspects.get_mut(position) { - *commit_id = to; - } + if let Some(entry) = self.suspects.iter_mut().find(|entry| entry.0 == from) { + entry.0 = to; } } From f3a4ad6d8219f418ae0ee56a43f38702673f2bdd Mon Sep 17 00:00:00 2001 From: Eliah Kagan Date: Thu, 1 May 2025 01:54:28 -0400 Subject: [PATCH 016/166] Add CDLA-Permissive-2.0 license to `cargo deny` allowlist The newly listed license is permissive. Specifically: - https://cdla.dev/permissive-2-0/ - https://spdx.org/licenses/CDLA-Permissive-2.0.html It is newly used by `webpki-roots` for data that were formerly marked as being licensed under MPL-2.0. For full details, see: - https://github.com/rustls/webpki-roots/releases/tag/v%2F0.26.9 - https://github.com/rustls/webpki-roots/pull/88 - https://github.com/mozilla/www.ccadb.org/issues/188 MPL-2.0 is not delisted, as we still need it at least for `uluru`. --- deny.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/deny.toml b/deny.toml index eb328f3d68b..6dbb3089723 100644 --- a/deny.toml +++ b/deny.toml @@ -25,6 +25,7 @@ allow = [ "Apache-2.0", "BSD-3-Clause", "BSL-1.0", + "CDLA-Permissive-2.0", "MIT", "MIT-0", "ISC", From 3a5068eb3f9e112cf21c4c6a8bd17aa3081c5edf Mon Sep 17 00:00:00 2001 From: Sebastian Thiel Date: Fri, 2 May 2025 15:17:13 +0200 Subject: [PATCH 017/166] feat: add `tree::EntryRef::to_owned()`. That way it's in a more reasonable spot as sibling to `Entry` and it's clearer how to convert noe into the other. --- gix/src/object/tree/{iter.rs => entry.rs} | 67 ++++++++++++++++------ gix/src/object/tree/mod.rs | 68 +++++++---------------- 2 files changed, 71 insertions(+), 64 deletions(-) rename gix/src/object/tree/{iter.rs => entry.rs} (54%) diff --git a/gix/src/object/tree/iter.rs b/gix/src/object/tree/entry.rs similarity index 54% rename from gix/src/object/tree/iter.rs rename to gix/src/object/tree/entry.rs index 7ea75fd6054..16085f14d95 100644 --- a/gix/src/object/tree/iter.rs +++ b/gix/src/object/tree/entry.rs @@ -1,12 +1,45 @@ -use super::Tree; -use crate::Repository; - -/// An entry within a tree -pub struct EntryRef<'repo, 'a> { - /// The actual entry ref we are wrapping. - pub inner: gix_object::tree::EntryRef<'a>, - /// The owning repository. - pub repo: &'repo Repository, +use crate::object::tree::EntryRef; +use crate::{bstr::BStr, ext::ObjectIdExt, object::tree::Entry}; + +/// Access +impl<'repo> Entry<'repo> { + /// The kind of object to which `oid` is pointing to. + pub fn mode(&self) -> gix_object::tree::EntryMode { + self.inner.mode + } + + /// The name of the file in the parent tree. + pub fn filename(&self) -> &BStr { + self.inner.filename.as_ref() + } + + /// Return the object id of the entry. + pub fn id(&self) -> crate::Id<'repo> { + self.inner.oid.attach(self.repo) + } + + /// Return the object this entry points to. + pub fn object(&self) -> Result, crate::object::find::existing::Error> { + self.id().object() + } + + /// Return the plain object id of this entry, without access to the repository. + pub fn oid(&self) -> &gix_hash::oid { + &self.inner.oid + } + + /// Return the plain object id of this entry, without access to the repository. + pub fn object_id(&self) -> gix_hash::ObjectId { + self.inner.oid + } +} + +/// Consuming +impl Entry<'_> { + /// Return the contained object. + pub fn detach(self) -> gix_object::tree::Entry { + self.inner + } } impl<'repo, 'a> EntryRef<'repo, 'a> { @@ -49,6 +82,14 @@ impl<'repo, 'a> EntryRef<'repo, 'a> { pub fn detach(&self) -> gix_object::tree::EntryRef<'a> { self.inner } + + /// Create an instance that doesn't bind to a buffer anymore (but that still contains a repository reference). + pub fn to_owned(&self) -> Entry<'repo> { + Entry { + inner: self.inner.into(), + repo: self.repo, + } + } } impl std::fmt::Display for EntryRef<'_, '_> { @@ -63,11 +104,3 @@ impl std::fmt::Display for EntryRef<'_, '_> { ) } } - -impl<'repo> Tree<'repo> { - /// Return an iterator over tree entries to obtain information about files and directories this tree contains. - pub fn iter(&self) -> impl Iterator, gix_object::decode::Error>> { - let repo = self.repo; - gix_object::TreeRefIter::from_bytes(&self.data).map(move |e| e.map(|entry| EntryRef { inner: entry, repo })) - } -} diff --git a/gix/src/object/tree/mod.rs b/gix/src/object/tree/mod.rs index c7ea8ec1794..aa8a0aa253d 100644 --- a/gix/src/object/tree/mod.rs +++ b/gix/src/object/tree/mod.rs @@ -2,7 +2,7 @@ use gix_hash::ObjectId; pub use gix_object::tree::{EntryKind, EntryMode}; use gix_object::{bstr::BStr, FindExt, TreeRefIter}; -use crate::{object::find, Id, ObjectDetached, Tree}; +use crate::{object::find, Id, ObjectDetached, Repository, Tree}; /// All state needed to conveniently edit a tree, using only [update-or-insert](Editor::upsert()) and [removals](Editor::remove()). #[cfg(feature = "tree-editor")] @@ -185,8 +185,17 @@ pub mod diff; pub mod traverse; /// -mod iter; -pub use iter::EntryRef; +mod iter { + use super::{EntryRef, Tree}; + + impl<'repo> Tree<'repo> { + /// Return an iterator over tree entries to obtain information about files and directories this tree contains. + pub fn iter(&self) -> impl Iterator, gix_object::decode::Error>> { + let repo = self.repo; + gix_object::TreeRefIter::from_bytes(&self.data).map(move |e| e.map(|entry| EntryRef { inner: entry, repo })) + } + } +} impl std::fmt::Debug for Tree<'_> { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { @@ -194,6 +203,14 @@ impl std::fmt::Debug for Tree<'_> { } } +/// An entry within a tree +pub struct EntryRef<'repo, 'a> { + /// The actual entry ref we are wrapping. + pub inner: gix_object::tree::EntryRef<'a>, + /// The owning repository. + pub repo: &'repo Repository, +} + /// An entry in a [`Tree`], similar to an entry in a directory. #[derive(PartialEq, Debug, Clone)] pub struct Entry<'repo> { @@ -202,50 +219,7 @@ pub struct Entry<'repo> { pub repo: &'repo crate::Repository, } -mod entry { - use crate::{bstr::BStr, ext::ObjectIdExt, object::tree::Entry}; - - /// Access - impl<'repo> Entry<'repo> { - /// The kind of object to which `oid` is pointing to. - pub fn mode(&self) -> gix_object::tree::EntryMode { - self.inner.mode - } - - /// The name of the file in the parent tree. - pub fn filename(&self) -> &BStr { - self.inner.filename.as_ref() - } - - /// Return the object id of the entry. - pub fn id(&self) -> crate::Id<'repo> { - self.inner.oid.attach(self.repo) - } - - /// Return the object this entry points to. - pub fn object(&self) -> Result, crate::object::find::existing::Error> { - self.id().object() - } - - /// Return the plain object id of this entry, without access to the repository. - pub fn oid(&self) -> &gix_hash::oid { - &self.inner.oid - } - - /// Return the plain object id of this entry, without access to the repository. - pub fn object_id(&self) -> gix_hash::ObjectId { - self.inner.oid - } - } - - /// Consuming - impl Entry<'_> { - /// Return the contained object. - pub fn detach(self) -> gix_object::tree::Entry { - self.inner - } - } -} +mod entry; mod _impls { use crate::Tree; From dbf65c95644e6a134e7f9b75e7871479720b4deb Mon Sep 17 00:00:00 2001 From: Sebastian Thiel Date: Fri, 2 May 2025 15:31:34 +0200 Subject: [PATCH 018/166] thanks clippy --- gitoxide-core/src/hours/core.rs | 10 +++++---- gitoxide-core/src/hours/mod.rs | 22 +++++++++++-------- gitoxide-core/src/index/checkout.rs | 13 ++++++----- gitoxide-core/src/repository/clean.rs | 2 +- gitoxide-core/src/repository/config.rs | 16 +++++++++----- gix-diff/tests/diff/blob/platform.rs | 12 +++++----- gix-odb/src/store_impls/dynamic/load_index.rs | 16 +++++++++----- gix-path/src/env/auxiliary.rs | 8 +++---- gix-pathspec/src/pattern.rs | 6 ++++- gix-protocol/tests/protocol/fetch/response.rs | 6 ++++- gix-protocol/tests/protocol/fetch/v1.rs | 6 ++++- gix-transport/src/client/blocking_io/file.rs | 8 ++++--- tests/tools/src/lib.rs | 9 ++++---- 13 files changed, 83 insertions(+), 51 deletions(-) diff --git a/gitoxide-core/src/hours/core.rs b/gitoxide-core/src/hours/core.rs index 110fc24d983..f76e46e31a2 100644 --- a/gitoxide-core/src/hours/core.rs +++ b/gitoxide-core/src/hours/core.rs @@ -44,8 +44,8 @@ pub fn estimate_hours( }; let author = &commits[0].1; - let (files, lines) = (!stats.is_empty()) - .then(|| { + let (files, lines) = if !stats.is_empty() { + { commits .iter() .map(|t| &t.0) @@ -60,8 +60,10 @@ pub fn estimate_hours( } Err(_) => acc, }) - }) - .unwrap_or_default(); + } + } else { + Default::default() + }; WorkByEmail { name: author.name, email: author.email, diff --git a/gitoxide-core/src/hours/mod.rs b/gitoxide-core/src/hours/mod.rs index f8b16887073..bdc4f585839 100644 --- a/gitoxide-core/src/hours/mod.rs +++ b/gitoxide-core/src/hours/mod.rs @@ -113,8 +113,8 @@ where Ok(out) }); - let (stats_progresses, stats_counters) = needs_stats - .then(|| { + let (stats_progresses, stats_counters) = if needs_stats { + { let mut sp = progress.add_child("extract stats"); sp.init(None, progress::count("commits")); let sc = sp.counter(); @@ -128,14 +128,16 @@ where let lc = lp.counter(); (Some((sp, cp, lp)), Some((sc, cc, lc))) - }) - .unwrap_or_default(); + } + } else { + Default::default() + }; let mut progress = progress.add_child("traverse commit graph"); progress.init(None, progress::count("commits")); - let (tx_tree_id, stat_threads) = needs_stats - .then(|| { + let (tx_tree_id, stat_threads) = if needs_stats { + { let (tx, threads) = spawn_tree_delta_threads( scope, threads, @@ -144,8 +146,10 @@ where stats_counters.clone().expect("counters are set"), ); (Some(tx), threads) - }) - .unwrap_or_default(); + } + } else { + Default::default() + }; let mut commit_idx = 0_u32; let mut skipped_merge_commits = 0; @@ -296,7 +300,7 @@ where total_hours, total_hours / HOURS_PER_WORKDAY, total_commits, - is_shallow.then_some(" (shallow)").unwrap_or_default(), + if is_shallow { " (shallow)" } else { Default::default() }, num_authors )?; if file_stats { diff --git a/gitoxide-core/src/index/checkout.rs b/gitoxide-core/src/index/checkout.rs index 7c518d15113..35320afaf5d 100644 --- a/gitoxide-core/src/index/checkout.rs +++ b/gitoxide-core/src/index/checkout.rs @@ -115,17 +115,18 @@ pub fn checkout_exclusive( progress.done(format!( "Created {} {} files{} ({})", files_updated, - no_repo.then_some("empty").unwrap_or_default(), - should_interrupt - .load(Ordering::Relaxed) - .then(|| { + if no_repo { "empty" } else { Default::default() }, + if should_interrupt.load(Ordering::Relaxed) { + { format!( " of {}", entries_for_checkout .saturating_sub(errors.len() + collisions.len() + delayed_paths_unprocessed.len()) ) - }) - .unwrap_or_default(), + } + } else { + Default::default() + }, gix::progress::bytes() .unwrap() .display(bytes_written as usize, None, None) diff --git a/gitoxide-core/src/repository/clean.rs b/gitoxide-core/src/repository/clean.rs index 5534424479e..f1e68357c57 100644 --- a/gitoxide-core/src/repository/clean.rs +++ b/gitoxide-core/src/repository/clean.rs @@ -237,7 +237,7 @@ pub(crate) mod function { out, "{maybe}{suffix} {}{} {status}", display_path.display(), - disk_kind.is_dir().then_some("/").unwrap_or_default(), + if disk_kind.is_dir() { "/" } else { Default::default() }, status = match entry.status { Status::Ignored(kind) => { Cow::Owned(format!( diff --git a/gitoxide-core/src/repository/config.rs b/gitoxide-core/src/repository/config.rs index 6d87c539e9b..7f647b42c4f 100644 --- a/gitoxide-core/src/repository/config.rs +++ b/gitoxide-core/src/repository/config.rs @@ -94,11 +94,15 @@ fn write_meta(meta: &gix::config::file::Metadata, out: &mut impl std::io::Write) .as_deref() .map_or_else(|| "memory".into(), |p| p.display().to_string()), meta.source, - (meta.level != 0) - .then(|| format!(", include level {}", meta.level)) - .unwrap_or_default(), - (meta.trust != gix::sec::Trust::Full) - .then_some(", untrusted") - .unwrap_or_default() + if meta.level != 0 { + format!(", include level {}", meta.level) + } else { + Default::default() + }, + if meta.trust != gix::sec::Trust::Full { + ", untrusted" + } else { + Default::default() + } ) } diff --git a/gix-diff/tests/diff/blob/platform.rs b/gix-diff/tests/diff/blob/platform.rs index 6976d805270..a9a40043db7 100644 --- a/gix-diff/tests/diff/blob/platform.rs +++ b/gix-diff/tests/diff/blob/platform.rs @@ -70,7 +70,7 @@ fn resources_of_worktree_and_odb_and_check_link() -> crate::Result { 2, 3 )), - format!("{}test a 0000000000000000000000000000000000000000 100644 4c469b6c8c4486fdc9ded9d597d8f6816a455707 100755", (!cfg!(windows)).then_some("GIT_DIFF_PATH_COUNTER=3 GIT_DIFF_PATH_TOTAL=3 GIT_DIR=. ").unwrap_or_default()), + format!("{}test a 0000000000000000000000000000000000000000 100644 4c469b6c8c4486fdc9ded9d597d8f6816a455707 100755", if !cfg!(windows) { "GIT_DIFF_PATH_COUNTER=3 GIT_DIFF_PATH_TOTAL=3 GIT_DIR=. " } else { Default::default() }), "in this case, there is no rename-to field as last argument, it's based on the resource paths being different" ); @@ -117,7 +117,7 @@ fn resources_of_worktree_and_odb_and_check_link() -> crate::Result { 0, 1 )), - format!("{}test a 0000000000000000000000000000000000000000 100644 4c469b6c8c4486fdc9ded9d597d8f6816a455707 120000", (!cfg!(windows)).then_some(r#"GIT_DIFF_PATH_COUNTER=1 GIT_DIFF_PATH_TOTAL=1 GIT_DIR=. "#).unwrap_or_default()), + format!("{}test a 0000000000000000000000000000000000000000 100644 4c469b6c8c4486fdc9ded9d597d8f6816a455707 120000", if !cfg!(windows) { r#"GIT_DIFF_PATH_COUNTER=1 GIT_DIFF_PATH_TOTAL=1 GIT_DIR=. "# } else { Default::default() }), "Also obvious that symlinks are definitely special, but it's what git does as well" ); @@ -340,9 +340,11 @@ fn source_and_destination_do_not_exist() -> crate::Result { ), format!( r#"{}"test" "missing" "/dev/null" "." "." "/dev/null" "." "." "a""#, - (!cfg!(windows)) - .then_some(r#"GIT_DIFF_PATH_COUNTER="1" GIT_DIFF_PATH_TOTAL="1" GIT_DIR="." "#) - .unwrap_or_default() + if !cfg!(windows) { + r#"GIT_DIFF_PATH_COUNTER="1" GIT_DIFF_PATH_TOTAL="1" GIT_DIR="." "# + } else { + Default::default() + } ) ); Ok(()) diff --git a/gix-odb/src/store_impls/dynamic/load_index.rs b/gix-odb/src/store_impls/dynamic/load_index.rs index 5e768d165fd..839ceb9e459 100644 --- a/gix-odb/src/store_impls/dynamic/load_index.rs +++ b/gix-odb/src/store_impls/dynamic/load_index.rs @@ -251,9 +251,11 @@ impl super::Store { .collect(); let mut new_slot_map_indices = Vec::new(); // these indices into the slot map still exist there/didn't change - let mut index_paths_to_add = was_uninitialized - .then(|| VecDeque::with_capacity(indices_by_modification_time.len())) - .unwrap_or_default(); + let mut index_paths_to_add = if was_uninitialized { + VecDeque::with_capacity(indices_by_modification_time.len()) + } else { + Default::default() + }; // Figure out this number based on what we see while handling the existing indices let mut num_loaded_indices = 0; @@ -389,9 +391,11 @@ impl super::Store { generation, // if there was a prior generation, some indices might already be loaded. But we deal with it by trying to load the next index then, // until we find one. - next_index_to_load: index_unchanged - .then(|| Arc::clone(&index.next_index_to_load)) - .unwrap_or_default(), + next_index_to_load: if index_unchanged { + Arc::clone(&index.next_index_to_load) + } else { + Default::default() + }, loaded_indices: if index_unchanged { Arc::clone(&index.loaded_indices) } else { diff --git a/gix-path/src/env/auxiliary.rs b/gix-path/src/env/auxiliary.rs index 078cd51edaf..9582897abb9 100644 --- a/gix-path/src/env/auxiliary.rs +++ b/gix-path/src/env/auxiliary.rs @@ -141,7 +141,7 @@ mod tests { ]; #[test] - #[cfg_attr(not(windows), ignore)] + #[cfg_attr(not(windows), ignore = "only meaningful on Windows")] fn find_git_associated_windows_executable() { for stem in SHOULD_FIND { let path = super::find_git_associated_windows_executable(stem); @@ -150,7 +150,7 @@ mod tests { } #[test] - #[cfg_attr(not(windows), ignore)] + #[cfg_attr(not(windows), ignore = "only meaningful on Windows")] fn find_git_associated_windows_executable_no_extra() { for stem in SHOULD_NOT_FIND { let path = super::find_git_associated_windows_executable(stem); @@ -159,7 +159,7 @@ mod tests { } #[test] - #[cfg_attr(not(windows), ignore)] + #[cfg_attr(not(windows), ignore = "only meaningful on Windows")] fn find_git_associated_windows_executable_with_fallback() { for stem in SHOULD_FIND { let path = super::find_git_associated_windows_executable_with_fallback(stem); @@ -168,7 +168,7 @@ mod tests { } #[test] - #[cfg_attr(not(windows), ignore)] + #[cfg_attr(not(windows), ignore = "only meaningful on Windows")] fn find_git_associated_windows_executable_with_fallback_falls_back() { for stem in SHOULD_NOT_FIND { let path = super::find_git_associated_windows_executable_with_fallback(stem) diff --git a/gix-pathspec/src/pattern.rs b/gix-pathspec/src/pattern.rs index 24fe55ab173..01a28e1cd0f 100644 --- a/gix-pathspec/src/pattern.rs +++ b/gix-pathspec/src/pattern.rs @@ -54,7 +54,11 @@ impl Pattern { _ => 0, }) .sum::(); - (count > 0).then_some(count as usize).unwrap_or_default() + if count > 0 { + count as usize + } else { + Default::default() + } } let mut path = gix_path::from_bstr(self.path.as_bstr()); diff --git a/gix-protocol/tests/protocol/fetch/response.rs b/gix-protocol/tests/protocol/fetch/response.rs index f464a34e209..a0203ebfc4d 100644 --- a/gix-protocol/tests/protocol/fetch/response.rs +++ b/gix-protocol/tests/protocol/fetch/response.rs @@ -220,7 +220,11 @@ mod v2 { for keepalive in [false, true] { let fixture = format!( "v2/clone-only{}.response", - keepalive.then_some("-with-keepalive").unwrap_or_default() + if keepalive { + "-with-keepalive" + } else { + Default::default() + } ); let mut provider = mock_reader(&fixture); let mut reader = provider.as_read_without_sidebands(); diff --git a/gix-protocol/tests/protocol/fetch/v1.rs b/gix-protocol/tests/protocol/fetch/v1.rs index 751cb3300cf..8b65f68ebb2 100644 --- a/gix-protocol/tests/protocol/fetch/v1.rs +++ b/gix-protocol/tests/protocol/fetch/v1.rs @@ -12,7 +12,11 @@ async fn clone() -> crate::Result { let mut dlg = CloneDelegate::default(); let fixture = format!( "v1/clone{}.response", - with_keepalive.then_some("-with-keepalive").unwrap_or_default() + if with_keepalive { + "-with-keepalive" + } else { + Default::default() + } ); crate::fetch( transport( diff --git a/gix-transport/src/client/blocking_io/file.rs b/gix-transport/src/client/blocking_io/file.rs index a145a305fab..904edc4ffde 100644 --- a/gix-transport/src/client/blocking_io/file.rs +++ b/gix-transport/src/client/blocking_io/file.rs @@ -78,9 +78,11 @@ impl SpawnProcessOnDemand { .expect("valid url"), path, ssh_cmd: None, - envs: (version != Protocol::V1) - .then(|| vec![("GIT_PROTOCOL", format!("version={}", version as usize))]) - .unwrap_or_default(), + envs: if version != Protocol::V1 { + vec![("GIT_PROTOCOL", format!("version={}", version as usize))] + } else { + Default::default() + }, ssh_disallow_shell: false, child: None, connection: None, diff --git a/tests/tools/src/lib.rs b/tests/tools/src/lib.rs index 8572046e43b..8f04dc35cc3 100644 --- a/tests/tools/src/lib.rs +++ b/tests/tools/src/lib.rs @@ -67,10 +67,11 @@ static EXCLUDE_LUT: Lazy>> = Lazy::new(|| { let work_tree = work_tree?.canonicalize().ok()?; let mut buf = Vec::with_capacity(512); - let case = gix_fs::Capabilities::probe(&work_tree) - .ignore_case - .then_some(gix_worktree::ignore::glob::pattern::Case::Fold) - .unwrap_or_default(); + let case = if gix_fs::Capabilities::probe(&work_tree).ignore_case { + gix_worktree::ignore::glob::pattern::Case::Fold + } else { + Default::default() + }; let state = gix_worktree::stack::State::IgnoreStack(gix_worktree::stack::state::Ignore::new( Default::default(), gix_worktree::ignore::Search::from_git_dir(&gix_dir, None, &mut buf).ok()?, From d46766aa29c4ac0bb198aa74fadb5b07ba82f03b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christoph=20R=C3=BC=C3=9Fler?= Date: Sat, 3 May 2025 10:42:35 +0200 Subject: [PATCH 019/166] Provide more context in assertion --- gix-blame/src/file/function.rs | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/gix-blame/src/file/function.rs b/gix-blame/src/file/function.rs index fbbb5c4248f..2a5666d9de6 100644 --- a/gix-blame/src/file/function.rs +++ b/gix-blame/src/file/function.rs @@ -197,15 +197,16 @@ pub fn file( if let Some(range_in_suspect) = hunk.get_range(&suspect) { let range_in_blamed_file = hunk.range_in_blamed_file.clone(); - for (blamed_line_number, source_line_number) in range_in_blamed_file.zip(range_in_suspect.clone()) { - let source_token = source_lines_as_tokens[source_line_number as usize]; - let blame_token = blamed_lines_as_tokens[blamed_line_number as usize]; - - let source_line = BString::new(source_interner[source_token].into()); - let blamed_line = BString::new(blamed_interner[blame_token].into()); - - assert_eq!(source_line, blamed_line); - } + let source_lines = range_in_suspect + .clone() + .map(|i| BString::new(source_interner[source_lines_as_tokens[i as usize]].into())) + .collect::>(); + let blamed_lines = range_in_blamed_file + .clone() + .map(|i| BString::new(blamed_interner[blamed_lines_as_tokens[i as usize]].into())) + .collect::>(); + + assert_eq!(source_lines, blamed_lines); } } } From 6e1ea6d85b8396b8348498c643d92eafb832987c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christoph=20R=C3=BC=C3=9Fler?= Date: Sat, 3 May 2025 10:43:48 +0200 Subject: [PATCH 020/166] Correctly process overlapping unblamed hunks Previously, `process_changes` assumed that `UnblamedHunk`s would never overlap. This constraint has been lifted. As a consequence, the high-level assumption that two different lines from a *Blamed File* can never map to the same line in a *Source File* has been lifted as well. There is not really a way to enforce this constraint in the blame algorithm alone as it heavily depends on the algorithm used for diffing. --- Cargo.lock | 1 + gix-blame/Cargo.toml | 1 + gix-blame/src/file/function.rs | 27 ------------------ gix-blame/src/file/mod.rs | 51 +++++++++++++++++++--------------- gix-blame/src/file/tests.rs | 36 ++++++++++++++++++++++++ gix-blame/src/types.rs | 5 +++- 6 files changed, 71 insertions(+), 50 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index c9c3de2b29b..28286ceb130 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1567,6 +1567,7 @@ dependencies = [ "gix-trace 0.1.12", "gix-traverse 0.46.1", "gix-worktree 0.41.0", + "pretty_assertions", "smallvec", "thiserror 2.0.12", ] diff --git a/gix-blame/Cargo.toml b/gix-blame/Cargo.toml index 6731854c123..8a047a2fc3d 100644 --- a/gix-blame/Cargo.toml +++ b/gix-blame/Cargo.toml @@ -31,3 +31,4 @@ gix-fs = { path = "../gix-fs" } gix-index = { path = "../gix-index" } gix-odb = { path = "../gix-odb" } gix-testtools = { path = "../tests/tools" } +pretty_assertions = "1.4.0" diff --git a/gix-blame/src/file/function.rs b/gix-blame/src/file/function.rs index 2a5666d9de6..a0197b44c15 100644 --- a/gix-blame/src/file/function.rs +++ b/gix-blame/src/file/function.rs @@ -303,33 +303,6 @@ pub fn file( unblamed_hunk.remove_blame(suspect); true }); - - // This block asserts that line ranges for each suspect never overlap. If they did overlap - // this would mean that the same line in a *Source File* would map to more than one line in - // the *Blamed File* and this is not possible. - #[cfg(debug_assertions)] - { - let ranges = hunks_to_blame.iter().fold( - std::collections::BTreeMap::>>::new(), - |mut acc, hunk| { - for (suspect, range) in hunk.suspects.clone() { - acc.entry(suspect).or_default().push(range); - } - - acc - }, - ); - - for (_, mut ranges) in ranges { - ranges.sort_by(|a, b| a.start.cmp(&b.start)); - - for window in ranges.windows(2) { - if let [a, b] = window { - assert!(a.end <= b.start, "#{hunks_to_blame:#?}"); - } - } - } - } } debug_assert_eq!( diff --git a/gix-blame/src/file/mod.rs b/gix-blame/src/file/mod.rs index 7470d71e037..bf67ea62060 100644 --- a/gix-blame/src/file/mod.rs +++ b/gix-blame/src/file/mod.rs @@ -320,36 +320,43 @@ fn process_change( /// Consume `hunks_to_blame` and `changes` to pair up matches ranges (also overlapping) with each other. /// Once a match is found, it's pushed onto `out`. +/// +/// `process_changes` assumes that ranges coming from the same *Source File* can and do +/// occasionally overlap. If it were a desirable property of the blame algorithm as a whole to +/// never have two different lines from a *Blamed File* mapped to the same line in a *Source File*, +/// this property would need to be enforced at a higher level than `process_changes` if which case +/// the nested loops could potentially be flattened into one. fn process_changes( hunks_to_blame: Vec, changes: Vec, suspect: ObjectId, parent: ObjectId, ) -> Vec { - let mut hunks_iter = hunks_to_blame.into_iter(); - let mut changes_iter = changes.into_iter(); + let mut new_hunks_to_blame = Vec::new(); - let mut hunk = hunks_iter.next(); - let mut change = changes_iter.next(); + for hunk in hunks_to_blame { + let mut hunk = Some(hunk); - let mut new_hunks_to_blame = Vec::new(); - let mut offset_in_destination = Offset::Added(0); - - loop { - (hunk, change) = process_change( - &mut new_hunks_to_blame, - &mut offset_in_destination, - suspect, - parent, - hunk, - change, - ); - - hunk = hunk.or_else(|| hunks_iter.next()); - change = change.or_else(|| changes_iter.next()); - - if hunk.is_none() && change.is_none() { - break; + let mut offset_in_destination = Offset::Added(0); + + let mut changes_iter = changes.iter(); + let mut change: Option = changes_iter.next().map(|change| change.clone()); + + loop { + (hunk, change) = process_change( + &mut new_hunks_to_blame, + &mut offset_in_destination, + suspect, + parent, + hunk, + change, + ); + + change = change.or_else(|| changes_iter.next().map(|change| change.clone())); + + if hunk.is_none() { + break; + } } } new_hunks_to_blame diff --git a/gix-blame/src/file/tests.rs b/gix-blame/src/file/tests.rs index 02e7d89ebd1..9185ca50633 100644 --- a/gix-blame/src/file/tests.rs +++ b/gix-blame/src/file/tests.rs @@ -959,6 +959,8 @@ mod process_change { } mod process_changes { + use pretty_assertions::assert_eq; + use crate::file::{ process_changes, tests::{new_unblamed_hunk, one_sha, zero_sha}, @@ -1337,4 +1339,38 @@ mod process_changes { ] ); } + + #[test] + fn subsequent_hunks_overlapping_end_of_addition() { + let suspect = zero_sha(); + let parent = one_sha(); + let hunks_to_blame = vec![ + new_unblamed_hunk(13..16, suspect, Offset::Added(0)), + new_unblamed_hunk(10..17, suspect, Offset::Added(0)), + ]; + let changes = vec![Change::AddedOrReplaced(10..14, 0)]; + let new_hunks_to_blame = process_changes(hunks_to_blame, changes, suspect, parent); + + assert_eq!( + new_hunks_to_blame, + [ + UnblamedHunk { + range_in_blamed_file: 13..14, + suspects: [(suspect, 13..14)].into() + }, + UnblamedHunk { + range_in_blamed_file: 14..16, + suspects: [(parent, 10..12)].into(), + }, + UnblamedHunk { + range_in_blamed_file: 10..14, + suspects: [(suspect, 10..14)].into(), + }, + UnblamedHunk { + range_in_blamed_file: 14..17, + suspects: [(parent, 10..13)].into(), + }, + ] + ); + } } diff --git a/gix-blame/src/types.rs b/gix-blame/src/types.rs index d60b723e598..84b107b6f8d 100644 --- a/gix-blame/src/types.rs +++ b/gix-blame/src/types.rs @@ -353,7 +353,10 @@ pub(crate) enum Either { } /// A single change between two blobs, or an unchanged region. -#[derive(Debug, PartialEq)] +/// +/// Line numbers refer to the file that is referred to as `after` or `NewOrDestination`, depending +/// on the context. +#[derive(Clone, Debug, PartialEq)] pub enum Change { /// A range of tokens that wasn't changed. Unchanged(Range), From 2f6786b08a0c94106b4e93f7835a708adc859fed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christoph=20R=C3=BC=C3=9Fler?= Date: Sat, 3 May 2025 13:22:06 +0200 Subject: [PATCH 021/166] Use *Blamed File* and *Source File* more consistently This change also reflects the way `blamed_file` and `source_file` are used throughout the code. --- gix-blame/src/file/function.rs | 3 ++- gix-blame/src/file/mod.rs | 9 +++++---- gix-blame/src/lib.rs | 6 +++--- 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/gix-blame/src/file/function.rs b/gix-blame/src/file/function.rs index a0197b44c15..03429b61b12 100644 --- a/gix-blame/src/file/function.rs +++ b/gix-blame/src/file/function.rs @@ -37,7 +37,8 @@ use crate::{BlameEntry, Error, Options, Outcome, Statistics}; /// /// *For brevity, `HEAD` denotes the starting point of the blame operation. It could be any commit, or even commits that /// represent the worktree state. -/// We begin with a single *Unblamed Hunk* and a single suspect, usually the `HEAD` commit as the commit containing the +/// +/// We begin with one or more *Unblamed Hunks* and a single suspect, usually the `HEAD` commit as the commit containing the /// *Blamed File*, so that it contains the entire file, with the first commit being a candidate for the entire *Blamed File*. /// We traverse the commit graph starting at the first suspect, and see if there have been changes to `file_path`. /// If so, we have found a *Source File* and a *Suspect* commit, and have hunks that represent these changes. diff --git a/gix-blame/src/file/mod.rs b/gix-blame/src/file/mod.rs index bf67ea62060..f35cdbe9e61 100644 --- a/gix-blame/src/file/mod.rs +++ b/gix-blame/src/file/mod.rs @@ -8,11 +8,12 @@ use crate::types::{BlameEntry, Change, Either, LineRange, Offset, UnblamedHunk}; pub(super) mod function; -/// Compare a section from the *Blamed File* (`hunk`) with a change from a diff and see if there -/// is an intersection with `change`. Based on that intersection, we may generate a [`BlameEntry`] for `out` -/// and/or split the `hunk` into multiple. +/// Compare a section from a potential *Source File* (`hunk`) with a change from a diff and see if +/// there is an intersection with `change`. Based on that intersection, we may generate a +/// [`BlameEntry`] for `out` and/or split the `hunk` into multiple. /// -/// This is the core of the blame implementation as it matches regions in *Source File* to the *Blamed File*. +/// This is the core of the blame implementation as it matches regions in *Blamed File* to +/// corresponding regions in one or more than one *Source File*. fn process_change( new_hunks_to_blame: &mut Vec, offset: &mut Offset, diff --git a/gix-blame/src/lib.rs b/gix-blame/src/lib.rs index aca4299d41c..1cdbeb010d2 100644 --- a/gix-blame/src/lib.rs +++ b/gix-blame/src/lib.rs @@ -2,10 +2,10 @@ //! //! ### Terminology //! -//! * **Source File** -//! - The file as it exists in `HEAD`. -//! - the initial state with all lines that we need to associate with a *Source File*. //! * **Blamed File** +//! - The file as it exists in `HEAD`. +//! - the initial state with all lines that we need to associate with a *Blamed File*. +//! * **Source File** //! - A file at a version (i.e. commit) that introduces hunks into the final 'image'. //! * **Suspects** //! - The versions of the files that can contain hunks that we could use in the final 'image' From 6bf1be67ba93c1b8e467e3c3127438d1eb43897e Mon Sep 17 00:00:00 2001 From: Sebastian Thiel Date: Sat, 3 May 2025 14:12:19 +0200 Subject: [PATCH 022/166] reproduce fuzz-failure (#1979) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit It's notable that this regression was introduced in `v0.2.11`. ``` ❯ cargo update -p jiff Updating crates.io index Locking 2 packages to latest compatible versions Updating jiff v0.2.10 -> v0.2.11 Updating jiff-static v0.2.10 -> v0.2.11 note: pass `--verbose` to see 10 unchanged dependencies behind latest ``` Thus, the issue didn't reproduce in v0.2.10. --- Cargo.lock | 22 +++++++++++----------- gix-date/tests/time/parse.rs | 4 ++++ 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index c9c3de2b29b..86fa8de2353 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1028,7 +1028,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "976dd42dc7e85965fe702eb8164f21f450704bdde31faefd6471dba214cb594e" dependencies = [ "libc", - "windows-sys 0.59.0", + "windows-sys 0.52.0", ] [[package]] @@ -3474,7 +3474,7 @@ checksum = "e04d7f318608d35d4b61ddd75cbdaee86b023ebe2bd5a66ee0915f0bf93095a9" dependencies = [ "hermit-abi 0.5.0", "libc", - "windows-sys 0.59.0", + "windows-sys 0.52.0", ] [[package]] @@ -3534,9 +3534,9 @@ checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" [[package]] name = "jiff" -version = "0.2.10" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a064218214dc6a10fbae5ec5fa888d80c45d611aba169222fc272072bf7aef6" +checksum = "27e77966151130221b079bcec80f1f34a9e414fa489d99152a201c07fd2182bc" dependencies = [ "jiff-static", "jiff-tzdb-platform", @@ -3544,14 +3544,14 @@ dependencies = [ "portable-atomic", "portable-atomic-util", "serde", - "windows-sys 0.59.0", + "windows-sys 0.52.0", ] [[package]] name = "jiff-static" -version = "0.2.10" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "199b7932d97e325aff3a7030e141eafe7f2c6268e1d1b24859b753a627f45254" +checksum = "97265751f8a9a4228476f2fc17874a9e7e70e96b893368e42619880fe143b48a" dependencies = [ "proc-macro2", "quote", @@ -4315,7 +4315,7 @@ dependencies = [ "once_cell", "socket2", "tracing", - "windows-sys 0.59.0", + "windows-sys 0.52.0", ] [[package]] @@ -4546,7 +4546,7 @@ dependencies = [ "errno", "libc", "linux-raw-sys 0.4.15", - "windows-sys 0.59.0", + "windows-sys 0.52.0", ] [[package]] @@ -4559,7 +4559,7 @@ dependencies = [ "errno", "libc", "linux-raw-sys 0.9.3", - "windows-sys 0.59.0", + "windows-sys 0.52.0", ] [[package]] @@ -5104,7 +5104,7 @@ dependencies = [ "getrandom 0.3.2", "once_cell", "rustix 1.0.7", - "windows-sys 0.59.0", + "windows-sys 0.52.0", ] [[package]] diff --git a/gix-date/tests/time/parse.rs b/gix-date/tests/time/parse.rs index c10db9f91aa..bac011ce5f3 100644 --- a/gix-date/tests/time/parse.rs +++ b/gix-date/tests/time/parse.rs @@ -326,6 +326,10 @@ mod relative { /// Various cases the fuzzer found mod fuzz { + #[test] + fn reproduce_1979() { + gix_date::parse("fRi ", None).ok(); + } #[test] fn invalid_but_does_not_cause_panic() { for input in ["-9999-1-1", "7 -𬞋", "5 ڜ-09", "-4 week ago Z", "8960609 day ago"] { From ee6f5cc1dc08975da364836adf3a3261d20c7ded Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christoph=20R=C3=BC=C3=9Fler?= Date: Sat, 3 May 2025 16:03:06 +0200 Subject: [PATCH 023/166] Thanks clippy --- gix-blame/src/file/mod.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gix-blame/src/file/mod.rs b/gix-blame/src/file/mod.rs index f35cdbe9e61..3e729cec002 100644 --- a/gix-blame/src/file/mod.rs +++ b/gix-blame/src/file/mod.rs @@ -341,7 +341,7 @@ fn process_changes( let mut offset_in_destination = Offset::Added(0); let mut changes_iter = changes.iter(); - let mut change: Option = changes_iter.next().map(|change| change.clone()); + let mut change: Option = changes_iter.next().cloned(); loop { (hunk, change) = process_change( @@ -353,7 +353,7 @@ fn process_changes( change, ); - change = change.or_else(|| changes_iter.next().map(|change| change.clone())); + change = change.or_else(|| changes_iter.next().cloned()); if hunk.is_none() { break; From 0be4dd4e037e8a3080ef335913e06bc2584fd96d Mon Sep 17 00:00:00 2001 From: Eliah Kagan Date: Sun, 4 May 2025 01:53:38 -0400 Subject: [PATCH 024/166] Further upgrade `jiff` to fix fuzz failures (#1984) This upgrades `jiff` to 0.2.12 to fix fuzzing failures. The test case introduced in the previous commit now passes. Upgrading `jiff` past 0.2.11 gets the fix for BurntSushi/jiff#359, fixed in BurntSushi/jiff#360. To avoid declaring compatibility with a version that has the bug, this advances `jiff` from 0.2.10 to 0.2.12 in the `gix-archive` and `gix-date` manifests. (The changes in `Cargo.lock` are those that occur automatically when `cargo check --workspace` is run after those changes.) Fixes #1979 Fixes #1982 --- Cargo.lock | 26 +++++++++++++------------- gix-archive/Cargo.toml | 2 +- gix-date/Cargo.toml | 2 +- gix-date/tests/time/parse.rs | 1 + 4 files changed, 16 insertions(+), 15 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 86fa8de2353..d4883ed50fc 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1028,7 +1028,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "976dd42dc7e85965fe702eb8164f21f450704bdde31faefd6471dba214cb594e" dependencies = [ "libc", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -3474,7 +3474,7 @@ checksum = "e04d7f318608d35d4b61ddd75cbdaee86b023ebe2bd5a66ee0915f0bf93095a9" dependencies = [ "hermit-abi 0.5.0", "libc", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -3534,9 +3534,9 @@ checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" [[package]] name = "jiff" -version = "0.2.11" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27e77966151130221b079bcec80f1f34a9e414fa489d99152a201c07fd2182bc" +checksum = "d07d8d955d798e7a4d6f9c58cd1f1916e790b42b092758a9ef6e16fef9f1b3fd" dependencies = [ "jiff-static", "jiff-tzdb-platform", @@ -3544,14 +3544,14 @@ dependencies = [ "portable-atomic", "portable-atomic-util", "serde", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] name = "jiff-static" -version = "0.2.11" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97265751f8a9a4228476f2fc17874a9e7e70e96b893368e42619880fe143b48a" +checksum = "f244cfe006d98d26f859c7abd1318d85327e1882dc9cef80f62daeeb0adcf300" dependencies = [ "proc-macro2", "quote", @@ -3682,7 +3682,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc2f4eb4bc735547cfed7c0a4922cbd04a4655978c09b54f1f7b228750664c34" dependencies = [ "cfg-if", - "windows-targets 0.48.5", + "windows-targets 0.52.6", ] [[package]] @@ -4315,7 +4315,7 @@ dependencies = [ "once_cell", "socket2", "tracing", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -4546,7 +4546,7 @@ dependencies = [ "errno", "libc", "linux-raw-sys 0.4.15", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -4559,7 +4559,7 @@ dependencies = [ "errno", "libc", "linux-raw-sys 0.9.3", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -5104,7 +5104,7 @@ dependencies = [ "getrandom 0.3.2", "once_cell", "rustix 1.0.7", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -5722,7 +5722,7 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" dependencies = [ - "windows-sys 0.48.0", + "windows-sys 0.59.0", ] [[package]] diff --git a/gix-archive/Cargo.toml b/gix-archive/Cargo.toml index 3c9dc3824e8..dc4fd950712 100644 --- a/gix-archive/Cargo.toml +++ b/gix-archive/Cargo.toml @@ -35,7 +35,7 @@ gix-date = { version = "^0.10.1", path = "../gix-date" } flate2 = { version = "1.1.1", optional = true, default-features = false, features = ["zlib-rs"] } zip = { version = "2.6.1", optional = true, default-features = false, features = ["deflate"] } -jiff = { version = "0.2.10", default-features = false, features = ["std"] } +jiff = { version = "0.2.12", default-features = false, features = ["std"] } thiserror = "2.0.0" bstr = { version = "1.12.0", default-features = false } diff --git a/gix-date/Cargo.toml b/gix-date/Cargo.toml index b64187ef7dc..aa666795bc4 100644 --- a/gix-date/Cargo.toml +++ b/gix-date/Cargo.toml @@ -22,7 +22,7 @@ serde = ["dep:serde", "bstr/serde"] bstr = { version = "1.12.0", default-features = false, features = ["std"] } serde = { version = "1.0.114", optional = true, default-features = false, features = ["derive"] } itoa = "1.0.1" -jiff = "0.2.10" +jiff = "0.2.12" thiserror = "2.0.0" # TODO: used for quick and easy `TimeBacking: std::io::Write` implementation, but could make that `Copy` # and remove this dep with custom impl diff --git a/gix-date/tests/time/parse.rs b/gix-date/tests/time/parse.rs index bac011ce5f3..0102762385c 100644 --- a/gix-date/tests/time/parse.rs +++ b/gix-date/tests/time/parse.rs @@ -330,6 +330,7 @@ mod fuzz { fn reproduce_1979() { gix_date::parse("fRi ", None).ok(); } + #[test] fn invalid_but_does_not_cause_panic() { for input in ["-9999-1-1", "7 -𬞋", "5 ڜ-09", "-4 week ago Z", "8960609 day ago"] { From 41b3b627354df202426d3ff2bd37553a54e6cca3 Mon Sep 17 00:00:00 2001 From: Eliah Kagan Date: Sun, 4 May 2025 03:16:08 -0400 Subject: [PATCH 025/166] Don't install `openssl` and `gnu-sed` on macOS CI MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - For `openssl`, the `macos-latest` image already has it, and the installation is currently (and has for some time been) a no-op: Warning: openssl@3 3.5.0 is already installed and up-to-date. To reinstall 3.5.0, run: brew reinstall openssl@3 The workflow has attempted to install `openssl` explicitly via `brew` since a7db791 (#295). This was described as an effort to fix the build on macOS 11, and from context it looks like it was useful, and likely necessaryn at the time. But `macos-latest` is currently macOS 14 or higher. More significantly, `openssl` on the macOS CI runners had been version 1.1, but it is version 3 since https://github.com/actions/runner-images/pull/10851. The images seem to keep a current version. If that changes, then it might once again be a good idea to upgrade via `brew`, but might not. - For `gnu-sed`, we are not using it. The executable was being set up on CI only as `gsed`: ==> Downloading https://ghcr.io/v2/homebrew/core/gnu-sed/manifests/4.9-3 ==> Fetching gnu-sed ==> Downloading https://ghcr.io/v2/homebrew/core/gnu-sed/blobs/sha256:829d21105387351f6c7b07cd845d7e234c1a460ea5e50cc2f5dbcface45e378d ==> Pouring gnu-sed--4.9.arm64_sonoma.bottle.3.tar.gz ==> Caveats GNU "sed" has been installed as "gsed". If you need to use it as "sed", you can add a "gnubin" directory to your PATH from your bashrc like: PATH="/opt/homebrew/opt/gnu-sed/libexec/gnubin:$PATH" ==> Summary 🍺 /opt/homebrew/Cellar/gnu-sed/4.9: 13 files, 616.4KB But no references to `gsed` remain. Specifically, in #392, `gsed` was used in `make_rebase_i_repo.sh` as of ac3c8c7. But it was removed in fc61c0d, which was later in that same PR. There have been no uses of `gsed` in this project since then. --- .github/workflows/ci.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 38daebcd927..b27871b1b14 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -171,9 +171,6 @@ jobs: - uses: actions/checkout@v4 - uses: dtolnay/rust-toolchain@stable - uses: Swatinem/rust-cache@v2 - - name: Setup dependencies (macos) - if: startsWith(matrix.os, 'macos') - run: brew install openssl gnu-sed - name: cargo check default features if: startsWith(matrix.os, 'windows') run: cargo check --workspace --bins --examples From 3f85bf5e97cee359264051bb64357361c7a0f33e Mon Sep 17 00:00:00 2001 From: Sebastian Thiel Date: Sun, 4 May 2025 19:09:09 +0200 Subject: [PATCH 026/166] fix: `strict_config` in conjunction with `GIT_WORK_TREE` no longer triggers an error (#1985). --- gix/src/open/repository.rs | 51 ++++++++++++++++++++++---------------- gix/tests/gix-init.rs | 44 ++++++++++++++++++++++++-------- 2 files changed, 64 insertions(+), 31 deletions(-) diff --git a/gix/src/open/repository.rs b/gix/src/open/repository.rs index 25a8af99453..1b367497ffa 100644 --- a/gix/src/open/repository.rs +++ b/gix/src/open/repository.rs @@ -1,4 +1,9 @@ #![allow(clippy::result_large_err)] +use gix_config::file::Metadata; +use gix_features::threading::OwnShared; +use gix_object::bstr::ByteSlice; +use gix_path::RelativePath; +use std::path::Path; use std::{ borrow::Cow, collections::{btree_map::Entry, BTreeMap}, @@ -6,10 +11,6 @@ use std::{ path::PathBuf, }; -use gix_features::threading::OwnShared; -use gix_object::bstr::ByteSlice; -use gix_path::RelativePath; - use super::{Error, Options}; use crate::{ bstr::BString, @@ -257,26 +258,32 @@ impl ThreadSafeRepository { // core.worktree might be used to overwrite the worktree directory if !config.is_bare { let mut key_source = None; + fn assure_config_is_from_current_repo( + section: &gix_config::file::Metadata, + git_dir: &Path, + current_dir: &Path, + filter_config_section: &mut fn(&Metadata) -> bool, + ) -> bool { + if !filter_config_section(section) { + return false; + } + // ignore worktree settings that aren't from our repository. This can happen + // with worktrees of submodules for instance. + section + .path + .as_deref() + .and_then(|p| gix_path::normalize(p.into(), current_dir)) + .is_some_and(|config_path| config_path.starts_with(git_dir)) + } let worktree_path = config .resolved - .path_filter(Core::WORKTREE, { - |section| { - if !filter_config_section(section) { - return false; - } - // ignore worktree settings that aren't from our repository. This can happen - // with worktrees of submodules for instance. - let is_config_in_our_repo = section - .path - .as_deref() - .and_then(|p| gix_path::normalize(p.into(), current_dir)) - .is_some_and(|config_path| config_path.starts_with(&git_dir)); - if !is_config_in_our_repo { - return false; - } + .path_filter(Core::WORKTREE, |section| { + let res = + assure_config_is_from_current_repo(section, &git_dir, current_dir, &mut filter_config_section); + if res { key_source = Some(section.source); - true } + res }) .zip(key_source); if let Some((wt, key_source)) = worktree_path { @@ -302,7 +309,9 @@ impl ThreadSafeRepository { } else if !config.lenient_config && config .resolved - .boolean_filter(Core::WORKTREE, &mut filter_config_section) + .boolean_filter(Core::WORKTREE, |section| { + assure_config_is_from_current_repo(section, &git_dir, current_dir, &mut filter_config_section) + }) .is_some() { return Err(Error::from(config::Error::ConfigTypedString( diff --git a/gix/tests/gix-init.rs b/gix/tests/gix-init.rs index bfe92e7f3ce..a0eb77045db 100644 --- a/gix/tests/gix-init.rs +++ b/gix/tests/gix-init.rs @@ -1,22 +1,28 @@ #![allow(clippy::result_large_err)] + +use gix::open::Permissions; +use gix::{Repository, ThreadSafeRepository}; +use gix_sec::Permission; +use serial_test::serial; + +pub fn named_subrepo_opts( + fixture: &str, + name: &str, + opts: gix::open::Options, +) -> std::result::Result { + let repo_path = gix_testtools::scripted_fixture_read_only(fixture).unwrap().join(name); + Ok(ThreadSafeRepository::open_opts(repo_path, opts)?.to_thread_local()) +} + mod with_overrides { use std::borrow::Cow; - use gix::{Repository, ThreadSafeRepository}; + use crate::named_subrepo_opts; use gix_object::bstr::BStr; use gix_sec::Permission; use gix_testtools::Env; use serial_test::serial; - pub fn named_subrepo_opts( - fixture: &str, - name: &str, - opts: gix::open::Options, - ) -> std::result::Result { - let repo_path = gix_testtools::scripted_fixture_read_only(fixture).unwrap().join(name); - Ok(ThreadSafeRepository::open_opts(repo_path, opts)?.to_thread_local()) - } - #[test] #[serial] fn order_from_api_and_cli_and_environment() -> gix_testtools::Result { @@ -264,3 +270,21 @@ mod with_overrides { Cow::Borrowed(s.into()) } } + +#[test] +#[serial] +fn git_worktree_and_strict_config() -> gix_testtools::Result { + let _restore_env_on_drop = gix_testtools::Env::new().set("GIT_WORK_TREE", "."); + let _repo = named_subrepo_opts( + "make_empty_repo.sh", + "", + gix::open::Options::isolated() + .permissions({ + let mut perm = Permissions::isolated(); + perm.env.git_prefix = Permission::Allow; + perm + }) + .strict_config(true), + )?; + Ok(()) +} From b2121bcd8be3546cf708242dae070c7173a7d384 Mon Sep 17 00:00:00 2001 From: Sebastian Thiel Date: Sun, 4 May 2025 20:42:36 +0200 Subject: [PATCH 027/166] refactor all just minor tweaks. --- gix-blame/src/file/mod.rs | 14 ++++++-------- gix-blame/src/lib.rs | 6 +++--- 2 files changed, 9 insertions(+), 11 deletions(-) diff --git a/gix-blame/src/file/mod.rs b/gix-blame/src/file/mod.rs index 3e729cec002..935fb09eed8 100644 --- a/gix-blame/src/file/mod.rs +++ b/gix-blame/src/file/mod.rs @@ -325,8 +325,8 @@ fn process_change( /// `process_changes` assumes that ranges coming from the same *Source File* can and do /// occasionally overlap. If it were a desirable property of the blame algorithm as a whole to /// never have two different lines from a *Blamed File* mapped to the same line in a *Source File*, -/// this property would need to be enforced at a higher level than `process_changes` if which case -/// the nested loops could potentially be flattened into one. +/// this property would need to be enforced at a higher level than `process_changes`. +/// Then the nested loops could potentially be flattened into one. fn process_changes( hunks_to_blame: Vec, changes: Vec, @@ -335,13 +335,11 @@ fn process_changes( ) -> Vec { let mut new_hunks_to_blame = Vec::new(); - for hunk in hunks_to_blame { - let mut hunk = Some(hunk); - + for mut hunk in hunks_to_blame.into_iter().map(Some) { let mut offset_in_destination = Offset::Added(0); - let mut changes_iter = changes.iter(); - let mut change: Option = changes_iter.next().cloned(); + let mut changes_iter = changes.iter().cloned(); + let mut change = changes_iter.next(); loop { (hunk, change) = process_change( @@ -353,7 +351,7 @@ fn process_changes( change, ); - change = change.or_else(|| changes_iter.next().cloned()); + change = change.or_else(|| changes_iter.next()); if hunk.is_none() { break; diff --git a/gix-blame/src/lib.rs b/gix-blame/src/lib.rs index 1cdbeb010d2..e811ab88ddb 100644 --- a/gix-blame/src/lib.rs +++ b/gix-blame/src/lib.rs @@ -4,13 +4,13 @@ //! //! * **Blamed File** //! - The file as it exists in `HEAD`. -//! - the initial state with all lines that we need to associate with a *Blamed File*. +//! - the initial state with all lines that we need to associate with a *Source File*. //! * **Source File** -//! - A file at a version (i.e. commit) that introduces hunks into the final 'image'. +//! - A file at a version (i.e., commit) that introduces hunks into the final 'image' of the *Blamed File*. //! * **Suspects** //! - The versions of the files that can contain hunks that we could use in the final 'image' //! - multiple at the same time as the commit-graph may split up. -//! - turns into *Source File* once we have found an association into the *Blamed File*. +//! - They turn into a *Source File* once we have found an association into the *Blamed File*. #![deny(rust_2018_idioms, missing_docs)] #![forbid(unsafe_code)] From 241dcdbb8d8ea398b9c437f564c9afd499f7c380 Mon Sep 17 00:00:00 2001 From: Eliah Kagan Date: Sun, 4 May 2025 16:21:09 -0400 Subject: [PATCH 028/166] Refactor crate loops in CI `wasm` jobs - Use a `bash` array for the long list of crates without feature toggles, to make clear what crates are covered in this loop, and so any changes to the list produce clearer diffs, and to improve the general readability of the workflow. - In each loop, rename the variable from `name` to `crate`, to make the meaning clearer. The other significant kind of loop in this job is over `feature`, so this makes the contrast clear. (Other loops over array items in other jobs in the workflow, where the general variable name `name` could be used, already instead use the more specific variable names `package` and `cmd`.) This may slightly mitigate #1988 in that it makes it easier for the big list to be manually inspected, but it does not fix that issue. --- .github/workflows/ci.yml | 37 +++++++++++++++++++++++++++++++------ 1 file changed, 31 insertions(+), 6 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index b27871b1b14..9dccd0a5938 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -387,14 +387,39 @@ jobs: if: endsWith(matrix.target, '-wasi') run: | set +x - for name in gix-sec; do - (cd -- "$name" && cargo build --target "$TARGET") + for crate in gix-sec; do + (cd -- "$crate" && cargo build --target "$TARGET") done - name: crates without feature toggles run: | + crates=( + gix-actor + gix-attributes + gix-bitmap + gix-chunk + gix-command + gix-commitgraph + gix-config-value + gix-date + gix-glob + gix-hash + gix-hashtable + gix-mailmap + gix-object + gix-packetline + gix-path + gix-pathspec + gix-prompt + gix-quote + gix-refspec + gix-revision + gix-traverse + gix-url + gix-validate + ) set +x - for name in gix-actor gix-attributes gix-bitmap gix-chunk gix-command gix-commitgraph gix-config-value gix-date gix-glob gix-hash gix-hashtable gix-mailmap gix-object gix-packetline gix-path gix-pathspec gix-prompt gix-quote gix-refspec gix-revision gix-traverse gix-url gix-validate; do - (cd -- "$name" && cargo build --target "$TARGET") + for crate in "${crates[@]}"; do + (cd -- "$crate" && cargo build --target "$TARGET") done - name: features of gix-features run: | @@ -405,8 +430,8 @@ jobs: - name: crates with 'wasm' feature run: | set +x - for name in gix-pack; do - (cd -- "$name" && cargo build --features wasm --target "$TARGET") + for crate in gix-pack; do + (cd -- "$crate" && cargo build --features wasm --target "$TARGET") done - name: gix-pack with all features (including wasm) run: cd gix-pack && cargo build --all-features --target "$TARGET" From 555a5afb013a79ff44c40e36196bd7a93c8e576f Mon Sep 17 00:00:00 2001 From: Eliah Kagan Date: Sun, 4 May 2025 20:55:04 -0400 Subject: [PATCH 029/166] Revert "On CI, have `cargo deny` allow RUSTSEC-2025-0021 via gix-testtools" This reverts commit 67d9bf494315a6b5b172bd81b330b1c60d16d46d, but not the other changes from #1927. `gix-testtools` 0.16.1 has the change in 9b12d50 (#1972) from depending on previous SemVer-incompatible versions of `gix-*` crates to depending on the current versions. Since then, nothing affected by https://rustsec.org/advisories/RUSTSEC-2024-0436.html appears in our dependency tree, and it is no longer necessary or desirable to use a more complicated `cargo deny check advisories` scanning approach allowing that advisory through `gix-testtools`. --- .github/workflows/ci.yml | 20 +------------------- 1 file changed, 1 insertion(+), 19 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 9dccd0a5938..b1795b04107 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -330,28 +330,10 @@ jobs: steps: - uses: actions/checkout@v4 - - name: Install tomlq - run: | - # The runner already has the `yq` command but not its associated `tomlq` command. - sudo apt-get update - sudo apt-get install yq - - name: Strict check, but omit gix-testtools - uses: EmbarkStudios/cargo-deny-action@v2 - with: - command: check advisories - arguments: --workspace --all-features --exclude gix-testtools - - name: Configure less strict check - run: | - filter='.advisories.ignore += [ - { id: "RUSTSEC-2025-0021", reason: "gix-testtools can’t upgrade from old gix-features yet" } - ]' - tomlq "$filter" deny.toml --toml-output > deny-but-ignore-RUSTSEC-2025-0021.toml - - name: Less strict check, but include gix-testtools - uses: EmbarkStudios/cargo-deny-action@v2 + - uses: EmbarkStudios/cargo-deny-action@v2 with: command: check advisories arguments: --workspace --all-features - command-arguments: --config deny-but-ignore-RUSTSEC-2025-0021.toml cargo-deny: runs-on: ubuntu-latest From 7e057f2c73a70a2cd56bbc5484e6141feef2f014 Mon Sep 17 00:00:00 2001 From: Eliah Kagan Date: Sun, 4 May 2025 14:24:13 -0400 Subject: [PATCH 030/166] Let `gix-testtools` use `gix-*` workspace crates MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `gix-testtools` depends on several other `gix-*` crates. Before version 0.16.1 (#1972), `gix-testtools` depended on prior breaking versions of those crates (as discussed in #1510 and #1886). Since then, it depends on the current versions. When depending on a strictly earlier version, it was necessary to omit `path =` in the `gix-testtools` manifest for its `gix-*` dependencies. Now that `gix-testtools` depends on current versions of those dependencies, it seems feasible to specify both `version` and `path`, as we do in other cases where one crate developed in this workspace depends on another crate developed in the workspace. Aside from improving general consistency (which is a weak rationale here, since the role of `gix-testtools` differs substantially from that of other `gix-*` crates, in terms of how we're ourselves using it), the broad benefits here are that: 1. Ambiguity in what crate is meant, when an operation is performed on a specific `gix-*` crate, is lessened, or maybe even eliminated. (#1989) 2. Because the code of the dependency comes from the workspace when applicable, i.e. when `gix-testtools` is itself being used in the workspace, it should allow new not-yet-published functionality to be leveraged in `gix-testtools`, without confusion or breakage. (#1886) Before this, some actions we'd prefer to do by ` -p ` had to be done by `(cd ; )`. This was needed to operate on `gix-*` crates in the workspace that are also dependencies, even transitively, of `gix-testtools`. This affected some commands in `justfile` recipes, some commands run in CI workflows (indirectly via `just`, or directly in script steps), and some operations carried out manually. This included `cargo nextest run` and `cargo check` on various crates. Here's an example (shown on Windows, but this problem was not specific to Windows) using `gix-date`, which is not listed in `tests/tools/Cargo.toml`, but which is a transitive dependency: C:\Users\ek\source\repos\gitoxide [main ≡]> cargo nextest run -p gix-date Blocking waiting for file lock on package cache error: There are multiple `gix-date` packages in your project, and the specification `gix-date` is ambiguous. Please re-run this command with one of the following specifications: path+file:///C:/Users/ek/source/repos/gitoxide/gix-date#0.10.1 registry+https://github.com/rust-lang/crates.io-index#gix-date@0.10.1 error: command `'\\?\C:\Users\ek\.rustup\toolchains\stable-x86_64-pc-windows-msvc\bin\cargo.exe' test --no-run --message-format json-render-diagnostics --package gix-date` exited with code 101 An important special case is that of editor/IDE integration, especially in VS Code. This couldn't run and (more significantly, in view of the benefit of integration) couldn't debug some of the tests. This happened because synthesized `cargo test -p ...` commands, used behind the scenes to launch the tests, were ambiguous. For further details, see #1989. Another benefit is that the lockfile and dependency tree are simpler, and the dependency tree is truly unified. That points to an important aspect of this change, which is more than a refactoring and will affect test behavior: - It shouldn't produce different behavior when `gix-testtools` is obtained from crates.io (i.e. when projects developed outside the `gitoxide` repository use `gix-testtools`), it can produce different behavior here, where `gix-testtools` will use changes to its `gix-*` dependencies (and accordingly their own dependencies, recursively) that are present in the workspace even if not present in the released version that matches `version =`. - That could be a good thing if it causes new changes to be exercised more and earlier. That might help find bugs. - This is also desirable in that it allows feature changes and bugfixes in `gix-*` crates to be used immediately in `gix-testtools`, before either those `gix-*` crates or `gix-testtools` are published with the changes (#1886). But... However: - It could be bad if it introduces an undesirable dependency ordering for fixing bugs and/or introducing regression tests. That is, in principle there could arise two (possibly related) bugs, A and B, where there is some reason to fix A before B, but where B must be fixed in order for the regression test for A to run (to validate that it can catch A), due to B breaking `gix-testtools` as used in the test for A or in other tests in the crate affected by A. Because this would presumably be known--an error would occur, likely when building the tests--it could be worked around by temporarily (or permanently) reverting this change if and when such a problem ever arises, or partially undoing it for the specific affected `gix-*` dependency of `gix-testtools`. - It could be bad if a bug affects a `gix-*` crate and its own tests in identical or complementary ways, and this is used to establish or check an expectation. That is, in principle there could arise a bug in a `gix-*` crate that `gix-testtools` uses, and that itself uses `gix-testtools` in its tests, that causes a test that should catch that bug (either initially or to verify a bugfix) to wrongly report that the code is working. This scenario is a case of the general problem that duplicated logic between code and its tests can cause a bug to appear (either in the same form or in different forms) in both, such that tests that should catch the bug don't catch it because they suffer from the same bug. In the hypothetical case imagined here, the duplication of logic would arise from the tests calling and using the very code that is under test. For the way we are currently using or likely ever to use `gix-testtools`, it seems like this would probably not happen. But it is hard to be completely sure. Unlike the previously described scenario, if this scenario did occur, it would likely not be noticed. Both those problem scenarios have corresponding scenarios that had already applied (and which the change here at least slightly *mitigates*): if the code with the bug has already been published. This fixes #1989 and makes progress toward #1886. --- Cargo.lock | 1033 +++++++++++++--------------------------- tests/tools/Cargo.toml | 10 +- 2 files changed, 333 insertions(+), 710 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index e34edadf949..6ece8372bbc 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1318,7 +1318,7 @@ dependencies = [ "futures-lite", "gitoxide-core", "gix", - "gix-features 0.42.1", + "gix-features", "is-terminal", "once_cell", "prodash", @@ -1375,54 +1375,54 @@ dependencies = [ "async-std", "document-features", "gix", - "gix-actor 0.35.1", + "gix-actor", "gix-archive", - "gix-attributes 0.26.0", + "gix-attributes", "gix-blame", "gix-command", - "gix-commitgraph 0.28.0", + "gix-commitgraph", "gix-config", "gix-credentials", - "gix-date 0.10.1", + "gix-date", "gix-diff", "gix-dir", - "gix-discover 0.40.1", - "gix-features 0.42.1", + "gix-discover", + "gix-features", "gix-filter", - "gix-fs 0.15.0", - "gix-glob 0.20.0", - "gix-hash 0.18.0", - "gix-hashtable 0.8.1", - "gix-ignore 0.15.0", - "gix-index 0.40.0", - "gix-lock 17.1.0", + "gix-fs", + "gix-glob", + "gix-hash", + "gix-hashtable", + "gix-ignore", + "gix-index", + "gix-lock", "gix-mailmap", "gix-merge", "gix-negotiate", - "gix-object 0.49.1", + "gix-object", "gix-odb", "gix-pack", - "gix-path 0.10.17", + "gix-path", "gix-pathspec", "gix-prompt", "gix-protocol", - "gix-ref 0.52.1", + "gix-ref", "gix-refspec", "gix-revision", - "gix-revwalk 0.20.1", - "gix-sec 0.11.0", + "gix-revwalk", + "gix-sec", "gix-shallow", "gix-status", "gix-submodule", - "gix-tempfile 17.1.0", + "gix-tempfile", "gix-testtools", - "gix-trace 0.1.12", + "gix-trace", "gix-transport", - "gix-traverse 0.46.1", + "gix-traverse", "gix-url", - "gix-utils 0.3.0", - "gix-validate 0.10.0", - "gix-worktree 0.41.0", + "gix-utils", + "gix-validate", + "gix-worktree", "gix-worktree-state", "gix-worktree-stream", "insta", @@ -1447,10 +1447,10 @@ version = "0.35.1" dependencies = [ "bstr", "document-features", - "gix-date 0.10.1", - "gix-hash 0.18.0", + "gix-date", + "gix-hash", "gix-testtools", - "gix-utils 0.3.0", + "gix-utils", "itoa", "pretty_assertions", "serde", @@ -1458,20 +1458,6 @@ dependencies = [ "winnow", ] -[[package]] -name = "gix-actor" -version = "0.35.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b300e6e4f31f3f6bd2de5e2b0caab192ced00dc0fcd0f7cc56e28c575c8e1ff" -dependencies = [ - "bstr", - "gix-date 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)", - "gix-utils 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "itoa", - "thiserror 2.0.12", - "winnow", -] - [[package]] name = "gix-archive" version = "0.21.1" @@ -1479,15 +1465,15 @@ dependencies = [ "bstr", "document-features", "flate2", - "gix-attributes 0.26.0", - "gix-date 0.10.1", + "gix-attributes", + "gix-date", "gix-filter", - "gix-hash 0.18.0", - "gix-object 0.49.1", + "gix-hash", + "gix-object", "gix-odb", - "gix-path 0.10.17", + "gix-path", "gix-testtools", - "gix-worktree 0.41.0", + "gix-worktree", "gix-worktree-stream", "jiff", "tar", @@ -1501,12 +1487,12 @@ version = "0.26.0" dependencies = [ "bstr", "document-features", - "gix-fs 0.15.0", - "gix-glob 0.20.0", - "gix-path 0.10.17", - "gix-quote 0.6.0", + "gix-fs", + "gix-glob", + "gix-path", + "gix-quote", "gix-testtools", - "gix-trace 0.1.12", + "gix-trace", "kstring", "serde", "smallvec", @@ -1514,23 +1500,6 @@ dependencies = [ "unicode-bom", ] -[[package]] -name = "gix-attributes" -version = "0.26.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7e26b3ac280ddb25bb6980d34f4a82ee326f78bf2c6d4ea45eef2d940048b8e" -dependencies = [ - "bstr", - "gix-glob 0.20.0 (registry+https://github.com/rust-lang/crates.io-index)", - "gix-path 0.10.17 (registry+https://github.com/rust-lang/crates.io-index)", - "gix-quote 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "gix-trace 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "kstring", - "smallvec", - "thiserror 2.0.12", - "unicode-bom", -] - [[package]] name = "gix-bitmap" version = "0.2.14" @@ -1539,34 +1508,25 @@ dependencies = [ "thiserror 2.0.12", ] -[[package]] -name = "gix-bitmap" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1db9765c69502650da68f0804e3dc2b5f8ccc6a2d104ca6c85bc40700d37540" -dependencies = [ - "thiserror 2.0.12", -] - [[package]] name = "gix-blame" version = "0.2.1" dependencies = [ - "gix-commitgraph 0.28.0", - "gix-date 0.10.1", + "gix-commitgraph", + "gix-date", "gix-diff", "gix-filter", - "gix-fs 0.15.0", - "gix-hash 0.18.0", - "gix-index 0.40.0", - "gix-object 0.49.1", + "gix-fs", + "gix-hash", + "gix-index", + "gix-object", "gix-odb", - "gix-ref 0.52.1", - "gix-revwalk 0.20.1", + "gix-ref", + "gix-revwalk", "gix-testtools", - "gix-trace 0.1.12", - "gix-traverse 0.46.1", - "gix-worktree 0.41.0", + "gix-trace", + "gix-traverse", + "gix-worktree", "pretty_assertions", "smallvec", "thiserror 2.0.12", @@ -1579,24 +1539,15 @@ dependencies = [ "thiserror 2.0.12", ] -[[package]] -name = "gix-chunk" -version = "0.4.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b1f1d8764958699dc764e3f727cef280ff4d1bd92c107bbf8acd85b30c1bd6f" -dependencies = [ - "thiserror 2.0.12", -] - [[package]] name = "gix-command" version = "0.6.0" dependencies = [ "bstr", - "gix-path 0.10.17", - "gix-quote 0.6.0", + "gix-path", + "gix-quote", "gix-testtools", - "gix-trace 0.1.12", + "gix-trace", "once_cell", "shell-words", ] @@ -1607,28 +1558,15 @@ version = "0.28.0" dependencies = [ "bstr", "document-features", - "gix-chunk 0.4.11", - "gix-date 0.10.1", - "gix-hash 0.18.0", + "gix-chunk", + "gix-date", + "gix-hash", "gix-testtools", "memmap2", "serde", "thiserror 2.0.12", ] -[[package]] -name = "gix-commitgraph" -version = "0.28.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e05050fd6caa6c731fe3bd7f9485b3b520be062d3d139cb2626e052d6c127951" -dependencies = [ - "bstr", - "gix-chunk 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", - "gix-hash 0.18.0 (registry+https://github.com/rust-lang/crates.io-index)", - "memmap2", - "thiserror 2.0.12", -] - [[package]] name = "gix-config" version = "0.45.1" @@ -1637,11 +1575,11 @@ dependencies = [ "criterion", "document-features", "gix-config-value", - "gix-features 0.42.1", - "gix-glob 0.20.0", - "gix-path 0.10.17", - "gix-ref 0.52.1", - "gix-sec 0.11.0", + "gix-features", + "gix-glob", + "gix-path", + "gix-ref", + "gix-sec", "memchr", "once_cell", "serde", @@ -1659,9 +1597,9 @@ dependencies = [ "bytesize", "cap", "gix-config", - "gix-path 0.10.17", - "gix-ref 0.52.1", - "gix-sec 0.11.0", + "gix-path", + "gix-ref", + "gix-sec", "gix-testtools", "serial_test", ] @@ -1673,7 +1611,7 @@ dependencies = [ "bitflags 2.9.0", "bstr", "document-features", - "gix-path 0.10.17", + "gix-path", "libc", "serde", "thiserror 2.0.12", @@ -1687,11 +1625,11 @@ dependencies = [ "document-features", "gix-command", "gix-config-value", - "gix-path 0.10.17", + "gix-path", "gix-prompt", - "gix-sec 0.11.0", + "gix-sec", "gix-testtools", - "gix-trace 0.1.12", + "gix-trace", "gix-url", "once_cell", "serde", @@ -1704,7 +1642,7 @@ version = "0.10.1" dependencies = [ "bstr", "document-features", - "gix-hash 0.18.0", + "gix-hash", "gix-testtools", "itoa", "jiff", @@ -1715,19 +1653,6 @@ dependencies = [ "thiserror 2.0.12", ] -[[package]] -name = "gix-date" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a98593f1f1e14b9fa15c5b921b2c465e904d698b9463e21bb377be8376c3c1a" -dependencies = [ - "bstr", - "itoa", - "jiff", - "smallvec", - "thiserror 2.0.12", -] - [[package]] name = "gix-diff" version = "0.52.1" @@ -1735,19 +1660,19 @@ dependencies = [ "bstr", "document-features", "getrandom 0.2.15", - "gix-attributes 0.26.0", + "gix-attributes", "gix-command", "gix-filter", - "gix-fs 0.15.0", - "gix-hash 0.18.0", - "gix-index 0.40.0", - "gix-object 0.49.1", - "gix-path 0.10.17", + "gix-fs", + "gix-hash", + "gix-index", + "gix-object", + "gix-path", "gix-pathspec", - "gix-tempfile 17.1.0", - "gix-trace 0.1.12", - "gix-traverse 0.46.1", - "gix-worktree 0.41.0", + "gix-tempfile", + "gix-trace", + "gix-traverse", + "gix-worktree", "imara-diff", "serde", "thiserror 2.0.12", @@ -1759,15 +1684,15 @@ version = "0.0.0" dependencies = [ "gix-diff", "gix-filter", - "gix-fs 0.15.0", - "gix-hash 0.18.0", - "gix-index 0.40.0", - "gix-object 0.49.1", + "gix-fs", + "gix-hash", + "gix-index", + "gix-object", "gix-odb", "gix-pathspec", "gix-testtools", - "gix-traverse 0.46.1", - "gix-worktree 0.41.0", + "gix-traverse", + "gix-worktree", "insta", "pretty_assertions", "shell-words", @@ -1778,17 +1703,17 @@ name = "gix-dir" version = "0.14.1" dependencies = [ "bstr", - "gix-discover 0.40.1", - "gix-fs 0.15.0", - "gix-ignore 0.15.0", - "gix-index 0.40.0", - "gix-object 0.49.1", - "gix-path 0.10.17", + "gix-discover", + "gix-fs", + "gix-ignore", + "gix-index", + "gix-object", + "gix-path", "gix-pathspec", "gix-testtools", - "gix-trace 0.1.12", - "gix-utils 0.3.0", - "gix-worktree 0.41.0", + "gix-trace", + "gix-utils", + "gix-worktree", "pretty_assertions", "thiserror 2.0.12", ] @@ -1800,11 +1725,11 @@ dependencies = [ "bstr", "defer", "dunce", - "gix-fs 0.15.0", - "gix-hash 0.18.0", - "gix-path 0.10.17", - "gix-ref 0.52.1", - "gix-sec 0.11.0", + "gix-fs", + "gix-hash", + "gix-path", + "gix-ref", + "gix-sec", "gix-testtools", "is_ci", "serial_test", @@ -1812,22 +1737,6 @@ dependencies = [ "thiserror 2.0.12", ] -[[package]] -name = "gix-discover" -version = "0.40.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dccfe3e25b4ea46083916c56db3ba9d1e6ef6dce54da485f0463f9fc0fe1837c" -dependencies = [ - "bstr", - "dunce", - "gix-fs 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", - "gix-hash 0.18.0 (registry+https://github.com/rust-lang/crates.io-index)", - "gix-path 0.10.17 (registry+https://github.com/rust-lang/crates.io-index)", - "gix-ref 0.52.1 (registry+https://github.com/rust-lang/crates.io-index)", - "gix-sec 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", - "thiserror 2.0.12", -] - [[package]] name = "gix-features" version = "0.42.1" @@ -1839,9 +1748,9 @@ dependencies = [ "crossbeam-channel", "document-features", "flate2", - "gix-path 0.10.17", - "gix-trace 0.1.12", - "gix-utils 0.3.0", + "gix-path", + "gix-trace", + "gix-utils", "libc", "once_cell", "parking_lot", @@ -1850,20 +1759,6 @@ dependencies = [ "walkdir", ] -[[package]] -name = "gix-features" -version = "0.42.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56f4399af6ec4fd9db84dd4cf9656c5c785ab492ab40a7c27ea92b4241923fed" -dependencies = [ - "gix-path 0.10.17 (registry+https://github.com/rust-lang/crates.io-index)", - "gix-trace 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "gix-utils 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc", - "prodash", - "walkdir", -] - [[package]] name = "gix-fetchhead" version = "0.0.0" @@ -1874,17 +1769,17 @@ version = "0.19.1" dependencies = [ "bstr", "encoding_rs", - "gix-attributes 0.26.0", + "gix-attributes", "gix-command", - "gix-hash 0.18.0", - "gix-object 0.49.1", + "gix-hash", + "gix-object", "gix-packetline-blocking", - "gix-path 0.10.17", - "gix-quote 0.6.0", + "gix-path", + "gix-quote", "gix-testtools", - "gix-trace 0.1.12", - "gix-utils 0.3.0", - "gix-worktree 0.41.0", + "gix-trace", + "gix-utils", + "gix-worktree", "serial_test", "smallvec", "thiserror 2.0.12", @@ -1897,36 +1792,22 @@ dependencies = [ "bstr", "crossbeam-channel", "fastrand", - "gix-features 0.42.1", - "gix-path 0.10.17", - "gix-utils 0.3.0", + "gix-features", + "gix-path", + "gix-utils", "is_ci", "serde", "tempfile", "thiserror 2.0.12", ] -[[package]] -name = "gix-fs" -version = "0.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67a0637149b4ef24d3ea55f81f77231401c8463fae6da27331c987957eb597c7" -dependencies = [ - "bstr", - "fastrand", - "gix-features 0.42.1 (registry+https://github.com/rust-lang/crates.io-index)", - "gix-path 0.10.17 (registry+https://github.com/rust-lang/crates.io-index)", - "gix-utils 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "thiserror 2.0.12", -] - [[package]] name = "gix-fsck" version = "0.11.1" dependencies = [ - "gix-hash 0.18.0", - "gix-hashtable 0.8.1", - "gix-object 0.49.1", + "gix-hash", + "gix-hashtable", + "gix-object", "gix-odb", "gix-testtools", ] @@ -1938,65 +1819,30 @@ dependencies = [ "bitflags 2.9.0", "bstr", "document-features", - "gix-features 0.42.1", - "gix-path 0.10.17", + "gix-features", + "gix-path", "gix-testtools", "serde", ] -[[package]] -name = "gix-glob" -version = "0.20.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2926b03666e83b8d01c10cf06e5733521aacbd2d97179a4c9b1fdddabb9e937d" -dependencies = [ - "bitflags 2.9.0", - "bstr", - "gix-features 0.42.1 (registry+https://github.com/rust-lang/crates.io-index)", - "gix-path 0.10.17 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "gix-hash" version = "0.18.0" dependencies = [ "document-features", "faster-hex", - "gix-features 0.42.1", + "gix-features", "gix-testtools", "serde", "sha1-checked", "thiserror 2.0.12", ] -[[package]] -name = "gix-hash" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d4900562c662852a6b42e2ef03442eccebf24f047d8eab4f23bc12ef0d785d8" -dependencies = [ - "faster-hex", - "gix-features 0.42.1 (registry+https://github.com/rust-lang/crates.io-index)", - "sha1-checked", - "thiserror 2.0.12", -] - [[package]] name = "gix-hashtable" version = "0.8.1" dependencies = [ - "gix-hash 0.18.0", - "hashbrown 0.14.5", - "parking_lot", -] - -[[package]] -name = "gix-hashtable" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5b5cb3c308b4144f2612ff64e32130e641279fcf1a84d8d40dad843b4f64904" -dependencies = [ - "gix-hash 0.18.0 (registry+https://github.com/rust-lang/crates.io-index)", + "gix-hash", "hashbrown 0.14.5", "parking_lot", ] @@ -2007,28 +1853,15 @@ version = "0.15.0" dependencies = [ "bstr", "document-features", - "gix-fs 0.15.0", - "gix-glob 0.20.0", - "gix-path 0.10.17", + "gix-fs", + "gix-glob", + "gix-path", "gix-testtools", - "gix-trace 0.1.12", + "gix-trace", "serde", "unicode-bom", ] -[[package]] -name = "gix-ignore" -version = "0.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae358c3c96660b10abc7da63c06788dfded603e717edbd19e38c6477911b71c8" -dependencies = [ - "bstr", - "gix-glob 0.20.0 (registry+https://github.com/rust-lang/crates.io-index)", - "gix-path 0.10.17 (registry+https://github.com/rust-lang/crates.io-index)", - "gix-trace 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "unicode-bom", -] - [[package]] name = "gix-index" version = "0.40.0" @@ -2038,16 +1871,16 @@ dependencies = [ "document-features", "filetime", "fnv", - "gix-bitmap 0.2.14", - "gix-features 0.42.1", - "gix-fs 0.15.0", - "gix-hash 0.18.0", - "gix-lock 17.1.0", - "gix-object 0.49.1", + "gix-bitmap", + "gix-features", + "gix-fs", + "gix-hash", + "gix-lock", + "gix-object", "gix-testtools", - "gix-traverse 0.46.1", - "gix-utils 0.3.0", - "gix-validate 0.10.0", + "gix-traverse", + "gix-utils", + "gix-validate", "hashbrown 0.14.5", "itoa", "libc", @@ -2058,44 +1891,16 @@ dependencies = [ "thiserror 2.0.12", ] -[[package]] -name = "gix-index" -version = "0.40.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6d505aea7d7c4267a3153cb90c712a89970b4dd02a2cb3205be322891f530b5" -dependencies = [ - "bitflags 2.9.0", - "bstr", - "filetime", - "fnv", - "gix-bitmap 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)", - "gix-features 0.42.1 (registry+https://github.com/rust-lang/crates.io-index)", - "gix-fs 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", - "gix-hash 0.18.0 (registry+https://github.com/rust-lang/crates.io-index)", - "gix-lock 17.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "gix-object 0.49.1 (registry+https://github.com/rust-lang/crates.io-index)", - "gix-traverse 0.46.1 (registry+https://github.com/rust-lang/crates.io-index)", - "gix-utils 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "gix-validate 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", - "hashbrown 0.14.5", - "itoa", - "libc", - "memmap2", - "rustix 1.0.7", - "smallvec", - "thiserror 2.0.12", -] - [[package]] name = "gix-index-tests" version = "0.0.0" dependencies = [ "bstr", "filetime", - "gix-features 0.42.1", - "gix-hash 0.18.0", - "gix-index 0.40.0", - "gix-object 0.49.1", + "gix-features", + "gix-hash", + "gix-index", + "gix-object", "gix-odb", "gix-testtools", ] @@ -2108,23 +1913,12 @@ version = "0.0.0" name = "gix-lock" version = "17.1.0" dependencies = [ - "gix-tempfile 17.1.0", - "gix-utils 0.3.0", + "gix-tempfile", + "gix-utils", "tempfile", "thiserror 2.0.12", ] -[[package]] -name = "gix-lock" -version = "17.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "570f8b034659f256366dc90f1a24924902f20acccd6a15be96d44d1269e7a796" -dependencies = [ - "gix-tempfile 17.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "gix-utils 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "thiserror 2.0.12", -] - [[package]] name = "gix-macros" version = "0.1.5" @@ -2141,8 +1935,8 @@ version = "0.27.1" dependencies = [ "bstr", "document-features", - "gix-actor 0.35.1", - "gix-date 0.10.1", + "gix-actor", + "gix-date", "gix-testtools", "serde", "thiserror 2.0.12", @@ -2157,20 +1951,20 @@ dependencies = [ "gix-command", "gix-diff", "gix-filter", - "gix-fs 0.15.0", - "gix-hash 0.18.0", - "gix-index 0.40.0", - "gix-object 0.49.1", + "gix-fs", + "gix-hash", + "gix-index", + "gix-object", "gix-odb", - "gix-path 0.10.17", - "gix-quote 0.6.0", + "gix-path", + "gix-quote", "gix-revision", - "gix-revwalk 0.20.1", - "gix-tempfile 17.1.0", + "gix-revwalk", + "gix-tempfile", "gix-testtools", - "gix-trace 0.1.12", - "gix-utils 0.3.0", - "gix-worktree 0.41.0", + "gix-trace", + "gix-utils", + "gix-worktree", "imara-diff", "pretty_assertions", "serde", @@ -2183,13 +1977,13 @@ name = "gix-negotiate" version = "0.20.1" dependencies = [ "bitflags 2.9.0", - "gix-commitgraph 0.28.0", - "gix-date 0.10.1", - "gix-hash 0.18.0", - "gix-object 0.49.1", + "gix-commitgraph", + "gix-date", + "gix-hash", + "gix-object", "gix-odb", - "gix-ref 0.52.1", - "gix-revwalk 0.20.1", + "gix-ref", + "gix-revwalk", "gix-testtools", "smallvec", "thiserror 2.0.12", @@ -2206,16 +2000,16 @@ dependencies = [ "bstr", "criterion", "document-features", - "gix-actor 0.35.1", - "gix-date 0.10.1", - "gix-features 0.42.1", - "gix-hash 0.18.0", - "gix-hashtable 0.8.1", + "gix-actor", + "gix-date", + "gix-features", + "gix-hash", + "gix-hashtable", "gix-odb", - "gix-path 0.10.17", + "gix-path", "gix-testtools", - "gix-utils 0.3.0", - "gix-validate 0.10.0", + "gix-utils", + "gix-validate", "itoa", "pretty_assertions", "serde", @@ -2225,42 +2019,21 @@ dependencies = [ "winnow", ] -[[package]] -name = "gix-object" -version = "0.49.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d957ca3640c555d48bb27f8278c67169fa1380ed94f6452c5590742524c40fbb" -dependencies = [ - "bstr", - "gix-actor 0.35.1 (registry+https://github.com/rust-lang/crates.io-index)", - "gix-date 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)", - "gix-features 0.42.1 (registry+https://github.com/rust-lang/crates.io-index)", - "gix-hash 0.18.0 (registry+https://github.com/rust-lang/crates.io-index)", - "gix-hashtable 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", - "gix-path 0.10.17 (registry+https://github.com/rust-lang/crates.io-index)", - "gix-utils 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "gix-validate 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", - "itoa", - "smallvec", - "thiserror 2.0.12", - "winnow", -] - [[package]] name = "gix-odb" version = "0.69.1" dependencies = [ "arc-swap", "document-features", - "gix-date 0.10.1", - "gix-features 0.42.1", - "gix-fs 0.15.0", - "gix-hash 0.18.0", - "gix-hashtable 0.8.1", - "gix-object 0.49.1", + "gix-date", + "gix-features", + "gix-fs", + "gix-hash", + "gix-hashtable", + "gix-object", "gix-pack", - "gix-path 0.10.17", - "gix-quote 0.6.0", + "gix-path", + "gix-quote", "parking_lot", "serde", "tempfile", @@ -2273,11 +2046,11 @@ version = "0.0.0" dependencies = [ "crossbeam-channel", "filetime", - "gix-actor 0.35.1", - "gix-date 0.10.1", - "gix-features 0.42.1", - "gix-hash 0.18.0", - "gix-object 0.49.1", + "gix-actor", + "gix-date", + "gix-features", + "gix-hash", + "gix-object", "gix-odb", "gix-pack", "gix-testtools", @@ -2291,16 +2064,16 @@ version = "0.59.1" dependencies = [ "clru", "document-features", - "gix-chunk 0.4.11", + "gix-chunk", "gix-diff", - "gix-features 0.42.1", - "gix-hash 0.18.0", - "gix-hashtable 0.8.1", - "gix-object 0.49.1", - "gix-path 0.10.17", - "gix-tempfile 17.1.0", + "gix-features", + "gix-hash", + "gix-hashtable", + "gix-object", + "gix-path", + "gix-tempfile", "gix-testtools", - "gix-traverse 0.46.1", + "gix-traverse", "memmap2", "parking_lot", "serde", @@ -2314,13 +2087,13 @@ name = "gix-pack-tests" version = "0.0.0" dependencies = [ "bstr", - "gix-features 0.42.1", - "gix-hash 0.18.0", - "gix-object 0.49.1", + "gix-features", + "gix-hash", + "gix-object", "gix-odb", "gix-pack", "gix-testtools", - "gix-traverse 0.46.1", + "gix-traverse", "maplit", "memmap2", ] @@ -2335,10 +2108,10 @@ dependencies = [ "faster-hex", "futures-io", "futures-lite", - "gix-hash 0.18.0", + "gix-hash", "gix-odb", "gix-pack", - "gix-trace 0.1.12", + "gix-trace", "maybe-async", "pin-project-lite", "serde", @@ -2352,7 +2125,7 @@ dependencies = [ "bstr", "document-features", "faster-hex", - "gix-trace 0.1.12", + "gix-trace", "serde", "thiserror 2.0.12", ] @@ -2363,8 +2136,8 @@ version = "0.10.17" dependencies = [ "bstr", "gix-testtools", - "gix-trace 0.1.12", - "gix-validate 0.10.0", + "gix-trace", + "gix-validate", "home", "known-folders", "once_cell", @@ -2374,30 +2147,16 @@ dependencies = [ "winreg", ] -[[package]] -name = "gix-path" -version = "0.10.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c091d2e887e02c3462f52252c5ea61150270c0f2657b642e8d0d6df56c16e642" -dependencies = [ - "bstr", - "gix-trace 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "gix-validate 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", - "home", - "once_cell", - "thiserror 2.0.12", -] - [[package]] name = "gix-pathspec" version = "0.11.0" dependencies = [ "bitflags 2.9.0", "bstr", - "gix-attributes 0.26.0", + "gix-attributes", "gix-config-value", - "gix-glob 0.20.0", - "gix-path 0.10.17", + "gix-glob", + "gix-path", "gix-testtools", "once_cell", "serial_test", @@ -2429,20 +2188,20 @@ dependencies = [ "futures-io", "futures-lite", "gix-credentials", - "gix-date 0.10.1", - "gix-features 0.42.1", - "gix-hash 0.18.0", - "gix-lock 17.1.0", + "gix-date", + "gix-features", + "gix-hash", + "gix-lock", "gix-negotiate", - "gix-object 0.49.1", + "gix-object", "gix-packetline", - "gix-ref 0.52.1", + "gix-ref", "gix-refspec", - "gix-revwalk 0.20.1", + "gix-revwalk", "gix-shallow", - "gix-trace 0.1.12", + "gix-trace", "gix-transport", - "gix-utils 0.3.0", + "gix-utils", "maybe-async", "serde", "thiserror 2.0.12", @@ -2454,18 +2213,7 @@ name = "gix-quote" version = "0.6.0" dependencies = [ "bstr", - "gix-utils 0.3.0", - "thiserror 2.0.12", -] - -[[package]] -name = "gix-quote" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a375a75b4d663e8bafe3bf4940a18a23755644c13582fa326e99f8f987d83fd" -dependencies = [ - "bstr", - "gix-utils 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "gix-utils", "thiserror 2.0.12", ] @@ -2478,61 +2226,40 @@ name = "gix-ref" version = "0.52.1" dependencies = [ "document-features", - "gix-actor 0.35.1", - "gix-date 0.10.1", - "gix-features 0.42.1", - "gix-fs 0.15.0", - "gix-hash 0.18.0", - "gix-lock 17.1.0", - "gix-object 0.49.1", - "gix-path 0.10.17", - "gix-tempfile 17.1.0", + "gix-actor", + "gix-date", + "gix-features", + "gix-fs", + "gix-hash", + "gix-lock", + "gix-object", + "gix-path", + "gix-tempfile", "gix-testtools", - "gix-utils 0.3.0", - "gix-validate 0.10.0", + "gix-utils", + "gix-validate", "memmap2", "serde", "thiserror 2.0.12", "winnow", ] -[[package]] -name = "gix-ref" -version = "0.52.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1b7985657029684d759f656b09abc3e2c73085596d5cdb494428823970a7762" -dependencies = [ - "gix-actor 0.35.1 (registry+https://github.com/rust-lang/crates.io-index)", - "gix-features 0.42.1 (registry+https://github.com/rust-lang/crates.io-index)", - "gix-fs 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", - "gix-hash 0.18.0 (registry+https://github.com/rust-lang/crates.io-index)", - "gix-lock 17.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "gix-object 0.49.1 (registry+https://github.com/rust-lang/crates.io-index)", - "gix-path 0.10.17 (registry+https://github.com/rust-lang/crates.io-index)", - "gix-tempfile 17.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "gix-utils 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "gix-validate 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", - "memmap2", - "thiserror 2.0.12", - "winnow", -] - [[package]] name = "gix-ref-tests" version = "0.0.0" dependencies = [ - "gix-actor 0.35.1", - "gix-date 0.10.1", - "gix-discover 0.40.1", - "gix-features 0.42.1", - "gix-fs 0.15.0", - "gix-hash 0.18.0", - "gix-lock 17.1.0", - "gix-object 0.49.1", + "gix-actor", + "gix-date", + "gix-discover", + "gix-features", + "gix-fs", + "gix-hash", + "gix-lock", + "gix-object", "gix-odb", - "gix-ref 0.52.1", + "gix-ref", "gix-testtools", - "gix-validate 0.10.0", + "gix-validate", "insta", ] @@ -2541,10 +2268,10 @@ name = "gix-refspec" version = "0.30.1" dependencies = [ "bstr", - "gix-hash 0.18.0", + "gix-hash", "gix-revision", "gix-testtools", - "gix-validate 0.10.0", + "gix-validate", "smallvec", "thiserror 2.0.12", ] @@ -2556,15 +2283,15 @@ dependencies = [ "bitflags 2.9.0", "bstr", "document-features", - "gix-commitgraph 0.28.0", - "gix-date 0.10.1", - "gix-hash 0.18.0", - "gix-hashtable 0.8.1", - "gix-object 0.49.1", + "gix-commitgraph", + "gix-date", + "gix-hash", + "gix-hashtable", + "gix-object", "gix-odb", - "gix-revwalk 0.20.1", + "gix-revwalk", "gix-testtools", - "gix-trace 0.1.12", + "gix-trace", "permutohedron", "serde", "thiserror 2.0.12", @@ -2574,56 +2301,29 @@ dependencies = [ name = "gix-revwalk" version = "0.20.1" dependencies = [ - "gix-commitgraph 0.28.0", - "gix-date 0.10.1", - "gix-hash 0.18.0", - "gix-hashtable 0.8.1", - "gix-object 0.49.1", + "gix-commitgraph", + "gix-date", + "gix-hash", + "gix-hashtable", + "gix-object", "gix-testtools", "smallvec", "thiserror 2.0.12", ] -[[package]] -name = "gix-revwalk" -version = "0.20.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bc756b73225bf005ddeb871d1ca7b3c33e2417d0d53e56effa5a36765b52b28" -dependencies = [ - "gix-commitgraph 0.28.0 (registry+https://github.com/rust-lang/crates.io-index)", - "gix-date 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)", - "gix-hash 0.18.0 (registry+https://github.com/rust-lang/crates.io-index)", - "gix-hashtable 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", - "gix-object 0.49.1 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec", - "thiserror 2.0.12", -] - [[package]] name = "gix-sec" version = "0.11.0" dependencies = [ "bitflags 2.9.0", "document-features", - "gix-path 0.10.17", + "gix-path", "libc", "serde", "tempfile", "windows-sys 0.59.0", ] -[[package]] -name = "gix-sec" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0dabbc78c759ecc006b970339394951b2c8e1e38a37b072c105b80b84c308fd" -dependencies = [ - "bitflags 2.9.0", - "gix-path 0.10.17 (registry+https://github.com/rust-lang/crates.io-index)", - "libc", - "windows-sys 0.59.0", -] - [[package]] name = "gix-sequencer" version = "0.0.0" @@ -2633,8 +2333,8 @@ name = "gix-shallow" version = "0.4.0" dependencies = [ "bstr", - "gix-hash 0.18.0", - "gix-lock 17.1.0", + "gix-hash", + "gix-lock", "serde", "thiserror 2.0.12", ] @@ -2648,15 +2348,15 @@ dependencies = [ "filetime", "gix-diff", "gix-dir", - "gix-features 0.42.1", + "gix-features", "gix-filter", - "gix-fs 0.15.0", - "gix-hash 0.18.0", - "gix-index 0.40.0", - "gix-object 0.49.1", - "gix-path 0.10.17", + "gix-fs", + "gix-hash", + "gix-index", + "gix-object", + "gix-path", "gix-pathspec", - "gix-worktree 0.41.0", + "gix-worktree", "portable-atomic", "thiserror 2.0.12", ] @@ -2669,18 +2369,18 @@ dependencies = [ "filetime", "gix-diff", "gix-dir", - "gix-features 0.42.1", + "gix-features", "gix-filter", - "gix-fs 0.15.0", - "gix-hash 0.18.0", - "gix-index 0.40.0", - "gix-object 0.49.1", + "gix-fs", + "gix-hash", + "gix-index", + "gix-object", "gix-odb", - "gix-path 0.10.17", + "gix-path", "gix-pathspec", "gix-status", "gix-testtools", - "gix-worktree 0.41.0", + "gix-worktree", "pretty_assertions", ] @@ -2690,8 +2390,8 @@ version = "0.19.1" dependencies = [ "bstr", "gix-config", - "gix-features 0.42.1", - "gix-path 0.10.17", + "gix-features", + "gix-path", "gix-pathspec", "gix-refspec", "gix-testtools", @@ -2705,22 +2405,7 @@ version = "17.1.0" dependencies = [ "dashmap", "document-features", - "gix-fs 0.15.0", - "libc", - "once_cell", - "parking_lot", - "signal-hook", - "signal-hook-registry", - "tempfile", -] - -[[package]] -name = "gix-tempfile" -version = "17.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c750e8c008453a2dba67a2b0d928b7716e05da31173a3f5e351d5457ad4470aa" -dependencies = [ - "gix-fs 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", + "gix-fs", "libc", "once_cell", "parking_lot", @@ -2738,11 +2423,11 @@ dependencies = [ "document-features", "fastrand", "fs_extra", - "gix-discover 0.40.1 (registry+https://github.com/rust-lang/crates.io-index)", - "gix-fs 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", - "gix-lock 17.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "gix-tempfile 17.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "gix-worktree 0.41.0 (registry+https://github.com/rust-lang/crates.io-index)", + "gix-discover", + "gix-fs", + "gix-lock", + "gix-tempfile", + "gix-worktree", "io-close", "is_ci", "once_cell", @@ -2766,12 +2451,6 @@ dependencies = [ "tracing-core", ] -[[package]] -name = "gix-trace" -version = "0.1.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c396a2036920c69695f760a65e7f2677267ccf483f25046977d87e4cb2665f7" - [[package]] name = "gix-transport" version = "0.47.0" @@ -2787,12 +2466,12 @@ dependencies = [ "futures-lite", "gix-command", "gix-credentials", - "gix-features 0.42.1", - "gix-hash 0.18.0", + "gix-features", + "gix-hash", "gix-pack", "gix-packetline", - "gix-quote 0.6.0", - "gix-sec 0.11.0", + "gix-quote", + "gix-sec", "gix-url", "maybe-async", "pin-project-lite", @@ -2806,29 +2485,12 @@ name = "gix-traverse" version = "0.46.1" dependencies = [ "bitflags 2.9.0", - "gix-commitgraph 0.28.0", - "gix-date 0.10.1", - "gix-hash 0.18.0", - "gix-hashtable 0.8.1", - "gix-object 0.49.1", - "gix-revwalk 0.20.1", - "smallvec", - "thiserror 2.0.12", -] - -[[package]] -name = "gix-traverse" -version = "0.46.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39094185f6d9a4d81101130fbbf7f598a06441d774ae3b3ae7930a613bbe1157" -dependencies = [ - "bitflags 2.9.0", - "gix-commitgraph 0.28.0 (registry+https://github.com/rust-lang/crates.io-index)", - "gix-date 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)", - "gix-hash 0.18.0 (registry+https://github.com/rust-lang/crates.io-index)", - "gix-hashtable 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", - "gix-object 0.49.1 (registry+https://github.com/rust-lang/crates.io-index)", - "gix-revwalk 0.20.1 (registry+https://github.com/rust-lang/crates.io-index)", + "gix-commitgraph", + "gix-date", + "gix-hash", + "gix-hashtable", + "gix-object", + "gix-revwalk", "smallvec", "thiserror 2.0.12", ] @@ -2837,12 +2499,12 @@ dependencies = [ name = "gix-traverse-tests" version = "0.0.0" dependencies = [ - "gix-commitgraph 0.28.0", - "gix-hash 0.18.0", - "gix-object 0.49.1", + "gix-commitgraph", + "gix-hash", + "gix-object", "gix-odb", "gix-testtools", - "gix-traverse 0.46.1", + "gix-traverse", "insta", ] @@ -2857,8 +2519,8 @@ dependencies = [ "assert_matches", "bstr", "document-features", - "gix-features 0.42.1", - "gix-path 0.10.17", + "gix-features", + "gix-path", "gix-testtools", "percent-encoding", "serde", @@ -2875,16 +2537,6 @@ dependencies = [ "unicode-normalization", ] -[[package]] -name = "gix-utils" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5351af2b172caf41a3728eb4455326d84e0d70fe26fc4de74ab0bd37df4191c5" -dependencies = [ - "fastrand", - "unicode-normalization", -] - [[package]] name = "gix-validate" version = "0.10.0" @@ -2894,68 +2546,39 @@ dependencies = [ "thiserror 2.0.12", ] -[[package]] -name = "gix-validate" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77b9e00cacde5b51388d28ed746c493b18a6add1f19b5e01d686b3b9ece66d4d" -dependencies = [ - "bstr", - "thiserror 2.0.12", -] - [[package]] name = "gix-worktree" version = "0.41.0" dependencies = [ "bstr", "document-features", - "gix-attributes 0.26.0", - "gix-features 0.42.1", - "gix-fs 0.15.0", - "gix-glob 0.20.0", - "gix-hash 0.18.0", - "gix-ignore 0.15.0", - "gix-index 0.40.0", - "gix-object 0.49.1", - "gix-path 0.10.17", - "gix-validate 0.10.0", + "gix-attributes", + "gix-features", + "gix-fs", + "gix-glob", + "gix-hash", + "gix-ignore", + "gix-index", + "gix-object", + "gix-path", + "gix-validate", "serde", ] -[[package]] -name = "gix-worktree" -version = "0.41.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54f1916f8d928268300c977d773dd70a8746b646873b77add0a34876a8c847e9" -dependencies = [ - "bstr", - "gix-attributes 0.26.0 (registry+https://github.com/rust-lang/crates.io-index)", - "gix-features 0.42.1 (registry+https://github.com/rust-lang/crates.io-index)", - "gix-fs 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", - "gix-glob 0.20.0 (registry+https://github.com/rust-lang/crates.io-index)", - "gix-hash 0.18.0 (registry+https://github.com/rust-lang/crates.io-index)", - "gix-ignore 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", - "gix-index 0.40.0 (registry+https://github.com/rust-lang/crates.io-index)", - "gix-object 0.49.1 (registry+https://github.com/rust-lang/crates.io-index)", - "gix-path 0.10.17 (registry+https://github.com/rust-lang/crates.io-index)", - "gix-validate 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "gix-worktree-state" version = "0.19.0" dependencies = [ "bstr", - "gix-features 0.42.1", + "gix-features", "gix-filter", - "gix-fs 0.15.0", - "gix-glob 0.20.0", - "gix-hash 0.18.0", - "gix-index 0.40.0", - "gix-object 0.49.1", - "gix-path 0.10.17", - "gix-worktree 0.41.0", + "gix-fs", + "gix-glob", + "gix-hash", + "gix-index", + "gix-object", + "gix-path", + "gix-worktree", "io-close", "thiserror 2.0.12", ] @@ -2964,13 +2587,13 @@ dependencies = [ name = "gix-worktree-state-tests" version = "0.0.0" dependencies = [ - "gix-discover 0.40.1", - "gix-features 0.42.1", + "gix-discover", + "gix-features", "gix-filter", - "gix-fs 0.15.0", - "gix-hash 0.18.0", - "gix-index 0.40.0", - "gix-object 0.49.1", + "gix-fs", + "gix-hash", + "gix-index", + "gix-object", "gix-odb", "gix-testtools", "gix-worktree-state", @@ -2983,17 +2606,17 @@ dependencies = [ name = "gix-worktree-stream" version = "0.21.1" dependencies = [ - "gix-attributes 0.26.0", - "gix-features 0.42.1", + "gix-attributes", + "gix-features", "gix-filter", - "gix-fs 0.15.0", - "gix-hash 0.18.0", - "gix-object 0.49.1", + "gix-fs", + "gix-hash", + "gix-object", "gix-odb", - "gix-path 0.10.17", + "gix-path", "gix-testtools", - "gix-traverse 0.46.1", - "gix-worktree 0.41.0", + "gix-traverse", + "gix-worktree", "parking_lot", "thiserror 2.0.12", ] @@ -3003,19 +2626,19 @@ name = "gix-worktree-tests" version = "0.0.0" dependencies = [ "bstr", - "gix-attributes 0.26.0", - "gix-discover 0.40.1", - "gix-features 0.42.1", - "gix-fs 0.15.0", - "gix-glob 0.20.0", - "gix-hash 0.18.0", - "gix-ignore 0.15.0", - "gix-index 0.40.0", - "gix-object 0.49.1", + "gix-attributes", + "gix-discover", + "gix-features", + "gix-fs", + "gix-glob", + "gix-hash", + "gix-ignore", + "gix-index", + "gix-object", "gix-odb", - "gix-path 0.10.17", + "gix-path", "gix-testtools", - "gix-worktree 0.41.0", + "gix-worktree", "symlink", ] diff --git a/tests/tools/Cargo.toml b/tests/tools/Cargo.toml index 988a26d504b..3369c00441b 100644 --- a/tests/tools/Cargo.toml +++ b/tests/tools/Cargo.toml @@ -25,11 +25,11 @@ default = [] xz = ["dep:xz2"] [dependencies] -gix-lock = "17.1.0" -gix-discover = "0.40.1" -gix-worktree = "0.41.0" -gix-fs = "0.15.0" -gix-tempfile = { version = "17.1.0", default-features = false, features = ["signals"] } +gix-lock = { version = "17.1.0", path = "../../gix-lock" } +gix-discover = { version = "0.40.1", path = "../../gix-discover" } +gix-worktree = { version = "0.41.0", path = "../../gix-worktree" } +gix-fs = { version = "0.15.0", path = "../../gix-fs" } +gix-tempfile = { version = "17.1.0", path = "../../gix-tempfile", default-features = false, features = ["signals"] } winnow = { version = "0.7.7", features = ["simd"] } fastrand = "2.0.0" From 2894fc9a042ceed6aa4864539f7005d7fcb978c1 Mon Sep 17 00:00:00 2001 From: Eliah Kagan Date: Sun, 4 May 2025 21:39:18 -0400 Subject: [PATCH 031/166] Use `-p` where no longer ambiguous The previous commit notes: > Before this, some actions we'd prefer to do by ` -p ` > had to be done by `(cd ; )`. This was needed to > operate on `gix-*` crates in the workspace that are also > dependencies, even transitively, of `gix-testtools`. All occurrences of `cd ...` followed immediately by a `cargo` command in the `justfile` and in `ci.yml` were for that reason. This commit changes them to use `-p` instead. The changes in the `justfile` affect both manual runs and runs on CI through the `test` job. The changes directly in `ci.yml` affect the `wasm` jobs. This is intended to be a refactoring. No change is anticipated in what tests are run, their features, or their behavior. The rationale is twofold: - Simplify the commands. This is the form most other such commmands were already written in. These seem to have been written in the `cd` form only as a workaround for the now-fixed `-p` ambiguity. - Verify that the fix actually works and that there is nothing else breaking these checks when they are run from the top level of the workspace. --- .github/workflows/ci.yml | 10 +++++----- justfile | 38 ++++++++++++++------------------------ 2 files changed, 19 insertions(+), 29 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index b1795b04107..d81056d9e4b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -370,7 +370,7 @@ jobs: run: | set +x for crate in gix-sec; do - (cd -- "$crate" && cargo build --target "$TARGET") + cargo build -p "$crate" --target "$TARGET" done - name: crates without feature toggles run: | @@ -401,22 +401,22 @@ jobs: ) set +x for crate in "${crates[@]}"; do - (cd -- "$crate" && cargo build --target "$TARGET") + cargo build -p "$crate" --target "$TARGET" done - name: features of gix-features run: | set +x for feature in progress parallel io-pipe crc32 zlib cache-efficiency-debug; do - (cd gix-features && cargo build --features "$feature" --target "$TARGET") + cargo build -p gix-features --features "$feature" --target "$TARGET" done - name: crates with 'wasm' feature run: | set +x for crate in gix-pack; do - (cd -- "$crate" && cargo build --features wasm --target "$TARGET") + cargo build -p "$crate" --features wasm --target "$TARGET" done - name: gix-pack with all features (including wasm) - run: cd gix-pack && cargo build --all-features --target "$TARGET" + run: cargo build -p gix-pack --all-features --target "$TARGET" check-packetline: strategy: diff --git a/justfile b/justfile index 777a04d3d6d..c02e4924cbe 100755 --- a/justfile +++ b/justfile @@ -63,22 +63,16 @@ check: cargo check -p gix-pack --no-default-features cargo check -p gix-pack --no-default-features --features generate cargo check -p gix-pack --no-default-features --features streaming-input - cd gix-hash; \ - set -ex; \ - cargo check --all-features; \ - cargo check - cd gix-object; \ - set -ex; \ - cargo check --all-features; \ - cargo check --features verbose-object-parsing-errors - cd gix-attributes && cargo check --features serde - cd gix-glob && cargo check --features serde - cd gix-worktree; \ - set -ex; \ - cargo check --features serde; \ - cargo check --no-default-features; - cd gix-actor && cargo check --features serde - cd gix-date && cargo check --features serde + cargo check -p gix-hash --all-features + cargo check -p gix-hash + cargo check -p gix-object --all-features + cargo check -p gix-object --features verbose-object-parsing-errors + cargo check -p gix-attributes --features serde + cargo check -p gix-glob --features serde + cargo check -p gix-worktree --features serde + cargo check -p gix-worktree --no-default-features + cargo check -p gix-actor --features serde + cargo check -p gix-date --features serde cargo check -p gix-tempfile --features signals cargo check -p gix-tempfile --features hp-hashmap cargo check -p gix-pack --features serde @@ -87,7 +81,7 @@ check: cargo check -p gix-pack --features object-cache-dynamic cargo check -p gix-packetline --features blocking-io cargo check -p gix-packetline --features async-io - cd gix-index && cargo check --features serde + cargo check -p gix-index --features serde cargo check -p gix-credentials --features serde cargo check -p gix-sec --features serde cargo check -p gix-revision --features serde @@ -104,9 +98,7 @@ check: cargo check -p gix-features --features crc32 cargo check -p gix-features --features zlib cargo check -p gix-features --features cache-efficiency-debug - cd gix-commitgraph; \ - set -ex; \ - cargo check --all-features + cargo check -p gix-commitgraph --all-features cargo check -p gix-config-value --all-features cargo check -p gix-config --all-features cargo check -p gix-diff --no-default-features @@ -158,10 +150,8 @@ unit-tests: cargo nextest run -p gix-status-tests --features gix-features-parallel cargo nextest run -p gix-worktree-state-tests --features gix-features-parallel cargo nextest run -p gix-worktree-tests --features gix-features-parallel - cd gix-object; \ - set -ex; \ - cargo nextest run; \ - cargo nextest run --features verbose-object-parsing-errors + cargo nextest run -p gix-object + cargo nextest run -p gix-object --features verbose-object-parsing-errors cargo nextest run -p gix-tempfile --features signals cargo nextest run -p gix-features --all-features cargo nextest run -p gix-ref-tests --all-features From 2400158d6ce2ff28d428402f2d4030c04cd5f470 Mon Sep 17 00:00:00 2001 From: Eliah Kagan Date: Mon, 5 May 2025 05:42:12 +0000 Subject: [PATCH 032/166] Flip `:/` baseline skip from CI to local and extend For #1622, baseline comparisons in `find_youngest_matching_commit` where Git 2.47.* produces incorrect results were conditionally suppressed in the `regex_matches` test case in #1635. That was refined in #1719, and further refined in #1774. This builds on those, making substantial changes, in view of how: - We expect that CI have a very recent Git. The runners have been past 2.47.* for some time, and now have 2.49.*. Therefore it is no longer desirable to suppress the baseline comparison on CI. - #1774 only examined the `regex_matches` test case. That test runs when the `revparse-regex` feature, which is a default `gix` feature, is enabled. But when `revparse-regex` is not enabled, the `contained_string_matches` test case runs instead. This test suffers the same baseline comparison failures with the same Git versions, due to assertions analogous to those that were adjusted to let `regex_matches` proceed and pass. This can be verified by running PATH="$HOME/git-2.47.2/bin:$PATH" GIX_TEST_IGNORE_ARCHIVES=1 \ cargo nextest run -p gix \ revision::spec::from_bytes::regex::find_youngest_matching_commit \ --no-fail-fast --no-default-features \ --features max-performance-safe,comfort,basic where the `PATH` environment variable is set differently if the `git` command provided in a Git 2.47.* installation is elsewhere than `~/git-2.47.2/bin`. Output from such a run can be seen in: https://gist.github.com/EliahKagan/bd8525d048350fc80a7666d8819089db Therefore, if a conditional suppression of the baseline comparison is to be preserved in `regex_matches`, then an analogous suppression under the same conditions should be added to `contained_string_matches`. - Although most operating systems that package Git seem not to have 2.47.* as their latest available downstream version in any release, it seems a few do. In particular, Alpine Linux v3.21 has git 2.47.2-r0, as shown at: https://pkgs.alpinelinux.org/packages?name=git&branch=v3.21&repo=&arch=x86_64&origin=&flagged=&maintainer= Therefore, if it is desirable to work with as wide a range as possible of (currently supported) operating system releases as development environments, there may be a benefit to conditionally suppressing the baseline tests when Git 2.47.* is used *locally*. - However, doing this locally carries two downsides. First, the test code (even if refactored to decrease duplication) will be more complicated than if this is not done. Second, such an environment will still not be suitable for all development tasks, because generating the relevant test fixtures on it will contain incorrect baselines and therefore must not be committed. If they were to be committed by accident, then the problem would most likely be caught, because the tests would fail on CI, in other environments, and even in the same environment when run without `GIX_TEST_IGNORE_ARCHIVES` (in the absence of which the baseline comparisons are not suppressed). So this is not likely to have severely harmful effects. But it could be frustrating, because suppressing the baseline comparisons locally hides the usual evidence that the generated archives might not be suitable for committing. This commit keeps the baseline comparison in `regex_matches` but inverts its CI check so the suppression is only done locally rather than only on CI, adds the same (modified) suppression to the analogous `contained_string_matches` test case, and updates comments accordingly. We may or may not keep this approach. --- .../gix/revision/spec/from_bytes/regex.rs | 50 ++++++++++++++----- 1 file changed, 37 insertions(+), 13 deletions(-) diff --git a/gix/tests/gix/revision/spec/from_bytes/regex.rs b/gix/tests/gix/revision/spec/from_bytes/regex.rs index 1ea5324d5cf..b71e09e0030 100644 --- a/gix/tests/gix/revision/spec/from_bytes/regex.rs +++ b/gix/tests/gix/revision/spec/from_bytes/regex.rs @@ -67,10 +67,22 @@ mod find_youngest_matching_commit { fn contained_string_matches() { let repo = repo("complex_graph").unwrap(); - assert_eq!( - parse_spec(":/message", &repo).unwrap(), - Spec::from_id(hex_to_id("ef80b4b77b167f326351c93284dc0eb00dd54ff4").attach(&repo)) - ); + // See the comment on `skip_some_baselines` in the `regex_matches` test function below. + let skip_some_baselines = !is_ci::cached() + && std::env::var_os("GIX_TEST_IGNORE_ARCHIVES").is_some() + && ((2, 47, 0)..(2, 48, 0)).contains(&gix_testtools::GIT_VERSION); + + if skip_some_baselines { + assert_eq!( + parse_spec_no_baseline(":/message", &repo).unwrap(), + Spec::from_id(hex_to_id("ef80b4b77b167f326351c93284dc0eb00dd54ff4").attach(&repo)) + ); + } else { + assert_eq!( + parse_spec(":/message", &repo).unwrap(), + Spec::from_id(hex_to_id("ef80b4b77b167f326351c93284dc0eb00dd54ff4").attach(&repo)) + ); + } assert_eq!( parse_spec("@^{/!-B}", &repo).unwrap(), @@ -78,10 +90,17 @@ mod find_youngest_matching_commit { "negations work as well" ); - assert_eq!( - parse_spec(":/!-message", &repo).unwrap(), - Spec::from_id(hex_to_id("55e825ebe8fd2ff78cad3826afb696b96b576a7e").attach(&repo)) - ); + if skip_some_baselines { + assert_eq!( + parse_spec_no_baseline(":/!-message", &repo).unwrap(), + Spec::from_id(hex_to_id("55e825ebe8fd2ff78cad3826afb696b96b576a7e").attach(&repo)) + ); + } else { + assert_eq!( + parse_spec(":/!-message", &repo).unwrap(), + Spec::from_id(hex_to_id("55e825ebe8fd2ff78cad3826afb696b96b576a7e").attach(&repo)) + ); + } assert_eq!( parse_spec_no_baseline(":/messa.e", &repo).unwrap_err().to_string(), @@ -95,16 +114,21 @@ mod find_youngest_matching_commit { fn regex_matches() { let repo = repo("complex_graph").unwrap(); - // The full Linux CI `test` job regenerates baselines instead of taking them from archives. - // Traversal order with `:/` is broken in Git 2.47.*, so some `parse_spec` assertions fail. - // The fix is in Git 2.48.* but is not backported. For now, we use `parse_spec_no_baseline` - // in affected test cases when they are run on CI with Git 2.47.*. For details, see: + // Traversal order with `:/` was broken in Git 2.47.*, so some `parse_spec` assertions + // fail. The fix is in Git 2.48.* but is not backported. This causes incorrect baselines to + // be computed when `GIX_TEST_IGNORE_ARCHIVES` is set. If that is not set, then archived + // baselines are used and there is no problem. On CI, we assume a sufficiently new version + // of Git. Otherwise, if `GIX_TEST_IGNORE_ARCHIVES` is set and Git 2.47.* is used, we skip + // the baseline check, to allow the rest of the test to proceed. This accommodates local + // development environments with a system-provided Git 2.47.*, though archives generated on + // such a system should not be committed, as they would still contain incorrect baselines. + // Please note that this workaround may be removed in the future. For more details, see: // // - https://lore.kernel.org/git/Z1LJSADiStlFicTL@pks.im/T/ // - https://lore.kernel.org/git/Z1LtS-8f8WZyobz3@pks.im/T/ // - https://github.com/git/git/blob/v2.48.0/Documentation/RelNotes/2.48.0.txt#L294-L296 // - https://github.com/GitoxideLabs/gitoxide/issues/1622 - let skip_some_baselines = is_ci::cached() + let skip_some_baselines = !is_ci::cached() && std::env::var_os("GIX_TEST_IGNORE_ARCHIVES").is_some() && ((2, 47, 0)..(2, 48, 0)).contains(&gix_testtools::GIT_VERSION); From b623bf1802474d92dbd0b63856c0b3b1f664e8d7 Mon Sep 17 00:00:00 2001 From: Eliah Kagan Date: Mon, 5 May 2025 06:49:12 +0000 Subject: [PATCH 033/166] Completely remove `:/` baseline skip This rolls back all changes made to work around the Git 2.47.* bug that underlies #1622, including the change made in the immediately preceding commit. This undoes the changes to `regex.rs` from #1635, #1719, #1774, and 2400158 (which is the immediately preceding commit). That file is now as it was in 3745212. The rationale is that the disadvantages of inverting the CI check and extending the suppresson, as described in the previous commit, really outweigh the advantages. This is mainly due to the risk of generating archives that should not be committed but seem based on test results like they could be committed. (The suppressions being removed here will most likely not be needed in the future, but if they are then this commit can be reverted, and the suppression will be done locally but on on CI, consistently across feature for which the relevant tests are run, and only when Git is found to be a version in the 2.47.* range.) Closes #1622 --- .../gix/revision/spec/from_bytes/regex.rs | 83 ++++--------------- 1 file changed, 16 insertions(+), 67 deletions(-) diff --git a/gix/tests/gix/revision/spec/from_bytes/regex.rs b/gix/tests/gix/revision/spec/from_bytes/regex.rs index b71e09e0030..fe7b4a5446d 100644 --- a/gix/tests/gix/revision/spec/from_bytes/regex.rs +++ b/gix/tests/gix/revision/spec/from_bytes/regex.rs @@ -67,22 +67,10 @@ mod find_youngest_matching_commit { fn contained_string_matches() { let repo = repo("complex_graph").unwrap(); - // See the comment on `skip_some_baselines` in the `regex_matches` test function below. - let skip_some_baselines = !is_ci::cached() - && std::env::var_os("GIX_TEST_IGNORE_ARCHIVES").is_some() - && ((2, 47, 0)..(2, 48, 0)).contains(&gix_testtools::GIT_VERSION); - - if skip_some_baselines { - assert_eq!( - parse_spec_no_baseline(":/message", &repo).unwrap(), - Spec::from_id(hex_to_id("ef80b4b77b167f326351c93284dc0eb00dd54ff4").attach(&repo)) - ); - } else { - assert_eq!( - parse_spec(":/message", &repo).unwrap(), - Spec::from_id(hex_to_id("ef80b4b77b167f326351c93284dc0eb00dd54ff4").attach(&repo)) - ); - } + assert_eq!( + parse_spec(":/message", &repo).unwrap(), + Spec::from_id(hex_to_id("ef80b4b77b167f326351c93284dc0eb00dd54ff4").attach(&repo)) + ); assert_eq!( parse_spec("@^{/!-B}", &repo).unwrap(), @@ -90,17 +78,10 @@ mod find_youngest_matching_commit { "negations work as well" ); - if skip_some_baselines { - assert_eq!( - parse_spec_no_baseline(":/!-message", &repo).unwrap(), - Spec::from_id(hex_to_id("55e825ebe8fd2ff78cad3826afb696b96b576a7e").attach(&repo)) - ); - } else { - assert_eq!( - parse_spec(":/!-message", &repo).unwrap(), - Spec::from_id(hex_to_id("55e825ebe8fd2ff78cad3826afb696b96b576a7e").attach(&repo)) - ); - } + assert_eq!( + parse_spec(":/!-message", &repo).unwrap(), + Spec::from_id(hex_to_id("55e825ebe8fd2ff78cad3826afb696b96b576a7e").attach(&repo)) + ); assert_eq!( parse_spec_no_baseline(":/messa.e", &repo).unwrap_err().to_string(), @@ -114,52 +95,20 @@ mod find_youngest_matching_commit { fn regex_matches() { let repo = repo("complex_graph").unwrap(); - // Traversal order with `:/` was broken in Git 2.47.*, so some `parse_spec` assertions - // fail. The fix is in Git 2.48.* but is not backported. This causes incorrect baselines to - // be computed when `GIX_TEST_IGNORE_ARCHIVES` is set. If that is not set, then archived - // baselines are used and there is no problem. On CI, we assume a sufficiently new version - // of Git. Otherwise, if `GIX_TEST_IGNORE_ARCHIVES` is set and Git 2.47.* is used, we skip - // the baseline check, to allow the rest of the test to proceed. This accommodates local - // development environments with a system-provided Git 2.47.*, though archives generated on - // such a system should not be committed, as they would still contain incorrect baselines. - // Please note that this workaround may be removed in the future. For more details, see: - // - // - https://lore.kernel.org/git/Z1LJSADiStlFicTL@pks.im/T/ - // - https://lore.kernel.org/git/Z1LtS-8f8WZyobz3@pks.im/T/ - // - https://github.com/git/git/blob/v2.48.0/Documentation/RelNotes/2.48.0.txt#L294-L296 - // - https://github.com/GitoxideLabs/gitoxide/issues/1622 - let skip_some_baselines = !is_ci::cached() - && std::env::var_os("GIX_TEST_IGNORE_ARCHIVES").is_some() - && ((2, 47, 0)..(2, 48, 0)).contains(&gix_testtools::GIT_VERSION); - - if skip_some_baselines { - assert_eq!( - parse_spec_no_baseline(":/mes.age", &repo).unwrap(), - Spec::from_id(hex_to_id("ef80b4b77b167f326351c93284dc0eb00dd54ff4").attach(&repo)) - ); - } else { - assert_eq!( - parse_spec(":/mes.age", &repo).unwrap(), - Spec::from_id(hex_to_id("ef80b4b77b167f326351c93284dc0eb00dd54ff4").attach(&repo)) - ); - } + assert_eq!( + parse_spec(":/mes.age", &repo).unwrap(), + Spec::from_id(hex_to_id("ef80b4b77b167f326351c93284dc0eb00dd54ff4").attach(&repo)) + ); assert_eq!( parse_spec(":/not there", &repo).unwrap_err().to_string(), "None of 10 commits reached from all references matched regex \"not there\"" ); - if skip_some_baselines { - assert_eq!( - parse_spec_no_baseline(":/!-message", &repo).unwrap(), - Spec::from_id(hex_to_id("55e825ebe8fd2ff78cad3826afb696b96b576a7e").attach(&repo)) - ); - } else { - assert_eq!( - parse_spec(":/!-message", &repo).unwrap(), - Spec::from_id(hex_to_id("55e825ebe8fd2ff78cad3826afb696b96b576a7e").attach(&repo)) - ); - } + assert_eq!( + parse_spec(":/!-message", &repo).unwrap(), + Spec::from_id(hex_to_id("55e825ebe8fd2ff78cad3826afb696b96b576a7e").attach(&repo)) + ); assert_eq!( parse_spec("@^{/!-B}", &repo).unwrap(), From aebc33559c3260d6b1b31ea68d295a8f24e20659 Mon Sep 17 00:00:00 2001 From: Eliah Kagan Date: Mon, 5 May 2025 18:57:36 +0000 Subject: [PATCH 034/166] Change `if ...; then false; else true; fi` to `! ...` `! ...` is simpler, as well as easier to read in `just` output. The `if ...; then false; else true; fi` syntax seems to have been introduced in 72cf940, in a command that, at that time, was in the `Makefile`. It's unclear if there was a reason to prefer it at the time it was introduced. Both a `Makefile` and a `justfile` work fine with `!` as it is used here, in both cases it is preserved literally and passed to the shell, and in both cases the shell is by default `sh` on all systems. It looks like `!` may have been avoided to accommodate behavior of `bsdmake` (which was at one time the default `make` on macOS, and which remains the default `make` on various other systems), where at least in some versions an optimization to run commands without a shell is triggered even in the presence of a leading `!` and even though `!` is a shell keyword. This does happen today if `bsdmake` is installed on macOS via `brew`, but only with *simple* commands, as in a rule like this (if one fixes the indentation, to use tabs): hello: ! false Then: $ bsdmake hello ! false !:No such file or directory *** Error code 1 Whereas, with... hello: if false; then false; else true; fi ...the shell is used and it succeeds: $ bsdmake hello if false; then false; else true; fi However, this does not establish that the practice was needed even when the command was in a `Makefile`, because with... hello: ! false >/dev/null ...the presence of the redirection operator `>` is sufficient to cause a shell to be used, and it succeeds: $ bsdmake hello ! false >/dev/null All commands negated via `if ...; then false; else true; fi` in the history of `gitoxide` in the `Makefile` (as well as after they were moved to the `justfile`) seem to have used `>` redirection, because the point is to verify that a build command that should fail does fail, and it is distracting to show the full compiler output of the intended failure. So it seems `!` negation could have worked even with versions of `bsdmake` where it does not always work, and even when the commands were in the `Makefile`. (Though it may have been avoided in order to make immediately clear to human readers that no `!` misinterpretation would occur.) In any case, this is not in a `Makefile` at all anymore. Using `!` works locally and on CI, is easier to read, and the output is easier to understand, both in general and specifically in how it lines up with the explanatory comment. The output now looks like: # assure compile error occurs ! cargo check --features lean-async 2>/dev/null ! cargo check -p gitoxide-core --all-features 2>/dev/null ! cargo check -p gix-packetline --all-features 2>/dev/null ! cargo check -p gix-transport --all-features 2>/dev/null ! cargo check -p gix-protocol --all-features 2>/dev/null --- justfile | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/justfile b/justfile index c02e4924cbe..ee63a4b6026 100755 --- a/justfile +++ b/justfile @@ -45,16 +45,16 @@ check: cargo check --workspace cargo check --no-default-features --features small # assure compile error occurs - if cargo check --features lean-async 2>/dev/null; then false; else true; fi - if cargo check -p gitoxide-core --all-features 2>/dev/null; then false; else true; fi - if cargo check -p gix-packetline --all-features 2>/dev/null; then false; else true; fi - if cargo check -p gix-transport --all-features 2>/dev/null; then false; else true; fi - if cargo check -p gix-protocol --all-features 2>/dev/null; then false; else true; fi + ! cargo check --features lean-async 2>/dev/null + ! cargo check -p gitoxide-core --all-features 2>/dev/null + ! cargo check -p gix-packetline --all-features 2>/dev/null + ! cargo check -p gix-transport --all-features 2>/dev/null + ! cargo check -p gix-protocol --all-features 2>/dev/null cargo tree -p gix --no-default-features -e normal -i imara-diff 2>&1 | grep warning # warning happens if nothing found, no exit code :/ cargo tree -p gix --no-default-features -e normal -i gix-submodule 2>&1 | grep warning cargo tree -p gix --no-default-features -e normal -i gix-pathspec 2>&1 | grep warning cargo tree -p gix --no-default-features -e normal -i gix-filter 2>&1 | grep warning - if cargo tree -p gix --no-default-features -i gix-credentials 2>/dev/null; then false; else true; fi + ! cargo tree -p gix --no-default-features -i gix-credentials 2>/dev/null cargo check --no-default-features --features lean cargo check --no-default-features --features lean-async cargo check --no-default-features --features max From ce071bf15f4b1f4380e6b6e42d26a263091113a2 Mon Sep 17 00:00:00 2001 From: Eliah Kagan Date: Mon, 5 May 2025 21:00:43 +0000 Subject: [PATCH 035/166] Clarify commands where we grep for a warning In this justfile, for the `cargo tree ...| grep warning` commands: - Put the explanatory comment before the first of these commands, rather than at the end of the first one, since this is easier to read in the `just` output, as well as clearer because it applies to a cluster of commands rather than only the first one. This is also more consistent stylistically with other comments in the `justfile`. - Pass `-F` to `grep`, as this is a literal search for the text `warning`. (This is a minor refactoring for clarity, and it may be changed soon if the check is made more precise.) --- justfile | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/justfile b/justfile index ee63a4b6026..e71b3b9e5a4 100755 --- a/justfile +++ b/justfile @@ -50,10 +50,11 @@ check: ! cargo check -p gix-packetline --all-features 2>/dev/null ! cargo check -p gix-transport --all-features 2>/dev/null ! cargo check -p gix-protocol --all-features 2>/dev/null - cargo tree -p gix --no-default-features -e normal -i imara-diff 2>&1 | grep warning # warning happens if nothing found, no exit code :/ - cargo tree -p gix --no-default-features -e normal -i gix-submodule 2>&1 | grep warning - cargo tree -p gix --no-default-features -e normal -i gix-pathspec 2>&1 | grep warning - cargo tree -p gix --no-default-features -e normal -i gix-filter 2>&1 | grep warning + # warning happens if nothing found, no exit code :/ + cargo tree -p gix --no-default-features -e normal -i imara-diff 2>&1 | grep -F warning + cargo tree -p gix --no-default-features -e normal -i gix-submodule 2>&1 | grep -F warning + cargo tree -p gix --no-default-features -e normal -i gix-pathspec 2>&1 | grep -F warning + cargo tree -p gix --no-default-features -e normal -i gix-filter 2>&1 | grep -F warning ! cargo tree -p gix --no-default-features -i gix-credentials 2>/dev/null cargo check --no-default-features --features lean cargo check --no-default-features --features lean-async From b8147f41b79c9199ff975422144f628c2d3f59bd Mon Sep 17 00:00:00 2001 From: Eliah Kagan Date: Mon, 5 May 2025 21:36:42 +0000 Subject: [PATCH 036/166] Harden checks that unwanted dependencies are absent The `check` recipe in the `justfile` contains several commands to check that, when particular packages are built without default features, this avoids having a particular other crate appear anywhere in the dependency tree (i.e., without default features, we do not depend on a particular named package). These are done by using `cargo tree` with the appropriate arguments to compute the inverse dependency tree from the crate whose absence we wish to assert. But because `cargo tree` treats an inverse tree with no nodes (not even its root) as a mere warning, we cannot check the exit code. So we parse the output for a warning. As implemented before this commit, those checks already had a high probability of giving the correct result. But they could have falsely passed. The technique being used was to redirect stderr to stdout, then search for the text `warning` anywhere in the combined output. This would falsely pass in either of two edge cases: 1. If the inverse dependency tree was produced, but contained a crate with `warning` in its name (or in associated details). 2. If a different warning than the anticipated one was produced, and the anticipated warning was not produced. This commit hardens the check against both those edge cases, by: 1. Discarding what `cargo tree` sends to stdout, rather than including it. (This has the minor disadvantage that the syntax may look wrong, or be less obvious in its effects, to readers less familiar with POSIX shell redirection syntax. The right side of a redirection operator, i.e. the filename to open or the file descriptor to duplicate, is dereferenced. So `2>&1` duplicates the original stdout and sends stderr to it, which works even though the immediately subsequent redirection `>/dev/null`, short for `1>/dev/null`, sends stdout to the null device. Although this is a common source of confusion, the actual semantics are exactly what we want here.) 2. Parsing more narrowly for the warning, ensuring it starts at the beginning of the line and that the warning message begins with the expected phrase. This, in particular, makes the commands significantly longer. But by showing the message, it also helps clarify what they are for. So even aside from keeping the checks from wrongly passing, this part of the change seems to improve clarity overall. --- justfile | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/justfile b/justfile index e71b3b9e5a4..a5020613e31 100755 --- a/justfile +++ b/justfile @@ -51,10 +51,14 @@ check: ! cargo check -p gix-transport --all-features 2>/dev/null ! cargo check -p gix-protocol --all-features 2>/dev/null # warning happens if nothing found, no exit code :/ - cargo tree -p gix --no-default-features -e normal -i imara-diff 2>&1 | grep -F warning - cargo tree -p gix --no-default-features -e normal -i gix-submodule 2>&1 | grep -F warning - cargo tree -p gix --no-default-features -e normal -i gix-pathspec 2>&1 | grep -F warning - cargo tree -p gix --no-default-features -e normal -i gix-filter 2>&1 | grep -F warning + cargo tree -p gix --no-default-features -e normal -i imara-diff \ + 2>&1 >/dev/null | grep '^warning: nothing to print\>' + cargo tree -p gix --no-default-features -e normal -i gix-submodule \ + 2>&1 >/dev/null | grep '^warning: nothing to print\>' + cargo tree -p gix --no-default-features -e normal -i gix-pathspec \ + 2>&1 >/dev/null | grep '^warning: nothing to print\>' + cargo tree -p gix --no-default-features -e normal -i gix-filter \ + 2>&1 >/dev/null | grep '^warning: nothing to print\>' ! cargo tree -p gix --no-default-features -i gix-credentials 2>/dev/null cargo check --no-default-features --features lean cargo check --no-default-features --features lean-async From 0a43f569baee1c33121527942a9964f99ff7d015 Mon Sep 17 00:00:00 2001 From: Eliah Kagan Date: Mon, 5 May 2025 23:06:23 +0000 Subject: [PATCH 037/166] Suppress color in `cargo tree` warnings for simpler grepping Without this, the `check` recipe in the `justfile` was failing on CI due to the change in the previous commit. On CI, we set `CARGO_TERM_COLOR` to `always`. The `--color` option takes precedence over the `CARGO_TERM_COLOR` environment variable. The suppresion is only done on those specific command whose stderr is being parsed. Other colorization remains allowed, including on CI. (An alternative to using `--color` here could be to make the `grep` pattern tolerate color codes where they may be present. But this would make the pattern considerably longer, more complicated, less less readable, and easier to get wrong.) --- justfile | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/justfile b/justfile index a5020613e31..57944710593 100755 --- a/justfile +++ b/justfile @@ -51,13 +51,13 @@ check: ! cargo check -p gix-transport --all-features 2>/dev/null ! cargo check -p gix-protocol --all-features 2>/dev/null # warning happens if nothing found, no exit code :/ - cargo tree -p gix --no-default-features -e normal -i imara-diff \ + cargo --color=never tree -p gix --no-default-features -e normal -i imara-diff \ 2>&1 >/dev/null | grep '^warning: nothing to print\>' - cargo tree -p gix --no-default-features -e normal -i gix-submodule \ + cargo --color=never tree -p gix --no-default-features -e normal -i gix-submodule \ 2>&1 >/dev/null | grep '^warning: nothing to print\>' - cargo tree -p gix --no-default-features -e normal -i gix-pathspec \ + cargo --color=never tree -p gix --no-default-features -e normal -i gix-pathspec \ 2>&1 >/dev/null | grep '^warning: nothing to print\>' - cargo tree -p gix --no-default-features -e normal -i gix-filter \ + cargo --color=never tree -p gix --no-default-features -e normal -i gix-filter \ 2>&1 >/dev/null | grep '^warning: nothing to print\>' ! cargo tree -p gix --no-default-features -i gix-credentials 2>/dev/null cargo check --no-default-features --features lean From 7be6b7f02f40e601d62fb829491fca151822405d Mon Sep 17 00:00:00 2001 From: Eliah Kagan Date: Mon, 5 May 2025 23:57:46 +0000 Subject: [PATCH 038/166] Cover `gix` with most features but no `extras` This expands the `unit-tests` recipe in the `justfile` (which is one of the recipes the full CI `test` job runs) to add a command that tests `gix` with all the current default features *except* for `extras` and its subfeatures. This appears to have been a missing potentially valuable area in testing. In particular, as noted in 2400158 (#1993), the Git 2.47.* bug that caused incorrect `find_youngest_matching_commit` baselines to be generated had applied equally to the `regex_matches` and `contained_string_matches` tests, but only the `regex_matches` failure was found locally in #1622 and on CI in #1635, because no combination of features under which `contained_string_matches` runs was tested. Thus, `contained_string_matches` was effectively not exercised, and regressions that it should catch, as well as the effect of possible changes to the test if any others are ever made, were not tested. This resulted in the mitigations for #1622 not covering that test either (until 2400158). This commit chooses a combination of features that may plausibly be in practical use and that is fairly simple to specify, to fill the gap. (If this turns out to slow things down too much, then it could be narrowed to only run some tests.) This only adds a command to the recipe. It does not remove any commands that were already there. `gix` remains tested in all the ways it was tested before, as well as in this one new way. --- justfile | 1 + 1 file changed, 1 insertion(+) diff --git a/justfile b/justfile index 57944710593..f2b0a1e081d 100755 --- a/justfile +++ b/justfile @@ -174,6 +174,7 @@ unit-tests: cargo nextest run -p gix-protocol --features blocking-client cargo nextest run -p gix-protocol --features async-client cargo nextest run -p gix --no-default-features + cargo nextest run -p gix --no-default-features --features basic,comfort,max-performance-safe cargo nextest run -p gix --no-default-features --features basic,extras,comfort,need-more-recent-msrv cargo nextest run -p gix --features async-network-client cargo nextest run -p gix --features blocking-network-client From ee55dedb9dbac1c89765c1433d7f209d3560e7e0 Mon Sep 17 00:00:00 2001 From: Eliah Kagan Date: Mon, 5 May 2025 22:26:56 -0400 Subject: [PATCH 039/166] Regroup CI doctests and adjust `unit-tests` recipe This seeks to make improvements in four overlapping areas: - The CI `test-fast` job for `windows-latest` had been taking the longest, and integrating PRs would be more efficient if it could be sped up. If it didn't have to build and run doctests, then it would run markedly faster. `test-fast` runs doctests because... - The `unit-tests` recipe in the `justfile`, which is one of the recipes the "full" CI `test` job runs via the `ci-test` recipe, runs a number of `nextest` commands on individual crates (with `-p`, except for testing the top-level `gitoxide` crate, and not with `--workspace`). It also ran doctests, but only on the `gitoxide` top-level crate. But the `gitoxide` crate currently has no doctests, while some `gix-*` crates do. - On CI, we usually prefer `--no-fail-fast`. But it is not always used, because the commands in the `unit-tests` justfile recipe do not use it. `--no-fail-fast` is not always preferred when running tests locally, but... - Both locally and on CI, in most cases that a test fails in a commmand in the `unit-tests` justfile recipe, the effect is that tests have run and results have been reported for multiple `nextest` commands, yet not all the tests specified in the most recent `nextest` command to run. Thus, omitting `--no-fail-fast` may not have the most intuitive effect in `just unit-tests`, even when run locally (even if the user would omit `--no-fail-fast` in individual `cargo nextest` runs carried out manually). This commit makes the following changes: 1. Add `--no-fail-fast` to each of the commands in the `unit-tests` recipe in the `justfile`: the numerous `cargo nextest` commands, as well as the `cargo test` command used to run doctests. 2. Add `--workspace` to the `cargo test` command used to run doctests in the `unit-tests` recipe in the `justfile`, and move it to the end of the recipe. 3. Not to be confused with that `cargo test` command, move the other `cargo test` command used to run doctests in the `ci.yml` workflow (which alredy passed `--workspace`, as its purpose was to run all doctests in all crates) from the `tests-fast` job definition into the `test-32bit-windows-size` job, and rename that latter job `test-32bit-windows-size-doc` accordingly. The rationale for (3) may not be obvious. The idea is: - Running the doctests on only one Unix-like system should be enough, so long as they are run for all crates in the workspace. So the change in the `unit-tests` recipe in the `justfile` makes it so the CI `test` job (which includes a `unit-tests` run) covers doctests sufficiently, *except* for Windows. - Although we should probably keep running doctests regularly on Windows, removing it from `test-fast`, including on Windows, is the simplest way to make the Windows `test-fast` job run faster. (It also makes the job definition clearer, since some of the other steps relate to each other more closely than they do to the step that ran the doctests.) - It should be sufficient to run the doctests in any Windows environment. And it is best to avoid adding a new Windows job just for this, since various other Windows jobs might be added sometime soon (such as for ARM64, native Windows containers, the Git for Windows SDK, MinGit, BusyBox MinGit, and possibly others; some of these may be possible to combine, but likely a few more Windows jobs may be introduced for these, so avoiding adding extra Windows jobs now may make it easier to avoid having too many Windows jobs, in terms of queuing, GHA cache usage, energy usage, and other resources). So if this can be added to another Windows job without causing problems, that is preferable. - The Windows job that took the least amount of time, usually by several minutes, was the `test-32bit-windows-size` job. It is hope that this keeps the benefits of #1556, #1559, and #1654, while improving CI testing performance most of the time. --- .github/workflows/ci.yml | 10 +++--- justfile | 70 ++++++++++++++++++++-------------------- 2 files changed, 40 insertions(+), 40 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d81056d9e4b..7a55e80c820 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -181,8 +181,6 @@ jobs: env: GIX_TEST_CREATE_ARCHIVES_EVEN_ON_CI: '1' run: cargo nextest run --workspace --no-fail-fast - - name: Doctest - run: cargo test --workspace --doc --no-fail-fast - name: Check that tracked archives are up to date run: git diff --exit-code # If this fails, the fix is usually to commit a regenerated archive. @@ -277,7 +275,7 @@ jobs: GIX_TEST_IGNORE_ARCHIVES: '1' run: cargo nextest run --workspace --no-fail-fast - test-32bit-windows-size: + test-32bit-windows-size-doc: runs-on: windows-latest env: @@ -292,8 +290,10 @@ jobs: - uses: taiki-e/install-action@v2 with: tool: nextest - - name: Test (nextest) + - name: Test data structure sizes (nextest) run: cargo nextest run --target $env:TARGET --workspace --no-fail-fast size + - name: Doctest + run: cargo test --workspace --doc --no-fail-fast lint: runs-on: ubuntu-latest @@ -497,7 +497,7 @@ jobs: - test-fast - test-fixtures-windows - test-32bit - - test-32bit-windows-size + - test-32bit-windows-size-doc - lint - cargo-deny - check-packetline diff --git a/justfile b/justfile index f2b0a1e081d..2a9255e07f0 100755 --- a/justfile +++ b/justfile @@ -144,41 +144,41 @@ doc $RUSTDOCFLAGS='-D warnings': # Run all unit tests unit-tests: - cargo nextest run - cargo test --doc - cargo nextest run -p gix-testtools - cargo nextest run -p gix-testtools --features xz - cargo nextest run -p gix-archive --no-default-features - cargo nextest run -p gix-archive --features tar - cargo nextest run -p gix-archive --features tar_gz - cargo nextest run -p gix-archive --features zip - cargo nextest run -p gix-status-tests --features gix-features-parallel - cargo nextest run -p gix-worktree-state-tests --features gix-features-parallel - cargo nextest run -p gix-worktree-tests --features gix-features-parallel - cargo nextest run -p gix-object - cargo nextest run -p gix-object --features verbose-object-parsing-errors - cargo nextest run -p gix-tempfile --features signals - cargo nextest run -p gix-features --all-features - cargo nextest run -p gix-ref-tests --all-features - cargo nextest run -p gix-odb --all-features - cargo nextest run -p gix-odb-tests --features gix-features-parallel - cargo nextest run -p gix-pack --all-features - cargo nextest run -p gix-pack-tests --features all-features - cargo nextest run -p gix-pack-tests --features gix-features-parallel - cargo nextest run -p gix-index-tests --features gix-features-parallel - cargo nextest run -p gix-packetline --features blocking-io,maybe-async/is_sync --test blocking-packetline - cargo nextest run -p gix-packetline --features async-io --test async-packetline - cargo nextest run -p gix-transport --features http-client-curl,maybe-async/is_sync - cargo nextest run -p gix-transport --features http-client-reqwest,maybe-async/is_sync - cargo nextest run -p gix-transport --features async-client - cargo nextest run -p gix-protocol --features blocking-client - cargo nextest run -p gix-protocol --features async-client - cargo nextest run -p gix --no-default-features - cargo nextest run -p gix --no-default-features --features basic,comfort,max-performance-safe - cargo nextest run -p gix --no-default-features --features basic,extras,comfort,need-more-recent-msrv - cargo nextest run -p gix --features async-network-client - cargo nextest run -p gix --features blocking-network-client - cargo nextest run -p gitoxide-core --lib --no-tests=warn + cargo nextest run --no-fail-fast + cargo nextest run -p gix-testtools --no-fail-fast + cargo nextest run -p gix-testtools --features xz --no-fail-fast + cargo nextest run -p gix-archive --no-default-features --no-fail-fast + cargo nextest run -p gix-archive --features tar --no-fail-fast + cargo nextest run -p gix-archive --features tar_gz --no-fail-fast + cargo nextest run -p gix-archive --features zip --no-fail-fast + cargo nextest run -p gix-status-tests --features gix-features-parallel --no-fail-fast + cargo nextest run -p gix-worktree-state-tests --features gix-features-parallel --no-fail-fast + cargo nextest run -p gix-worktree-tests --features gix-features-parallel --no-fail-fast + cargo nextest run -p gix-object --no-fail-fast + cargo nextest run -p gix-object --features verbose-object-parsing-errors --no-fail-fast + cargo nextest run -p gix-tempfile --features signals --no-fail-fast + cargo nextest run -p gix-features --all-features --no-fail-fast + cargo nextest run -p gix-ref-tests --all-features --no-fail-fast + cargo nextest run -p gix-odb --all-features --no-fail-fast + cargo nextest run -p gix-odb-tests --features gix-features-parallel --no-fail-fast + cargo nextest run -p gix-pack --all-features --no-fail-fast + cargo nextest run -p gix-pack-tests --features all-features --no-fail-fast + cargo nextest run -p gix-pack-tests --features gix-features-parallel --no-fail-fast + cargo nextest run -p gix-index-tests --features gix-features-parallel --no-fail-fast + cargo nextest run -p gix-packetline --features blocking-io,maybe-async/is_sync --test blocking-packetline --no-fail-fast + cargo nextest run -p gix-packetline --features async-io --test async-packetline --no-fail-fast + cargo nextest run -p gix-transport --features http-client-curl,maybe-async/is_sync --no-fail-fast + cargo nextest run -p gix-transport --features http-client-reqwest,maybe-async/is_sync --no-fail-fast + cargo nextest run -p gix-transport --features async-client --no-fail-fast + cargo nextest run -p gix-protocol --features blocking-client --no-fail-fast + cargo nextest run -p gix-protocol --features async-client --no-fail-fast + cargo nextest run -p gix --no-default-features --no-fail-fast + cargo nextest run -p gix --no-default-features --features basic,comfort,max-performance-safe --no-fail-fast + cargo nextest run -p gix --no-default-features --features basic,extras,comfort,need-more-recent-msrv --no-fail-fast + cargo nextest run -p gix --features async-network-client --no-fail-fast + cargo nextest run -p gix --features blocking-network-client --no-fail-fast + cargo nextest run -p gitoxide-core --lib --no-tests=warn --no-fail-fast + cargo test --workspace --doc --no-fail-fast # These tests aren't run by default as they are flaky (even locally) unit-tests-flaky: From f0cacb0e80c8aace4bc60eb228ae184744633a21 Mon Sep 17 00:00:00 2001 From: Sebastian Thiel Date: Thu, 8 May 2025 07:34:15 +0200 Subject: [PATCH 040/166] feat: add `protocol::Context::redacted()` as convenient way to not leak secrets. --- gix-credentials/src/protocol/context/mod.rs | 17 +++++++++++++++++ gix-credentials/src/protocol/mod.rs | 14 ++++++-------- 2 files changed, 23 insertions(+), 8 deletions(-) diff --git a/gix-credentials/src/protocol/context/mod.rs b/gix-credentials/src/protocol/context/mod.rs index c25bf04dec1..1e98f017bc1 100644 --- a/gix-credentials/src/protocol/context/mod.rs +++ b/gix-credentials/src/protocol/context/mod.rs @@ -14,6 +14,23 @@ mod access { use crate::protocol::Context; impl Context { + /// Replace existing secrets with the word ``. + pub fn redacted(mut self) -> Self { + let Context { + protocol: _, + host: _, + path: _, + username: _, + password, + url: _, + quit: _, + } = &mut self; + if let Some(pw) = password { + *pw = "".into(); + } + self + } + /// Convert all relevant fields into a URL for consumption. pub fn to_url(&self) -> Option { use bstr::{ByteSlice, ByteVec}; diff --git a/gix-credentials/src/protocol/mod.rs b/gix-credentials/src/protocol/mod.rs index 7196cb4f8eb..909187a680b 100644 --- a/gix-credentials/src/protocol/mod.rs +++ b/gix-credentials/src/protocol/mod.rs @@ -59,14 +59,10 @@ pub struct Context { /// Convert the outcome of a helper invocation to a helper result, assuring that the identity is complete in the process. #[allow(clippy::result_large_err)] pub fn helper_outcome_to_result(outcome: Option, action: helper::Action) -> Result { - fn redact(mut ctx: Context) -> Context { - if let Some(pw) = ctx.password.as_mut() { - *pw = "".into(); - } - ctx - } match (action, outcome) { - (helper::Action::Get(ctx), None) => Err(Error::IdentityMissing { context: redact(ctx) }), + (helper::Action::Get(ctx), None) => Err(Error::IdentityMissing { + context: ctx.redacted(), + }), (helper::Action::Get(ctx), Some(mut outcome)) => match outcome.consume_identity() { Some(identity) => Ok(Some(Outcome { identity, @@ -75,7 +71,9 @@ pub fn helper_outcome_to_result(outcome: Option, action: helper None => Err(if outcome.quit { Error::Quit } else { - Error::IdentityMissing { context: redact(ctx) } + Error::IdentityMissing { + context: ctx.redacted(), + } }), }, (helper::Action::Store(_) | helper::Action::Erase(_), _ignore) => Ok(None), From f687cb16676dcae37db517c5d6905be08cd9395a Mon Sep 17 00:00:00 2001 From: Sebastian Thiel Date: Thu, 8 May 2025 11:23:48 +0200 Subject: [PATCH 041/166] feat: add `Repository::merge_bases_many()` for simplified retrieval of multiple mergebases. --- gix/src/repository/mod.rs | 14 ++++++++++++++ gix/src/repository/revision.rs | 24 +++++++++++++++++++++--- 2 files changed, 35 insertions(+), 3 deletions(-) diff --git a/gix/src/repository/mod.rs b/gix/src/repository/mod.rs index caa98f1613e..92a9545e3a6 100644 --- a/gix/src/repository/mod.rs +++ b/gix/src/repository/mod.rs @@ -219,6 +219,20 @@ pub mod merge_base_octopus { } } +/// +#[cfg(feature = "revision")] +pub mod merge_bases_many { + /// The error returned by [Repository::merge_bases_many()](crate::Repository::merge_bases_many()). + #[derive(Debug, thiserror::Error)] + #[allow(missing_docs)] + pub enum Error { + #[error(transparent)] + OpenCache(#[from] crate::repository::commit_graph_if_enabled::Error), + #[error(transparent)] + MergeBase(#[from] gix_revision::merge_base::Error), + } +} + /// #[cfg(feature = "merge")] pub mod tree_merge_options { diff --git a/gix/src/repository/revision.rs b/gix/src/repository/revision.rs index ca89cd1f166..72d677b72f0 100644 --- a/gix/src/repository/revision.rs +++ b/gix/src/repository/revision.rs @@ -82,11 +82,11 @@ impl crate::Repository { Ok(bases[0].attach(self)) } - /// Obtain all merge-bases between commit `one` and `others`, or an empty list if there is none, providing a - /// commit-graph `graph` to potentially greatly accelerate the operation. + /// Get all merge-bases between commit `one` and `others`, or an empty list if there is none, providing a + /// commit-graph `graph` to potentially greatly speed up the operation. /// /// # Performance - /// Be sure to [set an object cache](crate::Repository::object_cache_size_if_unset) to accelerate repeated commit lookups. + /// Be sure to [set an object cache](crate::Repository::object_cache_size_if_unset) to speed up repeated commit lookups. #[doc(alias = "merge_bases_many", alias = "git2")] #[cfg(feature = "revision")] pub fn merge_bases_many_with_graph( @@ -104,6 +104,24 @@ impl crate::Repository { .collect()) } + /// Like [`merge_bases_many_with_graph()`](Self::merge_bases_many_with_graph), but without the ability to speed up consecutive calls with a [graph](gix_revwalk::Graph). + /// + /// # Performance + /// + /// Be sure to [set an object cache](crate::Repository::object_cache_size_if_unset) to speed up repeated commit lookups, and consider + /// using [`merge_bases_many_with_graph()`](Self::merge_bases_many_with_graph) for consecutive calls. + #[doc(alias = "git2")] + #[cfg(feature = "revision")] + pub fn merge_bases_many( + &self, + one: impl Into, + others: &[gix_hash::ObjectId], + ) -> Result>, crate::repository::merge_bases_many::Error> { + let cache = self.commit_graph_if_enabled()?; + let mut graph = self.revision_graph(cache.as_ref()); + Ok(self.merge_bases_many_with_graph(one, others, &mut graph)?) + } + /// Return the best merge-base among all `commits`, or fail if `commits` yields no commit or no merge-base was found. /// /// Use `graph` to speed up repeated calls. From 93d8d4b825317e71b61a22ca1082f5aa6a906a4b Mon Sep 17 00:00:00 2001 From: Eliah Kagan Date: Tue, 6 May 2025 23:51:18 -0400 Subject: [PATCH 042/166] doc: Improve readme formatting, syntax highlighting, and headings - Make "Download from" headings to be clearer and more consistent. - Specify `sh` in applicable code fences, for syntax highlighting. - Change code spans to code blocks (fences) in a couple places. - Tiny formatting adjustments, and slight rewording around a fence. --- README.md | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 4b1fe4e8d19..aa26ba83926 100644 --- a/README.md +++ b/README.md @@ -177,17 +177,19 @@ on your needs, for _Linux_, _MacOS_ and _Windows_. [releases]: https://github.com/GitoxideLabs/gitoxide/releases -### Download from Arch-Repository +### Download from Arch Linux repository For Arch Linux you can download `gitoxide` from `community` repository: -``` + +```sh pacman -S gitoxide ``` ### Download from Exherbo Linux Rust repository For Exherbo Linux you can download `gitoxide` from the [Rust](https://gitlab.exherbo.org/exherbo/rust/-/tree/master/packages/dev-scm/gitoxide) repository: -``` + +```sh cave resolve -x repository/rust cave resolve -x gitoxide ``` @@ -203,7 +205,7 @@ the latest stable one will work as well. There are various build configurations, all of them are [documented here](https://docs.rs/crate/gitoxide/latest). The documentation should also be useful for packagers who need to tune external dependencies. -``` +```sh # A way to install `gitoxide` with just Rust and a C compiler installed. # If there are problems with SSL certificates during clones, try to omit `--locked`. cargo install gitoxide --locked --no-default-features --features max-pure @@ -220,19 +222,25 @@ cargo install gitoxide --locked --no-default-features --features lean The following installs the latest unpublished `max` release directly from git: ```sh -cargo install --git https://github.com/GitoxideLabs/gitoxide gitoxide +cargo install --git https://github.com/GitoxideLabs/gitoxide gitoxide ``` #### How to deal with build failures -On some platforms, installation may fail due to lack of tools required by `C` toolchains. This can generally be avoided by installation -with `cargo install gitoxide --no-default-features --features max-pure`. +On some platforms, installation may fail due to lack of tools required by *C* toolchains. This can generally be avoided by installation with: + +```sh +cargo install gitoxide --no-default-features --features max-pure +``` What follows is a list of known failures. -- On Fedora, `perl` needs to be installed for `OpenSSL` to build properly. This can be done with the following command: - `dnf install perl` (see [this issue](https://github.com/GitoxideLabs/gitoxide/issues/592)). -- +- On Fedora, `perl` needs to be installed for `OpenSSL` to build properly. This can be done with the following command (see [issue #592](https://github.com/GitoxideLabs/gitoxide/issues/592)): + + ```sh + dnf install perl + ``` + ### Using Docker Some CI/CD pipelines leverage repository cloning. Below is a copy-paste-able example to build docker images for such workflows. From 1744927d15e7b13f2ad480e4236bfd4efc69f7c0 Mon Sep 17 00:00:00 2001 From: Eliah Kagan Date: Thu, 8 May 2025 15:46:17 -0400 Subject: [PATCH 043/166] doc: Copyedit shortcomings documentation - Add h1 heading (as most other top-level .md files have them). - Remove a misplaced empty h4 sub-heading. - Fix spelling, and slightly adjust hyphenation for clarity. - Make capitalization consistent and capitalize "Git" in "Git LFS". - If not a command or binary, replace "git" and "`git`" with "Git". - Replace "Pack" with "`Pack`" since we're talking about the type. - Make non-rendered aspects of Markdown code style more consistent. --- SHORTCOMINGS.md | 38 ++++++++++++++++++++------------------ 1 file changed, 20 insertions(+), 18 deletions(-) diff --git a/SHORTCOMINGS.md b/SHORTCOMINGS.md index 3bdf20aa43d..56d1f9c23fa 100644 --- a/SHORTCOMINGS.md +++ b/SHORTCOMINGS.md @@ -1,37 +1,39 @@ -This file is for tracking features that are less well implemented or less powerful than their `git` counterparts for one reason or another. +# Shortcomings -#### `gix` +This file is for tracking features that are less well implemented or less powerful than their Git counterparts for one reason or another. ### gix-index -* The `link` extension can be read, but won't be written. This effectively disables the use of a split index once a mutating operation is run on it with `gitixode`. +* The `link` extension can be read, but won't be written. This effectively disables the use of a split index once a mutating operation is run on it with `gitoxide`. ### gix-protocol -* **fetches using protocol V1 and stateful connections, i.e. ssh, git, file, may hang** + +* **Fetches using protocol V1 and stateful connections, i.e. ssh, git, file, may hang** * This can be fixed by making response parsing. * Note that this does not affect cloning, which works fine. -### `gix-pack` +### gix-pack + * **Packfiles use memory maps** * Even though they are comfortable to use and fast, they squelch IO errors. - * _potential remedy_: We could generalize the Pack to make it possible to work on in-memory buffers directly. That way, one - would initialize a Pack by reading the whole file into memory, thus not squelching IO errors at the expense of latency as well + * _Potential remedy_: We could generalize the `Pack` to make it possible to work on in-memory buffers directly. That way, one + would initialize a `Pack` by reading the whole file into memory, thus not squelching IO errors at the expense of latency as well as memory efficiency. -* **Packfiles cannot load files bigger than 2^31 or 2^32 on 32 bit systems** +* **Packfiles cannot load files bigger than 2^31 or 2^32 on 32-bit systems** * As these systems cannot address more memory than that. - * _potential remedy_: implement a sliding window to map and unmap portions of the file as needed. - * However, those who need to access big packs on these systems would rather resort to `git` itself, allowing + * _Potential remedy_: implement a sliding window to map and unmap portions of the file as needed. + * However, those who need to access big packs on these systems would rather resort to Git itself, allowing our implementation to be simpler and potentially more performant. -* **Objects larger than 32 bits cannot be loaded on 32 bit systems** - * in-memory representations objects cannot handle objects greater than the amount of addressable memory. - * This will not affect git LFS though. +* **Objects larger than 32 bits cannot be loaded on 32-bit systems** + * In-memory representations objects cannot handle objects greater than the amount of addressable memory. + * This will not affect Git LFS though. -### `gix` +### gix -* object replacements are read once upon opening the repository from their refs and changes to these won't be picked up. +* Object replacements are read once upon opening the repository from their refs and changes to these won't be picked up. -### `gix-url` +### gix-url -* **gix-url** _might_ be more restrictive than what git allows as for the most part, it uses a browser grade URL parser. - * Thus far there is no proof for this, and as _potential remedy_ we could certainly re-implement exactly what git does +* **gix-url** _might_ be more restrictive than what Git allows as for the most part, it uses a browser grade URL parser. + * Thus far there is no proof for this, and as _potential remedy_ we could certainly re-implement exactly what Git does to handle its URLs. From 656a1b1ebbd5d6d4514e580d8923c4b6d721b674 Mon Sep 17 00:00:00 2001 From: Eliah Kagan Date: Thu, 8 May 2025 16:18:14 -0400 Subject: [PATCH 044/166] doc: Copyedit stability documentation This is only to make the information that is already there clearer. It does not attempt to update the information to be more current (nor is this an attempt to advance any kind of policy changes). - Improve consistency in use of code spans and italics. - Have all references to "semver" be the hyperlink. - Fix a minor spelling error. - Very slightly adjust punctuation for clarity and consistency. --- STABILITY.md | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/STABILITY.md b/STABILITY.md index 613dfe63173..028a92f77db 100644 --- a/STABILITY.md +++ b/STABILITY.md @@ -14,7 +14,7 @@ Please note that this guide isn't stable itself and may be adjusted to fit chang - _workspace crate_ - A crate which is a member of this workspace and hence is stored in this repository - _breaking change_ - - A change in code that requires a `dependent crate` to adjust their code to fix compile errors. + - A change in code that requires a _dependent crate_ to adjust their code to fix compile errors. - _release_ - A new version of a crate is published to crates.io - _development version_ @@ -22,13 +22,14 @@ Please note that this guide isn't stable itself and may be adjusted to fit chang - _release version_ - A crate version whose _major_ version is 1 or higher. - _initial development phase_ (IDP) - - The phase of development leading up to producing a crate with a major version of 1 or greater, as per `semver`. + - The phase of development leading up to producing a crate with a major version of 1 or greater, as per [semver]. - Not to be confused with the term _pre-release_, which is used to indicate any release version prior to an actual release, like `1.1.0-beta.1`. ## Tiers The project uses three stability tiers for all of its crates, and all crates use [semver] for their version numbers. -Tiers differ primarily in the time between breaking changes, which always have to be announced with `PRs` as per + +Tiers differ primarily in the time between breaking changes, which always have to be announced with *PRs* as per our [collaboration guide]. The following schematic helps to visualize what follows. @@ -108,10 +109,10 @@ If there are additional breaking changes without a release, these push back the ### Tier 1: released apps and application crates Released apps and application crates are marked with major version number 1 or above, like `2.3.0+21.06` and live in tier 1 _(->ST1)_, -with the build identifiers for year (`21`) and month `06` appended, based on the actual release year and month. +with the build identifiers for year (`21`) and month (`06`) appended, based on the actual release year and month. Breaking changes are collected and may be released no more often than every 6 months by incrementing the major version number. If there are additional breaking changes, -these push bac the release date so that they can be tested at least for 3 months. For example, a breaking change happens in January 01, and another breaking change in February 15. +these push back the release date so that they can be tested at least for 3 months. For example, a breaking change happens in January 01, and another breaking change in February 15. The earliest release date is July 1st. Had the second breaking change happened in April 01, the release date would have to be pushed to August 1st. Intermediate pre-releases may be created at most every 4 weeks by appending `-alpha.X` where `X` is the sequential release number. These should help testing From 30b76825ab45a085cdbda2865bfd5a25271b9945 Mon Sep 17 00:00:00 2001 From: Eliah Kagan Date: Thu, 8 May 2025 16:23:19 -0400 Subject: [PATCH 045/166] doc: Copyedit tasks documentation - Add h1 heading (as most other top-level .md files have them). - Make capitalization more consistent (preferring existing style). - Adjust code formatting and italics, to clarify what is code. - Tiny punctuation change for consistency. --- tasks.md | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/tasks.md b/tasks.md index 118ca78d54c..1879b4ad3c4 100644 --- a/tasks.md +++ b/tasks.md @@ -1,21 +1,23 @@ +# Tasks + ## Tracking issues -* [repository clone](https://github.com/GitoxideLabs/gitoxide/issues/303) -* [repository FSCK](https://github.com/GitoxideLabs/gitoxide/issues/304) +* [Repository clone](https://github.com/GitoxideLabs/gitoxide/issues/303) +* [Repository FSCK](https://github.com/GitoxideLabs/gitoxide/issues/304) * [Show changes in various forms](https://github.com/GitoxideLabs/gitoxide/issues/305) * [Client side push (client to server)](https://github.com/GitoxideLabs/gitoxide/issues/306) * [Server fetch/pull (server to client)](https://github.com/GitoxideLabs/gitoxide/issues/307) -## Smaller Tasks +## Smaller tasks …to not forget. Might get reorganized. ### gix organize -* [ ] Add journey test to cover case with non-bare repository. Try to only read `non-bare` git config files and see the journey test fail. +* [ ] Add journey test to cover case with non-bare repository. Try to only read *non-bare* git config files and see the journey test fail. ### gix cat -* A program to cat objects and pretty-print them, similar to git cat-file. Useful to get a feel for - 'locate(…)' performance and stress test it a little. -* Be sure to escape terminal escape codes +* A program to cat objects and pretty-print them, similar to `git cat-file`. Useful to get a feel for + `locate(…)` performance and stress test it a little. +* Be sure to escape terminal escape codes. From 6cbc91613659993b18d30d9b76369fbfdca46f15 Mon Sep 17 00:00:00 2001 From: Eliah Kagan Date: Thu, 8 May 2025 18:11:06 -0400 Subject: [PATCH 046/166] Idea for expanded and clarified `ci-check-msrv` recipe doc Probably it should not be in quite this form in the `justfile`, though, because only the `#` line immediately preceding the first line that is formally part of the recipe is shown in `just --list`. This only changes the `justfile`. It does not modify the `##` comment in the corresponding `Makefile` rule. --- justfile | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/justfile b/justfile index 2a9255e07f0..73e6a3369b3 100755 --- a/justfile +++ b/justfile @@ -238,7 +238,11 @@ cross-test-android: (cross-test 'armv7-linux-androideabi' '--no-default-features check-size: etc/check-package-size.sh -# Check the minimal support Rust version, with the currently installed Rust version +# Assume the current default toolchain is the Minimal Supported Rust Version and check against it +# +# This is run on CI in `msrv.yml`, after the MSRV toolchain is installed and set as default, and +# after dependencies in `Cargo.lock` are downgraded to the latest MSRV-compatible versions. +# Only if those or similar steps are done first does this recipe really validate the MSRV. ci-check-msrv: rustc --version cargo check -p gix From af70bfa7b5ef382981f4947132649d1e09ca81d9 Mon Sep 17 00:00:00 2001 From: Eliah Kagan Date: Thu, 8 May 2025 18:17:35 -0400 Subject: [PATCH 047/166] Rewrite expanded `ci-check-msrv` doc so `just --list` works This rewrites the newly expanded multi-line comment explaining what the `ci-check-msrv` recipe in the `justfile` does, so that it is still readable from top to bottom, but so that the one-line summary is the last line. This is needed because `just --list` only treats a single `#` line, preceding the formal beginning of the recipe, as its documentation. (This differs from most other uses of multi-line comments, such as in a Rust `///` or `//!` comment, where the first line could be a short summary, and subsequent paragraphs are regarded subordinate.) This continues to change only the `justfile` and not to modify the `##` comment in the corresponding `Makefile` rule. --- justfile | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/justfile b/justfile index 73e6a3369b3..e22a81a17f3 100755 --- a/justfile +++ b/justfile @@ -238,11 +238,12 @@ cross-test-android: (cross-test 'armv7-linux-androideabi' '--no-default-features check-size: etc/check-package-size.sh -# Assume the current default toolchain is the Minimal Supported Rust Version and check against it +# This assumes the current default toolchain is the Minimal Supported Rust Version and checks +# against it. This is run on CI in `msrv.yml`, after the MSRV toolchain is installed and set as +# default, and after dependencies in `Cargo.lock` are downgraded to the latest MSRV-compatible +# versions. Only if those or similar steps are done first does this work to validate the MSRV. # -# This is run on CI in `msrv.yml`, after the MSRV toolchain is installed and set as default, and -# after dependencies in `Cargo.lock` are downgraded to the latest MSRV-compatible versions. -# Only if those or similar steps are done first does this recipe really validate the MSRV. +# Check the MSRV, *if* the toolchain is set and `Cargo.lock` is downgraded (used on CI) ci-check-msrv: rustc --version cargo check -p gix From 510847b04b8330b1ec332ed691b8f0b2b00305e2 Mon Sep 17 00:00:00 2001 From: Eliah Kagan Date: Thu, 8 May 2025 21:05:33 -0400 Subject: [PATCH 048/166] Ensure the Windows `check-msrv` job uses the intended toolchain This fixes an edge case in the Windows MSRV job, by using `bash` for script steps on all platforms. The MSRV workflow had alredy implicitly used `bash` on Ubuntu, which implicitly passed `-e` (as also happens when `shell: bash` is used explicitly). But it had implicitly used `pwsh` on Windows. Although GHA runners make an effort to fail `pwsh` script steps when a command has failed, PowerShell (whether `pwsh` or `powershell`) does not have an analogue of POSIX `-e`. Script steps with `pwsh` do not always fail fast, nor even always fail at all, when a command fails that is not the last command in the script. Recent experiments confirm that running an implicit `pwsh` script step with two commands, each of which run external programs, where the first program exits normally but indicating failure (such as with an exit code of 1) but the second program does not fail, will run both commands, then report success for the whole step. This is to say that the kind of bug that 4f2ab5b (#1559) fixed in the Windows `test-fast` job in `ci.yml` also existed in the Windows `check-msrv` job in `msrv.yml` (which #1559 did not fix). Fortunately, this version of the bug is far less severe, in that the circumstnaces under which a failure would be concealed appear to have been unlikely. However, at least one such concealed-failure mode was plausible. If the `rustup toolchain install ...` command failed, thereby causing `rustup default...` to fail, then the cargo update command could still succeed, masking those two failures. Error messages for the failures would still be shown in the log, but the step would have reported success. Then the `gix check` commands run via `just ci-check-msrv` would check using the wrong toolchain, i.e. a typically newer toolchain than the MSRV, present in the `windows-2022` runner image. This commit fixes that bug by setting a default of `shell: bash` for all script steps not specifying `shell:`. This implicitly passes `-e` to the `bash` interpreter. Although `-e` has its own intricacies, for simple commands such as those shown here, it has the intuitive fail-fast behavior. (The alternative of splitting the steps up so each step directly runs only a single command, as was done in #1559, was considered. But the code seems like it will be less readable if written that way. It may make sense to organize the commands here into more steps, but likely with some steps having two or more commands.) This commit also rewords a conceptually related comment in `ci.yml` for clarity, and so that differences in wording between comments on `shell: bash` in various workflows reflect differences in circumstances. --- .github/workflows/ci.yml | 3 ++- .github/workflows/msrv.yml | 5 +++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 7a55e80c820..8728d06747f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -433,7 +433,8 @@ jobs: defaults: run: - shell: bash # Use bash even on Windows, if we ever reenable windows-latest for testing. + # Use `bash` even on Windows, if we ever reenable `windows-latest` for testing. + shell: bash steps: - uses: actions/checkout@v4 diff --git a/.github/workflows/msrv.yml b/.github/workflows/msrv.yml index 9d96b3db67c..9e0383fcc7f 100644 --- a/.github/workflows/msrv.yml +++ b/.github/workflows/msrv.yml @@ -33,6 +33,11 @@ jobs: # IMPORTANT: adjust etc/msrv-badge.svg as well rust_version: 1.75.0 + defaults: + run: + # Use `bash` even in the Windows job, so any failing command fails its step (due to `-e`). + shell: bash + steps: - uses: actions/checkout@v4 - uses: extractions/setup-just@v3 From 4af6ef92ca57ddfceda514938a7b73c223184707 Mon Sep 17 00:00:00 2001 From: Eliah Kagan Date: Thu, 8 May 2025 21:04:44 -0400 Subject: [PATCH 049/166] Make the `check-msrv` jobs more robust and documented - Split into more steps, logically related. - Identify both toolchains in the step name. - Name the `just` step so it's clear what it does. - Add a TODO for switching to `--minimal-versions`. - Check that `cargo` didn't have to further modify `Cargo.toml`. - Capitalize `RUST_VERSION`, as it is an environment variable. --- .github/workflows/msrv.yml | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/.github/workflows/msrv.yml b/.github/workflows/msrv.yml index 9e0383fcc7f..a6de1e0834b 100644 --- a/.github/workflows/msrv.yml +++ b/.github/workflows/msrv.yml @@ -31,7 +31,7 @@ jobs: env: # dictated by `firefox` to support the `helix` editor, but now probably effectively be controlled by `jiff`, which also aligns with `regex`. # IMPORTANT: adjust etc/msrv-badge.svg as well - rust_version: 1.75.0 + RUST_VERSION: 1.75.0 defaults: run: @@ -41,8 +41,15 @@ jobs: steps: - uses: actions/checkout@v4 - uses: extractions/setup-just@v3 - - run: | - rustup toolchain install ${{ env.rust_version }} nightly --profile minimal --no-self-update - rustup default ${{ env.rust_version }} - cargo +nightly update -Zminimal-versions - - run: just ci-check-msrv + - name: Set up ${{ env.RUST_VERSION }} (MSRV) and nightly toolchains + run: | + rustup toolchain install ${{ env.RUST_VERSION }} nightly --profile minimal --no-self-update + rustup default ${{ env.RUST_VERSION }} + - name: Downgrade locked dependencies to lowest allowed versions + run: | + cargo +nightly update -Zminimal-versions # TODO(msrv): Use non-`-Z` way when available. + git add Cargo.lock # Stage for a later `git diff` check. + - name: Run some `cargo check` commands on `gix` + run: just ci-check-msrv + - name: Check `cargo` didn't have to change the versions + run: git diff --exit-code -- Cargo.lock From f10f18d21eeb25da199a88f778484ac1e33c7a98 Mon Sep 17 00:00:00 2001 From: Eliah Kagan Date: Thu, 8 May 2025 22:12:44 -0400 Subject: [PATCH 050/166] Use `--locked` instead of checking `Cargo.lock` afterwards The verification being done here is exactly what `--locked` is for. Allowing the check to proceed even if it changes the dependencies could have the benefit of showing more information. But it is not obvious that the information it shows would be relevant to the situation being investigated. (If that information would usually be relevant, then `cargo +nightly update -Zminimal-versions` may be too strong, and `cargo +nightly update -Zdirect-minimal-versions` could be considered. Even better than either of those *might* be, somehow, to temporarily downgrade locked dependencies only as much as necessary to make them all MSRV-compatible.) In any case, `--locked` is more readable, and considerably simpler. In addition to making complementary changes to the `msrv.yml` workflow and to the `justfile` recipe it uses, this also changes the `Makefile` rule corresponding to the `justfile` recipe, so they continue to do the same thing if used in local experiments. --- .github/workflows/msrv.yml | 3 --- Makefile | 4 ++-- justfile | 4 ++-- 3 files changed, 4 insertions(+), 7 deletions(-) diff --git a/.github/workflows/msrv.yml b/.github/workflows/msrv.yml index a6de1e0834b..e0ae4908eca 100644 --- a/.github/workflows/msrv.yml +++ b/.github/workflows/msrv.yml @@ -48,8 +48,5 @@ jobs: - name: Downgrade locked dependencies to lowest allowed versions run: | cargo +nightly update -Zminimal-versions # TODO(msrv): Use non-`-Z` way when available. - git add Cargo.lock # Stage for a later `git diff` check. - name: Run some `cargo check` commands on `gix` run: just ci-check-msrv - - name: Check `cargo` didn't have to change the versions - run: git diff --exit-code -- Cargo.lock diff --git a/Makefile b/Makefile index fea4c7229ec..3f9fd3bbfdd 100644 --- a/Makefile +++ b/Makefile @@ -126,8 +126,8 @@ bench-gix-config: check-msrv-on-ci: ## Check the minimal support rust version for currently installed Rust version rustc --version - cargo check --package gix - cargo check --package gix --no-default-features --features async-network-client,max-performance + cargo check --locked --package gix + cargo check --locked --package gix --no-default-features --features async-network-client,max-performance ##@ Maintenance diff --git a/justfile b/justfile index e22a81a17f3..9cd3f930359 100755 --- a/justfile +++ b/justfile @@ -246,8 +246,8 @@ check-size: # Check the MSRV, *if* the toolchain is set and `Cargo.lock` is downgraded (used on CI) ci-check-msrv: rustc --version - cargo check -p gix - cargo check -p gix --no-default-features --features async-network-client,max-performance + cargo check --locked -p gix + cargo check --locked -p gix --no-default-features --features async-network-client,max-performance # Enter a nix-shell able to build on macOS nix-shell-macos: From eaecc9b270269536308359c94d774ab388849f18 Mon Sep 17 00:00:00 2001 From: Eliah Kagan Date: Fri, 9 May 2025 00:00:07 -0400 Subject: [PATCH 051/166] Further split `check-msrv` steps; let Windows use `pwsh` again This commit splits the commands in the steps of the `check-msrv` job definition to be one per step, documenting each step. In 510847b I predicted that it would not make sense to split the steps to one command per step in `msrv.yml`. The change made there of using `bash` even on Windows allowed for experimenting with how the workflow logs look when reorganized in various ways. But in view of other changes -- and to better clarify that two toolchains were installed, but the MSRV toolchain is set default, so it is used by all subsequent operations *except* the `-Zminimal-versions` dependency downgrade that currently requires `nightly` -- it now looks like having one command per step is better after all. When running only one (simple) command per step, the main change in 510847b is no longer needed. That is, this now avoids that problem in the same way it has been avoided in `test-fast` in `ci.yml` since 4f2ab5b (#1559). So this commit also removes `shell: bash` in `msrv.yml` (but keeps the comment clarification in `ci.yml`). --- .github/workflows/msrv.yml | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/.github/workflows/msrv.yml b/.github/workflows/msrv.yml index e0ae4908eca..07fbdd21018 100644 --- a/.github/workflows/msrv.yml +++ b/.github/workflows/msrv.yml @@ -33,20 +33,16 @@ jobs: # IMPORTANT: adjust etc/msrv-badge.svg as well RUST_VERSION: 1.75.0 - defaults: - run: - # Use `bash` even in the Windows job, so any failing command fails its step (due to `-e`). - shell: bash - steps: - uses: actions/checkout@v4 - uses: extractions/setup-just@v3 - name: Set up ${{ env.RUST_VERSION }} (MSRV) and nightly toolchains - run: | - rustup toolchain install ${{ env.RUST_VERSION }} nightly --profile minimal --no-self-update - rustup default ${{ env.RUST_VERSION }} + run: rustup toolchain install ${{ env.RUST_VERSION }} nightly --profile minimal --no-self-update + - name: Set ${{ env.RUST_VERSION }} (MSRV) as default + run: rustup default ${{ env.RUST_VERSION }} - name: Downgrade locked dependencies to lowest allowed versions run: | - cargo +nightly update -Zminimal-versions # TODO(msrv): Use non-`-Z` way when available. + # TODO(msrv): Use `cargo update --minimal-versions` when `--minimal-versions` is available. + cargo +nightly update -Zminimal-versions - name: Run some `cargo check` commands on `gix` run: just ci-check-msrv From dc1d271d48b7c41134eb842ff9bcbcd1adeb7330 Mon Sep 17 00:00:00 2001 From: Eliah Kagan Date: Fri, 9 May 2025 00:57:24 -0400 Subject: [PATCH 052/166] doc: Fix accessibility bug in MSRV badge The SVG badge showing the project's MSRV, `etc/msrv-badge.svg`, has four occurrences of the MSRV in it. Three had the current intended MSRV. But the top-level `svg` element's `aria-label` attribute still had the value `rustc: 1.70.0+`, having not been updated the most recent two times the badge SVG was adjusted for a new MSRV. That would, at least potentially, result in screen readers and possibly other software saying/outputting 1.70.0 instead of 1.75.0. This changes the `aria-label` value to `rustc: 1.75.0+`, as intended. This also rephrases the comment in `msrv.yml` about updating the badge when changing the MSRV, to mention the need to change "all occurrences". (We may want to add a CI check to make sure the badge is fully consistent with the current MSRV, but that isn't attempted here.) --- .github/workflows/msrv.yml | 5 +++-- etc/msrv-badge.svg | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/.github/workflows/msrv.yml b/.github/workflows/msrv.yml index 07fbdd21018..985c79c07f6 100644 --- a/.github/workflows/msrv.yml +++ b/.github/workflows/msrv.yml @@ -29,8 +29,9 @@ jobs: runs-on: ${{ matrix.os }} env: - # dictated by `firefox` to support the `helix` editor, but now probably effectively be controlled by `jiff`, which also aligns with `regex`. - # IMPORTANT: adjust etc/msrv-badge.svg as well + # This is dictated by `firefox` to support the `helix` editor, but now probably effectively + # be controlled by `jiff`, which also aligns with `regex`. + # IMPORTANT: When adjusting, change all occurrences in `etc/msrv-badge.svg` as well. RUST_VERSION: 1.75.0 steps: diff --git a/etc/msrv-badge.svg b/etc/msrv-badge.svg index 184a0688c61..3d42373fe68 100644 --- a/etc/msrv-badge.svg +++ b/etc/msrv-badge.svg @@ -1,4 +1,4 @@ - + rustc: 1.75.0+ From 3a63c68d079ee79e5e2c8ef3846ef11d2c1c7891 Mon Sep 17 00:00:00 2001 From: Eliah Kagan Date: Fri, 9 May 2025 00:06:41 -0400 Subject: [PATCH 053/166] Actually build `gix` to check MSRV This changes `cargo check` commands to `cargo build` in the `ci-check-msrv` recipe in the `justfile`, which the `check-msrv` CI jobs in `msrv.yml` use. (It updates a CI step name accordingly.) The idea is to make sure at least `gix`, with the two combinations of features tested, actually *builds* under the MSRV toolchain. As in f10f18d, this also updates the `Makefile` rule corresponding to that `justfile` recipe. The idea of actually building was suggested in: https://github.com/GitoxideLabs/gitoxide/issues/1808#issuecomment-2614260268 However, this does not uncover any new breakages. And there has been further improvement on #1808, including in the commits leading up to this, as well as earlier, in 569c186 (#1909). Nonetheless, it seems likely that some problems remain with some combinations of crates and features that are not currently exercised in the MSRV check. #1808 is most likely not yet fully fixed. --- .github/workflows/msrv.yml | 2 +- Makefile | 4 ++-- justfile | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/msrv.yml b/.github/workflows/msrv.yml index 985c79c07f6..2d7043d113a 100644 --- a/.github/workflows/msrv.yml +++ b/.github/workflows/msrv.yml @@ -45,5 +45,5 @@ jobs: run: | # TODO(msrv): Use `cargo update --minimal-versions` when `--minimal-versions` is available. cargo +nightly update -Zminimal-versions - - name: Run some `cargo check` commands on `gix` + - name: Run some `cargo build` commands on `gix` run: just ci-check-msrv diff --git a/Makefile b/Makefile index 3f9fd3bbfdd..431c041979d 100644 --- a/Makefile +++ b/Makefile @@ -126,8 +126,8 @@ bench-gix-config: check-msrv-on-ci: ## Check the minimal support rust version for currently installed Rust version rustc --version - cargo check --locked --package gix - cargo check --locked --package gix --no-default-features --features async-network-client,max-performance + cargo build --locked --package gix + cargo build --locked --package gix --no-default-features --features async-network-client,max-performance ##@ Maintenance diff --git a/justfile b/justfile index 9cd3f930359..7f5c71dd24a 100755 --- a/justfile +++ b/justfile @@ -246,8 +246,8 @@ check-size: # Check the MSRV, *if* the toolchain is set and `Cargo.lock` is downgraded (used on CI) ci-check-msrv: rustc --version - cargo check --locked -p gix - cargo check --locked -p gix --no-default-features --features async-network-client,max-performance + cargo build --locked -p gix + cargo build --locked -p gix --no-default-features --features async-network-client,max-performance # Enter a nix-shell able to build on macOS nix-shell-macos: From 00e89341cd89f58d031eee8a4e60f6ebdcd53185 Mon Sep 17 00:00:00 2001 From: Thomas Klausner Date: Fri, 9 May 2025 10:12:50 +0200 Subject: [PATCH 054/166] fix: Fix build on NetBSD rustix::fs 1.x has unified the nanonseconds member across operating systems. --- gix-index/src/fs.rs | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/gix-index/src/fs.rs b/gix-index/src/fs.rs index 5fb369f9eef..2be45bb8d7a 100644 --- a/gix-index/src/fs.rs +++ b/gix-index/src/fs.rs @@ -59,10 +59,8 @@ impl Metadata { #[cfg(any(target_os = "aix", target_os = "hurd"))] let seconds = self.0.st_mtim.tv_sec; - #[cfg(not(any(target_os = "netbsd", target_os = "aix", target_os = "hurd")))] + #[cfg(not(any(target_os = "aix", target_os = "hurd")))] let nanoseconds = self.0.st_mtime_nsec; - #[cfg(target_os = "netbsd")] - let nanoseconds = self.0.st_mtimensec; #[cfg(any(target_os = "aix", target_os = "hurd"))] let nanoseconds = self.0.st_mtim.tv_nsec; @@ -88,10 +86,8 @@ impl Metadata { #[cfg(any(target_os = "aix", target_os = "hurd"))] let seconds = self.0.st_ctim.tv_sec; - #[cfg(not(any(target_os = "netbsd", target_os = "aix", target_os = "hurd")))] + #[cfg(not(any(target_os = "aix", target_os = "hurd")))] let nanoseconds = self.0.st_ctime_nsec; - #[cfg(target_os = "netbsd")] - let nanoseconds = self.0.st_ctimensec; #[cfg(any(target_os = "aix", target_os = "hurd"))] let nanoseconds = self.0.st_ctim.tv_nsec; From bfc48801bf3ed39cdf7ec02e01aa3cfb6181705f Mon Sep 17 00:00:00 2001 From: Sebastian Thiel Date: Sat, 10 May 2025 20:33:26 +0200 Subject: [PATCH 055/166] prepare changelogs prior to release of `gix-index` --- gix-date/CHANGELOG.md | 32 +++++++++++++++++++++++++++++- gix-index/CHANGELOG.md | 33 ++++++++++++++++++++++++++++++- gix-path/CHANGELOG.md | 41 ++++++++++++++++++++++++++++++++++++++- gix-traverse/CHANGELOG.md | 34 +++++++++++++++++++++++++++++++- 4 files changed, 136 insertions(+), 4 deletions(-) diff --git a/gix-date/CHANGELOG.md b/gix-date/CHANGELOG.md index 5614b67c2f6..cf31211e5b2 100644 --- a/gix-date/CHANGELOG.md +++ b/gix-date/CHANGELOG.md @@ -5,13 +5,41 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## Unreleased + +A maintenance release without user-facing changes. + +### Commit Statistics + + + + - 4 commits contributed to the release over the course of 14 calendar days. + - 14 days passed between releases. + - 0 commits were understood as [conventional](https://www.conventionalcommits.org). + - 2 unique issues were worked on: [#1979](https://github.com/GitoxideLabs/gitoxide/issues/1979), [#1984](https://github.com/GitoxideLabs/gitoxide/issues/1984) + +### Commit Details + + + +
view details + + * **[#1979](https://github.com/GitoxideLabs/gitoxide/issues/1979)** + - Reproduce fuzz-failure ([`6bf1be6`](https://github.com/GitoxideLabs/gitoxide/commit/6bf1be67ba93c1b8e467e3c3127438d1eb43897e)) + * **[#1984](https://github.com/GitoxideLabs/gitoxide/issues/1984)** + - Further upgrade `jiff` to fix fuzz failures ([`0be4dd4`](https://github.com/GitoxideLabs/gitoxide/commit/0be4dd4e037e8a3080ef335913e06bc2584fd96d)) + * **Uncategorized** + - Merge pull request #1984 from GitoxideLabs/fuzz ([`f965540`](https://github.com/GitoxideLabs/gitoxide/commit/f965540c162ed3e23bd0d7ad9083093033647e51)) + - Merge pull request #1971 from GitoxideLabs/new-release ([`8d4c4d1`](https://github.com/GitoxideLabs/gitoxide/commit/8d4c4d1e09f84c962c29d98a686c64228196ac13)) +
+ ## 0.10.1 (2025-04-26) ### Commit Statistics - - 1 commit contributed to the release. + - 3 commits contributed to the release. - 0 commits were understood as [conventional](https://www.conventionalcommits.org). - 0 issues like '(#ID)' were seen in commit messages @@ -22,7 +50,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
view details * **Uncategorized** + - Release gix-date v0.10.1, gix-utils v0.3.0, gix-actor v0.35.1, gix-validate v0.10.0, gix-path v0.10.17, gix-features v0.42.1, gix-hash v0.18.0, gix-hashtable v0.8.1, gix-object v0.49.1, gix-glob v0.20.0, gix-quote v0.6.0, gix-attributes v0.26.0, gix-command v0.6.0, gix-packetline-blocking v0.19.0, gix-filter v0.19.1, gix-fs v0.15.0, gix-commitgraph v0.28.0, gix-revwalk v0.20.1, gix-traverse v0.46.1, gix-worktree-stream v0.21.1, gix-archive v0.21.1, gix-tempfile v17.1.0, gix-lock v17.1.0, gix-index v0.40.0, gix-config-value v0.15.0, gix-pathspec v0.11.0, gix-ignore v0.15.0, gix-worktree v0.41.0, gix-diff v0.52.1, gix-blame v0.2.1, gix-ref v0.52.1, gix-sec v0.11.0, gix-config v0.45.1, gix-prompt v0.11.0, gix-url v0.31.0, gix-credentials v0.29.0, gix-discover v0.40.1, gix-dir v0.14.1, gix-mailmap v0.27.1, gix-revision v0.34.1, gix-merge v0.5.1, gix-negotiate v0.20.1, gix-pack v0.59.1, gix-odb v0.69.1, gix-refspec v0.30.1, gix-shallow v0.4.0, gix-packetline v0.19.0, gix-transport v0.47.0, gix-protocol v0.50.1, gix-status v0.19.1, gix-submodule v0.19.1, gix-worktree-state v0.19.0, gix v0.72.1, gix-fsck v0.11.1, gitoxide-core v0.47.1, gitoxide v0.44.0 ([`e104545`](https://github.com/GitoxideLabs/gitoxide/commit/e104545b78951ca882481d4a58f4425a8bc81c87)) - Bump all prior pratch levels to majors ([`5f7f805`](https://github.com/GitoxideLabs/gitoxide/commit/5f7f80570e1a5522e76ea58cccbb957249a0dffe)) + - Merge pull request #1969 from GitoxideLabs/new-release ([`631f07a`](https://github.com/GitoxideLabs/gitoxide/commit/631f07ad0c1cb93d9da42cf2c8499584fe91880a))
## 0.10.0 (2025-04-25) diff --git a/gix-index/CHANGELOG.md b/gix-index/CHANGELOG.md index e2454d7d3f9..c4d0ba1ca7b 100644 --- a/gix-index/CHANGELOG.md +++ b/gix-index/CHANGELOG.md @@ -5,13 +5,42 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## Unreleased + +### Bug Fixes + + - Fix build on NetBSD + +### Commit Statistics + + + + - 5 commits contributed to the release over the course of 14 calendar days. + - 14 days passed between releases. + - 1 commit was understood as [conventional](https://www.conventionalcommits.org). + - 0 issues like '(#ID)' were seen in commit messages + +### Commit Details + + + +
view details + + * **Uncategorized** + - Merge pull request #2005 from 0-wiz-0/main ([`33c4d6b`](https://github.com/GitoxideLabs/gitoxide/commit/33c4d6b6656c994ed090f2fddd70e014401baf30)) + - Fix build on NetBSD ([`00e8934`](https://github.com/GitoxideLabs/gitoxide/commit/00e89341cd89f58d031eee8a4e60f6ebdcd53185)) + - Merge pull request #1977 from GitoxideLabs/dependabot/cargo/cargo-811d7b929d ([`800738a`](https://github.com/GitoxideLabs/gitoxide/commit/800738a37f3d33926a427edfa294423bbe3f2b66)) + - Bump the cargo group with 12 updates ([`4408166`](https://github.com/GitoxideLabs/gitoxide/commit/4408166bf56197a67419277a4ef8feeba9060fee)) + - Merge pull request #1971 from GitoxideLabs/new-release ([`8d4c4d1`](https://github.com/GitoxideLabs/gitoxide/commit/8d4c4d1e09f84c962c29d98a686c64228196ac13)) +
+ ## 0.40.0 (2025-04-26) ### Commit Statistics - - 1 commit contributed to the release. + - 3 commits contributed to the release. - 0 commits were understood as [conventional](https://www.conventionalcommits.org). - 0 issues like '(#ID)' were seen in commit messages @@ -22,7 +51,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
view details * **Uncategorized** + - Release gix-date v0.10.1, gix-utils v0.3.0, gix-actor v0.35.1, gix-validate v0.10.0, gix-path v0.10.17, gix-features v0.42.1, gix-hash v0.18.0, gix-hashtable v0.8.1, gix-object v0.49.1, gix-glob v0.20.0, gix-quote v0.6.0, gix-attributes v0.26.0, gix-command v0.6.0, gix-packetline-blocking v0.19.0, gix-filter v0.19.1, gix-fs v0.15.0, gix-commitgraph v0.28.0, gix-revwalk v0.20.1, gix-traverse v0.46.1, gix-worktree-stream v0.21.1, gix-archive v0.21.1, gix-tempfile v17.1.0, gix-lock v17.1.0, gix-index v0.40.0, gix-config-value v0.15.0, gix-pathspec v0.11.0, gix-ignore v0.15.0, gix-worktree v0.41.0, gix-diff v0.52.1, gix-blame v0.2.1, gix-ref v0.52.1, gix-sec v0.11.0, gix-config v0.45.1, gix-prompt v0.11.0, gix-url v0.31.0, gix-credentials v0.29.0, gix-discover v0.40.1, gix-dir v0.14.1, gix-mailmap v0.27.1, gix-revision v0.34.1, gix-merge v0.5.1, gix-negotiate v0.20.1, gix-pack v0.59.1, gix-odb v0.69.1, gix-refspec v0.30.1, gix-shallow v0.4.0, gix-packetline v0.19.0, gix-transport v0.47.0, gix-protocol v0.50.1, gix-status v0.19.1, gix-submodule v0.19.1, gix-worktree-state v0.19.0, gix v0.72.1, gix-fsck v0.11.1, gitoxide-core v0.47.1, gitoxide v0.44.0 ([`e104545`](https://github.com/GitoxideLabs/gitoxide/commit/e104545b78951ca882481d4a58f4425a8bc81c87)) - Bump all prior pratch levels to majors ([`5f7f805`](https://github.com/GitoxideLabs/gitoxide/commit/5f7f80570e1a5522e76ea58cccbb957249a0dffe)) + - Merge pull request #1969 from GitoxideLabs/new-release ([`631f07a`](https://github.com/GitoxideLabs/gitoxide/commit/631f07ad0c1cb93d9da42cf2c8499584fe91880a))
## 0.39.1 (2025-04-25) diff --git a/gix-path/CHANGELOG.md b/gix-path/CHANGELOG.md index 99b60603e2d..4fc2f0050a3 100644 --- a/gix-path/CHANGELOG.md +++ b/gix-path/CHANGELOG.md @@ -5,13 +5,44 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## Unreleased + +A maintenance release without user-facing changes. + +### Commit Statistics + + + + - 3 commits contributed to the release over the course of 14 calendar days. + - 14 days passed between releases. + - 0 commits were understood as [conventional](https://www.conventionalcommits.org). + - 0 issues like '(#ID)' were seen in commit messages + +### Thanks Clippy + + + +[Clippy](https://github.com/rust-lang/rust-clippy) helped 1 time to make code idiomatic. + +### Commit Details + + + +
view details + + * **Uncategorized** + - Merge pull request #1975 from GitoxideLabs/improvements ([`28935a5`](https://github.com/GitoxideLabs/gitoxide/commit/28935a56ff91f1fc2c17a7d23b057cf7119144e9)) + - Thanks clippy ([`dbf65c9`](https://github.com/GitoxideLabs/gitoxide/commit/dbf65c95644e6a134e7f9b75e7871479720b4deb)) + - Merge pull request #1971 from GitoxideLabs/new-release ([`8d4c4d1`](https://github.com/GitoxideLabs/gitoxide/commit/8d4c4d1e09f84c962c29d98a686c64228196ac13)) +
+ ## 0.10.17 (2025-04-26) ### Commit Statistics - - 1 commit contributed to the release. + - 3 commits contributed to the release. - 0 commits were understood as [conventional](https://www.conventionalcommits.org). - 0 issues like '(#ID)' were seen in commit messages @@ -22,7 +53,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
view details * **Uncategorized** + - Release gix-date v0.10.1, gix-utils v0.3.0, gix-actor v0.35.1, gix-validate v0.10.0, gix-path v0.10.17, gix-features v0.42.1, gix-hash v0.18.0, gix-hashtable v0.8.1, gix-object v0.49.1, gix-glob v0.20.0, gix-quote v0.6.0, gix-attributes v0.26.0, gix-command v0.6.0, gix-packetline-blocking v0.19.0, gix-filter v0.19.1, gix-fs v0.15.0, gix-commitgraph v0.28.0, gix-revwalk v0.20.1, gix-traverse v0.46.1, gix-worktree-stream v0.21.1, gix-archive v0.21.1, gix-tempfile v17.1.0, gix-lock v17.1.0, gix-index v0.40.0, gix-config-value v0.15.0, gix-pathspec v0.11.0, gix-ignore v0.15.0, gix-worktree v0.41.0, gix-diff v0.52.1, gix-blame v0.2.1, gix-ref v0.52.1, gix-sec v0.11.0, gix-config v0.45.1, gix-prompt v0.11.0, gix-url v0.31.0, gix-credentials v0.29.0, gix-discover v0.40.1, gix-dir v0.14.1, gix-mailmap v0.27.1, gix-revision v0.34.1, gix-merge v0.5.1, gix-negotiate v0.20.1, gix-pack v0.59.1, gix-odb v0.69.1, gix-refspec v0.30.1, gix-shallow v0.4.0, gix-packetline v0.19.0, gix-transport v0.47.0, gix-protocol v0.50.1, gix-status v0.19.1, gix-submodule v0.19.1, gix-worktree-state v0.19.0, gix v0.72.1, gix-fsck v0.11.1, gitoxide-core v0.47.1, gitoxide v0.44.0 ([`e104545`](https://github.com/GitoxideLabs/gitoxide/commit/e104545b78951ca882481d4a58f4425a8bc81c87)) - Bump all prior pratch levels to majors ([`5f7f805`](https://github.com/GitoxideLabs/gitoxide/commit/5f7f80570e1a5522e76ea58cccbb957249a0dffe)) + - Merge pull request #1969 from GitoxideLabs/new-release ([`631f07a`](https://github.com/GitoxideLabs/gitoxide/commit/631f07ad0c1cb93d9da42cf2c8499584fe91880a))
## 0.10.16 (2025-04-25) @@ -113,6 +146,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - https://github.com/GitoxideLabs/gitoxide/pull/1862#issuecomment-2692158831 - https://github.com/GitoxideLabs/gitoxide/pull/1862#issuecomment-2692158831 - https://github.com/GitoxideLabs/gitoxide/pull/1862#issuecomment-2692158831 + - https://github.com/GitoxideLabs/gitoxide/pull/1862#issuecomment-2692158831 +- https://github.com/GitoxideLabs/gitoxide/pull/1862#issuecomment-2692158831 +- https://github.com/GitoxideLabs/gitoxide/pull/1862#issuecomment-2692158831 +- https://github.com/GitoxideLabs/gitoxide/pull/1862#issuecomment-2692158831 +- https://github.com/GitoxideLabs/gitoxide/pull/1862#issuecomment-2692158831 +- https://github.com/GitoxideLabs/gitoxide/pull/1862#issuecomment-2692158831 - https://github.com/GitoxideLabs/gitoxide/pull/1862#issuecomment-2692158831 - https://github.com/GitoxideLabs/gitoxide/pull/1862#issuecomment-2692158831 - https://github.com/GitoxideLabs/gitoxide/pull/1862#issuecomment-2692158831 diff --git a/gix-traverse/CHANGELOG.md b/gix-traverse/CHANGELOG.md index be152a91000..196ade4f791 100644 --- a/gix-traverse/CHANGELOG.md +++ b/gix-traverse/CHANGELOG.md @@ -5,13 +5,43 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## Unreleased + +### New Features + + - Add `commit::Either::commit_time()` + +### Commit Statistics + + + + - 6 commits contributed to the release over the course of 14 calendar days. + - 14 days passed between releases. + - 1 commit was understood as [conventional](https://www.conventionalcommits.org). + - 0 issues like '(#ID)' were seen in commit messages + +### Commit Details + + + +
view details + + * **Uncategorized** + - Merge pull request #1977 from GitoxideLabs/dependabot/cargo/cargo-811d7b929d ([`800738a`](https://github.com/GitoxideLabs/gitoxide/commit/800738a37f3d33926a427edfa294423bbe3f2b66)) + - Bump the cargo group with 12 updates ([`4408166`](https://github.com/GitoxideLabs/gitoxide/commit/4408166bf56197a67419277a4ef8feeba9060fee)) + - Merge pull request #1974 from cruessler/move-commit-time-to-either ([`8be3193`](https://github.com/GitoxideLabs/gitoxide/commit/8be3193eb34ac5deadb0ade60ba01cb3c97f6135)) + - Refactor ([`9c3e288`](https://github.com/GitoxideLabs/gitoxide/commit/9c3e2880f2996dde9bbdd0c83b498f831054e56f)) + - Add `commit::Either::commit_time()` ([`b40ba17`](https://github.com/GitoxideLabs/gitoxide/commit/b40ba17c2f7d8c09181ab198c6b89bba976b727b)) + - Merge pull request #1971 from GitoxideLabs/new-release ([`8d4c4d1`](https://github.com/GitoxideLabs/gitoxide/commit/8d4c4d1e09f84c962c29d98a686c64228196ac13)) +
+ ## 0.46.1 (2025-04-26) ### Commit Statistics - - 1 commit contributed to the release. + - 3 commits contributed to the release. - 0 commits were understood as [conventional](https://www.conventionalcommits.org). - 0 issues like '(#ID)' were seen in commit messages @@ -22,7 +52,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
view details * **Uncategorized** + - Release gix-date v0.10.1, gix-utils v0.3.0, gix-actor v0.35.1, gix-validate v0.10.0, gix-path v0.10.17, gix-features v0.42.1, gix-hash v0.18.0, gix-hashtable v0.8.1, gix-object v0.49.1, gix-glob v0.20.0, gix-quote v0.6.0, gix-attributes v0.26.0, gix-command v0.6.0, gix-packetline-blocking v0.19.0, gix-filter v0.19.1, gix-fs v0.15.0, gix-commitgraph v0.28.0, gix-revwalk v0.20.1, gix-traverse v0.46.1, gix-worktree-stream v0.21.1, gix-archive v0.21.1, gix-tempfile v17.1.0, gix-lock v17.1.0, gix-index v0.40.0, gix-config-value v0.15.0, gix-pathspec v0.11.0, gix-ignore v0.15.0, gix-worktree v0.41.0, gix-diff v0.52.1, gix-blame v0.2.1, gix-ref v0.52.1, gix-sec v0.11.0, gix-config v0.45.1, gix-prompt v0.11.0, gix-url v0.31.0, gix-credentials v0.29.0, gix-discover v0.40.1, gix-dir v0.14.1, gix-mailmap v0.27.1, gix-revision v0.34.1, gix-merge v0.5.1, gix-negotiate v0.20.1, gix-pack v0.59.1, gix-odb v0.69.1, gix-refspec v0.30.1, gix-shallow v0.4.0, gix-packetline v0.19.0, gix-transport v0.47.0, gix-protocol v0.50.1, gix-status v0.19.1, gix-submodule v0.19.1, gix-worktree-state v0.19.0, gix v0.72.1, gix-fsck v0.11.1, gitoxide-core v0.47.1, gitoxide v0.44.0 ([`e104545`](https://github.com/GitoxideLabs/gitoxide/commit/e104545b78951ca882481d4a58f4425a8bc81c87)) - Bump all prior pratch levels to majors ([`5f7f805`](https://github.com/GitoxideLabs/gitoxide/commit/5f7f80570e1a5522e76ea58cccbb957249a0dffe)) + - Merge pull request #1969 from GitoxideLabs/new-release ([`631f07a`](https://github.com/GitoxideLabs/gitoxide/commit/631f07ad0c1cb93d9da42cf2c8499584fe91880a))
## 0.46.0 (2025-04-25) From d2b4c44fcb2bf43e80d67532262631a5086f08de Mon Sep 17 00:00:00 2001 From: Sebastian Thiel Date: Sat, 10 May 2025 20:37:45 +0200 Subject: [PATCH 056/166] Release gix-path v0.10.18, gix-date v0.10.2, gix-traverse v0.46.2, gix-index v0.40.1 --- Cargo.lock | 8 ++++---- gix-archive/Cargo.toml | 4 ++-- gix-attributes/Cargo.toml | 2 +- gix-blame/Cargo.toml | 4 ++-- gix-command/Cargo.toml | 2 +- gix-config-value/Cargo.toml | 2 +- gix-config/Cargo.toml | 2 +- gix-credentials/Cargo.toml | 2 +- gix-date/CHANGELOG.md | 5 +++-- gix-date/Cargo.toml | 2 +- gix-diff/Cargo.toml | 6 +++--- gix-dir/Cargo.toml | 4 ++-- gix-discover/Cargo.toml | 2 +- gix-filter/Cargo.toml | 2 +- gix-glob/Cargo.toml | 2 +- gix-ignore/Cargo.toml | 2 +- gix-index/CHANGELOG.md | 5 +++-- gix-index/Cargo.toml | 4 ++-- gix-mailmap/Cargo.toml | 2 +- gix-merge/Cargo.toml | 4 ++-- gix-negotiate/Cargo.toml | 2 +- gix-odb/Cargo.toml | 4 ++-- gix-pack/Cargo.toml | 4 ++-- gix-path/CHANGELOG.md | 12 ++++++++++-- gix-path/Cargo.toml | 2 +- gix-pathspec/Cargo.toml | 2 +- gix-protocol/Cargo.toml | 2 +- gix-ref/Cargo.toml | 2 +- gix-revision/Cargo.toml | 2 +- gix-sec/Cargo.toml | 2 +- gix-status/Cargo.toml | 4 ++-- gix-submodule/Cargo.toml | 2 +- gix-traverse/CHANGELOG.md | 5 +++-- gix-traverse/Cargo.toml | 4 ++-- gix-url/Cargo.toml | 2 +- gix-worktree-state/Cargo.toml | 4 ++-- gix-worktree-stream/Cargo.toml | 4 ++-- gix-worktree/Cargo.toml | 4 ++-- gix/Cargo.toml | 8 ++++---- 39 files changed, 74 insertions(+), 63 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 6ece8372bbc..6120ccab95c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1638,7 +1638,7 @@ dependencies = [ [[package]] name = "gix-date" -version = "0.10.1" +version = "0.10.2" dependencies = [ "bstr", "document-features", @@ -1864,7 +1864,7 @@ dependencies = [ [[package]] name = "gix-index" -version = "0.40.0" +version = "0.40.1" dependencies = [ "bitflags 2.9.0", "bstr", @@ -2132,7 +2132,7 @@ dependencies = [ [[package]] name = "gix-path" -version = "0.10.17" +version = "0.10.18" dependencies = [ "bstr", "gix-testtools", @@ -2482,7 +2482,7 @@ dependencies = [ [[package]] name = "gix-traverse" -version = "0.46.1" +version = "0.46.2" dependencies = [ "bitflags 2.9.0", "gix-commitgraph", diff --git a/gix-archive/Cargo.toml b/gix-archive/Cargo.toml index dc4fd950712..29b84399e65 100644 --- a/gix-archive/Cargo.toml +++ b/gix-archive/Cargo.toml @@ -30,8 +30,8 @@ zip = ["dep:flate2", "dep:zip"] [dependencies] gix-worktree-stream = { version = "^0.21.1", path = "../gix-worktree-stream" } gix-object = { version = "^0.49.1", path = "../gix-object" } -gix-path = { version = "^0.10.17", path = "../gix-path", optional = true } -gix-date = { version = "^0.10.1", path = "../gix-date" } +gix-path = { version = "^0.10.18", path = "../gix-path", optional = true } +gix-date = { version = "^0.10.2", path = "../gix-date" } flate2 = { version = "1.1.1", optional = true, default-features = false, features = ["zlib-rs"] } zip = { version = "2.6.1", optional = true, default-features = false, features = ["deflate"] } diff --git a/gix-attributes/Cargo.toml b/gix-attributes/Cargo.toml index 662b07cfdde..506ad97e738 100644 --- a/gix-attributes/Cargo.toml +++ b/gix-attributes/Cargo.toml @@ -19,7 +19,7 @@ doctest = false serde = ["dep:serde", "bstr/serde", "gix-glob/serde", "kstring/serde"] [dependencies] -gix-path = { version = "^0.10.17", path = "../gix-path" } +gix-path = { version = "^0.10.18", path = "../gix-path" } gix-quote = { version = "^0.6.0", path = "../gix-quote" } gix-glob = { version = "^0.20.0", path = "../gix-glob" } gix-trace = { version = "^0.1.12", path = "../gix-trace" } diff --git a/gix-blame/Cargo.toml b/gix-blame/Cargo.toml index 8a047a2fc3d..22298622e83 100644 --- a/gix-blame/Cargo.toml +++ b/gix-blame/Cargo.toml @@ -14,12 +14,12 @@ rust-version = "1.70" gix-commitgraph = { version = "^0.28.0", path = "../gix-commitgraph" } gix-revwalk = { version = "^0.20.1", path = "../gix-revwalk" } gix-trace = { version = "^0.1.12", path = "../gix-trace" } -gix-date = { version = "^0.10.1", path = "../gix-date" } +gix-date = { version = "^0.10.2", path = "../gix-date" } gix-diff = { version = "^0.52.1", path = "../gix-diff", default-features = false, features = ["blob"] } gix-object = { version = "^0.49.1", path = "../gix-object" } gix-hash = { version = "^0.18.0", path = "../gix-hash" } gix-worktree = { version = "^0.41.0", path = "../gix-worktree", default-features = false, features = ["attributes"] } -gix-traverse = { version = "^0.46.1", path = "../gix-traverse" } +gix-traverse = { version = "^0.46.2", path = "../gix-traverse" } smallvec = "1.15.0" thiserror = "2.0.0" diff --git a/gix-command/Cargo.toml b/gix-command/Cargo.toml index 15483b9972b..40c7c3398e0 100644 --- a/gix-command/Cargo.toml +++ b/gix-command/Cargo.toml @@ -16,7 +16,7 @@ doctest = false [dependencies] gix-trace = { version = "^0.1.12", path = "../gix-trace" } -gix-path = { version = "^0.10.17", path = "../gix-path" } +gix-path = { version = "^0.10.18", path = "../gix-path" } gix-quote = { version = "^0.6.0", path = "../gix-quote" } bstr = { version = "1.12.0", default-features = false, features = ["std", "unicode"] } diff --git a/gix-config-value/Cargo.toml b/gix-config-value/Cargo.toml index bf568399ba9..ccccf115e47 100644 --- a/gix-config-value/Cargo.toml +++ b/gix-config-value/Cargo.toml @@ -19,7 +19,7 @@ doctest = false serde = ["dep:serde", "bstr/serde"] [dependencies] -gix-path = { version = "^0.10.17", path = "../gix-path" } +gix-path = { version = "^0.10.18", path = "../gix-path" } thiserror = "2.0.0" bstr = { version = "1.12.0", default-features = false, features = ["std"] } diff --git a/gix-config/Cargo.toml b/gix-config/Cargo.toml index c8f6dcd1f21..48215b20328 100644 --- a/gix-config/Cargo.toml +++ b/gix-config/Cargo.toml @@ -21,7 +21,7 @@ serde = ["dep:serde", "bstr/serde", "gix-sec/serde", "gix-ref/serde", "gix-glob/ [dependencies] gix-features = { version = "^0.42.1", path = "../gix-features" } gix-config-value = { version = "^0.15.0", path = "../gix-config-value" } -gix-path = { version = "^0.10.17", path = "../gix-path" } +gix-path = { version = "^0.10.18", path = "../gix-path" } gix-sec = { version = "^0.11.0", path = "../gix-sec" } gix-ref = { version = "^0.52.1", path = "../gix-ref" } gix-glob = { version = "^0.20.0", path = "../gix-glob" } diff --git a/gix-credentials/Cargo.toml b/gix-credentials/Cargo.toml index 679200dc19c..faf3f7491af 100644 --- a/gix-credentials/Cargo.toml +++ b/gix-credentials/Cargo.toml @@ -21,7 +21,7 @@ serde = ["dep:serde", "bstr/serde", "gix-sec/serde"] [dependencies] gix-sec = { version = "^0.11.0", path = "../gix-sec" } gix-url = { version = "^0.31.0", path = "../gix-url" } -gix-path = { version = "^0.10.17", path = "../gix-path" } +gix-path = { version = "^0.10.18", path = "../gix-path" } gix-command = { version = "^0.6.0", path = "../gix-command" } gix-config-value = { version = "^0.15.0", path = "../gix-config-value" } gix-prompt = { version = "^0.11.0", path = "../gix-prompt" } diff --git a/gix-date/CHANGELOG.md b/gix-date/CHANGELOG.md index cf31211e5b2..816b6b41aba 100644 --- a/gix-date/CHANGELOG.md +++ b/gix-date/CHANGELOG.md @@ -5,7 +5,7 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## Unreleased +## 0.10.2 (2025-05-10) A maintenance release without user-facing changes. @@ -13,7 +13,7 @@ A maintenance release without user-facing changes. - - 4 commits contributed to the release over the course of 14 calendar days. + - 5 commits contributed to the release over the course of 14 calendar days. - 14 days passed between releases. - 0 commits were understood as [conventional](https://www.conventionalcommits.org). - 2 unique issues were worked on: [#1979](https://github.com/GitoxideLabs/gitoxide/issues/1979), [#1984](https://github.com/GitoxideLabs/gitoxide/issues/1984) @@ -29,6 +29,7 @@ A maintenance release without user-facing changes. * **[#1984](https://github.com/GitoxideLabs/gitoxide/issues/1984)** - Further upgrade `jiff` to fix fuzz failures ([`0be4dd4`](https://github.com/GitoxideLabs/gitoxide/commit/0be4dd4e037e8a3080ef335913e06bc2584fd96d)) * **Uncategorized** + - Prepare changelogs prior to release of `gix-index` ([`bfc4880`](https://github.com/GitoxideLabs/gitoxide/commit/bfc48801bf3ed39cdf7ec02e01aa3cfb6181705f)) - Merge pull request #1984 from GitoxideLabs/fuzz ([`f965540`](https://github.com/GitoxideLabs/gitoxide/commit/f965540c162ed3e23bd0d7ad9083093033647e51)) - Merge pull request #1971 from GitoxideLabs/new-release ([`8d4c4d1`](https://github.com/GitoxideLabs/gitoxide/commit/8d4c4d1e09f84c962c29d98a686c64228196ac13)) diff --git a/gix-date/Cargo.toml b/gix-date/Cargo.toml index aa666795bc4..16ce68bbb5d 100644 --- a/gix-date/Cargo.toml +++ b/gix-date/Cargo.toml @@ -2,7 +2,7 @@ lints.workspace = true [package] name = "gix-date" -version = "0.10.1" +version = "0.10.2" repository = "https://github.com/GitoxideLabs/gitoxide" license = "MIT OR Apache-2.0" description = "A crate of the gitoxide project parsing dates the way git does" diff --git a/gix-diff/Cargo.toml b/gix-diff/Cargo.toml index 463d84fd7eb..2d68984db2b 100644 --- a/gix-diff/Cargo.toml +++ b/gix-diff/Cargo.toml @@ -27,7 +27,7 @@ wasm = ["dep:getrandom"] doctest = false [dependencies] -gix-index = { version = "^0.40.0", path = "../gix-index", optional = true } +gix-index = { version = "^0.40.1", path = "../gix-index", optional = true } gix-pathspec = { version = "^0.11.0", path = "../gix-pathspec", optional = true } gix-attributes = { version = "^0.26.0", path = "../gix-attributes", optional = true } gix-hash = { version = "^0.18.0", path = "../gix-hash" } @@ -35,11 +35,11 @@ gix-object = { version = "^0.49.1", path = "../gix-object" } gix-filter = { version = "^0.19.1", path = "../gix-filter", optional = true } gix-worktree = { version = "^0.41.0", path = "../gix-worktree", default-features = false, features = ["attributes"], optional = true } gix-command = { version = "^0.6.0", path = "../gix-command", optional = true } -gix-path = { version = "^0.10.17", path = "../gix-path", optional = true } +gix-path = { version = "^0.10.18", path = "../gix-path", optional = true } gix-fs = { version = "^0.15.0", path = "../gix-fs", optional = true } gix-tempfile = { version = "^17.1.0", path = "../gix-tempfile", optional = true } gix-trace = { version = "^0.1.12", path = "../gix-trace", optional = true } -gix-traverse = { version = "^0.46.1", path = "../gix-traverse", optional = true } +gix-traverse = { version = "^0.46.2", path = "../gix-traverse", optional = true } thiserror = "2.0.0" imara-diff = { version = "0.1.7", optional = true } diff --git a/gix-dir/Cargo.toml b/gix-dir/Cargo.toml index 8a8abde568c..86bb7178c75 100644 --- a/gix-dir/Cargo.toml +++ b/gix-dir/Cargo.toml @@ -16,10 +16,10 @@ test = false [dependencies] gix-trace = { version = "^0.1.12", path = "../gix-trace" } -gix-index = { version = "^0.40.0", path = "../gix-index" } +gix-index = { version = "^0.40.1", path = "../gix-index" } gix-discover = { version = "^0.40.1", path = "../gix-discover" } gix-fs = { version = "^0.15.0", path = "../gix-fs" } -gix-path = { version = "^0.10.17", path = "../gix-path" } +gix-path = { version = "^0.10.18", path = "../gix-path" } gix-pathspec = { version = "^0.11.0", path = "../gix-pathspec" } gix-worktree = { version = "^0.41.0", path = "../gix-worktree", default-features = false } gix-object = { version = "^0.49.1", path = "../gix-object" } diff --git a/gix-discover/Cargo.toml b/gix-discover/Cargo.toml index 023758453e9..b5c896a401e 100644 --- a/gix-discover/Cargo.toml +++ b/gix-discover/Cargo.toml @@ -16,7 +16,7 @@ doctest = false [dependencies] gix-sec = { version = "^0.11.0", path = "../gix-sec" } -gix-path = { version = "^0.10.17", path = "../gix-path" } +gix-path = { version = "^0.10.18", path = "../gix-path" } gix-ref = { version = "^0.52.1", path = "../gix-ref" } gix-hash = { version = "^0.18.0", path = "../gix-hash" } gix-fs = { version = "^0.15.0", path = "../gix-fs" } diff --git a/gix-filter/Cargo.toml b/gix-filter/Cargo.toml index a86d8239568..6bc9561da0c 100644 --- a/gix-filter/Cargo.toml +++ b/gix-filter/Cargo.toml @@ -21,7 +21,7 @@ gix-object = { version = "^0.49.1", path = "../gix-object" } gix-command = { version = "^0.6.0", path = "../gix-command" } gix-quote = { version = "^0.6.0", path = "../gix-quote" } gix-utils = { version = "^0.3.0", path = "../gix-utils" } -gix-path = { version = "^0.10.17", path = "../gix-path" } +gix-path = { version = "^0.10.18", path = "../gix-path" } gix-packetline-blocking = { version = "^0.19.0", path = "../gix-packetline-blocking" } gix-attributes = { version = "^0.26.0", path = "../gix-attributes" } diff --git a/gix-glob/Cargo.toml b/gix-glob/Cargo.toml index ebd731e97a5..ad1d8c02147 100644 --- a/gix-glob/Cargo.toml +++ b/gix-glob/Cargo.toml @@ -19,7 +19,7 @@ doctest = false serde = ["dep:serde", "bstr/serde", "bitflags/serde"] [dependencies] -gix-path = { version = "^0.10.17", path = "../gix-path" } +gix-path = { version = "^0.10.18", path = "../gix-path" } gix-features = { version = "^0.42.1", path = "../gix-features" } bstr = { version = "1.12.0", default-features = false, features = ["std"] } bitflags = "2" diff --git a/gix-ignore/Cargo.toml b/gix-ignore/Cargo.toml index ed314a463a6..8021b01bee3 100644 --- a/gix-ignore/Cargo.toml +++ b/gix-ignore/Cargo.toml @@ -20,7 +20,7 @@ serde = ["dep:serde", "bstr/serde", "gix-glob/serde"] [dependencies] gix-glob = { version = "^0.20.0", path = "../gix-glob" } -gix-path = { version = "^0.10.17", path = "../gix-path" } +gix-path = { version = "^0.10.18", path = "../gix-path" } gix-trace = { version = "^0.1.12", path = "../gix-trace" } bstr = { version = "1.12.0", default-features = false, features = ["std", "unicode"] } diff --git a/gix-index/CHANGELOG.md b/gix-index/CHANGELOG.md index c4d0ba1ca7b..b376b35a52c 100644 --- a/gix-index/CHANGELOG.md +++ b/gix-index/CHANGELOG.md @@ -5,7 +5,7 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## Unreleased +## 0.40.1 (2025-05-10) ### Bug Fixes @@ -15,7 +15,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - - 5 commits contributed to the release over the course of 14 calendar days. + - 6 commits contributed to the release over the course of 14 calendar days. - 14 days passed between releases. - 1 commit was understood as [conventional](https://www.conventionalcommits.org). - 0 issues like '(#ID)' were seen in commit messages @@ -27,6 +27,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
view details * **Uncategorized** + - Prepare changelogs prior to release of `gix-index` ([`bfc4880`](https://github.com/GitoxideLabs/gitoxide/commit/bfc48801bf3ed39cdf7ec02e01aa3cfb6181705f)) - Merge pull request #2005 from 0-wiz-0/main ([`33c4d6b`](https://github.com/GitoxideLabs/gitoxide/commit/33c4d6b6656c994ed090f2fddd70e014401baf30)) - Fix build on NetBSD ([`00e8934`](https://github.com/GitoxideLabs/gitoxide/commit/00e89341cd89f58d031eee8a4e60f6ebdcd53185)) - Merge pull request #1977 from GitoxideLabs/dependabot/cargo/cargo-811d7b929d ([`800738a`](https://github.com/GitoxideLabs/gitoxide/commit/800738a37f3d33926a427edfa294423bbe3f2b66)) diff --git a/gix-index/Cargo.toml b/gix-index/Cargo.toml index 4d6458780d2..cf34775d764 100644 --- a/gix-index/Cargo.toml +++ b/gix-index/Cargo.toml @@ -2,7 +2,7 @@ lints.workspace = true [package] name = "gix-index" -version = "0.40.0" +version = "0.40.1" repository = "https://github.com/GitoxideLabs/gitoxide" license = "MIT OR Apache-2.0" description = "A work-in-progress crate of the gitoxide project dedicated implementing the git index file" @@ -29,7 +29,7 @@ gix-hash = { version = "^0.18.0", path = "../gix-hash" } gix-bitmap = { version = "^0.2.14", path = "../gix-bitmap" } gix-object = { version = "^0.49.1", path = "../gix-object" } gix-validate = { version = "^0.10.0", path = "../gix-validate" } -gix-traverse = { version = "^0.46.1", path = "../gix-traverse" } +gix-traverse = { version = "^0.46.2", path = "../gix-traverse" } gix-lock = { version = "^17.1.0", path = "../gix-lock" } gix-fs = { version = "^0.15.0", path = "../gix-fs" } gix-utils = { version = "^0.3.0", path = "../gix-utils" } diff --git a/gix-mailmap/Cargo.toml b/gix-mailmap/Cargo.toml index 8c26767e4b6..13da1780038 100644 --- a/gix-mailmap/Cargo.toml +++ b/gix-mailmap/Cargo.toml @@ -20,7 +20,7 @@ serde = ["dep:serde", "bstr/serde", "gix-actor/serde"] [dependencies] gix-actor = { version = "^0.35.1", path = "../gix-actor" } -gix-date = { version = "^0.10.1", path = "../gix-date" } +gix-date = { version = "^0.10.2", path = "../gix-date" } bstr = { version = "1.12.0", default-features = false, features = ["std", "unicode"] } thiserror = "2.0.0" serde = { version = "1.0.114", optional = true, default-features = false, features = ["derive"] } diff --git a/gix-merge/Cargo.toml b/gix-merge/Cargo.toml index b15c4023764..217397ef08d 100644 --- a/gix-merge/Cargo.toml +++ b/gix-merge/Cargo.toml @@ -24,7 +24,7 @@ gix-object = { version = "^0.49.1", path = "../gix-object" } gix-filter = { version = "^0.19.1", path = "../gix-filter" } gix-worktree = { version = "^0.41.0", path = "../gix-worktree", default-features = false, features = ["attributes"] } gix-command = { version = "^0.6.0", path = "../gix-command" } -gix-path = { version = "^0.10.17", path = "../gix-path" } +gix-path = { version = "^0.10.18", path = "../gix-path" } gix-fs = { version = "^0.15.0", path = "../gix-fs" } gix-tempfile = { version = "^17.1.0", path = "../gix-tempfile" } gix-trace = { version = "^0.1.12", path = "../gix-trace" } @@ -32,7 +32,7 @@ gix-quote = { version = "^0.6.0", path = "../gix-quote" } gix-revision = { version = "^0.34.1", path = "../gix-revision", default-features = false, features = ["merge_base"] } gix-revwalk = { version = "^0.20.1", path = "../gix-revwalk" } gix-diff = { version = "^0.52.1", path = "../gix-diff", default-features = false, features = ["blob"] } -gix-index = { version = "^0.40.0", path = "../gix-index" } +gix-index = { version = "^0.40.1", path = "../gix-index" } thiserror = "2.0.0" imara-diff = { version = "0.1.7" } diff --git a/gix-negotiate/Cargo.toml b/gix-negotiate/Cargo.toml index bca187ffad1..882f039b848 100644 --- a/gix-negotiate/Cargo.toml +++ b/gix-negotiate/Cargo.toml @@ -18,7 +18,7 @@ test = false [dependencies] gix-hash = { version = "^0.18.0", path = "../gix-hash" } gix-object = { version = "^0.49.1", path = "../gix-object" } -gix-date = { version = "^0.10.1", path = "../gix-date" } +gix-date = { version = "^0.10.2", path = "../gix-date" } gix-commitgraph = { version = "^0.28.0", path = "../gix-commitgraph" } gix-revwalk = { version = "^0.20.1", path = "../gix-revwalk" } thiserror = "2.0.0" diff --git a/gix-odb/Cargo.toml b/gix-odb/Cargo.toml index e109bd68aaa..499a34e57c4 100644 --- a/gix-odb/Cargo.toml +++ b/gix-odb/Cargo.toml @@ -23,8 +23,8 @@ serde = ["dep:serde", "gix-hash/serde", "gix-object/serde", "gix-pack/serde"] gix-features = { version = "^0.42.1", path = "../gix-features", features = ["walkdir", "zlib", "crc32"] } gix-hashtable = { version = "^0.8.1", path = "../gix-hashtable" } gix-hash = { version = "^0.18.0", path = "../gix-hash" } -gix-date = { version = "^0.10.1", path = "../gix-date" } -gix-path = { version = "^0.10.17", path = "../gix-path" } +gix-date = { version = "^0.10.2", path = "../gix-date" } +gix-path = { version = "^0.10.18", path = "../gix-path" } gix-quote = { version = "^0.6.0", path = "../gix-quote" } gix-object = { version = "^0.49.1", path = "../gix-object" } gix-pack = { version = "^0.59.1", path = "../gix-pack", default-features = false } diff --git a/gix-pack/Cargo.toml b/gix-pack/Cargo.toml index ea82d5c228a..fc4a5c1a48c 100644 --- a/gix-pack/Cargo.toml +++ b/gix-pack/Cargo.toml @@ -35,14 +35,14 @@ wasm = ["gix-diff?/wasm"] [dependencies] gix-features = { version = "^0.42.1", path = "../gix-features", features = ["crc32", "progress", "zlib"] } -gix-path = { version = "^0.10.17", path = "../gix-path" } +gix-path = { version = "^0.10.18", path = "../gix-path" } gix-hash = { version = "^0.18.0", path = "../gix-hash" } gix-chunk = { version = "^0.4.11", path = "../gix-chunk" } gix-object = { version = "^0.49.1", path = "../gix-object" } gix-hashtable = { version = "^0.8.1", path = "../gix-hashtable", optional = true } # for streaming of packs (input, output) -gix-traverse = { version = "^0.46.1", path = "../gix-traverse", optional = true } +gix-traverse = { version = "^0.46.2", path = "../gix-traverse", optional = true } gix-diff = { version = "^0.52.1", path = "../gix-diff", default-features = false, optional = true } memmap2 = "0.9.0" diff --git a/gix-path/CHANGELOG.md b/gix-path/CHANGELOG.md index 4fc2f0050a3..991876ede72 100644 --- a/gix-path/CHANGELOG.md +++ b/gix-path/CHANGELOG.md @@ -5,7 +5,7 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## Unreleased +## 0.10.18 (2025-05-10) A maintenance release without user-facing changes. @@ -13,7 +13,7 @@ A maintenance release without user-facing changes. - - 3 commits contributed to the release over the course of 14 calendar days. + - 4 commits contributed to the release over the course of 14 calendar days. - 14 days passed between releases. - 0 commits were understood as [conventional](https://www.conventionalcommits.org). - 0 issues like '(#ID)' were seen in commit messages @@ -31,6 +31,7 @@ A maintenance release without user-facing changes.
view details * **Uncategorized** + - Prepare changelogs prior to release of `gix-index` ([`bfc4880`](https://github.com/GitoxideLabs/gitoxide/commit/bfc48801bf3ed39cdf7ec02e01aa3cfb6181705f)) - Merge pull request #1975 from GitoxideLabs/improvements ([`28935a5`](https://github.com/GitoxideLabs/gitoxide/commit/28935a56ff91f1fc2c17a7d23b057cf7119144e9)) - Thanks clippy ([`dbf65c9`](https://github.com/GitoxideLabs/gitoxide/commit/dbf65c95644e6a134e7f9b75e7871479720b4deb)) - Merge pull request #1971 from GitoxideLabs/new-release ([`8d4c4d1`](https://github.com/GitoxideLabs/gitoxide/commit/8d4c4d1e09f84c962c29d98a686c64228196ac13)) @@ -147,6 +148,13 @@ A maintenance release without user-facing changes. - https://github.com/GitoxideLabs/gitoxide/pull/1862#issuecomment-2692158831 - https://github.com/GitoxideLabs/gitoxide/pull/1862#issuecomment-2692158831 - https://github.com/GitoxideLabs/gitoxide/pull/1862#issuecomment-2692158831 + - https://github.com/GitoxideLabs/gitoxide/pull/1862#issuecomment-2692158831 +- https://github.com/GitoxideLabs/gitoxide/pull/1862#issuecomment-2692158831 +- https://github.com/GitoxideLabs/gitoxide/pull/1862#issuecomment-2692158831 +- https://github.com/GitoxideLabs/gitoxide/pull/1862#issuecomment-2692158831 +- https://github.com/GitoxideLabs/gitoxide/pull/1862#issuecomment-2692158831 +- https://github.com/GitoxideLabs/gitoxide/pull/1862#issuecomment-2692158831 +- https://github.com/GitoxideLabs/gitoxide/pull/1862#issuecomment-2692158831 - https://github.com/GitoxideLabs/gitoxide/pull/1862#issuecomment-2692158831 - https://github.com/GitoxideLabs/gitoxide/pull/1862#issuecomment-2692158831 - https://github.com/GitoxideLabs/gitoxide/pull/1862#issuecomment-2692158831 diff --git a/gix-path/Cargo.toml b/gix-path/Cargo.toml index f00f87e7edc..10d5a931b3e 100644 --- a/gix-path/Cargo.toml +++ b/gix-path/Cargo.toml @@ -2,7 +2,7 @@ lints.workspace = true [package] name = "gix-path" -version = "0.10.17" +version = "0.10.18" repository = "https://github.com/GitoxideLabs/gitoxide" license = "MIT OR Apache-2.0" description = "A crate of the gitoxide project dealing paths and their conversions" diff --git a/gix-pathspec/Cargo.toml b/gix-pathspec/Cargo.toml index 38d84fa834e..04d536b20cc 100644 --- a/gix-pathspec/Cargo.toml +++ b/gix-pathspec/Cargo.toml @@ -16,7 +16,7 @@ doctest = false [dependencies] gix-glob = { version = "^0.20.0", path = "../gix-glob" } -gix-path = { version = "^0.10.17", path = "../gix-path" } +gix-path = { version = "^0.10.18", path = "../gix-path" } gix-attributes = { version = "^0.26.0", path = "../gix-attributes" } gix-config-value = { version = "^0.15.0", path = "../gix-config-value" } diff --git a/gix-protocol/Cargo.toml b/gix-protocol/Cargo.toml index ac8fb0a567a..43f9bd4a466 100644 --- a/gix-protocol/Cargo.toml +++ b/gix-protocol/Cargo.toml @@ -74,7 +74,7 @@ gix-features = { version = "^0.42.1", path = "../gix-features", features = [ gix-transport = { version = "^0.47.0", path = "../gix-transport" } gix-hash = { version = "^0.18.0", path = "../gix-hash" } gix-shallow = { version = "^0.4.0", path = "../gix-shallow" } -gix-date = { version = "^0.10.1", path = "../gix-date" } +gix-date = { version = "^0.10.2", path = "../gix-date" } gix-utils = { version = "^0.3.0", path = "../gix-utils" } gix-ref = { version = "^0.52.1", path = "../gix-ref" } diff --git a/gix-ref/Cargo.toml b/gix-ref/Cargo.toml index 1edee31e90a..eda2f72e973 100644 --- a/gix-ref/Cargo.toml +++ b/gix-ref/Cargo.toml @@ -23,7 +23,7 @@ serde = ["dep:serde", "gix-hash/serde", "gix-actor/serde", "gix-object/serde"] [dependencies] gix-features = { version = "^0.42.1", path = "../gix-features", features = ["walkdir"] } gix-fs = { version = "^0.15.0", path = "../gix-fs" } -gix-path = { version = "^0.10.17", path = "../gix-path" } +gix-path = { version = "^0.10.18", path = "../gix-path" } gix-hash = { version = "^0.18.0", path = "../gix-hash" } gix-object = { version = "^0.49.1", path = "../gix-object" } gix-utils = { version = "^0.3.0", path = "../gix-utils" } diff --git a/gix-revision/Cargo.toml b/gix-revision/Cargo.toml index ffac90c4c84..4a9aabed1bf 100644 --- a/gix-revision/Cargo.toml +++ b/gix-revision/Cargo.toml @@ -29,7 +29,7 @@ serde = ["dep:serde", "gix-hash/serde", "gix-object/serde"] [dependencies] gix-hash = { version = "^0.18.0", path = "../gix-hash" } gix-object = { version = "^0.49.1", path = "../gix-object" } -gix-date = { version = "^0.10.1", path = "../gix-date" } +gix-date = { version = "^0.10.2", path = "../gix-date" } gix-hashtable = { version = "^0.8.1", path = "../gix-hashtable", optional = true } gix-revwalk = { version = "^0.20.1", path = "../gix-revwalk" } gix-commitgraph = { version = "^0.28.0", path = "../gix-commitgraph" } diff --git a/gix-sec/Cargo.toml b/gix-sec/Cargo.toml index c5cec341638..a921bf41496 100644 --- a/gix-sec/Cargo.toml +++ b/gix-sec/Cargo.toml @@ -31,7 +31,7 @@ document-features = { version = "0.2.1", optional = true } libc = "0.2.172" [target.'cfg(windows)'.dependencies] -gix-path = { version = "^0.10.17", path = "../gix-path" } +gix-path = { version = "^0.10.18", path = "../gix-path" } windows-sys = { version = "0.59.0", features = [ "Win32_Foundation", "Win32_Security_Authorization", diff --git a/gix-status/Cargo.toml b/gix-status/Cargo.toml index 959c0933b4c..e49509f5050 100644 --- a/gix-status/Cargo.toml +++ b/gix-status/Cargo.toml @@ -20,11 +20,11 @@ doctest = false worktree-rewrites = ["dep:gix-dir", "dep:gix-diff"] [dependencies] -gix-index = { version = "^0.40.0", path = "../gix-index" } +gix-index = { version = "^0.40.1", path = "../gix-index" } gix-fs = { version = "^0.15.0", path = "../gix-fs" } gix-hash = { version = "^0.18.0", path = "../gix-hash" } gix-object = { version = "^0.49.1", path = "../gix-object" } -gix-path = { version = "^0.10.17", path = "../gix-path" } +gix-path = { version = "^0.10.18", path = "../gix-path" } gix-features = { version = "^0.42.1", path = "../gix-features", features = ["progress"] } gix-filter = { version = "^0.19.1", path = "../gix-filter" } gix-worktree = { version = "^0.41.0", path = "../gix-worktree", default-features = false, features = ["attributes"] } diff --git a/gix-submodule/Cargo.toml b/gix-submodule/Cargo.toml index 6f424428cf4..20253c388a3 100644 --- a/gix-submodule/Cargo.toml +++ b/gix-submodule/Cargo.toml @@ -18,7 +18,7 @@ doctest = false gix-pathspec = { version = "^0.11.0", path = "../gix-pathspec" } gix-refspec = { version = "^0.30.1", path = "../gix-refspec" } gix-config = { version = "^0.45.1", path = "../gix-config" } -gix-path = { version = "^0.10.17", path = "../gix-path" } +gix-path = { version = "^0.10.18", path = "../gix-path" } gix-url = { version = "^0.31.0", path = "../gix-url" } bstr = { version = "1.12.0", default-features = false } diff --git a/gix-traverse/CHANGELOG.md b/gix-traverse/CHANGELOG.md index 196ade4f791..80f60db630d 100644 --- a/gix-traverse/CHANGELOG.md +++ b/gix-traverse/CHANGELOG.md @@ -5,7 +5,7 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## Unreleased +## 0.46.2 (2025-05-10) ### New Features @@ -15,7 +15,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - - 6 commits contributed to the release over the course of 14 calendar days. + - 7 commits contributed to the release over the course of 14 calendar days. - 14 days passed between releases. - 1 commit was understood as [conventional](https://www.conventionalcommits.org). - 0 issues like '(#ID)' were seen in commit messages @@ -27,6 +27,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
view details * **Uncategorized** + - Prepare changelogs prior to release of `gix-index` ([`bfc4880`](https://github.com/GitoxideLabs/gitoxide/commit/bfc48801bf3ed39cdf7ec02e01aa3cfb6181705f)) - Merge pull request #1977 from GitoxideLabs/dependabot/cargo/cargo-811d7b929d ([`800738a`](https://github.com/GitoxideLabs/gitoxide/commit/800738a37f3d33926a427edfa294423bbe3f2b66)) - Bump the cargo group with 12 updates ([`4408166`](https://github.com/GitoxideLabs/gitoxide/commit/4408166bf56197a67419277a4ef8feeba9060fee)) - Merge pull request #1974 from cruessler/move-commit-time-to-either ([`8be3193`](https://github.com/GitoxideLabs/gitoxide/commit/8be3193eb34ac5deadb0ade60ba01cb3c97f6135)) diff --git a/gix-traverse/Cargo.toml b/gix-traverse/Cargo.toml index 27e312a63e3..754a114c9ff 100644 --- a/gix-traverse/Cargo.toml +++ b/gix-traverse/Cargo.toml @@ -2,7 +2,7 @@ lints.workspace = true [package] name = "gix-traverse" -version = "0.46.1" +version = "0.46.2" repository = "https://github.com/GitoxideLabs/gitoxide" license = "MIT OR Apache-2.0" description = "A crate of the gitoxide project" @@ -18,7 +18,7 @@ doctest = false [dependencies] gix-hash = { version = "^0.18.0", path = "../gix-hash" } gix-object = { version = "^0.49.1", path = "../gix-object" } -gix-date = { version = "^0.10.1", path = "../gix-date" } +gix-date = { version = "^0.10.2", path = "../gix-date" } gix-hashtable = { version = "^0.8.1", path = "../gix-hashtable" } gix-revwalk = { version = "^0.20.1", path = "../gix-revwalk" } gix-commitgraph = { version = "^0.28.0", path = "../gix-commitgraph" } diff --git a/gix-url/Cargo.toml b/gix-url/Cargo.toml index ec26518c3f2..5735f397f6d 100644 --- a/gix-url/Cargo.toml +++ b/gix-url/Cargo.toml @@ -20,7 +20,7 @@ serde = ["dep:serde", "bstr/serde"] [dependencies] gix-features = { version = "^0.42.1", path = "../gix-features" } -gix-path = { version = "^0.10.17", path = "../gix-path" } +gix-path = { version = "^0.10.18", path = "../gix-path" } serde = { version = "1.0.114", optional = true, default-features = false, features = ["std", "derive"] } thiserror = "2.0.0" diff --git a/gix-worktree-state/Cargo.toml b/gix-worktree-state/Cargo.toml index 4b81828ae5c..53c5fb37564 100644 --- a/gix-worktree-state/Cargo.toml +++ b/gix-worktree-state/Cargo.toml @@ -17,12 +17,12 @@ doctest = false [dependencies] gix-worktree = { version = "^0.41.0", path = "../gix-worktree", default-features = false, features = ["attributes"] } -gix-index = { version = "^0.40.0", path = "../gix-index" } +gix-index = { version = "^0.40.1", path = "../gix-index" } gix-fs = { version = "^0.15.0", path = "../gix-fs" } gix-hash = { version = "^0.18.0", path = "../gix-hash" } gix-object = { version = "^0.49.1", path = "../gix-object" } gix-glob = { version = "^0.20.0", path = "../gix-glob" } -gix-path = { version = "^0.10.17", path = "../gix-path" } +gix-path = { version = "^0.10.18", path = "../gix-path" } gix-features = { version = "^0.42.1", path = "../gix-features" } gix-filter = { version = "^0.19.1", path = "../gix-filter" } diff --git a/gix-worktree-stream/Cargo.toml b/gix-worktree-stream/Cargo.toml index 25c3806e20b..a95ad7306ee 100644 --- a/gix-worktree-stream/Cargo.toml +++ b/gix-worktree-stream/Cargo.toml @@ -20,9 +20,9 @@ gix-hash = { version = "^0.18.0", path = "../gix-hash" } gix-object = { version = "^0.49.1", path = "../gix-object" } gix-attributes = { version = "^0.26.0", path = "../gix-attributes" } gix-filter = { version = "^0.19.1", path = "../gix-filter" } -gix-traverse = { version = "^0.46.1", path = "../gix-traverse" } +gix-traverse = { version = "^0.46.2", path = "../gix-traverse" } gix-fs = { version = "^0.15.0", path = "../gix-fs" } -gix-path = { version = "^0.10.17", path = "../gix-path" } +gix-path = { version = "^0.10.18", path = "../gix-path" } thiserror = "2.0.0" parking_lot = "0.12.1" diff --git a/gix-worktree/Cargo.toml b/gix-worktree/Cargo.toml index 8582de3ab9f..287c8ca1568 100644 --- a/gix-worktree/Cargo.toml +++ b/gix-worktree/Cargo.toml @@ -23,12 +23,12 @@ attributes = ["dep:gix-attributes", "dep:gix-validate"] serde = ["dep:serde", "bstr/serde", "gix-index/serde", "gix-hash/serde", "gix-object/serde", "gix-attributes?/serde", "gix-ignore/serde"] [dependencies] -gix-index = { version = "^0.40.0", path = "../gix-index" } +gix-index = { version = "^0.40.1", path = "../gix-index" } gix-fs = { version = "^0.15.0", path = "../gix-fs" } gix-hash = { version = "^0.18.0", path = "../gix-hash" } gix-object = { version = "^0.49.1", path = "../gix-object" } gix-glob = { version = "^0.20.0", path = "../gix-glob" } -gix-path = { version = "^0.10.17", path = "../gix-path" } +gix-path = { version = "^0.10.18", path = "../gix-path" } gix-attributes = { version = "^0.26.0", path = "../gix-attributes", optional = true } gix-validate = { version = "^0.10.0", path = "../gix-validate", optional = true } gix-ignore = { version = "^0.15.0", path = "../gix-ignore" } diff --git a/gix/Cargo.toml b/gix/Cargo.toml index fb447cf5bfa..1394e97571f 100644 --- a/gix/Cargo.toml +++ b/gix/Cargo.toml @@ -312,7 +312,7 @@ gix-tempfile = { version = "^17.1.0", path = "../gix-tempfile", default-features gix-lock = { version = "^17.1.0", path = "../gix-lock" } gix-validate = { version = "^0.10.0", path = "../gix-validate" } gix-sec = { version = "^0.11.0", path = "../gix-sec" } -gix-date = { version = "^0.10.1", path = "../gix-date" } +gix-date = { version = "^0.10.2", path = "../gix-date" } gix-refspec = { version = "^0.30.1", path = "../gix-refspec" } gix-filter = { version = "^0.19.1", path = "../gix-filter", optional = true } gix-dir = { version = "^0.14.1", path = "../gix-dir", optional = true } @@ -330,9 +330,9 @@ gix-revision = { version = "^0.34.1", path = "../gix-revision", default-features gix-revwalk = { version = "^0.20.1", path = "../gix-revwalk" } gix-negotiate = { version = "^0.20.1", path = "../gix-negotiate", optional = true } -gix-path = { version = "^0.10.17", path = "../gix-path" } +gix-path = { version = "^0.10.18", path = "../gix-path" } gix-url = { version = "^0.31.0", path = "../gix-url" } -gix-traverse = { version = "^0.46.1", path = "../gix-traverse" } +gix-traverse = { version = "^0.46.2", path = "../gix-traverse" } gix-diff = { version = "^0.52.1", path = "../gix-diff", default-features = false } gix-merge = { version = "^0.5.1", path = "../gix-merge", default-features = false, optional = true } gix-mailmap = { version = "^0.27.1", path = "../gix-mailmap", optional = true } @@ -345,7 +345,7 @@ gix-trace = { version = "^0.1.12", path = "../gix-trace" } gix-glob = { version = "^0.20.0", path = "../gix-glob" } gix-credentials = { version = "^0.29.0", path = "../gix-credentials", optional = true } gix-prompt = { version = "^0.11.0", path = "../gix-prompt", optional = true } -gix-index = { version = "^0.40.0", path = "../gix-index", optional = true } +gix-index = { version = "^0.40.1", path = "../gix-index", optional = true } gix-attributes = { version = "^0.26.0", path = "../gix-attributes", optional = true } gix-ignore = { version = "^0.15.0", path = "../gix-ignore", optional = true } gix-worktree = { version = "^0.41.0", path = "../gix-worktree", optional = true, default-features = false } From dc9b103c2ef813931becefcf082daeda5a3cf869 Mon Sep 17 00:00:00 2001 From: Sebastian Thiel Date: Wed, 14 May 2025 22:54:03 +0200 Subject: [PATCH 057/166] feat!: Add optional `oauth_refresh_token` field to `identity::Account` (#1998) --- gix-sec/src/identity.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/gix-sec/src/identity.rs b/gix-sec/src/identity.rs index 06cecae2924..e93f437ccef 100644 --- a/gix-sec/src/identity.rs +++ b/gix-sec/src/identity.rs @@ -8,6 +8,8 @@ pub struct Account { pub username: String, /// The user's password pub password: String, + /// An OAuth refresh token that may accompany the password. It is to be treated confidentially, just like the password. + pub oauth_refresh_token: Option, } /// Returns true if the given `path` is owned by the user who is executing the current process. From 3a50af524ad5e13bbd08bbb96cbf0817d5e89038 Mon Sep 17 00:00:00 2001 From: Sebastian Thiel Date: Thu, 8 May 2025 06:33:49 +0200 Subject: [PATCH 058/166] fix!: pass `password_expiry_utc` and `oauth_refresh_token` in credential helper invocations (#1998) --- Cargo.lock | 1 + gix-credentials/Cargo.toml | 1 + gix-credentials/src/helper/cascade.rs | 40 +++++++++--- gix-credentials/src/helper/invoke.rs | 1 + gix-credentials/src/helper/mod.rs | 10 ++- gix-credentials/src/protocol/context/mod.rs | 25 +++++++- gix-credentials/src/protocol/context/serde.rs | 62 +++++++++++++++---- gix-credentials/src/protocol/mod.rs | 4 ++ gix-credentials/tests/fixtures/expired.sh | 7 +++ gix-credentials/tests/fixtures/oauth-token.sh | 5 ++ gix-credentials/tests/helper/cascade.rs | 20 ++++++ gix-credentials/tests/helper/invoke.rs | 12 ++-- gix-credentials/tests/helper/mod.rs | 2 + 13 files changed, 160 insertions(+), 30 deletions(-) create mode 100755 gix-credentials/tests/fixtures/expired.sh create mode 100755 gix-credentials/tests/fixtures/oauth-token.sh diff --git a/Cargo.lock b/Cargo.lock index 6ece8372bbc..8f06be748f3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1625,6 +1625,7 @@ dependencies = [ "document-features", "gix-command", "gix-config-value", + "gix-date", "gix-path", "gix-prompt", "gix-sec", diff --git a/gix-credentials/Cargo.toml b/gix-credentials/Cargo.toml index 679200dc19c..d25049fbf86 100644 --- a/gix-credentials/Cargo.toml +++ b/gix-credentials/Cargo.toml @@ -25,6 +25,7 @@ gix-path = { version = "^0.10.17", path = "../gix-path" } gix-command = { version = "^0.6.0", path = "../gix-command" } gix-config-value = { version = "^0.15.0", path = "../gix-config-value" } gix-prompt = { version = "^0.11.0", path = "../gix-prompt" } +gix-date = { version = "^0.10.1", path = "../gix-date" } gix-trace = { version = "^0.1.12", path = "../gix-trace" } thiserror = "2.0.0" diff --git a/gix-credentials/src/helper/cascade.rs b/gix-credentials/src/helper/cascade.rs index 9ec251161d4..3d5b31a5ef6 100644 --- a/gix-credentials/src/helper/cascade.rs +++ b/gix-credentials/src/helper/cascade.rs @@ -88,30 +88,51 @@ impl Cascade { match helper::invoke::raw(program, &action) { Ok(None) => {} Ok(Some(stdout)) => { - let ctx = Context::from_bytes(&stdout)?; + let Context { + protocol, + host, + path, + username, + password, + oauth_refresh_token, + password_expiry_utc, + url: ctx_url, + quit, + } = Context::from_bytes(&stdout)?; if let Some(dst_ctx) = action.context_mut() { - if let Some(src) = ctx.path { + if let Some(src) = path { dst_ctx.path = Some(src); } + if let Some(src) = password_expiry_utc { + dst_ctx.password_expiry_utc = Some(src); + } for (src, dst) in [ - (ctx.protocol, &mut dst_ctx.protocol), - (ctx.host, &mut dst_ctx.host), - (ctx.username, &mut dst_ctx.username), - (ctx.password, &mut dst_ctx.password), + (protocol, &mut dst_ctx.protocol), + (host, &mut dst_ctx.host), + (username, &mut dst_ctx.username), + (password, &mut dst_ctx.password), + (oauth_refresh_token, &mut dst_ctx.oauth_refresh_token), ] { if let Some(src) = src { *dst = Some(src); } } - if let Some(src) = ctx.url { + if let Some(src) = ctx_url { dst_ctx.url = Some(src); url = dst_ctx.destructure_url_in_place(self.use_http_path)?.url.take(); } + if dst_ctx + .password_expiry_utc + .is_some_and(|expiry_date| expiry_date < gix_date::Time::now_utc().seconds) + { + dst_ctx.password_expiry_utc = None; + dst_ctx.clear_secrets(); + } if dst_ctx.username.is_some() && dst_ctx.password.is_some() { break; } - if ctx.quit.unwrap_or_default() { - dst_ctx.quit = ctx.quit; + if quit.unwrap_or_default() { + dst_ctx.quit = quit; break; } } @@ -152,6 +173,7 @@ impl Cascade { action.context().map(|ctx| helper::Outcome { username: ctx.username.clone(), password: ctx.password.clone(), + oauth_refresh_token: ctx.oauth_refresh_token.clone(), quit: ctx.quit.unwrap_or(false), next: ctx.to_owned().into(), }), diff --git a/gix-credentials/src/helper/invoke.rs b/gix-credentials/src/helper/invoke.rs index e8bbb4c1614..20da4351303 100644 --- a/gix-credentials/src/helper/invoke.rs +++ b/gix-credentials/src/helper/invoke.rs @@ -30,6 +30,7 @@ pub fn invoke(helper: &mut crate::Program, action: &Action) -> Result { Ok(Some(Outcome { username: ctx.username, password: ctx.password, + oauth_refresh_token: ctx.oauth_refresh_token, quit: ctx.quit.unwrap_or(false), next: NextAction { previous_output: stdout.into(), diff --git a/gix-credentials/src/helper/mod.rs b/gix-credentials/src/helper/mod.rs index 015ca0aaf9f..3563585588b 100644 --- a/gix-credentials/src/helper/mod.rs +++ b/gix-credentials/src/helper/mod.rs @@ -25,6 +25,8 @@ pub struct Outcome { pub username: Option, /// The password to use in the identity, if set. pub password: Option, + /// An OAuth refresh token that may accompany a password. It is to be treated confidentially, just like the password. + pub oauth_refresh_token: Option, /// If set, the helper asked to stop the entire process, whether the identity is complete or not. pub quit: bool, /// A handle to the action to perform next in another call to [`helper::invoke()`][crate::helper::invoke()]. @@ -42,7 +44,11 @@ impl Outcome { self.username .take() .zip(self.password.take()) - .map(|(username, password)| gix_sec::identity::Account { username, password }) + .map(|(username, password)| gix_sec::identity::Account { + username, + password, + oauth_refresh_token: self.oauth_refresh_token.take(), + }) } } @@ -131,7 +137,7 @@ impl Action { } } -/// A handle to [store][NextAction::store()] or [erase][NextAction::erase()] the outcome of the initial action. +/// A handle to [store](NextAction::store()) or [erase](NextAction::erase()) the outcome of the initial action. #[derive(Clone, Debug, Eq, PartialEq)] pub struct NextAction { previous_output: BString, diff --git a/gix-credentials/src/protocol/context/mod.rs b/gix-credentials/src/protocol/context/mod.rs index 1e98f017bc1..02b98068f44 100644 --- a/gix-credentials/src/protocol/context/mod.rs +++ b/gix-credentials/src/protocol/context/mod.rs @@ -14,6 +14,23 @@ mod access { use crate::protocol::Context; impl Context { + /// Clear all fields that are considered secret. + pub fn clear_secrets(&mut self) { + let Context { + protocol: _, + host: _, + path: _, + username: _, + password, + oauth_refresh_token, + password_expiry_utc: _, + url: _, + quit: _, + } = self; + + *password = None; + *oauth_refresh_token = None; + } /// Replace existing secrets with the word ``. pub fn redacted(mut self) -> Self { let Context { @@ -22,11 +39,15 @@ mod access { path: _, username: _, password, + oauth_refresh_token, + password_expiry_utc: _, url: _, quit: _, } = &mut self; - if let Some(pw) = password { - *pw = "".into(); + for secret_field in [password, oauth_refresh_token] { + if let Some(secret) = secret_field { + *secret = "".into(); + } } self } diff --git a/gix-credentials/src/protocol/context/serde.rs b/gix-credentials/src/protocol/context/serde.rs index f3976d669cc..a4c91b96376 100644 --- a/gix-credentials/src/protocol/context/serde.rs +++ b/gix-credentials/src/protocol/context/serde.rs @@ -17,7 +17,20 @@ mod write { out.write_all(value)?; out.write_all(b"\n") } - for (key, value) in [("url", &self.url), ("path", &self.path)] { + let Context { + protocol, + host, + path, + username, + password, + oauth_refresh_token, + password_expiry_utc, + url, + // We only decode quit and interpret it, but won't get to pass it on as it means to stop the + // credential helper invocation chain. + quit: _, + } = self; + for (key, value) in [("url", url), ("path", path)] { if let Some(value) = value { validate(key, value.as_slice().into()) .map_err(|err| std::io::Error::new(std::io::ErrorKind::Other, err))?; @@ -25,10 +38,11 @@ mod write { } } for (key, value) in [ - ("protocol", &self.protocol), - ("host", &self.host), - ("username", &self.username), - ("password", &self.password), + ("protocol", protocol), + ("host", host), + ("username", username), + ("password", password), + ("oauth_refresh_token", oauth_refresh_token), ] { if let Some(value) = value { validate(key, value.as_str().into()) @@ -36,6 +50,13 @@ mod write { write_key(&mut out, key, value.as_bytes().as_bstr()).ok(); } } + if let Some(value) = password_expiry_utc { + let key = "password_expiry_utc"; + let value = value.to_string(); + validate(key, value.as_str().into()) + .map_err(|err| std::io::Error::new(std::io::ErrorKind::Other, err))?; + write_key(&mut out, key, value.as_bytes().as_bstr()).ok(); + } Ok(()) } @@ -70,6 +91,17 @@ pub mod decode { /// Decode ourselves from `input` which is the format written by [`write_to()`][Self::write_to()]. pub fn from_bytes(input: &[u8]) -> Result { let mut ctx = Context::default(); + let Context { + protocol, + host, + path, + username, + password, + oauth_refresh_token, + password_expiry_utc, + url, + quit, + } = &mut ctx; for res in input.lines().take_while(|line| !line.is_empty()).map(|line| { let mut it = line.splitn(2, |b| *b == b'='); match ( @@ -84,23 +116,27 @@ pub mod decode { }) { let (key, value) = res?; match key { - "protocol" | "host" | "username" | "password" => { + "protocol" | "host" | "username" | "password" | "oauth_refresh_token" => { if !value.is_utf8() { return Err(Error::IllformedUtf8InValue { key: key.into(), value }); } let value = value.to_string(); *match key { - "protocol" => &mut ctx.protocol, - "host" => &mut ctx.host, - "username" => &mut ctx.username, - "password" => &mut ctx.password, + "protocol" => &mut *protocol, + "host" => host, + "username" => username, + "password" => password, + "oauth_refresh_token" => oauth_refresh_token, _ => unreachable!("checked field names in match above"), } = Some(value); } - "url" => ctx.url = Some(value), - "path" => ctx.path = Some(value), + "password_expiry_utc" => { + *password_expiry_utc = value.to_str().ok().and_then(|value| value.parse().ok()); + } + "url" => *url = Some(value), + "path" => *path = Some(value), "quit" => { - ctx.quit = gix_config_value::Boolean::try_from(value.as_ref()).ok().map(Into::into); + *quit = gix_config_value::Boolean::try_from(value.as_ref()).ok().map(Into::into); } _ => {} } diff --git a/gix-credentials/src/protocol/mod.rs b/gix-credentials/src/protocol/mod.rs index 909187a680b..2920780bf95 100644 --- a/gix-credentials/src/protocol/mod.rs +++ b/gix-credentials/src/protocol/mod.rs @@ -48,6 +48,10 @@ pub struct Context { pub username: Option, /// The credential’s password, if we are asking it to be stored. pub password: Option, + /// An OAuth refresh token that may accompany a password. It is to be treated confidentially, just like the password. + pub oauth_refresh_token: Option, + /// The expiry date of OAuth tokens as seconds from Unix epoch. + pub password_expiry_utc: Option, /// When this special attribute is read by git credential, the value is parsed as a URL and treated as if its constituent /// parts were read (e.g., url= would behave as if /// protocol=https and host=example.com had been provided). This can help callers avoid parsing URLs themselves. diff --git a/gix-credentials/tests/fixtures/expired.sh b/gix-credentials/tests/fixtures/expired.sh new file mode 100755 index 00000000000..eec65e9ecd6 --- /dev/null +++ b/gix-credentials/tests/fixtures/expired.sh @@ -0,0 +1,7 @@ +#!/usr/bin/env bash +set -eu + +test "$1" = get && \ +echo username=user-expired && \ +echo password=pass-expired && \ +echo password_expiry_utc=1 diff --git a/gix-credentials/tests/fixtures/oauth-token.sh b/gix-credentials/tests/fixtures/oauth-token.sh new file mode 100755 index 00000000000..6bed3e55279 --- /dev/null +++ b/gix-credentials/tests/fixtures/oauth-token.sh @@ -0,0 +1,5 @@ +#!/usr/bin/env bash +set -eu + +test "$1" = get && \ +echo oauth_refresh_token=oauth-token diff --git a/gix-credentials/tests/helper/cascade.rs b/gix-credentials/tests/helper/cascade.rs index 32ffaaa7edb..e0dadeabd11 100644 --- a/gix-credentials/tests/helper/cascade.rs +++ b/gix-credentials/tests/helper/cascade.rs @@ -119,6 +119,25 @@ mod invoke { assert_eq!(actual.identity, identity("user", "pass")); } + #[test] + fn expired_credentials_are_not_returned() { + let actual = invoke_cascade( + ["expired", "oauth-token", "custom-helper"], + Action::get_for_url("http://github.com"), + ) + .unwrap() + .expect("credentials"); + + assert_eq!( + actual.identity, + Account { + oauth_refresh_token: Some("oauth-token".into()), + ..identity("user-script", "pass-script") + }, + "it ignored the expired password, which otherwise would have come first" + ); + } + #[test] fn bogus_password_overrides_any_helper_and_helper_overrides_username_in_url() { let actual = Cascade::default() @@ -144,6 +163,7 @@ mod invoke { Account { username: user.into(), password: pass.into(), + oauth_refresh_token: None, } } diff --git a/gix-credentials/tests/helper/invoke.rs b/gix-credentials/tests/helper/invoke.rs index 33004854803..acae7d2c0bd 100644 --- a/gix-credentials/tests/helper/invoke.rs +++ b/gix-credentials/tests/helper/invoke.rs @@ -14,7 +14,8 @@ fn get() { outcome.consume_identity().expect("complete"), gix_sec::identity::Account { username: "user".into(), - password: "pass".into() + password: "pass".into(), + oauth_refresh_token: None } ); assert_eq!( @@ -78,7 +79,8 @@ mod program { .expect("complete"), gix_sec::identity::Account { username: "user".into(), - password: "pass".into() + password: "pass".into(), + oauth_refresh_token: None } ); } @@ -99,7 +101,8 @@ mod program { .expect("complete"), gix_sec::identity::Account { username: "user-script".into(), - password: "pass-script".into() + password: "pass-script".into(), + oauth_refresh_token: None } ); Ok(()) @@ -117,7 +120,8 @@ mod program { .expect("complete"), gix_sec::identity::Account { username: "user-script".into(), - password: "pass-script".into() + password: "pass-script".into(), + oauth_refresh_token: None } ); Ok(()) diff --git a/gix-credentials/tests/helper/mod.rs b/gix-credentials/tests/helper/mod.rs index 59c448065e5..a65d42b95bb 100644 --- a/gix-credentials/tests/helper/mod.rs +++ b/gix-credentials/tests/helper/mod.rs @@ -12,6 +12,7 @@ mod invoke_outcome_to_helper_result { Some(helper::Outcome { username: None, password: None, + oauth_refresh_token: None, quit: false, next: protocol::Context::default().into(), }), @@ -28,6 +29,7 @@ mod invoke_outcome_to_helper_result { Some(helper::Outcome { username: None, password: None, + oauth_refresh_token: None, quit: true, next: protocol::Context::default().into(), }), From 6880175ab1bb70af39d18919cb8bfdc1df32b46f Mon Sep 17 00:00:00 2001 From: Sebastian Thiel Date: Wed, 14 May 2025 23:07:04 +0200 Subject: [PATCH 059/166] adapt to changes in `gix-sec` --- gix-credentials/src/protocol/context/mod.rs | 6 ++---- gix-transport/src/client/blocking_io/http/mod.rs | 8 +++++++- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/gix-credentials/src/protocol/context/mod.rs b/gix-credentials/src/protocol/context/mod.rs index 02b98068f44..01ee151f306 100644 --- a/gix-credentials/src/protocol/context/mod.rs +++ b/gix-credentials/src/protocol/context/mod.rs @@ -44,10 +44,8 @@ mod access { url: _, quit: _, } = &mut self; - for secret_field in [password, oauth_refresh_token] { - if let Some(secret) = secret_field { - *secret = "".into(); - } + for secret in [password, oauth_refresh_token].into_iter().flatten() { + *secret = "".into(); } self } diff --git a/gix-transport/src/client/blocking_io/http/mod.rs b/gix-transport/src/client/blocking_io/http/mod.rs index 9473b00d928..6605b7bcab0 100644 --- a/gix-transport/src/client/blocking_io/http/mod.rs +++ b/gix-transport/src/client/blocking_io/http/mod.rs @@ -243,6 +243,7 @@ impl Transport { .map(|(user, pass)| gix_sec::identity::Account { username: user.to_string(), password: pass.to_string(), + oauth_refresh_token: None, }); Transport { url: url.to_bstring().to_string(), @@ -296,7 +297,12 @@ impl Transport { #[allow(clippy::unnecessary_wraps, unknown_lints)] fn add_basic_auth_if_present(&self, headers: &mut Vec>) -> Result<(), client::Error> { - if let Some(gix_sec::identity::Account { username, password }) = &self.identity { + if let Some(gix_sec::identity::Account { + username, + password, + oauth_refresh_token: _, + }) = &self.identity + { #[cfg(not(feature = "http-client-insecure-credentials"))] if self.url.starts_with("http://") { return Err(client::Error::AuthenticationRefused( From 8692657ec7c7ab765fcf1aeb9f0e1c55384e39d3 Mon Sep 17 00:00:00 2001 From: Sebastian Thiel Date: Fri, 16 May 2025 05:06:22 +0200 Subject: [PATCH 060/166] avoid yanked `zip` dependency (#2013) --- Cargo.lock | 5 ++--- gix-archive/Cargo.toml | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 57a355ef104..68d13e175c3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5988,13 +5988,12 @@ dependencies = [ [[package]] name = "zip" -version = "2.6.1" +version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1dcb24d0152526ae49b9b96c1dcf71850ca1e0b882e4e28ed898a93c41334744" +checksum = "12598812502ed0105f607f941c386f43d441e00148fce9dec3ca5ffb0bde9308" dependencies = [ "arbitrary", "crc32fast", - "crossbeam-utils", "flate2", "indexmap", "memchr", diff --git a/gix-archive/Cargo.toml b/gix-archive/Cargo.toml index 29b84399e65..01b29a072ed 100644 --- a/gix-archive/Cargo.toml +++ b/gix-archive/Cargo.toml @@ -34,7 +34,7 @@ gix-path = { version = "^0.10.18", path = "../gix-path", optional = true } gix-date = { version = "^0.10.2", path = "../gix-date" } flate2 = { version = "1.1.1", optional = true, default-features = false, features = ["zlib-rs"] } -zip = { version = "2.6.1", optional = true, default-features = false, features = ["deflate"] } +zip = { version = "3.0.0", optional = true, default-features = false, features = ["deflate"] } jiff = { version = "0.2.12", default-features = false, features = ["std"] } thiserror = "2.0.0" From 31b86ee6774ad6762f941aa0e8377e709bd41f5e Mon Sep 17 00:00:00 2001 From: Sebastian Thiel Date: Fri, 16 May 2025 10:35:27 +0200 Subject: [PATCH 061/166] update changelogs prior to release --- gix-archive/CHANGELOG.md | 34 +++++++++++++++++++++++++++++++- gix-attributes/CHANGELOG.md | 29 ++++++++++++++++++++++++++- gix-command/CHANGELOG.md | 29 ++++++++++++++++++++++++++- gix-filter/CHANGELOG.md | 29 ++++++++++++++++++++++++++- gix-glob/CHANGELOG.md | 29 ++++++++++++++++++++++++++- gix-worktree-stream/CHANGELOG.md | 29 ++++++++++++++++++++++++++- 6 files changed, 173 insertions(+), 6 deletions(-) diff --git a/gix-archive/CHANGELOG.md b/gix-archive/CHANGELOG.md index 11d10b41bc7..639df12f12b 100644 --- a/gix-archive/CHANGELOG.md +++ b/gix-archive/CHANGELOG.md @@ -5,13 +5,43 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## Unreleased + +Update the `zip` dependency to the unyanked version 3.0. + +### Commit Statistics + + + + - 6 commits contributed to the release over the course of 20 calendar days. + - 20 days passed between releases. + - 0 commits were understood as [conventional](https://www.conventionalcommits.org). + - 2 unique issues were worked on: [#1984](https://github.com/GitoxideLabs/gitoxide/issues/1984), [#2013](https://github.com/GitoxideLabs/gitoxide/issues/2013) + +### Commit Details + + + +
view details + + * **[#1984](https://github.com/GitoxideLabs/gitoxide/issues/1984)** + - Further upgrade `jiff` to fix fuzz failures ([`0be4dd4`](https://github.com/GitoxideLabs/gitoxide/commit/0be4dd4e037e8a3080ef335913e06bc2584fd96d)) + * **[#2013](https://github.com/GitoxideLabs/gitoxide/issues/2013)** + - Avoid yanked `zip` dependency ([`8692657`](https://github.com/GitoxideLabs/gitoxide/commit/8692657ec7c7ab765fcf1aeb9f0e1c55384e39d3)) + * **Uncategorized** + - Merge pull request #2009 from GitoxideLabs/release-gix-index ([`c3f06ae`](https://github.com/GitoxideLabs/gitoxide/commit/c3f06ae424ab4e1918a364cabe8276297465a73a)) + - Release gix-path v0.10.18, gix-date v0.10.2, gix-traverse v0.46.2, gix-index v0.40.1 ([`d2b4c44`](https://github.com/GitoxideLabs/gitoxide/commit/d2b4c44fcb2bf43e80d67532262631a5086f08de)) + - Merge pull request #1984 from GitoxideLabs/fuzz ([`f965540`](https://github.com/GitoxideLabs/gitoxide/commit/f965540c162ed3e23bd0d7ad9083093033647e51)) + - Merge pull request #1971 from GitoxideLabs/new-release ([`8d4c4d1`](https://github.com/GitoxideLabs/gitoxide/commit/8d4c4d1e09f84c962c29d98a686c64228196ac13)) +
+ ## 0.21.1 (2025-04-26) ### Commit Statistics - - 1 commit contributed to the release. + - 3 commits contributed to the release. - 0 commits were understood as [conventional](https://www.conventionalcommits.org). - 0 issues like '(#ID)' were seen in commit messages @@ -22,7 +52,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
view details * **Uncategorized** + - Release gix-date v0.10.1, gix-utils v0.3.0, gix-actor v0.35.1, gix-validate v0.10.0, gix-path v0.10.17, gix-features v0.42.1, gix-hash v0.18.0, gix-hashtable v0.8.1, gix-object v0.49.1, gix-glob v0.20.0, gix-quote v0.6.0, gix-attributes v0.26.0, gix-command v0.6.0, gix-packetline-blocking v0.19.0, gix-filter v0.19.1, gix-fs v0.15.0, gix-commitgraph v0.28.0, gix-revwalk v0.20.1, gix-traverse v0.46.1, gix-worktree-stream v0.21.1, gix-archive v0.21.1, gix-tempfile v17.1.0, gix-lock v17.1.0, gix-index v0.40.0, gix-config-value v0.15.0, gix-pathspec v0.11.0, gix-ignore v0.15.0, gix-worktree v0.41.0, gix-diff v0.52.1, gix-blame v0.2.1, gix-ref v0.52.1, gix-sec v0.11.0, gix-config v0.45.1, gix-prompt v0.11.0, gix-url v0.31.0, gix-credentials v0.29.0, gix-discover v0.40.1, gix-dir v0.14.1, gix-mailmap v0.27.1, gix-revision v0.34.1, gix-merge v0.5.1, gix-negotiate v0.20.1, gix-pack v0.59.1, gix-odb v0.69.1, gix-refspec v0.30.1, gix-shallow v0.4.0, gix-packetline v0.19.0, gix-transport v0.47.0, gix-protocol v0.50.1, gix-status v0.19.1, gix-submodule v0.19.1, gix-worktree-state v0.19.0, gix v0.72.1, gix-fsck v0.11.1, gitoxide-core v0.47.1, gitoxide v0.44.0 ([`e104545`](https://github.com/GitoxideLabs/gitoxide/commit/e104545b78951ca882481d4a58f4425a8bc81c87)) - Bump all prior pratch levels to majors ([`5f7f805`](https://github.com/GitoxideLabs/gitoxide/commit/5f7f80570e1a5522e76ea58cccbb957249a0dffe)) + - Merge pull request #1969 from GitoxideLabs/new-release ([`631f07a`](https://github.com/GitoxideLabs/gitoxide/commit/631f07ad0c1cb93d9da42cf2c8499584fe91880a))
## 0.21.0 (2025-04-25) diff --git a/gix-attributes/CHANGELOG.md b/gix-attributes/CHANGELOG.md index 4620837b6cf..ad7deb708dc 100644 --- a/gix-attributes/CHANGELOG.md +++ b/gix-attributes/CHANGELOG.md @@ -5,13 +5,38 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## Unreleased + +A maintenance release without user-facing changes. + +### Commit Statistics + + + + - 3 commits contributed to the release over the course of 20 calendar days. + - 20 days passed between releases. + - 0 commits were understood as [conventional](https://www.conventionalcommits.org). + - 0 issues like '(#ID)' were seen in commit messages + +### Commit Details + + + +
view details + + * **Uncategorized** + - Merge pull request #2009 from GitoxideLabs/release-gix-index ([`c3f06ae`](https://github.com/GitoxideLabs/gitoxide/commit/c3f06ae424ab4e1918a364cabe8276297465a73a)) + - Release gix-path v0.10.18, gix-date v0.10.2, gix-traverse v0.46.2, gix-index v0.40.1 ([`d2b4c44`](https://github.com/GitoxideLabs/gitoxide/commit/d2b4c44fcb2bf43e80d67532262631a5086f08de)) + - Merge pull request #1971 from GitoxideLabs/new-release ([`8d4c4d1`](https://github.com/GitoxideLabs/gitoxide/commit/8d4c4d1e09f84c962c29d98a686c64228196ac13)) +
+ ## 0.26.0 (2025-04-26) ### Commit Statistics - - 1 commit contributed to the release. + - 3 commits contributed to the release. - 0 commits were understood as [conventional](https://www.conventionalcommits.org). - 0 issues like '(#ID)' were seen in commit messages @@ -22,7 +47,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
view details * **Uncategorized** + - Release gix-date v0.10.1, gix-utils v0.3.0, gix-actor v0.35.1, gix-validate v0.10.0, gix-path v0.10.17, gix-features v0.42.1, gix-hash v0.18.0, gix-hashtable v0.8.1, gix-object v0.49.1, gix-glob v0.20.0, gix-quote v0.6.0, gix-attributes v0.26.0, gix-command v0.6.0, gix-packetline-blocking v0.19.0, gix-filter v0.19.1, gix-fs v0.15.0, gix-commitgraph v0.28.0, gix-revwalk v0.20.1, gix-traverse v0.46.1, gix-worktree-stream v0.21.1, gix-archive v0.21.1, gix-tempfile v17.1.0, gix-lock v17.1.0, gix-index v0.40.0, gix-config-value v0.15.0, gix-pathspec v0.11.0, gix-ignore v0.15.0, gix-worktree v0.41.0, gix-diff v0.52.1, gix-blame v0.2.1, gix-ref v0.52.1, gix-sec v0.11.0, gix-config v0.45.1, gix-prompt v0.11.0, gix-url v0.31.0, gix-credentials v0.29.0, gix-discover v0.40.1, gix-dir v0.14.1, gix-mailmap v0.27.1, gix-revision v0.34.1, gix-merge v0.5.1, gix-negotiate v0.20.1, gix-pack v0.59.1, gix-odb v0.69.1, gix-refspec v0.30.1, gix-shallow v0.4.0, gix-packetline v0.19.0, gix-transport v0.47.0, gix-protocol v0.50.1, gix-status v0.19.1, gix-submodule v0.19.1, gix-worktree-state v0.19.0, gix v0.72.1, gix-fsck v0.11.1, gitoxide-core v0.47.1, gitoxide v0.44.0 ([`e104545`](https://github.com/GitoxideLabs/gitoxide/commit/e104545b78951ca882481d4a58f4425a8bc81c87)) - Bump all prior pratch levels to majors ([`5f7f805`](https://github.com/GitoxideLabs/gitoxide/commit/5f7f80570e1a5522e76ea58cccbb957249a0dffe)) + - Merge pull request #1969 from GitoxideLabs/new-release ([`631f07a`](https://github.com/GitoxideLabs/gitoxide/commit/631f07ad0c1cb93d9da42cf2c8499584fe91880a))
## 0.25.1 (2025-04-25) diff --git a/gix-command/CHANGELOG.md b/gix-command/CHANGELOG.md index c0070161bed..3e728f8a113 100644 --- a/gix-command/CHANGELOG.md +++ b/gix-command/CHANGELOG.md @@ -5,13 +5,38 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## Unreleased + +A maintenance release without user-facing changes. + +### Commit Statistics + + + + - 3 commits contributed to the release over the course of 20 calendar days. + - 20 days passed between releases. + - 0 commits were understood as [conventional](https://www.conventionalcommits.org). + - 0 issues like '(#ID)' were seen in commit messages + +### Commit Details + + + +
view details + + * **Uncategorized** + - Merge pull request #2009 from GitoxideLabs/release-gix-index ([`c3f06ae`](https://github.com/GitoxideLabs/gitoxide/commit/c3f06ae424ab4e1918a364cabe8276297465a73a)) + - Release gix-path v0.10.18, gix-date v0.10.2, gix-traverse v0.46.2, gix-index v0.40.1 ([`d2b4c44`](https://github.com/GitoxideLabs/gitoxide/commit/d2b4c44fcb2bf43e80d67532262631a5086f08de)) + - Merge pull request #1971 from GitoxideLabs/new-release ([`8d4c4d1`](https://github.com/GitoxideLabs/gitoxide/commit/8d4c4d1e09f84c962c29d98a686c64228196ac13)) +
+ ## 0.6.0 (2025-04-26) ### Commit Statistics - - 1 commit contributed to the release. + - 3 commits contributed to the release. - 0 commits were understood as [conventional](https://www.conventionalcommits.org). - 0 issues like '(#ID)' were seen in commit messages @@ -22,7 +47,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
view details * **Uncategorized** + - Release gix-date v0.10.1, gix-utils v0.3.0, gix-actor v0.35.1, gix-validate v0.10.0, gix-path v0.10.17, gix-features v0.42.1, gix-hash v0.18.0, gix-hashtable v0.8.1, gix-object v0.49.1, gix-glob v0.20.0, gix-quote v0.6.0, gix-attributes v0.26.0, gix-command v0.6.0, gix-packetline-blocking v0.19.0, gix-filter v0.19.1, gix-fs v0.15.0, gix-commitgraph v0.28.0, gix-revwalk v0.20.1, gix-traverse v0.46.1, gix-worktree-stream v0.21.1, gix-archive v0.21.1, gix-tempfile v17.1.0, gix-lock v17.1.0, gix-index v0.40.0, gix-config-value v0.15.0, gix-pathspec v0.11.0, gix-ignore v0.15.0, gix-worktree v0.41.0, gix-diff v0.52.1, gix-blame v0.2.1, gix-ref v0.52.1, gix-sec v0.11.0, gix-config v0.45.1, gix-prompt v0.11.0, gix-url v0.31.0, gix-credentials v0.29.0, gix-discover v0.40.1, gix-dir v0.14.1, gix-mailmap v0.27.1, gix-revision v0.34.1, gix-merge v0.5.1, gix-negotiate v0.20.1, gix-pack v0.59.1, gix-odb v0.69.1, gix-refspec v0.30.1, gix-shallow v0.4.0, gix-packetline v0.19.0, gix-transport v0.47.0, gix-protocol v0.50.1, gix-status v0.19.1, gix-submodule v0.19.1, gix-worktree-state v0.19.0, gix v0.72.1, gix-fsck v0.11.1, gitoxide-core v0.47.1, gitoxide v0.44.0 ([`e104545`](https://github.com/GitoxideLabs/gitoxide/commit/e104545b78951ca882481d4a58f4425a8bc81c87)) - Bump all prior pratch levels to majors ([`5f7f805`](https://github.com/GitoxideLabs/gitoxide/commit/5f7f80570e1a5522e76ea58cccbb957249a0dffe)) + - Merge pull request #1969 from GitoxideLabs/new-release ([`631f07a`](https://github.com/GitoxideLabs/gitoxide/commit/631f07ad0c1cb93d9da42cf2c8499584fe91880a))
## 0.5.1 (2025-04-25) diff --git a/gix-filter/CHANGELOG.md b/gix-filter/CHANGELOG.md index b75a3b9d734..6b9f56494bf 100644 --- a/gix-filter/CHANGELOG.md +++ b/gix-filter/CHANGELOG.md @@ -5,13 +5,38 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## Unreleased + +A maintenance release without user-facing changes. + +### Commit Statistics + + + + - 3 commits contributed to the release over the course of 20 calendar days. + - 20 days passed between releases. + - 0 commits were understood as [conventional](https://www.conventionalcommits.org). + - 0 issues like '(#ID)' were seen in commit messages + +### Commit Details + + + +
view details + + * **Uncategorized** + - Merge pull request #2009 from GitoxideLabs/release-gix-index ([`c3f06ae`](https://github.com/GitoxideLabs/gitoxide/commit/c3f06ae424ab4e1918a364cabe8276297465a73a)) + - Release gix-path v0.10.18, gix-date v0.10.2, gix-traverse v0.46.2, gix-index v0.40.1 ([`d2b4c44`](https://github.com/GitoxideLabs/gitoxide/commit/d2b4c44fcb2bf43e80d67532262631a5086f08de)) + - Merge pull request #1971 from GitoxideLabs/new-release ([`8d4c4d1`](https://github.com/GitoxideLabs/gitoxide/commit/8d4c4d1e09f84c962c29d98a686c64228196ac13)) +
+ ## 0.19.1 (2025-04-26) ### Commit Statistics - - 1 commit contributed to the release. + - 3 commits contributed to the release. - 0 commits were understood as [conventional](https://www.conventionalcommits.org). - 0 issues like '(#ID)' were seen in commit messages @@ -22,7 +47,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
view details * **Uncategorized** + - Release gix-date v0.10.1, gix-utils v0.3.0, gix-actor v0.35.1, gix-validate v0.10.0, gix-path v0.10.17, gix-features v0.42.1, gix-hash v0.18.0, gix-hashtable v0.8.1, gix-object v0.49.1, gix-glob v0.20.0, gix-quote v0.6.0, gix-attributes v0.26.0, gix-command v0.6.0, gix-packetline-blocking v0.19.0, gix-filter v0.19.1, gix-fs v0.15.0, gix-commitgraph v0.28.0, gix-revwalk v0.20.1, gix-traverse v0.46.1, gix-worktree-stream v0.21.1, gix-archive v0.21.1, gix-tempfile v17.1.0, gix-lock v17.1.0, gix-index v0.40.0, gix-config-value v0.15.0, gix-pathspec v0.11.0, gix-ignore v0.15.0, gix-worktree v0.41.0, gix-diff v0.52.1, gix-blame v0.2.1, gix-ref v0.52.1, gix-sec v0.11.0, gix-config v0.45.1, gix-prompt v0.11.0, gix-url v0.31.0, gix-credentials v0.29.0, gix-discover v0.40.1, gix-dir v0.14.1, gix-mailmap v0.27.1, gix-revision v0.34.1, gix-merge v0.5.1, gix-negotiate v0.20.1, gix-pack v0.59.1, gix-odb v0.69.1, gix-refspec v0.30.1, gix-shallow v0.4.0, gix-packetline v0.19.0, gix-transport v0.47.0, gix-protocol v0.50.1, gix-status v0.19.1, gix-submodule v0.19.1, gix-worktree-state v0.19.0, gix v0.72.1, gix-fsck v0.11.1, gitoxide-core v0.47.1, gitoxide v0.44.0 ([`e104545`](https://github.com/GitoxideLabs/gitoxide/commit/e104545b78951ca882481d4a58f4425a8bc81c87)) - Bump all prior pratch levels to majors ([`5f7f805`](https://github.com/GitoxideLabs/gitoxide/commit/5f7f80570e1a5522e76ea58cccbb957249a0dffe)) + - Merge pull request #1969 from GitoxideLabs/new-release ([`631f07a`](https://github.com/GitoxideLabs/gitoxide/commit/631f07ad0c1cb93d9da42cf2c8499584fe91880a))
## 0.19.0 (2025-04-25) diff --git a/gix-glob/CHANGELOG.md b/gix-glob/CHANGELOG.md index f2eebbb9590..5457612aab0 100644 --- a/gix-glob/CHANGELOG.md +++ b/gix-glob/CHANGELOG.md @@ -5,13 +5,38 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## Unreleased + +A maintenance release without user-facing changes. + +### Commit Statistics + + + + - 3 commits contributed to the release over the course of 20 calendar days. + - 20 days passed between releases. + - 0 commits were understood as [conventional](https://www.conventionalcommits.org). + - 0 issues like '(#ID)' were seen in commit messages + +### Commit Details + + + +
view details + + * **Uncategorized** + - Merge pull request #2009 from GitoxideLabs/release-gix-index ([`c3f06ae`](https://github.com/GitoxideLabs/gitoxide/commit/c3f06ae424ab4e1918a364cabe8276297465a73a)) + - Release gix-path v0.10.18, gix-date v0.10.2, gix-traverse v0.46.2, gix-index v0.40.1 ([`d2b4c44`](https://github.com/GitoxideLabs/gitoxide/commit/d2b4c44fcb2bf43e80d67532262631a5086f08de)) + - Merge pull request #1971 from GitoxideLabs/new-release ([`8d4c4d1`](https://github.com/GitoxideLabs/gitoxide/commit/8d4c4d1e09f84c962c29d98a686c64228196ac13)) +
+ ## 0.20.0 (2025-04-26) ### Commit Statistics - - 1 commit contributed to the release. + - 3 commits contributed to the release. - 0 commits were understood as [conventional](https://www.conventionalcommits.org). - 0 issues like '(#ID)' were seen in commit messages @@ -22,7 +47,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
view details * **Uncategorized** + - Release gix-date v0.10.1, gix-utils v0.3.0, gix-actor v0.35.1, gix-validate v0.10.0, gix-path v0.10.17, gix-features v0.42.1, gix-hash v0.18.0, gix-hashtable v0.8.1, gix-object v0.49.1, gix-glob v0.20.0, gix-quote v0.6.0, gix-attributes v0.26.0, gix-command v0.6.0, gix-packetline-blocking v0.19.0, gix-filter v0.19.1, gix-fs v0.15.0, gix-commitgraph v0.28.0, gix-revwalk v0.20.1, gix-traverse v0.46.1, gix-worktree-stream v0.21.1, gix-archive v0.21.1, gix-tempfile v17.1.0, gix-lock v17.1.0, gix-index v0.40.0, gix-config-value v0.15.0, gix-pathspec v0.11.0, gix-ignore v0.15.0, gix-worktree v0.41.0, gix-diff v0.52.1, gix-blame v0.2.1, gix-ref v0.52.1, gix-sec v0.11.0, gix-config v0.45.1, gix-prompt v0.11.0, gix-url v0.31.0, gix-credentials v0.29.0, gix-discover v0.40.1, gix-dir v0.14.1, gix-mailmap v0.27.1, gix-revision v0.34.1, gix-merge v0.5.1, gix-negotiate v0.20.1, gix-pack v0.59.1, gix-odb v0.69.1, gix-refspec v0.30.1, gix-shallow v0.4.0, gix-packetline v0.19.0, gix-transport v0.47.0, gix-protocol v0.50.1, gix-status v0.19.1, gix-submodule v0.19.1, gix-worktree-state v0.19.0, gix v0.72.1, gix-fsck v0.11.1, gitoxide-core v0.47.1, gitoxide v0.44.0 ([`e104545`](https://github.com/GitoxideLabs/gitoxide/commit/e104545b78951ca882481d4a58f4425a8bc81c87)) - Bump all prior pratch levels to majors ([`5f7f805`](https://github.com/GitoxideLabs/gitoxide/commit/5f7f80570e1a5522e76ea58cccbb957249a0dffe)) + - Merge pull request #1969 from GitoxideLabs/new-release ([`631f07a`](https://github.com/GitoxideLabs/gitoxide/commit/631f07ad0c1cb93d9da42cf2c8499584fe91880a))
## 0.19.1 (2025-04-25) diff --git a/gix-worktree-stream/CHANGELOG.md b/gix-worktree-stream/CHANGELOG.md index 163b2191d1a..260bcd4e8e2 100644 --- a/gix-worktree-stream/CHANGELOG.md +++ b/gix-worktree-stream/CHANGELOG.md @@ -5,13 +5,38 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## Unreleased + +A maintenance release without user-facing changes. + +### Commit Statistics + + + + - 3 commits contributed to the release over the course of 20 calendar days. + - 20 days passed between releases. + - 0 commits were understood as [conventional](https://www.conventionalcommits.org). + - 0 issues like '(#ID)' were seen in commit messages + +### Commit Details + + + +
view details + + * **Uncategorized** + - Merge pull request #2009 from GitoxideLabs/release-gix-index ([`c3f06ae`](https://github.com/GitoxideLabs/gitoxide/commit/c3f06ae424ab4e1918a364cabe8276297465a73a)) + - Release gix-path v0.10.18, gix-date v0.10.2, gix-traverse v0.46.2, gix-index v0.40.1 ([`d2b4c44`](https://github.com/GitoxideLabs/gitoxide/commit/d2b4c44fcb2bf43e80d67532262631a5086f08de)) + - Merge pull request #1971 from GitoxideLabs/new-release ([`8d4c4d1`](https://github.com/GitoxideLabs/gitoxide/commit/8d4c4d1e09f84c962c29d98a686c64228196ac13)) +
+ ## 0.21.1 (2025-04-26) ### Commit Statistics - - 1 commit contributed to the release. + - 3 commits contributed to the release. - 0 commits were understood as [conventional](https://www.conventionalcommits.org). - 0 issues like '(#ID)' were seen in commit messages @@ -22,7 +47,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
view details * **Uncategorized** + - Release gix-date v0.10.1, gix-utils v0.3.0, gix-actor v0.35.1, gix-validate v0.10.0, gix-path v0.10.17, gix-features v0.42.1, gix-hash v0.18.0, gix-hashtable v0.8.1, gix-object v0.49.1, gix-glob v0.20.0, gix-quote v0.6.0, gix-attributes v0.26.0, gix-command v0.6.0, gix-packetline-blocking v0.19.0, gix-filter v0.19.1, gix-fs v0.15.0, gix-commitgraph v0.28.0, gix-revwalk v0.20.1, gix-traverse v0.46.1, gix-worktree-stream v0.21.1, gix-archive v0.21.1, gix-tempfile v17.1.0, gix-lock v17.1.0, gix-index v0.40.0, gix-config-value v0.15.0, gix-pathspec v0.11.0, gix-ignore v0.15.0, gix-worktree v0.41.0, gix-diff v0.52.1, gix-blame v0.2.1, gix-ref v0.52.1, gix-sec v0.11.0, gix-config v0.45.1, gix-prompt v0.11.0, gix-url v0.31.0, gix-credentials v0.29.0, gix-discover v0.40.1, gix-dir v0.14.1, gix-mailmap v0.27.1, gix-revision v0.34.1, gix-merge v0.5.1, gix-negotiate v0.20.1, gix-pack v0.59.1, gix-odb v0.69.1, gix-refspec v0.30.1, gix-shallow v0.4.0, gix-packetline v0.19.0, gix-transport v0.47.0, gix-protocol v0.50.1, gix-status v0.19.1, gix-submodule v0.19.1, gix-worktree-state v0.19.0, gix v0.72.1, gix-fsck v0.11.1, gitoxide-core v0.47.1, gitoxide v0.44.0 ([`e104545`](https://github.com/GitoxideLabs/gitoxide/commit/e104545b78951ca882481d4a58f4425a8bc81c87)) - Bump all prior pratch levels to majors ([`5f7f805`](https://github.com/GitoxideLabs/gitoxide/commit/5f7f80570e1a5522e76ea58cccbb957249a0dffe)) + - Merge pull request #1969 from GitoxideLabs/new-release ([`631f07a`](https://github.com/GitoxideLabs/gitoxide/commit/631f07ad0c1cb93d9da42cf2c8499584fe91880a))
## 0.21.0 (2025-04-25) From f0ed2cc0046f866e67944bff9aef0579c12d5852 Mon Sep 17 00:00:00 2001 From: Sebastian Thiel Date: Fri, 16 May 2025 10:37:38 +0200 Subject: [PATCH 062/166] Release gix-glob v0.20.1, gix-attributes v0.26.1, gix-command v0.6.1, gix-filter v0.19.2, gix-worktree-stream v0.21.2, gix-archive v0.21.2 --- Cargo.lock | 12 ++++++------ gitoxide-core/Cargo.toml | 2 +- gix-archive/CHANGELOG.md | 5 +++-- gix-archive/Cargo.toml | 4 ++-- gix-attributes/CHANGELOG.md | 5 +++-- gix-attributes/Cargo.toml | 4 ++-- gix-command/CHANGELOG.md | 5 +++-- gix-command/Cargo.toml | 2 +- gix-config/Cargo.toml | 2 +- gix-credentials/Cargo.toml | 2 +- gix-diff/Cargo.toml | 6 +++--- gix-filter/CHANGELOG.md | 5 +++-- gix-filter/Cargo.toml | 6 +++--- gix-glob/CHANGELOG.md | 5 +++-- gix-glob/Cargo.toml | 2 +- gix-ignore/Cargo.toml | 2 +- gix-merge/Cargo.toml | 4 ++-- gix-pathspec/Cargo.toml | 4 ++-- gix-prompt/Cargo.toml | 2 +- gix-status/Cargo.toml | 2 +- gix-transport/Cargo.toml | 2 +- gix-worktree-state/Cargo.toml | 4 ++-- gix-worktree-stream/CHANGELOG.md | 5 +++-- gix-worktree-stream/Cargo.toml | 6 +++--- gix-worktree/Cargo.toml | 4 ++-- gix/Cargo.toml | 12 ++++++------ 26 files changed, 60 insertions(+), 54 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 68d13e175c3..a154c740c80 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1460,7 +1460,7 @@ dependencies = [ [[package]] name = "gix-archive" -version = "0.21.1" +version = "0.21.2" dependencies = [ "bstr", "document-features", @@ -1483,7 +1483,7 @@ dependencies = [ [[package]] name = "gix-attributes" -version = "0.26.0" +version = "0.26.1" dependencies = [ "bstr", "document-features", @@ -1541,7 +1541,7 @@ dependencies = [ [[package]] name = "gix-command" -version = "0.6.0" +version = "0.6.1" dependencies = [ "bstr", "gix-path", @@ -1766,7 +1766,7 @@ version = "0.0.0" [[package]] name = "gix-filter" -version = "0.19.1" +version = "0.19.2" dependencies = [ "bstr", "encoding_rs", @@ -1815,7 +1815,7 @@ dependencies = [ [[package]] name = "gix-glob" -version = "0.20.0" +version = "0.20.1" dependencies = [ "bitflags 2.9.0", "bstr", @@ -2605,7 +2605,7 @@ dependencies = [ [[package]] name = "gix-worktree-stream" -version = "0.21.1" +version = "0.21.2" dependencies = [ "gix-attributes", "gix-features", diff --git a/gitoxide-core/Cargo.toml b/gitoxide-core/Cargo.toml index f5c0ae1152f..c210488f6b0 100644 --- a/gitoxide-core/Cargo.toml +++ b/gitoxide-core/Cargo.toml @@ -52,7 +52,7 @@ serde = ["gix/serde", "dep:serde_json", "dep:serde", "bytesize/serde"] gix = { version = "^0.72.1", path = "../gix", default-features = false, features = ["merge", "blob-diff", "blame", "revision", "mailmap", "excludes", "attributes", "worktree-mutation", "credentials", "interrupt", "status", "dirwalk"] } gix-pack-for-configuration-only = { package = "gix-pack", version = "^0.59.1", path = "../gix-pack", default-features = false, features = ["pack-cache-lru-dynamic", "pack-cache-lru-static", "generate", "streaming-input"] } gix-transport-configuration-only = { package = "gix-transport", version = "^0.47.0", path = "../gix-transport", default-features = false } -gix-archive-for-configuration-only = { package = "gix-archive", version = "^0.21.1", path = "../gix-archive", optional = true, features = ["tar", "tar_gz"] } +gix-archive-for-configuration-only = { package = "gix-archive", version = "^0.21.2", path = "../gix-archive", optional = true, features = ["tar", "tar_gz"] } gix-status = { version = "^0.19.1", path = "../gix-status" } gix-fsck = { version = "^0.11.1", path = "../gix-fsck" } serde = { version = "1.0.114", optional = true, default-features = false, features = ["derive"] } diff --git a/gix-archive/CHANGELOG.md b/gix-archive/CHANGELOG.md index 639df12f12b..9ff90248f04 100644 --- a/gix-archive/CHANGELOG.md +++ b/gix-archive/CHANGELOG.md @@ -5,7 +5,7 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## Unreleased +## 0.21.2 (2025-05-16) Update the `zip` dependency to the unyanked version 3.0. @@ -13,7 +13,7 @@ Update the `zip` dependency to the unyanked version 3.0. - - 6 commits contributed to the release over the course of 20 calendar days. + - 7 commits contributed to the release over the course of 20 calendar days. - 20 days passed between releases. - 0 commits were understood as [conventional](https://www.conventionalcommits.org). - 2 unique issues were worked on: [#1984](https://github.com/GitoxideLabs/gitoxide/issues/1984), [#2013](https://github.com/GitoxideLabs/gitoxide/issues/2013) @@ -29,6 +29,7 @@ Update the `zip` dependency to the unyanked version 3.0. * **[#2013](https://github.com/GitoxideLabs/gitoxide/issues/2013)** - Avoid yanked `zip` dependency ([`8692657`](https://github.com/GitoxideLabs/gitoxide/commit/8692657ec7c7ab765fcf1aeb9f0e1c55384e39d3)) * **Uncategorized** + - Update changelogs prior to release ([`31b86ee`](https://github.com/GitoxideLabs/gitoxide/commit/31b86ee6774ad6762f941aa0e8377e709bd41f5e)) - Merge pull request #2009 from GitoxideLabs/release-gix-index ([`c3f06ae`](https://github.com/GitoxideLabs/gitoxide/commit/c3f06ae424ab4e1918a364cabe8276297465a73a)) - Release gix-path v0.10.18, gix-date v0.10.2, gix-traverse v0.46.2, gix-index v0.40.1 ([`d2b4c44`](https://github.com/GitoxideLabs/gitoxide/commit/d2b4c44fcb2bf43e80d67532262631a5086f08de)) - Merge pull request #1984 from GitoxideLabs/fuzz ([`f965540`](https://github.com/GitoxideLabs/gitoxide/commit/f965540c162ed3e23bd0d7ad9083093033647e51)) diff --git a/gix-archive/Cargo.toml b/gix-archive/Cargo.toml index 01b29a072ed..3ba25cf8069 100644 --- a/gix-archive/Cargo.toml +++ b/gix-archive/Cargo.toml @@ -2,7 +2,7 @@ lints.workspace = true [package] name = "gix-archive" -version = "0.21.1" +version = "0.21.2" repository = "https://github.com/GitoxideLabs/gitoxide" license = "MIT OR Apache-2.0" description = "archive generation from of a worktree stream" @@ -28,7 +28,7 @@ zip = ["dep:flate2", "dep:zip"] [dependencies] -gix-worktree-stream = { version = "^0.21.1", path = "../gix-worktree-stream" } +gix-worktree-stream = { version = "^0.21.2", path = "../gix-worktree-stream" } gix-object = { version = "^0.49.1", path = "../gix-object" } gix-path = { version = "^0.10.18", path = "../gix-path", optional = true } gix-date = { version = "^0.10.2", path = "../gix-date" } diff --git a/gix-attributes/CHANGELOG.md b/gix-attributes/CHANGELOG.md index ad7deb708dc..37abf9e6997 100644 --- a/gix-attributes/CHANGELOG.md +++ b/gix-attributes/CHANGELOG.md @@ -5,7 +5,7 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## Unreleased +## 0.26.1 (2025-05-16) A maintenance release without user-facing changes. @@ -13,7 +13,7 @@ A maintenance release without user-facing changes. - - 3 commits contributed to the release over the course of 20 calendar days. + - 4 commits contributed to the release over the course of 20 calendar days. - 20 days passed between releases. - 0 commits were understood as [conventional](https://www.conventionalcommits.org). - 0 issues like '(#ID)' were seen in commit messages @@ -25,6 +25,7 @@ A maintenance release without user-facing changes.
view details * **Uncategorized** + - Update changelogs prior to release ([`31b86ee`](https://github.com/GitoxideLabs/gitoxide/commit/31b86ee6774ad6762f941aa0e8377e709bd41f5e)) - Merge pull request #2009 from GitoxideLabs/release-gix-index ([`c3f06ae`](https://github.com/GitoxideLabs/gitoxide/commit/c3f06ae424ab4e1918a364cabe8276297465a73a)) - Release gix-path v0.10.18, gix-date v0.10.2, gix-traverse v0.46.2, gix-index v0.40.1 ([`d2b4c44`](https://github.com/GitoxideLabs/gitoxide/commit/d2b4c44fcb2bf43e80d67532262631a5086f08de)) - Merge pull request #1971 from GitoxideLabs/new-release ([`8d4c4d1`](https://github.com/GitoxideLabs/gitoxide/commit/8d4c4d1e09f84c962c29d98a686c64228196ac13)) diff --git a/gix-attributes/Cargo.toml b/gix-attributes/Cargo.toml index 506ad97e738..978b9a793e6 100644 --- a/gix-attributes/Cargo.toml +++ b/gix-attributes/Cargo.toml @@ -2,7 +2,7 @@ lints.workspace = true [package] name = "gix-attributes" -version = "0.26.0" +version = "0.26.1" repository = "https://github.com/GitoxideLabs/gitoxide" license = "MIT OR Apache-2.0" description = "A crate of the gitoxide project dealing .gitattributes files" @@ -21,7 +21,7 @@ serde = ["dep:serde", "bstr/serde", "gix-glob/serde", "kstring/serde"] [dependencies] gix-path = { version = "^0.10.18", path = "../gix-path" } gix-quote = { version = "^0.6.0", path = "../gix-quote" } -gix-glob = { version = "^0.20.0", path = "../gix-glob" } +gix-glob = { version = "^0.20.1", path = "../gix-glob" } gix-trace = { version = "^0.1.12", path = "../gix-trace" } bstr = { version = "1.12.0", default-features = false, features = ["std", "unicode"] } diff --git a/gix-command/CHANGELOG.md b/gix-command/CHANGELOG.md index 3e728f8a113..cc1e369e5a5 100644 --- a/gix-command/CHANGELOG.md +++ b/gix-command/CHANGELOG.md @@ -5,7 +5,7 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## Unreleased +## 0.6.1 (2025-05-16) A maintenance release without user-facing changes. @@ -13,7 +13,7 @@ A maintenance release without user-facing changes. - - 3 commits contributed to the release over the course of 20 calendar days. + - 4 commits contributed to the release over the course of 20 calendar days. - 20 days passed between releases. - 0 commits were understood as [conventional](https://www.conventionalcommits.org). - 0 issues like '(#ID)' were seen in commit messages @@ -25,6 +25,7 @@ A maintenance release without user-facing changes.
view details * **Uncategorized** + - Update changelogs prior to release ([`31b86ee`](https://github.com/GitoxideLabs/gitoxide/commit/31b86ee6774ad6762f941aa0e8377e709bd41f5e)) - Merge pull request #2009 from GitoxideLabs/release-gix-index ([`c3f06ae`](https://github.com/GitoxideLabs/gitoxide/commit/c3f06ae424ab4e1918a364cabe8276297465a73a)) - Release gix-path v0.10.18, gix-date v0.10.2, gix-traverse v0.46.2, gix-index v0.40.1 ([`d2b4c44`](https://github.com/GitoxideLabs/gitoxide/commit/d2b4c44fcb2bf43e80d67532262631a5086f08de)) - Merge pull request #1971 from GitoxideLabs/new-release ([`8d4c4d1`](https://github.com/GitoxideLabs/gitoxide/commit/8d4c4d1e09f84c962c29d98a686c64228196ac13)) diff --git a/gix-command/Cargo.toml b/gix-command/Cargo.toml index 40c7c3398e0..016cf31ca25 100644 --- a/gix-command/Cargo.toml +++ b/gix-command/Cargo.toml @@ -2,7 +2,7 @@ lints.workspace = true [package] name = "gix-command" -version = "0.6.0" +version = "0.6.1" repository = "https://github.com/GitoxideLabs/gitoxide" license = "MIT OR Apache-2.0" description = "A crate of the gitoxide project handling internal git command execution" diff --git a/gix-config/Cargo.toml b/gix-config/Cargo.toml index 48215b20328..64161aabfe6 100644 --- a/gix-config/Cargo.toml +++ b/gix-config/Cargo.toml @@ -24,7 +24,7 @@ gix-config-value = { version = "^0.15.0", path = "../gix-config-value" } gix-path = { version = "^0.10.18", path = "../gix-path" } gix-sec = { version = "^0.11.0", path = "../gix-sec" } gix-ref = { version = "^0.52.1", path = "../gix-ref" } -gix-glob = { version = "^0.20.0", path = "../gix-glob" } +gix-glob = { version = "^0.20.1", path = "../gix-glob" } winnow = { version = "0.7.7", features = ["simd"] } memchr = "2" diff --git a/gix-credentials/Cargo.toml b/gix-credentials/Cargo.toml index 2cd61458788..453addbfad0 100644 --- a/gix-credentials/Cargo.toml +++ b/gix-credentials/Cargo.toml @@ -22,7 +22,7 @@ serde = ["dep:serde", "bstr/serde", "gix-sec/serde"] gix-sec = { version = "^0.11.0", path = "../gix-sec" } gix-url = { version = "^0.31.0", path = "../gix-url" } gix-path = { version = "^0.10.18", path = "../gix-path" } -gix-command = { version = "^0.6.0", path = "../gix-command" } +gix-command = { version = "^0.6.1", path = "../gix-command" } gix-config-value = { version = "^0.15.0", path = "../gix-config-value" } gix-prompt = { version = "^0.11.0", path = "../gix-prompt" } gix-date = { version = "^0.10.1", path = "../gix-date" } diff --git a/gix-diff/Cargo.toml b/gix-diff/Cargo.toml index 2d68984db2b..c3f0cd92078 100644 --- a/gix-diff/Cargo.toml +++ b/gix-diff/Cargo.toml @@ -29,12 +29,12 @@ doctest = false [dependencies] gix-index = { version = "^0.40.1", path = "../gix-index", optional = true } gix-pathspec = { version = "^0.11.0", path = "../gix-pathspec", optional = true } -gix-attributes = { version = "^0.26.0", path = "../gix-attributes", optional = true } +gix-attributes = { version = "^0.26.1", path = "../gix-attributes", optional = true } gix-hash = { version = "^0.18.0", path = "../gix-hash" } gix-object = { version = "^0.49.1", path = "../gix-object" } -gix-filter = { version = "^0.19.1", path = "../gix-filter", optional = true } +gix-filter = { version = "^0.19.2", path = "../gix-filter", optional = true } gix-worktree = { version = "^0.41.0", path = "../gix-worktree", default-features = false, features = ["attributes"], optional = true } -gix-command = { version = "^0.6.0", path = "../gix-command", optional = true } +gix-command = { version = "^0.6.1", path = "../gix-command", optional = true } gix-path = { version = "^0.10.18", path = "../gix-path", optional = true } gix-fs = { version = "^0.15.0", path = "../gix-fs", optional = true } gix-tempfile = { version = "^17.1.0", path = "../gix-tempfile", optional = true } diff --git a/gix-filter/CHANGELOG.md b/gix-filter/CHANGELOG.md index 6b9f56494bf..6de82166739 100644 --- a/gix-filter/CHANGELOG.md +++ b/gix-filter/CHANGELOG.md @@ -5,7 +5,7 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## Unreleased +## 0.19.2 (2025-05-16) A maintenance release without user-facing changes. @@ -13,7 +13,7 @@ A maintenance release without user-facing changes. - - 3 commits contributed to the release over the course of 20 calendar days. + - 4 commits contributed to the release over the course of 20 calendar days. - 20 days passed between releases. - 0 commits were understood as [conventional](https://www.conventionalcommits.org). - 0 issues like '(#ID)' were seen in commit messages @@ -25,6 +25,7 @@ A maintenance release without user-facing changes.
view details * **Uncategorized** + - Update changelogs prior to release ([`31b86ee`](https://github.com/GitoxideLabs/gitoxide/commit/31b86ee6774ad6762f941aa0e8377e709bd41f5e)) - Merge pull request #2009 from GitoxideLabs/release-gix-index ([`c3f06ae`](https://github.com/GitoxideLabs/gitoxide/commit/c3f06ae424ab4e1918a364cabe8276297465a73a)) - Release gix-path v0.10.18, gix-date v0.10.2, gix-traverse v0.46.2, gix-index v0.40.1 ([`d2b4c44`](https://github.com/GitoxideLabs/gitoxide/commit/d2b4c44fcb2bf43e80d67532262631a5086f08de)) - Merge pull request #1971 from GitoxideLabs/new-release ([`8d4c4d1`](https://github.com/GitoxideLabs/gitoxide/commit/8d4c4d1e09f84c962c29d98a686c64228196ac13)) diff --git a/gix-filter/Cargo.toml b/gix-filter/Cargo.toml index 6bc9561da0c..d21e0a6305e 100644 --- a/gix-filter/Cargo.toml +++ b/gix-filter/Cargo.toml @@ -2,7 +2,7 @@ lints.workspace = true [package] name = "gix-filter" -version = "0.19.1" +version = "0.19.2" repository = "https://github.com/GitoxideLabs/gitoxide" license = "MIT OR Apache-2.0" description = "A crate of the gitoxide project implementing git filters" @@ -18,12 +18,12 @@ doctest = false gix-hash = { version = "^0.18.0", path = "../gix-hash" } gix-trace = { version = "^0.1.12", path = "../gix-trace" } gix-object = { version = "^0.49.1", path = "../gix-object" } -gix-command = { version = "^0.6.0", path = "../gix-command" } +gix-command = { version = "^0.6.1", path = "../gix-command" } gix-quote = { version = "^0.6.0", path = "../gix-quote" } gix-utils = { version = "^0.3.0", path = "../gix-utils" } gix-path = { version = "^0.10.18", path = "../gix-path" } gix-packetline-blocking = { version = "^0.19.0", path = "../gix-packetline-blocking" } -gix-attributes = { version = "^0.26.0", path = "../gix-attributes" } +gix-attributes = { version = "^0.26.1", path = "../gix-attributes" } encoding_rs = "0.8.32" bstr = { version = "1.12.0", default-features = false, features = ["std"] } diff --git a/gix-glob/CHANGELOG.md b/gix-glob/CHANGELOG.md index 5457612aab0..00afacb802f 100644 --- a/gix-glob/CHANGELOG.md +++ b/gix-glob/CHANGELOG.md @@ -5,7 +5,7 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## Unreleased +## 0.20.1 (2025-05-16) A maintenance release without user-facing changes. @@ -13,7 +13,7 @@ A maintenance release without user-facing changes. - - 3 commits contributed to the release over the course of 20 calendar days. + - 4 commits contributed to the release over the course of 20 calendar days. - 20 days passed between releases. - 0 commits were understood as [conventional](https://www.conventionalcommits.org). - 0 issues like '(#ID)' were seen in commit messages @@ -25,6 +25,7 @@ A maintenance release without user-facing changes.
view details * **Uncategorized** + - Update changelogs prior to release ([`31b86ee`](https://github.com/GitoxideLabs/gitoxide/commit/31b86ee6774ad6762f941aa0e8377e709bd41f5e)) - Merge pull request #2009 from GitoxideLabs/release-gix-index ([`c3f06ae`](https://github.com/GitoxideLabs/gitoxide/commit/c3f06ae424ab4e1918a364cabe8276297465a73a)) - Release gix-path v0.10.18, gix-date v0.10.2, gix-traverse v0.46.2, gix-index v0.40.1 ([`d2b4c44`](https://github.com/GitoxideLabs/gitoxide/commit/d2b4c44fcb2bf43e80d67532262631a5086f08de)) - Merge pull request #1971 from GitoxideLabs/new-release ([`8d4c4d1`](https://github.com/GitoxideLabs/gitoxide/commit/8d4c4d1e09f84c962c29d98a686c64228196ac13)) diff --git a/gix-glob/Cargo.toml b/gix-glob/Cargo.toml index ad1d8c02147..bd2972da231 100644 --- a/gix-glob/Cargo.toml +++ b/gix-glob/Cargo.toml @@ -2,7 +2,7 @@ lints.workspace = true [package] name = "gix-glob" -version = "0.20.0" +version = "0.20.1" repository = "https://github.com/GitoxideLabs/gitoxide" license = "MIT OR Apache-2.0" description = "A crate of the gitoxide project dealing with pattern matching" diff --git a/gix-ignore/Cargo.toml b/gix-ignore/Cargo.toml index 8021b01bee3..b3d445f6a46 100644 --- a/gix-ignore/Cargo.toml +++ b/gix-ignore/Cargo.toml @@ -19,7 +19,7 @@ doctest = false serde = ["dep:serde", "bstr/serde", "gix-glob/serde"] [dependencies] -gix-glob = { version = "^0.20.0", path = "../gix-glob" } +gix-glob = { version = "^0.20.1", path = "../gix-glob" } gix-path = { version = "^0.10.18", path = "../gix-path" } gix-trace = { version = "^0.1.12", path = "../gix-trace" } diff --git a/gix-merge/Cargo.toml b/gix-merge/Cargo.toml index 217397ef08d..23976b05169 100644 --- a/gix-merge/Cargo.toml +++ b/gix-merge/Cargo.toml @@ -21,9 +21,9 @@ serde = ["dep:serde", "gix-hash/serde", "gix-object/serde"] [dependencies] gix-hash = { version = "^0.18.0", path = "../gix-hash" } gix-object = { version = "^0.49.1", path = "../gix-object" } -gix-filter = { version = "^0.19.1", path = "../gix-filter" } +gix-filter = { version = "^0.19.2", path = "../gix-filter" } gix-worktree = { version = "^0.41.0", path = "../gix-worktree", default-features = false, features = ["attributes"] } -gix-command = { version = "^0.6.0", path = "../gix-command" } +gix-command = { version = "^0.6.1", path = "../gix-command" } gix-path = { version = "^0.10.18", path = "../gix-path" } gix-fs = { version = "^0.15.0", path = "../gix-fs" } gix-tempfile = { version = "^17.1.0", path = "../gix-tempfile" } diff --git a/gix-pathspec/Cargo.toml b/gix-pathspec/Cargo.toml index 04d536b20cc..4985ea67778 100644 --- a/gix-pathspec/Cargo.toml +++ b/gix-pathspec/Cargo.toml @@ -15,9 +15,9 @@ include = ["src/**/*", "LICENSE-*", "README.md"] doctest = false [dependencies] -gix-glob = { version = "^0.20.0", path = "../gix-glob" } +gix-glob = { version = "^0.20.1", path = "../gix-glob" } gix-path = { version = "^0.10.18", path = "../gix-path" } -gix-attributes = { version = "^0.26.0", path = "../gix-attributes" } +gix-attributes = { version = "^0.26.1", path = "../gix-attributes" } gix-config-value = { version = "^0.15.0", path = "../gix-config-value" } bstr = { version = "1.12.0", default-features = false, features = ["std"] } diff --git a/gix-prompt/Cargo.toml b/gix-prompt/Cargo.toml index 8abda1c8014..e621f563d36 100644 --- a/gix-prompt/Cargo.toml +++ b/gix-prompt/Cargo.toml @@ -15,7 +15,7 @@ rust-version = "1.70" doctest = false [dependencies] -gix-command = { version = "^0.6.0", path = "../gix-command" } +gix-command = { version = "^0.6.1", path = "../gix-command" } gix-config-value = { version = "^0.15.0", path = "../gix-config-value" } thiserror = "2.0.0" diff --git a/gix-status/Cargo.toml b/gix-status/Cargo.toml index e49509f5050..10fc9dea619 100644 --- a/gix-status/Cargo.toml +++ b/gix-status/Cargo.toml @@ -26,7 +26,7 @@ gix-hash = { version = "^0.18.0", path = "../gix-hash" } gix-object = { version = "^0.49.1", path = "../gix-object" } gix-path = { version = "^0.10.18", path = "../gix-path" } gix-features = { version = "^0.42.1", path = "../gix-features", features = ["progress"] } -gix-filter = { version = "^0.19.1", path = "../gix-filter" } +gix-filter = { version = "^0.19.2", path = "../gix-filter" } gix-worktree = { version = "^0.41.0", path = "../gix-worktree", default-features = false, features = ["attributes"] } gix-pathspec = { version = "^0.11.0", path = "../gix-pathspec" } diff --git a/gix-transport/Cargo.toml b/gix-transport/Cargo.toml index 36e94ed9196..19967c66f12 100644 --- a/gix-transport/Cargo.toml +++ b/gix-transport/Cargo.toml @@ -81,7 +81,7 @@ path = "tests/async-transport.rs" required-features = ["async-client"] [dependencies] -gix-command = { version = "^0.6.0", path = "../gix-command" } +gix-command = { version = "^0.6.1", path = "../gix-command" } gix-features = { version = "^0.42.1", path = "../gix-features" } gix-url = { version = "^0.31.0", path = "../gix-url" } gix-sec = { version = "^0.11.0", path = "../gix-sec" } diff --git a/gix-worktree-state/Cargo.toml b/gix-worktree-state/Cargo.toml index 53c5fb37564..90497ff6f9c 100644 --- a/gix-worktree-state/Cargo.toml +++ b/gix-worktree-state/Cargo.toml @@ -21,10 +21,10 @@ gix-index = { version = "^0.40.1", path = "../gix-index" } gix-fs = { version = "^0.15.0", path = "../gix-fs" } gix-hash = { version = "^0.18.0", path = "../gix-hash" } gix-object = { version = "^0.49.1", path = "../gix-object" } -gix-glob = { version = "^0.20.0", path = "../gix-glob" } +gix-glob = { version = "^0.20.1", path = "../gix-glob" } gix-path = { version = "^0.10.18", path = "../gix-path" } gix-features = { version = "^0.42.1", path = "../gix-features" } -gix-filter = { version = "^0.19.1", path = "../gix-filter" } +gix-filter = { version = "^0.19.2", path = "../gix-filter" } io-close = "0.3.7" thiserror = "2.0.0" diff --git a/gix-worktree-stream/CHANGELOG.md b/gix-worktree-stream/CHANGELOG.md index 260bcd4e8e2..9fbb3f99f18 100644 --- a/gix-worktree-stream/CHANGELOG.md +++ b/gix-worktree-stream/CHANGELOG.md @@ -5,7 +5,7 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## Unreleased +## 0.21.2 (2025-05-16) A maintenance release without user-facing changes. @@ -13,7 +13,7 @@ A maintenance release without user-facing changes. - - 3 commits contributed to the release over the course of 20 calendar days. + - 4 commits contributed to the release over the course of 20 calendar days. - 20 days passed between releases. - 0 commits were understood as [conventional](https://www.conventionalcommits.org). - 0 issues like '(#ID)' were seen in commit messages @@ -25,6 +25,7 @@ A maintenance release without user-facing changes.
view details * **Uncategorized** + - Update changelogs prior to release ([`31b86ee`](https://github.com/GitoxideLabs/gitoxide/commit/31b86ee6774ad6762f941aa0e8377e709bd41f5e)) - Merge pull request #2009 from GitoxideLabs/release-gix-index ([`c3f06ae`](https://github.com/GitoxideLabs/gitoxide/commit/c3f06ae424ab4e1918a364cabe8276297465a73a)) - Release gix-path v0.10.18, gix-date v0.10.2, gix-traverse v0.46.2, gix-index v0.40.1 ([`d2b4c44`](https://github.com/GitoxideLabs/gitoxide/commit/d2b4c44fcb2bf43e80d67532262631a5086f08de)) - Merge pull request #1971 from GitoxideLabs/new-release ([`8d4c4d1`](https://github.com/GitoxideLabs/gitoxide/commit/8d4c4d1e09f84c962c29d98a686c64228196ac13)) diff --git a/gix-worktree-stream/Cargo.toml b/gix-worktree-stream/Cargo.toml index a95ad7306ee..67864439078 100644 --- a/gix-worktree-stream/Cargo.toml +++ b/gix-worktree-stream/Cargo.toml @@ -2,7 +2,7 @@ lints.workspace = true [package] name = "gix-worktree-stream" -version = "0.21.1" +version = "0.21.2" repository = "https://github.com/GitoxideLabs/gitoxide" license = "MIT OR Apache-2.0" description = "generate a byte-stream from a git-tree" @@ -18,8 +18,8 @@ doctest = false gix-features = { version = "^0.42.1", path = "../gix-features", features = ["progress", "io-pipe"] } gix-hash = { version = "^0.18.0", path = "../gix-hash" } gix-object = { version = "^0.49.1", path = "../gix-object" } -gix-attributes = { version = "^0.26.0", path = "../gix-attributes" } -gix-filter = { version = "^0.19.1", path = "../gix-filter" } +gix-attributes = { version = "^0.26.1", path = "../gix-attributes" } +gix-filter = { version = "^0.19.2", path = "../gix-filter" } gix-traverse = { version = "^0.46.2", path = "../gix-traverse" } gix-fs = { version = "^0.15.0", path = "../gix-fs" } gix-path = { version = "^0.10.18", path = "../gix-path" } diff --git a/gix-worktree/Cargo.toml b/gix-worktree/Cargo.toml index 287c8ca1568..2751fd1fd92 100644 --- a/gix-worktree/Cargo.toml +++ b/gix-worktree/Cargo.toml @@ -27,9 +27,9 @@ gix-index = { version = "^0.40.1", path = "../gix-index" } gix-fs = { version = "^0.15.0", path = "../gix-fs" } gix-hash = { version = "^0.18.0", path = "../gix-hash" } gix-object = { version = "^0.49.1", path = "../gix-object" } -gix-glob = { version = "^0.20.0", path = "../gix-glob" } +gix-glob = { version = "^0.20.1", path = "../gix-glob" } gix-path = { version = "^0.10.18", path = "../gix-path" } -gix-attributes = { version = "^0.26.0", path = "../gix-attributes", optional = true } +gix-attributes = { version = "^0.26.1", path = "../gix-attributes", optional = true } gix-validate = { version = "^0.10.0", path = "../gix-validate", optional = true } gix-ignore = { version = "^0.15.0", path = "../gix-ignore" } gix-features = { version = "^0.42.1", path = "../gix-features" } diff --git a/gix/Cargo.toml b/gix/Cargo.toml index 1394e97571f..10448739588 100644 --- a/gix/Cargo.toml +++ b/gix/Cargo.toml @@ -314,7 +314,7 @@ gix-validate = { version = "^0.10.0", path = "../gix-validate" } gix-sec = { version = "^0.11.0", path = "../gix-sec" } gix-date = { version = "^0.10.2", path = "../gix-date" } gix-refspec = { version = "^0.30.1", path = "../gix-refspec" } -gix-filter = { version = "^0.19.1", path = "../gix-filter", optional = true } +gix-filter = { version = "^0.19.2", path = "../gix-filter", optional = true } gix-dir = { version = "^0.14.1", path = "../gix-dir", optional = true } gix-config = { version = "^0.45.1", path = "../gix-config" } @@ -342,11 +342,11 @@ gix-features = { version = "^0.42.1", path = "../gix-features", features = [ ] } gix-trace = { version = "^0.1.12", path = "../gix-trace" } -gix-glob = { version = "^0.20.0", path = "../gix-glob" } +gix-glob = { version = "^0.20.1", path = "../gix-glob" } gix-credentials = { version = "^0.29.0", path = "../gix-credentials", optional = true } gix-prompt = { version = "^0.11.0", path = "../gix-prompt", optional = true } gix-index = { version = "^0.40.1", path = "../gix-index", optional = true } -gix-attributes = { version = "^0.26.0", path = "../gix-attributes", optional = true } +gix-attributes = { version = "^0.26.1", path = "../gix-attributes", optional = true } gix-ignore = { version = "^0.15.0", path = "../gix-ignore", optional = true } gix-worktree = { version = "^0.41.0", path = "../gix-worktree", optional = true, default-features = false } gix-worktree-state = { version = "^0.19.0", path = "../gix-worktree-state", optional = true } @@ -357,10 +357,10 @@ gix-submodule = { version = "^0.19.1", path = "../gix-submodule", optional = tru gix-status = { version = "^0.19.1", path = "../gix-status", optional = true, features = [ "worktree-rewrites", ] } -gix-command = { version = "^0.6.0", path = "../gix-command", optional = true } +gix-command = { version = "^0.6.1", path = "../gix-command", optional = true } -gix-worktree-stream = { version = "^0.21.1", path = "../gix-worktree-stream", optional = true } -gix-archive = { version = "^0.21.1", path = "../gix-archive", default-features = false, optional = true } +gix-worktree-stream = { version = "^0.21.2", path = "../gix-worktree-stream", optional = true } +gix-archive = { version = "^0.21.2", path = "../gix-archive", default-features = false, optional = true } gix-blame = { version = "^0.2.1", path = "../gix-blame", optional = true } # For communication with remotes From 732adb87c90283bd8f8fce6d633eacc25e10b353 Mon Sep 17 00:00:00 2001 From: Sebastian Thiel Date: Fri, 16 May 2025 05:12:25 +0200 Subject: [PATCH 063/166] update `imara-diff` to the latest version. --- gix-diff/Cargo.toml | 2 +- gix-merge/Cargo.toml | 2 +- gix-merge/fuzz/Cargo.toml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/gix-diff/Cargo.toml b/gix-diff/Cargo.toml index c3f0cd92078..e251aa5d33e 100644 --- a/gix-diff/Cargo.toml +++ b/gix-diff/Cargo.toml @@ -42,7 +42,7 @@ gix-trace = { version = "^0.1.12", path = "../gix-trace", optional = true } gix-traverse = { version = "^0.46.2", path = "../gix-traverse", optional = true } thiserror = "2.0.0" -imara-diff = { version = "0.1.7", optional = true } +imara-diff = { version = "0.1.8", optional = true } serde = { version = "1.0.114", optional = true, default-features = false, features = ["derive"] } getrandom = { version = "0.2.8", optional = true, default-features = false, features = ["js"] } bstr = { version = "1.12.0", default-features = false } diff --git a/gix-merge/Cargo.toml b/gix-merge/Cargo.toml index 23976b05169..2a0faaa6431 100644 --- a/gix-merge/Cargo.toml +++ b/gix-merge/Cargo.toml @@ -35,7 +35,7 @@ gix-diff = { version = "^0.52.1", path = "../gix-diff", default-features = false gix-index = { version = "^0.40.1", path = "../gix-index" } thiserror = "2.0.0" -imara-diff = { version = "0.1.7" } +imara-diff = { version = "0.1.8" } bstr = { version = "1.12.0", default-features = false } serde = { version = "1.0.114", optional = true, default-features = false, features = ["derive"] } diff --git a/gix-merge/fuzz/Cargo.toml b/gix-merge/fuzz/Cargo.toml index 881b91cb8fd..c39a2b91fa2 100644 --- a/gix-merge/fuzz/Cargo.toml +++ b/gix-merge/fuzz/Cargo.toml @@ -12,7 +12,7 @@ cargo-fuzz = true anyhow = "1.0.76" libfuzzer-sys = "0.4" arbitrary = { version = "1.3.2", features = ["derive"] } -imara-diff = { version = "0.1.7" } +imara-diff = { version = "0.1.8" } gix-merge = { path = ".." } # Prevent this from interfering with workspaces From c84296b98876539e1b21072f32c0339932215f42 Mon Sep 17 00:00:00 2001 From: blinxen Date: Fri, 16 May 2025 05:04:03 +0200 Subject: [PATCH 064/166] feat: Add `Sink` that implements git's diffing improvement heuristics --- gix-diff/src/blob/git_diff.rs | 400 ++++++++++++++++++++++++++++++++++ gix-diff/src/blob/mod.rs | 3 + 2 files changed, 403 insertions(+) create mode 100644 gix-diff/src/blob/git_diff.rs diff --git a/gix-diff/src/blob/git_diff.rs b/gix-diff/src/blob/git_diff.rs new file mode 100644 index 00000000000..b45fa2b65c7 --- /dev/null +++ b/gix-diff/src/blob/git_diff.rs @@ -0,0 +1,400 @@ +//! Facilities to produce git-formatted diffs. + +use std::cmp::Ordering; +use std::fmt::Display; +use std::ops::Range; + +use imara_diff::intern::{InternedInput, Interner, Token}; +use imara_diff::Sink; + +// Explanation for the following numbers can be found here: +// https://github.com/git/git/blob/324fbaab88126196bd42e7fa383ee94e165d61b5/xdiff/xdiffi.c#L535 +const MAX_INDENT: u8 = 200; +const MAX_BLANKS: i16 = 20; +const INDENT_WEIGHT: i16 = 60; +const INDENT_HEURISTIC_MAX_SLIDING: usize = 100; + +const START_OF_FILE_PENALTY: i16 = 1; +const END_OF_FILE_PENALTY: i16 = 21; +const TOTAL_BLANK_WEIGHT: i16 = -30; +const POST_BLANK_WEIGHT: i16 = 6; +const RELATIVE_INDENT_PENALTY: i16 = -4; +const RELATIVE_INDENT_WITH_BLANK_PENALTY: i16 = 10; +const RELATIVE_OUTDENT_PENALTY: i16 = 24; +const RELATIVE_OUTDENT_WITH_BLANK_PENALTY: i16 = 17; +const RELATIVE_DEDENT_PENALTY: i16 = 23; +const RELATIVE_DEDENT_WITH_BLANK_PENALTY: i16 = 17; + +/// An enum indicating the kind of change that occurred. +#[derive(PartialEq, Debug)] +pub enum ChangeKind { + /// Indicates that a change introduced new lines. + Added, + /// Indicates that a change removed lines before the starting line of the change. + RemovedAbove, + /// Indicates that a change removed lines after the ending line of the change. + RemovedBelow, + /// Indicates that the change modified lines. + Modified, +} + +#[derive(PartialEq)] +struct Score { + effective_indent: i16, + penalty: i16, +} + +impl PartialOrd for Score { + // A score is considered "Greater" if it is equal or less than 0 + fn partial_cmp(&self, other: &Self) -> Option { + let indent_penalty = match self.effective_indent.cmp(&other.effective_indent) { + Ordering::Greater => INDENT_WEIGHT, + Ordering::Less => -INDENT_WEIGHT, + Ordering::Equal => 0, + }; + + Some((indent_penalty + (self.penalty - other.penalty)).cmp(&0).reverse()) + } +} + +/// A [`ChangeGroup`] represents a block of changed lines. +#[derive(PartialEq, Debug)] +pub struct ChangeGroup { + /// Range indicating the lines of the previous block. + /// To actually see how the previous block looked like, you need to combine this range with + /// the [`InternedInput`]. + before: Range, + /// Range indicating the lines of the new block + /// To actually see how the current block looks like, you need to combine this range with + /// the [`InternedInput`]. + after: Range, + change_kind: ChangeKind, +} + +/// A [`Sink`] that creates a diff like git would. +pub struct GitDiff<'a, T> +where + T: Display, +{ + after: &'a [Token], + interner: &'a Interner, + changes: Vec, +} + +// Calculate the indentation of a single line +fn get_indent(s: String) -> Option { + let mut indent = 0; + + for char in s.chars() { + if !char.is_whitespace() { + return Some(indent); + } else if char == ' ' { + indent += 1; + } else if char == '\t' { + indent += 8 - indent % 8; + } + + if indent >= MAX_INDENT { + return Some(MAX_INDENT); + } + } + + None +} + +fn measure_and_score_change(lines: &[Token], split: usize, interner: &Interner, score: &mut Score) { + // Gather information about the surroundings of the change + let end_of_file = split >= lines.len(); + let mut indent: Option = if split >= lines.len() { + None + } else { + get_indent(interner[lines[split]].to_string()) + }; + let mut pre_blank = 0; + let mut pre_indent: Option = None; + let mut post_blank = 0; + let mut post_indent: Option = None; + + for line in (0..=split.saturating_sub(1)).rev() { + pre_indent = get_indent(interner[lines[line]].to_string()); + if pre_indent.is_none() { + pre_blank += 1; + if pre_blank == MAX_BLANKS { + pre_indent = Some(0); + break; + } + } + } + for line in split + 1..lines.len() { + post_indent = get_indent(interner[lines[line]].to_string()); + if post_indent.is_none() { + post_blank += 1; + if post_blank == MAX_BLANKS { + post_indent = Some(0); + break; + } + } + } + + // Calculate score of the currently applied split + post_blank = if indent.is_none() { 1 + post_blank } else { 0 }; + let total_blank = pre_blank + post_blank; + if indent.is_none() { + indent = post_indent; + } + let any_blanks = total_blank != 0; + + if pre_indent.is_none() && pre_blank == 0 { + score.penalty += START_OF_FILE_PENALTY; + } + + if end_of_file { + score.penalty += END_OF_FILE_PENALTY; + } + + score.penalty += TOTAL_BLANK_WEIGHT * total_blank; + score.penalty += POST_BLANK_WEIGHT * post_blank; + + score.effective_indent += if let Some(indent) = indent { indent as i16 } else { -1 }; + + if indent.is_none() || pre_indent.is_none() || indent == pre_indent { + } else if indent > pre_indent { + score.penalty += if any_blanks { + RELATIVE_INDENT_WITH_BLANK_PENALTY + } else { + RELATIVE_INDENT_PENALTY + }; + } else if post_indent.is_some() && post_indent > indent { + score.penalty += if any_blanks { + RELATIVE_OUTDENT_WITH_BLANK_PENALTY + } else { + RELATIVE_OUTDENT_PENALTY + }; + } else { + score.penalty += if any_blanks { + RELATIVE_DEDENT_WITH_BLANK_PENALTY + } else { + RELATIVE_DEDENT_PENALTY + }; + } +} + +impl<'a, T> GitDiff<'a, T> +where + T: Display, +{ + /// Create a new instance of [`GitDiff`] that can then be passed to [`imara_diff::diff`] + /// and generate a more human-readable diff. + pub fn new(input: &'a InternedInput) -> Self { + Self { + after: &input.after, + interner: &input.interner, + changes: Vec::new(), + } + } +} + +impl Sink for GitDiff<'_, T> +where + T: Display, +{ + type Out = Vec; + + fn process_change(&mut self, before: Range, after: Range) { + if before.is_empty() && !after.is_empty() { + self.changes.push(ChangeGroup { + before: before.start as usize..before.end as usize, + after: after.start as usize..after.end as usize, + change_kind: ChangeKind::Added, + }); + } else if after.is_empty() && !before.is_empty() { + if after.start == 0 { + self.changes.push(ChangeGroup { + before: before.start as usize..before.end as usize, + after: after.start as usize..after.end as usize, + change_kind: ChangeKind::RemovedAbove, + }); + } else { + self.changes.push(ChangeGroup { + before: before.start as usize..before.end as usize, + after: after.start as usize..after.end as usize, + change_kind: ChangeKind::RemovedBelow, + }); + } + } else { + self.changes.push(ChangeGroup { + before: before.start as usize..before.end as usize, + after: after.start as usize..after.end as usize, + change_kind: ChangeKind::Modified, + }); + } + } + + fn finish(mut self) -> Self::Out { + if self.changes.is_empty() { + return self.changes; + } + let mut shift: usize; + + for change in self.changes.iter_mut() { + // Skip one liner changes + if change.after.is_empty() { + continue; + } + + // Move this change up by one line if the line before the change and the last line in + // the change are equal + loop { + if change.after.start > 0 && self.after[change.after.start - 1] == self.after[change.after.end - 1] { + change.after.start -= 1; + change.after.end -= 1; + } else { + break; + } + } + + shift = change.after.end; + + // Move this change down by one line if the first line in the change the line after the + // change are equal + loop { + if change.after.end < self.after.len() && self.after[change.after.start] == self.after[change.after.end] + { + change.after.start += 1; + change.after.end += 1; + } else { + break; + } + } + + let mut best_shift: Option = None; + let mut best_score = Score { + effective_indent: 0, + penalty: 0, + }; + + if change.after.end.saturating_sub(change.after.len()) > shift { + shift = change.after.end - change.after.len(); + } + + if change.after.end.saturating_sub(INDENT_HEURISTIC_MAX_SLIDING) > shift { + shift = change.after.end - INDENT_HEURISTIC_MAX_SLIDING; + } + + while shift <= change.after.end { + let mut score = Score { + effective_indent: 0, + penalty: 0, + }; + + measure_and_score_change(self.after, shift, self.interner, &mut score); + measure_and_score_change(self.after, shift - change.after.len(), self.interner, &mut score); + + if best_shift.is_none() || score > best_score { + best_score = score; + best_shift = Some(shift); + } + shift += 1; + } + + if let Some(best_shift) = best_shift { + while change.after.end > best_shift { + loop { + if change.after.start > 0 + && self.after[change.after.start - 1] == self.after[change.after.end - 1] + { + change.after.start -= 1; + change.after.end -= 1; + } else { + break; + } + } + } + } + } + + self.changes + } +} + +#[test] +fn git_diff_test() { + let before = r#"struct SomeStruct { + field1: f64, + field2: f64, +} + +fn main() { + // Some comment + let c = SomeStruct { field1: 10.0, field2: 10.0 }; + + println!( + "Print field1 from SomeStruct {}", + get_field1(&c) + ); +} + +fn get_field1(c: &SomeStruct) -> f64 { + c.field1 +} +"#; + + let after = r#"/// This is a struct +struct SomeStruct { + field1: f64, + field2: f64, +} + +fn main() { + let c = SomeStruct { field1: 10.0, field2: 10.0 }; + + println!( + "Print field1 and field2 from SomeStruct {} {}", + get_field1(&c), get_field2(&c) + ); + println!("Print another line"); +} + +fn get_field1(c: &SomeStruct) -> f64 { + c.field1 +} + +fn get_field2(c: &SomeStruct) -> f64 { + c.field2 +} +"#; + use crate::blob::git_diff::ChangeKind; + + let input = InternedInput::new(before, after); + let diff = imara_diff::diff(imara_diff::Algorithm::Histogram, &input, GitDiff::new(&input)); + assert_eq!( + diff, + vec![ + ChangeGroup { + before: 0..0, + after: 0..1, + change_kind: ChangeKind::Added + }, + ChangeGroup { + before: 6..7, + after: 7..7, + change_kind: ChangeKind::RemovedBelow + }, + ChangeGroup { + before: 10..12, + after: 10..12, + change_kind: ChangeKind::Modified + }, + ChangeGroup { + before: 13..13, + after: 13..14, + change_kind: ChangeKind::Added + }, + ChangeGroup { + before: 17..17, + after: 19..23, + change_kind: ChangeKind::Added + } + ] + ); +} diff --git a/gix-diff/src/blob/mod.rs b/gix-diff/src/blob/mod.rs index 541e978d752..889f04c503c 100644 --- a/gix-diff/src/blob/mod.rs +++ b/gix-diff/src/blob/mod.rs @@ -14,6 +14,9 @@ pub mod platform; pub mod unified_diff; pub use unified_diff::_impl::UnifiedDiff; +pub mod git_diff; +pub use git_diff::*; + /// Information about the diff performed to detect similarity. #[derive(Debug, Default, Clone, Copy, PartialEq, PartialOrd)] pub struct DiffLineStats { From 5e699d26846740ee098e780bb2b861fcae2d31ca Mon Sep 17 00:00:00 2001 From: Sebastian Thiel Date: Fri, 16 May 2025 05:14:47 +0200 Subject: [PATCH 065/166] refactor adjust Git sink to fit into to conform to project convetions --- gix-diff/src/blob/git_diff.rs | 173 +++++++-------------------- gix-diff/src/blob/mod.rs | 2 +- gix-diff/tests/diff/blob/git_diff.rs | 87 ++++++++++++++ gix-diff/tests/diff/blob/mod.rs | 1 + 4 files changed, 134 insertions(+), 129 deletions(-) create mode 100644 gix-diff/tests/diff/blob/git_diff.rs diff --git a/gix-diff/src/blob/git_diff.rs b/gix-diff/src/blob/git_diff.rs index b45fa2b65c7..8ddeed5e039 100644 --- a/gix-diff/src/blob/git_diff.rs +++ b/gix-diff/src/blob/git_diff.rs @@ -1,9 +1,9 @@ //! Facilities to produce git-formatted diffs. use std::cmp::Ordering; -use std::fmt::Display; use std::ops::Range; +use crate::blob::GitDiff; use imara_diff::intern::{InternedInput, Interner, Token}; use imara_diff::Sink; @@ -25,6 +25,20 @@ const RELATIVE_OUTDENT_WITH_BLANK_PENALTY: i16 = 17; const RELATIVE_DEDENT_PENALTY: i16 = 23; const RELATIVE_DEDENT_WITH_BLANK_PENALTY: i16 = 17; +pub(super) mod types { + use crate::blob::git_diff::ChangeGroup; + + /// A [`Sink`](imara_diff::Sink) that creates a diff like git would. + pub struct GitDiff<'a, T> + where + T: std::fmt::Display, + { + pub(crate) after: &'a [imara_diff::intern::Token], + pub(crate) interner: &'a imara_diff::intern::Interner, + pub(crate) changes: Vec, + } +} + /// An enum indicating the kind of change that occurred. #[derive(PartialEq, Debug)] pub enum ChangeKind { @@ -63,22 +77,13 @@ pub struct ChangeGroup { /// Range indicating the lines of the previous block. /// To actually see how the previous block looked like, you need to combine this range with /// the [`InternedInput`]. - before: Range, + pub before: Range, /// Range indicating the lines of the new block /// To actually see how the current block looks like, you need to combine this range with /// the [`InternedInput`]. - after: Range, - change_kind: ChangeKind, -} - -/// A [`Sink`] that creates a diff like git would. -pub struct GitDiff<'a, T> -where - T: Display, -{ - after: &'a [Token], - interner: &'a Interner, - changes: Vec, + pub after: Range, + /// Further specify what kind of change is denoted by the ranges above. + pub change_kind: ChangeKind, } // Calculate the indentation of a single line @@ -102,7 +107,12 @@ fn get_indent(s: String) -> Option { None } -fn measure_and_score_change(lines: &[Token], split: usize, interner: &Interner, score: &mut Score) { +fn measure_and_score_change( + lines: &[Token], + split: usize, + interner: &Interner, + score: &mut Score, +) { // Gather information about the surroundings of the change let end_of_file = split >= lines.len(); let mut indent: Option = if split >= lines.len() { @@ -181,7 +191,7 @@ fn measure_and_score_change(lines: &[Token], split: usize, interner: impl<'a, T> GitDiff<'a, T> where - T: Display, + T: std::fmt::Display, { /// Create a new instance of [`GitDiff`] that can then be passed to [`imara_diff::diff`] /// and generate a more human-readable diff. @@ -196,48 +206,37 @@ where impl Sink for GitDiff<'_, T> where - T: Display, + T: std::fmt::Display, { type Out = Vec; fn process_change(&mut self, before: Range, after: Range) { - if before.is_empty() && !after.is_empty() { - self.changes.push(ChangeGroup { - before: before.start as usize..before.end as usize, - after: after.start as usize..after.end as usize, - change_kind: ChangeKind::Added, - }); - } else if after.is_empty() && !before.is_empty() { - if after.start == 0 { - self.changes.push(ChangeGroup { - before: before.start as usize..before.end as usize, - after: after.start as usize..after.end as usize, - change_kind: ChangeKind::RemovedAbove, - }); - } else { - self.changes.push(ChangeGroup { - before: before.start as usize..before.end as usize, - after: after.start as usize..after.end as usize, - change_kind: ChangeKind::RemovedBelow, - }); + let change_kind = match (before.is_empty(), after.is_empty()) { + (true, false) => ChangeKind::Added, + (false, true) => { + if after.start == 0 { + ChangeKind::RemovedAbove + } else { + ChangeKind::RemovedBelow + } } - } else { - self.changes.push(ChangeGroup { - before: before.start as usize..before.end as usize, - after: after.start as usize..after.end as usize, - change_kind: ChangeKind::Modified, - }); - } + _ => ChangeKind::Modified, + }; + self.changes.push(ChangeGroup { + before: before.start as usize..before.end as usize, + after: after.start as usize..after.end as usize, + change_kind, + }); } fn finish(mut self) -> Self::Out { if self.changes.is_empty() { return self.changes; } - let mut shift: usize; - for change in self.changes.iter_mut() { - // Skip one liner changes + let mut shift: usize; + for change in &mut self.changes { + // Skip one-liner changes if change.after.is_empty() { continue; } @@ -316,85 +315,3 @@ where self.changes } } - -#[test] -fn git_diff_test() { - let before = r#"struct SomeStruct { - field1: f64, - field2: f64, -} - -fn main() { - // Some comment - let c = SomeStruct { field1: 10.0, field2: 10.0 }; - - println!( - "Print field1 from SomeStruct {}", - get_field1(&c) - ); -} - -fn get_field1(c: &SomeStruct) -> f64 { - c.field1 -} -"#; - - let after = r#"/// This is a struct -struct SomeStruct { - field1: f64, - field2: f64, -} - -fn main() { - let c = SomeStruct { field1: 10.0, field2: 10.0 }; - - println!( - "Print field1 and field2 from SomeStruct {} {}", - get_field1(&c), get_field2(&c) - ); - println!("Print another line"); -} - -fn get_field1(c: &SomeStruct) -> f64 { - c.field1 -} - -fn get_field2(c: &SomeStruct) -> f64 { - c.field2 -} -"#; - use crate::blob::git_diff::ChangeKind; - - let input = InternedInput::new(before, after); - let diff = imara_diff::diff(imara_diff::Algorithm::Histogram, &input, GitDiff::new(&input)); - assert_eq!( - diff, - vec![ - ChangeGroup { - before: 0..0, - after: 0..1, - change_kind: ChangeKind::Added - }, - ChangeGroup { - before: 6..7, - after: 7..7, - change_kind: ChangeKind::RemovedBelow - }, - ChangeGroup { - before: 10..12, - after: 10..12, - change_kind: ChangeKind::Modified - }, - ChangeGroup { - before: 13..13, - after: 13..14, - change_kind: ChangeKind::Added - }, - ChangeGroup { - before: 17..17, - after: 19..23, - change_kind: ChangeKind::Added - } - ] - ); -} diff --git a/gix-diff/src/blob/mod.rs b/gix-diff/src/blob/mod.rs index 889f04c503c..8adf1aaeffa 100644 --- a/gix-diff/src/blob/mod.rs +++ b/gix-diff/src/blob/mod.rs @@ -15,7 +15,7 @@ pub mod unified_diff; pub use unified_diff::_impl::UnifiedDiff; pub mod git_diff; -pub use git_diff::*; +pub use git_diff::types::GitDiff; /// Information about the diff performed to detect similarity. #[derive(Debug, Default, Clone, Copy, PartialEq, PartialOrd)] diff --git a/gix-diff/tests/diff/blob/git_diff.rs b/gix-diff/tests/diff/blob/git_diff.rs new file mode 100644 index 00000000000..002b1395667 --- /dev/null +++ b/gix-diff/tests/diff/blob/git_diff.rs @@ -0,0 +1,87 @@ +use gix_diff::blob::intern::InternedInput; +use gix_diff::blob::{ + git_diff::{ChangeGroup, ChangeKind}, + Algorithm, GitDiff, +}; + +#[test] +fn basic() { + let before = r#"struct SomeStruct { + field1: f64, + field2: f64, +} + +fn main() { + // Some comment + let c = SomeStruct { field1: 10.0, field2: 10.0 }; + + println!( + "Print field1 from SomeStruct {}", + get_field1(&c) + ); +} + +fn get_field1(c: &SomeStruct) -> f64 { + c.field1 +} +"#; + + let after = r#"/// This is a struct +struct SomeStruct { + field1: f64, + field2: f64, +} + +fn main() { + let c = SomeStruct { field1: 10.0, field2: 10.0 }; + + println!( + "Print field1 and field2 from SomeStruct {} {}", + get_field1(&c), get_field2(&c) + ); + println!("Print another line"); +} + +fn get_field1(c: &SomeStruct) -> f64 { + c.field1 +} + +fn get_field2(c: &SomeStruct) -> f64 { + c.field2 +} +"#; + use crate::blob::git_diff::ChangeKind; + + let input = InternedInput::new(before, after); + let diff = gix_diff::blob::diff(Algorithm::Histogram, &input, GitDiff::new(&input)); + assert_eq!( + diff, + vec![ + ChangeGroup { + before: 0..0, + after: 0..1, + change_kind: ChangeKind::Added + }, + ChangeGroup { + before: 6..7, + after: 7..7, + change_kind: ChangeKind::RemovedBelow + }, + ChangeGroup { + before: 10..12, + after: 10..12, + change_kind: ChangeKind::Modified + }, + ChangeGroup { + before: 13..13, + after: 13..14, + change_kind: ChangeKind::Added + }, + ChangeGroup { + before: 17..17, + after: 19..23, + change_kind: ChangeKind::Added + } + ] + ); +} diff --git a/gix-diff/tests/diff/blob/mod.rs b/gix-diff/tests/diff/blob/mod.rs index 1959c4e6fdb..49f1345a1de 100644 --- a/gix-diff/tests/diff/blob/mod.rs +++ b/gix-diff/tests/diff/blob/mod.rs @@ -1,3 +1,4 @@ +mod git_diff; pub(crate) mod pipeline; mod platform; mod unified_diff; From c85b92d991a91bb1044fe5f784524f568e72c45b Mon Sep 17 00:00:00 2001 From: Sebastian Thiel Date: Sun, 18 May 2025 11:02:36 +0200 Subject: [PATCH 066/166] fix: Prefer the actual state over following `core.symlinks` in `entry::Mode` --- gix-index/src/entry/mode.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/gix-index/src/entry/mode.rs b/gix-index/src/entry/mode.rs index 817d7a06e0e..3b29548485f 100644 --- a/gix-index/src/entry/mode.rs +++ b/gix-index/src/entry/mode.rs @@ -49,6 +49,7 @@ impl Mode { ) -> Option { match self { Mode::FILE if !stat.is_file() => (), + Mode::SYMLINK if stat.is_symlink() => return None, Mode::SYMLINK if has_symlinks && !stat.is_symlink() => (), Mode::SYMLINK if !has_symlinks && !stat.is_file() => (), Mode::COMMIT | Mode::DIR if !stat.is_dir() => (), From 376ed0cb602e4df457b0b6c87fe16af027bdff48 Mon Sep 17 00:00:00 2001 From: Sebastian Thiel Date: Sun, 18 May 2025 10:24:02 +0200 Subject: [PATCH 067/166] fix: if `core.symlinks=false`, don't misclassify actual symlinks as files. Thus, prefer the actual observation over the stored and maybe incorrect filesystem settings. This avoids false-positives when checking for changes. --- gix-status/src/index_as_worktree/function.rs | 23 +++++++++++----- gix-status/tests/status/index_as_worktree.rs | 29 +++++++++++++++++++- 2 files changed, 44 insertions(+), 8 deletions(-) diff --git a/gix-status/src/index_as_worktree/function.rs b/gix-status/src/index_as_worktree/function.rs index 72e58e8457a..474c9c6c1b0 100644 --- a/gix-status/src/index_as_worktree/function.rs +++ b/gix-status/src/index_as_worktree/function.rs @@ -408,12 +408,12 @@ impl<'index> State<'_, 'index> { None => false, }; - // Here we implement racy-git. See racy-git.txt in the git documentation for a detailed documentation. + // We implement racy-git. See racy-git.txt in the git documentation for detailed documentation. // // A file is racy if: - // 1. its `mtime` is at or after the last index timestamp and its entry stat information - // matches the on-disk file but the file contents are actually modified - // 2. it's size is 0 (set after detecting a file was racy previously) + // 1. Its `mtime` is at or after the last index timestamp and its entry stat information + // matches the on-disk file, but the file contents are actually modified + // 2. Its size is 0 (set after detecting a file was racy previously) // // The first case is detected below by checking the timestamp if the file is marked unmodified. // The second case is usually detected either because the on-disk file is not empty, hence @@ -449,7 +449,16 @@ impl<'index> State<'_, 'index> { file_len: file_size_bytes, filter: &mut self.filter, attr_stack: &mut self.attr_stack, - options: self.options, + core_symlinks: + // If this is legitimately a symlink, then pretend symlinks are enabled as the option seems stale. + // Otherwise, respect the option. + if metadata.is_symlink() + && entry.mode.to_tree_entry_mode().map(|m| m.kind()) == Some(gix_object::tree::EntryKind::Link) + { + true + } else { + self.options.fs.symlink + }, id: &entry.id, objects, worktree_reads: self.worktree_reads, @@ -517,7 +526,7 @@ where entry: &'a gix_index::Entry, filter: &'a mut gix_filter::Pipeline, attr_stack: &'a mut gix_worktree::Stack, - options: &'a Options, + core_symlinks: bool, id: &'a gix_hash::oid, objects: Find, worktree_bytes: &'a AtomicU64, @@ -545,7 +554,7 @@ where // let is_symlink = self.entry.mode == gix_index::entry::Mode::SYMLINK; // TODO: what to do about precompose unicode and ignore_case for symlinks - let out = if is_symlink && self.options.fs.symlink { + let out = if is_symlink && self.core_symlinks { // conversion to bstr can never fail because symlinks are only used // on unix (by git) so no reason to use the try version here let symlink_path = diff --git a/gix-status/tests/status/index_as_worktree.rs b/gix-status/tests/status/index_as_worktree.rs index a5f512f2b5b..d0f7a4a57f0 100644 --- a/gix-status/tests/status/index_as_worktree.rs +++ b/gix-status/tests/status/index_as_worktree.rs @@ -48,6 +48,7 @@ fn nonfile_fixture(name: &str, expected_status: &[Expectation<'_>]) -> Outcome { false, Default::default(), false, + None, ) } @@ -65,6 +66,7 @@ fn fixture_with_index( false, Default::default(), false, + None, ) } @@ -78,6 +80,7 @@ fn submodule_fixture(name: &str, expected_status: &[Expectation<'_>]) -> Outcome false, Default::default(), false, + None, ) } @@ -91,6 +94,7 @@ fn conflict_fixture(name: &str, expected_status: &[Expectation<'_>]) -> Outcome false, Default::default(), false, + None, ) } @@ -104,6 +108,7 @@ fn submodule_fixture_status(name: &str, expected_status: &[Expectation<'_>], sub submodule_dirty, Default::default(), false, + None, ) } @@ -117,6 +122,7 @@ fn fixture_filtered(name: &str, pathspecs: &[&str], expected_status: &[Expectati false, Default::default(), false, + None, ) } @@ -130,6 +136,7 @@ fn fixture_filtered_detailed( submodule_dirty: bool, auto_crlf: gix_filter::eol::AutoCrlf, use_odb: bool, + fs_capabilities: Option<&dyn Fn(&std::path::Path) -> gix_fs::Capabilities>, ) -> Outcome { // This can easily happen in some fixtures, which can cause flakiness. It's time-dependent after all. fn ignore_racyclean(mut out: Outcome) -> Outcome { @@ -179,7 +186,7 @@ fn fixture_filtered_detailed( should_interrupt: &AtomicBool::default(), }; let options = Options { - fs: gix_fs::Capabilities::probe(&git_dir), + fs: fs_capabilities.map_or_else(|| gix_fs::Capabilities::probe(&git_dir), |new| new(&git_dir)), stat: TEST_OPTIONS, ..Options::default() }; @@ -353,6 +360,7 @@ fn replace_dir_with_file() { false, Default::default(), false, + None, ); assert_eq!( out, @@ -560,6 +568,24 @@ fn unchanged() { fixture("status_unchanged", &[]); } +#[test] +fn unchanged_symlinks_present_but_deactivated() { + fixture_filtered_detailed( + "status_unchanged", + "", + &[], + &[], + |_| {}, + false, + Default::default(), + false, + Some(&|dir| gix_fs::Capabilities { + symlink: false, + ..gix_fs::Capabilities::probe(dir) + }), + ); +} + #[test] fn unchanged_despite_filter() { let actual_outcome = fixture_filtered_detailed( @@ -571,6 +597,7 @@ fn unchanged_despite_filter() { false, AutoCrlf::Enabled, true, /* make ODB available */ + None, ); let expected_outcome = Outcome { From 26ae766b182218151ae4c3f30306b6d41bab358a Mon Sep 17 00:00:00 2001 From: Sebastian Thiel Date: Sun, 18 May 2025 11:29:22 +0200 Subject: [PATCH 068/166] fix!: allow querying `Repository::submodules()` in an unborn repository. It's a breaking change merely because the error type changed. --- gix/src/repository/submodule.rs | 20 ++++++++++++------ gix/src/status/index_worktree.rs | 7 ------ gix/src/submodule/errors.rs | 8 +++++-- .../generated-archives/make_submodules.tar | Bin 2120192 -> 2162688 bytes gix/tests/fixtures/make_submodules.sh | 2 ++ gix/tests/gix/submodule.rs | 11 ++++++++++ 6 files changed, 33 insertions(+), 15 deletions(-) diff --git a/gix/src/repository/submodule.rs b/gix/src/repository/submodule.rs index a605bfbd322..bcd54bc382b 100644 --- a/gix/src/repository/submodule.rs +++ b/gix/src/repository/submodule.rs @@ -26,7 +26,7 @@ impl Repository { )?)) } - /// Return a shared [`.gitmodules` file](crate::submodule::File) which is updated automatically if the in-memory snapshot + /// Return a shared [`.gitmodules` file](submodule::File) which is updated automatically if the in-memory snapshot /// has become stale as the underlying file on disk has changed. The snapshot based on the file on disk is shared across all /// clones of this repository. /// @@ -54,12 +54,20 @@ impl Repository { }) { Some(id) => id, None => match self - .head_commit()? - .tree()? - .find_entry(submodule::MODULES_FILE) - .map(|entry| entry.inner.oid) + .head()? + .try_peel_to_id_in_place()? + .map(|id| -> Result, submodule::modules::Error> { + Ok(id + .object()? + .peel_to_commit()? + .tree()? + .find_entry(submodule::MODULES_FILE) + .map(|entry| entry.inner.oid.to_owned())) + }) + .transpose()? + .flatten() { - Some(id) => id.to_owned(), + Some(id) => id, None => return Ok(None), }, }; diff --git a/gix/src/status/index_worktree.rs b/gix/src/status/index_worktree.rs index 86a7dccc877..1911650a1c2 100644 --- a/gix/src/status/index_worktree.rs +++ b/gix/src/status/index_worktree.rs @@ -226,13 +226,6 @@ mod submodule_status { v } Ok(None) => Vec::new(), - Err(crate::submodule::modules::Error::FindHeadCommit( - crate::reference::head_commit::Error::PeelToCommit( - crate::head::peel::to_commit::Error::PeelToObject( - crate::head::peel::to_object::Error::Unborn { .. }, - ), - ), - )) => Vec::new(), Err(err) => return Err(err), }; Ok(Self { diff --git a/gix/src/submodule/errors.rs b/gix/src/submodule/errors.rs index 4e41337de45..81c76b8fe8a 100644 --- a/gix/src/submodule/errors.rs +++ b/gix/src/submodule/errors.rs @@ -23,8 +23,12 @@ pub mod modules { OpenIndex(#[from] crate::worktree::open_index::Error), #[error("Could not find the .gitmodules file by id in the object database")] FindExistingBlob(#[from] crate::object::find::existing::Error), - #[error("Did not find commit in current HEAD to access its tree")] - FindHeadCommit(#[from] crate::reference::head_commit::Error), + #[error(transparent)] + FindHeadRef(#[from] crate::reference::find::existing::Error), + #[error(transparent)] + PeelHeadRef(#[from] crate::head::peel::Error), + #[error(transparent)] + PeelObjectToCommit(#[from] crate::object::peel::to_kind::Error), #[error(transparent)] TreeFromCommit(#[from] crate::object::commit::Error), } diff --git a/gix/tests/fixtures/generated-archives/make_submodules.tar b/gix/tests/fixtures/generated-archives/make_submodules.tar index 4a3566aabdfa490b91c64243ca1539001d4c4ba6..220c4e9a56f672ef4bc0171fe5fc93b30a5fc5b0 100644 GIT binary patch delta 7235 zcmcgxc~leE9%ix=LP*F42}?j^ktH)BEFxO>YKvB>OUto}h;8I4DkAn&tf**r6jF1= zU8;zn6$>&?r9SFj7sU0s*4kQat-BRlQ1kBGnUKkH-Z}4_`u@7-A1o1)RC;ozDi=-8xO0`6{1G&Z_}wj) z5+52-;C%@pX5LuNAg)`QCDRmpat8h~1Z3~{Kr&ICJvQt?Y<(pND^d@zWLGb!(1(F& zy5w<46+(VR*Nue z5GDtKTH)*EdJ&S~raw-u&|-!6sbz_t(QocSV^mEYqpAT!h&kv~h}2u#6RBBhq-Rh4 z0Ge;hyMszGN1-&GJA|JBe?Fc$Z&%u;qry*thS04J1$pyYLDpJ60Npl<5(#8%C zvDwHQXTcjq<+(=ETE&~}PPc-W2}aaQ{K?!J9$<4O`E@*f7HdHg^1aHTIqgiSLYx|B zJ!S&lWv^r+bj~yaO~R3xG&4CP;-gX~BE+pK3KAh+C!rxH$5NW~Q4Z+w*|FGJ4@<** z_2Y!EXS}seSZK41tbSyb@CSqVXW|f~utWe;Sj;cH#|jU?Z2FC~{l)i8GQBb^aCj}7{ zk9)*G)+0!lNy>KRWuQgi$RPd%%>lw`N+b5!4AuAChP(ZyZhg3I(2I;~tD2#*`Hnj+y$dLSl!gek@ZvOW|(HQm*?(U`+?f;35c+T-|Kj-wr1#dq@j0p5DIt9aq zWA96J*sbAq?zI0A+O{JTD2TRg)fxuUk5wcsc}M<*-JJW;l8S=cl6z%?&OG~W6@6Iu zyq)=>x+oL(A^UtO{?@%9%EUdXf>4(0H7M6=c(9sRigTThagEreHlB)^+6Wvbdx5BA zWG`dljOwb5K=J3*XcCU}2g2&88h8ker`KUZF4#2|?%%zDo| z2K4p!jj%^m=0lK`&&0D1u=GR~0Bm<5^c8`$yB!)SN+7NKe2TigbUV7|^9K3GuRdE_ z*g+w=w@R|04T+Hr)k-|r&|1j|5~^P3ta5|IMP*;#zsZ5ZMq65_g9sb_&KJxnoujg8 zq|$rONBrfym?w+8yyq`ZKf5hw&DIZLom{gjeFstwq<1)wzpuLk0o%WQ(#c*N>8Ti` zw`A^~kwbVmd|F+n=X&6upmrM*EyjVubmvXl^ZRyxT&@sCSWnZyrpB>p9- zOX6RZy7-sQk2w-a&E7i1w8sB^h6b-I@g;BFn}{ai$jH#ZO8gT?HLbtT!?0URRjada z6<({07#c<=eh+Ch2^+W@9uhqUPDS1H`y~(wZ8-a0GPQ%@Y@dtt4sF9+gf^Tfs4k13 zMg}sR<@ZO{UA)^m|LOgzYOw69!!uI1^bOV0LJMTk058><>@8G>09GGImgBDVT3I|9 zUn6UEmv^l!hK%`IcAA~x02PNo76IZ%X<(1(jf6+5eWGLT`o5NRLk9)ChJyt1TY*DC6()a5V=+kl&)6(Ih!15xFu(j2v-~# zO9hN8x@};NC=*27mecKM_u;kQQM28L&$rW=hZx)MKf-YCRq7oBjm+~Hm1j7un00#| zk^_#69INOojQL$2uJk%TYw41NL9=w&iSKmdqV&sRcsDE~t2Z>=kxPDN9|mkSg25-> za3tWBlm2sEX40)c_$xrn3Ux1gLwE;+HP_}}7>j~5de7;a}+7Zf{cj zAKL9EMH1Ed8&Dj`lo}Q8rqq8@KL?L~EeghHwqK%ex93YXeY_}$PV2pk!R#ZeoIHL|MHqc>!UIx{Bo zMz!1CR=+9%Vbu!it@4odfHIbH-XxHnFO2}DeYI+GW_D0p611|af8?ceeAX4{% z`e77GXndY@B((!RcVQd7L)#=5t?~JTd=TWrVKEFOw@d4xilga1molahSVHs^yyC;)%uqK64nZ5{lenxWTYnqAfDi78e0kmMFBfUmw z+|$ciuZA8zN@HVN6!o%q)LNy92BBI3tHvrcvuHEMr=5BqF`Qa4jA1y=RfOpeDiI|A z5pzs!?=T{?aE2<1)@Z}HEoa(0_YDnRuq|1Ym%fP>p-K~vlFjmBhX9yS=eJtp;qFNb zNTgIC9F^BUz{5SC7LdT)^WhF5h6H#JqDm73^k)UV5De{`5#VCnp9I*AyRc>-A~$O- z)7iF7a2Pkfs3Hi>E>!hn)Oq)BH15&Gb=yRo150D?+{-`Wm3}y|d+-v%mfT-nwz zIvi7R3HG}25*w!ro8^Sf#FRYTY2jXS7I?f9cnk!?@2spSQWPw3jvWllM?+x5DJI;= z!X67@MV#lr=3qDvPiC*WQxJtUL}y>%b_G4d0WXzOOD7TRr7!Dj$}a2@JJw?U0KO@w z>HdL{SU$&wbs;{rBY=6THzjR~DUlWE(*T>O3;U%5TP#CZn0t;x?#*TGTEHo#Tu}EED72i z@D|L#hk_<`v7*Ye>X0L2&N{Hv{wa8}hmz@VfbL)f&qR2@JafhvJ=sB!sH@UTxWQoY zADEI$IFh3Qvwe(_pR{9hFl(_+Lu&GMPv}ohFY|q|SQiK4H>y)8pCiqsI?G137ox@x z4Aot6<2@i7men_{;XnFX;NZV+s4tABMAP=vLWkFF?yV4svDrqhV z+W6968?9wQ(Lf)88YF1XkW_Jyd%M;Y9_--;3lENG+LCVQwnpuLbg+lE1Z{GbwMks? z7wle*G)xJ;`oFxdWrpZT-SCiy=#nS+?_~{ycOD$^mGqr=JfFGbOG0$0H0ng1b< z&$71y1mB$T8k&S7!x?^}MSlfRpDsJ*^Mi)_4m*(Ce~`X?6sDSVer_ge1t9TYGPp4G jzT0~QY3r%S)KbSkaq+YBrvSMcd$S?CdL34ssTchR!s2H; delta 6122 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 X^YDT>?*N&K^%?~qT+iC{$RPL^+DI?3 diff --git a/gix/tests/fixtures/make_submodules.sh b/gix/tests/fixtures/make_submodules.sh index 906170711ed..524faf6282a 100755 --- a/gix/tests/fixtures/make_submodules.sh +++ b/gix/tests/fixtures/make_submodules.sh @@ -144,3 +144,5 @@ git clone with-submodules not-a-submodule mv modules.bak .gitmodules git add m1 && git commit -m "no submodule in index and commit, but in configuration" ) + +git init unborn \ No newline at end of file diff --git a/gix/tests/gix/submodule.rs b/gix/tests/gix/submodule.rs index 597c97948ce..ab29c22c018 100644 --- a/gix/tests/gix/submodule.rs +++ b/gix/tests/gix/submodule.rs @@ -340,6 +340,17 @@ mod open { Ok(()) } + #[test] + fn in_unborn() -> crate::Result { + let repo = repo("unborn")?; + assert_eq!( + repo.submodules()?.into_iter().flatten().count(), + 0, + "there is nothing, and that is fine" + ); + Ok(()) + } + #[test] #[cfg(feature = "revision")] fn submodule_worktrees() -> crate::Result { From c8a63ab4618d3a71176703a04ab69da02d850267 Mon Sep 17 00:00:00 2001 From: Sebastian Thiel Date: Sun, 18 May 2025 14:08:04 +0200 Subject: [PATCH 069/166] feat: add `file::Store::is_empty()` --- gix-ref/src/store/file/mod.rs | 31 +++++++++++++++++- .../generated-archives/make_pristine.tar | Bin 0 -> 174592 bytes gix-ref/tests/fixtures/make_pristine.sh | 19 +++++++++++ gix-ref/tests/refs/file/mod.rs | 8 +++-- gix-ref/tests/refs/file/store/access.rs | 21 +++++++++++- gix-ref/tests/refs/file/store/find.rs | 1 + gix-ref/tests/refs/file/store/iter.rs | 1 + gix-ref/tests/refs/file/worktree.rs | 2 ++ 8 files changed, 79 insertions(+), 4 deletions(-) create mode 100644 gix-ref/tests/fixtures/generated-archives/make_pristine.tar create mode 100755 gix-ref/tests/fixtures/make_pristine.sh diff --git a/gix-ref/src/store/file/mod.rs b/gix-ref/src/store/file/mod.rs index 3c7d20e8c94..982273d4a67 100644 --- a/gix-ref/src/store/file/mod.rs +++ b/gix-ref/src/store/file/mod.rs @@ -53,7 +53,7 @@ mod access { } } - use crate::file; + use crate::{file, Target}; /// Access impl file::Store { @@ -78,6 +78,35 @@ mod access { pub fn common_dir_resolved(&self) -> &Path { self.common_dir.as_deref().unwrap_or(&self.git_dir) } + + /// Return `Some(true)` if this is a freshly initialized ref store without any observable changes. + /// Return `None` if `HEAD` couldn't be read. + /// + /// This is the case if: + /// + /// * the ref-store is valid + /// * `HEAD` exists + /// * `HEAD` still points to `default_ref` + /// * there are no packed refs + /// * There are no observable references in `refs/` + pub fn is_pristine(&self, default_ref: &crate::FullNameRef) -> Option { + let head = self.find_loose("HEAD").ok()?; + match head.target { + Target::Object(_) => return Some(false), + Target::Symbolic(name) => { + if name.as_ref() != default_ref { + return Some(false); + } + } + } + if self.loose_iter().ok()?.filter_map(Result::ok).next().is_some() { + return Some(false); + } + if self.packed_refs_path().is_file() { + return Some(false); + } + Some(true) + } } } diff --git a/gix-ref/tests/fixtures/generated-archives/make_pristine.tar b/gix-ref/tests/fixtures/generated-archives/make_pristine.tar new file mode 100644 index 0000000000000000000000000000000000000000..40e705b753df6acecdf04268ea6e35f6b03f0148 GIT binary patch literal 174592 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 Lz>ETaO$z)!+U(l3 literal 0 HcmV?d00001 diff --git a/gix-ref/tests/fixtures/make_pristine.sh b/gix-ref/tests/fixtures/make_pristine.sh new file mode 100755 index 00000000000..ed42133f519 --- /dev/null +++ b/gix-ref/tests/fixtures/make_pristine.sh @@ -0,0 +1,19 @@ +#!/usr/bin/env bash +set -eu -o pipefail + +git init untouched + +git init changed-headref +(cd changed-headref + echo "ref: refs/heads/other" >.git/HEAD +) + +git init detached +(cd detached + echo "abcdefabcdefabcdefabcdefabcdefabcdefabcd" >.git/HEAD +) + +git init invalid-loose-ref +(cd invalid-loose-ref + touch .git/refs/heads/empty +) diff --git a/gix-ref/tests/refs/file/mod.rs b/gix-ref/tests/refs/file/mod.rs index 0c71dba67b5..c2e7b201b09 100644 --- a/gix-ref/tests/refs/file/mod.rs +++ b/gix-ref/tests/refs/file/mod.rs @@ -14,8 +14,12 @@ pub fn store_with_packed_refs() -> crate::Result { } pub fn store_at(name: &str) -> crate::Result { - let path = gix_testtools::scripted_fixture_read_only_standalone(name)?; - Ok(Store::at(path.join(".git"), Default::default())) + named_store_at(name, "") +} + +pub fn named_store_at(script_name: &str, name: &str) -> crate::Result { + let path = gix_testtools::scripted_fixture_read_only_standalone(script_name)?; + Ok(Store::at(path.join(name).join(".git"), Default::default())) } pub fn store_at_with_args(name: &str, args: impl IntoIterator>) -> crate::Result { diff --git a/gix-ref/tests/refs/file/store/access.rs b/gix-ref/tests/refs/file/store/access.rs index df1e7d6d0ec..b7d4097d797 100644 --- a/gix-ref/tests/refs/file/store/access.rs +++ b/gix-ref/tests/refs/file/store/access.rs @@ -1,4 +1,4 @@ -use crate::file::store; +use crate::file::{named_store_at, store}; #[test] fn set_packed_buffer_mmap_threshold() -> crate::Result { @@ -20,3 +20,22 @@ fn set_packed_buffer_mmap_threshold() -> crate::Result { ); Ok(()) } + +#[test] +fn is_pristine() -> crate::Result { + let store = named_store_at("make_pristine.sh", "untouched")?; + assert_eq!(store.is_pristine("refs/heads/main".try_into()?), Some(true)); + assert_eq!(store.is_pristine("refs/heads/other".try_into()?), Some(false)); + + let store = named_store_at("make_pristine.sh", "changed-headref")?; + assert_eq!(store.is_pristine("refs/heads/other".try_into()?), Some(true)); + assert_eq!(store.is_pristine("refs/heads/main".try_into()?), Some(false)); + + let store = named_store_at("make_pristine.sh", "detached")?; + assert_eq!(store.is_pristine("refs/heads/main".try_into()?), Some(false)); + + let store = named_store_at("make_pristine.sh", "invalid-loose-ref")?; + assert_eq!(store.is_pristine("refs/heads/main".try_into()?), Some(true)); + + Ok(()) +} diff --git a/gix-ref/tests/refs/file/store/find.rs b/gix-ref/tests/refs/file/store/find.rs index f9cb0a26489..2ecd52cddd9 100644 --- a/gix-ref/tests/refs/file/store/find.rs +++ b/gix-ref/tests/refs/file/store/find.rs @@ -9,6 +9,7 @@ mod existing { "make_packed_ref_repository_for_overlay.sh", ] { let store = store_at(fixture)?; + assert_eq!(store.is_pristine("refs/heads/main".try_into()?), Some(false)); let c1 = hex_to_id("134385f6d781b7e97062102c6a483440bfda2a03"); let r = store.find("main")?; assert_eq!(r.target.into_id(), c1); diff --git a/gix-ref/tests/refs/file/store/iter.rs b/gix-ref/tests/refs/file/store/iter.rs index 527fd03c1cb..68259c0b1b9 100644 --- a/gix-ref/tests/refs/file/store/iter.rs +++ b/gix-ref/tests/refs/file/store/iter.rs @@ -576,6 +576,7 @@ fn overlay_partial_prefix_iter_when_prefix_is_dir() -> crate::Result { use gix_ref::Target::*; let store = store_at("make_packed_ref_repository_for_overlay.sh")?; + assert_eq!(store.is_pristine("refs/heads/main".try_into()?), Some(false)); let c1 = hex_to_id("134385f6d781b7e97062102c6a483440bfda2a03"); let ref_names = store diff --git a/gix-ref/tests/refs/file/worktree.rs b/gix-ref/tests/refs/file/worktree.rs index d7b61ccf992..5d23c779f8f 100644 --- a/gix-ref/tests/refs/file/worktree.rs +++ b/gix-ref/tests/refs/file/worktree.rs @@ -84,6 +84,7 @@ mod read_only { fn linked() -> crate::Result { for packed in [false, true] { let (store, odb, _tmp) = worktree_store(packed, "w1", Mode::Read)?; + assert_eq!(store.is_pristine("refs/heads/main".try_into()?), Some(false)); let peel = into_peel(&store, odb); let w1_head_id = peel(store.find("HEAD").unwrap()); @@ -132,6 +133,7 @@ mod read_only { fn main() -> crate::Result { for packed in [false, true] { let (store, odb, _tmp) = main_store(packed, Mode::Read)?; + assert_eq!(store.is_pristine("refs/heads/main".try_into()?), Some(false)); let peel = into_peel(&store, odb); let head_id = peel(store.find("HEAD").unwrap()); From b985766c9c9c5eb09ea4c4b17be9e380bfdad9b4 Mon Sep 17 00:00:00 2001 From: Sebastian Thiel Date: Sun, 18 May 2025 14:37:11 +0200 Subject: [PATCH 070/166] feat: add `Repository::is_empty()` to emulate the similar `git2` API --- gix/src/repository/location.rs | 17 +++++++++++++++++ gix/tests/gix/repository/mod.rs | 10 ++++++++++ 2 files changed, 27 insertions(+) diff --git a/gix/src/repository/location.rs b/gix/src/repository/location.rs index e7a18138df3..6f38b3c958d 100644 --- a/gix/src/repository/location.rs +++ b/gix/src/repository/location.rs @@ -1,3 +1,4 @@ +use std::borrow::Cow; use std::path::{Path, PathBuf}; use gix_path::realpath::MAX_SYMLINKS; @@ -108,4 +109,20 @@ impl crate::Repository { None => crate::repository::Kind::Bare, } } + + /// Returns `Some(true)` if the reference database [is untouched](gix_ref::file::Store::is_pristine()). + /// This typically indicates that the repository is new and empty. + /// Return `None` if a defect in the database makes the answer uncertain. + #[doc(alias = "is_empty", alias = "git2")] + pub fn is_pristine(&self) -> Option { + let name = self + .config + .resolved + .string(crate::config::tree::Init::DEFAULT_BRANCH) + .unwrap_or(Cow::Borrowed("master".into())); + let default_branch_ref_name: gix_ref::FullName = format!("refs/heads/{name}") + .try_into() + .unwrap_or_else(|_| gix_ref::FullName::try_from("refs/heads/master").expect("known to be valid")); + self.refs.is_pristine(default_branch_ref_name.as_ref()) + } } diff --git a/gix/tests/gix/repository/mod.rs b/gix/tests/gix/repository/mod.rs index cf29cfc1170..4253ff4b121 100644 --- a/gix/tests/gix/repository/mod.rs +++ b/gix/tests/gix/repository/mod.rs @@ -56,6 +56,16 @@ mod index { repo.index_or_load_from_head_or_empty()?.entries().is_empty(), "an empty index is created on the fly" ); + assert_eq!( + repo.is_pristine(), + Some(false), + "not pristine as it things the initial ref was changed to 'main'" + ); + assert_eq!( + repo.refs.is_pristine("refs/heads/main".try_into()?), + Some(true), + "This is a quirk of default values in gix and the way we override the initial branch for test fixtures" + ); Ok(()) } } From 55056467e8b1d2ee327e4f29df058224fb64db5e Mon Sep 17 00:00:00 2001 From: Sebastian Thiel Date: Sun, 18 May 2025 21:21:48 +0200 Subject: [PATCH 071/166] Make `GitDiff` compatible to strings and bytes. --- gix-diff/src/blob/git_diff.rs | 53 +++++----- gix-diff/tests/diff/blob/git_diff.rs | 143 ++++++++++++++++++++------- 2 files changed, 141 insertions(+), 55 deletions(-) diff --git a/gix-diff/src/blob/git_diff.rs b/gix-diff/src/blob/git_diff.rs index 8ddeed5e039..7cd148b9735 100644 --- a/gix-diff/src/blob/git_diff.rs +++ b/gix-diff/src/blob/git_diff.rs @@ -1,11 +1,11 @@ //! Facilities to produce git-formatted diffs. -use std::cmp::Ordering; -use std::ops::Range; - use crate::blob::GitDiff; +use bstr::ByteSlice; use imara_diff::intern::{InternedInput, Interner, Token}; use imara_diff::Sink; +use std::cmp::Ordering; +use std::ops::Range; // Explanation for the following numbers can be found here: // https://github.com/git/git/blob/324fbaab88126196bd42e7fa383ee94e165d61b5/xdiff/xdiffi.c#L535 @@ -29,9 +29,11 @@ pub(super) mod types { use crate::blob::git_diff::ChangeGroup; /// A [`Sink`](imara_diff::Sink) that creates a diff like git would. + /// + /// See the [diff slider repository](https://github.com/mhagger/diff-slider-tools) for more information. pub struct GitDiff<'a, T> where - T: std::fmt::Display, + T: AsRef<[u8]>, { pub(crate) after: &'a [imara_diff::intern::Token], pub(crate) interner: &'a imara_diff::intern::Interner, @@ -75,7 +77,7 @@ impl PartialOrd for Score { #[derive(PartialEq, Debug)] pub struct ChangeGroup { /// Range indicating the lines of the previous block. - /// To actually see how the previous block looked like, you need to combine this range with + /// To actually see what the previous block looked like, you need to combine this range with /// the [`InternedInput`]. pub before: Range, /// Range indicating the lines of the new block @@ -86,16 +88,28 @@ pub struct ChangeGroup { pub change_kind: ChangeKind, } -// Calculate the indentation of a single line -fn get_indent(s: String) -> Option { +impl ChangeGroup { + /// Return [before](Self::before) and [after](Self::after) as `u32` ranges for use in [Sink::process_change()]. + /// + /// This is useful for creating [unified diffs](crate::blob::UnifiedDiff), for example. + pub fn as_u32_ranges(&self) -> (Range, Range) { + ( + self.before.start as u32..self.before.end as u32, + self.after.start as u32..self.after.end as u32, + ) + } +} + +// Calculate the indentation of a single line as number of tabs. +fn get_indent(s: &[u8]) -> Option { let mut indent = 0; - for char in s.chars() { - if !char.is_whitespace() { + for char in s.bytes() { + if !char.is_ascii_whitespace() { return Some(indent); - } else if char == ' ' { + } else if char == b' ' { indent += 1; - } else if char == '\t' { + } else if char == b'\t' { indent += 8 - indent % 8; } @@ -107,18 +121,13 @@ fn get_indent(s: String) -> Option { None } -fn measure_and_score_change( - lines: &[Token], - split: usize, - interner: &Interner, - score: &mut Score, -) { +fn measure_and_score_change>(lines: &[Token], split: usize, interner: &Interner, score: &mut Score) { // Gather information about the surroundings of the change let end_of_file = split >= lines.len(); let mut indent: Option = if split >= lines.len() { None } else { - get_indent(interner[lines[split]].to_string()) + get_indent(interner[lines[split]].as_ref()) }; let mut pre_blank = 0; let mut pre_indent: Option = None; @@ -126,7 +135,7 @@ fn measure_and_score_change( let mut post_indent: Option = None; for line in (0..=split.saturating_sub(1)).rev() { - pre_indent = get_indent(interner[lines[line]].to_string()); + pre_indent = get_indent(interner[lines[line]].as_ref()); if pre_indent.is_none() { pre_blank += 1; if pre_blank == MAX_BLANKS { @@ -136,7 +145,7 @@ fn measure_and_score_change( } } for line in split + 1..lines.len() { - post_indent = get_indent(interner[lines[line]].to_string()); + post_indent = get_indent(interner[lines[line]].as_ref()); if post_indent.is_none() { post_blank += 1; if post_blank == MAX_BLANKS { @@ -191,7 +200,7 @@ fn measure_and_score_change( impl<'a, T> GitDiff<'a, T> where - T: std::fmt::Display, + T: AsRef<[u8]>, { /// Create a new instance of [`GitDiff`] that can then be passed to [`imara_diff::diff`] /// and generate a more human-readable diff. @@ -206,7 +215,7 @@ where impl Sink for GitDiff<'_, T> where - T: std::fmt::Display, + T: AsRef<[u8]>, { type Out = Vec; diff --git a/gix-diff/tests/diff/blob/git_diff.rs b/gix-diff/tests/diff/blob/git_diff.rs index 002b1395667..54199344981 100644 --- a/gix-diff/tests/diff/blob/git_diff.rs +++ b/gix-diff/tests/diff/blob/git_diff.rs @@ -1,11 +1,13 @@ use gix_diff::blob::intern::InternedInput; +use gix_diff::blob::unified_diff::{ContextSize, NewlineSeparator}; use gix_diff::blob::{ git_diff::{ChangeGroup, ChangeKind}, - Algorithm, GitDiff, + Algorithm, GitDiff, Sink, UnifiedDiff, }; +use std::hash::Hash; #[test] -fn basic() { +fn basic() -> crate::Result { let before = r#"struct SomeStruct { field1: f64, field2: f64, @@ -52,36 +54,111 @@ fn get_field2(c: &SomeStruct) -> f64 { "#; use crate::blob::git_diff::ChangeKind; + let expected = &[ + ChangeGroup { + before: 0..0, + after: 0..1, + change_kind: ChangeKind::Added, + }, + ChangeGroup { + before: 6..7, + after: 7..7, + change_kind: ChangeKind::RemovedBelow, + }, + ChangeGroup { + before: 10..12, + after: 10..12, + change_kind: ChangeKind::Modified, + }, + ChangeGroup { + before: 13..13, + after: 13..14, + change_kind: ChangeKind::Added, + }, + ChangeGroup { + before: 17..17, + after: 19..23, + change_kind: ChangeKind::Added, + }, + ]; + let input = InternedInput::new(before, after); - let diff = gix_diff::blob::diff(Algorithm::Histogram, &input, GitDiff::new(&input)); - assert_eq!( - diff, - vec![ - ChangeGroup { - before: 0..0, - after: 0..1, - change_kind: ChangeKind::Added - }, - ChangeGroup { - before: 6..7, - after: 7..7, - change_kind: ChangeKind::RemovedBelow - }, - ChangeGroup { - before: 10..12, - after: 10..12, - change_kind: ChangeKind::Modified - }, - ChangeGroup { - before: 13..13, - after: 13..14, - change_kind: ChangeKind::Added - }, - ChangeGroup { - before: 17..17, - after: 19..23, - change_kind: ChangeKind::Added - } - ] - ); + let actual = gix_diff::blob::diff(Algorithm::Histogram, &input, GitDiff::new(&input)); + assert_eq!(actual, expected); + insta::assert_snapshot!(uni_diff_string(&input, actual), @r#" + @@ -1,1 +1,2 @@ + +/// This is a struct + struct SomeStruct { + @@ -6,3 +7,2 @@ + fn main() { + - // Some comment + let c = SomeStruct { field1: 10.0, field2: 10.0 }; + @@ -10,5 +10,6 @@ + println!( + - "Print field1 from SomeStruct {}", + - get_field1(&c) + + "Print field1 and field2 from SomeStruct {} {}", + + get_field1(&c), get_field2(&c) + ); + + println!("Print another line"); + } + @@ -17,2 +19,6 @@ + c.field1 + + + +fn get_field2(c: &SomeStruct) -> f64 { + + c.field2 + +} + } + "#); + + let standard_slider = gix_diff::blob::diff(Algorithm::Histogram, &input, uni_diff(&input))?; + insta::assert_snapshot!(standard_slider, @r#" + @@ -1,1 +1,2 @@ + +/// This is a struct + struct SomeStruct { + @@ -6,3 +7,2 @@ + fn main() { + - // Some comment + let c = SomeStruct { field1: 10.0, field2: 10.0 }; + @@ -10,5 +10,6 @@ + println!( + - "Print field1 from SomeStruct {}", + - get_field1(&c) + + "Print field1 and field2 from SomeStruct {} {}", + + get_field1(&c), get_field2(&c) + ); + + println!("Print another line"); + } + @@ -17,2 +18,6 @@ + c.field1 + +} + + + +fn get_field2(c: &SomeStruct) -> f64 { + + c.field2 + } + "#); + + let input = InternedInput::new(before.as_bytes(), after.as_bytes()); + let actual = gix_diff::blob::diff(Algorithm::Histogram, &input, GitDiff::new(&input)); + assert_eq!(actual, expected); + + Ok(()) +} + +fn uni_diff>(input: &InternedInput) -> UnifiedDiff<'_, T, String> { + UnifiedDiff::new( + input, + String::default(), + NewlineSeparator::AfterHeaderAndLine("\n"), + ContextSize::symmetrical(1), + ) +} + +fn uni_diff_string>(input: &InternedInput, changes: Vec) -> String { + let mut uni = uni_diff(input); + for change in changes { + let (before, after) = change.as_u32_ranges(); + uni.process_change(before, after); + } + uni.finish().expect("in-memory is infallible") } From 0eaced934a4d52d80d680222fc0c9f7aae74f056 Mon Sep 17 00:00:00 2001 From: Sebastian Thiel Date: Mon, 19 May 2025 11:01:56 +0200 Subject: [PATCH 072/166] fix: improve rename tracking performance characteristics to make exponential runtime less likely. This optimizes specifically for the case where there are a lot of added files, but no deletion to pair it up with. --- gix-diff/src/rewrites/tracker.rs | 129 +++++++++++++++++++------------ 1 file changed, 78 insertions(+), 51 deletions(-) diff --git a/gix-diff/src/rewrites/tracker.rs b/gix-diff/src/rewrites/tracker.rs index dc2d10cb077..7a8f2e43172 100644 --- a/gix-diff/src/rewrites/tracker.rs +++ b/gix-diff/src/rewrites/tracker.rs @@ -239,69 +239,96 @@ impl Tracker { .then_with(|| a.path.start.cmp(&b.path.start).then(a.path.end.cmp(&b.path.end))) } + // Early abort: if there is no pair, don't do anything. + let has_work = { + let (mut num_deletions, mut num_additions, mut num_modifications) = (0, 0, 0); + let mut has_work = false; + for change in &self.items { + match change.change.kind() { + ChangeKind::Deletion => { + num_deletions += 1; + } + ChangeKind::Modification => { + // This means we have copy-tracking enabled + num_modifications += 1; + } + ChangeKind::Addition => num_additions += 1, + } + if (num_deletions != 0 && num_additions != 0) + || (self.rewrites.copies.is_some() && num_modifications + num_additions > 1) + { + has_work = true; + break; + } + } + has_work + }; + let mut out = Outcome { options: self.rewrites, ..Default::default() }; - self.items.sort_by(by_id_and_location); - - // Rewrites by directory (without local changes) can be pruned out quickly, - // by finding only parents, their counterpart, and then all children can be matched by - // relationship ID. - self.match_pairs_of_kind( - visit::SourceKind::Rename, - &mut cb, - None, /* by identity for parents */ - &mut out, - diff_cache, - objects, - Some(is_parent), - )?; - - self.match_pairs_of_kind( - visit::SourceKind::Rename, - &mut cb, - self.rewrites.percentage, - &mut out, - diff_cache, - objects, - None, - )?; - - self.match_renamed_directories(&mut cb)?; - - if let Some(copies) = self.rewrites.copies { + if has_work { + self.items.sort_by(by_id_and_location); + + // Rewrites by directory (without local changes) can be pruned out quickly, + // by finding only parents, their counterpart, and then all children can be matched by + // relationship ID. + self.match_pairs_of_kind( + visit::SourceKind::Rename, + &mut cb, + None, /* by identity for parents */ + &mut out, + diff_cache, + objects, + Some(is_parent), + )?; + self.match_pairs_of_kind( - visit::SourceKind::Copy, + visit::SourceKind::Rename, &mut cb, - copies.percentage, + self.rewrites.percentage, &mut out, diff_cache, objects, None, )?; - match copies.source { - CopySource::FromSetOfModifiedFiles => {} - CopySource::FromSetOfModifiedFilesAndAllSources => { - push_source_tree(&mut |change, location| { - if self.try_push_change(change, location).is_none() { - // make sure these aren't viable to be emitted anymore. - self.items.last_mut().expect("just pushed").emitted = true; - } - }) - .map_err(|err| emit::Error::GetItemsForExhaustiveCopyDetection(Box::new(err)))?; - self.items.sort_by(by_id_and_location); - - self.match_pairs_of_kind( - visit::SourceKind::Copy, - &mut cb, - copies.percentage, - &mut out, - diff_cache, - objects, - None, - )?; + self.match_renamed_directories(&mut cb)?; + + if let Some(copies) = self.rewrites.copies { + self.match_pairs_of_kind( + visit::SourceKind::Copy, + &mut cb, + copies.percentage, + &mut out, + diff_cache, + objects, + None, + )?; + + match copies.source { + CopySource::FromSetOfModifiedFiles => {} + CopySource::FromSetOfModifiedFilesAndAllSources => { + push_source_tree(&mut |change, location| { + if self.try_push_change(change, location).is_none() { + // make sure these aren't viable to be emitted anymore. + self.items.last_mut().expect("just pushed").emitted = true; + } + }) + .map_err(|err| emit::Error::GetItemsForExhaustiveCopyDetection(Box::new(err)))?; + self.items.sort_by(by_id_and_location); + + self.match_pairs_of_kind( + visit::SourceKind::Copy, + &mut cb, + copies.percentage, + &mut out, + diff_cache, + objects, + None, + )?; + } } } } From 4f271796041655d80ab0435a76281446e21ad8cd Mon Sep 17 00:00:00 2001 From: Sebastian Thiel Date: Mon, 19 May 2025 18:37:20 +0200 Subject: [PATCH 073/166] fix: remove `blob::GitDiff` Sink as it doesn't work concistently. (#2011) Against better judgement I was compelled to merge this implementation in, assuming one test must be enough given that it is a transcription. This, however, wasn't the case and there is strong evidence that it produces diffs that aren't correct. --- gix-diff/src/blob/git_diff.rs | 326 --------------------------- gix-diff/src/blob/mod.rs | 3 - gix-diff/tests/diff/blob/git_diff.rs | 164 -------------- gix-diff/tests/diff/blob/mod.rs | 1 - 4 files changed, 494 deletions(-) delete mode 100644 gix-diff/src/blob/git_diff.rs delete mode 100644 gix-diff/tests/diff/blob/git_diff.rs diff --git a/gix-diff/src/blob/git_diff.rs b/gix-diff/src/blob/git_diff.rs deleted file mode 100644 index 7cd148b9735..00000000000 --- a/gix-diff/src/blob/git_diff.rs +++ /dev/null @@ -1,326 +0,0 @@ -//! Facilities to produce git-formatted diffs. - -use crate::blob::GitDiff; -use bstr::ByteSlice; -use imara_diff::intern::{InternedInput, Interner, Token}; -use imara_diff::Sink; -use std::cmp::Ordering; -use std::ops::Range; - -// Explanation for the following numbers can be found here: -// https://github.com/git/git/blob/324fbaab88126196bd42e7fa383ee94e165d61b5/xdiff/xdiffi.c#L535 -const MAX_INDENT: u8 = 200; -const MAX_BLANKS: i16 = 20; -const INDENT_WEIGHT: i16 = 60; -const INDENT_HEURISTIC_MAX_SLIDING: usize = 100; - -const START_OF_FILE_PENALTY: i16 = 1; -const END_OF_FILE_PENALTY: i16 = 21; -const TOTAL_BLANK_WEIGHT: i16 = -30; -const POST_BLANK_WEIGHT: i16 = 6; -const RELATIVE_INDENT_PENALTY: i16 = -4; -const RELATIVE_INDENT_WITH_BLANK_PENALTY: i16 = 10; -const RELATIVE_OUTDENT_PENALTY: i16 = 24; -const RELATIVE_OUTDENT_WITH_BLANK_PENALTY: i16 = 17; -const RELATIVE_DEDENT_PENALTY: i16 = 23; -const RELATIVE_DEDENT_WITH_BLANK_PENALTY: i16 = 17; - -pub(super) mod types { - use crate::blob::git_diff::ChangeGroup; - - /// A [`Sink`](imara_diff::Sink) that creates a diff like git would. - /// - /// See the [diff slider repository](https://github.com/mhagger/diff-slider-tools) for more information. - pub struct GitDiff<'a, T> - where - T: AsRef<[u8]>, - { - pub(crate) after: &'a [imara_diff::intern::Token], - pub(crate) interner: &'a imara_diff::intern::Interner, - pub(crate) changes: Vec, - } -} - -/// An enum indicating the kind of change that occurred. -#[derive(PartialEq, Debug)] -pub enum ChangeKind { - /// Indicates that a change introduced new lines. - Added, - /// Indicates that a change removed lines before the starting line of the change. - RemovedAbove, - /// Indicates that a change removed lines after the ending line of the change. - RemovedBelow, - /// Indicates that the change modified lines. - Modified, -} - -#[derive(PartialEq)] -struct Score { - effective_indent: i16, - penalty: i16, -} - -impl PartialOrd for Score { - // A score is considered "Greater" if it is equal or less than 0 - fn partial_cmp(&self, other: &Self) -> Option { - let indent_penalty = match self.effective_indent.cmp(&other.effective_indent) { - Ordering::Greater => INDENT_WEIGHT, - Ordering::Less => -INDENT_WEIGHT, - Ordering::Equal => 0, - }; - - Some((indent_penalty + (self.penalty - other.penalty)).cmp(&0).reverse()) - } -} - -/// A [`ChangeGroup`] represents a block of changed lines. -#[derive(PartialEq, Debug)] -pub struct ChangeGroup { - /// Range indicating the lines of the previous block. - /// To actually see what the previous block looked like, you need to combine this range with - /// the [`InternedInput`]. - pub before: Range, - /// Range indicating the lines of the new block - /// To actually see how the current block looks like, you need to combine this range with - /// the [`InternedInput`]. - pub after: Range, - /// Further specify what kind of change is denoted by the ranges above. - pub change_kind: ChangeKind, -} - -impl ChangeGroup { - /// Return [before](Self::before) and [after](Self::after) as `u32` ranges for use in [Sink::process_change()]. - /// - /// This is useful for creating [unified diffs](crate::blob::UnifiedDiff), for example. - pub fn as_u32_ranges(&self) -> (Range, Range) { - ( - self.before.start as u32..self.before.end as u32, - self.after.start as u32..self.after.end as u32, - ) - } -} - -// Calculate the indentation of a single line as number of tabs. -fn get_indent(s: &[u8]) -> Option { - let mut indent = 0; - - for char in s.bytes() { - if !char.is_ascii_whitespace() { - return Some(indent); - } else if char == b' ' { - indent += 1; - } else if char == b'\t' { - indent += 8 - indent % 8; - } - - if indent >= MAX_INDENT { - return Some(MAX_INDENT); - } - } - - None -} - -fn measure_and_score_change>(lines: &[Token], split: usize, interner: &Interner, score: &mut Score) { - // Gather information about the surroundings of the change - let end_of_file = split >= lines.len(); - let mut indent: Option = if split >= lines.len() { - None - } else { - get_indent(interner[lines[split]].as_ref()) - }; - let mut pre_blank = 0; - let mut pre_indent: Option = None; - let mut post_blank = 0; - let mut post_indent: Option = None; - - for line in (0..=split.saturating_sub(1)).rev() { - pre_indent = get_indent(interner[lines[line]].as_ref()); - if pre_indent.is_none() { - pre_blank += 1; - if pre_blank == MAX_BLANKS { - pre_indent = Some(0); - break; - } - } - } - for line in split + 1..lines.len() { - post_indent = get_indent(interner[lines[line]].as_ref()); - if post_indent.is_none() { - post_blank += 1; - if post_blank == MAX_BLANKS { - post_indent = Some(0); - break; - } - } - } - - // Calculate score of the currently applied split - post_blank = if indent.is_none() { 1 + post_blank } else { 0 }; - let total_blank = pre_blank + post_blank; - if indent.is_none() { - indent = post_indent; - } - let any_blanks = total_blank != 0; - - if pre_indent.is_none() && pre_blank == 0 { - score.penalty += START_OF_FILE_PENALTY; - } - - if end_of_file { - score.penalty += END_OF_FILE_PENALTY; - } - - score.penalty += TOTAL_BLANK_WEIGHT * total_blank; - score.penalty += POST_BLANK_WEIGHT * post_blank; - - score.effective_indent += if let Some(indent) = indent { indent as i16 } else { -1 }; - - if indent.is_none() || pre_indent.is_none() || indent == pre_indent { - } else if indent > pre_indent { - score.penalty += if any_blanks { - RELATIVE_INDENT_WITH_BLANK_PENALTY - } else { - RELATIVE_INDENT_PENALTY - }; - } else if post_indent.is_some() && post_indent > indent { - score.penalty += if any_blanks { - RELATIVE_OUTDENT_WITH_BLANK_PENALTY - } else { - RELATIVE_OUTDENT_PENALTY - }; - } else { - score.penalty += if any_blanks { - RELATIVE_DEDENT_WITH_BLANK_PENALTY - } else { - RELATIVE_DEDENT_PENALTY - }; - } -} - -impl<'a, T> GitDiff<'a, T> -where - T: AsRef<[u8]>, -{ - /// Create a new instance of [`GitDiff`] that can then be passed to [`imara_diff::diff`] - /// and generate a more human-readable diff. - pub fn new(input: &'a InternedInput) -> Self { - Self { - after: &input.after, - interner: &input.interner, - changes: Vec::new(), - } - } -} - -impl Sink for GitDiff<'_, T> -where - T: AsRef<[u8]>, -{ - type Out = Vec; - - fn process_change(&mut self, before: Range, after: Range) { - let change_kind = match (before.is_empty(), after.is_empty()) { - (true, false) => ChangeKind::Added, - (false, true) => { - if after.start == 0 { - ChangeKind::RemovedAbove - } else { - ChangeKind::RemovedBelow - } - } - _ => ChangeKind::Modified, - }; - self.changes.push(ChangeGroup { - before: before.start as usize..before.end as usize, - after: after.start as usize..after.end as usize, - change_kind, - }); - } - - fn finish(mut self) -> Self::Out { - if self.changes.is_empty() { - return self.changes; - } - - let mut shift: usize; - for change in &mut self.changes { - // Skip one-liner changes - if change.after.is_empty() { - continue; - } - - // Move this change up by one line if the line before the change and the last line in - // the change are equal - loop { - if change.after.start > 0 && self.after[change.after.start - 1] == self.after[change.after.end - 1] { - change.after.start -= 1; - change.after.end -= 1; - } else { - break; - } - } - - shift = change.after.end; - - // Move this change down by one line if the first line in the change the line after the - // change are equal - loop { - if change.after.end < self.after.len() && self.after[change.after.start] == self.after[change.after.end] - { - change.after.start += 1; - change.after.end += 1; - } else { - break; - } - } - - let mut best_shift: Option = None; - let mut best_score = Score { - effective_indent: 0, - penalty: 0, - }; - - if change.after.end.saturating_sub(change.after.len()) > shift { - shift = change.after.end - change.after.len(); - } - - if change.after.end.saturating_sub(INDENT_HEURISTIC_MAX_SLIDING) > shift { - shift = change.after.end - INDENT_HEURISTIC_MAX_SLIDING; - } - - while shift <= change.after.end { - let mut score = Score { - effective_indent: 0, - penalty: 0, - }; - - measure_and_score_change(self.after, shift, self.interner, &mut score); - measure_and_score_change(self.after, shift - change.after.len(), self.interner, &mut score); - - if best_shift.is_none() || score > best_score { - best_score = score; - best_shift = Some(shift); - } - shift += 1; - } - - if let Some(best_shift) = best_shift { - while change.after.end > best_shift { - loop { - if change.after.start > 0 - && self.after[change.after.start - 1] == self.after[change.after.end - 1] - { - change.after.start -= 1; - change.after.end -= 1; - } else { - break; - } - } - } - } - } - - self.changes - } -} diff --git a/gix-diff/src/blob/mod.rs b/gix-diff/src/blob/mod.rs index 8adf1aaeffa..541e978d752 100644 --- a/gix-diff/src/blob/mod.rs +++ b/gix-diff/src/blob/mod.rs @@ -14,9 +14,6 @@ pub mod platform; pub mod unified_diff; pub use unified_diff::_impl::UnifiedDiff; -pub mod git_diff; -pub use git_diff::types::GitDiff; - /// Information about the diff performed to detect similarity. #[derive(Debug, Default, Clone, Copy, PartialEq, PartialOrd)] pub struct DiffLineStats { diff --git a/gix-diff/tests/diff/blob/git_diff.rs b/gix-diff/tests/diff/blob/git_diff.rs deleted file mode 100644 index 54199344981..00000000000 --- a/gix-diff/tests/diff/blob/git_diff.rs +++ /dev/null @@ -1,164 +0,0 @@ -use gix_diff::blob::intern::InternedInput; -use gix_diff::blob::unified_diff::{ContextSize, NewlineSeparator}; -use gix_diff::blob::{ - git_diff::{ChangeGroup, ChangeKind}, - Algorithm, GitDiff, Sink, UnifiedDiff, -}; -use std::hash::Hash; - -#[test] -fn basic() -> crate::Result { - let before = r#"struct SomeStruct { - field1: f64, - field2: f64, -} - -fn main() { - // Some comment - let c = SomeStruct { field1: 10.0, field2: 10.0 }; - - println!( - "Print field1 from SomeStruct {}", - get_field1(&c) - ); -} - -fn get_field1(c: &SomeStruct) -> f64 { - c.field1 -} -"#; - - let after = r#"/// This is a struct -struct SomeStruct { - field1: f64, - field2: f64, -} - -fn main() { - let c = SomeStruct { field1: 10.0, field2: 10.0 }; - - println!( - "Print field1 and field2 from SomeStruct {} {}", - get_field1(&c), get_field2(&c) - ); - println!("Print another line"); -} - -fn get_field1(c: &SomeStruct) -> f64 { - c.field1 -} - -fn get_field2(c: &SomeStruct) -> f64 { - c.field2 -} -"#; - use crate::blob::git_diff::ChangeKind; - - let expected = &[ - ChangeGroup { - before: 0..0, - after: 0..1, - change_kind: ChangeKind::Added, - }, - ChangeGroup { - before: 6..7, - after: 7..7, - change_kind: ChangeKind::RemovedBelow, - }, - ChangeGroup { - before: 10..12, - after: 10..12, - change_kind: ChangeKind::Modified, - }, - ChangeGroup { - before: 13..13, - after: 13..14, - change_kind: ChangeKind::Added, - }, - ChangeGroup { - before: 17..17, - after: 19..23, - change_kind: ChangeKind::Added, - }, - ]; - - let input = InternedInput::new(before, after); - let actual = gix_diff::blob::diff(Algorithm::Histogram, &input, GitDiff::new(&input)); - assert_eq!(actual, expected); - insta::assert_snapshot!(uni_diff_string(&input, actual), @r#" - @@ -1,1 +1,2 @@ - +/// This is a struct - struct SomeStruct { - @@ -6,3 +7,2 @@ - fn main() { - - // Some comment - let c = SomeStruct { field1: 10.0, field2: 10.0 }; - @@ -10,5 +10,6 @@ - println!( - - "Print field1 from SomeStruct {}", - - get_field1(&c) - + "Print field1 and field2 from SomeStruct {} {}", - + get_field1(&c), get_field2(&c) - ); - + println!("Print another line"); - } - @@ -17,2 +19,6 @@ - c.field1 - + - +fn get_field2(c: &SomeStruct) -> f64 { - + c.field2 - +} - } - "#); - - let standard_slider = gix_diff::blob::diff(Algorithm::Histogram, &input, uni_diff(&input))?; - insta::assert_snapshot!(standard_slider, @r#" - @@ -1,1 +1,2 @@ - +/// This is a struct - struct SomeStruct { - @@ -6,3 +7,2 @@ - fn main() { - - // Some comment - let c = SomeStruct { field1: 10.0, field2: 10.0 }; - @@ -10,5 +10,6 @@ - println!( - - "Print field1 from SomeStruct {}", - - get_field1(&c) - + "Print field1 and field2 from SomeStruct {} {}", - + get_field1(&c), get_field2(&c) - ); - + println!("Print another line"); - } - @@ -17,2 +18,6 @@ - c.field1 - +} - + - +fn get_field2(c: &SomeStruct) -> f64 { - + c.field2 - } - "#); - - let input = InternedInput::new(before.as_bytes(), after.as_bytes()); - let actual = gix_diff::blob::diff(Algorithm::Histogram, &input, GitDiff::new(&input)); - assert_eq!(actual, expected); - - Ok(()) -} - -fn uni_diff>(input: &InternedInput) -> UnifiedDiff<'_, T, String> { - UnifiedDiff::new( - input, - String::default(), - NewlineSeparator::AfterHeaderAndLine("\n"), - ContextSize::symmetrical(1), - ) -} - -fn uni_diff_string>(input: &InternedInput, changes: Vec) -> String { - let mut uni = uni_diff(input); - for change in changes { - let (before, after) = change.as_u32_ranges(); - uni.process_change(before, after); - } - uni.finish().expect("in-memory is infallible") -} diff --git a/gix-diff/tests/diff/blob/mod.rs b/gix-diff/tests/diff/blob/mod.rs index 49f1345a1de..1959c4e6fdb 100644 --- a/gix-diff/tests/diff/blob/mod.rs +++ b/gix-diff/tests/diff/blob/mod.rs @@ -1,4 +1,3 @@ -mod git_diff; pub(crate) mod pipeline; mod platform; mod unified_diff; From 828e9035a40796f79650cf5e3becb8d8e5e29883 Mon Sep 17 00:00:00 2001 From: Sebastian Thiel Date: Wed, 21 May 2025 09:55:59 +0200 Subject: [PATCH 074/166] feat!: Pattern parser in is now stateful to allow options for how to parse ignore patterns. That way it can support settings and other state that affect parsing. This affects various crates which are all marked as breaking now. --- gix-attributes/src/search/attributes.rs | 8 ++-- gix-glob/src/search/mod.rs | 12 ++++- gix-glob/src/search/pattern.rs | 10 ++-- gix-glob/tests/search/pattern.rs | 14 +++--- gix-ignore/src/lib.rs | 8 +++- gix-ignore/src/parse.rs | 11 ++++- gix-ignore/src/search.rs | 48 ++++++++++++++----- .../tests/{ignore.rs => ignore/main.rs} | 0 .../tests/{parse/mod.rs => ignore/parse.rs} | 28 +++++++---- .../tests/{search/mod.rs => ignore/search.rs} | 30 ++++++++---- gix-worktree/src/stack/state/ignore.rs | 18 +++++-- gix-worktree/src/stack/state/mod.rs | 2 + gix-worktree/tests/worktree/stack/ignore.rs | 9 ++-- tests/tools/src/lib.rs | 11 ++++- 14 files changed, 153 insertions(+), 56 deletions(-) rename gix-ignore/tests/{ignore.rs => ignore/main.rs} (100%) rename gix-ignore/tests/{parse/mod.rs => ignore/parse.rs} (79%) rename gix-ignore/tests/{search/mod.rs => ignore/search.rs} (87%) diff --git a/gix-attributes/src/search/attributes.rs b/gix-attributes/src/search/attributes.rs index 600c7d9765d..765aff06828 100644 --- a/gix-attributes/src/search/attributes.rs +++ b/gix-attributes/src/search/attributes.rs @@ -58,7 +58,8 @@ impl Search { ) -> std::io::Result { // TODO: should `Pattern` trait use an instance as first argument to carry this information // (so no `retain` later, it's slower than skipping) - let was_added = gix_glob::search::add_patterns_file(&mut self.patterns, source, follow_symlinks, root, buf)?; + let was_added = + gix_glob::search::add_patterns_file(&mut self.patterns, source, follow_symlinks, root, buf, Attributes)?; if was_added { let last = self.patterns.last_mut().expect("just added"); if !allow_macros { @@ -80,7 +81,8 @@ impl Search { collection: &mut MetadataCollection, allow_macros: bool, ) { - self.patterns.push(pattern::List::from_bytes(bytes, source, root)); + self.patterns + .push(pattern::List::from_bytes(bytes, source, root, Attributes)); let last = self.patterns.last_mut().expect("just added"); if !allow_macros { last.patterns @@ -124,7 +126,7 @@ impl Search { impl Pattern for Attributes { type Value = Value; - fn bytes_to_patterns(bytes: &[u8], _source: &std::path::Path) -> Vec> { + fn bytes_to_patterns(&self, bytes: &[u8], _source: &std::path::Path) -> Vec> { fn into_owned_assignments<'a>( attrs: impl Iterator, crate::name::Error>>, ) -> Option { diff --git a/gix-glob/src/search/mod.rs b/gix-glob/src/search/mod.rs index b6fb2a49025..1810c6cacc7 100644 --- a/gix-glob/src/search/mod.rs +++ b/gix-glob/src/search/mod.rs @@ -15,11 +15,12 @@ pub trait Pattern: Clone + PartialEq + Eq + std::fmt::Debug + std::hash::Hash + type Value: PartialEq + Eq + std::fmt::Debug + std::hash::Hash + Ord + PartialOrd + Clone; /// Parse all patterns in `bytes` line by line, ignoring lines with errors, and collect them. - fn bytes_to_patterns(bytes: &[u8], source: &Path) -> Vec>; + fn bytes_to_patterns(&self, bytes: &[u8], source: &Path) -> Vec>; } /// Add the given file at `source` if it exists, otherwise do nothing. /// If a `root` is provided, it's not considered a global file anymore. +/// `parse` is a way to parse bytes to pattern. /// Returns `true` if the file was added, or `false` if it didn't exist. pub fn add_patterns_file( patterns: &mut Vec>, @@ -27,8 +28,15 @@ pub fn add_patterns_file( follow_symlinks: bool, root: Option<&Path>, buf: &mut Vec, + parse: T, ) -> std::io::Result { let previous_len = patterns.len(); - patterns.extend(pattern::List::::from_file(source, root, follow_symlinks, buf)?); + patterns.extend(pattern::List::::from_file( + source, + root, + follow_symlinks, + buf, + parse, + )?); Ok(patterns.len() != previous_len) } diff --git a/gix-glob/src/search/pattern.rs b/gix-glob/src/search/pattern.rs index 54981651ecb..460de263e29 100644 --- a/gix-glob/src/search/pattern.rs +++ b/gix-glob/src/search/pattern.rs @@ -79,8 +79,9 @@ where /// `source_file` is the location of the `bytes` which represents a list of patterns, one pattern per line. /// If `root` is `Some(…)` it's used to see `source_file` as relative to itself, if `source_file` is absolute. /// If source is relative and should be treated as base, set `root` to `Some("")`. - pub fn from_bytes(bytes: &[u8], source_file: PathBuf, root: Option<&Path>) -> Self { - let patterns = T::bytes_to_patterns(bytes, source_file.as_path()); + /// `parse` is a way to parse bytes to pattern. + pub fn from_bytes(bytes: &[u8], source_file: PathBuf, root: Option<&Path>, parse: T) -> Self { + let patterns = parse.bytes_to_patterns(bytes, source_file.as_path()); let base = root .and_then(|root| source_file.parent().expect("file").strip_prefix(root).ok()) .and_then(|base| { @@ -101,14 +102,17 @@ where /// Create a pattern list from the `source` file, which may be located underneath `root`, while optionally /// following symlinks with `follow_symlinks`, providing `buf` to temporarily store the data contained in the file. + /// `parse` is a way to parse bytes to pattern. pub fn from_file( source: impl Into, root: Option<&Path>, follow_symlinks: bool, buf: &mut Vec, + parse: T, ) -> std::io::Result> { let source = source.into(); - Ok(read_in_full_ignore_missing(&source, follow_symlinks, buf)?.then(|| Self::from_bytes(buf, source, root))) + Ok(read_in_full_ignore_missing(&source, follow_symlinks, buf)? + .then(|| Self::from_bytes(buf, source, root, parse))) } } diff --git a/gix-glob/tests/search/pattern.rs b/gix-glob/tests/search/pattern.rs index cfdb410a67f..807277b31cd 100644 --- a/gix-glob/tests/search/pattern.rs +++ b/gix-glob/tests/search/pattern.rs @@ -15,7 +15,7 @@ mod list { impl Pattern for Dummy { type Value = (); - fn bytes_to_patterns(_bytes: &[u8], _source: &Path) -> Vec> { + fn bytes_to_patterns(&self, _bytes: &[u8], _source: &Path) -> Vec> { vec![] } } @@ -23,7 +23,7 @@ mod list { #[test] fn from_bytes_base() { { - let list = List::::from_bytes(&[], "a/b/source".into(), None); + let list = List::from_bytes(&[], "a/b/source".into(), None, Dummy); assert_eq!(list.base, None, "no root always means no-base, i.e. globals lists"); assert_eq!( list.source.as_deref(), @@ -34,7 +34,7 @@ mod list { { let cwd = std::env::current_dir().expect("cwd available"); - let list = List::::from_bytes(&[], cwd.join("a/b/source"), Some(cwd.as_path())); + let list = List::from_bytes(&[], cwd.join("a/b/source"), Some(cwd.as_path()), Dummy); assert_eq!( list.base.as_ref().expect("set"), "a/b/", @@ -48,7 +48,7 @@ mod list { } { - let list = List::::from_bytes(&[], "a/b/source".into(), Some(Path::new("c/"))); + let list = List::from_bytes(&[], "a/b/source".into(), Some(Path::new("c/")), Dummy); assert_eq!( list.base, None, "if root doesn't contain source, it silently skips it as base" @@ -63,7 +63,7 @@ mod list { #[test] fn strip_base_handle_recompute_basename_pos() { - let list = List::::from_bytes(&[], "a/b/source".into(), Some(Path::new(""))); + let list = List::from_bytes(&[], "a/b/source".into(), Some(Path::new("")), Dummy); assert_eq!( list.base.as_ref().expect("set"), "a/b/", @@ -91,7 +91,7 @@ mod list { Path::new(".").join("non-existing-dir").join("pattern-file"), Path::new("file").to_owned(), ] { - let list = List::::from_file(path, None, false, &mut buf).expect("no io error"); + let list = List::from_file(path, None, false, &mut buf, Dummy).expect("no io error"); assert!(list.is_none(), "the file does not exist"); } } @@ -102,7 +102,7 @@ mod list { let dir_path = tmp.path().join(".gitignore"); std::fs::create_dir(&dir_path)?; let mut buf = Vec::new(); - let list = List::::from_file(dir_path, None, false, &mut buf).expect("no io error"); + let list = List::from_file(dir_path, None, false, &mut buf, Dummy).expect("no io error"); assert!(list.is_none(), "directories are ignored just like Git does it"); Ok(()) diff --git a/gix-ignore/src/lib.rs b/gix-ignore/src/lib.rs index a9ba2351e3c..17501b0adc3 100644 --- a/gix-ignore/src/lib.rs +++ b/gix-ignore/src/lib.rs @@ -48,6 +48,10 @@ pub enum Kind { pub mod parse; /// Parse git ignore patterns, line by line, from `bytes`. -pub fn parse(bytes: &[u8]) -> parse::Lines<'_> { - parse::Lines::new(bytes) +/// +/// If `support_precious` is `true`, we will parse `$` prefixed entries as precious. +/// This is backward-incompatible as files that actually start with `$` like `$houdini` +/// will then not be ignored anymore, instead it ignores `houdini`. +pub fn parse(bytes: &[u8], support_precious: bool) -> parse::Lines<'_> { + parse::Lines::new(bytes, support_precious) } diff --git a/gix-ignore/src/parse.rs b/gix-ignore/src/parse.rs index cb53c456d94..a3057206b57 100644 --- a/gix-ignore/src/parse.rs +++ b/gix-ignore/src/parse.rs @@ -4,15 +4,22 @@ use bstr::ByteSlice; pub struct Lines<'a> { lines: bstr::Lines<'a>, line_no: usize, + /// Only if `true` we will be able to parse precious files. + support_precious: bool, } impl<'a> Lines<'a> { /// Create a new instance from `buf` to parse ignore patterns from. - pub fn new(buf: &'a [u8]) -> Self { + /// + /// If `support_precious` is `true`, we will parse `$` prefixed entries as precious. + /// This is backward-incompatible as files that actually start with `$` like `$houdini` + /// will then not be ignored anymore, instead it ignores `houdini`. + pub fn new(buf: &'a [u8], support_precious: bool) -> Self { let bom = unicode_bom::Bom::from(buf); Lines { lines: buf[bom.len()..].lines(), line_no: 0, + support_precious, } } } @@ -27,7 +34,7 @@ impl Iterator for Lines<'_> { Some(b'#') | None => continue, Some(c) => c, }; - let (kind, can_negate) = if first == b'$' { + let (kind, can_negate) = if self.support_precious && first == b'$' { line = &line[1..]; (crate::Kind::Precious, false) } else { diff --git a/gix-ignore/src/search.rs b/gix-ignore/src/search.rs index 9b5a2766b61..2b62b5797bd 100644 --- a/gix-ignore/src/search.rs +++ b/gix-ignore/src/search.rs @@ -21,15 +21,20 @@ pub struct Match<'a> { pub sequence_number: usize, } -/// An implementation of the [`Pattern`] trait for ignore patterns. -#[derive(PartialEq, Eq, Debug, Hash, Ord, PartialOrd, Clone, Default)] -pub struct Ignore; +/// An implementation of the [`Pattern`] trait for ignore-patterns. +#[derive(Default, PartialEq, Eq, Debug, Hash, Ord, PartialOrd, Clone, Copy)] +pub struct Ignore { + /// If `support_precious` is `true`, we will parse `$` prefixed entries as precious. + /// This is backward-incompatible as files that actually start with `$` like `$houdini` + /// will then not be ignored anymore, instead it ignores `houdini`. + pub support_precious: bool, +} impl Pattern for Ignore { type Value = crate::Kind; - fn bytes_to_patterns(bytes: &[u8], _source: &std::path::Path) -> Vec> { - crate::parse(bytes) + fn bytes_to_patterns(&self, bytes: &[u8], _source: &std::path::Path) -> Vec> { + crate::parse(bytes, self.support_precious) .map(|(pattern, line_number, kind)| pattern::Mapping { pattern, value: kind, @@ -44,14 +49,22 @@ impl Search { /// Given `git_dir`, a `.git` repository, load static ignore patterns from `info/exclude` /// and from `excludes_file` if it is provided. /// Note that it's not considered an error if the provided `excludes_file` does not exist. - pub fn from_git_dir(git_dir: &Path, excludes_file: Option, buf: &mut Vec) -> std::io::Result { + /// `parse` is a way to parse bytes to ignore patterns. + pub fn from_git_dir( + git_dir: &Path, + excludes_file: Option, + buf: &mut Vec, + parse: Ignore, + ) -> std::io::Result { let mut group = Self::default(); let follow_symlinks = true; // order matters! More important ones first. group.patterns.extend( excludes_file - .and_then(|file| pattern::List::::from_file(file, None, follow_symlinks, buf).transpose()) + .and_then(|file| { + pattern::List::::from_file(file, None, follow_symlinks, buf, parse).transpose() + }) .transpose()?, ); group.patterns.extend(pattern::List::::from_file( @@ -59,23 +72,25 @@ impl Search { None, follow_symlinks, buf, + parse, )?); Ok(group) } /// Parse a list of ignore patterns, using slashes as path separators. - pub fn from_overrides(patterns: impl IntoIterator>) -> Self { - Self::from_overrides_inner(&mut patterns.into_iter().map(Into::into)) + /// `parse` is a way to parse bytes to ignore patterns. + pub fn from_overrides(patterns: impl IntoIterator>, parse: Ignore) -> Self { + Self::from_overrides_inner(&mut patterns.into_iter().map(Into::into), parse) } - fn from_overrides_inner(patterns: &mut dyn Iterator) -> Self { + fn from_overrides_inner(patterns: &mut dyn Iterator, parse: Ignore) -> Self { Search { patterns: vec![pattern::List { patterns: patterns .enumerate() .filter_map(|(seq_id, pattern)| { let pattern = gix_path::try_into_bstr(PathBuf::from(pattern)).ok()?; - crate::parse(pattern.as_ref()) + crate::parse(pattern.as_ref(), parse.support_precious) .next() .map(|(p, _seq_id, kind)| pattern::Mapping { pattern: p, @@ -95,9 +110,16 @@ impl Search { impl Search { /// Add patterns as parsed from `bytes`, providing their `source` path and possibly their `root` path, the path they /// are relative to. This also means that `source` is contained within `root` if `root` is provided. - pub fn add_patterns_buffer(&mut self, bytes: &[u8], source: impl Into, root: Option<&Path>) { + /// Use `parse` to control how ignore patterns are parsed. + pub fn add_patterns_buffer( + &mut self, + bytes: &[u8], + source: impl Into, + root: Option<&Path>, + parse: Ignore, + ) { self.patterns - .push(pattern::List::from_bytes(bytes, source.into(), root)); + .push(pattern::List::from_bytes(bytes, source.into(), root, parse)); } } diff --git a/gix-ignore/tests/ignore.rs b/gix-ignore/tests/ignore/main.rs similarity index 100% rename from gix-ignore/tests/ignore.rs rename to gix-ignore/tests/ignore/main.rs diff --git a/gix-ignore/tests/parse/mod.rs b/gix-ignore/tests/ignore/parse.rs similarity index 79% rename from gix-ignore/tests/parse/mod.rs rename to gix-ignore/tests/ignore/parse.rs index 612a977a251..e3ee21ce4fd 100644 --- a/gix-ignore/tests/parse/mod.rs +++ b/gix-ignore/tests/ignore/parse.rs @@ -5,7 +5,7 @@ use gix_testtools::fixture_bytes; #[test] fn precious() { let input = fixture_bytes("ignore/precious.txt"); - let actual: Vec<_> = gix_ignore::parse(&input).map(flat_map).collect(); + let actual: Vec<_> = gix_ignore::parse(&input, true).map(flat_map).collect(); assert_eq!( actual, vec![ @@ -16,12 +16,24 @@ fn precious() { pat_precious("!/*", Mode::empty(), 12), ] ); + + let actual: Vec<_> = gix_ignore::parse(&input, false).map(flat_map).collect(); + assert_eq!( + actual, + vec![ + pat("$.config", Mode::NO_SUB_DIR, 1), + pat("$starts-with-dollar", Mode::NO_SUB_DIR, 2), + pat("$*.html", Mode::NO_SUB_DIR, 4), + pat("foo.html", Mode::NO_SUB_DIR | Mode::NEGATIVE, 6), + pat("$!/*", Mode::empty(), 12), + ] + ); } #[test] fn byte_order_marks_are_no_patterns() { assert_eq!( - flatten(gix_ignore::parse("\u{feff}hello".as_bytes()).next()), + flatten(gix_ignore::parse("\u{feff}hello".as_bytes(), false).next()), Some(pat(r"hello", Mode::NO_SUB_DIR, 1)) ); } @@ -29,7 +41,7 @@ fn byte_order_marks_are_no_patterns() { #[test] fn line_numbers_are_counted_correctly() { let input = fixture_bytes("ignore/various.txt"); - let actual: Vec<_> = gix_ignore::parse(&input).map(flat_map).collect(); + let actual: Vec<_> = gix_ignore::parse(&input, false).map(flat_map).collect(); assert_eq!( actual, vec![ @@ -47,7 +59,7 @@ fn line_numbers_are_counted_correctly() { #[test] fn line_endings_can_be_windows_or_unix() { assert_eq!( - gix_ignore::parse(b"unix\nwindows\r\nlast") + gix_ignore::parse(b"unix\nwindows\r\nlast", false) .map(flat_map) .collect::>(), vec![ @@ -60,14 +72,14 @@ fn line_endings_can_be_windows_or_unix() { #[test] fn comments_are_ignored_as_well_as_empty_ones() { - assert!(gix_ignore::parse(b"# hello world").next().is_none()); - assert!(gix_ignore::parse(b"\n\r\n\t\t \n").next().is_none()); + assert!(gix_ignore::parse(b"# hello world", false).next().is_none()); + assert!(gix_ignore::parse(b"\n\r\n\t\t \n", false).next().is_none()); } #[test] fn backslashes_before_hashes_are_no_comments() { assert_eq!( - flatten(gix_ignore::parse(br"\#hello").next()), + flatten(gix_ignore::parse(br"\#hello", false).next()), Some(pat(r"#hello", Mode::NO_SUB_DIR, 1)) ); } @@ -75,7 +87,7 @@ fn backslashes_before_hashes_are_no_comments() { #[test] fn trailing_spaces_can_be_escaped_to_be_literal() { fn parse_one(input: &str) -> (BString, Mode, usize, gix_ignore::Kind) { - let actual: Vec<_> = gix_ignore::parse(input.as_bytes()).map(flat_map).collect(); + let actual: Vec<_> = gix_ignore::parse(input.as_bytes(), false).map(flat_map).collect(); assert_eq!(actual.len(), 1, "{input:?} should match"); actual.into_iter().next().expect("present") } diff --git a/gix-ignore/tests/search/mod.rs b/gix-ignore/tests/ignore/search.rs similarity index 87% rename from gix-ignore/tests/search/mod.rs rename to gix-ignore/tests/ignore/search.rs index ee47c44803e..24b338ab72b 100644 --- a/gix-ignore/tests/search/mod.rs +++ b/gix-ignore/tests/ignore/search.rs @@ -46,11 +46,22 @@ fn baseline_from_git_dir() -> crate::Result { let baseline = std::fs::read(git_dir.parent().unwrap().join("git-check-ignore.baseline"))?; let mut buf = Vec::new(); let user_exclude = dir.join("user.exclude"); - let mut group = - gix_ignore::Search::from_git_dir(&git_dir, user_exclude.is_file().then_some(user_exclude), &mut buf)?; + let mut group = gix_ignore::Search::from_git_dir( + &git_dir, + user_exclude.is_file().then_some(user_exclude), + &mut buf, + Default::default(), + )?; assert!( - !gix_glob::search::add_patterns_file(&mut group.patterns, "not-a-file".into(), false, None, &mut buf)?, + !gix_glob::search::add_patterns_file( + &mut group.patterns, + "not-a-file".into(), + false, + None, + &mut buf, + Default::default() + )?, "missing files are no problem and cause a negative response" ); let mut ignore_file = repo_dir.join(".gitignore"); @@ -64,7 +75,8 @@ fn baseline_from_git_dir() -> crate::Result { ignore_file, true, repo_dir.as_path().into(), - &mut buf + &mut buf, + Default::default() )?, "existing files return true" ); @@ -72,7 +84,7 @@ fn baseline_from_git_dir() -> crate::Result { let ignore_file = repo_dir.join("dir-with-ignore").join(".gitignore"); if ignore_file.is_file() { let buf = std::fs::read(&ignore_file)?; - group.add_patterns_buffer(&buf, ignore_file, repo_dir.as_path().into()); + group.add_patterns_buffer(&buf, ignore_file, repo_dir.as_path().into(), Default::default()); } for (path, source_and_line) in (Expectations { @@ -116,7 +128,7 @@ fn baseline_from_git_dir() -> crate::Result { #[test] fn from_overrides_with_precious() { let input = ["$s?mple", "pattern/"]; - let group = gix_ignore::Search::from_overrides(input.iter()); + let group = gix_ignore::Search::from_overrides(input.iter(), gix_ignore::search::Ignore { support_precious: true }); assert_eq!( group.pattern_matching_relative_path("Simple".into(), None, gix_glob::pattern::Case::Fold), @@ -131,7 +143,7 @@ fn from_overrides_with_precious() { #[test] fn from_overrides_with_excludes() { - let group = gix_ignore::Search::from_overrides(["$simple", "!simple", "pattern/"]); + let group = gix_ignore::Search::from_overrides(["$simple", "!simple", "pattern/"], Default::default()); assert_eq!( group.pattern_matching_relative_path("Simple".into(), None, gix_glob::pattern::Case::Fold), Some(pattern_to_match( @@ -145,7 +157,7 @@ fn from_overrides_with_excludes() { #[test] fn from_overrides() { - let group = gix_ignore::Search::from_overrides(["simple", "pattern/"]); + let group = gix_ignore::Search::from_overrides(["simple", "pattern/"], Default::default()); assert_eq!( group.pattern_matching_relative_path("Simple".into(), None, gix_glob::pattern::Case::Fold), Some(pattern_to_match( @@ -164,7 +176,7 @@ fn from_overrides() { ); assert_eq!(group.patterns.len(), 1); assert_eq!( - gix_ignore::Search::from_overrides(["simple", "pattern/"]).patterns[0], + gix_ignore::Search::from_overrides(["simple", "pattern/"], Default::default()).patterns[0], group.patterns.into_iter().next().unwrap() ); } diff --git a/gix-worktree/src/stack/state/ignore.rs b/gix-worktree/src/stack/state/ignore.rs index 05c0f48d9f9..23a0b3a315c 100644 --- a/gix-worktree/src/stack/state/ignore.rs +++ b/gix-worktree/src/stack/state/ignore.rs @@ -9,6 +9,9 @@ use crate::{ PathIdMapping, }; +/// Specify how to parse ignore patterns. +pub use gix_ignore::search::Ignore as ParseIgnore; + /// Decide where to read `.gitignore` files from. #[derive(Default, Debug, Clone, Copy)] pub enum Source { @@ -55,11 +58,14 @@ impl Ignore { /// /// The `exclude_file_name_for_directories` is an optional override for the filename to use when checking per-directory /// ignore files within the repository, defaults to`.gitignore`. + /// + /// `parse` controls how to parse ignore files. pub fn new( overrides: IgnoreMatchGroup, globals: IgnoreMatchGroup, exclude_file_name_for_directories: Option<&BStr>, source: Source, + parse: gix_ignore::search::Ignore, ) -> Self { Ignore { overrides, @@ -69,6 +75,7 @@ impl Ignore { exclude_file_name_for_directories: exclude_file_name_for_directories .map_or_else(|| ".gitignore".into(), ToOwned::to_owned), source, + parse, } } } @@ -183,7 +190,7 @@ impl Ignore { .map_err(std::io::Error::other)?; let ignore_path = gix_path::from_bstring(ignore_path_relative.into_owned()); self.stack - .add_patterns_buffer(ignore_blob.data, ignore_path, Some(Path::new(""))); + .add_patterns_buffer(ignore_blob.data, ignore_path, Some(Path::new("")), self.parse); stats.patterns_buffers += 1; } Err(_) => { @@ -200,6 +207,7 @@ impl Ignore { follow_symlinks, Some(root), buf, + self.parse, )?; stats.pattern_files += usize::from(added); stats.tried_pattern_files += 1; @@ -210,8 +218,12 @@ impl Ignore { .find_blob(&id_mappings[idx].1, buf) .map_err(std::io::Error::other)?; let ignore_path = gix_path::from_bstring(ignore_path_relative.into_owned()); - self.stack - .add_patterns_buffer(ignore_blob.data, ignore_path, Some(Path::new(""))); + self.stack.add_patterns_buffer( + ignore_blob.data, + ignore_path, + Some(Path::new("")), + self.parse, + ); stats.patterns_buffers += 1; } Err(_) => { diff --git a/gix-worktree/src/stack/state/mod.rs b/gix-worktree/src/stack/state/mod.rs index be423623562..9b635723abb 100644 --- a/gix-worktree/src/stack/state/mod.rs +++ b/gix-worktree/src/stack/state/mod.rs @@ -47,6 +47,8 @@ pub struct Ignore { pub(crate) exclude_file_name_for_directories: BString, /// Where to read ignore files from source: ignore::Source, + /// Control how to parse ignore files. + parse: gix_ignore::search::Ignore, } /// diff --git a/gix-worktree/tests/worktree/stack/ignore.rs b/gix-worktree/tests/worktree/stack/ignore.rs index 03feec6c4ac..06d73402318 100644 --- a/gix-worktree/tests/worktree/stack/ignore.rs +++ b/gix-worktree/tests/worktree/stack/ignore.rs @@ -43,9 +43,10 @@ fn exclude_by_dir_is_handled_just_like_git() { Default::default(), gix_worktree::stack::state::Ignore::new( Default::default(), - gix_ignore::Search::from_git_dir(&git_dir, None, &mut buf).unwrap(), + gix_ignore::Search::from_git_dir(&git_dir, None, &mut buf, Default::default()).unwrap(), None, Source::WorktreeThenIdMappingIfNotSkipped, + Default::default(), ), ); let mut cache = Stack::new(&dir, state, case, buf, Default::default()); @@ -113,13 +114,15 @@ fn check_against_baseline() -> crate::Result { let case = probe_case()?; let mut index = gix_index::File::at(git_dir.join("index"), gix_hash::Kind::Sha1, false, Default::default())?; let odb = gix_odb::at(git_dir.join("objects"))?; + let parse_ignore = gix_ignore::search::Ignore::default(); let state = gix_worktree::stack::State::for_add( Default::default(), gix_worktree::stack::state::Ignore::new( - gix_ignore::Search::from_overrides(["!force-include"]), - gix_ignore::Search::from_git_dir(&git_dir, Some(user_exclude_path), &mut buf)?, + gix_ignore::Search::from_overrides(["!force-include"], parse_ignore), + gix_ignore::Search::from_git_dir(&git_dir, Some(user_exclude_path), &mut buf, parse_ignore)?, None, Source::WorktreeThenIdMappingIfNotSkipped, + parse_ignore, ), ); let paths_storage = index.take_path_backing(); diff --git a/tests/tools/src/lib.rs b/tests/tools/src/lib.rs index 8f04dc35cc3..caf882af5c8 100644 --- a/tests/tools/src/lib.rs +++ b/tests/tools/src/lib.rs @@ -74,9 +74,18 @@ static EXCLUDE_LUT: Lazy>> = Lazy::new(|| { }; let state = gix_worktree::stack::State::IgnoreStack(gix_worktree::stack::state::Ignore::new( Default::default(), - gix_worktree::ignore::Search::from_git_dir(&gix_dir, None, &mut buf).ok()?, + gix_worktree::ignore::Search::from_git_dir( + &gix_dir, + None, + &mut buf, + gix_worktree::stack::state::ignore::ParseIgnore { + support_precious: false, + }, + ) + .ok()?, None, gix_worktree::stack::state::ignore::Source::WorktreeThenIdMappingIfNotSkipped, + Default::default(), )); Some(gix_worktree::Stack::new( work_tree, From 85a24b3a07f08bc83a3ef34c3f07ed00cdbd9fe2 Mon Sep 17 00:00:00 2001 From: Sebastian Thiel Date: Wed, 21 May 2025 10:14:09 +0200 Subject: [PATCH 075/166] feat: add `gitoxide.parsePrecious` configuration key to opt-in to precious file parsing. --- gix/src/config/cache/access.rs | 11 ++++++++++- gix/src/config/cache/init.rs | 14 ++++++++++---- gix/src/config/mod.rs | 3 +++ gix/src/config/tree/sections/gitoxide.rs | 5 ++++- gix/tests/gix-init.rs | 2 ++ 5 files changed, 29 insertions(+), 6 deletions(-) diff --git a/gix/src/config/cache/access.rs b/gix/src/config/cache/access.rs index aa5b59f6f1a..c81abbbada5 100644 --- a/gix/src/config/cache/access.rs +++ b/gix/src/config/cache/access.rs @@ -396,11 +396,20 @@ impl Cache { Some(user_path) => Some(user_path), None => self.xdg_config_path("ignore")?, }; + let parse_ignore = gix_ignore::search::Ignore { + support_precious: boolean( + self, + "gitoxide.parsePrecious", + &config::tree::Gitoxide::PARSE_PRECIOUS, + false, + )?, + }; Ok(gix_worktree::stack::state::Ignore::new( overrides.unwrap_or_default(), - gix_ignore::Search::from_git_dir(git_dir, excludes_file, buf)?, + gix_ignore::Search::from_git_dir(git_dir, excludes_file, buf, parse_ignore)?, None, source, + parse_ignore, )) } // TODO: at least one test, maybe related to core.attributesFile configuration. diff --git a/gix/src/config/cache/init.rs b/gix/src/config/cache/init.rs index eca58a5cacf..0901f2d445a 100644 --- a/gix/src/config/cache/init.rs +++ b/gix/src/config/cache/init.rs @@ -357,10 +357,16 @@ fn apply_environment_overrides( "gitoxide", None, git_prefix, - &[{ - let key = &Gitoxide::TRACE_PACKET; - (env(key), key.name) - }], + &[ + { + let key = &Gitoxide::TRACE_PACKET; + (env(key), key.name) + }, + { + let key = &Gitoxide::PARSE_PRECIOUS; + (env(key), key.name) + }, + ], ), ( "gitoxide", diff --git a/gix/src/config/mod.rs b/gix/src/config/mod.rs index 41a00c56a48..ffcd31edf7b 100644 --- a/gix/src/config/mod.rs +++ b/gix/src/config/mod.rs @@ -239,6 +239,7 @@ pub mod command_context { /// pub mod exclude_stack { + use crate::config; use std::path::PathBuf; /// The error produced when setting up a stack to query `gitignore` information. @@ -251,6 +252,8 @@ pub mod exclude_stack { EnvironmentPermission(#[from] gix_sec::permission::Error), #[error("The value for `core.excludesFile` could not be read from configuration")] ExcludesFilePathInterpolation(#[from] gix_config::path::interpolate::Error), + #[error(transparent)] + ParsePreciousEnabled(#[from] config::boolean::Error), } } diff --git a/gix/src/config/tree/sections/gitoxide.rs b/gix/src/config/tree/sections/gitoxide.rs index af24cfac66a..ec97e2ffb22 100644 --- a/gix/src/config/tree/sections/gitoxide.rs +++ b/gix/src/config/tree/sections/gitoxide.rs @@ -36,6 +36,9 @@ impl Gitoxide { /// The `gitoxide.tracePacket` Key. pub const TRACE_PACKET: keys::Boolean = keys::Boolean::new_boolean("tracePacket", &config::Tree::GITOXIDE) .with_environment_override("GIT_TRACE_PACKET"); + /// The `gitoxide.parsePrecious` Key. + pub const PARSE_PRECIOUS: keys::Boolean = keys::Boolean::new_boolean("parsePrecious", &config::Tree::GITOXIDE) + .with_environment_override("GIX_PARSE_PRECIOUS"); } impl Section for Gitoxide { @@ -44,7 +47,7 @@ impl Section for Gitoxide { } fn keys(&self) -> &[&dyn Key] { - &[&Self::USER_AGENT, &Self::TRACE_PACKET] + &[&Self::USER_AGENT, &Self::TRACE_PACKET, &Self::PARSE_PRECIOUS] } fn sub_sections(&self) -> &[&dyn Section] { diff --git a/gix/tests/gix-init.rs b/gix/tests/gix-init.rs index a0eb77045db..6a63c719c55 100644 --- a/gix/tests/gix-init.rs +++ b/gix/tests/gix-init.rs @@ -52,6 +52,7 @@ mod with_overrides { .set("GIT_AUTHOR_DATE", default_date) .set("EMAIL", "user email") .set("GIX_PACK_CACHE_MEMORY", "0") + .set("GIX_PARSE_PRECIOUS", "1") .set("GIX_OBJECT_CACHE_MEMORY", "5m") .set("GIX_CREDENTIALS_HELPER_STDERR", "creds-stderr") .set("GIX_EXTERNAL_COMMAND_STDERR", "filter-stderr") @@ -244,6 +245,7 @@ mod with_overrides { ("gitoxide.commit.authorDate", default_date), ("gitoxide.commit.committerDate", default_date), ("gitoxide.user.emailFallback", "user email"), + ("gitoxide.parsePrecious", "1"), ("core.deltaBaseCacheLimit", "0"), ("gitoxide.objects.cacheLimit", "5m"), ("gitoxide.pathspec.icase", "pathspecs-icase"), From 4ef7806e62954d069861bddb06cb8c0baf47bb69 Mon Sep 17 00:00:00 2001 From: Sebastian Thiel Date: Wed, 21 May 2025 09:57:01 +0200 Subject: [PATCH 076/166] adapt to changes in `gix-ignore` and `gix-glob`, and more. --- gitoxide-core/src/repository/exclude.rs | 5 ++++- gix-dir/tests/walk_utils/mod.rs | 1 + .../tests/{driver/mod.rs => filter/driver.rs} | 0 .../tests/{ => filter}/eol/convert_to_git.rs | 0 .../{ => filter}/eol/convert_to_worktree.rs | 0 gix-filter/tests/{ => filter}/eol/mod.rs | 0 .../tests/{ident/mod.rs => filter/ident.rs} | 0 .../tests/{filter.rs => filter/main.rs} | 0 .../{ => filter}/pipeline/convert_to_git.rs | 0 .../pipeline/convert_to_worktree.rs | 0 gix-filter/tests/{ => filter}/pipeline/mod.rs | 1 + .../{worktree/mod.rs => filter/worktree.rs} | 0 gix/src/config/cache/access.rs | 21 ++++++++++++------- gix/src/repository/config/mod.rs | 9 ++++++++ 14 files changed, 28 insertions(+), 9 deletions(-) rename gix-filter/tests/{driver/mod.rs => filter/driver.rs} (100%) rename gix-filter/tests/{ => filter}/eol/convert_to_git.rs (100%) rename gix-filter/tests/{ => filter}/eol/convert_to_worktree.rs (100%) rename gix-filter/tests/{ => filter}/eol/mod.rs (100%) rename gix-filter/tests/{ident/mod.rs => filter/ident.rs} (100%) rename gix-filter/tests/{filter.rs => filter/main.rs} (100%) rename gix-filter/tests/{ => filter}/pipeline/convert_to_git.rs (100%) rename gix-filter/tests/{ => filter}/pipeline/convert_to_worktree.rs (100%) rename gix-filter/tests/{ => filter}/pipeline/mod.rs (98%) rename gix-filter/tests/{worktree/mod.rs => filter/worktree.rs} (100%) diff --git a/gitoxide-core/src/repository/exclude.rs b/gitoxide-core/src/repository/exclude.rs index 608d81bd949..eba046cccc6 100644 --- a/gitoxide-core/src/repository/exclude.rs +++ b/gitoxide-core/src/repository/exclude.rs @@ -37,7 +37,10 @@ pub fn query( let index = repo.index()?; let mut cache = repo.excludes( &index, - Some(gix::ignore::Search::from_overrides(overrides.into_iter())), + Some(gix::ignore::Search::from_overrides( + overrides.into_iter(), + repo.ignore_pattern_parser()?, + )), Default::default(), )?; diff --git a/gix-dir/tests/walk_utils/mod.rs b/gix-dir/tests/walk_utils/mod.rs index cbf61634249..878819c433e 100644 --- a/gix-dir/tests/walk_utils/mod.rs +++ b/gix-dir/tests/walk_utils/mod.rs @@ -330,6 +330,7 @@ pub fn try_collect_filtered_opts( Default::default(), None, gix_worktree::stack::state::ignore::Source::WorktreeThenIdMappingIfNotSkipped, + gix_ignore::search::Ignore { support_precious: true }, )), &index, index.path_backing(), diff --git a/gix-filter/tests/driver/mod.rs b/gix-filter/tests/filter/driver.rs similarity index 100% rename from gix-filter/tests/driver/mod.rs rename to gix-filter/tests/filter/driver.rs diff --git a/gix-filter/tests/eol/convert_to_git.rs b/gix-filter/tests/filter/eol/convert_to_git.rs similarity index 100% rename from gix-filter/tests/eol/convert_to_git.rs rename to gix-filter/tests/filter/eol/convert_to_git.rs diff --git a/gix-filter/tests/eol/convert_to_worktree.rs b/gix-filter/tests/filter/eol/convert_to_worktree.rs similarity index 100% rename from gix-filter/tests/eol/convert_to_worktree.rs rename to gix-filter/tests/filter/eol/convert_to_worktree.rs diff --git a/gix-filter/tests/eol/mod.rs b/gix-filter/tests/filter/eol/mod.rs similarity index 100% rename from gix-filter/tests/eol/mod.rs rename to gix-filter/tests/filter/eol/mod.rs diff --git a/gix-filter/tests/ident/mod.rs b/gix-filter/tests/filter/ident.rs similarity index 100% rename from gix-filter/tests/ident/mod.rs rename to gix-filter/tests/filter/ident.rs diff --git a/gix-filter/tests/filter.rs b/gix-filter/tests/filter/main.rs similarity index 100% rename from gix-filter/tests/filter.rs rename to gix-filter/tests/filter/main.rs diff --git a/gix-filter/tests/pipeline/convert_to_git.rs b/gix-filter/tests/filter/pipeline/convert_to_git.rs similarity index 100% rename from gix-filter/tests/pipeline/convert_to_git.rs rename to gix-filter/tests/filter/pipeline/convert_to_git.rs diff --git a/gix-filter/tests/pipeline/convert_to_worktree.rs b/gix-filter/tests/filter/pipeline/convert_to_worktree.rs similarity index 100% rename from gix-filter/tests/pipeline/convert_to_worktree.rs rename to gix-filter/tests/filter/pipeline/convert_to_worktree.rs diff --git a/gix-filter/tests/pipeline/mod.rs b/gix-filter/tests/filter/pipeline/mod.rs similarity index 98% rename from gix-filter/tests/pipeline/mod.rs rename to gix-filter/tests/filter/pipeline/mod.rs index 8c9d8fffcb1..fe42785a52d 100644 --- a/gix-filter/tests/pipeline/mod.rs +++ b/gix-filter/tests/filter/pipeline/mod.rs @@ -38,6 +38,7 @@ fn attribute_cache(name: &str) -> gix_testtools::Result { Default::default(), None, gix_worktree::stack::state::ignore::Source::WorktreeThenIdMappingIfNotSkipped, + Default::default(), ), ), Case::Sensitive, diff --git a/gix-filter/tests/worktree/mod.rs b/gix-filter/tests/filter/worktree.rs similarity index 100% rename from gix-filter/tests/worktree/mod.rs rename to gix-filter/tests/filter/worktree.rs diff --git a/gix/src/config/cache/access.rs b/gix/src/config/cache/access.rs index c81abbbada5..433efa26e9a 100644 --- a/gix/src/config/cache/access.rs +++ b/gix/src/config/cache/access.rs @@ -384,6 +384,18 @@ impl Cache { }) } + #[cfg(feature = "excludes")] + pub(crate) fn ignore_pattern_parser(&self) -> Result { + Ok(gix_ignore::search::Ignore { + support_precious: boolean( + self, + "gitoxide.parsePrecious", + &config::tree::Gitoxide::PARSE_PRECIOUS, + false, + )?, + }) + } + #[cfg(feature = "excludes")] pub(crate) fn assemble_exclude_globals( &self, @@ -396,14 +408,7 @@ impl Cache { Some(user_path) => Some(user_path), None => self.xdg_config_path("ignore")?, }; - let parse_ignore = gix_ignore::search::Ignore { - support_precious: boolean( - self, - "gitoxide.parsePrecious", - &config::tree::Gitoxide::PARSE_PRECIOUS, - false, - )?, - }; + let parse_ignore = self.ignore_pattern_parser()?; Ok(gix_worktree::stack::state::Ignore::new( overrides.unwrap_or_default(), gix_ignore::Search::from_git_dir(git_dir, excludes_file, buf, parse_ignore)?, diff --git a/gix/src/repository/config/mod.rs b/gix/src/repository/config/mod.rs index 1658a59a125..93e91b7ae8a 100644 --- a/gix/src/repository/config/mod.rs +++ b/gix/src/repository/config/mod.rs @@ -48,6 +48,15 @@ impl crate::Repository { self.config.big_file_threshold() } + /// Create a low-level parser for ignore patterns, for instance for use in [`excludes()`](crate::Repository::excludes()). + /// + /// Depending on the configuration, precious-file parsing in `.gitignore-files` is supported. + /// This means that `$` prefixed files will be interpreted as precious, which is a backwards-incompatible change. + #[cfg(feature = "excludes")] + pub fn ignore_pattern_parser(&self) -> Result { + self.config.ignore_pattern_parser() + } + /// Obtain options for use when connecting via `ssh`. #[cfg(feature = "blocking-network-client")] pub fn ssh_connect_options( From 1df1ebb34dd3e2101d8a112dda66f6bac5261ea7 Mon Sep 17 00:00:00 2001 From: Sebastian Thiel Date: Wed, 21 May 2025 11:02:02 +0200 Subject: [PATCH 077/166] feat: 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`. --- src/plumbing/main.rs | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/plumbing/main.rs b/src/plumbing/main.rs index 894b4e2031a..fe111b065cf 100644 --- a/src/plumbing/main.rs +++ b/src/plumbing/main.rs @@ -118,6 +118,16 @@ pub fn main() -> Result<()> { .append_config(config.iter(), gix::config::Source::Cli) .context("Unable to parse command-line configuration")?; } + { + let mut config_mut = repo.config_snapshot_mut(); + // Enable precious file parsing unless the user made a choice. + if config_mut + .boolean(gix::config::tree::Gitoxide::PARSE_PRECIOUS) + .is_none() + { + config_mut.set_raw_value(&gix::config::tree::Gitoxide::PARSE_PRECIOUS, "true")?; + } + } Ok(repo) } }; From 0d27a32dbf907482198b43b8a78714f7e2faa72b Mon Sep 17 00:00:00 2001 From: Sebastian Thiel Date: Wed, 20 Nov 2024 09:13:20 +0100 Subject: [PATCH 078/166] add the progress report for May 2025 --- etc/reports/25-05.md | 59 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 etc/reports/25-05.md diff --git a/etc/reports/25-05.md b/etc/reports/25-05.md new file mode 100644 index 00000000000..96145f8df76 --- /dev/null +++ b/etc/reports/25-05.md @@ -0,0 +1,59 @@ +This month is hard to characterize in terms of progress, but there certainly was some activity to write about. + +## The RustWeek: Unconf + +Christoph Rüßler and I got an invitation to the RustConf in Utrecht, allowing us to participate in the "Critical Infrastructure" group. The city is great, and it's easy to reach the location, overall, particularly because the Amsterdam Airport has a direct connection to Utrecht by train. That way I managed to get there at 8:57am in the morning by plane :D (I just had to get up at 2:30am to make it to the airport in Berlin which is much harder to reach). + +The first day was full of session and the most relevant topic, to me, certainly was sustainable open source development. There was one crucial session about this with a lot of valuable insights being shared. Everything I got from that and other sessions can be found [in this discussion](https://github.com/GitoxideLabs/gitoxide/discussions/2015). + +Was there any specific outcome? Frankly, I don't know as I did not feel that I can contribute anything of substance and quickly decided to roam around to meet and see people. + +On the second day I had a crucial conversation with Erik and Folkert from the Trifecta Foundation to see how a Sovereign Tech Fund application could benefit `gitoxide` and `zlib-rs`. Let's just say that I really, *really* want to finish this application now to accelerate `gitoxide` development. + +## Precious Files - now opt-in + +As you may recall, `gix clean` proudly respects precious files, a feature I simply don't want to live without anymore. Previously it was enabled by default because it was deemed unlikely this is ever going to cause trouble. But trouble did it cause nonetheless. + +The reason for this is simple: those who wanted to ignore a certain `$houdini` folder, a folder that isn't easy to interact with in a typical bash thanks to the `$` prefix, would put `$houdini` into their `.gitignore`. Git will now ignore the folder, and all is well. Any `gitoxide` powered application though would see `$`, and act like `houdini` is precious. This would lead to the side effect that `$houdini` wasn't actually ignored. + +This was fixed by deactivating parser support for this by default, while allowing to enable it with the `gitoxide.parsePrecious` configuration variable, or alternatively, by setting `GIX_PARSE_PRECIOUS=1`. + +`gix` - the CLI - will of course still parse precious files by default, but it's trivially turned off by the means above. + +## Round-Tripping for Author and Committer in Commits + +Thanks to Pierre Chevalier it became evident that parsing some commits and re-serialising them didn't produce the same result as the parsing was lossy. Thus, the conversion from bytes-buffer to `CommitRef` to `Commit` and back to bytes wasn't producing the same byte buffer as one might hope. + +The solution was to clearly define the properties of the `*Ref` object types, as possibly leniently parsed objects which also do their best to be lossless. Only during deserialization will we leniently decode them, and possibly loose information in the process. + +This also means that now generally the conversion from bytes-buffer to `CommitRef` and back to a bytes-buffer is lossless, as long as one doesn't involve the owned `Commit` type. + +Doing so also meant that the `gix_date::Time` structure could finally be relieved of its `sign` field, a left-over of the times when decoded types had to try to be as lossless as possible. + +It's notable that file-modes in trees are still decoded while trying to deal with one particular quirk even in the decoded form. There is probably no need to change that, but if things get more complex it should be possible to apply the same 'technique' to the `TreeRef` as well. I do have hope though that this won't ever be necessary. + +## Community + +### Gix Blame - as correct as it gets without rename tracking + +There has been some work by Christoph Rüßler which led to `gix blame` to finally be as correct as it gets, thanks to one bugfix which, now that I look at it, somehow hasn't landed yet. + +In theory though, in conjunction with ongoing community-work to bring Git-style hunk post-processing, blamed files that don't require rename tracking should come out exactly like the ones in Git, at comparable, albeit still slower, speeds. + +And what's best is that more work is on the way which makes the implementation more cache-friendly. That way duplicate computation can be avoided on a per-file basis which should help tooling tremendously. Imagine a tool drilling into the history of a single file, allowing to go back and forth in history fluently as it only recomputes what's needed between checkpoints. + +This also means that it would *just* need to deal with rename tracking to achieve Git-level quality - that day can't come soon enough. + +### Gix in Cargo + +Thanks to the Unconf I could drop in on the Cargo team swiftly talked myself into relieving my guilty conscience by finally integrating `gix statu` into `cargo package`. +[The PR](https://github.com/rust-lang/cargo/pull/15534) was brought up a couple of hours later and finished (in its first revision) just two days later. +And I think `gitoxide` can be very impactful there as the implementation will fix a couple of long-standing [performance](https://github.com/rust-lang/cargo/issues/14955) +and correctness issues (particularly the one I have been seeing with ignored files being considered dirty). + +This also means the next step for Cargo can be taken once there is a `git reset` implementation, something I'd expect to improve the performance of checkouts of Git dependencies. + +Cheers +Sebastian + +PS: The latest timesheets can be found [here (2025)](https://github.com/Byron/byron/blob/main/timesheets/2025.csv). \ No newline at end of file From cca22e205f0414a727639af97ca12e7c3cab0280 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christoph=20R=C3=BC=C3=9Fler?= Date: Thu, 22 May 2025 21:10:21 +0200 Subject: [PATCH 079/166] Add test for blame in sub-directory --- gix-blame/tests/blame.rs | 2 ++ gix-blame/tests/fixtures/make_blame_repo.sh | 12 ++++++++++++ 2 files changed, 14 insertions(+) diff --git a/gix-blame/tests/blame.rs b/gix-blame/tests/blame.rs index 99e5105f6df..a4535b0eaf1 100644 --- a/gix-blame/tests/blame.rs +++ b/gix-blame/tests/blame.rs @@ -229,6 +229,8 @@ mktest!(added_line_before_changed_line, "added-line-before-changed-line", 3); mktest!(same_line_changed_twice, "same-line-changed-twice", 2); mktest!(coalesce_adjacent_hunks, "coalesce-adjacent-hunks", 1); +mktest!(sub_directory, "sub-directory/sub-directory", 3); + mktest!(resolved_conflict, "resolved-conflict", 2); mktest!(file_in_one_chain_of_ancestors, "file-in-one-chain-of-ancestors", 1); mktest!( diff --git a/gix-blame/tests/fixtures/make_blame_repo.sh b/gix-blame/tests/fixtures/make_blame_repo.sh index fe5ca4f1af0..bbe764e1aa6 100755 --- a/gix-blame/tests/fixtures/make_blame_repo.sh +++ b/gix-blame/tests/fixtures/make_blame_repo.sh @@ -54,6 +54,11 @@ git add same-line-changed-twice.txt git add coalesce-adjacent-hunks.txt git commit -q -m c2.4 +mkdir sub-directory +echo -e "line 1\nline 2" > sub-directory/sub-directory.txt +git add sub-directory/sub-directory.txt +git commit -q -m c2.5 + echo "line 3" >> simple.txt git add simple.txt git commit -q -m c3 @@ -105,6 +110,10 @@ cp empty-lines-histogram.txt empty-lines-myers.txt git add empty-lines-histogram.txt empty-lines-myers.txt git commit -q -m c4.5 +echo -e "line 0\nline 2\nline 3" > sub-directory/sub-directory.txt +git add sub-directory/sub-directory.txt +git commit -q -m c4.6 + echo -e "line 0\nline 1\nline 2" > added-lines.txt echo -e "line 0\nline 1\nline 2\nline 3" > added-lines-around.txt git add added-lines.txt @@ -241,6 +250,9 @@ git blame --porcelain added-line-before-changed-line.txt > .git/added-line-befor git blame --porcelain same-line-changed-twice.txt > .git/same-line-changed-twice.baseline git blame --porcelain coalesce-adjacent-hunks.txt > .git/coalesce-adjacent-hunks.baseline +mkdir .git/sub-directory +git blame --porcelain sub-directory/sub-directory.txt > .git/sub-directory/sub-directory.baseline + git blame --porcelain resolved-conflict.txt > .git/resolved-conflict.baseline git blame --porcelain file-in-one-chain-of-ancestors.txt > .git/file-in-one-chain-of-ancestors.baseline git blame --porcelain different-file-in-another-chain-of-ancestors.txt > .git/different-file-in-another-chain-of-ancestors.baseline From a943e363e8a99abda0b678557540d5e41d19901f Mon Sep 17 00:00:00 2001 From: Eliah Kagan Date: Sat, 24 May 2025 11:02:48 -0400 Subject: [PATCH 080/166] Remove `check-msrv-on-ci` rule in `Makefile` Because it was equivalent to the `ci-check-msrv` recipe in the `justfile`, and only the latter is used. For details, see: https://github.com/GitoxideLabs/gitoxide/pull/2003#discussion_r2081002861 --- Makefile | 5 ----- 1 file changed, 5 deletions(-) diff --git a/Makefile b/Makefile index 431c041979d..87d3a3cef5a 100644 --- a/Makefile +++ b/Makefile @@ -124,11 +124,6 @@ stress-commitgraph: release-lean $(commit_graphs) bench-gix-config: cd gix-config && cargo bench -check-msrv-on-ci: ## Check the minimal support rust version for currently installed Rust version - rustc --version - cargo build --locked --package gix - cargo build --locked --package gix --no-default-features --features async-network-client,max-performance - ##@ Maintenance baseline_asset_dir = gix/src/assets/baseline-init From a8476e1da92cf69e37d4218cebb0c16e0d6da22a Mon Sep 17 00:00:00 2001 From: Eliah Kagan Date: Sat, 24 May 2025 15:59:19 -0400 Subject: [PATCH 081/166] Simplify and speed up metadata query for journey tests The journey tests need to know where the target directory is. For robustness, we have not been assuming it is `target`, but instead attempting to allow it to be in any location, and querying cargo metadata to find out where it is. (Doing so has the effect of taking care of resolving it to an absolute path, too.) This preserves that, and continues to use `justfile` logic to find it, but does so in a more streamlined way: - Pass `--no-deps` to `cargo metadata`, since dependencies should not affect the location of the target directory. - In the `jq` command that processes `cargo metadata` output, pass `-e`/`--exit-status` so `jq` reports a failing status if the query fails (such as by attempting to look up a missing key, due to `cargo metadata` having failed or otherwise not producing the expected kind of output). - For `jq`, express `-r` as `--raw-output (and `-e` as `--exit-status`) so that the meaning is more readily clear. - Extract a generalized `cargo metadata ... | jq ...` recipe with the flags we're using on both commands. This is parameterized on the `jq` query argument only. This is to make the code easier to read, and also in anticipation of other uses that would also want those flags and no others but with different query strings (such as to extract the MSRV). And removes checks that are now unnecessary: - Don't do a separate check for empty `jq` output anymore, since the goal is to check for an absent key (or totally empty input), and `-e`/`--exit-status` takes care of that. - Don't repeat `dbg` as a prerequisite for the journey test recipes that rely on it, instead allowing the recipes to proceed until they get to where they really use it (which is by interpolation), because `--no-deps` should avoid any major delays at this point as well as making failure unlikely (but if it does fail, that is still checked and will still fail the recipe). --- justfile | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/justfile b/justfile index 7f5c71dd24a..86a9008b085 100755 --- a/justfile +++ b/justfile @@ -184,34 +184,36 @@ unit-tests: unit-tests-flaky: cargo test -p gix --features async-network-client-async-std -# Depend on this to pre-generate metadata, and/or use it inside a recipe as `"$({{ j }} dbg)"` +# Extract cargo metadata, excluding dependencies, and query it +[private] +get-metadata jq-query: + cargo metadata --format-version 1 | jq --exit-status --raw-output -- {{ quote(jq-query) }} + +# Get the path to the directory where debug binaries are created during builds [private] dbg: - set -eu; \ - target_dir="$(cargo metadata --format-version 1 | jq -r .target_directory)"; \ - test -n "$target_dir"; \ - echo "$target_dir/debug" + target_dir="$({{ j }} get-metadata .target_directory)" && echo "$target_dir/debug" # Run journey tests (`max`) -journey-tests: dbg +journey-tests: cargo build --features http-client-curl-rustls cargo build -p gix-testtools --bin jtt dbg="$({{ j }} dbg)" && tests/journey.sh "$dbg/ein" "$dbg/gix" "$dbg/jtt" max # Run journey tests (`max-pure`) -journey-tests-pure: dbg +journey-tests-pure: cargo build --no-default-features --features max-pure cargo build -p gix-testtools --bin jtt dbg="$({{ j }} dbg)" && tests/journey.sh "$dbg/ein" "$dbg/gix" "$dbg/jtt" max-pure # Run journey tests (`small`) -journey-tests-small: dbg +journey-tests-small: cargo build --no-default-features --features small cargo build -p gix-testtools dbg="$({{ j }} dbg)" && tests/journey.sh "$dbg/ein" "$dbg/gix" "$dbg/jtt" small # Run journey tests (`lean-async`) -journey-tests-async: dbg +journey-tests-async: cargo build --no-default-features --features lean-async cargo build -p gix-testtools dbg="$({{ j }} dbg)" && tests/journey.sh "$dbg/ein" "$dbg/gix" "$dbg/jtt" async From 654a8fa1a84ac0b9b872aa09b4cbd3cf94157d6f Mon Sep 17 00:00:00 2001 From: Eliah Kagan Date: Sat, 24 May 2025 18:15:04 -0400 Subject: [PATCH 082/166] Use `gix` manifest `rust-version` in all MSRV checks This makes the `rust-version` in the manifest file for the `gix` crate the single source of truth for the MSRV. CI checks use this rather than relying on a separate copy of the MSRV. The MSRV badge still hard-codes the MSRV (in four places in its SVG code), but a recipe is added to regenerate it based on the MSRV, and a CI check is added to verify that it agrees with the MSRV. Specifically, the changes are: 1. Add an `msrv` recipe to the `justfile` that extracts the MSRV from the value of `rust-version` in the `gix` package, using `cargo metadata` and `jq`, and that formats it in the X.Y.Z form (since that form is slightly more widely usable than the X.Y form even when Z is 0). 2. Remove the hard-coded MSRV in `msrv.yml` (in `env.RUST_VERSION`) and instead have the `check-msrv` job in `msrv.yml` get it from the `gix` manifest by callig `just msrv`. This fixes the problem that it was possible to forget to update the MSRV in the workflow. 3. Replace the `ci-check-msrv` recipe in the `justfile` with a `check-rust-version` recipe taking a `rust-version` argument. Instead of implicitly using the current default toolchain and relying on that being the MSRV, this explicitly runs its `rustc` and `cargo` commands with the specified `rust-version`. The `check-msrv` CI job now calls this, passing the MSRV. The reason to have a `check-rust-version` recipe instead of a `check-msrv` recipe (or both recipes with the latter delegating to the former) is that CI usage, as well as other anticipated usage, involves performing additional operations between finding out the MSRV and attempting to build with it: - At least on CI, it is clearer to install the needed toolchains before using them, even though specifying them explicitly in `rustc` or `cargo` commands will try to install them. - More importantly, on CI and locally, the `check-rust-version` recipe is not currently expected to work with the MSRV when the committed version of `Cargo.lock` is used, because some locked dependencies may have later MSRVs. Depending on precisely what one is testing, one could temporarily remove `Cargo.lock` and regenerate it using the MSRV toolchain, or (as done on CI) temporarily downgrade the versions in `Cargo.lock`. 4. Add an `msrv-badge` recipe to the `justfile` that regenerates the MSRV badge `etc/msrv-badge.yml` based on the MSRV from the `gix` manifest, as obtained via `just msrv`. This uses a template file, added alongside the badge, where each place where the MSRV should appear has a literal placeholder `{MSRV}` instead. `just msrv-badge` copies the template, with the actual MSRV value subtituted for the placeholders, to the badge, overwriting whatever is there. 5. Add a `check-msrv-badge` job to `msrv.yml` that checks out the code, runs `just msrv-badge`, and checks if there are any changes. If so, the committed badge is out of date. 6. Add an `msrv-pass` job to `msrv.yml` that depends on the `check-msrv` and `check-msrv-badge` jobs. This is analogous to the `tests-pass` job in `ci.yml`. It is so that, if having the MSRV badge out of date should block PR auto-merge, then that can be achieved without `msrv.yml` having to contribute more than one required check to the branch protection rules. (This also temporarily adds a `check-msrv` job for `macos-15`, but that is just to verify that recent `justfile` changes are portable. It will be removed shortly.) --- .github/workflows/ci.yml | 4 +-- .github/workflows/msrv.yml | 52 ++++++++++++++++++++++++++++++------- etc/msrv-badge.template.svg | 21 +++++++++++++++ gix/Cargo.toml | 2 ++ justfile | 39 ++++++++++++++++++++-------- 5 files changed, 95 insertions(+), 23 deletions(-) create mode 100644 etc/msrv-badge.template.svg diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 8728d06747f..5e545f4429f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -487,7 +487,7 @@ jobs: sort -m blocking-jobs.txt expected-nonblocking-jobs.txt | diff --color=always -U1000 - all-jobs.txt - # Dummy job to have a stable name for the "all tests pass" requirement + # Dummy job to have a stable name for the "all tests pass" requirement. tests-pass: name: Tests pass @@ -504,7 +504,7 @@ jobs: - check-packetline - check-blocking - if: always() # always run even if dependencies fail + if: always() # Always run even if dependencies fail. runs-on: ubuntu-latest diff --git a/.github/workflows/msrv.yml b/.github/workflows/msrv.yml index 2d7043d113a..9de262bf84b 100644 --- a/.github/workflows/msrv.yml +++ b/.github/workflows/msrv.yml @@ -25,25 +25,57 @@ jobs: os: - windows-2022 - ubuntu-latest + - macos-15 # FIXME(portability): Remove after testing new justfile changes. runs-on: ${{ matrix.os }} - env: - # This is dictated by `firefox` to support the `helix` editor, but now probably effectively - # be controlled by `jiff`, which also aligns with `regex`. - # IMPORTANT: When adjusting, change all occurrences in `etc/msrv-badge.svg` as well. - RUST_VERSION: 1.75.0 + defaults: + run: + shell: bash # Use `bash` even in the Windows job. steps: - uses: actions/checkout@v4 - uses: extractions/setup-just@v3 - - name: Set up ${{ env.RUST_VERSION }} (MSRV) and nightly toolchains - run: rustup toolchain install ${{ env.RUST_VERSION }} nightly --profile minimal --no-self-update - - name: Set ${{ env.RUST_VERSION }} (MSRV) as default - run: rustup default ${{ env.RUST_VERSION }} + - name: Read the MSRV + run: | + msrv="$(just msrv)" + echo "MSRV=$msrv" >> "$GITHUB_ENV" + - name: Set up MSRV and nightly toolchains + run: | + rustup toolchain install "$MSRV" nightly --profile minimal --no-self-update - name: Downgrade locked dependencies to lowest allowed versions run: | # TODO(msrv): Use `cargo update --minimal-versions` when `--minimal-versions` is available. cargo +nightly update -Zminimal-versions - name: Run some `cargo build` commands on `gix` - run: just ci-check-msrv + run: just check-rust-version "$MSRV" + + check-msrv-badge: + name: Check MSRV badge + + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + - uses: extractions/setup-just@v3 + - name: Regenerate the MSRV badge + run: just msrv-badge + - name: Check for changes + run: git diff --exit-code + + # Dummy job to have a stable name for the requirement that all MSRV tests pass. + msrv-pass: + name: MSRV checks pass + + needs: [ check-msrv, check-msrv-badge ] + + if: always() # Always run even if dependencies fail. + + runs-on: ubuntu-latest + + steps: + - name: Fail if ANY dependency has failed or cancelled + if: contains(needs.*.result, 'failure') || contains(needs.*.result, 'cancelled') + run: exit 1 + - name: OK + run: exit 0 diff --git a/etc/msrv-badge.template.svg b/etc/msrv-badge.template.svg new file mode 100644 index 00000000000..2aba8a77c94 --- /dev/null +++ b/etc/msrv-badge.template.svg @@ -0,0 +1,21 @@ + + rustc: {MSRV}+ + + + + + + + + + + + + + + + rustc + + {MSRV}+ + + diff --git a/gix/Cargo.toml b/gix/Cargo.toml index 10448739588..a72db419b32 100644 --- a/gix/Cargo.toml +++ b/gix/Cargo.toml @@ -9,6 +9,8 @@ version = "0.72.1" authors = ["Sebastian Thiel "] edition = "2021" include = ["src/**/*", "LICENSE-*"] +# This MSRV is dictated by `firefox` to support the `helix` editor, but is now probably +# effectively controlled by `jiff`, which also aligns with `regex`. rust-version = "1.75" [lib] diff --git a/justfile b/justfile index 86a9008b085..bcf774bffc1 100755 --- a/justfile +++ b/justfile @@ -187,7 +187,8 @@ unit-tests-flaky: # Extract cargo metadata, excluding dependencies, and query it [private] get-metadata jq-query: - cargo metadata --format-version 1 | jq --exit-status --raw-output -- {{ quote(jq-query) }} + cargo metadata --format-version 1 --no-deps | \ + jq --exit-status --raw-output -- {{ quote(jq-query) }} # Get the path to the directory where debug binaries are created during builds [private] @@ -240,16 +241,32 @@ cross-test-android: (cross-test 'armv7-linux-androideabi' '--no-default-features check-size: etc/check-package-size.sh -# This assumes the current default toolchain is the Minimal Supported Rust Version and checks -# against it. This is run on CI in `msrv.yml`, after the MSRV toolchain is installed and set as -# default, and after dependencies in `Cargo.lock` are downgraded to the latest MSRV-compatible -# versions. Only if those or similar steps are done first does this work to validate the MSRV. -# -# Check the MSRV, *if* the toolchain is set and `Cargo.lock` is downgraded (used on CI) -ci-check-msrv: - rustc --version - cargo build --locked -p gix - cargo build --locked -p gix --no-default-features --features async-network-client,max-performance +# Report the Minimum Supported Rust Version (the `rust-version` of `gix`) in X.Y.Z form +msrv: + set -eu; \ + query='.packages[] | select(.name == "gix") | .rust_version'; \ + value="$({{ j }} get-metadata "$query")"; \ + case "$value" in \ + *.*.*) \ + echo "$value" ;; \ + *.*) \ + echo "$value.0" ;; \ + *) \ + echo "No '.' in gix rust-version '$value'" >&2; \ + exit 1 ;; \ + esac + +# Regenerate the MSRV badge SVG +msrv-badge: + msrv="$({{ j }} msrv)" && \ + sed "s/{MSRV}/$msrv/g" etc/msrv-badge.template.svg >etc/msrv-badge.svg + +# Check if `gix` and its dependencies, as currently locked, build with `rust-version` +check-rust-version rust-version: + rustc +{{ rust-version }} --version + cargo +{{ rust-version }} build --locked -p gix + cargo +{{ rust-version }} build --locked -p gix \ + --no-default-features --features async-network-client,max-performance # Enter a nix-shell able to build on macOS nix-shell-macos: From efeb6e618cf09bdfd53b6f13e7b592ea61a4a8f3 Mon Sep 17 00:00:00 2001 From: Eliah Kagan Date: Sun, 25 May 2025 05:28:03 -0400 Subject: [PATCH 083/166] Use `jq` to validate and format the `rust-version` This is clearer than the inline shell script previously used, and also more robust. --- justfile | 23 ++++++++++------------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/justfile b/justfile index bcf774bffc1..825b30e5f97 100755 --- a/justfile +++ b/justfile @@ -242,19 +242,16 @@ check-size: etc/check-package-size.sh # Report the Minimum Supported Rust Version (the `rust-version` of `gix`) in X.Y.Z form -msrv: - set -eu; \ - query='.packages[] | select(.name == "gix") | .rust_version'; \ - value="$({{ j }} get-metadata "$query")"; \ - case "$value" in \ - *.*.*) \ - echo "$value" ;; \ - *.*) \ - echo "$value.0" ;; \ - *) \ - echo "No '.' in gix rust-version '$value'" >&2; \ - exit 1 ;; \ - esac +msrv: (get-metadata ''' + (.packages[] | select(.name == "gix") | .rust_version | tostring) as $v | + if ($v | test("^[0-9]+\\.[0-9]+\\.[0-9]+$")) then + $v + elif ($v | test("^[0-9]+\\.[0-9]+$")) then + $v + ".0" + else + error("Unrecognized rust-version format: " + $v) + end +''') # Regenerate the MSRV badge SVG msrv-badge: From 91f6883d2a3283795fd7a1e9f4e45bb1690b1d0d Mon Sep 17 00:00:00 2001 From: Eliah Kagan Date: Sun, 25 May 2025 06:38:02 -0400 Subject: [PATCH 084/166] Remove unnecessary `jq` validation of `rust-version` `cargo metadata` already validates the version, checking that it's a string satisfying one of a small number of recognized formats. So the only validation `jq` needs to do is to make sure it is really only appending `.0` to the end if it is of the form `X.Y` for nonempty numeric `X` and `Y` (with no other characters anywhere). This shortens the `jq` query considerably, removing the unnecessary validation and also using regular expression replacement to replace the empty string that follows the a *full* `X.Y` line with `.0`. --- justfile | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/justfile b/justfile index 825b30e5f97..7e71ce7a7d2 100755 --- a/justfile +++ b/justfile @@ -242,16 +242,7 @@ check-size: etc/check-package-size.sh # Report the Minimum Supported Rust Version (the `rust-version` of `gix`) in X.Y.Z form -msrv: (get-metadata ''' - (.packages[] | select(.name == "gix") | .rust_version | tostring) as $v | - if ($v | test("^[0-9]+\\.[0-9]+\\.[0-9]+$")) then - $v - elif ($v | test("^[0-9]+\\.[0-9]+$")) then - $v + ".0" - else - error("Unrecognized rust-version format: " + $v) - end -''') +msrv: (get-metadata '.packages[] | select(.name == "gix") | .rust_version | sub("^\\d+\\.\\d+\\K$"; ".0")') # Regenerate the MSRV badge SVG msrv-badge: From 404b6f4559d40975893bd5ac7415832aeb5b77d3 Mon Sep 17 00:00:00 2001 From: Eliah Kagan Date: Sun, 25 May 2025 08:29:20 -0400 Subject: [PATCH 085/166] Use a more portable and clear `jq` regex technique Because regular expressions in a `jq` query are strings, their `\` escapes must be written as `\\`. But the `get-metadata` recipe in the `justfile` is strangely intolerant of `\\` in a cross-platform setting. On Windows, even though `sh` is used on both, and even though the `quote()` function is supposed to work the same way on both, the `\\` gets folded into `\` in the actual query argument passed to `jq`, and `just msrv` fails with: cargo metadata --format-version 1 --no-deps | jq --exit-status --raw-output -- '.packages[] | select(.name == "gix") | .rust_version | sub("^\\d+\\.\\d+\\K$"; ".0")' jq: error: Invalid escape at line 1, column 4 (while parsing '"\d"') at , line 1: .packages[] | select(.name == "gix") | .rust_version | sub("^\d+\.\d+\K$"; ".0") jq: error: Invalid escape at line 1, column 6 (while parsing '"\.\d"') at , line 1: .packages[] | select(.name == "gix") | .rust_version | sub("^\d+\.\d+\K$"; ".0") jq: error: Invalid escape at line 1, column 4 (while parsing '"\K"') at , line 1: .packages[] | select(.name == "gix") | .rust_version | sub("^\d+\.\d+\K$"; ".0") jq: 3 compile errors error: Recipe `get-metadata` failed on line 191 with exit code 3 A Windows-specific workaround is to write `\\\\` instead of `\\`. This works on Windows, but of course breaks on other platforms where it represents a subpattern of `\\` and thus matches only a literal `\` (which is not present and shouldn't be matched if it were). In this case, it so happens that the pattern was also potentially confusing for other reasons, due to the way it matched a zero-width string after a `\K`-discarded sub-match that did most of the work. Because `\\d` and `\\.` are easily replaced with character classes that use no `\`, the `\\K` was the only use of `\` in the pattern string that needed `\`. So this replaces that technique with a different more readable one that does not require writing any occurrences of `\\`. (It uses a `\`, but no `\\`, and `\` by itself seems to cause no problems.) Instead of discarding a sub-match and replacing an empty string, this matches on the entire string (if in MAJOR.MINOR form) and replaces the whole thing with itself followed by `.0`. This does make the recipe longer. The `jq` query argument is accordingly now split over multiple lines. (Although this is done using a `'''` string instead of a `'` string, that does not make a difference to the misinterpretation of `\\`, which occurs after the string has been received by the `get-metadata` recipe.) --- justfile | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/justfile b/justfile index 7e71ce7a7d2..4833020c165 100755 --- a/justfile +++ b/justfile @@ -242,7 +242,12 @@ check-size: etc/check-package-size.sh # Report the Minimum Supported Rust Version (the `rust-version` of `gix`) in X.Y.Z form -msrv: (get-metadata '.packages[] | select(.name == "gix") | .rust_version | sub("^\\d+\\.\\d+\\K$"; ".0")') +msrv: (get-metadata ''' + .packages[] + | select(.name == "gix") + | .rust_version + | sub("(?^[0-9]+[.][0-9]+$)"; "\(.xy).0") +''') # Regenerate the MSRV badge SVG msrv-badge: From d48ebdd4d5751bb5de26da0899c504a673e5ff61 Mon Sep 17 00:00:00 2001 From: Eliah Kagan Date: Sun, 25 May 2025 10:16:00 -0400 Subject: [PATCH 086/166] Small refinements to the `justfile` - Rename `get-metadata` to the more accurate name `query-meta`. Since it is being used to do more processing than just dumping values as they literally appear in the JSON metadata. - Catch if `cargo metadata ...` fails and don't even run `jq`. This shouldn't increase memory requirements much, since `jq` without `--stream` always reads its full input anyway. (A middle ground could be to use `set -o pipefail`, but while that has recently been added to POSIX, `sh` is `dash` on Debian and Ubuntu, and `dash` doesn't yet support `-o pipefail`.) - Simplify `dbg` recipe to have `query-meta` concatenate `/debug`. --- justfile | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/justfile b/justfile index 4833020c165..6129408cb74 100755 --- a/justfile +++ b/justfile @@ -186,14 +186,13 @@ unit-tests-flaky: # Extract cargo metadata, excluding dependencies, and query it [private] -get-metadata jq-query: - cargo metadata --format-version 1 --no-deps | \ - jq --exit-status --raw-output -- {{ quote(jq-query) }} +query-meta jq-query: + meta="$(cargo metadata --format-version 1 --no-deps)" && \ + printf '%s\n' "$meta" | jq --exit-status --raw-output -- {{ quote(jq-query) }} # Get the path to the directory where debug binaries are created during builds [private] -dbg: - target_dir="$({{ j }} get-metadata .target_directory)" && echo "$target_dir/debug" +dbg: (query-meta '.target_directory + "/debug"') # Run journey tests (`max`) journey-tests: @@ -242,7 +241,7 @@ check-size: etc/check-package-size.sh # Report the Minimum Supported Rust Version (the `rust-version` of `gix`) in X.Y.Z form -msrv: (get-metadata ''' +msrv: (query-meta ''' .packages[] | select(.name == "gix") | .rust_version From 3d1424e7a5a4c3499090ea24b5aca1eb6f07e514 Mon Sep 17 00:00:00 2001 From: Eliah Kagan Date: Sat, 24 May 2025 19:45:31 -0400 Subject: [PATCH 087/166] Clean up and slightly refine the MSRV workflow - Remove the recently added `macos-15` MSRV check CI job. We don't typically automatically run the MSRV check on macOS CI. That job was temporarily added to help verify that new `justfile` recipes are portable. (They are.) This removes that job. - Show the MSRV in the `check-msrv` "Read the MSRV" step. Show the line being written to set an `MSRV` environment variable for subsequent steps, so it's easy to see the MSRV in the log. - Distinguish MSRV badge changes from unanticipated other changes. In case something goes wrong in the checkout or some other step. - Reword a comment for clarity. --- .github/workflows/msrv.yml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/.github/workflows/msrv.yml b/.github/workflows/msrv.yml index 9de262bf84b..1ef77492b6d 100644 --- a/.github/workflows/msrv.yml +++ b/.github/workflows/msrv.yml @@ -25,7 +25,6 @@ jobs: os: - windows-2022 - ubuntu-latest - - macos-15 # FIXME(portability): Remove after testing new justfile changes. runs-on: ${{ matrix.os }} @@ -39,7 +38,7 @@ jobs: - name: Read the MSRV run: | msrv="$(just msrv)" - echo "MSRV=$msrv" >> "$GITHUB_ENV" + tee -a "$GITHUB_ENV" <<<"MSRV=$msrv" - name: Set up MSRV and nightly toolchains run: | rustup toolchain install "$MSRV" nightly --profile minimal --no-self-update @@ -58,12 +57,14 @@ jobs: steps: - uses: actions/checkout@v4 - uses: extractions/setup-just@v3 + - name: Ensure we start out clean + run: git diff --exit-code - name: Regenerate the MSRV badge run: just msrv-badge - name: Check for changes run: git diff --exit-code - # Dummy job to have a stable name for the requirement that all MSRV tests pass. + # Dummy job to have a stable name for the requirement that all MSRV checks pass. msrv-pass: name: MSRV checks pass From 6e6836b4857fa19c20deadaacb1a079b3ef675a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christoph=20R=C3=BC=C3=9Fler?= Date: Thu, 22 May 2025 13:41:29 +0200 Subject: [PATCH 088/166] Use `pretty_assertion::assert_equal` --- gix-blame/tests/blame.rs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/gix-blame/tests/blame.rs b/gix-blame/tests/blame.rs index a4535b0eaf1..2adc4b52fba 100644 --- a/gix-blame/tests/blame.rs +++ b/gix-blame/tests/blame.rs @@ -206,7 +206,7 @@ macro_rules! mktest { let baseline = Baseline::collect(git_dir.join(format!("{}.baseline", $case)))?; assert_eq!(baseline.len(), $number_of_lines); - assert_eq!(lines_blamed, baseline); + pretty_assertions::assert_eq!(lines_blamed, baseline); Ok(()) } }; @@ -279,7 +279,7 @@ fn diff_disparity() { let git_dir = fixture_path().join(".git"); let baseline = Baseline::collect(git_dir.join(format!("{case}.baseline"))).unwrap(); - assert_eq!(lines_blamed, baseline, "{case}"); + pretty_assertions::assert_eq!(lines_blamed, baseline, "{case}"); } } @@ -311,7 +311,7 @@ fn since() { let git_dir = fixture_path().join(".git"); let baseline = Baseline::collect(git_dir.join("simple-since.baseline")).unwrap(); - assert_eq!(lines_blamed, baseline); + pretty_assertions::assert_eq!(lines_blamed, baseline); } mod blame_ranges { @@ -346,7 +346,7 @@ mod blame_ranges { let git_dir = fixture_path().join(".git"); let baseline = Baseline::collect(git_dir.join("simple-lines-1-2.baseline")).unwrap(); - assert_eq!(lines_blamed, baseline); + pretty_assertions::assert_eq!(lines_blamed, baseline); } #[test] @@ -382,7 +382,7 @@ mod blame_ranges { let git_dir = fixture_path().join(".git"); let baseline = Baseline::collect(git_dir.join("simple-lines-multiple-1-2-and-4.baseline")).unwrap(); - assert_eq!(lines_blamed, baseline); + pretty_assertions::assert_eq!(lines_blamed, baseline); } #[test] @@ -415,7 +415,7 @@ mod blame_ranges { let git_dir = fixture_path().join(".git"); let baseline = Baseline::collect(git_dir.join("simple-lines-multiple-1-2-and-4.baseline")).unwrap(); - assert_eq!(lines_blamed, baseline); + pretty_assertions::assert_eq!(lines_blamed, baseline); } } From d5c5823646d31971e8ba02d4cf55fbc8baf50979 Mon Sep 17 00:00:00 2001 From: Eliah Kagan Date: Sun, 25 May 2025 17:23:39 -0400 Subject: [PATCH 089/166] Move MSRV jobs into main `ci.yml` workflow This moves the `check-msrv` and `check-msrv-badge` job definitions from `msrv.yml` to `ci.yml`, where they are renamed `msrv` and `msrv-badge`, respectively. This includes those jobs among the PR-blocking checks in `ci.yml` (i.e., `tests-pass` depends on them). This lets failure of `msrv` continue blocking PR auto-merge (`check-msrv` had done so), and causes `msrv-badge` to begin blocking PRs (`check-msrv-badge` had not done so). The `msrv.yml` workflow is accordingly removed. (See #2026 and #2027 for context and relevant discussion.) --- .github/workflows/ci.yml | 49 +++++++++++++++++++++++ .github/workflows/msrv.yml | 82 -------------------------------------- 2 files changed, 49 insertions(+), 82 deletions(-) delete mode 100644 .github/workflows/msrv.yml diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 5e545f4429f..46bdb84b19c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -21,6 +21,53 @@ env: CLICOLOR: '1' jobs: + msrv: + name: cargo check MSRV + + strategy: + matrix: + os: + - windows-2022 + - ubuntu-latest + + runs-on: ${{ matrix.os }} + + defaults: + run: + shell: bash # Use `bash` even in the Windows job. + + steps: + - uses: actions/checkout@v4 + - uses: extractions/setup-just@v3 + - name: Read the MSRV + run: | + msrv="$(just msrv)" + tee -a "$GITHUB_ENV" <<<"MSRV=$msrv" + - name: Set up MSRV and nightly toolchains + run: | + rustup toolchain install "$MSRV" nightly --profile minimal --no-self-update + - name: Downgrade locked dependencies to lowest allowed versions + run: | + # TODO(msrv): Use `cargo update --minimal-versions` when `--minimal-versions` is available. + cargo +nightly update -Zminimal-versions + - name: Run some `cargo build` commands on `gix` + run: just check-rust-version "$MSRV" + + msrv-badge: + name: Check MSRV badge + + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + - uses: extractions/setup-just@v3 + - name: Ensure we start out clean + run: git diff --exit-code + - name: Regenerate the MSRV badge + run: just msrv-badge + - name: Check for changes + run: git diff --exit-code + pure-rust-build: runs-on: ubuntu-latest @@ -492,6 +539,8 @@ jobs: name: Tests pass needs: + - msrv + - msrv-badge - pure-rust-build - test - test-journey diff --git a/.github/workflows/msrv.yml b/.github/workflows/msrv.yml deleted file mode 100644 index 1ef77492b6d..00000000000 --- a/.github/workflows/msrv.yml +++ /dev/null @@ -1,82 +0,0 @@ -name: Minimum Supported Rust Version - -on: - push: - branches: - - main - - 'run-ci/**' - - '**/run-ci/**' - tags-ignore: - - '*' - pull_request: - branches: - - main - workflow_dispatch: - -permissions: - contents: read - -jobs: - check-msrv: - name: cargo check MSRV - - strategy: - matrix: - os: - - windows-2022 - - ubuntu-latest - - runs-on: ${{ matrix.os }} - - defaults: - run: - shell: bash # Use `bash` even in the Windows job. - - steps: - - uses: actions/checkout@v4 - - uses: extractions/setup-just@v3 - - name: Read the MSRV - run: | - msrv="$(just msrv)" - tee -a "$GITHUB_ENV" <<<"MSRV=$msrv" - - name: Set up MSRV and nightly toolchains - run: | - rustup toolchain install "$MSRV" nightly --profile minimal --no-self-update - - name: Downgrade locked dependencies to lowest allowed versions - run: | - # TODO(msrv): Use `cargo update --minimal-versions` when `--minimal-versions` is available. - cargo +nightly update -Zminimal-versions - - name: Run some `cargo build` commands on `gix` - run: just check-rust-version "$MSRV" - - check-msrv-badge: - name: Check MSRV badge - - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v4 - - uses: extractions/setup-just@v3 - - name: Ensure we start out clean - run: git diff --exit-code - - name: Regenerate the MSRV badge - run: just msrv-badge - - name: Check for changes - run: git diff --exit-code - - # Dummy job to have a stable name for the requirement that all MSRV checks pass. - msrv-pass: - name: MSRV checks pass - - needs: [ check-msrv, check-msrv-badge ] - - if: always() # Always run even if dependencies fail. - - runs-on: ubuntu-latest - - steps: - - name: Fail if ANY dependency has failed or cancelled - if: contains(needs.*.result, 'failure') || contains(needs.*.result, 'cancelled') - run: exit 1 - - name: OK - run: exit 0 From 4ef32be1c4f097b1bf39a71a8cb630bf4ef0e126 Mon Sep 17 00:00:00 2001 From: ralphmodales Date: Tue, 27 May 2025 13:20:41 +0800 Subject: [PATCH 090/166] fix: improve version detection fallback in build.rs --- build.rs | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/build.rs b/build.rs index b8632bc4024..47539cae5ed 100644 --- a/build.rs +++ b/build.rs @@ -5,13 +5,23 @@ fn main() { .args(["describe", r"--match=v*\.*\.*"]) .output() .ok() - .and_then(|out| parse_describe(&out.stdout)) + .and_then(|out| { + if out.status.success() { + parse_describe(&out.stdout) + } else { + None + } + }) .unwrap_or_else(|| env!("CARGO_PKG_VERSION").into()); - println!("cargo:rustc-env=GIX_VERSION={version}"); } fn parse_describe(input: &[u8]) -> Option { let input = std::str::from_utf8(input).ok()?; - input.trim().to_owned().into() + let trimmed = input.trim(); + if trimmed.is_empty() { + None + } else { + Some(trimmed.to_owned()) + } } From 37297319ad4448ac42870b8a9a7441a08d077123 Mon Sep 17 00:00:00 2001 From: Sebastian Thiel Date: Tue, 27 May 2025 14:45:49 +0200 Subject: [PATCH 091/166] refactor - make it more fluid --- build.rs | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/build.rs b/build.rs index 47539cae5ed..6ab24b70cc4 100644 --- a/build.rs +++ b/build.rs @@ -6,22 +6,17 @@ fn main() { .output() .ok() .and_then(|out| { - if out.status.success() { - parse_describe(&out.stdout) - } else { - None + if !out.status.success() { + return None; } + try_parse_describe(&out.stdout) }) .unwrap_or_else(|| env!("CARGO_PKG_VERSION").into()); println!("cargo:rustc-env=GIX_VERSION={version}"); } -fn parse_describe(input: &[u8]) -> Option { +fn try_parse_describe(input: &[u8]) -> Option { let input = std::str::from_utf8(input).ok()?; let trimmed = input.trim(); - if trimmed.is_empty() { - None - } else { - Some(trimmed.to_owned()) - } + (!trimmed.is_empty()).then(|| trimmed.to_owned()) } From 657dec4f10bc6babbfa71a4506b1ff1439c06eaf Mon Sep 17 00:00:00 2001 From: Sebastian Thiel Date: Wed, 28 May 2025 10:09:53 +0200 Subject: [PATCH 092/166] Add a test to assure `subomdule..ignore = all` is handled correctly. Related to https://github.com/gitbutlerapp/gitbutler/issues/8792 --- .../generated-archives/make_submodules.tar | Bin 2162688 -> 2341376 bytes gix/tests/fixtures/make_submodules.sh | 6 + gix/tests/gix/status.rs | 163 ++++++++++++++++-- 3 files changed, 150 insertions(+), 19 deletions(-) diff --git a/gix/tests/fixtures/generated-archives/make_submodules.tar b/gix/tests/fixtures/generated-archives/make_submodules.tar index 220c4e9a56f672ef4bc0171fe5fc93b30a5fc5b0..44b5c07d72c09c509035792a2d7d45e3fefe216d 100644 GIT binary patch delta 14255 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 CyXIp6 diff --git a/gix/tests/fixtures/make_submodules.sh b/gix/tests/fixtures/make_submodules.sh index 524faf6282a..470337c1009 100755 --- a/gix/tests/fixtures/make_submodules.sh +++ b/gix/tests/fixtures/make_submodules.sh @@ -85,6 +85,12 @@ cp -Rv modified-untracked-and-submodule-head-changed-and-modified git-mv-and-unt git mv this that ) +cp -Rv git-mv-and-untracked-and-submodule-head-changed-and-modified git-mv-and-untracked-and-submodule-head-changed-and-modified-ignore-all +(cd git-mv-and-untracked-and-submodule-head-changed-and-modified-ignore-all + echo $'\tignore = all' >>.gitmodules + git add .gitmodules && git commit -m "ignore all submodule changes" +) + git init with-submodules (cd with-submodules mkdir dir diff --git a/gix/tests/gix/status.rs b/gix/tests/gix/status.rs index e28743e3036..8b832f5c2c8 100644 --- a/gix/tests/gix/status.rs +++ b/gix/tests/gix/status.rs @@ -17,7 +17,7 @@ pub fn repo(name: &str) -> crate::Result { } mod into_iter { - use gix::status::{tree_index::TrackRenames, Item}; + use gix::status::{tree_index::TrackRenames, Item, Submodule}; use gix_diff::Rewrites; use gix_testtools::size_ok; @@ -53,24 +53,149 @@ mod into_iter { let mut items: Vec<_> = status.by_ref().filter_map(Result::ok).collect(); items.sort_by(|a, b| a.location().cmp(b.location())); assert_eq!(items.len(), 3, "1 untracked, 1 move, 1 submodule modification"); - insta::assert_debug_snapshot!(&items[1], @r#" - TreeIndex( - Rewrite { - source_location: "this", - source_index: 2, - source_entry_mode: Mode( - FILE, - ), - source_id: Sha1(e69de29bb2d1d6434b8b29ae775ad8c2e48c5391), - location: "that", - index: 2, - entry_mode: Mode( - FILE, - ), - id: Sha1(e69de29bb2d1d6434b8b29ae775ad8c2e48c5391), - copy: false, - }, - ) + insta::assert_debug_snapshot!(&items[1..], @r#" + [ + TreeIndex( + Rewrite { + source_location: "this", + source_index: 2, + source_entry_mode: Mode( + FILE, + ), + source_id: Sha1(e69de29bb2d1d6434b8b29ae775ad8c2e48c5391), + location: "that", + index: 2, + entry_mode: Mode( + FILE, + ), + id: Sha1(e69de29bb2d1d6434b8b29ae775ad8c2e48c5391), + copy: false, + }, + ), + IndexWorktree( + DirectoryContents { + entry: Entry { + rela_path: "untracked", + status: Untracked, + property: None, + disk_kind: Some( + File, + ), + index_kind: None, + pathspec_match: Some( + Always, + ), + }, + collapsed_directory_status: None, + }, + ), + ] + "#); + Ok(()) + } + + #[test] + fn submodule_fully_ignored_by_override() -> crate::Result { + let repo = submodule_repo("git-mv-and-untracked-and-submodule-head-changed-and-modified")?; + let mut status = repo + .status(gix::progress::Discard)? + .index_worktree_options_mut(|opts| { + opts.sorting = + Some(gix::status::plumbing::index_as_worktree_with_renames::Sorting::ByPathCaseSensitive); + }) + .tree_index_track_renames(TrackRenames::Given(Rewrites { + track_empty: true, + ..Default::default() + })) + .index_worktree_submodules(Some(Submodule::Given { + ignore: gix::submodule::config::Ignore::All, + check_dirty: false, + })) + .into_iter(None)?; + let mut items: Vec<_> = status.by_ref().filter_map(Result::ok).collect(); + items.sort_by(|a, b| a.location().cmp(b.location())); + assert_eq!( + items.len(), + 2, + "1 untracked, 1 move, 0 submodule modification (ignored)" + ); + insta::assert_debug_snapshot!(&items, @r#" + [ + TreeIndex( + Rewrite { + source_location: "this", + source_index: 2, + source_entry_mode: Mode( + FILE, + ), + source_id: Sha1(e69de29bb2d1d6434b8b29ae775ad8c2e48c5391), + location: "that", + index: 2, + entry_mode: Mode( + FILE, + ), + id: Sha1(e69de29bb2d1d6434b8b29ae775ad8c2e48c5391), + copy: false, + }, + ), + IndexWorktree( + DirectoryContents { + entry: Entry { + rela_path: "untracked", + status: Untracked, + property: None, + disk_kind: Some( + File, + ), + index_kind: None, + pathspec_match: Some( + Always, + ), + }, + collapsed_directory_status: None, + }, + ), + ] + "#); + Ok(()) + } + #[test] + fn submodule_fully_ignored_by_configuration() -> crate::Result { + let repo = submodule_repo("git-mv-and-untracked-and-submodule-head-changed-and-modified-ignore-all")?; + let mut status = repo + .status(gix::progress::Discard)? + .index_worktree_options_mut(|opts| { + opts.sorting = + Some(gix::status::plumbing::index_as_worktree_with_renames::Sorting::ByPathCaseSensitive); + }) + .tree_index_track_renames(TrackRenames::Given(Rewrites { + track_empty: true, + ..Default::default() + })) + .into_iter(None)?; + let mut items: Vec<_> = status.by_ref().filter_map(Result::ok).collect(); + items.sort_by(|a, b| a.location().cmp(b.location())); + assert_eq!(items.len(), 1, "1 untracked, 0 submodule modification (ignored)"); + insta::assert_debug_snapshot!(&items, @r#" + [ + IndexWorktree( + DirectoryContents { + entry: Entry { + rela_path: "untracked", + status: Untracked, + property: None, + disk_kind: Some( + File, + ), + index_kind: None, + pathspec_match: Some( + Always, + ), + }, + collapsed_directory_status: None, + }, + ), + ] "#); Ok(()) } From c9a312edce09f968ece7ed51a4cf68fdcab43e8a Mon Sep 17 00:00:00 2001 From: ralphmodales Date: Wed, 28 May 2025 18:09:04 +0800 Subject: [PATCH 093/166] feat: add convenience methods for common Git trailers --- gix-object/src/commit/message/body.rs | 135 ++++++++++++++++++++++++++ gix-object/src/commit/message/mod.rs | 26 +++++ 2 files changed, 161 insertions(+) diff --git a/gix-object/src/commit/message/body.rs b/gix-object/src/commit/message/body.rs index 135cfa26115..2b339b193fa 100644 --- a/gix-object/src/commit/message/body.rs +++ b/gix-object/src/commit/message/body.rs @@ -114,6 +114,76 @@ impl Deref for BodyRef<'_> { self.body_without_trailer } } + +impl TrailerRef<'_> { + /// Check if this trailer is a "Signed-off-by" trailer (case-insensitive). + pub fn is_signed_off_by(&self) -> bool { + self.token.eq_ignore_ascii_case(b"Signed-off-by") + } + + /// Check if this trailer is a "Co-authored-by" trailer (case-insensitive). + pub fn is_co_authored_by(&self) -> bool { + self.token.eq_ignore_ascii_case(b"Co-authored-by") + } + + /// Check if this trailer is an "Acked-by" trailer (case-insensitive). + pub fn is_acked_by(&self) -> bool { + self.token.eq_ignore_ascii_case(b"Acked-by") + } + + /// Check if this trailer is a "Reviewed-by" trailer (case-insensitive). + pub fn is_reviewed_by(&self) -> bool { + self.token.eq_ignore_ascii_case(b"Reviewed-by") + } + + /// Check if this trailer is a "Tested-by" trailer (case-insensitive). + pub fn is_tested_by(&self) -> bool { + self.token.eq_ignore_ascii_case(b"Tested-by") + } + + /// Check if this trailer represents any kind of authorship or attribution + /// (Signed-off-by, Co-authored-by, etc.). + pub fn is_attribution(&self) -> bool { + self.is_signed_off_by() + || self.is_co_authored_by() + || self.is_acked_by() + || self.is_reviewed_by() + || self.is_tested_by() + } + + /// Get the token as a case-normalized string for comparison purposes. + /// This can be useful for custom filtering logic. + pub fn token_normalized(&self) -> String { + String::from_utf8_lossy(self.token).to_ascii_lowercase() + } +} + +impl<'a> Trailers<'a> { + /// Filter trailers to only include "Signed-off-by" entries. + pub fn signed_off_by(self) -> impl Iterator> { + self.filter(TrailerRef::is_signed_off_by) + } + + /// Filter trailers to only include "Co-authored-by" entries. + pub fn co_authored_by(self) -> impl Iterator> { + self.filter(TrailerRef::is_co_authored_by) + } + + /// Filter trailers to only include attribution-related entries + /// (Signed-off-by, Co-authored-by, Acked-by, Reviewed-by, Tested-by). + pub fn attributions(self) -> impl Iterator> { + self.filter(TrailerRef::is_attribution) + } + + /// Collect all unique authors from Signed-off-by and Co-authored-by trailers. + /// Returns a Vec of author strings. + pub fn collect_authors(self) -> Vec<&'a BStr> { + self.filter(|trailer| trailer.is_signed_off_by() || trailer.is_co_authored_by()) + .map(|trailer| trailer.value) + .collect() + } +} + #[cfg(test)] mod test_parse_trailer { use super::*; @@ -151,3 +221,68 @@ mod test_parse_trailer { assert_eq!(parse("foo: bar\r\n"), ("foo".into(), "bar".into())); } } + +#[cfg(test)] +mod test_trailer_convenience { + use super::*; + + #[test] + fn test_signed_off_by_detection() { + let trailer = TrailerRef { + token: "Signed-off-by".into(), + value: "John Doe ".into(), + }; + assert!(trailer.is_signed_off_by()); + assert!(!trailer.is_co_authored_by()); + assert!(trailer.is_attribution()); + } + + #[test] + fn test_case_insensitive_detection() { + let trailer = TrailerRef { + token: "signed-off-by".into(), + value: "John Doe ".into(), + }; + assert!(trailer.is_signed_off_by()); + + let trailer2 = TrailerRef { + token: "CO-AUTHORED-BY".into(), + value: "Jane Smith ".into(), + }; + assert!(trailer2.is_co_authored_by()); + assert!(trailer2.is_attribution()); + } + + #[test] + fn test_multiple_trailer_types() { + let trailer1 = TrailerRef { + token: "Reviewed-by".into(), + value: "Reviewer ".into(), + }; + let trailer2 = TrailerRef { + token: "Custom-Field".into(), + value: "Some value".into(), + }; + + assert!(trailer1.is_reviewed_by()); + assert!(trailer1.is_attribution()); + assert!(!trailer2.is_attribution()); + } + + #[test] + fn test_collect_authors() { + // This would need to be tested with actual Trailers iterator + // but shows the expected behavior + let trailer1 = TrailerRef { + token: "Signed-off-by".into(), + value: "John Doe ".into(), + }; + let trailer2 = TrailerRef { + token: "Co-authored-by".into(), + value: "Jane Smith ".into(), + }; + + assert!(trailer1.is_signed_off_by()); + assert!(trailer2.is_co_authored_by()); + } +} diff --git a/gix-object/src/commit/message/mod.rs b/gix-object/src/commit/message/mod.rs index ac5e3224c0d..e2944976ee9 100644 --- a/gix-object/src/commit/message/mod.rs +++ b/gix-object/src/commit/message/mod.rs @@ -21,6 +21,32 @@ impl<'a> CommitRef<'a> { pub fn message_trailers(&self) -> body::Trailers<'a> { BodyRef::from_bytes(self.message).trailers() } + + /// Get an iterator over all Signed-off-by trailers in the commit message. + /// This is useful for finding who signed off on the commit. + pub fn signed_off_by_trailers(&self) -> impl Iterator> { + self.message_trailers().signed_off_by() + } + + /// Get an iterator over all Co-authored-by trailers in the commit message. + /// This is useful for squashed commits that contain multiple authors. + pub fn co_authored_by_trailers(&self) -> impl Iterator> { + self.message_trailers().co_authored_by() + } + + /// Get all authors mentioned in Signed-off-by and Co-authored-by trailers. + /// This is useful for squashed commits that contain multiple authors. + /// Returns a Vec of author strings that can include both signers and co-authors. + pub fn all_authors(&self) -> Vec<&'a BStr> { + self.message_trailers().collect_authors() + } + + /// Get an iterator over all attribution-related trailers + /// (Signed-off-by, Co-authored-by, Acked-by, Reviewed-by, Tested-by). + /// This provides a comprehensive view of everyone who contributed to or reviewed the commit. + pub fn attribution_trailers(&self) -> impl Iterator> { + self.message_trailers().attributions() + } } impl<'a> MessageRef<'a> { From 6c6dfd0204b65a03bbe464c312d7decce78e7c98 Mon Sep 17 00:00:00 2001 From: Sebastian Thiel Date: Wed, 28 May 2025 14:19:16 +0200 Subject: [PATCH 094/166] refactor --- gix-object/src/commit/message/body.rs | 106 +++++--------------------- gix-object/src/commit/message/mod.rs | 20 +++-- 2 files changed, 29 insertions(+), 97 deletions(-) diff --git a/gix-object/src/commit/message/body.rs b/gix-object/src/commit/message/body.rs index 2b339b193fa..a14fe7152bb 100644 --- a/gix-object/src/commit/message/body.rs +++ b/gix-object/src/commit/message/body.rs @@ -23,10 +23,10 @@ pub struct Trailers<'a> { #[derive(PartialEq, Eq, Debug, Hash, Ord, PartialOrd, Clone, Copy)] #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] pub struct TrailerRef<'a> { - /// The name of the trailer, like "Signed-off-by", up to the separator ": " + /// The name of the trailer, like "Signed-off-by", up to the separator `: `. #[cfg_attr(feature = "serde", serde(borrow))] pub token: &'a BStr, - /// The value right after the separator ": ", with leading and trailing whitespace trimmed. + /// The value right after the separator `: `, with leading and trailing whitespace trimmed. /// Note that multi-line values aren't currently supported. pub value: &'a BStr, } @@ -93,7 +93,7 @@ impl<'a> BodyRef<'a> { self.body_without_trailer } - /// Return an iterator over the trailers parsed from the last paragraph of the body. May be empty. + /// Return an iterator over the trailers parsed from the last paragraph of the body. Maybe empty. pub fn trailers(&self) -> Trailers<'a> { Trailers { cursor: self.start_of_trailer, @@ -115,34 +115,35 @@ impl Deref for BodyRef<'_> { } } +/// Convenience methods impl TrailerRef<'_> { - /// Check if this trailer is a "Signed-off-by" trailer (case-insensitive). + /// Check if this trailer is a `Signed-off-by` trailer (case-insensitive). pub fn is_signed_off_by(&self) -> bool { self.token.eq_ignore_ascii_case(b"Signed-off-by") } - /// Check if this trailer is a "Co-authored-by" trailer (case-insensitive). + /// Check if this trailer is a `Co-authored-by` trailer (case-insensitive). pub fn is_co_authored_by(&self) -> bool { self.token.eq_ignore_ascii_case(b"Co-authored-by") } - /// Check if this trailer is an "Acked-by" trailer (case-insensitive). + /// Check if this trailer is an `Acked-by` trailer (case-insensitive). pub fn is_acked_by(&self) -> bool { self.token.eq_ignore_ascii_case(b"Acked-by") } - /// Check if this trailer is a "Reviewed-by" trailer (case-insensitive). + /// Check if this trailer is a `Reviewed-by` trailer (case-insensitive). pub fn is_reviewed_by(&self) -> bool { self.token.eq_ignore_ascii_case(b"Reviewed-by") } - /// Check if this trailer is a "Tested-by" trailer (case-insensitive). + /// Check if this trailer is a `Tested-by` trailer (case-insensitive). pub fn is_tested_by(&self) -> bool { self.token.eq_ignore_ascii_case(b"Tested-by") } /// Check if this trailer represents any kind of authorship or attribution - /// (Signed-off-by, Co-authored-by, etc.). + /// (`Signed-off-by`, `Co-authored-by`, etc.). pub fn is_attribution(&self) -> bool { self.is_signed_off_by() || self.is_co_authored_by() @@ -150,37 +151,29 @@ impl TrailerRef<'_> { || self.is_reviewed_by() || self.is_tested_by() } - - /// Get the token as a case-normalized string for comparison purposes. - /// This can be useful for custom filtering logic. - pub fn token_normalized(&self) -> String { - String::from_utf8_lossy(self.token).to_ascii_lowercase() - } } +/// Convenience methods impl<'a> Trailers<'a> { - /// Filter trailers to only include "Signed-off-by" entries. + /// Filter trailers to only include `Signed-off-by` entries. pub fn signed_off_by(self) -> impl Iterator> { self.filter(TrailerRef::is_signed_off_by) } - /// Filter trailers to only include "Co-authored-by" entries. + /// Filter trailers to only include `Co-authored-by` entries. pub fn co_authored_by(self) -> impl Iterator> { self.filter(TrailerRef::is_co_authored_by) } - /// Filter trailers to only include attribution-related entries - /// (Signed-off-by, Co-authored-by, Acked-by, Reviewed-by, Tested-by). + /// Filter trailers to only include attribution-related entries. + /// (`Signed-off-by`, `Co-authored-by`, `Acked-by`, `Reviewed-by`, `Tested-by`). pub fn attributions(self) -> impl Iterator> { self.filter(TrailerRef::is_attribution) } - /// Collect all unique authors from Signed-off-by and Co-authored-by trailers. - /// Returns a Vec of author strings. - pub fn collect_authors(self) -> Vec<&'a BStr> { + /// Filter trailers to only include authors from `Signed-off-by` and `Co-authored-by` entries. + pub fn authors(self) -> impl Iterator> { self.filter(|trailer| trailer.is_signed_off_by() || trailer.is_co_authored_by()) - .map(|trailer| trailer.value) - .collect() } } @@ -221,68 +214,3 @@ mod test_parse_trailer { assert_eq!(parse("foo: bar\r\n"), ("foo".into(), "bar".into())); } } - -#[cfg(test)] -mod test_trailer_convenience { - use super::*; - - #[test] - fn test_signed_off_by_detection() { - let trailer = TrailerRef { - token: "Signed-off-by".into(), - value: "John Doe ".into(), - }; - assert!(trailer.is_signed_off_by()); - assert!(!trailer.is_co_authored_by()); - assert!(trailer.is_attribution()); - } - - #[test] - fn test_case_insensitive_detection() { - let trailer = TrailerRef { - token: "signed-off-by".into(), - value: "John Doe ".into(), - }; - assert!(trailer.is_signed_off_by()); - - let trailer2 = TrailerRef { - token: "CO-AUTHORED-BY".into(), - value: "Jane Smith ".into(), - }; - assert!(trailer2.is_co_authored_by()); - assert!(trailer2.is_attribution()); - } - - #[test] - fn test_multiple_trailer_types() { - let trailer1 = TrailerRef { - token: "Reviewed-by".into(), - value: "Reviewer ".into(), - }; - let trailer2 = TrailerRef { - token: "Custom-Field".into(), - value: "Some value".into(), - }; - - assert!(trailer1.is_reviewed_by()); - assert!(trailer1.is_attribution()); - assert!(!trailer2.is_attribution()); - } - - #[test] - fn test_collect_authors() { - // This would need to be tested with actual Trailers iterator - // but shows the expected behavior - let trailer1 = TrailerRef { - token: "Signed-off-by".into(), - value: "John Doe ".into(), - }; - let trailer2 = TrailerRef { - token: "Co-authored-by".into(), - value: "Jane Smith ".into(), - }; - - assert!(trailer1.is_signed_off_by()); - assert!(trailer2.is_co_authored_by()); - } -} diff --git a/gix-object/src/commit/message/mod.rs b/gix-object/src/commit/message/mod.rs index e2944976ee9..e0cf1187849 100644 --- a/gix-object/src/commit/message/mod.rs +++ b/gix-object/src/commit/message/mod.rs @@ -17,40 +17,44 @@ impl<'a> CommitRef<'a> { } /// Return an iterator over message trailers as obtained from the last paragraph of the commit message. - /// May be empty. + /// Maybe empty. pub fn message_trailers(&self) -> body::Trailers<'a> { BodyRef::from_bytes(self.message).trailers() } +} - /// Get an iterator over all Signed-off-by trailers in the commit message. +/// Convenience methods +impl<'a> CommitRef<'a> { + /// Get an iterator over all `Signed-off-by` trailers in the commit message. /// This is useful for finding who signed off on the commit. pub fn signed_off_by_trailers(&self) -> impl Iterator> { self.message_trailers().signed_off_by() } - /// Get an iterator over all Co-authored-by trailers in the commit message. + /// Get an iterator over `Co-authored-by` trailers in the commit message. /// This is useful for squashed commits that contain multiple authors. pub fn co_authored_by_trailers(&self) -> impl Iterator> { self.message_trailers().co_authored_by() } - /// Get all authors mentioned in Signed-off-by and Co-authored-by trailers. + /// Get all authors mentioned in `Signed-off-by` and `Co-authored-by` trailers. /// This is useful for squashed commits that contain multiple authors. /// Returns a Vec of author strings that can include both signers and co-authors. - pub fn all_authors(&self) -> Vec<&'a BStr> { - self.message_trailers().collect_authors() + pub fn author_trailers(&self) -> impl Iterator> { + self.message_trailers().authors() } /// Get an iterator over all attribution-related trailers - /// (Signed-off-by, Co-authored-by, Acked-by, Reviewed-by, Tested-by). + /// (`Signed-off-by,` `Co-authored-by`, `Acked-by`, `Reviewed-by`, `Tested-by`). /// This provides a comprehensive view of everyone who contributed to or reviewed the commit. + /// Note that the same name may occur multiple times, it's not a unified list. pub fn attribution_trailers(&self) -> impl Iterator> { self.message_trailers().attributions() } } impl<'a> MessageRef<'a> { - /// Parse the given `input` as message. + /// Parse the given `input` as a message. /// /// Note that this cannot fail as everything will be interpreted as title if there is no body separator. pub fn from_bytes(input: &'a [u8]) -> Self { From 0d67c8524058a718083d31eae827f7f60332b20a Mon Sep 17 00:00:00 2001 From: Benedikt Peetz Date: Fri, 30 May 2025 04:48:16 +0200 Subject: [PATCH 095/166] fix: Actually avoid `serde` as dependency, when the serde feature is off `faster-hex` has serde as default dependency, and was not marked with `default-features = false`. --- gix-hash/Cargo.toml | 4 ++-- gix-packetline-blocking/Cargo.toml | 4 ++-- gix-packetline/Cargo.toml | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/gix-hash/Cargo.toml b/gix-hash/Cargo.toml index e3e74047a73..018e9fddc25 100644 --- a/gix-hash/Cargo.toml +++ b/gix-hash/Cargo.toml @@ -17,13 +17,13 @@ test = false [features] ## Data structures implement `serde::Serialize` and `serde::Deserialize`. -serde = ["dep:serde"] +serde = ["dep:serde", "faster-hex/serde"] [dependencies] gix-features = { version = "^0.42.1", path = "../gix-features", features = ["progress"] } thiserror = "2.0.0" -faster-hex = { version = "0.10.0" } +faster-hex = { version = "0.10.0", default-features = false, features = ["std"] } serde = { version = "1.0.114", optional = true, default-features = false, features = ["derive"] } sha1-checked = { version = "0.10.0", default-features = false } diff --git a/gix-packetline-blocking/Cargo.toml b/gix-packetline-blocking/Cargo.toml index c8a5e2aeb04..bfb46086f49 100644 --- a/gix-packetline-blocking/Cargo.toml +++ b/gix-packetline-blocking/Cargo.toml @@ -26,14 +26,14 @@ async-io = [] #! ### Other ## Data structures implement `serde::Serialize` and `serde::Deserialize`. -serde = ["dep:serde", "bstr/serde"] +serde = ["dep:serde", "bstr/serde", "faster-hex/serde"] [dependencies] gix-trace = { version = "^0.1.12", path = "../gix-trace" } serde = { version = "1.0.114", optional = true, default-features = false, features = ["std", "derive"] } thiserror = "2.0.0" -faster-hex = { version = "0.10.0" } +faster-hex = { version = "0.10.0", default-features = false, features = ["std"] } bstr = { version = "1.12.0", default-features = false, features = ["std"] } document-features = { version = "0.2.0", optional = true } diff --git a/gix-packetline/Cargo.toml b/gix-packetline/Cargo.toml index 0a2686bcce3..71caa3a327d 100644 --- a/gix-packetline/Cargo.toml +++ b/gix-packetline/Cargo.toml @@ -29,7 +29,7 @@ async-io = ["dep:futures-io", "futures-lite", "dep:pin-project-lite"] #! ### Other ## Data structures implement `serde::Serialize` and `serde::Deserialize`. -serde = ["dep:serde", "bstr/serde"] +serde = ["dep:serde", "bstr/serde", "faster-hex/serde"] [[test]] name = "async-packetline" @@ -46,7 +46,7 @@ gix-trace = { version = "^0.1.12", path = "../gix-trace" } serde = { version = "1.0.114", optional = true, default-features = false, features = ["std", "derive"] } thiserror = "2.0.0" -faster-hex = { version = "0.10.0" } +faster-hex = { version = "0.10.0", default-features = false, features = ["std"] } bstr = { version = "1.12.0", default-features = false, features = ["std"] } # async support futures-io = { version = "0.3.16", optional = true } From 151e3a5cca06444eea4c6a362649e66c831673d6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 1 Jun 2025 08:58:39 +0000 Subject: [PATCH 096/166] Bump the cargo group with 56 updates Bumps the cargo group with 56 updates: | Package | From | To | | --- | --- | --- | | [clap](https://github.com/clap-rs/clap) | `4.5.37` | `4.5.39` | | [clap_complete](https://github.com/clap-rs/clap) | `4.5.48` | `4.5.52` | | [winnow](https://github.com/winnow-rs/winnow) | `0.7.7` | `0.7.10` | | [criterion](https://github.com/bheisler/criterion.rs) | `0.5.1` | `0.6.0` | | [bitflags](https://github.com/bitflags/bitflags) | `2.9.0` | `2.9.1` | | [tempfile](https://github.com/Stebalien/tempfile) | `3.19.1` | `3.20.0` | | [parking_lot](https://github.com/Amanieu/parking_lot) | `0.12.3` | `0.12.4` | | [jiff](https://github.com/BurntSushi/jiff) | `0.2.12` | `0.2.14` | | [trybuild](https://github.com/dtolnay/trybuild) | `1.0.104` | `1.0.105` | | [reqwest](https://github.com/seanmonstar/reqwest) | `0.12.15` | `0.12.18` | | [signal-hook](https://github.com/vorner/signal-hook) | `0.3.17` | `0.3.18` | | [async-io](https://github.com/smol-rs/async-io) | `2.4.0` | `2.4.1` | | [rusqlite](https://github.com/rusqlite/rusqlite) | `0.35.0` | `0.36.0` | | [sysinfo](https://github.com/GuillaumeGomez/sysinfo) | `0.34.2` | `0.35.1` | | [zip](https://github.com/zip-rs/zip2) | `3.0.0` | `4.0.0` | | [crc](https://github.com/mrhooray/crc-rs) | `3.2.1` | `3.3.0` | | [anstyle-wincon](https://github.com/rust-cli/anstyle) | `3.0.7` | `3.0.8` | | [aws-lc-rs](https://github.com/aws/aws-lc-rs) | `1.13.0` | `1.13.1` | | [aws-lc-sys](https://github.com/aws/aws-lc-rs) | `0.28.2` | `0.29.0` | | [backtrace](https://github.com/rust-lang/backtrace-rs) | `0.3.74` | `0.3.75` | | [cc](https://github.com/rust-lang/cc-rs) | `1.2.20` | `1.2.25` | | [clap_builder](https://github.com/clap-rs/clap) | `4.5.37` | `4.5.39` | | [errno](https://github.com/lambda-fairy/rust-errno) | `0.3.11` | `0.3.12` | | [h2](https://github.com/hyperium/h2) | `0.4.9` | `0.4.10` | | [hyper-rustls](https://github.com/rustls/hyper-rustls) | `0.27.5` | `0.27.6` | | [hyper-util](https://github.com/hyperium/hyper-util) | `0.1.11` | `0.1.13` | | [idna_adapter](https://github.com/hsivonen/idna_adapter) | `1.2.0` | `1.2.1` | | [jiff-static](https://github.com/BurntSushi/jiff) | `0.2.12` | `0.2.14` | | [libloading](https://github.com/nagisa/rust_libloading) | `0.8.6` | `0.8.8` | | [libsqlite3-sys](https://github.com/rusqlite/rusqlite) | `0.33.0` | `0.34.0` | | [litemap](https://github.com/unicode-org/icu4x) | `0.7.5` | `0.8.0` | | [lock_api](https://github.com/Amanieu/parking_lot) | `0.4.12` | `0.4.13` | | [openssl](https://github.com/sfackler/rust-openssl) | `0.10.72` | `0.10.73` | | [openssl-sys](https://github.com/sfackler/rust-openssl) | `0.9.108` | `0.9.109` | | [parking_lot_core](https://github.com/Amanieu/parking_lot) | `0.9.10` | `0.9.11` | | [polling](https://github.com/smol-rs/polling) | `3.7.4` | `3.8.0` | | [prettyplease](https://github.com/dtolnay/prettyplease) | `0.2.32` | `0.2.33` | | [quinn](https://github.com/quinn-rs/quinn) | `0.11.7` | `0.11.8` | | [quinn-proto](https://github.com/quinn-rs/quinn) | `0.11.11` | `0.11.12` | | redox_syscall | `0.5.11` | `0.5.12` | | [rustls](https://github.com/rustls/rustls) | `0.23.26` | `0.23.27` | | [rustls-pki-types](https://github.com/rustls/pki-types) | `1.11.0` | `1.12.0` | | [rustversion](https://github.com/dtolnay/rustversion) | `1.0.20` | `1.0.21` | | [socket2](https://github.com/rust-lang/socket2) | `0.5.9` | `0.5.10` | | [tinystr](https://github.com/unicode-org/icu4x) | `0.7.6` | `0.8.1` | | [tokio](https://github.com/tokio-rs/tokio) | `1.44.2` | `1.45.1` | | [webpki-roots](https://github.com/rustls/webpki-roots) | `0.26.10` | `0.26.11` | | [windows-core](https://github.com/microsoft/windows-rs) | `0.57.0` | `0.61.0` | | [windows-implement](https://github.com/microsoft/windows-rs) | `0.57.0` | `0.60.0` | | [windows-interface](https://github.com/microsoft/windows-rs) | `0.57.0` | `0.59.1` | | [windows-result](https://github.com/microsoft/windows-rs) | `0.1.2` | `0.3.2` | | [writeable](https://github.com/unicode-org/icu4x) | `0.5.5` | `0.6.1` | | [yoke](https://github.com/unicode-org/icu4x) | `0.7.5` | `0.8.0` | | [yoke-derive](https://github.com/unicode-org/icu4x) | `0.7.5` | `0.8.0` | | [zerovec](https://github.com/unicode-org/icu4x) | `0.10.4` | `0.11.2` | | [zerovec-derive](https://github.com/unicode-org/icu4x) | `0.10.3` | `0.11.1` | Updates `clap` from 4.5.37 to 4.5.39 - [Release notes](https://github.com/clap-rs/clap/releases) - [Changelog](https://github.com/clap-rs/clap/blob/master/CHANGELOG.md) - [Commits](https://github.com/clap-rs/clap/compare/clap_complete-v4.5.37...clap_complete-v4.5.39) Updates `clap_complete` from 4.5.48 to 4.5.52 - [Release notes](https://github.com/clap-rs/clap/releases) - [Changelog](https://github.com/clap-rs/clap/blob/master/CHANGELOG.md) - [Commits](https://github.com/clap-rs/clap/compare/clap_complete-v4.5.48...clap_complete-v4.5.52) Updates `winnow` from 0.7.7 to 0.7.10 - [Changelog](https://github.com/winnow-rs/winnow/blob/main/CHANGELOG.md) - [Commits](https://github.com/winnow-rs/winnow/compare/v0.7.7...v0.7.10) Updates `criterion` from 0.5.1 to 0.6.0 - [Changelog](https://github.com/bheisler/criterion.rs/blob/master/CHANGELOG.md) - [Commits](https://github.com/bheisler/criterion.rs/compare/0.5.1...0.6.0) Updates `bitflags` from 2.9.0 to 2.9.1 - [Release notes](https://github.com/bitflags/bitflags/releases) - [Changelog](https://github.com/bitflags/bitflags/blob/main/CHANGELOG.md) - [Commits](https://github.com/bitflags/bitflags/compare/2.9.0...2.9.1) Updates `tempfile` from 3.19.1 to 3.20.0 - [Changelog](https://github.com/Stebalien/tempfile/blob/master/CHANGELOG.md) - [Commits](https://github.com/Stebalien/tempfile/compare/v3.19.1...v3.20.0) Updates `parking_lot` from 0.12.3 to 0.12.4 - [Release notes](https://github.com/Amanieu/parking_lot/releases) - [Changelog](https://github.com/Amanieu/parking_lot/blob/master/CHANGELOG.md) - [Commits](https://github.com/Amanieu/parking_lot/compare/0.12.3...parking_lot-v0.12.4) Updates `jiff` from 0.2.12 to 0.2.14 - [Release notes](https://github.com/BurntSushi/jiff/releases) - [Changelog](https://github.com/BurntSushi/jiff/blob/master/CHANGELOG.md) - [Commits](https://github.com/BurntSushi/jiff/compare/jiff-static-0.2.12...jiff-static-0.2.14) Updates `trybuild` from 1.0.104 to 1.0.105 - [Release notes](https://github.com/dtolnay/trybuild/releases) - [Commits](https://github.com/dtolnay/trybuild/compare/1.0.104...1.0.105) Updates `reqwest` from 0.12.15 to 0.12.18 - [Release notes](https://github.com/seanmonstar/reqwest/releases) - [Changelog](https://github.com/seanmonstar/reqwest/blob/master/CHANGELOG.md) - [Commits](https://github.com/seanmonstar/reqwest/compare/v0.12.15...v0.12.18) Updates `signal-hook` from 0.3.17 to 0.3.18 - [Changelog](https://github.com/vorner/signal-hook/blob/master/CHANGELOG.md) - [Commits](https://github.com/vorner/signal-hook/compare/v0.3.17...v0.3.18) Updates `async-io` from 2.4.0 to 2.4.1 - [Release notes](https://github.com/smol-rs/async-io/releases) - [Changelog](https://github.com/smol-rs/async-io/blob/master/CHANGELOG.md) - [Commits](https://github.com/smol-rs/async-io/compare/v2.4.0...v2.4.1) Updates `rusqlite` from 0.35.0 to 0.36.0 - [Release notes](https://github.com/rusqlite/rusqlite/releases) - [Changelog](https://github.com/rusqlite/rusqlite/blob/master/Changelog.md) - [Commits](https://github.com/rusqlite/rusqlite/compare/v0.35.0...v0.36.0) Updates `sysinfo` from 0.34.2 to 0.35.1 - [Changelog](https://github.com/GuillaumeGomez/sysinfo/blob/master/CHANGELOG.md) - [Commits](https://github.com/GuillaumeGomez/sysinfo/commits/v0.35.1) Updates `zip` from 3.0.0 to 4.0.0 - [Release notes](https://github.com/zip-rs/zip2/releases) - [Changelog](https://github.com/zip-rs/zip2/blob/master/CHANGELOG.md) - [Commits](https://github.com/zip-rs/zip2/compare/v3.0.0...v4.0.0) Updates `crc` from 3.2.1 to 3.3.0 - [Release notes](https://github.com/mrhooray/crc-rs/releases) - [Commits](https://github.com/mrhooray/crc-rs/commits) Updates `anstyle-wincon` from 3.0.7 to 3.0.8 - [Commits](https://github.com/rust-cli/anstyle/compare/anstyle-wincon-v3.0.7...anstyle-wincon-v3.0.8) Updates `aws-lc-rs` from 1.13.0 to 1.13.1 - [Release notes](https://github.com/aws/aws-lc-rs/releases) - [Commits](https://github.com/aws/aws-lc-rs/compare/v1.13.0...v1.13.1) Updates `aws-lc-sys` from 0.28.2 to 0.29.0 - [Release notes](https://github.com/aws/aws-lc-rs/releases) - [Commits](https://github.com/aws/aws-lc-rs/compare/aws-lc-sys/v0.28.2...aws-lc-sys/v0.29.0) Updates `backtrace` from 0.3.74 to 0.3.75 - [Release notes](https://github.com/rust-lang/backtrace-rs/releases) - [Commits](https://github.com/rust-lang/backtrace-rs/compare/0.3.74...0.3.75) Updates `cc` from 1.2.20 to 1.2.25 - [Release notes](https://github.com/rust-lang/cc-rs/releases) - [Changelog](https://github.com/rust-lang/cc-rs/blob/main/CHANGELOG.md) - [Commits](https://github.com/rust-lang/cc-rs/compare/cc-v1.2.20...cc-v1.2.25) Updates `clap_builder` from 4.5.37 to 4.5.39 - [Release notes](https://github.com/clap-rs/clap/releases) - [Changelog](https://github.com/clap-rs/clap/blob/master/CHANGELOG.md) - [Commits](https://github.com/clap-rs/clap/compare/v4.5.37...v4.5.39) Updates `errno` from 0.3.11 to 0.3.12 - [Release notes](https://github.com/lambda-fairy/rust-errno/releases) - [Changelog](https://github.com/lambda-fairy/rust-errno/blob/main/CHANGELOG.md) - [Commits](https://github.com/lambda-fairy/rust-errno/compare/v0.3.11...v0.3.12) Updates `h2` from 0.4.9 to 0.4.10 - [Release notes](https://github.com/hyperium/h2/releases) - [Changelog](https://github.com/hyperium/h2/blob/master/CHANGELOG.md) - [Commits](https://github.com/hyperium/h2/compare/v0.4.9...v0.4.10) Updates `hyper-rustls` from 0.27.5 to 0.27.6 - [Release notes](https://github.com/rustls/hyper-rustls/releases) - [Commits](https://github.com/rustls/hyper-rustls/compare/v/0.27.5...v/0.27.6) Updates `hyper-util` from 0.1.11 to 0.1.13 - [Release notes](https://github.com/hyperium/hyper-util/releases) - [Changelog](https://github.com/hyperium/hyper-util/blob/master/CHANGELOG.md) - [Commits](https://github.com/hyperium/hyper-util/compare/v0.1.11...v0.1.13) Updates `idna_adapter` from 1.2.0 to 1.2.1 - [Commits](https://github.com/hsivonen/idna_adapter/compare/v1.2.0...v1.2.1) Updates `jiff-static` from 0.2.12 to 0.2.14 - [Release notes](https://github.com/BurntSushi/jiff/releases) - [Changelog](https://github.com/BurntSushi/jiff/blob/master/CHANGELOG.md) - [Commits](https://github.com/BurntSushi/jiff/compare/jiff-static-0.2.12...jiff-static-0.2.14) Updates `libloading` from 0.8.6 to 0.8.8 - [Commits](https://github.com/nagisa/rust_libloading/commits) Updates `libsqlite3-sys` from 0.33.0 to 0.34.0 - [Release notes](https://github.com/rusqlite/rusqlite/releases) - [Changelog](https://github.com/rusqlite/rusqlite/blob/master/Changelog.md) - [Commits](https://github.com/rusqlite/rusqlite/compare/v0.33.0...v0.34.0) Updates `litemap` from 0.7.5 to 0.8.0 - [Release notes](https://github.com/unicode-org/icu4x/releases) - [Changelog](https://github.com/unicode-org/icu4x/blob/main/CHANGELOG.md) - [Commits](https://github.com/unicode-org/icu4x/commits) Updates `lock_api` from 0.4.12 to 0.4.13 - [Release notes](https://github.com/Amanieu/parking_lot/releases) - [Changelog](https://github.com/Amanieu/parking_lot/blob/master/CHANGELOG.md) - [Commits](https://github.com/Amanieu/parking_lot/compare/lock_api-0.4.12...lock_api-v0.4.13) Updates `openssl` from 0.10.72 to 0.10.73 - [Release notes](https://github.com/sfackler/rust-openssl/releases) - [Commits](https://github.com/sfackler/rust-openssl/compare/openssl-v0.10.72...openssl-v0.10.73) Updates `openssl-sys` from 0.9.108 to 0.9.109 - [Release notes](https://github.com/sfackler/rust-openssl/releases) - [Commits](https://github.com/sfackler/rust-openssl/compare/openssl-sys-v0.9.108...openssl-sys-v0.9.109) Updates `parking_lot_core` from 0.9.10 to 0.9.11 - [Release notes](https://github.com/Amanieu/parking_lot/releases) - [Changelog](https://github.com/Amanieu/parking_lot/blob/master/CHANGELOG.md) - [Commits](https://github.com/Amanieu/parking_lot/compare/core-0.9.10...parking_lot_core-v0.9.11) Updates `polling` from 3.7.4 to 3.8.0 - [Release notes](https://github.com/smol-rs/polling/releases) - [Changelog](https://github.com/smol-rs/polling/blob/master/CHANGELOG.md) - [Commits](https://github.com/smol-rs/polling/compare/v3.7.4...v3.8.0) Updates `prettyplease` from 0.2.32 to 0.2.33 - [Release notes](https://github.com/dtolnay/prettyplease/releases) - [Commits](https://github.com/dtolnay/prettyplease/compare/0.2.32...0.2.33) Updates `quinn` from 0.11.7 to 0.11.8 - [Release notes](https://github.com/quinn-rs/quinn/releases) - [Commits](https://github.com/quinn-rs/quinn/compare/quinn-0.11.7...quinn-0.11.8) Updates `quinn-proto` from 0.11.11 to 0.11.12 - [Release notes](https://github.com/quinn-rs/quinn/releases) - [Commits](https://github.com/quinn-rs/quinn/compare/quinn-proto-0.11.11...quinn-proto-0.11.12) Updates `redox_syscall` from 0.5.11 to 0.5.12 Updates `rustls` from 0.23.26 to 0.23.27 - [Release notes](https://github.com/rustls/rustls/releases) - [Changelog](https://github.com/rustls/rustls/blob/main/CHANGELOG.md) - [Commits](https://github.com/rustls/rustls/compare/v/0.23.26...v/0.23.27) Updates `rustls-pki-types` from 1.11.0 to 1.12.0 - [Release notes](https://github.com/rustls/pki-types/releases) - [Commits](https://github.com/rustls/pki-types/compare/v/1.11.0...v/1.12.0) Updates `rustversion` from 1.0.20 to 1.0.21 - [Release notes](https://github.com/dtolnay/rustversion/releases) - [Commits](https://github.com/dtolnay/rustversion/compare/1.0.20...1.0.21) Updates `socket2` from 0.5.9 to 0.5.10 - [Release notes](https://github.com/rust-lang/socket2/releases) - [Changelog](https://github.com/rust-lang/socket2/blob/master/CHANGELOG.md) - [Commits](https://github.com/rust-lang/socket2/commits) Updates `tinystr` from 0.7.6 to 0.8.1 - [Release notes](https://github.com/unicode-org/icu4x/releases) - [Changelog](https://github.com/unicode-org/icu4x/blob/main/CHANGELOG.md) - [Commits](https://github.com/unicode-org/icu4x/commits) Updates `tokio` from 1.44.2 to 1.45.1 - [Release notes](https://github.com/tokio-rs/tokio/releases) - [Commits](https://github.com/tokio-rs/tokio/compare/tokio-1.44.2...tokio-1.45.1) Updates `webpki-roots` from 0.26.10 to 0.26.11 - [Release notes](https://github.com/rustls/webpki-roots/releases) - [Commits](https://github.com/rustls/webpki-roots/compare/v/0.26.10...v/0.26.11) Updates `windows-core` from 0.57.0 to 0.61.0 - [Release notes](https://github.com/microsoft/windows-rs/releases) - [Commits](https://github.com/microsoft/windows-rs/compare/0.57.0...0.61.0) Updates `windows-implement` from 0.57.0 to 0.60.0 - [Release notes](https://github.com/microsoft/windows-rs/releases) - [Commits](https://github.com/microsoft/windows-rs/compare/0.57.0...0.60.0) Updates `windows-interface` from 0.57.0 to 0.59.1 - [Release notes](https://github.com/microsoft/windows-rs/releases) - [Commits](https://github.com/microsoft/windows-rs/commits) Updates `windows-result` from 0.1.2 to 0.3.2 - [Release notes](https://github.com/microsoft/windows-rs/releases) - [Commits](https://github.com/microsoft/windows-rs/commits) Updates `writeable` from 0.5.5 to 0.6.1 - [Release notes](https://github.com/unicode-org/icu4x/releases) - [Changelog](https://github.com/unicode-org/icu4x/blob/main/CHANGELOG.md) - [Commits](https://github.com/unicode-org/icu4x/commits) Updates `yoke` from 0.7.5 to 0.8.0 - [Release notes](https://github.com/unicode-org/icu4x/releases) - [Changelog](https://github.com/unicode-org/icu4x/blob/main/CHANGELOG.md) - [Commits](https://github.com/unicode-org/icu4x/commits) Updates `yoke-derive` from 0.7.5 to 0.8.0 - [Release notes](https://github.com/unicode-org/icu4x/releases) - [Changelog](https://github.com/unicode-org/icu4x/blob/main/CHANGELOG.md) - [Commits](https://github.com/unicode-org/icu4x/commits) Updates `zerovec` from 0.10.4 to 0.11.2 - [Release notes](https://github.com/unicode-org/icu4x/releases) - [Changelog](https://github.com/unicode-org/icu4x/blob/main/CHANGELOG.md) - [Commits](https://github.com/unicode-org/icu4x/commits) Updates `zerovec-derive` from 0.10.3 to 0.11.1 - [Release notes](https://github.com/unicode-org/icu4x/releases) - [Changelog](https://github.com/unicode-org/icu4x/blob/main/CHANGELOG.md) - [Commits](https://github.com/unicode-org/icu4x/commits) --- updated-dependencies: - dependency-name: clap dependency-version: 4.5.39 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: cargo - dependency-name: clap_complete dependency-version: 4.5.52 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: cargo - dependency-name: winnow dependency-version: 0.7.10 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: cargo - dependency-name: criterion dependency-version: 0.6.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: cargo - dependency-name: bitflags dependency-version: 2.9.1 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: cargo - dependency-name: tempfile dependency-version: 3.20.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: cargo - dependency-name: parking_lot dependency-version: 0.12.4 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: cargo - dependency-name: jiff dependency-version: 0.2.14 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: cargo - dependency-name: trybuild dependency-version: 1.0.105 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: cargo - dependency-name: reqwest dependency-version: 0.12.18 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: cargo - dependency-name: signal-hook dependency-version: 0.3.18 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: cargo - dependency-name: async-io dependency-version: 2.4.1 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: cargo - dependency-name: rusqlite dependency-version: 0.36.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: cargo - dependency-name: sysinfo dependency-version: 0.35.1 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: cargo - dependency-name: zip dependency-version: 4.0.0 dependency-type: direct:production update-type: version-update:semver-major dependency-group: cargo - dependency-name: crc dependency-version: 3.3.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: cargo - dependency-name: anstyle-wincon dependency-version: 3.0.8 dependency-type: indirect update-type: version-update:semver-patch dependency-group: cargo - dependency-name: aws-lc-rs dependency-version: 1.13.1 dependency-type: indirect update-type: version-update:semver-patch dependency-group: cargo - dependency-name: aws-lc-sys dependency-version: 0.29.0 dependency-type: indirect update-type: version-update:semver-minor dependency-group: cargo - dependency-name: backtrace dependency-version: 0.3.75 dependency-type: indirect update-type: version-update:semver-patch dependency-group: cargo - dependency-name: cc dependency-version: 1.2.25 dependency-type: indirect update-type: version-update:semver-patch dependency-group: cargo - dependency-name: clap_builder dependency-version: 4.5.39 dependency-type: indirect update-type: version-update:semver-patch dependency-group: cargo - dependency-name: errno dependency-version: 0.3.12 dependency-type: indirect update-type: version-update:semver-patch dependency-group: cargo - dependency-name: h2 dependency-version: 0.4.10 dependency-type: indirect update-type: version-update:semver-patch dependency-group: cargo - dependency-name: hyper-rustls dependency-version: 0.27.6 dependency-type: indirect update-type: version-update:semver-patch dependency-group: cargo - dependency-name: hyper-util dependency-version: 0.1.13 dependency-type: indirect update-type: version-update:semver-patch dependency-group: cargo - dependency-name: idna_adapter dependency-version: 1.2.1 dependency-type: indirect update-type: version-update:semver-patch dependency-group: cargo - dependency-name: jiff-static dependency-version: 0.2.14 dependency-type: indirect update-type: version-update:semver-patch dependency-group: cargo - dependency-name: libloading dependency-version: 0.8.8 dependency-type: indirect update-type: version-update:semver-patch dependency-group: cargo - dependency-name: libsqlite3-sys dependency-version: 0.34.0 dependency-type: indirect update-type: version-update:semver-minor dependency-group: cargo - dependency-name: litemap dependency-version: 0.8.0 dependency-type: indirect update-type: version-update:semver-minor dependency-group: cargo - dependency-name: lock_api dependency-version: 0.4.13 dependency-type: indirect update-type: version-update:semver-patch dependency-group: cargo - dependency-name: openssl dependency-version: 0.10.73 dependency-type: indirect update-type: version-update:semver-patch dependency-group: cargo - dependency-name: openssl-sys dependency-version: 0.9.109 dependency-type: indirect update-type: version-update:semver-patch dependency-group: cargo - dependency-name: parking_lot_core dependency-version: 0.9.11 dependency-type: indirect update-type: version-update:semver-patch dependency-group: cargo - dependency-name: polling dependency-version: 3.8.0 dependency-type: indirect update-type: version-update:semver-minor dependency-group: cargo - dependency-name: prettyplease dependency-version: 0.2.33 dependency-type: indirect update-type: version-update:semver-patch dependency-group: cargo - dependency-name: quinn dependency-version: 0.11.8 dependency-type: indirect update-type: version-update:semver-patch dependency-group: cargo - dependency-name: quinn-proto dependency-version: 0.11.12 dependency-type: indirect update-type: version-update:semver-patch dependency-group: cargo - dependency-name: redox_syscall dependency-version: 0.5.12 dependency-type: indirect update-type: version-update:semver-patch dependency-group: cargo - dependency-name: rustls dependency-version: 0.23.27 dependency-type: indirect update-type: version-update:semver-patch dependency-group: cargo - dependency-name: rustls-pki-types dependency-version: 1.12.0 dependency-type: indirect update-type: version-update:semver-minor dependency-group: cargo - dependency-name: rustversion dependency-version: 1.0.21 dependency-type: indirect update-type: version-update:semver-patch dependency-group: cargo - dependency-name: socket2 dependency-version: 0.5.10 dependency-type: indirect update-type: version-update:semver-patch dependency-group: cargo - dependency-name: tinystr dependency-version: 0.8.1 dependency-type: indirect update-type: version-update:semver-minor dependency-group: cargo - dependency-name: tokio dependency-version: 1.45.1 dependency-type: indirect update-type: version-update:semver-minor dependency-group: cargo - dependency-name: webpki-roots dependency-version: 0.26.11 dependency-type: indirect update-type: version-update:semver-patch dependency-group: cargo - dependency-name: windows-core dependency-version: 0.61.0 dependency-type: indirect update-type: version-update:semver-minor dependency-group: cargo - dependency-name: windows-implement dependency-version: 0.60.0 dependency-type: indirect update-type: version-update:semver-minor dependency-group: cargo - dependency-name: windows-interface dependency-version: 0.59.1 dependency-type: indirect update-type: version-update:semver-minor dependency-group: cargo - dependency-name: windows-result dependency-version: 0.3.2 dependency-type: indirect update-type: version-update:semver-minor dependency-group: cargo - dependency-name: writeable dependency-version: 0.6.1 dependency-type: indirect update-type: version-update:semver-minor dependency-group: cargo - dependency-name: yoke dependency-version: 0.8.0 dependency-type: indirect update-type: version-update:semver-minor dependency-group: cargo - dependency-name: yoke-derive dependency-version: 0.8.0 dependency-type: indirect update-type: version-update:semver-minor dependency-group: cargo - dependency-name: zerovec dependency-version: 0.11.2 dependency-type: indirect update-type: version-update:semver-minor dependency-group: cargo - dependency-name: zerovec-derive dependency-version: 0.11.1 dependency-type: indirect update-type: version-update:semver-minor dependency-group: cargo ... Signed-off-by: dependabot[bot] --- Cargo.lock | 537 ++++++++++++++++----------------- Cargo.toml | 4 +- gitoxide-core/Cargo.toml | 10 +- gix-actor/Cargo.toml | 2 +- gix-archive/Cargo.toml | 4 +- gix-config/Cargo.toml | 4 +- gix-date/Cargo.toml | 2 +- gix-discover/Cargo.toml | 2 +- gix-features/Cargo.toml | 2 +- gix-fs/Cargo.toml | 2 +- gix-hashtable/Cargo.toml | 2 +- gix-lock/Cargo.toml | 2 +- gix-object/Cargo.toml | 4 +- gix-odb/Cargo.toml | 4 +- gix-pack/Cargo.toml | 2 +- gix-prompt/Cargo.toml | 2 +- gix-protocol/Cargo.toml | 2 +- gix-ref/Cargo.toml | 2 +- gix-sec/Cargo.toml | 2 +- gix-tempfile/Cargo.toml | 6 +- gix-transport/Cargo.toml | 2 +- gix-worktree-stream/Cargo.toml | 2 +- gix/Cargo.toml | 4 +- tests/it/Cargo.toml | 2 +- tests/tools/Cargo.toml | 8 +- 25 files changed, 297 insertions(+), 318 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a154c740c80..ac290281766 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -100,12 +100,12 @@ dependencies = [ [[package]] name = "anstyle-wincon" -version = "3.0.7" +version = "3.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca3534e77181a9cc07539ad51f2141fe32f6c3ffd4df76db8ad92346b003ae4e" +checksum = "6680de5231bd6ee4c6191b8a1325daa282b415391ec9d3a37bd34f2060dc73fa" dependencies = [ "anstyle", - "once_cell", + "once_cell_polyfill", "windows-sys 0.59.0", ] @@ -206,9 +206,9 @@ dependencies = [ [[package]] name = "async-io" -version = "2.4.0" +version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43a2b323ccce0a1d90b449fd71f2a06ca7faa7c54c2751f06c9bd851fc061059" +checksum = "1237c0ae75a0f3765f58910ff9cdd0a12eeb39ab2f4c7de23262f337f0aacbb3" dependencies = [ "async-lock", "cfg-if", @@ -217,7 +217,7 @@ dependencies = [ "futures-lite", "parking", "polling", - "rustix 0.38.44", + "rustix 1.0.7", "slab", "tracing", "windows-sys 0.59.0", @@ -303,9 +303,9 @@ checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" [[package]] name = "aws-lc-rs" -version = "1.13.0" +version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19b756939cb2f8dc900aa6dcd505e6e2428e9cae7ff7b028c49e3946efa70878" +checksum = "93fcc8f365936c834db5514fc45aee5b1202d677e6b40e48468aaaa8183ca8c7" dependencies = [ "aws-lc-sys", "zeroize", @@ -313,9 +313,9 @@ dependencies = [ [[package]] name = "aws-lc-sys" -version = "0.28.2" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa9b6986f250236c27e5a204062434a773a13243d2ffc2955f37bdba4c5c6a1" +checksum = "61b1d86e7705efe1be1b569bab41d4fa1e14e220b60a160f78de2db687add079" dependencies = [ "bindgen", "cc", @@ -326,9 +326,9 @@ dependencies = [ [[package]] name = "backtrace" -version = "0.3.74" +version = "0.3.75" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" +checksum = "6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002" dependencies = [ "addr2line", "cfg-if", @@ -351,7 +351,7 @@ version = "0.69.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "271383c67ccabffb7381723dea0672a673f292304fcb45c01cc648c7a8d58088" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.1", "cexpr", "clang-sys", "itertools 0.12.1", @@ -376,9 +376,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.9.0" +version = "2.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd" +checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967" dependencies = [ "serde", ] @@ -472,9 +472,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.20" +version = "1.2.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04da6a0d40b948dfc4fa8f5bbf402b0fc1a64a28dbf7d12ffd683550f2c1b63a" +checksum = "d0fc897dc1e865cc67c0e05a836d9d3f1df3cbe442aa4a9473b18e12624a4951" dependencies = [ "jobserver", "libc", @@ -548,9 +548,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.37" +version = "4.5.39" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eccb054f56cbd38340b380d4a8e69ef1f02f1af43db2f0cc817a4774d80ae071" +checksum = "fd60e63e9be68e5fb56422e397cf9baddded06dae1d2e523401542383bc72a9f" dependencies = [ "clap_builder", "clap_derive", @@ -558,9 +558,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.37" +version = "4.5.39" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efd9466fac8543255d3b1fcad4762c5e116ffe808c8a3043d4263cd4fd4862a2" +checksum = "89cc6392a1f72bbeb820d71f32108f61fdaf18bc526e1d23954168a67759ef51" dependencies = [ "anstream", "anstyle", @@ -570,9 +570,9 @@ dependencies = [ [[package]] name = "clap_complete" -version = "4.5.48" +version = "4.5.52" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be8c97f3a6f02b9e24cadc12aaba75201d18754b53ea0a9d99642f806ccdb4c9" +checksum = "1a554639e42d0c838336fc4fbedb9e2df3ad1fa4acda149f9126b4ccfcd7900f" dependencies = [ "clap", ] @@ -696,9 +696,9 @@ dependencies = [ [[package]] name = "crc" -version = "3.2.1" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69e6e4d7b33a94f0991c26729976b10ebde1d34c3ee82408fb536164fa10d636" +checksum = "9710d3b3739c2e349eb44fe848ad0b7c8cb1e42bd87ee49371df2f7acaf3e675" dependencies = [ "crc-catalog", ] @@ -720,25 +720,22 @@ dependencies = [ [[package]] name = "criterion" -version = "0.5.1" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2b12d017a929603d80db1831cd3a24082f8137ce19c69e6447f54f5fc8d692f" +checksum = "3bf7af66b0989381bd0be551bd7cc91912a655a58c6918420c9527b1fd8b4679" dependencies = [ "anes", "cast", "ciborium", "clap", "criterion-plot", - "is-terminal", - "itertools 0.10.5", + "itertools 0.13.0", "num-traits", - "once_cell", "oorandom", "plotters", "rayon", "regex", "serde", - "serde_derive", "serde_json", "tinytemplate", "walkdir", @@ -816,7 +813,7 @@ version = "0.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f476fe445d41c9e991fd07515a6f463074b782242ccf4a5b7b1d1012e70824df" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.1", "crossterm_winapi", "futures-core", "libc", @@ -1023,9 +1020,9 @@ checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" [[package]] name = "errno" -version = "0.3.11" +version = "0.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "976dd42dc7e85965fe702eb8164f21f450704bdde31faefd6471dba214cb594e" +checksum = "cea14ef9355e3beab063703aa9dab15afd25f0667c341310c1e5274bb1d0da18" dependencies = [ "libc", "windows-sys 0.59.0", @@ -1608,7 +1605,7 @@ dependencies = [ name = "gix-config-value" version = "0.15.0" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.1", "bstr", "document-features", "gix-path", @@ -1817,7 +1814,7 @@ dependencies = [ name = "gix-glob" version = "0.20.1" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.1", "bstr", "document-features", "gix-features", @@ -1867,7 +1864,7 @@ dependencies = [ name = "gix-index" version = "0.40.1" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.1", "bstr", "document-features", "filetime", @@ -1977,7 +1974,7 @@ dependencies = [ name = "gix-negotiate" version = "0.20.1" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.1", "gix-commitgraph", "gix-date", "gix-hash", @@ -2152,7 +2149,7 @@ dependencies = [ name = "gix-pathspec" version = "0.11.0" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.1", "bstr", "gix-attributes", "gix-config-value", @@ -2281,7 +2278,7 @@ dependencies = [ name = "gix-revision" version = "0.34.1" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.1", "bstr", "document-features", "gix-commitgraph", @@ -2316,7 +2313,7 @@ dependencies = [ name = "gix-sec" version = "0.11.0" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.1", "document-features", "gix-path", "libc", @@ -2485,7 +2482,7 @@ dependencies = [ name = "gix-traverse" version = "0.46.2" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.1", "gix-commitgraph", "gix-date", "gix-hash", @@ -2663,9 +2660,9 @@ dependencies = [ [[package]] name = "h2" -version = "0.4.9" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75249d144030531f8dee69fe9cea04d3edf809a017ae445e2abdff6629e86633" +checksum = "a9421a676d1b147b16b82c9225157dc629087ef8ec4d5e2960f9437a90dac0a5" dependencies = [ "atomic-waker", "bytes", @@ -2745,12 +2742,6 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" -[[package]] -name = "hermit-abi" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbf6a919d6cf397374f7dfeeea91d974c7c0a7221d0d0f4f20d859d329e53fcc" - [[package]] name = "hermit-abi" version = "0.5.0" @@ -2834,11 +2825,10 @@ dependencies = [ [[package]] name = "hyper-rustls" -version = "0.27.5" +version = "0.27.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d191583f3da1305256f22463b9bb0471acad48a4e534a5218b9963e9c1f59b2" +checksum = "03a01595e11bdcec50946522c32dde3fc6914743000a68b93000965f2f02406d" dependencies = [ - "futures-util", "http", "hyper", "hyper-util", @@ -2847,7 +2837,7 @@ dependencies = [ "tokio", "tokio-rustls", "tower-service", - "webpki-roots", + "webpki-roots 1.0.0", ] [[package]] @@ -2868,41 +2858,48 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.11" +version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "497bbc33a26fdd4af9ed9c70d63f61cf56a938375fbb32df34db9b1cd6d643f2" +checksum = "b1c293b6b3d21eca78250dc7dbebd6b9210ec5530e038cbfe0661b5c47ab06e8" dependencies = [ + "base64", "bytes", "futures-channel", + "futures-core", "futures-util", "http", "http-body", "hyper", + "ipnet", "libc", + "percent-encoding", "pin-project-lite", "socket2", + "system-configuration", "tokio", "tower-service", "tracing", + "windows-registry", ] [[package]] name = "icu_collections" -version = "1.5.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" +checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47" dependencies = [ "displaydoc", + "potential_utf", "yoke", "zerofrom", "zerovec", ] [[package]] -name = "icu_locid" -version = "1.5.0" +name = "icu_locale_core" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" +checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a" dependencies = [ "displaydoc", "litemap", @@ -2911,31 +2908,11 @@ dependencies = [ "zerovec", ] -[[package]] -name = "icu_locid_transform" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" -dependencies = [ - "displaydoc", - "icu_locid", - "icu_locid_transform_data", - "icu_provider", - "tinystr", - "zerovec", -] - -[[package]] -name = "icu_locid_transform_data" -version = "1.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7515e6d781098bf9f7205ab3fc7e9709d34554ae0b21ddbcb5febfa4bc7df11d" - [[package]] name = "icu_normalizer" -version = "1.5.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" +checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979" dependencies = [ "displaydoc", "icu_collections", @@ -2943,67 +2920,54 @@ dependencies = [ "icu_properties", "icu_provider", "smallvec", - "utf16_iter", - "utf8_iter", - "write16", "zerovec", ] [[package]] name = "icu_normalizer_data" -version = "1.5.1" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5e8338228bdc8ab83303f16b797e177953730f601a96c25d10cb3ab0daa0cb7" +checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3" [[package]] name = "icu_properties" -version = "1.5.1" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" +checksum = "016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b" dependencies = [ "displaydoc", "icu_collections", - "icu_locid_transform", + "icu_locale_core", "icu_properties_data", "icu_provider", - "tinystr", + "potential_utf", + "zerotrie", "zerovec", ] [[package]] name = "icu_properties_data" -version = "1.5.1" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85fb8799753b75aee8d2a21d7c14d9f38921b54b3dbda10f5a3c7a7b82dba5e2" +checksum = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632" [[package]] name = "icu_provider" -version = "1.5.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" +checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af" dependencies = [ "displaydoc", - "icu_locid", - "icu_provider_macros", + "icu_locale_core", "stable_deref_trait", "tinystr", "writeable", "yoke", "zerofrom", + "zerotrie", "zerovec", ] -[[package]] -name = "icu_provider_macros" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - [[package]] name = "idna" version = "1.0.3" @@ -3017,9 +2981,9 @@ dependencies = [ [[package]] name = "idna_adapter" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" +checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" dependencies = [ "icu_normalizer", "icu_properties", @@ -3082,6 +3046,16 @@ version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" +[[package]] +name = "iri-string" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbc5ebe9c3a1a7a5127f920a418f7585e9e758e911d0466ed004f393b0e380b2" +dependencies = [ + "memchr", + "serde", +] + [[package]] name = "is-docker" version = "0.2.0" @@ -3097,7 +3071,7 @@ version = "0.4.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e04d7f318608d35d4b61ddd75cbdaee86b023ebe2bd5a66ee0915f0bf93095a9" dependencies = [ - "hermit-abi 0.5.0", + "hermit-abi", "libc", "windows-sys 0.59.0", ] @@ -3159,9 +3133,9 @@ checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" [[package]] name = "jiff" -version = "0.2.12" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d07d8d955d798e7a4d6f9c58cd1f1916e790b42b092758a9ef6e16fef9f1b3fd" +checksum = "a194df1107f33c79f4f93d02c80798520551949d59dfad22b6157048a88cca93" dependencies = [ "jiff-static", "jiff-tzdb-platform", @@ -3174,9 +3148,9 @@ dependencies = [ [[package]] name = "jiff-static" -version = "0.2.12" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f244cfe006d98d26f859c7abd1318d85327e1882dc9cef80f62daeeb0adcf300" +checksum = "6c6e1db7ed32c6c71b759497fae34bf7933636f75a251b9e736555da426f6442" dependencies = [ "proc-macro2", "quote", @@ -3302,12 +3276,12 @@ checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa" [[package]] name = "libloading" -version = "0.8.6" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc2f4eb4bc735547cfed7c0a4922cbd04a4655978c09b54f1f7b228750664c34" +checksum = "07033963ba89ebaf1584d767badaa2e8fcec21aedea6b8c0346d487d49c28667" dependencies = [ "cfg-if", - "windows-targets 0.52.6", + "windows-targets 0.48.5", ] [[package]] @@ -3316,16 +3290,16 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.1", "libc", "redox_syscall", ] [[package]] name = "libsqlite3-sys" -version = "0.33.0" +version = "0.34.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "947e6816f7825b2b45027c2c32e7085da9934defa535de4a6a46b10a4d5257fa" +checksum = "91632f3b4fb6bd1d72aa3d78f41ffecfcf2b1a6648d8c241dbe7dbfaf4875e15" dependencies = [ "cc", "pkg-config", @@ -3367,9 +3341,9 @@ checksum = "fe7db12097d22ec582439daf8618b8fdd1a7bef6270e9af3b1ebcd30893cf413" [[package]] name = "litemap" -version = "0.7.5" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23fb14cb19457329c82206317a5663005a4d404783dc74f4252769b0d5f42856" +checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" [[package]] name = "litrs" @@ -3379,9 +3353,9 @@ checksum = "b4ce301924b7887e9d637144fdade93f9dfff9b60981d4ac161db09720d39aa5" [[package]] name = "lock_api" -version = "0.4.12" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" +checksum = "96936507f153605bddfcda068dd804796c84324ed2510809e5b2a624c81da765" dependencies = [ "autocfg", "scopeguard", @@ -3405,6 +3379,12 @@ dependencies = [ "hashbrown 0.15.2", ] +[[package]] +name = "lru-slab" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" + [[package]] name = "lzma-sys" version = "0.1.20" @@ -3594,7 +3574,17 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1c10c2894a6fed806ade6027bcd50662746363a9589d3ec9d9bef30a4e4bc166" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.1", +] + +[[package]] +name = "objc2-io-kit" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71c1c64d6120e51cd86033f67176b1cb66780c2efe34dec55176f77befd93c0a" +dependencies = [ + "libc", + "objc2-core-foundation", ] [[package]] @@ -3612,6 +3602,12 @@ version = "1.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" +[[package]] +name = "once_cell_polyfill" +version = "1.70.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4895175b425cb1f87721b59f0f286c2092bd4af812243672510e1ac53e2e0ad" + [[package]] name = "oorandom" version = "11.1.5" @@ -3631,11 +3627,11 @@ dependencies = [ [[package]] name = "openssl" -version = "0.10.72" +version = "0.10.73" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fedfea7d58a1f73118430a55da6a286e7b044961736ce96a16a17068ea25e5da" +checksum = "8505734d46c8ab1e19a1dce3aef597ad87dcb4c37e7188231769bd6bd51cebf8" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.1", "cfg-if", "foreign-types", "libc", @@ -3663,9 +3659,9 @@ checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" [[package]] name = "openssl-sys" -version = "0.9.108" +version = "0.9.109" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e145e1651e858e820e4860f7b9c5e169bc1d8ce1c86043be79fa7b7634821847" +checksum = "90096e2e47630d78b7d1c20952dc621f957103f8bc2c8359ec81290d75238571" dependencies = [ "cc", "libc", @@ -3687,9 +3683,9 @@ checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" [[package]] name = "parking_lot" -version = "0.12.3" +version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" +checksum = "70d58bf43669b5795d1576d0641cfb6fbb2057bf629506267a92807158584a13" dependencies = [ "lock_api", "parking_lot_core", @@ -3697,9 +3693,9 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.10" +version = "0.9.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" +checksum = "bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5" dependencies = [ "cfg-if", "libc", @@ -3791,15 +3787,15 @@ dependencies = [ [[package]] name = "polling" -version = "3.7.4" +version = "3.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a604568c3202727d1507653cb121dbd627a58684eb09a820fd746bee38b4442f" +checksum = "b53a684391ad002dd6a596ceb6c74fd004fdce75f4be2e3f615068abbea5fd50" dependencies = [ "cfg-if", "concurrent-queue", - "hermit-abi 0.4.0", + "hermit-abi", "pin-project-lite", - "rustix 0.38.44", + "rustix 1.0.7", "tracing", "windows-sys 0.59.0", ] @@ -3819,6 +3815,15 @@ dependencies = [ "portable-atomic", ] +[[package]] +name = "potential_utf" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5a7c30837279ca13e7c867e9e40053bc68740f988cb07f7ca6df43cc734b585" +dependencies = [ + "zerovec", +] + [[package]] name = "ppv-lite86" version = "0.2.21" @@ -3840,9 +3845,9 @@ dependencies = [ [[package]] name = "prettyplease" -version = "0.2.32" +version = "0.2.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "664ec5419c51e34154eec046ebcba56312d5a2fc3b09a06da188e1ad21afadf6" +checksum = "9dee91521343f4c5c6a63edd65e54f31f5c92fe8978c40a4282f8372194c6a7d" dependencies = [ "proc-macro2", "syn 2.0.101", @@ -3891,9 +3896,9 @@ dependencies = [ [[package]] name = "quinn" -version = "0.11.7" +version = "0.11.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3bd15a6f2967aef83887dcb9fec0014580467e33720d073560cf015a5683012" +checksum = "626214629cda6781b6dc1d316ba307189c85ba657213ce642d9c77670f8202c8" dependencies = [ "bytes", "cfg_aliases", @@ -3911,12 +3916,13 @@ dependencies = [ [[package]] name = "quinn-proto" -version = "0.11.11" +version = "0.11.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bcbafbbdbb0f638fe3f35f3c56739f77a8a1d070cb25603226c83339b391472b" +checksum = "49df843a9161c85bb8aae55f101bc0bac8bcafd637a620d9122fd7e0b2f7422e" dependencies = [ "bytes", "getrandom 0.3.2", + "lru-slab", "rand", "ring", "rustc-hash 2.1.1", @@ -3993,7 +3999,7 @@ version = "0.26.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f44c9e68fd46eda15c646fbb85e1040b657a58cdc8c98db1d97a55930d991eef" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.1", "cassowary", "compact_str", "crossterm", @@ -4029,11 +4035,11 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.11" +version = "0.5.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2f103c6d277498fbceb16e84d317e2a400f160f46904d5f5410848c829511a3" +checksum = "928fca9cf2aa042393a8325b9ead81d2f0df4cb12e1e24cef072922ccd99c5af" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.1", ] [[package]] @@ -4067,9 +4073,9 @@ checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" [[package]] name = "reqwest" -version = "0.12.15" +version = "0.12.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d19c46a6fdd48bc4dab94b6103fccc55d34c67cc0ad04653aad4ea2a07cd7bbb" +checksum = "e98ff6b0dbbe4d5a37318f433d4fc82babd21631f194d370409ceb2e40b2f0b5" dependencies = [ "base64", "bytes", @@ -4095,24 +4101,22 @@ dependencies = [ "pin-project-lite", "quinn", "rustls", - "rustls-pemfile", "rustls-pki-types", "serde", "serde_json", "serde_urlencoded", "sync_wrapper", - "system-configuration", "tokio", "tokio-native-tls", "tokio-rustls", "tower", + "tower-http", "tower-service", "url", "wasm-bindgen", "wasm-bindgen-futures", "web-sys", - "webpki-roots", - "windows-registry", + "webpki-roots 1.0.0", ] [[package]] @@ -4131,11 +4135,11 @@ dependencies = [ [[package]] name = "rusqlite" -version = "0.35.0" +version = "0.36.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a22715a5d6deef63c637207afbe68d0c72c3f8d0022d7cf9714c442d6157606b" +checksum = "3de23c3319433716cf134eed225fe9986bc24f63bed9be9f20c329029e672dc7" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.1", "fallible-iterator", "fallible-streaming-iterator", "hashlink", @@ -4167,7 +4171,7 @@ version = "0.38.44" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.1", "errno", "libc", "linux-raw-sys 0.4.15", @@ -4180,7 +4184,7 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c71e83d6afe7ff64890ec6b71d6a69bb8a610ab78ce364b3352876bb4c801266" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.1", "errno", "libc", "linux-raw-sys 0.9.3", @@ -4189,15 +4193,15 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.26" +version = "0.23.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df51b5869f3a441595eac5e8ff14d486ff285f7b8c0df8770e49c3b56351f0f0" +checksum = "730944ca083c1c233a75c09f199e973ca499344a2b7ba9e755c457e86fb4a321" dependencies = [ "aws-lc-rs", "once_cell", "ring", "rustls-pki-types", - "rustls-webpki 0.103.0", + "rustls-webpki 0.103.3", "subtle", "zeroize", ] @@ -4241,11 +4245,12 @@ dependencies = [ [[package]] name = "rustls-pki-types" -version = "1.11.0" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "917ce264624a4b4db1c364dcc35bfca9ded014d0a958cd47ad3e960e988ea51c" +checksum = "229a4a4c221013e7e1f1a043678c5cc39fe5171437c88fb47151a21e6f5b5c79" dependencies = [ "web-time", + "zeroize", ] [[package]] @@ -4265,7 +4270,7 @@ dependencies = [ "rustls-webpki 0.102.8", "security-framework", "security-framework-sys", - "webpki-roots", + "webpki-roots 0.26.11", "winapi", ] @@ -4289,9 +4294,9 @@ dependencies = [ [[package]] name = "rustls-webpki" -version = "0.103.0" +version = "0.103.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0aa4eeac2588ffff23e9d7a7e9b3f971c5fb5b7ebc9452745e0c232c64f83b2f" +checksum = "e4a72fe2bcf7a6ac6fd7d0b9e5cb68aeb7d4c0a0271730218b3e92d43b4eb435" dependencies = [ "aws-lc-rs", "ring", @@ -4301,9 +4306,9 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.20" +version = "1.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eded382c5f5f786b989652c49544c4877d9f015cc22e145a5ea8ea66c2921cd2" +checksum = "8a0d197bd2c9dc6e53b84da9556a69ba4cdfab8619eb41a8bd1cc2027a0f6b1d" [[package]] name = "ryu" @@ -4356,7 +4361,7 @@ version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.1", "core-foundation", "core-foundation-sys", "libc", @@ -4496,9 +4501,9 @@ checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" [[package]] name = "signal-hook" -version = "0.3.17" +version = "0.3.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8621587d4798caf8eb44879d42e56b9a93ea5dcd315a6487c357130095b62801" +checksum = "d881a16cf4426aa584979d30bd82cb33429027e42122b169753d6ef1085ed6e2" dependencies = [ "libc", "signal-hook-registry", @@ -4556,9 +4561,9 @@ dependencies = [ [[package]] name = "socket2" -version = "0.5.9" +version = "0.5.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f5fd57c80058a56cf5c777ab8a126398ece8e442983605d280a44ce79d0edef" +checksum = "e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678" dependencies = [ "libc", "windows-sys 0.52.0", @@ -4670,15 +4675,16 @@ dependencies = [ [[package]] name = "sysinfo" -version = "0.34.2" +version = "0.35.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4b93974b3d3aeaa036504b8eefd4c039dced109171c1ae973f1dc63b2c7e4b2" +checksum = "79251336d17c72d9762b8b54be4befe38d2db56fbbc0241396d70f173c39d47a" dependencies = [ "libc", "memchr", "ntapi", "objc2-core-foundation", - "windows 0.57.0", + "objc2-io-kit", + "windows 0.61.1", ] [[package]] @@ -4687,7 +4693,7 @@ version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.1", "core-foundation", "system-configuration-sys", ] @@ -4721,9 +4727,9 @@ checksum = "1ac9aa371f599d22256307c24a9d748c041e548cbf599f35d890f9d365361790" [[package]] name = "tempfile" -version = "3.19.1" +version = "3.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7437ac7763b9b123ccf33c338a5cc1bac6f69b45a136c19bdd8a65e3916435bf" +checksum = "e8a64e3985349f2441a1a9ef0b853f869006c3855f2cda6862a94d26ebb9d6a1" dependencies = [ "fastrand", "getrandom 0.3.2", @@ -4809,9 +4815,9 @@ dependencies = [ [[package]] name = "tinystr" -version = "0.7.6" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" +checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b" dependencies = [ "displaydoc", "zerovec", @@ -4844,9 +4850,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.44.2" +version = "1.45.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6b88822cbe49de4185e3a4cbf8321dd487cf5fe0c5c65695fef6346371e9c48" +checksum = "75ef51a33ef1da925cea3e4eb122833cb377c61439ca401b770f54902b806779" dependencies = [ "backtrace", "bytes", @@ -4946,6 +4952,24 @@ dependencies = [ "tower-service", ] +[[package]] +name = "tower-http" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fdb0c213ca27a9f57ab69ddb290fd80d970922355b83ae380b395d3986b8a2e" +dependencies = [ + "bitflags 2.9.1", + "bytes", + "futures-util", + "http", + "http-body", + "iri-string", + "pin-project-lite", + "tower", + "tower-layer", + "tower-service", +] + [[package]] name = "tower-layer" version = "0.3.3" @@ -5036,9 +5060,9 @@ checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" [[package]] name = "trybuild" -version = "1.0.104" +version = "1.0.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ae08be68c056db96f0e6c6dd820727cca756ced9e1f4cc7fdd20e2a55e23898" +checksum = "1c9bf9513a2f4aeef5fdac8677d7d349c79fdbcc03b9c86da6e9d254f1e43be2" dependencies = [ "glob", "serde", @@ -5137,12 +5161,6 @@ dependencies = [ "percent-encoding", ] -[[package]] -name = "utf16_iter" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" - [[package]] name = "utf8_iter" version = "1.0.4" @@ -5306,9 +5324,18 @@ dependencies = [ [[package]] name = "webpki-roots" -version = "0.26.10" +version = "0.26.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "521bc38abb08001b01866da9f51eb7c5d647a19260e00054a8c7fd5f9e57f7a9" +dependencies = [ + "webpki-roots 1.0.0", +] + +[[package]] +name = "webpki-roots" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37493cadf42a2a939ed404698ded7fb378bf301b5011f973361779a3a74f8c93" +checksum = "2853738d1cc4f2da3a225c18ec6c3721abb31961096e9dbf5ab35fa88b19cfdb" dependencies = [ "rustls-pki-types", ] @@ -5347,7 +5374,7 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" dependencies = [ - "windows-sys 0.59.0", + "windows-sys 0.48.0", ] [[package]] @@ -5365,16 +5392,6 @@ dependencies = [ "windows-targets 0.42.2", ] -[[package]] -name = "windows" -version = "0.57.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12342cb4d8e3b046f3d80effd474a7a02447231330ef77d71daa6fbc40681143" -dependencies = [ - "windows-core 0.57.0", - "windows-targets 0.52.6", -] - [[package]] name = "windows" version = "0.61.1" @@ -5382,7 +5399,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c5ee8f3d025738cb02bad7868bbb5f8a6327501e870bf51f1b455b0a2454a419" dependencies = [ "windows-collections", - "windows-core 0.61.0", + "windows-core", "windows-future", "windows-link", "windows-numerics", @@ -5394,19 +5411,7 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3beeceb5e5cfd9eb1d76b381630e82c4241ccd0d27f1a39ed41b2760b255c5e8" dependencies = [ - "windows-core 0.61.0", -] - -[[package]] -name = "windows-core" -version = "0.57.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2ed2439a290666cd67ecce2b0ffaad89c2a56b976b736e6ece670297897832d" -dependencies = [ - "windows-implement 0.57.0", - "windows-interface 0.57.0", - "windows-result 0.1.2", - "windows-targets 0.52.6", + "windows-core", ] [[package]] @@ -5415,10 +5420,10 @@ version = "0.61.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4763c1de310c86d75a878046489e2e5ba02c649d185f21c67d4cf8a56d098980" dependencies = [ - "windows-implement 0.60.0", - "windows-interface 0.59.1", + "windows-implement", + "windows-interface", "windows-link", - "windows-result 0.3.2", + "windows-result", "windows-strings 0.4.0", ] @@ -5428,21 +5433,10 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a1d6bbefcb7b60acd19828e1bc965da6fcf18a7e39490c5f8be71e54a19ba32" dependencies = [ - "windows-core 0.61.0", + "windows-core", "windows-link", ] -[[package]] -name = "windows-implement" -version = "0.57.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9107ddc059d5b6fbfbffdfa7a7fe3e22a226def0b2608f72e9d552763d3e1ad7" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - [[package]] name = "windows-implement" version = "0.60.0" @@ -5454,17 +5448,6 @@ dependencies = [ "syn 2.0.101", ] -[[package]] -name = "windows-interface" -version = "0.57.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29bee4b38ea3cde66011baa44dba677c432a78593e202392d1e9070cf2a7fca7" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - [[package]] name = "windows-interface" version = "0.59.1" @@ -5488,7 +5471,7 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9150af68066c4c5c07ddc0ce30421554771e528bde427614c61038bc2c92c2b1" dependencies = [ - "windows-core 0.61.0", + "windows-core", "windows-link", ] @@ -5498,20 +5481,11 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4286ad90ddb45071efd1a66dfa43eb02dd0dfbae1545ad6cc3c51cf34d7e8ba3" dependencies = [ - "windows-result 0.3.2", + "windows-result", "windows-strings 0.3.1", "windows-targets 0.53.0", ] -[[package]] -name = "windows-result" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e383302e8ec8515204254685643de10811af0ed97ea37210dc26fb0032647f8" -dependencies = [ - "windows-targets 0.52.6", -] - [[package]] name = "windows-result" version = "0.3.2" @@ -5810,9 +5784,9 @@ checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" [[package]] name = "winnow" -version = "0.7.7" +version = "0.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6cb8234a863ea0e8cd7284fcdd4f145233eb00fee02bbdd9861aec44e6477bc5" +checksum = "c06928c8748d81b05c9be96aad92e1b6ff01833332f281e8cfca3be4b35fc9ec" dependencies = [ "memchr", ] @@ -5833,20 +5807,14 @@ version = "0.39.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.1", ] -[[package]] -name = "write16" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" - [[package]] name = "writeable" -version = "0.5.5" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" +checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" [[package]] name = "xattr" @@ -5875,9 +5843,9 @@ checksum = "cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049" [[package]] name = "yoke" -version = "0.7.5" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" +checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc" dependencies = [ "serde", "stable_deref_trait", @@ -5887,9 +5855,9 @@ dependencies = [ [[package]] name = "yoke-derive" -version = "0.7.5" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" +checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" dependencies = [ "proc-macro2", "quote", @@ -5964,11 +5932,22 @@ version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" +[[package]] +name = "zerotrie" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", +] + [[package]] name = "zerovec" -version = "0.10.4" +version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" +checksum = "4a05eb080e015ba39cc9e23bbe5e7fb04d5fb040350f99f34e338d5fdd294428" dependencies = [ "yoke", "zerofrom", @@ -5977,9 +5956,9 @@ dependencies = [ [[package]] name = "zerovec-derive" -version = "0.10.3" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" +checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" dependencies = [ "proc-macro2", "quote", @@ -5988,9 +5967,9 @@ dependencies = [ [[package]] name = "zip" -version = "3.0.0" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12598812502ed0105f607f941c386f43d441e00148fce9dec3ca5ffb0bde9308" +checksum = "153a6fff49d264c4babdcfa6b4d534747f520e56e8f0f384f3b808c4b64cc1fd" dependencies = [ "arbitrary", "crc32fast", diff --git a/Cargo.toml b/Cargo.toml index 559c4367fe2..e0f002ded7a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -155,8 +155,8 @@ gitoxide-core = { version = "^0.47.1", path = "gitoxide-core" } gix-features = { version = "^0.42.1", path = "gix-features" } gix = { version = "^0.72.1", path = "gix", default-features = false } -clap = { version = "4.5.37", features = ["derive", "cargo"] } -clap_complete = "4.5.48" +clap = { version = "4.5.39", features = ["derive", "cargo"] } +clap_complete = "4.5.52" prodash = { version = "29.0.2", optional = true } is-terminal = { version = "0.4.0", optional = true } env_logger = { version = "0.11.8", default-features = false } diff --git a/gitoxide-core/Cargo.toml b/gitoxide-core/Cargo.toml index c210488f6b0..5a1482e9db0 100644 --- a/gitoxide-core/Cargo.toml +++ b/gitoxide-core/Cargo.toml @@ -59,13 +59,13 @@ serde = { version = "1.0.114", optional = true, default-features = false, featur anyhow = "1.0.98" thiserror = "2.0.0" bytesize = "2.0.1" -tempfile = "3.19.1" +tempfile = "3.20.0" # for async-client async-trait = { version = "0.1.51", optional = true } async-net = { version = "2.0", optional = true } futures-lite = { version = "2.1.0", optional = true } -async-io = { version = "2.2", optional = true } +async-io = { version = "2.4", optional = true } futures-io = { version = "0.3.16", optional = true } blocking = { version = "1.0.2", optional = true } @@ -79,11 +79,11 @@ crossbeam-channel = { version = "0.5.15", optional = true } smallvec = { version = "1.15.0", optional = true } # for 'query' and 'corpus' -rusqlite = { version = "0.35.0", optional = true, features = ["bundled"] } +rusqlite = { version = "0.36.0", optional = true, features = ["bundled"] } # for 'corpus' -parking_lot = { version = "0.12.1", optional = true } -sysinfo = { version = "0.34.2", optional = true, default-features = false, features = ["system"] } +parking_lot = { version = "0.12.4", optional = true } +sysinfo = { version = "0.35.1", optional = true, default-features = false, features = ["system"] } serde_json = { version = "1.0.65", optional = true } tracing-forest = { version = "0.1.5", features = ["serde"], optional = true } tracing-subscriber = { version = "0.3.17", optional = true } diff --git a/gix-actor/Cargo.toml b/gix-actor/Cargo.toml index a3ab91b734b..a67f5de1575 100644 --- a/gix-actor/Cargo.toml +++ b/gix-actor/Cargo.toml @@ -27,7 +27,7 @@ bstr = { version = "1.12.0", default-features = false, features = [ "std", "unicode", ] } -winnow = { version = "0.7.7", features = ["simd"] } +winnow = { version = "0.7.10", features = ["simd"] } itoa = "1.0.1" serde = { version = "1.0.114", optional = true, default-features = false, features = [ "derive", diff --git a/gix-archive/Cargo.toml b/gix-archive/Cargo.toml index 3ba25cf8069..d45d86888b2 100644 --- a/gix-archive/Cargo.toml +++ b/gix-archive/Cargo.toml @@ -34,8 +34,8 @@ gix-path = { version = "^0.10.18", path = "../gix-path", optional = true } gix-date = { version = "^0.10.2", path = "../gix-date" } flate2 = { version = "1.1.1", optional = true, default-features = false, features = ["zlib-rs"] } -zip = { version = "3.0.0", optional = true, default-features = false, features = ["deflate"] } -jiff = { version = "0.2.12", default-features = false, features = ["std"] } +zip = { version = "4.0.0", optional = true, default-features = false, features = ["deflate"] } +jiff = { version = "0.2.14", default-features = false, features = ["std"] } thiserror = "2.0.0" bstr = { version = "1.12.0", default-features = false } diff --git a/gix-config/Cargo.toml b/gix-config/Cargo.toml index 64161aabfe6..ebfc4fddb2e 100644 --- a/gix-config/Cargo.toml +++ b/gix-config/Cargo.toml @@ -26,7 +26,7 @@ gix-sec = { version = "^0.11.0", path = "../gix-sec" } gix-ref = { version = "^0.52.1", path = "../gix-ref" } gix-glob = { version = "^0.20.1", path = "../gix-glob" } -winnow = { version = "0.7.7", features = ["simd"] } +winnow = { version = "0.7.10", features = ["simd"] } memchr = "2" thiserror = "2.0.0" unicode-bom = { version = "2.0.3" } @@ -38,7 +38,7 @@ once_cell = "1.21.3" document-features = { version = "0.2.0", optional = true } [dev-dependencies] -criterion = "0.5.1" +criterion = "0.6.0" [[bench]] name = "large_config_file" diff --git a/gix-date/Cargo.toml b/gix-date/Cargo.toml index 16ce68bbb5d..c1bb1e9cd7d 100644 --- a/gix-date/Cargo.toml +++ b/gix-date/Cargo.toml @@ -22,7 +22,7 @@ serde = ["dep:serde", "bstr/serde"] bstr = { version = "1.12.0", default-features = false, features = ["std"] } serde = { version = "1.0.114", optional = true, default-features = false, features = ["derive"] } itoa = "1.0.1" -jiff = "0.2.12" +jiff = "0.2.14" thiserror = "2.0.0" # TODO: used for quick and easy `TimeBacking: std::io::Write` implementation, but could make that `Copy` # and remove this dep with custom impl diff --git a/gix-discover/Cargo.toml b/gix-discover/Cargo.toml index b5c896a401e..82e91690209 100644 --- a/gix-discover/Cargo.toml +++ b/gix-discover/Cargo.toml @@ -36,4 +36,4 @@ is_ci = "1.1.1" defer = "0.2.1" [target.'cfg(any(unix, windows))'.dev-dependencies] -tempfile = "3.19.1" +tempfile = "3.20.0" diff --git a/gix-features/Cargo.toml b/gix-features/Cargo.toml index 045c9cfca3e..6942cb3fdb8 100644 --- a/gix-features/Cargo.toml +++ b/gix-features/Cargo.toml @@ -106,7 +106,7 @@ gix-utils = { version = "^0.3.0", path = "../gix-utils", optional = true } # 'parallel' feature crossbeam-channel = { version = "0.5.15", optional = true } -parking_lot = { version = "0.12.0", default-features = false, optional = true } +parking_lot = { version = "0.12.4", default-features = false, optional = true } walkdir = { version = "2.3.2", optional = true } # used when parallel is off diff --git a/gix-fs/Cargo.toml b/gix-fs/Cargo.toml index fde4273b356..432c2ee58fb 100644 --- a/gix-fs/Cargo.toml +++ b/gix-fs/Cargo.toml @@ -32,4 +32,4 @@ fastrand = { version = "2.1.0", default-features = false, features = ["std"] } [dev-dependencies] crossbeam-channel = "0.5.15" is_ci = "1.1.1" -tempfile = "3.19.1" +tempfile = "3.20.0" diff --git a/gix-hashtable/Cargo.toml b/gix-hashtable/Cargo.toml index c49b15996a0..31fadc49451 100644 --- a/gix-hashtable/Cargo.toml +++ b/gix-hashtable/Cargo.toml @@ -15,7 +15,7 @@ rust-version = "1.70" doctest = false [dependencies] -parking_lot = "0.12.1" +parking_lot = "0.12.4" hashbrown = { version = "0.14.0", default-features = false, features = [ "inline-more", "raw" diff --git a/gix-lock/Cargo.toml b/gix-lock/Cargo.toml index ff0f8bb051c..545e0ea51b0 100644 --- a/gix-lock/Cargo.toml +++ b/gix-lock/Cargo.toml @@ -21,4 +21,4 @@ gix-tempfile = { version = "^17.1.0", default-features = false, path = "../gix-t thiserror = "2.0.0" [dev-dependencies] -tempfile = "3.19.1" +tempfile = "3.20.0" diff --git a/gix-object/Cargo.toml b/gix-object/Cargo.toml index d3ec2227224..81067ef4722 100644 --- a/gix-object/Cargo.toml +++ b/gix-object/Cargo.toml @@ -58,7 +58,7 @@ bstr = { version = "1.12.0", default-features = false, features = [ "std", "unicode", ] } -winnow = { version = "0.7.7", features = ["simd"] } +winnow = { version = "0.7.10", features = ["simd"] } smallvec = { version = "1.15.0", features = ["write"] } serde = { version = "1.0.114", optional = true, default-features = false, features = [ "derive", @@ -67,7 +67,7 @@ serde = { version = "1.0.114", optional = true, default-features = false, featur document-features = { version = "0.2.0", optional = true } [dev-dependencies] -criterion = "0.5.1" +criterion = "0.6.0" pretty_assertions = "1.0.0" gix-testtools = { path = "../tests/tools" } gix-odb = { path = "../gix-odb" } diff --git a/gix-odb/Cargo.toml b/gix-odb/Cargo.toml index 499a34e57c4..8dca99eecf0 100644 --- a/gix-odb/Cargo.toml +++ b/gix-odb/Cargo.toml @@ -31,9 +31,9 @@ gix-pack = { version = "^0.59.1", path = "../gix-pack", default-features = false gix-fs = { version = "^0.15.0", path = "../gix-fs" } serde = { version = "1.0.114", optional = true, default-features = false, features = ["derive"] } -tempfile = "3.19.1" +tempfile = "3.20.0" thiserror = "2.0.0" -parking_lot = { version = "0.12.0" } +parking_lot = { version = "0.12.4" } arc-swap = "1.5.0" document-features = { version = "0.2.0", optional = true } diff --git a/gix-pack/Cargo.toml b/gix-pack/Cargo.toml index fc4a5c1a48c..b463e18136c 100644 --- a/gix-pack/Cargo.toml +++ b/gix-pack/Cargo.toml @@ -47,7 +47,7 @@ gix-diff = { version = "^0.52.1", path = "../gix-diff", default-features = false memmap2 = "0.9.0" smallvec = "1.15.0" -parking_lot = { version = "0.12.0", default-features = false, optional = true } +parking_lot = { version = "0.12.4", default-features = false, optional = true } thiserror = "2.0.0" # for caching diff --git a/gix-prompt/Cargo.toml b/gix-prompt/Cargo.toml index e621f563d36..cce12ffc93d 100644 --- a/gix-prompt/Cargo.toml +++ b/gix-prompt/Cargo.toml @@ -22,7 +22,7 @@ thiserror = "2.0.0" [target.'cfg(unix)'.dependencies] rustix = { version = "1.0.7", features = ["termios"] } -parking_lot = "0.12.1" +parking_lot = "0.12.4" [dev-dependencies] gix-testtools = { path = "../tests/tools" } diff --git a/gix-protocol/Cargo.toml b/gix-protocol/Cargo.toml index 43f9bd4a466..5afdd6da987 100644 --- a/gix-protocol/Cargo.toml +++ b/gix-protocol/Cargo.toml @@ -94,7 +94,7 @@ bstr = { version = "1.12.0", default-features = false, features = [ "std", "unicode", ] } -winnow = { version = "0.7.7", features = ["simd"] } +winnow = { version = "0.7.10", features = ["simd"] } # for async-client async-trait = { version = "0.1.51", optional = true } diff --git a/gix-ref/Cargo.toml b/gix-ref/Cargo.toml index eda2f72e973..c878727a601 100644 --- a/gix-ref/Cargo.toml +++ b/gix-ref/Cargo.toml @@ -33,7 +33,7 @@ gix-lock = { version = "^17.1.0", path = "../gix-lock" } gix-tempfile = { version = "^17.1.0", default-features = false, path = "../gix-tempfile" } thiserror = "2.0.0" -winnow = { version = "0.7.7", features = ["simd"] } +winnow = { version = "0.7.10", features = ["simd"] } serde = { version = "1.0.114", optional = true, default-features = false, features = ["derive"] } # packed refs diff --git a/gix-sec/Cargo.toml b/gix-sec/Cargo.toml index a921bf41496..eece240a201 100644 --- a/gix-sec/Cargo.toml +++ b/gix-sec/Cargo.toml @@ -41,7 +41,7 @@ windows-sys = { version = "0.59.0", features = [ ] } [dev-dependencies] -tempfile = "3.19.1" +tempfile = "3.20.0" [package.metadata.docs.rs] all-features = true diff --git a/gix-tempfile/Cargo.toml b/gix-tempfile/Cargo.toml index 0e5e96c4880..7369bd3b310 100644 --- a/gix-tempfile/Cargo.toml +++ b/gix-tempfile/Cargo.toml @@ -32,12 +32,12 @@ test = true [dependencies] gix-fs = { version = "^0.15.0", path = "../gix-fs" } -parking_lot = "0.12.1" +parking_lot = "0.12.4" dashmap = { version = "6.0.1", optional = true } once_cell = { version = "1.21.3", default-features = false, features = ["race", "std"] } -tempfile = "3.19.1" +tempfile = "3.20.0" -signal-hook = { version = "0.3.9", default-features = false, optional = true } +signal-hook = { version = "0.3.18", default-features = false, optional = true } signal-hook-registry = { version = "1.4.5", optional = true } document-features = { version = "0.2.0", optional = true } diff --git a/gix-transport/Cargo.toml b/gix-transport/Cargo.toml index 19967c66f12..eeea87b8bcd 100644 --- a/gix-transport/Cargo.toml +++ b/gix-transport/Cargo.toml @@ -113,7 +113,7 @@ curl = { version = "0.4", optional = true } # for http-client-reqwest # all but the 'default-tls' feature -reqwest = { version = "0.12.0", optional = true, default-features = false, features = ["blocking", "charset", "http2", "macos-system-configuration"] } +reqwest = { version = "0.12.18", optional = true, default-features = false, features = ["blocking", "charset", "http2", "macos-system-configuration"] } ## If used in conjunction with `async-client`, the `connect()` method will become available along with supporting the git protocol over TCP, ## where the TCP stream is created using this crate. diff --git a/gix-worktree-stream/Cargo.toml b/gix-worktree-stream/Cargo.toml index 67864439078..6200b1e9933 100644 --- a/gix-worktree-stream/Cargo.toml +++ b/gix-worktree-stream/Cargo.toml @@ -25,7 +25,7 @@ gix-fs = { version = "^0.15.0", path = "../gix-fs" } gix-path = { version = "^0.10.18", path = "../gix-path" } thiserror = "2.0.0" -parking_lot = "0.12.1" +parking_lot = "0.12.4" [dev-dependencies] gix-testtools = { path = "../tests/tools" } diff --git a/gix/Cargo.toml b/gix/Cargo.toml index a72db419b32..6cc8c1e50a1 100644 --- a/gix/Cargo.toml +++ b/gix/Cargo.toml @@ -372,7 +372,7 @@ gix-transport = { version = "^0.47.0", path = "../gix-transport", optional = tru # Just to get the progress-tree feature prodash = { version = "29.0.2", optional = true, features = ["progress-tree"] } once_cell = "1.21.3" -signal-hook = { version = "0.3.9", default-features = false, optional = true } +signal-hook = { version = "0.3.18", default-features = false, optional = true } thiserror = "2.0.0" serde = { version = "1.0.114", optional = true, default-features = false, features = [ "derive", @@ -389,7 +389,7 @@ regex = { version = "1.6.0", optional = true, default-features = false, features ] } # for `interrupt` feature -parking_lot = { version = "0.12.1", optional = true } +parking_lot = { version = "0.12.4", optional = true } document-features = { version = "0.2.0", optional = true } diff --git a/tests/it/Cargo.toml b/tests/it/Cargo.toml index fc14c13747e..5895ee5dab8 100644 --- a/tests/it/Cargo.toml +++ b/tests/it/Cargo.toml @@ -16,7 +16,7 @@ path = "src/main.rs" [dependencies] anyhow = "1.0.98" -clap = { version = "4.5.37", features = ["derive"] } +clap = { version = "4.5.39", features = ["derive"] } gix = { version = "^0.72.1", path = "../../gix", default-features = false, features = ["attributes", "revision"] } once_cell = "1.21.3" regex = { version = "1.11.1", default-features = false, features = ["std"] } diff --git a/tests/tools/Cargo.toml b/tests/tools/Cargo.toml index 3369c00441b..083002b64d4 100644 --- a/tests/tools/Cargo.toml +++ b/tests/tools/Cargo.toml @@ -31,14 +31,14 @@ gix-worktree = { version = "0.41.0", path = "../../gix-worktree" } gix-fs = { version = "0.15.0", path = "../../gix-fs" } gix-tempfile = { version = "17.1.0", path = "../../gix-tempfile", default-features = false, features = ["signals"] } -winnow = { version = "0.7.7", features = ["simd"] } +winnow = { version = "0.7.10", features = ["simd"] } fastrand = "2.0.0" bstr = { version = "1.12.0", default-features = false } -crc = "3.0.0" +crc = "3.3.0" once_cell = "1.21.3" -tempfile = "3.19.1" +tempfile = "3.20.0" fs_extra = "1.2.0" -parking_lot = { version = "0.12.0" } +parking_lot = { version = "0.12.4" } is_ci = "1.1.1" io-close = "0.3.7" tar = { version = "0.4.38", default-features = false } From eccd13a4b5b39422e04a00cedc81c8991c9eba3e Mon Sep 17 00:00:00 2001 From: Eliah Kagan Date: Fri, 16 May 2025 04:33:35 -0400 Subject: [PATCH 097/166] Adapt `gix-config` tests to changes in `tempfile` `tempfile` version 3.20.0 introduces the clearer name `TempDir::keep()` for `TempDir::into_path()`, deprecating the latter. This commit changes calls in `gix-config` tests to use `keep()`, fixing new `clippy` errors. --- .../init/from_paths/includes/conditional/gitdir/util.rs | 6 +++--- .../file/init/from_paths/includes/conditional/onbranch.rs | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/gix-config/tests/config/file/init/from_paths/includes/conditional/gitdir/util.rs b/gix-config/tests/config/file/init/from_paths/includes/conditional/gitdir/util.rs index b7057d8351b..c78da3b016a 100644 --- a/gix-config/tests/config/file/init/from_paths/includes/conditional/gitdir/util.rs +++ b/gix-config/tests/config/file/init/from_paths/includes/conditional/gitdir/util.rs @@ -143,7 +143,7 @@ pub fn assert_section_value( None => None, }, "gix-config disagrees with the expected value, {} for debugging", - env.tempdir.into_path().display() + env.tempdir.keep().display() ); assure_git_agrees(expected, env) } @@ -173,7 +173,7 @@ fn assure_git_agrees(expected: Option, env: GitEnv) -> crate::Result { expected.is_some(), "{:?}, {} for debugging", output, - env.tempdir.into_path().display() + env.tempdir.keep().display() ); let git_output: BString = output.stdout.trim_end().into(); assert_eq!( @@ -184,7 +184,7 @@ fn assure_git_agrees(expected: Option, env: GitEnv) -> crate::Result { None => "", }, "git disagrees with gix-config, {:?} for debugging", - env.tempdir.into_path() + env.tempdir.keep() ); Ok(()) } diff --git a/gix-config/tests/config/file/init/from_paths/includes/conditional/onbranch.rs b/gix-config/tests/config/file/init/from_paths/includes/conditional/onbranch.rs index 6b7e1d6042a..bca3cca9774 100644 --- a/gix-config/tests/config/file/init/from_paths/includes/conditional/onbranch.rs +++ b/gix-config/tests/config/file/init/from_paths/includes/conditional/onbranch.rs @@ -265,7 +265,7 @@ value = branch-override-by-include dir, gix_testtools::tempfile::TempDir::new().expect("substitute can be created"), ); - dir.into_path() + dir.keep() } ); @@ -290,7 +290,7 @@ fn assure_git_agrees(expected: Value, dir: &mut gix_testtools::tempfile::TempDir dir, gix_testtools::tempfile::TempDir::new().expect("substitute can be created"), ); - dir.into_path() + dir.keep() }; assert!( output.status.success(), From 91aef25a9febd440a8c14ce9d73716b5b1de6257 Mon Sep 17 00:00:00 2001 From: Eliah Kagan Date: Sun, 18 May 2025 23:56:17 -0400 Subject: [PATCH 098/166] Adapt `gix-config`/`gix-object` benches to changes in `criterion` `criterion` 0.6.0 deprecates `criterion::black_box()`, preferring `std::hint::black_box()` (which `criterion::black_box()` now consists of a call to). This commit makes the recommended switch, in benches for `gix-config` and `gix-object` where `criterion::black_box()` was used, to `std::hint::black_box()`, fixing new clippy errors. Fuzz tests have also been using `black_box()`, but they already imported it from `std::hint`, and thus need no corresponding fix. --- gix-config/benches/large_config_file.rs | 3 ++- gix-object/benches/decode_objects.rs | 3 ++- gix-object/benches/edit_tree.rs | 4 ++-- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/gix-config/benches/large_config_file.rs b/gix-config/benches/large_config_file.rs index 7beec7fce4b..f7ddbc04d52 100644 --- a/gix-config/benches/large_config_file.rs +++ b/gix-config/benches/large_config_file.rs @@ -1,5 +1,6 @@ -use criterion::{black_box, criterion_group, criterion_main, Criterion}; +use criterion::{criterion_group, criterion_main, Criterion}; use gix_config::{parse::Events, File}; +use std::hint::black_box; fn gix_config(c: &mut Criterion) { c.bench_function("GitConfig large config file", |b| { diff --git a/gix-object/benches/decode_objects.rs b/gix-object/benches/decode_objects.rs index fa409ebd707..93180cfef43 100644 --- a/gix-object/benches/decode_objects.rs +++ b/gix-object/benches/decode_objects.rs @@ -1,4 +1,5 @@ -use criterion::{black_box, criterion_group, criterion_main, Criterion}; +use criterion::{criterion_group, criterion_main, Criterion}; +use std::hint::black_box; fn parse_commit(c: &mut Criterion) { c.bench_function("CommitRef(sig)", |b| { diff --git a/gix-object/benches/edit_tree.rs b/gix-object/benches/edit_tree.rs index f54caf7cd18..067065d5892 100644 --- a/gix-object/benches/edit_tree.rs +++ b/gix-object/benches/edit_tree.rs @@ -1,6 +1,6 @@ -use std::{cell::RefCell, rc::Rc}; +use std::{cell::RefCell, hint::black_box, rc::Rc}; -use criterion::{black_box, criterion_group, criterion_main, Criterion, Throughput}; +use criterion::{criterion_group, criterion_main, Criterion, Throughput}; use gix_hash::ObjectId; use gix_hashtable::hash_map::Entry; use gix_object::{tree, tree::EntryKind, Tree, WriteTo}; From 8c34d9fd3cade8e9e0cd2b648dfe70d2d73ccd40 Mon Sep 17 00:00:00 2001 From: Sebastian Thiel Date: Mon, 2 Jun 2025 09:23:43 +0200 Subject: [PATCH 099/166] feat: implement `From for Identity` for convenient conversions of owned types. --- gix-actor/src/identity.rs | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/gix-actor/src/identity.rs b/gix-actor/src/identity.rs index 792405b5077..ce93897b653 100644 --- a/gix-actor/src/identity.rs +++ b/gix-actor/src/identity.rs @@ -53,7 +53,7 @@ mod write { } mod impls { - use crate::{Identity, IdentityRef}; + use crate::{Identity, IdentityRef, Signature, SignatureRef}; impl Identity { /// Borrow this instance as immutable @@ -80,4 +80,16 @@ mod impls { other.to_ref() } } + + impl From for Identity { + fn from(Signature { name, email, time: _ }: Signature) -> Self { + Identity { name, email } + } + } + + impl<'a> From> for IdentityRef<'a> { + fn from(SignatureRef { name, email, time: _ }: SignatureRef<'a>) -> Self { + IdentityRef { name, email } + } + } } From f8b87f1ffb871ca3ce8c6ef6538c64780bd1b452 Mon Sep 17 00:00:00 2001 From: Sebastian Thiel Date: Mon, 2 Jun 2025 12:30:15 +0200 Subject: [PATCH 100/166] feat: add `Category::to_full_name()` to easily generate full names from short ones. --- gix-ref/src/fullname.rs | 29 +++++++++++++++++++++++++++++ gix-ref/tests/refs/fullname.rs | 26 ++++++++++++++++++++++---- gix-ref/tests/refs/main.rs | 29 +++++++++++++++++++++++++++++ 3 files changed, 80 insertions(+), 4 deletions(-) diff --git a/gix-ref/src/fullname.rs b/gix-ref/src/fullname.rs index e74dd05dd04..eb6ac854dde 100644 --- a/gix-ref/src/fullname.rs +++ b/gix-ref/src/fullname.rs @@ -156,6 +156,35 @@ impl FullNameRef { } } +/// Conversion +impl Category<'_> { + /// As the inverse of [`FullNameRef::category_and_short_name()`], use the prefix of this category alongside + /// the `short_name` to create a valid fully qualified [reference name](FullName). + pub fn to_full_name<'a>(&self, short_name: impl Into<&'a BStr>) -> Result { + let mut out: BString = self.prefix().into(); + let short_name = short_name.into(); + let partial_name = match self { + Category::Note => short_name.strip_prefix("notes/".as_bytes()).unwrap_or(short_name), + Category::MainRef => short_name.strip_prefix("refs/".as_bytes()).unwrap_or(short_name), + Category::LinkedPseudoRef { name } | Category::LinkedRef { name } => { + out.extend_from_slice(name); + out.push(b'/'); + short_name + } + Category::Bisect => short_name.strip_prefix("bisect/".as_bytes()).unwrap_or(short_name), + Category::Rewritten => short_name.strip_prefix("rewritten/".as_bytes()).unwrap_or(short_name), + Category::WorktreePrivate => short_name.strip_prefix("worktree/".as_bytes()).unwrap_or(short_name), + Category::Tag + | Category::LocalBranch + | Category::RemoteBranch + | Category::PseudoRef + | Category::MainPseudoRef => short_name, + }; + out.extend_from_slice(partial_name); + FullName::try_from(out) + } +} + impl FullName { /// Convert this name into the relative path, lossily, identifying the reference location relative to a repository pub fn to_path(&self) -> &Path { diff --git a/gix-ref/tests/refs/fullname.rs b/gix-ref/tests/refs/fullname.rs index 5cb5b07f5a9..edf2b4fa18e 100644 --- a/gix-ref/tests/refs/fullname.rs +++ b/gix-ref/tests/refs/fullname.rs @@ -81,10 +81,23 @@ fn shorten_and_category() { assert_eq!(name.as_ref().shorten(), expected); assert_eq!(name.shorten(), expected); assert_eq!(name.category(), category); - assert_eq!( - name.category_and_short_name(), - category.map(|cat| (cat, expected.into())) - ); + + let cat_and_short_name = name.category_and_short_name(); + match category { + None => { + assert_eq!(cat_and_short_name, None); + } + Some(expected_category) => { + assert_eq!(cat_and_short_name, Some((expected_category, expected.into()))); + let (cat, short_name) = cat_and_short_name.expect("we know it's set"); + let actual = cat.to_full_name(short_name).expect("valid input = valid output"); + assert_eq!( + actual.as_ref().as_bstr(), + input, + "{input}: {cat:?}:{short_name}: categories and short-names can round-trip" + ); + } + } assert_eq!(name.as_ref().category(), category); } @@ -97,6 +110,11 @@ fn shorten_and_category() { ); assert_eq!(name.category(), None); } + + assert!( + Category::LocalBranch.to_full_name("invalid/").is_err(), + "validation is performed as one would expect" + ); } #[test] diff --git a/gix-ref/tests/refs/main.rs b/gix-ref/tests/refs/main.rs index 735a0339dfd..ddd06716f88 100644 --- a/gix-ref/tests/refs/main.rs +++ b/gix-ref/tests/refs/main.rs @@ -8,6 +8,35 @@ pub use gix_testtools::Result; mod file; mod fullname; +mod partialname { + use gix_ref::PartialName; + + #[test] + fn join() -> crate::Result { + let pn = PartialName::try_from("no-trailing-slash")?; + assert_eq!(pn.join("name".into())?.as_ref().as_bstr(), "no-trailing-slash/name"); + + let err = PartialName::try_from("trailing-slash/").unwrap_err(); + assert!( + matches!( + err, + gix_validate::reference::name::Error::Tag(gix_validate::tag::name::Error::EndsWithSlash) + ), + "thanks to this there is no worry about dealing with this case" + ); + + let pn = PartialName::try_from("prefix")?; + let err = pn.join("/slash-in-name".into()).unwrap_err(); + assert!( + matches!( + err, + gix_validate::reference::name::Error::Tag(gix_validate::tag::name::Error::RepeatedSlash) + ), + "validation post-join assures the returned type is valid" + ); + Ok(()) + } +} mod namespace; mod packed; mod reference; From 1b08fd937056d0a674b1d4bba40ad3098f54ffbf Mon Sep 17 00:00:00 2001 From: Sebastian Thiel Date: Wed, 4 Jun 2025 13:47:45 +0200 Subject: [PATCH 101/166] feat: add `commit::Simple::hide()` to hide a given set of tips. That means, these tips and all their ancestors will be hidden from the traversal. --- Cargo.lock | 1 + gix-traverse/src/commit/simple.rs | 492 +++++++++++++----- gix-traverse/tests/Cargo.toml | 1 + .../generated-archives/make_repos.tar | Bin 143360 -> 193024 bytes gix-traverse/tests/fixtures/make_repos.sh | 14 + gix-traverse/tests/traverse/commit/simple.rs | 245 ++++++++- 6 files changed, 618 insertions(+), 135 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index ac290281766..0b04d4447a1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2501,6 +2501,7 @@ dependencies = [ "gix-hash", "gix-object", "gix-odb", + "gix-path", "gix-testtools", "gix-traverse", "insta", diff --git a/gix-traverse/src/commit/simple.rs b/gix-traverse/src/commit/simple.rs index f5047bfd985..32b2b4cf440 100644 --- a/gix-traverse/src/commit/simple.rs +++ b/gix-traverse/src/commit/simple.rs @@ -2,7 +2,6 @@ use std::{cmp::Reverse, collections::VecDeque}; use gix_date::SecondsSinceUnixEpoch; use gix_hash::ObjectId; -use gix_hashtable::HashSet; use smallvec::SmallVec; #[derive(Default, Debug, Copy, Clone)] @@ -61,7 +60,7 @@ pub enum Sorting { ByCommitTimeCutoff { /// The order in which to prioritize lookups. order: CommitTimeOrder, - /// The amount of seconds since unix epoch, the same value obtained by any `gix_date::Time` structure and the way git counts time. + /// The number of seconds since unix epoch, the same value obtained by any `gix_date::Time` structure and the way git counts time. seconds: gix_date::SecondsSinceUnixEpoch, }, } @@ -77,34 +76,60 @@ pub enum Error { } use Result as Either; + type QueueKey = Either>; +type CommitDateQueue = gix_revwalk::PriorityQueue, ObjectId>; +type Candidates = VecDeque; /// The state used and potentially shared by multiple graph traversals. #[derive(Clone)] pub(super) struct State { next: VecDeque, - queue: gix_revwalk::PriorityQueue, ObjectId>, + queue: CommitDateQueue, buf: Vec, - seen: HashSet, + seen: gix_revwalk::graph::IdMap, parents_buf: Vec, parent_ids: SmallVec<[(ObjectId, SecondsSinceUnixEpoch); 2]>, + /// The list (FIFO) of thus far interesting commits. + /// + /// As they may turn hidden later, we have to keep them until the conditions are met to return them. + /// If `None`, there is nothing to do with hidden commits. + candidates: Option, +} + +#[derive(Debug, Clone, Copy)] +enum CommitState { + /// The commit may be returned, it hasn't been hidden yet. + Interesting, + /// The commit should not be returned. + Hidden, +} + +impl CommitState { + pub fn is_hidden(&self) -> bool { + matches!(self, CommitState::Hidden) + } + pub fn is_interesting(&self) -> bool { + matches!(self, CommitState::Interesting) + } } /// mod init { use std::cmp::Reverse; + use super::{ + super::{simple::Sorting, Either, Info, ParentIds, Parents, Simple}, + collect_parents, Candidates, CommitDateQueue, CommitState, CommitTimeOrder, Error, State, + }; use gix_date::SecondsSinceUnixEpoch; use gix_hash::{oid, ObjectId}; + use gix_hashtable::hash_map::Entry; use gix_object::{CommitRefIter, FindExt}; + use std::collections::VecDeque; use Err as Oldest; use Ok as Newest; - use super::{ - super::{simple::Sorting, Either, Info, ParentIds, Parents, Simple}, - collect_parents, CommitTimeOrder, Error, State, - }; - impl Default for State { fn default() -> Self { State { @@ -114,16 +139,27 @@ mod init { seen: Default::default(), parents_buf: vec![], parent_ids: Default::default(), + candidates: None, } } } impl State { fn clear(&mut self) { - self.next.clear(); - self.queue.clear(); - self.buf.clear(); - self.seen.clear(); + let Self { + next, + queue, + buf, + seen, + parents_buf: _, + parent_ids: _, + candidates, + } = self; + next.clear(); + queue.clear(); + buf.clear(); + seen.clear(); + *candidates = None; } } @@ -147,21 +183,16 @@ mod init { self.queue_to_vecdeque(); } Sorting::ByCommitTime(order) | Sorting::ByCommitTimeCutoff { order, .. } => { - let cutoff_time = self.sorting.cutoff_time(); let state = &mut self.state; for commit_id in state.next.drain(..) { - let commit_iter = self.objects.find_commit_iter(&commit_id, &mut state.buf)?; - let time = commit_iter.committer()?.seconds(); - let key = to_queue_key(time, order); - match (cutoff_time, order) { - (Some(cutoff_time), _) if time >= cutoff_time => { - state.queue.insert(key, commit_id); - } - (Some(_), _) => {} - (None, _) => { - state.queue.insert(key, commit_id); - } - } + add_to_queue( + commit_id, + order, + sorting.cutoff_time(), + &mut state.queue, + &self.objects, + &mut state.buf, + )?; } } } @@ -177,9 +208,53 @@ mod init { self } + /// Hide the given `tips`, along with all commits reachable by them so that they will not be returned + /// by the traversal. + /// + /// Note that this will force the traversal into a non-intermediate mode and queue return candidates, + /// to be released when it's clear that they truly are not hidden. + /// + /// Note that hidden objects are expected to exist. + pub fn hide(mut self, tips: impl IntoIterator) -> Result { + self.state.candidates = Some(VecDeque::new()); + let state = &mut self.state; + for id_to_ignore in tips { + let previous = state.seen.insert(id_to_ignore, CommitState::Hidden); + // If there was something, it will pick up whatever commit-state we have set last + // upon iteration. Also, hidden states always override everything else. + if previous.is_none() { + // Assure we *start* traversing hidden variants of a commit first, give them a head-start. + match self.sorting { + Sorting::BreadthFirst => { + state.next.push_front(id_to_ignore); + } + Sorting::ByCommitTime(order) | Sorting::ByCommitTimeCutoff { order, .. } => { + add_to_queue( + id_to_ignore, + order, + self.sorting.cutoff_time(), + &mut state.queue, + &self.objects, + &mut state.buf, + )?; + } + } + } + } + if !self + .state + .seen + .values() + .any(|state| matches!(state, CommitState::Hidden)) + { + self.state.candidates = None; + } + Ok(self) + } + /// Set the commitgraph as `cache` to greatly accelerate any traversal. /// - /// The cache will be used if possible, but we will fall-back without error to using the object + /// The cache will be used if possible, but we will fall back without error to using the object /// database for commit lookup. If the cache is corrupt, we will fall back to the object database as well. pub fn commit_graph(mut self, cache: Option) -> Self { self.cache = cache; @@ -196,6 +271,29 @@ mod init { } } + fn add_to_queue( + commit_id: ObjectId, + order: CommitTimeOrder, + cutoff_time: Option, + queue: &mut CommitDateQueue, + objects: &impl gix_object::Find, + buf: &mut Vec, + ) -> Result<(), Error> { + let commit_iter = objects.find_commit_iter(&commit_id, buf)?; + let time = commit_iter.committer()?.seconds(); + let key = to_queue_key(time, order); + match (cutoff_time, order) { + (Some(cutoff_time), _) if time >= cutoff_time => { + queue.insert(key, commit_id); + } + (Some(_), _) => {} + (None, _) => { + queue.insert(key, commit_id); + } + } + Ok(()) + } + /// Lifecycle impl Simple bool> where @@ -241,8 +339,9 @@ mod init { state.clear(); state.next.reserve(tips.size_hint().0); for tip in tips.map(Into::into) { - let was_inserted = state.seen.insert(tip); - if was_inserted && predicate(&tip) { + let seen = state.seen.insert(tip, CommitState::Interesting); + // We know there can only be duplicate interesting ones. + if seen.is_none() && predicate(&tip) { state.next.push_back(tip); } } @@ -262,7 +361,7 @@ mod init { impl Simple { /// Return an iterator for accessing data of the current commit, parsed lazily. pub fn commit_iter(&self) -> CommitRefIter<'_> { - CommitRefIter::from_bytes(&self.state.buf) + CommitRefIter::from_bytes(self.commit_data()) } /// Return the current commits' raw data, which can be parsed using [`gix_object::CommitRef::from_bytes()`]. @@ -288,6 +387,12 @@ mod init { Sorting::ByCommitTimeCutoff { seconds, order } => self.next_by_commit_date(order, seconds.into()), } } + .or_else(|| { + self.state + .candidates + .as_mut() + .and_then(|candidates| candidates.pop_front().map(Ok)) + }) } } @@ -314,65 +419,89 @@ mod init { ) -> Option> { let state = &mut self.state; - let (commit_time, oid) = match state.queue.pop()? { - (Newest(t) | Oldest(Reverse(t)), o) => (t, o), - }; - let mut parents: ParentIds = Default::default(); - match super::super::find(self.cache.as_ref(), &self.objects, &oid, &mut state.buf) { - Ok(Either::CachedCommit(commit)) => { - if !collect_parents(&mut state.parent_ids, self.cache.as_ref(), commit.iter_parents()) { - // drop corrupt caches and try again with ODB - self.cache = None; - return self.next_by_commit_date(order, cutoff); - } - for (id, parent_commit_time) in state.parent_ids.drain(..) { - parents.push(id); - let was_inserted = state.seen.insert(id); - if !(was_inserted && (self.predicate)(&id)) { - continue; + 'skip_hidden: loop { + let (commit_time, oid) = match state.queue.pop()? { + (Newest(t) | Oldest(Reverse(t)), o) => (t, o), + }; + let mut parents: ParentIds = Default::default(); + // TODO(perf): can avoid this lookup by storing state on `queue` respectively. + // ALSO: need to look ahead for early aborts, i.e. if there is only hidden left to traverse. + // Maybe this can be counted? + let commit_state = *state.seen.get(&oid).expect("every commit we traverse has state added"); + match super::super::find(self.cache.as_ref(), &self.objects, &oid, &mut state.buf) { + Ok(Either::CachedCommit(commit)) => { + if !collect_parents(&mut state.parent_ids, self.cache.as_ref(), commit.iter_parents()) { + // drop corrupt caches and try again with ODB + self.cache = None; + return self.next_by_commit_date(order, cutoff); } - - let key = to_queue_key(parent_commit_time, order); - match cutoff { - Some(cutoff_older_than) if parent_commit_time < cutoff_older_than => continue, - Some(_) | None => state.queue.insert(key, id), + for (id, parent_commit_time) in state.parent_ids.drain(..) { + parents.push(id); + insert_into_seen_and_queue( + &mut state.seen, + id, + &mut state.candidates, + commit_state, + &mut self.predicate, + &mut state.queue, + order, + cutoff, + || parent_commit_time, + ); } } - } - Ok(Either::CommitRefIter(commit_iter)) => { - for token in commit_iter { - match token { - Ok(gix_object::commit::ref_iter::Token::Tree { .. }) => continue, - Ok(gix_object::commit::ref_iter::Token::Parent { id }) => { - parents.push(id); - let was_inserted = state.seen.insert(id); - if !(was_inserted && (self.predicate)(&id)) { - continue; - } - - let parent = self.objects.find_commit_iter(id.as_ref(), &mut state.parents_buf).ok(); - let parent_commit_time = parent - .and_then(|parent| parent.committer().ok().map(|committer| committer.seconds())) - .unwrap_or_default(); - - let time = to_queue_key(parent_commit_time, order); - match cutoff { - Some(cutoff_older_than) if parent_commit_time < cutoff_older_than => continue, - Some(_) | None => state.queue.insert(time, id), + Ok(Either::CommitRefIter(commit_iter)) => { + for token in commit_iter { + match token { + Ok(gix_object::commit::ref_iter::Token::Tree { .. }) => continue, + Ok(gix_object::commit::ref_iter::Token::Parent { id }) => { + parents.push(id); + insert_into_seen_and_queue( + &mut state.seen, + id, + &mut state.candidates, + commit_state, + &mut self.predicate, + &mut state.queue, + order, + cutoff, + || { + let parent = + self.objects.find_commit_iter(id.as_ref(), &mut state.parents_buf).ok(); + parent + .and_then(|parent| { + parent.committer().ok().map(|committer| committer.seconds()) + }) + .unwrap_or_default() + }, + ); } + Ok(_unused_token) => break, + Err(err) => return Some(Err(err.into())), + } + } + } + Err(err) => return Some(Err(err.into())), + } + match commit_state { + CommitState::Interesting => { + let info = Info { + id: oid, + parent_ids: parents, + commit_time: Some(commit_time), + }; + match state.candidates.as_mut() { + None => return Some(Ok(info)), + Some(candidates) => { + // assure candidates aren't prematurely returned - hidden commits may catch up with + // them later. + candidates.push_back(info); } - Ok(_unused_token) => break, - Err(err) => return Some(Err(err.into())), } } + CommitState::Hidden => continue 'skip_hidden, } - Err(err) => return Some(Err(err.into())), } - Some(Ok(Info { - id: oid, - parent_ids: parents, - commit_time: Some(commit_time), - })) } } @@ -384,53 +513,182 @@ mod init { { fn next_by_topology(&mut self) -> Option> { let state = &mut self.state; - let oid = state.next.pop_front()?; - let mut parents: ParentIds = Default::default(); - match super::super::find(self.cache.as_ref(), &self.objects, &oid, &mut state.buf) { - Ok(Either::CachedCommit(commit)) => { - if !collect_parents(&mut state.parent_ids, self.cache.as_ref(), commit.iter_parents()) { - // drop corrupt caches and try again with ODB - self.cache = None; - return self.next_by_topology(); - } + 'skip_hidden: loop { + let oid = state.next.pop_front()?; + let mut parents: ParentIds = Default::default(); + // TODO(perf): can avoid this lookup by storing state on `next` respectively. + // ALSO: need to look ahead for early aborts, i.e. if there is only hidden left to traverse. + // Maybe this can be counted? + let commit_state = *state.seen.get(&oid).expect("every commit we traverse has state added"); + + match super::super::find(self.cache.as_ref(), &self.objects, &oid, &mut state.buf) { + Ok(Either::CachedCommit(commit)) => { + if !collect_parents(&mut state.parent_ids, self.cache.as_ref(), commit.iter_parents()) { + // drop corrupt caches and try again with ODB + self.cache = None; + return self.next_by_topology(); + } - for (id, _commit_time) in state.parent_ids.drain(..) { - parents.push(id); - let was_inserted = state.seen.insert(id); - if was_inserted && (self.predicate)(&id) { - state.next.push_back(id); + for (pid, _commit_time) in state.parent_ids.drain(..) { + parents.push(pid); + insert_into_seen_and_next( + &mut state.seen, + pid, + &mut state.candidates, + commit_state, + &mut self.predicate, + &mut state.next, + ); + if commit_state.is_interesting() && matches!(self.parents, Parents::First) { + break; + } } - if matches!(self.parents, Parents::First) { - break; + } + Ok(Either::CommitRefIter(commit_iter)) => { + for token in commit_iter { + match token { + Ok(gix_object::commit::ref_iter::Token::Tree { .. }) => continue, + Ok(gix_object::commit::ref_iter::Token::Parent { id: pid }) => { + parents.push(pid); + insert_into_seen_and_next( + &mut state.seen, + pid, + &mut state.candidates, + commit_state, + &mut self.predicate, + &mut state.next, + ); + if commit_state.is_interesting() && matches!(self.parents, Parents::First) { + break; + } + } + Ok(_a_token_past_the_parents) => break, + Err(err) => return Some(Err(err.into())), + } } } + Err(err) => return Some(Err(err.into())), } - Ok(Either::CommitRefIter(commit_iter)) => { - for token in commit_iter { - match token { - Ok(gix_object::commit::ref_iter::Token::Tree { .. }) => continue, - Ok(gix_object::commit::ref_iter::Token::Parent { id }) => { - parents.push(id); - let was_inserted = state.seen.insert(id); - if was_inserted && (self.predicate)(&id) { - state.next.push_back(id); - } - if matches!(self.parents, Parents::First) { - break; - } + match commit_state { + CommitState::Interesting => { + let info = Info { + id: oid, + parent_ids: parents, + commit_time: None, + }; + match state.candidates.as_mut() { + None => return Some(Ok(info)), + Some(candidates) => { + // assure candidates aren't prematurely returned - hidden commits may catch up with + // them later. + candidates.push_back(info); } - Ok(_a_token_past_the_parents) => break, - Err(err) => return Some(Err(err.into())), } } + CommitState::Hidden => continue 'skip_hidden, + } + } + } + } + + #[inline] + fn remove_candidate(candidates: Option<&mut Candidates>, remove: ObjectId) -> Option<()> { + let candidates = candidates?; + let pos = candidates + .iter_mut() + .enumerate() + .find_map(|(idx, info)| (info.id == remove).then_some(idx))?; + candidates.remove(pos); + None + } + + fn insert_into_seen_and_next( + seen: &mut gix_revwalk::graph::IdMap, + parent_id: ObjectId, + candidates: &mut Option, + commit_state: CommitState, + predicate: &mut impl FnMut(&oid) -> bool, + next: &mut VecDeque, + ) { + let enqueue = match seen.entry(parent_id) { + Entry::Occupied(mut e) => { + let enqueue = handle_seen(commit_state, *e.get(), parent_id, candidates); + if commit_state.is_hidden() { + e.insert(commit_state); + } + enqueue + } + Entry::Vacant(e) => { + e.insert(commit_state); + match commit_state { + CommitState::Interesting => predicate(&parent_id), + CommitState::Hidden => true, + } + } + }; + if enqueue { + next.push_back(parent_id); + } + } + + #[allow(clippy::too_many_arguments)] + fn insert_into_seen_and_queue( + seen: &mut gix_revwalk::graph::IdMap, + parent_id: ObjectId, + candidates: &mut Option, + commit_state: CommitState, + predicate: &mut impl FnMut(&oid) -> bool, + queue: &mut CommitDateQueue, + order: CommitTimeOrder, + cutoff: Option, + get_parent_commit_time: impl FnOnce() -> gix_date::SecondsSinceUnixEpoch, + ) { + let enqueue = match seen.entry(parent_id) { + Entry::Occupied(mut e) => { + let enqueue = handle_seen(commit_state, *e.get(), parent_id, candidates); + if commit_state.is_hidden() { + e.insert(commit_state); + } + enqueue + } + Entry::Vacant(e) => { + e.insert(commit_state); + match commit_state { + CommitState::Interesting => (predicate)(&parent_id), + CommitState::Hidden => true, } - Err(err) => return Some(Err(err.into())), } - Some(Ok(Info { - id: oid, - parent_ids: parents, - commit_time: None, - })) + }; + + if enqueue { + let parent_commit_time = get_parent_commit_time(); + let key = to_queue_key(parent_commit_time, order); + match cutoff { + Some(cutoff_older_than) if parent_commit_time < cutoff_older_than => {} + Some(_) | None => queue.insert(key, parent_id), + } + } + } + + #[inline] + #[must_use] + fn handle_seen( + next_state: CommitState, + current_state: CommitState, + id: ObjectId, + candidates: &mut Option, + ) -> bool { + match (current_state, next_state) { + (CommitState::Hidden, CommitState::Hidden) => false, + (CommitState::Interesting, CommitState::Interesting) => false, + (CommitState::Hidden, CommitState::Interesting) => { + // keep traversing to paint more hidden. After all, the commit_state overrides the current parent state + true + } + (CommitState::Interesting, CommitState::Hidden) => { + remove_candidate(candidates.as_mut(), id); + true + } } } } diff --git a/gix-traverse/tests/Cargo.toml b/gix-traverse/tests/Cargo.toml index 029c4dba5ec..64a04af9996 100644 --- a/gix-traverse/tests/Cargo.toml +++ b/gix-traverse/tests/Cargo.toml @@ -22,3 +22,4 @@ gix-odb = { path = "../../gix-odb" } gix-hash = { path = "../../gix-hash" } gix-object = { path = "../../gix-object" } gix-commitgraph = { path = "../../gix-commitgraph" } +gix-path = { version = "^0.10.18", path = "../../gix-path" } diff --git a/gix-traverse/tests/fixtures/generated-archives/make_repos.tar b/gix-traverse/tests/fixtures/generated-archives/make_repos.tar index 4cf3b1c9132547a9c5f10f19c8cfb70628d2f821..6f8b96a0fbf0f25488a9acd24ba72bb1a444d4ad 100644 GIT binary patch delta 5698 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 delta 5948 zcmeI0eQXrBVgsfyxZ@Dp*up&ATLR}}Z@z1oC4;5)l-89OCL@7M) zy?4$>QwGxhjHUDW?%wzLexCa!$NpS<>{9g!JbxL5{C4Ox4q$8J!k#Ho_1I~@ojrqR zeAA&h?4J(Jv#%=%7JbWEbf&!M1fHq2LyzF~La_m(yPS|jkC2jc^tnBBHm&f zU%=Ja+WcC|lm1)$C*;%V_|&@fu*u2_4I4UQ74cZID;`V467V|~OC%HVWJSyp1CoW% zzlR6=`-UqjDv*2l;2dy&!>OVYj%qln;PAtNU;69wU;Y$sUN|>#{+sP@{tiEL27a$gP z$d9YAwdvuzJs%W2_ff0i;BJ0h%!O7rnPA@R#@%;GbbDs8bRC6Ng~mVm{-g;rg1`66r!oh zBuQs!`Y;F$7Hry^LQi)sPfo{-I~ zmN!XSQ!|R3HVq=H5EFyK4N24|$%LjKhAlKodNU@~K^_Y>*eZjL79*cdQ^UyQ!9Ja+ zn%N3E9gT`;m~JrP4wJ|t+U7iSWfoXq9pAumi7M2j68C=yOwMSEqD`=PG27%(&nU5nN?|o!Ei^hBB}R@y5jyn;IcbdwHKv}Y!b3~+xs7zA zqLganA?VA?mWTzXShvsU-4YeFQ;!J@{^7fs7oLOy5haO4GH^tk46q^$ zH+hf4Bn&ni?K}cTdlUb`&Y7^|(z1}~ypba!w8@Q;xYr${OXU{?su)zL@f5BI&rM?L zNoo}`GHVLxYMRb!BwSWncD;vCUDxy;l7W{b3_O?>@NUYn0myU~*jx{jyP6Xq;wS_r z&e}Pzvbnmue`utyf6zJKJ23d!k)gp@vg2|HwQNxQ8XN=jL3jGM@#n|`<`#U2iI5I_09NNmDSKzCZgN%nRRx3 z6#vU-ZQ5T(tS&s~vl_PDZCT`Ww0x*`Z4qR~B!33mY2}9V`q1TF`H2pGBv9)3DD!9ef`7 zPX^zGHIF!J7@hMq-$$ov?ck$`)A>$k-*?du9Xc-po%c-nQJxbqsJ5JlY=k4p1hcT;QGsTsaIbl=YM|3+$W#x{QUL{KLd0> zf#xrw+bgZjzXn|AMlYbBpdvs#lnwXqm*}+1^L)XJ;IAF5L>|xcyDFM>d7fYIb*>r8 z^XrGvsem1NKXjB&qK~*J&q(GbDBs!b0o^Jn{~5Htx(F!0*8{BW(vaf?3#q4`1?gyV8vM-^(*CIRkM|9O!B3CXU=WB}W_z%yG Bf*=3@ diff --git a/gix-traverse/tests/fixtures/make_repos.sh b/gix-traverse/tests/fixtures/make_repos.sh index c7d29e06b8a..2450663bc18 100755 --- a/gix-traverse/tests/fixtures/make_repos.sh +++ b/gix-traverse/tests/fixtures/make_repos.sh @@ -76,3 +76,17 @@ function optimize() { optimize ) + +(git init disjoint_branches && cd disjoint_branches + git checkout -b main + commit a1 + commit a2 + commit a3 + + git checkout --orphan disjoint + commit b1 + commit b2 + commit b3 + + optimize +) \ No newline at end of file diff --git a/gix-traverse/tests/traverse/commit/simple.rs b/gix-traverse/tests/traverse/commit/simple.rs index 0b5bc02b7db..1d8043c6fb1 100644 --- a/gix-traverse/tests/traverse/commit/simple.rs +++ b/gix-traverse/tests/traverse/commit/simple.rs @@ -1,7 +1,8 @@ +use crate::hex_to_id; use gix_hash::{oid, ObjectId}; +use gix_object::bstr::{ByteSlice, ByteVec}; use gix_traverse::commit; - -use crate::hex_to_id; +use std::path::PathBuf; struct TraversalAssertion<'a> { init_script: &'a str, @@ -10,6 +11,9 @@ struct TraversalAssertion<'a> { expected: &'a [&'a str], mode: commit::Parents, sorting: commit::simple::Sorting, + expected_without_tips: bool, + // commit-ids that should be hidden (along with all their history. + hidden: &'a [&'a str], } impl<'a> TraversalAssertion<'a> { @@ -25,6 +29,8 @@ impl<'a> TraversalAssertion<'a> { expected, mode: Default::default(), sorting: Default::default(), + hidden: Default::default(), + expected_without_tips: false, } } @@ -37,19 +43,42 @@ impl<'a> TraversalAssertion<'a> { self.sorting = sorting; self } + + /// Set the commits that should be hidden. + fn with_hidden(&mut self, hidden: &'a [&'a str]) -> &mut Self { + self.hidden = hidden; + self + } + + /// Do not automatically add tips to the set of expected items. + fn expected_without_tips(&mut self) -> &mut Self { + self.expected_without_tips = true; + self + } + + /// Execute the fixture and get the repository worktree path. + pub fn worktree_dir(&self) -> crate::Result { + let dir = gix_testtools::scripted_fixture_read_only_standalone(self.init_script)?; + Ok(dir.join(self.repo_name)) + } } impl TraversalAssertion<'_> { - fn setup(&self) -> crate::Result<(gix_odb::Handle, Vec, Vec)> { - let dir = gix_testtools::scripted_fixture_read_only_standalone(self.init_script)?; - let store = gix_odb::at(dir.join(self.repo_name).join(".git").join("objects"))?; + #[allow(clippy::type_complexity)] + fn setup(&self) -> crate::Result<(gix_odb::Handle, Vec, Vec, Vec)> { + let repo_path = self.worktree_dir()?; + let store = gix_odb::at(repo_path.join(".git").join("objects"))?; let tips: Vec<_> = self.tips.iter().copied().map(hex_to_id).collect(); - let expected: Vec = tips - .clone() - .into_iter() - .chain(self.expected.iter().map(|hex_id| hex_to_id(hex_id))) - .collect(); - Ok((store, tips, expected)) + let expected: Vec = if self.expected_without_tips { + self.expected.iter().map(|hex_id| hex_to_id(hex_id)).collect() + } else { + tips.clone() + .into_iter() + .chain(self.expected.iter().map(|hex_id| hex_to_id(hex_id))) + .collect() + }; + let hidden: Vec<_> = self.hidden.iter().copied().map(hex_to_id).collect(); + Ok((store, tips, expected, hidden)) } fn setup_commitgraph(&self, store: &gix_odb::Store, use_graph: bool) -> Option { @@ -60,12 +89,13 @@ impl TraversalAssertion<'_> { } fn check_with_predicate(&mut self, predicate: impl FnMut(&oid) -> bool + Clone) -> crate::Result<()> { - let (store, tips, expected) = self.setup()?; + let (store, tips, expected, hidden) = self.setup()?; for use_commitgraph in [false, true] { let oids = commit::Simple::filtered(tips.clone(), &store, predicate.clone()) .sorting(self.sorting)? .parents(self.mode) + .hide(hidden.clone())? .commit_graph(self.setup_commitgraph(store.store_ref(), use_commitgraph)) .map(|res| res.map(|info| info.id)) .collect::, _>>()?; @@ -76,17 +106,167 @@ impl TraversalAssertion<'_> { } fn check(&self) -> crate::Result { - let (store, tips, expected) = self.setup()?; + let (store, tips, expected, hidden) = self.setup()?; for use_commitgraph in [false, true] { let oids = commit::Simple::new(tips.clone(), &store) .sorting(self.sorting)? .parents(self.mode) + .hide(hidden.clone())? .commit_graph(self.setup_commitgraph(store.store_ref(), use_commitgraph)) .map(|res| res.map(|info| info.id)) .collect::, _>>()?; - assert_eq!(oids, expected); + assert_eq!( + oids, expected, + "use_commitgraph = {use_commitgraph}, sorting = {:?}", + self.sorting + ); + } + Ok(()) + } +} + +mod hide { + use crate::commit::simple::{git_graph, TraversalAssertion}; + use gix_traverse::commit::simple::{CommitTimeOrder, Sorting}; + use gix_traverse::commit::Parents; + + fn all_sortings() -> impl Iterator { + [ + Sorting::ByCommitTime(CommitTimeOrder::NewestFirst), + Sorting::ByCommitTime(CommitTimeOrder::OldestFirst), + Sorting::BreadthFirst, + ] + .into_iter() + } + + #[test] + fn disjoint_hidden_and_interesting() -> crate::Result { + let mut assertion = TraversalAssertion::new_at( + "make_repos.sh", + "disjoint_branches", + &["e07cf1277ff7c43090f1acfc85a46039e7de1272"], /* b3 */ + &[ + "94cf3f3a4c782b672173423e7a4157a02957dd48", /* b2 */ + "34e5ff5ce3d3ba9f0a00d11a7fad72551fff0861", /* b1 */ + ], + ); + insta::assert_snapshot!(git_graph(assertion.worktree_dir()?)?, @r" + * e07cf1277ff7c43090f1acfc85a46039e7de1272 (HEAD -> disjoint) b3 + * 94cf3f3a4c782b672173423e7a4157a02957dd48 b2 + * 34e5ff5ce3d3ba9f0a00d11a7fad72551fff0861 b1 + * b5665181bf4c338ab16b10da0524d81b96aff209 (main) a3 + * f0230ce37b83d8e9f51ea6322ed7e8bd148d8e28 a2 + * 674aca0765b935ac5e7f7e9ab83af7f79272b5b0 a1 + "); + + for sorting in all_sortings() { + assertion + .with_hidden(&["b5665181bf4c338ab16b10da0524d81b96aff209" /* a3 */]) + .with_sorting(sorting) + .check()?; + } + Ok(()) + } + + #[test] + fn all_hidden() -> crate::Result { + let mut assertion = TraversalAssertion::new_at( + "make_repos.sh", + "disjoint_branches", + &[ + "e07cf1277ff7c43090f1acfc85a46039e7de1272", /* b3 */ + "b5665181bf4c338ab16b10da0524d81b96aff209", /* a3 */ + ], + // The start positions are also declared hidden, so nothing should be visible. + &[], + ); + insta::assert_snapshot!(git_graph(assertion.worktree_dir()?)?, @r" + * e07cf1277ff7c43090f1acfc85a46039e7de1272 (HEAD -> disjoint) b3 + * 94cf3f3a4c782b672173423e7a4157a02957dd48 b2 + * 34e5ff5ce3d3ba9f0a00d11a7fad72551fff0861 b1 + * b5665181bf4c338ab16b10da0524d81b96aff209 (main) a3 + * f0230ce37b83d8e9f51ea6322ed7e8bd148d8e28 a2 + * 674aca0765b935ac5e7f7e9ab83af7f79272b5b0 a1 + "); + + for sorting in all_sortings() { + assertion + .with_hidden(&[ + "e07cf1277ff7c43090f1acfc85a46039e7de1272", /* b3 */ + "b5665181bf4c338ab16b10da0524d81b96aff209", /* a3 */ + ]) + .with_sorting(sorting) + .expected_without_tips() + .check()?; + } + Ok(()) + } + + #[test] + fn some_hidden_and_all_hidden() -> crate::Result { + // Hidden has to catch up with non-hidden. + let mut assertion = TraversalAssertion::new_at( + "make_repos.sh", + "simple", + &["ad33ff2d0c4fc77d56b5fbff6f86f332fe792d83"], /* c2 */ + &[], + ); + + insta::assert_snapshot!(git_graph(assertion.worktree_dir()?)?, @r" + *-. f49838d84281c3988eeadd988d97dd358c9f9dc4 (HEAD -> main) merge + |\ \ + | | * 48e8dac19508f4238f06c8de2b10301ce64a641c (branch2) b2c2 + | | * cb6a6befc0a852ac74d74e0354e0f004af29cb79 b2c1 + | * | 66a309480201c4157b0eae86da69f2d606aadbe7 (branch1) b1c2 + | * | 80947acb398362d8236fcb8bf0f8a9dac640583f b1c1 + | |/ + * / 0edb95c0c0d9933d88f532ec08fcd405d0eee882 c5 + |/ + * 8cb5f13b66ce52a49399a2c49f537ee2b812369c c4 + * 33aa07785dd667c0196064e3be3c51dd9b4744ef c3 + * ad33ff2d0c4fc77d56b5fbff6f86f332fe792d83 c2 + * 65d6af66f60b8e39fd1ba6a1423178831e764ec5 c1 + "); + + for sorting in all_sortings() { + assertion + .with_hidden(&["0edb95c0c0d9933d88f532ec08fcd405d0eee882" /* c5 */]) + .expected_without_tips() + .with_sorting(sorting) + .check()?; + } + let mut assertion = TraversalAssertion::new_at( + "make_repos.sh", + "simple", + &["f49838d84281c3988eeadd988d97dd358c9f9dc4"], /* merge */ + &["0edb95c0c0d9933d88f532ec08fcd405d0eee882" /* c5 */], + ); + + for sorting in all_sortings() { + assertion + .with_hidden(&[ + "48e8dac19508f4238f06c8de2b10301ce64a641c", /* b2c2 */ + "66a309480201c4157b0eae86da69f2d606aadbe7", /* b1c2 */ + ]) + .with_sorting(sorting) + .check()?; } + + let mut assertion = TraversalAssertion::new_at( + "make_repos.sh", + "simple", + &["80947acb398362d8236fcb8bf0f8a9dac640583f"], /* b1c1 */ + // Single-parent is only for commits that we are/ought to be interested in. + // Hence, hidden commits still catch up. + &[], + ); + + assertion + .with_hidden(&["f49838d84281c3988eeadd988d97dd358c9f9dc4" /* merge */]) + .with_parents(Parents::First) + .expected_without_tips() + .check()?; Ok(()) } } @@ -403,6 +583,7 @@ mod adjusted_dates { Parents, Simple, }; + use crate::commit::simple::git_graph; use crate::{commit::simple::TraversalAssertion, hex_to_id}; #[test] @@ -424,7 +605,7 @@ mod adjusted_dates { #[test] fn head_date_order() -> crate::Result { - TraversalAssertion::new( + let mut assertion = TraversalAssertion::new( "make_traversal_repo_for_commits_with_dates.sh", &["288e509293165cb5630d08f4185bdf2445bf6170"], /* m1b1 */ &[ @@ -432,9 +613,18 @@ mod adjusted_dates { "9902e3c3e8f0c569b4ab295ddf473e6de763e1e7", /* c2 */ "134385f6d781b7e97062102c6a483440bfda2a03", /* c1 */ ], - ) - .with_sorting(Sorting::ByCommitTime(CommitTimeOrder::NewestFirst)) - .check()?; + ); + insta::assert_snapshot!(git_graph(assertion.worktree_dir()?)?, @r" + * 288e509293165cb5630d08f4185bdf2445bf6170 (HEAD -> main) m1b1 + |\ + | * bcb05040a6925f2ff5e10d3ae1f9264f2e8c43ac (branch1) b1c1 + * | 9902e3c3e8f0c569b4ab295ddf473e6de763e1e7 c2 + |/ + * 134385f6d781b7e97062102c6a483440bfda2a03 c1 + "); + assertion + .with_sorting(Sorting::ByCommitTime(CommitTimeOrder::NewestFirst)) + .check()?; TraversalAssertion::new( "make_traversal_repo_for_commits_with_dates.sh", &["288e509293165cb5630d08f4185bdf2445bf6170"], /* m1b1 */ @@ -545,3 +735,22 @@ mod adjusted_dates { [CommitTimeOrder::NewestFirst, CommitTimeOrder::OldestFirst] } } + +/// Execute a git status in the given repository path. +fn git_graph(repo_dir: impl AsRef) -> crate::Result { + let out = std::process::Command::new(gix_path::env::exe_invocation()) + .current_dir(repo_dir) + .args([ + "log", + "--oneline", + "--graph", + "--decorate", + "--all", + "--pretty=format:%H %d %s", + ]) + .output()?; + if !out.status.success() { + return Err(format!("git status failed: {err}", err = out.stderr.to_str_lossy()).into()); + } + Ok(out.stdout.into_string_lossy()) +} From 219655fb0001b4e88a56fdcaebed1679ff6e7118 Mon Sep 17 00:00:00 2001 From: Sebastian Thiel Date: Wed, 4 Jun 2025 14:07:08 +0200 Subject: [PATCH 102/166] Improve traversal performance when hidden tips are used. Now it will abort early if there are only hidden tips to be traversed, which cannot change the result anymore. --- gix-traverse/src/commit/simple.rs | 83 ++++++++++++++------ gix-traverse/tests/traverse/commit/simple.rs | 2 +- 2 files changed, 60 insertions(+), 25 deletions(-) diff --git a/gix-traverse/src/commit/simple.rs b/gix-traverse/src/commit/simple.rs index 32b2b4cf440..7b851765bf0 100644 --- a/gix-traverse/src/commit/simple.rs +++ b/gix-traverse/src/commit/simple.rs @@ -78,13 +78,13 @@ pub enum Error { use Result as Either; type QueueKey = Either>; -type CommitDateQueue = gix_revwalk::PriorityQueue, ObjectId>; +type CommitDateQueue = gix_revwalk::PriorityQueue, (ObjectId, CommitState)>; type Candidates = VecDeque; /// The state used and potentially shared by multiple graph traversals. #[derive(Clone)] pub(super) struct State { - next: VecDeque, + next: VecDeque<(ObjectId, CommitState)>, queue: CommitDateQueue, buf: Vec, seen: gix_revwalk::graph::IdMap, @@ -184,9 +184,10 @@ mod init { } Sorting::ByCommitTime(order) | Sorting::ByCommitTimeCutoff { order, .. } => { let state = &mut self.state; - for commit_id in state.next.drain(..) { + for (commit_id, commit_state) in state.next.drain(..) { add_to_queue( commit_id, + commit_state, order, sorting.cutoff_time(), &mut state.queue, @@ -226,11 +227,12 @@ mod init { // Assure we *start* traversing hidden variants of a commit first, give them a head-start. match self.sorting { Sorting::BreadthFirst => { - state.next.push_front(id_to_ignore); + state.next.push_front((id_to_ignore, CommitState::Hidden)); } Sorting::ByCommitTime(order) | Sorting::ByCommitTimeCutoff { order, .. } => { add_to_queue( id_to_ignore, + CommitState::Hidden, order, self.sorting.cutoff_time(), &mut state.queue, @@ -273,6 +275,7 @@ mod init { fn add_to_queue( commit_id: ObjectId, + commit_state: CommitState, order: CommitTimeOrder, cutoff_time: Option, queue: &mut CommitDateQueue, @@ -284,11 +287,11 @@ mod init { let key = to_queue_key(time, order); match (cutoff_time, order) { (Some(cutoff_time), _) if time >= cutoff_time => { - queue.insert(key, commit_id); + queue.insert(key, (commit_id, commit_state)); } (Some(_), _) => {} (None, _) => { - queue.insert(key, commit_id); + queue.insert(key, (commit_id, commit_state)); } } Ok(()) @@ -339,10 +342,11 @@ mod init { state.clear(); state.next.reserve(tips.size_hint().0); for tip in tips.map(Into::into) { - let seen = state.seen.insert(tip, CommitState::Interesting); + let commit_state = CommitState::Interesting; + let seen = state.seen.insert(tip, commit_state); // We know there can only be duplicate interesting ones. if seen.is_none() && predicate(&tip) { - state.next.push_back(tip); + state.next.push_back((tip, commit_state)); } } } @@ -418,16 +422,23 @@ mod init { cutoff: Option, ) -> Option> { let state = &mut self.state; + let next = &mut state.queue; 'skip_hidden: loop { - let (commit_time, oid) = match state.queue.pop()? { + let (commit_time, (oid, _queued_commit_state)) = match next.pop()? { (Newest(t) | Oldest(Reverse(t)), o) => (t, o), }; let mut parents: ParentIds = Default::default(); - // TODO(perf): can avoid this lookup by storing state on `queue` respectively. - // ALSO: need to look ahead for early aborts, i.e. if there is only hidden left to traverse. - // Maybe this can be counted? + + // Always use the state that is actually stored, as we may change the type as we go. let commit_state = *state.seen.get(&oid).expect("every commit we traverse has state added"); + if can_deplete_candidates_early( + next.iter_unordered().map(|t| t.1), + commit_state, + state.candidates.as_ref(), + ) { + return None; + } match super::super::find(self.cache.as_ref(), &self.objects, &oid, &mut state.buf) { Ok(Either::CachedCommit(commit)) => { if !collect_parents(&mut state.parent_ids, self.cache.as_ref(), commit.iter_parents()) { @@ -443,7 +454,7 @@ mod init { &mut state.candidates, commit_state, &mut self.predicate, - &mut state.queue, + next, order, cutoff, || parent_commit_time, @@ -462,7 +473,7 @@ mod init { &mut state.candidates, commit_state, &mut self.predicate, - &mut state.queue, + next, order, cutoff, || { @@ -505,6 +516,28 @@ mod init { } } + /// Returns `true` if we have only hidden cursors queued for traversal, assuming that we don't see interesting ones ever again. + /// + /// `unqueued_commit_state` is the state of the commit that is currently being processed. + fn can_deplete_candidates_early( + mut queued_states: impl Iterator, + unqueued_commit_state: CommitState, + candidates: Option<&Candidates>, + ) -> bool { + if candidates.is_none() { + return false; + } + if unqueued_commit_state.is_interesting() { + return false; + } + + let mut is_empty = true; + queued_states.all(|state| { + is_empty = false; + state.is_hidden() + }) && !is_empty + } + /// Utilities impl Simple where @@ -513,14 +546,16 @@ mod init { { fn next_by_topology(&mut self) -> Option> { let state = &mut self.state; + let next = &mut state.next; 'skip_hidden: loop { - let oid = state.next.pop_front()?; + let (oid, _queued_commit_state) = next.pop_front()?; let mut parents: ParentIds = Default::default(); - // TODO(perf): can avoid this lookup by storing state on `next` respectively. - // ALSO: need to look ahead for early aborts, i.e. if there is only hidden left to traverse. - // Maybe this can be counted? - let commit_state = *state.seen.get(&oid).expect("every commit we traverse has state added"); + // Always use the state that is actually stored, as we may change the type as we go. + let commit_state = *state.seen.get(&oid).expect("every commit we traverse has state added"); + if can_deplete_candidates_early(next.iter().map(|t| t.1), commit_state, state.candidates.as_ref()) { + return None; + } match super::super::find(self.cache.as_ref(), &self.objects, &oid, &mut state.buf) { Ok(Either::CachedCommit(commit)) => { if !collect_parents(&mut state.parent_ids, self.cache.as_ref(), commit.iter_parents()) { @@ -537,7 +572,7 @@ mod init { &mut state.candidates, commit_state, &mut self.predicate, - &mut state.next, + next, ); if commit_state.is_interesting() && matches!(self.parents, Parents::First) { break; @@ -556,7 +591,7 @@ mod init { &mut state.candidates, commit_state, &mut self.predicate, - &mut state.next, + next, ); if commit_state.is_interesting() && matches!(self.parents, Parents::First) { break; @@ -608,7 +643,7 @@ mod init { candidates: &mut Option, commit_state: CommitState, predicate: &mut impl FnMut(&oid) -> bool, - next: &mut VecDeque, + next: &mut VecDeque<(ObjectId, CommitState)>, ) { let enqueue = match seen.entry(parent_id) { Entry::Occupied(mut e) => { @@ -627,7 +662,7 @@ mod init { } }; if enqueue { - next.push_back(parent_id); + next.push_back((parent_id, commit_state)); } } @@ -665,7 +700,7 @@ mod init { let key = to_queue_key(parent_commit_time, order); match cutoff { Some(cutoff_older_than) if parent_commit_time < cutoff_older_than => {} - Some(_) | None => queue.insert(key, parent_id), + Some(_) | None => queue.insert(key, (parent_id, commit_state)), } } } diff --git a/gix-traverse/tests/traverse/commit/simple.rs b/gix-traverse/tests/traverse/commit/simple.rs index 1d8043c6fb1..3529f101985 100644 --- a/gix-traverse/tests/traverse/commit/simple.rs +++ b/gix-traverse/tests/traverse/commit/simple.rs @@ -133,9 +133,9 @@ mod hide { fn all_sortings() -> impl Iterator { [ + Sorting::BreadthFirst, Sorting::ByCommitTime(CommitTimeOrder::NewestFirst), Sorting::ByCommitTime(CommitTimeOrder::OldestFirst), - Sorting::BreadthFirst, ] .into_iter() } From a9befb284dc17d3656cf83859836bc221a42d67e Mon Sep 17 00:00:00 2001 From: Sebastian Thiel Date: Wed, 4 Jun 2025 11:24:15 +0200 Subject: [PATCH 103/166] feat: add `revision::walk::Platform::hide()`. This finally makes safe traversals possible and is what most people would want to use instead of `boundary()`. --- gix/src/config/tree/sections/core.rs | 11 ----------- gix/src/revision/walk.rs | 22 ++++++++++++++++++++-- 2 files changed, 20 insertions(+), 13 deletions(-) diff --git a/gix/src/config/tree/sections/core.rs b/gix/src/config/tree/sections/core.rs index 44d46317f08..fa14d12114d 100644 --- a/gix/src/config/tree/sections/core.rs +++ b/gix/src/config/tree/sections/core.rs @@ -442,17 +442,6 @@ mod abbrev { mod validate { use crate::{bstr::BStr, config::tree::keys}; - pub struct LockTimeout; - impl keys::Validate for LockTimeout { - fn validate(&self, value: &BStr) -> Result<(), Box> { - let value = gix_config::Integer::try_from(value)? - .to_decimal() - .ok_or_else(|| format!("integer {value} cannot be represented as integer")); - super::Core::FILES_REF_LOCK_TIMEOUT.try_into_lock_timeout(Ok(value?))?; - Ok(()) - } - } - pub struct Disambiguate; impl keys::Validate for Disambiguate { #[cfg_attr(not(feature = "revision"), allow(unused_variables))] diff --git a/gix/src/revision/walk.rs b/gix/src/revision/walk.rs index 004df027b9e..2dab00f5ed8 100644 --- a/gix/src/revision/walk.rs +++ b/gix/src/revision/walk.rs @@ -155,6 +155,7 @@ pub struct Platform<'repo> { /// The owning repository. pub repo: &'repo Repository, pub(crate) tips: Vec, + pub(crate) hidden: Vec, pub(crate) boundary: Vec, pub(crate) sorting: Sorting, pub(crate) parents: gix_traverse::commit::Parents, @@ -167,6 +168,7 @@ impl<'repo> Platform<'repo> { revision::walk::Platform { repo, tips: tips.into_iter().map(Into::into).collect(), + hidden: Vec::new(), sorting: Default::default(), parents: Default::default(), use_commit_graph: None, @@ -210,13 +212,13 @@ impl Platform<'_> { self } - /// Don't cross the given `ids` during traversal. + /// Don't cross the given `ids` (commits) during traversal. /// /// Note that this forces the [sorting](Self::sorting()) to [`ByCommitTimeCutoff`](Sorting::ByCommitTimeCutoff) /// configured with the oldest available commit time, ensuring that no commits older than the oldest of `ids` will be returned either. /// Also note that commits that can't be accessed or are missing are simply ignored for the purpose of obtaining the cutoff date. /// - /// A boundary is distinctly different from exclusive refsepcs `^branch-to-not-list` in Git log. + /// A boundary is distinctly different from exclusive revspecs `^branch-to-not-list` in Git log. /// /// If this is not desired, [set the sorting](Self::sorting()) to something else right after this call. pub fn with_boundary(mut self, ids: impl IntoIterator>) -> Self { @@ -242,6 +244,20 @@ impl Platform<'_> { } self } + + /// Don't cross the given `tips` (commits) during traversal or return them, and also don't return any of their ancestors. + /// + /// This allows achieving revspecs like `^branch-to-not-list`, where the commit behind that name would be passed as `ids`. + /// + /// In other words, each of the `tips` acts like a starting point for an iteration that will paint commits as unwanted, and + /// wanted commits cannot cross it. + /// + /// The side effect of this is that commits can't be returned immediately as one still has to wait and see if they may be unwanted later. + /// This makes traversals with hidden commits more costly, with a chance to traverse all commits if the hidden and non-hidden commits are disjoint. + pub fn with_hidden(mut self, tips: impl IntoIterator>) -> Self { + self.hidden = tips.into_iter().map(Into::into).collect(); + self + } } /// Produce the iterator @@ -262,6 +278,7 @@ impl<'repo> Platform<'repo> { use_commit_graph, commit_graph, mut boundary, + hidden, } = self; boundary.sort(); Ok(revision::Walk { @@ -301,6 +318,7 @@ impl<'repo> Platform<'repo> { }) .sorting(sorting.into_simple().expect("for now there is nothing else"))? .parents(parents) + .hide(hidden)? .commit_graph( commit_graph.or(use_commit_graph .map_or_else(|| self.repo.config.may_use_commit_graph(), Ok)? From c5bc49f2a02e9b28c2466ea4c7ae711d091ffc96 Mon Sep 17 00:00:00 2001 From: Sebastian Thiel Date: Wed, 4 Jun 2025 10:53:14 +0200 Subject: [PATCH 104/166] feat: support for `commitgraph list from..to` to exercise the new 'hide' capability. --- Cargo.toml | 4 + .../src/repository/commitgraph/list.rs | 85 +++++++++++++------ src/plumbing/main.rs | 4 +- src/plumbing/options/mod.rs | 3 + 4 files changed, 70 insertions(+), 26 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index e0f002ded7a..6bbd0fe4da8 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -206,6 +206,10 @@ lto = "fat" codegen-units = 1 strip = "symbols" +[profile.bench] +debug = 1 +strip = "none" + [workspace] members = [ "gix-actor", diff --git a/gitoxide-core/src/repository/commitgraph/list.rs b/gitoxide-core/src/repository/commitgraph/list.rs index 6df11b24e1b..c0d1182b819 100644 --- a/gitoxide-core/src/repository/commitgraph/list.rs +++ b/gitoxide-core/src/repository/commitgraph/list.rs @@ -1,55 +1,92 @@ pub(crate) mod function { - use std::{borrow::Cow, ffi::OsString}; - + use crate::OutputFormat; use anyhow::{bail, Context}; + use gix::odb::store::RefreshMode; + use gix::revision::plumbing::Spec; use gix::{prelude::ObjectIdExt, revision::walk::Sorting}; - - use crate::OutputFormat; + use std::fmt::Formatter; + use std::{borrow::Cow, ffi::OsString}; pub fn list( mut repo: gix::Repository, spec: OsString, mut out: impl std::io::Write, + long_hashes: bool, format: OutputFormat, ) -> anyhow::Result<()> { if format != OutputFormat::Human { bail!("Only human output is currently supported"); } let graph = repo - .commit_graph() + .commit_graph_if_enabled() .context("a commitgraph is required, but none was found")?; repo.object_cache_size_if_unset(4 * 1024 * 1024); + repo.objects.refresh = RefreshMode::Never; let spec = gix::path::os_str_into_bstr(&spec)?; - let id = repo - .rev_parse_single(spec) - .context("Only single revisions are currently supported")?; - let commits = id - .object()? - .peel_to_kind(gix::object::Kind::Commit) - .context("Need committish as starting point")? - .id() - .ancestors() - .sorting(Sorting::ByCommitTime(Default::default())) - .all()?; + let spec = repo.rev_parse(spec)?.detach(); + let commits = match spec { + Spec::Include(id) => connected_commit_id(&repo, id)? + .ancestors() + .sorting(Sorting::ByCommitTime(Default::default())) + .all()?, + Spec::Range { from, to } => connected_commit_id(&repo, to)? + .ancestors() + .sorting(Sorting::ByCommitTime(Default::default())) + .with_hidden(Some(connected_commit_id(&repo, from)?)) + .all()?, + Spec::Exclude(_) | Spec::Merge { .. } | Spec::IncludeOnlyParents(_) | Spec::ExcludeParents(_) => { + bail!("The spec isn't currently supported: {spec:?}") + } + }; for commit in commits { let commit = commit?; writeln!( out, "{} {} {} {}", - commit.id().shorten_or_id(), + HexId::new(commit.id(), long_hashes), commit.commit_time.expect("traversal with date"), commit.parent_ids.len(), - graph.commit_by_id(commit.id).map_or_else( - || Cow::Borrowed(""), - |c| Cow::Owned(format!( - "{} {}", - c.root_tree_id().to_owned().attach(&repo).shorten_or_id(), - c.generation() + graph + .as_ref() + .map_or(Cow::Borrowed(""), |graph| graph.commit_by_id(commit.id).map_or_else( + || Cow::Borrowed(""), + |c| Cow::Owned(format!( + "{} {}", + HexId::new(c.root_tree_id().to_owned().attach(&repo), long_hashes), + c.generation() + )) )) - ) )?; } Ok(()) } + + fn connected_commit_id(repo: &gix::Repository, id: gix::ObjectId) -> anyhow::Result> { + Ok(id + .attach(repo) + .object()? + .peel_to_kind(gix::object::Kind::Commit) + .context("Need committish as starting point")? + .id()) + } + + struct HexId<'a>(gix::Id<'a>, bool); + + impl<'a> HexId<'a> { + pub fn new(id: gix::Id<'a>, long_hex: bool) -> Self { + HexId(id, long_hex) + } + } + + impl std::fmt::Display for HexId<'_> { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + let HexId(id, long_hex) = self; + if *long_hex { + id.fmt(f) + } else { + id.shorten_or_id().fmt(f) + } + } + } } diff --git a/src/plumbing/main.rs b/src/plumbing/main.rs index fe111b065cf..9b57bb3af76 100644 --- a/src/plumbing/main.rs +++ b/src/plumbing/main.rs @@ -543,7 +543,7 @@ pub fn main() -> Result<()> { ) } Subcommands::CommitGraph(cmd) => match cmd { - commitgraph::Subcommands::List { spec } => prepare_and_run( + commitgraph::Subcommands::List { long_hashes, spec } => prepare_and_run( "commitgraph-list", trace, auto_verbose, @@ -551,7 +551,7 @@ pub fn main() -> Result<()> { progress_keep_open, None, move |_progress, out, _err| { - core::repository::commitgraph::list(repository(Mode::Lenient)?, spec, out, format) + core::repository::commitgraph::list(repository(Mode::Lenient)?, spec, out, long_hashes, format) }, ) .map(|_| ()), diff --git a/src/plumbing/options/mod.rs b/src/plumbing/options/mod.rs index beab5743928..f0d02c2c6bc 100644 --- a/src/plumbing/options/mod.rs +++ b/src/plumbing/options/mod.rs @@ -955,6 +955,9 @@ pub mod commitgraph { }, /// List all entries in the commit-graph file as reachable by starting from `HEAD`. List { + /// Display long hashes, instead of expensively shortened versions for best performance. + #[clap(long, short = 'l')] + long_hashes: bool, /// The rev-spec to list reachable commits from. #[clap(default_value = "@")] spec: std::ffi::OsString, From d2e98f3cf458121da3d23933d6a7421d70309a20 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christoph=20R=C3=BC=C3=9Fler?= Date: Thu, 22 May 2025 16:00:49 +0200 Subject: [PATCH 105/166] feat!: follow renames in blame --- gix-blame/src/error.rs | 2 + gix-blame/src/file/function.rs | 180 ++++++++++++++++++-- gix-blame/src/file/mod.rs | 3 + gix-blame/src/file/tests.rs | 180 ++++++++++++++------ gix-blame/src/types.rs | 16 +- gix-blame/tests/blame.rs | 96 +++++++++-- gix-blame/tests/fixtures/make_blame_repo.sh | 30 ++++ 7 files changed, 428 insertions(+), 79 deletions(-) diff --git a/gix-blame/src/error.rs b/gix-blame/src/error.rs index 979cc8cd6ef..d90a05127cc 100644 --- a/gix-blame/src/error.rs +++ b/gix-blame/src/error.rs @@ -27,6 +27,8 @@ pub enum Error { Traverse(#[source] Box), #[error(transparent)] DiffTree(#[from] gix_diff::tree::Error), + #[error(transparent)] + DiffTreeWithRewrites(#[from] gix_diff::tree_with_rewrites::Error), #[error("Invalid line range was given, line range is expected to be a 1-based inclusive range in the format ','")] InvalidLineRange, #[error("Failure to decode commit during traversal")] diff --git a/gix-blame/src/file/function.rs b/gix-blame/src/file/function.rs index 03429b61b12..7fa4e511e28 100644 --- a/gix-blame/src/file/function.rs +++ b/gix-blame/src/file/function.rs @@ -72,19 +72,21 @@ pub fn file( ) -> Result { let _span = gix_trace::coarse!("gix_blame::file()", ?file_path, ?suspect); + let mut current_file_path: BString = file_path.into(); + let mut stats = Statistics::default(); let (mut buf, mut buf2, mut buf3) = (Vec::new(), Vec::new(), Vec::new()); let blamed_file_entry_id = find_path_entry_in_commit( &odb, &suspect, - file_path, + current_file_path.as_ref(), cache.as_ref(), &mut buf, &mut buf2, &mut stats, )? .ok_or_else(|| Error::FileMissing { - file_path: file_path.to_owned(), + file_path: current_file_path.to_owned(), commit_id: suspect, })?; let blamed_file_blob = odb.find_blob(&blamed_file_entry_id, &mut buf)?.data.to_vec(); @@ -102,6 +104,7 @@ pub fn file( hunks_to_blame.push(UnblamedHunk { range_in_blamed_file: range.clone(), suspects: [(suspect, range)].into(), + source_file_name: None, }); } @@ -165,7 +168,7 @@ pub fn file( entry = find_path_entry_in_commit( &odb, &suspect, - file_path, + current_file_path.as_ref(), cache.as_ref(), &mut buf, &mut buf2, @@ -216,7 +219,7 @@ pub fn file( if let Some(parent_entry_id) = find_path_entry_in_commit( &odb, parent_id, - file_path, + current_file_path.as_ref(), cache.as_ref(), &mut buf, &mut buf2, @@ -239,12 +242,13 @@ pub fn file( queue.insert(parent_commit_time, parent_id); let changes_for_file_path = tree_diff_at_file_path( &odb, - file_path, + current_file_path.as_ref(), suspect, parent_id, cache.as_ref(), &mut stats, &mut diff_state, + resource_cache, &mut buf, &mut buf2, &mut buf3, @@ -263,7 +267,7 @@ pub fn file( }; match modification { - gix_diff::tree::recorder::Change::Addition { .. } => { + TreeDiffChange::Addition => { if more_than_one_parent { // Do nothing under the assumption that this always (or almost always) // implies that the file comes from a different parent, compared to which @@ -272,20 +276,44 @@ pub fn file( break 'outer; } } - gix_diff::tree::recorder::Change::Deletion { .. } => { + TreeDiffChange::Deletion => { unreachable!("We already found file_path in suspect^{{tree}}, so it can't be deleted") } - gix_diff::tree::recorder::Change::Modification { previous_oid, oid, .. } => { + TreeDiffChange::Modification { previous_id, id } => { let changes = blob_changes( &odb, resource_cache, - oid, - previous_oid, - file_path, + id, + previous_id, + current_file_path.as_ref(), + options.diff_algorithm, + &mut stats, + )?; + hunks_to_blame = process_changes(hunks_to_blame, changes, suspect, parent_id); + } + TreeDiffChange::Rewrite { + source_location, + source_id, + id, + } => { + let changes = blob_changes( + &odb, + resource_cache, + id, + source_id, + current_file_path.as_ref(), options.diff_algorithm, &mut stats, )?; hunks_to_blame = process_changes(hunks_to_blame, changes, suspect, parent_id); + + for hunk in hunks_to_blame.iter_mut() { + if hunk.has_suspect(&parent_id) { + hunk.source_file_name = Some(source_location.clone()); + } + } + + current_file_path = source_location; } } } @@ -382,6 +410,7 @@ fn coalesce_blame_entries(lines_blamed: Vec) -> Vec { len: NonZeroU32::new((current_source_range.end - previous_source_range.start) as u32) .expect("BUG: hunks are never zero-sized"), commit_id: previous_entry.commit_id, + source_file_name: previous_entry.source_file_name.clone(), }; acc.pop(); @@ -399,6 +428,57 @@ fn coalesce_blame_entries(lines_blamed: Vec) -> Vec { }) } +enum TreeDiffChange { + Addition, + Deletion, + Modification { + previous_id: ObjectId, + id: ObjectId, + }, + Rewrite { + source_location: BString, + source_id: ObjectId, + id: ObjectId, + }, +} + +impl From for TreeDiffChange { + fn from(value: gix_diff::tree::recorder::Change) -> Self { + use gix_diff::tree::recorder::Change; + + match value { + Change::Addition { .. } => Self::Addition, + Change::Deletion { .. } => Self::Deletion, + Change::Modification { previous_oid, oid, .. } => Self::Modification { + previous_id: previous_oid, + id: oid, + }, + } + } +} + +impl From for TreeDiffChange { + fn from(value: gix_diff::tree_with_rewrites::Change) -> Self { + use gix_diff::tree_with_rewrites::Change; + + match value { + Change::Addition { .. } => Self::Addition, + Change::Deletion { .. } => Self::Deletion, + Change::Modification { previous_id, id, .. } => Self::Modification { previous_id, id }, + Change::Rewrite { + source_location, + source_id, + id, + .. + } => Self::Rewrite { + source_location, + source_id, + id, + }, + } + } +} + #[allow(clippy::too_many_arguments)] fn tree_diff_at_file_path( odb: impl gix_object::Find + gix_object::FindHeader, @@ -408,10 +488,11 @@ fn tree_diff_at_file_path( cache: Option<&gix_commitgraph::Graph>, stats: &mut Statistics, state: &mut gix_diff::tree::State, + resource_cache: &mut gix_diff::blob::Platform, commit_buf: &mut Vec, lhs_tree_buf: &mut Vec, rhs_tree_buf: &mut Vec, -) -> Result, Error> { +) -> Result, Error> { let parent_tree_id = find_commit(cache, &odb, &parent_id, commit_buf)?.tree_id()?; let parent_tree_iter = odb.find_tree_iter(&parent_tree_id, lhs_tree_buf)?; @@ -422,6 +503,37 @@ fn tree_diff_at_file_path( let tree_iter = odb.find_tree_iter(&tree_id, rhs_tree_buf)?; stats.trees_decoded += 1; + let result = tree_diff_without_rewrites_at_file_path(&odb, file_path, stats, state, parent_tree_iter, tree_iter)?; + + // Here, we follow git’s behaviour. We return when we’ve found a `Modification`. We try a + // second time with rename tracking when the change is either an `Addition` or a `Deletion` + // because those can turn out to have been a `Rewrite`. + if matches!(result, Some(TreeDiffChange::Modification { .. })) { + return Ok(result); + } + + let result = tree_diff_with_rewrites_at_file_path( + &odb, + file_path, + stats, + state, + resource_cache, + parent_tree_iter, + tree_iter, + )?; + + Ok(result) +} + +#[allow(clippy::too_many_arguments)] +fn tree_diff_without_rewrites_at_file_path( + odb: impl gix_object::Find + gix_object::FindHeader, + file_path: &BStr, + stats: &mut Statistics, + state: &mut gix_diff::tree::State, + parent_tree_iter: gix_object::TreeRefIter<'_>, + tree_iter: gix_object::TreeRefIter<'_>, +) -> Result, Error> { struct FindChangeToPath { inner: gix_diff::tree::Recorder, interesting_path: BString, @@ -509,11 +621,53 @@ fn tree_diff_at_file_path( stats.trees_diffed += 1; match result { - Ok(_) | Err(gix_diff::tree::Error::Cancelled) => Ok(recorder.change), + Ok(_) | Err(gix_diff::tree::Error::Cancelled) => Ok(recorder.change.map(std::convert::Into::into)), Err(error) => Err(Error::DiffTree(error)), } } +#[allow(clippy::too_many_arguments)] +fn tree_diff_with_rewrites_at_file_path( + odb: impl gix_object::Find + gix_object::FindHeader, + file_path: &BStr, + stats: &mut Statistics, + state: &mut gix_diff::tree::State, + resource_cache: &mut gix_diff::blob::Platform, + parent_tree_iter: gix_object::TreeRefIter<'_>, + tree_iter: gix_object::TreeRefIter<'_>, +) -> Result, Error> { + let mut change: Option = None; + + let options: gix_diff::tree_with_rewrites::Options = gix_diff::tree_with_rewrites::Options { + location: Some(gix_diff::tree::recorder::Location::Path), + rewrites: Some(gix_diff::Rewrites::default()), + }; + let result = gix_diff::tree_with_rewrites( + parent_tree_iter, + tree_iter, + resource_cache, + state, + &odb, + |change_ref| -> Result<_, std::convert::Infallible> { + if change_ref.location() == file_path { + change = Some(change_ref.into_owned()); + Ok(gix_diff::tree_with_rewrites::Action::Cancel) + } else { + Ok(gix_diff::tree_with_rewrites::Action::Continue) + } + }, + options, + ); + stats.trees_diffed_with_rewrites += 1; + + match result { + Ok(_) | Err(gix_diff::tree_with_rewrites::Error::Diff(gix_diff::tree::Error::Cancelled)) => { + Ok(change.map(std::convert::Into::into)) + } + Err(error) => Err(Error::DiffTreeWithRewrites(error)), + } +} + fn blob_changes( odb: impl gix_object::Find + gix_object::FindHeader, resource_cache: &mut gix_diff::blob::Platform, diff --git a/gix-blame/src/file/mod.rs b/gix-blame/src/file/mod.rs index 935fb09eed8..85b3f3a8f31 100644 --- a/gix-blame/src/file/mod.rs +++ b/gix-blame/src/file/mod.rs @@ -393,11 +393,13 @@ impl UnblamedHunk { range_in_blamed_file: self.range_in_blamed_file.start ..(self.range_in_blamed_file.start + split_at_from_start), suspects: new_suspects_before.collect(), + source_file_name: self.source_file_name.clone(), }; let new_hunk_after = Self { range_in_blamed_file: (self.range_in_blamed_file.start + split_at_from_start) ..(self.range_in_blamed_file.end), suspects: new_suspects_after.collect(), + source_file_name: self.source_file_name, }; Either::Right((new_hunk_before, new_hunk_after)) @@ -445,6 +447,7 @@ impl BlameEntry { start_in_source_file: range_in_source_file.start, len: force_non_zero(range_in_source_file.len() as u32), commit_id, + source_file_name: unblamed_hunk.source_file_name.clone(), }) } } diff --git a/gix-blame/src/file/tests.rs b/gix-blame/src/file/tests.rs index 9185ca50633..408a7799949 100644 --- a/gix-blame/src/file/tests.rs +++ b/gix-blame/src/file/tests.rs @@ -14,6 +14,7 @@ fn new_unblamed_hunk(range_in_blamed_file: Range, suspect: ObjectId, offset UnblamedHunk { range_in_blamed_file, suspects: [(suspect, range_in_destination)].into(), + source_file_name: None, } } @@ -74,7 +75,8 @@ mod process_change { hunk, Some(UnblamedHunk { range_in_blamed_file: 3..5, - suspects: [(suspect, 3..5)].into() + suspects: [(suspect, 3..5)].into(), + source_file_name: None, }) ); assert_eq!(change, None); @@ -82,7 +84,8 @@ mod process_change { new_hunks_to_blame, [UnblamedHunk { range_in_blamed_file: 0..3, - suspects: [(suspect, 0..3)].into() + suspects: [(suspect, 0..3)].into(), + source_file_name: None, }] ); assert_eq!(offset_in_destination, Offset::Added(3)); @@ -108,7 +111,8 @@ mod process_change { hunk, Some(UnblamedHunk { range_in_blamed_file: 3..5, - suspects: [(suspect, 3..5)].into() + suspects: [(suspect, 3..5)].into(), + source_file_name: None, }) ); assert_eq!(change, None); @@ -117,11 +121,13 @@ mod process_change { [ UnblamedHunk { range_in_blamed_file: 0..2, - suspects: [(parent, 0..2)].into() + suspects: [(parent, 0..2)].into(), + source_file_name: None, }, UnblamedHunk { range_in_blamed_file: 2..3, - suspects: [(suspect, 2..3)].into() + suspects: [(suspect, 2..3)].into(), + source_file_name: None, } ] ); @@ -148,7 +154,8 @@ mod process_change { hunk, Some(UnblamedHunk { range_in_blamed_file: 13..15, - suspects: [(suspect, 13..15)].into() + suspects: [(suspect, 13..15)].into(), + source_file_name: None, }) ); assert_eq!(change, None); @@ -157,11 +164,13 @@ mod process_change { [ UnblamedHunk { range_in_blamed_file: 10..12, - suspects: [(parent, 5..7)].into() + suspects: [(parent, 5..7)].into(), + source_file_name: None, }, UnblamedHunk { range_in_blamed_file: 12..13, - suspects: [(suspect, 12..13)].into() + suspects: [(suspect, 12..13)].into(), + source_file_name: None, } ] ); @@ -189,7 +198,8 @@ mod process_change { hunk, Some(UnblamedHunk { range_in_blamed_file: 15..17, - suspects: [(suspect, 10..12)].into() + suspects: [(suspect, 10..12)].into(), + source_file_name: None, }) ); assert_eq!(change, None); @@ -198,11 +208,13 @@ mod process_change { [ UnblamedHunk { range_in_blamed_file: 12..14, - suspects: [(parent, 7..9)].into() + suspects: [(parent, 7..9)].into(), + source_file_name: None, }, UnblamedHunk { range_in_blamed_file: 14..15, - suspects: [(suspect, 9..10)].into() + suspects: [(suspect, 9..10)].into(), + source_file_name: None, } ] ); @@ -229,7 +241,8 @@ mod process_change { hunk, Some(UnblamedHunk { range_in_blamed_file: 3..5, - suspects: [(suspect, 3..5)].into() + suspects: [(suspect, 3..5)].into(), + source_file_name: None, }) ); assert_eq!(change, None); @@ -237,7 +250,8 @@ mod process_change { new_hunks_to_blame, [UnblamedHunk { range_in_blamed_file: 0..3, - suspects: [(suspect, 0..3)].into() + suspects: [(suspect, 0..3)].into(), + source_file_name: None, }] ); assert_eq!(offset_in_destination, Offset::Added(2)); @@ -264,7 +278,8 @@ mod process_change { hunk, Some(UnblamedHunk { range_in_blamed_file: 4..5, - suspects: [(suspect, 3..4)].into() + suspects: [(suspect, 3..4)].into(), + source_file_name: None, }) ); assert_eq!(change, None); @@ -272,7 +287,8 @@ mod process_change { new_hunks_to_blame, [UnblamedHunk { range_in_blamed_file: 1..4, - suspects: [(suspect, 0..3)].into() + suspects: [(suspect, 0..3)].into(), + source_file_name: None, }] ); assert_eq!(offset_in_destination, Offset::Added(2)); @@ -299,7 +315,8 @@ mod process_change { hunk, Some(UnblamedHunk { range_in_blamed_file: 6..7, - suspects: [(suspect, 5..6)].into() + suspects: [(suspect, 5..6)].into(), + source_file_name: None, }) ); assert_eq!(change, None); @@ -308,11 +325,13 @@ mod process_change { [ UnblamedHunk { range_in_blamed_file: 3..4, - suspects: [(parent, 0..1)].into() + suspects: [(parent, 0..1)].into(), + source_file_name: None, }, UnblamedHunk { range_in_blamed_file: 4..6, - suspects: [(suspect, 3..5)].into() + suspects: [(suspect, 3..5)].into(), + source_file_name: None, } ] ); @@ -342,7 +361,8 @@ mod process_change { new_hunks_to_blame, [UnblamedHunk { range_in_blamed_file: 23..24, - suspects: [(suspect, 25..26)].into() + suspects: [(suspect, 25..26)].into(), + source_file_name: None, }] ); assert_eq!(offset_in_destination, Offset::Added(1)); @@ -371,7 +391,8 @@ mod process_change { new_hunks_to_blame, [UnblamedHunk { range_in_blamed_file: 23..24, - suspects: [(suspect, 21..22)].into() + suspects: [(suspect, 21..22)].into(), + source_file_name: None, }] ); assert_eq!(offset_in_destination, Offset::Added(1)); @@ -401,11 +422,13 @@ mod process_change { [ UnblamedHunk { range_in_blamed_file: 71..107, - suspects: [(parent, 70..106)].into() + suspects: [(parent, 70..106)].into(), + source_file_name: None, }, UnblamedHunk { range_in_blamed_file: 107..109, - suspects: [(suspect, 106..108)].into() + suspects: [(suspect, 106..108)].into(), + source_file_name: None, } ] ); @@ -436,11 +459,13 @@ mod process_change { [ UnblamedHunk { range_in_blamed_file: 149..155, - suspects: [(parent, 137..143)].into() + suspects: [(parent, 137..143)].into(), + source_file_name: None, }, UnblamedHunk { range_in_blamed_file: 155..156, - suspects: [(suspect, 143..144)].into() + suspects: [(suspect, 143..144)].into(), + source_file_name: None, } ] ); @@ -470,7 +495,8 @@ mod process_change { new_hunks_to_blame, [UnblamedHunk { range_in_blamed_file: 3..6, - suspects: [(parent, 5..8)].into() + suspects: [(parent, 5..8)].into(), + source_file_name: None, }] ); assert_eq!(offset_in_destination, Offset::Deleted(3)); @@ -497,7 +523,8 @@ mod process_change { hunk, Some(UnblamedHunk { range_in_blamed_file: 9..11, - suspects: [(suspect, 6..8)].into() + suspects: [(suspect, 6..8)].into(), + source_file_name: None, }) ); assert_eq!(change, None); @@ -526,7 +553,8 @@ mod process_change { hunk, Some(UnblamedHunk { range_in_blamed_file: 4..15, - suspects: [(suspect, 5..16)].into() + suspects: [(suspect, 5..16)].into(), + source_file_name: None, }) ); assert_eq!(change, None); @@ -555,7 +583,8 @@ mod process_change { hunk, Some(UnblamedHunk { range_in_blamed_file: 23..25, - suspects: [(suspect, 25..27)].into() + suspects: [(suspect, 25..27)].into(), + source_file_name: None, }) ); assert_eq!(change, None); @@ -586,7 +615,8 @@ mod process_change { new_hunks_to_blame, [UnblamedHunk { range_in_blamed_file: 15..16, - suspects: [(parent, 16..17)].into() + suspects: [(parent, 16..17)].into(), + source_file_name: None, }] ); assert_eq!(offset_in_destination, Offset::Added(1)); @@ -613,7 +643,8 @@ mod process_change { hunk, Some(UnblamedHunk { range_in_blamed_file: 23..25, - suspects: [(suspect, 22..24)].into() + suspects: [(suspect, 22..24)].into(), + source_file_name: None, }) ); assert_eq!(change, None); @@ -644,7 +675,8 @@ mod process_change { new_hunks_to_blame, [UnblamedHunk { range_in_blamed_file: 2..5, - suspects: [(suspect, 5..8)].into() + suspects: [(suspect, 5..8)].into(), + source_file_name: None, }] ); assert_eq!(offset_in_destination, Offset::Added(3)); @@ -671,7 +703,8 @@ mod process_change { hunk, Some(UnblamedHunk { range_in_blamed_file: 14..19, - suspects: [(suspect, 15..20)].into() + suspects: [(suspect, 15..20)].into(), + source_file_name: None, }) ); assert_eq!(change, None); @@ -679,7 +712,8 @@ mod process_change { new_hunks_to_blame, [UnblamedHunk { range_in_blamed_file: 12..14, - suspects: [(parent, 10..12)].into() + suspects: [(parent, 10..12)].into(), + source_file_name: None, }] ); assert_eq!(offset_in_destination, Offset::Added(1)); @@ -708,7 +742,8 @@ mod process_change { new_hunks_to_blame, [UnblamedHunk { range_in_blamed_file: 110..114, - suspects: [(parent, 106..110)].into() + suspects: [(parent, 106..110)].into(), + source_file_name: None, }] ); assert_eq!(offset_in_destination, Offset::Added(3)); @@ -734,7 +769,8 @@ mod process_change { hunk, Some(UnblamedHunk { range_in_blamed_file: 0..5, - suspects: [(suspect, 0..5)].into() + suspects: [(suspect, 0..5)].into(), + source_file_name: None, }) ); assert_eq!(change, None); @@ -764,7 +800,8 @@ mod process_change { new_hunks_to_blame, [UnblamedHunk { range_in_blamed_file: 0..5, - suspects: [(parent, 0..5)].into() + suspects: [(parent, 0..5)].into(), + source_file_name: None, }] ); assert_eq!(offset_in_destination, Offset::Added(0)); @@ -785,6 +822,7 @@ mod process_change { Some(UnblamedHunk { range_in_blamed_file: 22..30, suspects: [(suspect, 21..29)].into(), + source_file_name: None, }), Some(Change::Unchanged(21..23)), ); @@ -793,7 +831,8 @@ mod process_change { hunk, Some(UnblamedHunk { range_in_blamed_file: 22..30, - suspects: [(suspect, 21..29)].into() + suspects: [(suspect, 21..29)].into(), + source_file_name: None, }) ); assert_eq!(change, None); @@ -823,7 +862,8 @@ mod process_change { new_hunks_to_blame, [UnblamedHunk { range_in_blamed_file: 0..5, - suspects: [(parent, 0..5)].into() + suspects: [(parent, 0..5)].into(), + source_file_name: None, }] ); assert_eq!(offset_in_destination, Offset::Added(0)); @@ -849,7 +889,8 @@ mod process_change { hunk, Some(UnblamedHunk { range_in_blamed_file: 2..16, - suspects: [(suspect, 2..16)].into() + suspects: [(suspect, 2..16)].into(), + source_file_name: None, }) ); assert_eq!(change, None); @@ -877,7 +918,8 @@ mod process_change { hunk, Some(UnblamedHunk { range_in_blamed_file: 14..16, - suspects: [(suspect, 14..16)].into() + suspects: [(suspect, 14..16)].into(), + source_file_name: None, }) ); assert_eq!(change, None); @@ -885,7 +927,8 @@ mod process_change { new_hunks_to_blame, [UnblamedHunk { range_in_blamed_file: 2..14, - suspects: [(parent, 2..14)].into() + suspects: [(parent, 2..14)].into(), + source_file_name: None, }] ); assert_eq!(offset_in_destination, Offset::Deleted(4)); @@ -989,6 +1032,7 @@ mod process_changes { [UnblamedHunk { range_in_blamed_file: 0..4, suspects: [(suspect, 0..4)].into(), + source_file_name: None, },] ); } @@ -1007,10 +1051,12 @@ mod process_changes { UnblamedHunk { range_in_blamed_file: 0..4, suspects: [(suspect, 0..4)].into(), + source_file_name: None, }, UnblamedHunk { range_in_blamed_file: 4..6, suspects: [(parent, 0..2)].into(), + source_file_name: None, }, ] ); @@ -1034,14 +1080,17 @@ mod process_changes { UnblamedHunk { range_in_blamed_file: 0..2, suspects: [(parent, 0..2)].into(), + source_file_name: None, }, UnblamedHunk { range_in_blamed_file: 2..4, suspects: [(suspect, 2..4)].into(), + source_file_name: None, }, UnblamedHunk { range_in_blamed_file: 4..6, suspects: [(parent, 2..4)].into(), + source_file_name: None, }, ] ); @@ -1065,14 +1114,17 @@ mod process_changes { UnblamedHunk { range_in_blamed_file: 0..1, suspects: [(suspect, 0..1)].into(), + source_file_name: None, }, UnblamedHunk { range_in_blamed_file: 1..4, suspects: [(suspect, 1..4)].into(), + source_file_name: None, }, UnblamedHunk { range_in_blamed_file: 4..6, suspects: [(parent, 0..2)].into(), + source_file_name: None, } ] ); @@ -1092,10 +1144,12 @@ mod process_changes { UnblamedHunk { range_in_blamed_file: 0..1, suspects: [(suspect, 0..1)].into(), + source_file_name: None, }, UnblamedHunk { range_in_blamed_file: 1..6, suspects: [(parent, 0..5)].into(), + source_file_name: None, } ] ); @@ -1115,10 +1169,12 @@ mod process_changes { UnblamedHunk { range_in_blamed_file: 2..3, suspects: [(suspect, 0..1)].into(), + source_file_name: None, }, UnblamedHunk { range_in_blamed_file: 3..6, suspects: [(parent, 0..3)].into(), + source_file_name: None, } ] ); @@ -1138,10 +1194,12 @@ mod process_changes { UnblamedHunk { range_in_blamed_file: 0..4, suspects: [(suspect, 0..4)].into(), + source_file_name: None, }, UnblamedHunk { range_in_blamed_file: 4..6, suspects: [(parent, 3..5)].into(), + source_file_name: None, } ] ); @@ -1160,6 +1218,7 @@ mod process_changes { [UnblamedHunk { range_in_blamed_file: 4..6, suspects: [(parent, 0..2)].into(), + source_file_name: None, }] ); } @@ -1178,10 +1237,12 @@ mod process_changes { UnblamedHunk { range_in_blamed_file: 1..2, suspects: [(suspect, 0..1)].into(), + source_file_name: None, }, UnblamedHunk { range_in_blamed_file: 2..3, suspects: [(parent, 2..3)].into(), + source_file_name: None, } ] ); @@ -1205,14 +1266,17 @@ mod process_changes { UnblamedHunk { range_in_blamed_file: 0..2, suspects: [(suspect, 0..2)].into(), + source_file_name: None, }, UnblamedHunk { range_in_blamed_file: 2..3, suspects: [(parent, 0..1)].into(), + source_file_name: None, }, UnblamedHunk { range_in_blamed_file: 3..4, suspects: [(suspect, 3..4)].into(), + source_file_name: None, }, ] ); @@ -1226,10 +1290,12 @@ mod process_changes { UnblamedHunk { range_in_blamed_file: 0..30, suspects: [(suspect, 0..30)].into(), + source_file_name: None, }, UnblamedHunk { range_in_blamed_file: 31..37, suspects: [(suspect, 31..37)].into(), + source_file_name: None, }, ]; let changes = vec![ @@ -1244,19 +1310,23 @@ mod process_changes { [ UnblamedHunk { range_in_blamed_file: 0..16, - suspects: [(parent, 0..16)].into() + suspects: [(parent, 0..16)].into(), + source_file_name: None, }, UnblamedHunk { range_in_blamed_file: 16..17, - suspects: [(suspect, 16..17)].into() + suspects: [(suspect, 16..17)].into(), + source_file_name: None, }, UnblamedHunk { range_in_blamed_file: 17..30, - suspects: [(parent, 16..29)].into() + suspects: [(parent, 16..29)].into(), + source_file_name: None, }, UnblamedHunk { range_in_blamed_file: 31..37, - suspects: [(parent, 30..36)].into() + suspects: [(parent, 30..36)].into(), + source_file_name: None, } ] ); @@ -1270,14 +1340,17 @@ mod process_changes { UnblamedHunk { range_in_blamed_file: 1..3, suspects: [(suspect, 1..3)].into(), + source_file_name: None, }, UnblamedHunk { range_in_blamed_file: 5..7, suspects: [(suspect, 5..7)].into(), + source_file_name: None, }, UnblamedHunk { range_in_blamed_file: 8..10, suspects: [(suspect, 8..10)].into(), + source_file_name: None, }, ]; let changes = vec![ @@ -1293,22 +1366,27 @@ mod process_changes { UnblamedHunk { range_in_blamed_file: 1..3, suspects: [(parent, 1..3)].into(), + source_file_name: None, }, UnblamedHunk { range_in_blamed_file: 5..6, suspects: [(parent, 5..6)].into(), + source_file_name: None, }, UnblamedHunk { range_in_blamed_file: 6..7, suspects: [(suspect, 6..7)].into(), + source_file_name: None, }, UnblamedHunk { range_in_blamed_file: 8..9, suspects: [(suspect, 8..9)].into(), + source_file_name: None, }, UnblamedHunk { range_in_blamed_file: 9..10, suspects: [(parent, 6..7)].into(), + source_file_name: None, }, ] ); @@ -1330,11 +1408,13 @@ mod process_changes { [ UnblamedHunk { range_in_blamed_file: 0..4, - suspects: [(suspect, 0..4)].into() + suspects: [(suspect, 0..4)].into(), + source_file_name: None, }, UnblamedHunk { range_in_blamed_file: 4..7, - suspects: [(parent, 3..6)].into() + suspects: [(parent, 3..6)].into(), + source_file_name: None, } ] ); @@ -1356,19 +1436,23 @@ mod process_changes { [ UnblamedHunk { range_in_blamed_file: 13..14, - suspects: [(suspect, 13..14)].into() + suspects: [(suspect, 13..14)].into(), + source_file_name: None, }, UnblamedHunk { range_in_blamed_file: 14..16, suspects: [(parent, 10..12)].into(), + source_file_name: None, }, UnblamedHunk { range_in_blamed_file: 10..14, suspects: [(suspect, 10..14)].into(), + source_file_name: None, }, UnblamedHunk { range_in_blamed_file: 14..17, suspects: [(parent, 10..13)].into(), + source_file_name: None, }, ] ); diff --git a/gix-blame/src/types.rs b/gix-blame/src/types.rs index 84b107b6f8d..6db5499b3d1 100644 --- a/gix-blame/src/types.rs +++ b/gix-blame/src/types.rs @@ -172,6 +172,10 @@ pub struct Statistics { /// are likely partial as they are cancelled as soon as a change to the blamed file is /// detected. pub trees_diffed: usize, + /// The amount of tree-diffs to see if the file was moved (or rewritten, in git terminology). + /// These diffs are likely partial as they are cancelled as soon as a change to the blamed file + /// is detected. + pub trees_diffed_with_rewrites: usize, /// The amount of blobs there were compared to each other to learn what changed between commits. /// Note that in order to diff a blob, one needs to load both versions from the database. pub blobs_diffed: usize, @@ -275,11 +279,18 @@ pub struct BlameEntry { pub len: NonZeroU32, /// The commit that introduced the section into the *Source File*. pub commit_id: ObjectId, + /// The *Source File*'s name, in case it differs from *Blamed File*'s name. + pub source_file_name: Option, } impl BlameEntry { /// Create a new instance. - pub fn new(range_in_blamed_file: Range, range_in_source_file: Range, commit_id: ObjectId) -> Self { + pub fn new( + range_in_blamed_file: Range, + range_in_source_file: Range, + commit_id: ObjectId, + source_file_name: Option, + ) -> Self { debug_assert!( range_in_blamed_file.end > range_in_blamed_file.start, "{range_in_blamed_file:?}" @@ -295,6 +306,7 @@ impl BlameEntry { start_in_source_file: range_in_source_file.start, len: NonZeroU32::new(range_in_blamed_file.len() as u32).expect("BUG: hunks are never empty"), commit_id, + source_file_name, } } } @@ -331,6 +343,8 @@ pub struct UnblamedHunk { /// equal to `range_in_blamed_file`. Since `suspects` rarely contains more than 1 item, it can /// efficiently be stored as a `SmallVec`. pub suspects: SmallVec<[(ObjectId, Range); 1]>, + /// The *Source File*'s name, in case it differs from *Blamed File*'s name. + pub source_file_name: Option, } impl UnblamedHunk { diff --git a/gix-blame/tests/blame.rs b/gix-blame/tests/blame.rs index 2adc4b52fba..e54c47d4065 100644 --- a/gix-blame/tests/blame.rs +++ b/gix-blame/tests/blame.rs @@ -1,4 +1,4 @@ -use std::path::PathBuf; +use std::{collections::BTreeMap, path::PathBuf}; use gix_blame::BlameRanges; use gix_hash::ObjectId; @@ -6,10 +6,11 @@ use gix_object::bstr; struct Baseline<'a> { lines: bstr::Lines<'a>, + filenames: BTreeMap, } mod baseline { - use std::path::Path; + use std::{collections::BTreeMap, path::Path}; use gix_blame::BlameEntry; use gix_hash::ObjectId; @@ -40,10 +41,30 @@ mod baseline { } impl Baseline<'_> { - pub fn collect(baseline_path: impl AsRef) -> std::io::Result> { + pub fn collect( + baseline_path: impl AsRef, + source_file_name: gix_object::bstr::BString, + ) -> std::io::Result> { let content = std::fs::read(baseline_path)?; + let baseline = Baseline { + lines: content.lines(), + filenames: BTreeMap::default(), + }; - Ok(Baseline { lines: content.lines() }.collect()) + Ok(baseline + .map(|entry| { + let source_file_name = if entry.source_file_name.as_ref() == Some(&source_file_name) { + None + } else { + entry.source_file_name + }; + + BlameEntry { + source_file_name, + ..entry + } + }) + .collect()) } } @@ -54,6 +75,7 @@ mod baseline { let mut ranges = None; let mut commit_id = gix_hash::Kind::Sha1.null(); let mut skip_lines: u32 = 0; + let mut source_file_name: Option = None; for line in self.lines.by_ref() { if line.starts_with(b"\t") { @@ -94,6 +116,12 @@ mod baseline { (line_number_in_final_file - 1)..(line_number_in_final_file + number_of_lines_in_group - 1); assert!(ranges.is_none(), "should not overwrite existing ranges"); ranges = Some((blame_range, source_range)); + } else if fields[0] == "filename" { + // We need to store `source_file_name` as it is not repeated for subsequent + // hunks that have the same `commit_id`. + source_file_name = Some(fields[1].into()); + + self.filenames.insert(commit_id, fields[1].into()); } else if !is_known_header_field(&fields[0]) && ObjectId::from_hex(fields[0].as_bytes()).is_err() { panic!("unexpected line: '{:?}'", line.as_bstr()); } @@ -103,7 +131,12 @@ mod baseline { // No new lines were parsed, so we assume the iterator is finished. return None; }; - Some(BlameEntry::new(range_in_blamed_file, range_in_source_file, commit_id)) + Some(BlameEntry::new( + range_in_blamed_file, + range_in_source_file, + commit_id, + source_file_name.or_else(|| self.filenames.get(&commit_id).cloned()), + )) } } } @@ -186,12 +219,14 @@ macro_rules! mktest { suspect, } = Fixture::new()?; + let source_file_name: gix_object::bstr::BString = format!("{}.txt", $case).into(); + let lines_blamed = gix_blame::file( &odb, suspect, None, &mut resource_cache, - format!("{}.txt", $case).as_str().into(), + source_file_name.as_ref(), gix_blame::Options { diff_algorithm: gix_diff::blob::Algorithm::Histogram, range: BlameRanges::default(), @@ -203,7 +238,7 @@ macro_rules! mktest { assert_eq!(lines_blamed.len(), $number_of_lines); let git_dir = fixture_path().join(".git"); - let baseline = Baseline::collect(git_dir.join(format!("{}.baseline", $case)))?; + let baseline = Baseline::collect(git_dir.join(format!("{}.baseline", $case)), source_file_name)?; assert_eq!(baseline.len(), $number_of_lines); pretty_assertions::assert_eq!(lines_blamed, baseline); @@ -231,6 +266,15 @@ mktest!(coalesce_adjacent_hunks, "coalesce-adjacent-hunks", 1); mktest!(sub_directory, "sub-directory/sub-directory", 3); +mktest!(after_rename, "after-rename", 1); +mktest!(after_second_rename, "after-second-rename", 1); +mktest!(after_rewrite, "after-rewrite", 3); +mktest!( + after_move_to_sub_directory, + "sub-directory/after-move-to-sub-directory", + 1 +); + mktest!(resolved_conflict, "resolved-conflict", 2); mktest!(file_in_one_chain_of_ancestors, "file-in-one-chain-of-ancestors", 1); mktest!( @@ -259,12 +303,14 @@ fn diff_disparity() { suspect, } = Fixture::new().unwrap(); + let source_file_name: gix_object::bstr::BString = format!("{case}.txt").into(); + let lines_blamed = gix_blame::file( &odb, suspect, None, &mut resource_cache, - format!("{case}.txt").as_str().into(), + source_file_name.as_ref(), gix_blame::Options { diff_algorithm: gix_diff::blob::Algorithm::Histogram, range: BlameRanges::default(), @@ -277,7 +323,7 @@ fn diff_disparity() { assert_eq!(lines_blamed.len(), 5); let git_dir = fixture_path().join(".git"); - let baseline = Baseline::collect(git_dir.join(format!("{case}.baseline"))).unwrap(); + let baseline = Baseline::collect(git_dir.join(format!("{case}.baseline")), source_file_name).unwrap(); pretty_assertions::assert_eq!(lines_blamed, baseline, "{case}"); } @@ -291,12 +337,14 @@ fn since() { suspect, } = Fixture::new().unwrap(); + let source_file_name: gix_object::bstr::BString = "simple.txt".into(); + let lines_blamed = gix_blame::file( &odb, suspect, None, &mut resource_cache, - "simple.txt".into(), + source_file_name.as_ref(), gix_blame::Options { diff_algorithm: gix_diff::blob::Algorithm::Histogram, range: BlameRanges::default(), @@ -309,7 +357,7 @@ fn since() { assert_eq!(lines_blamed.len(), 1); let git_dir = fixture_path().join(".git"); - let baseline = Baseline::collect(git_dir.join("simple-since.baseline")).unwrap(); + let baseline = Baseline::collect(git_dir.join("simple-since.baseline"), source_file_name).unwrap(); pretty_assertions::assert_eq!(lines_blamed, baseline); } @@ -326,12 +374,14 @@ mod blame_ranges { suspect, } = Fixture::new().unwrap(); + let source_file_name: gix_object::bstr::BString = "simple.txt".into(); + let lines_blamed = gix_blame::file( &odb, suspect, None, &mut resource_cache, - "simple.txt".into(), + source_file_name.as_ref(), gix_blame::Options { diff_algorithm: gix_diff::blob::Algorithm::Histogram, range: BlameRanges::from_range(1..=2), @@ -344,7 +394,7 @@ mod blame_ranges { assert_eq!(lines_blamed.len(), 2); let git_dir = fixture_path().join(".git"); - let baseline = Baseline::collect(git_dir.join("simple-lines-1-2.baseline")).unwrap(); + let baseline = Baseline::collect(git_dir.join("simple-lines-1-2.baseline"), source_file_name).unwrap(); pretty_assertions::assert_eq!(lines_blamed, baseline); } @@ -362,12 +412,14 @@ mod blame_ranges { ranges.add_range(1..=1); // Duplicate range, should be ignored ranges.add_range(4..=4); // Line 4 + let source_file_name: gix_object::bstr::BString = "simple.txt".into(); + let lines_blamed = gix_blame::file( &odb, suspect, None, &mut resource_cache, - "simple.txt".into(), + source_file_name.as_ref(), gix_blame::Options { diff_algorithm: gix_diff::blob::Algorithm::Histogram, range: ranges, @@ -380,7 +432,11 @@ mod blame_ranges { assert_eq!(lines_blamed.len(), 3); // Should have 3 lines total (2 from first range + 1 from second range) let git_dir = fixture_path().join(".git"); - let baseline = Baseline::collect(git_dir.join("simple-lines-multiple-1-2-and-4.baseline")).unwrap(); + let baseline = Baseline::collect( + git_dir.join("simple-lines-multiple-1-2-and-4.baseline"), + source_file_name, + ) + .unwrap(); pretty_assertions::assert_eq!(lines_blamed, baseline); } @@ -395,12 +451,14 @@ mod blame_ranges { let ranges = BlameRanges::from_ranges(vec![1..=2, 1..=1, 4..=4]); + let source_file_name: gix_object::bstr::BString = "simple.txt".into(); + let lines_blamed = gix_blame::file( &odb, suspect, None, &mut resource_cache, - "simple.txt".into(), + source_file_name.as_ref(), gix_blame::Options { diff_algorithm: gix_diff::blob::Algorithm::Histogram, range: ranges, @@ -413,7 +471,11 @@ mod blame_ranges { assert_eq!(lines_blamed.len(), 3); // Should have 3 lines total (2 from first range + 1 from second range) let git_dir = fixture_path().join(".git"); - let baseline = Baseline::collect(git_dir.join("simple-lines-multiple-1-2-and-4.baseline")).unwrap(); + let baseline = Baseline::collect( + git_dir.join("simple-lines-multiple-1-2-and-4.baseline"), + source_file_name, + ) + .unwrap(); pretty_assertions::assert_eq!(lines_blamed, baseline); } diff --git a/gix-blame/tests/fixtures/make_blame_repo.sh b/gix-blame/tests/fixtures/make_blame_repo.sh index bbe764e1aa6..5846f9326db 100755 --- a/gix-blame/tests/fixtures/make_blame_repo.sh +++ b/gix-blame/tests/fixtures/make_blame_repo.sh @@ -30,6 +30,16 @@ git add added-lines-around.txt git add coalesce-adjacent-hunks.txt git commit -q -m c1.3 +echo "line 1 in renamed file" >> before-rename.txt +echo "line 1 in file renamed twice" >> before-first-rename.txt +echo -e "line 1 in renamed and rewritten file\nline 2\nline 3\nline 4\nline 5\nline 6" >> before-rewrite.txt +echo -e "line 1 in file moved to sub-directory" > before-move-to-sub-directory.txt +git add before-rename.txt +git add before-first-rename.txt +git add before-rewrite.txt +git add before-move-to-sub-directory.txt +git commit -q -m c1.4 + echo "line 2" >> simple.txt git add simple.txt git commit -q -m c2 @@ -56,7 +66,9 @@ git commit -q -m c2.4 mkdir sub-directory echo -e "line 1\nline 2" > sub-directory/sub-directory.txt +mv before-move-to-sub-directory.txt sub-directory/after-move-to-sub-directory.txt git add sub-directory/sub-directory.txt +git add before-move-to-sub-directory.txt sub-directory/after-move-to-sub-directory.txt git commit -q -m c2.5 echo "line 3" >> simple.txt @@ -85,6 +97,15 @@ echo -e "line 1\nline 2 changed" > same-line-changed-twice.txt git add same-line-changed-twice.txt git commit -q -m c3.4 +mv before-rename.txt after-rename.txt +mv before-first-rename.txt before-second-rename.txt +rm before-rewrite.txt +echo -e "line 1 in renamed and rewritten file\nline 2 changed\nline 3 changed\nline 4\nline 5\nline 6" >> after-rewrite.txt +git add before-rename.txt after-rename.txt +git add before-first-rename.txt before-second-rename.txt +git add before-rewrite.txt after-rewrite.txt +git commit -q -m c3.5 + echo "line 4" >> simple.txt git add simple.txt git commit -q -m c4 @@ -137,6 +158,10 @@ cp empty-lines-histogram.txt empty-lines-myers.txt git add empty-lines-histogram.txt empty-lines-myers.txt git commit -q -m c5.4 +mv before-second-rename.txt after-second-rename.txt +git add before-second-rename.txt after-second-rename.txt +git commit -q -m c5.5 + # The commit history created by the commits above this line is linear, it only # contains commits that have exactly one parent. # Below this line, there’s also commits that have more than one parent. @@ -253,6 +278,11 @@ git blame --porcelain coalesce-adjacent-hunks.txt > .git/coalesce-adjacent-hunks mkdir .git/sub-directory git blame --porcelain sub-directory/sub-directory.txt > .git/sub-directory/sub-directory.baseline +git blame --porcelain after-rename.txt > .git/after-rename.baseline +git blame --porcelain after-second-rename.txt > .git/after-second-rename.baseline +git blame --porcelain after-rewrite.txt > .git/after-rewrite.baseline +git blame --porcelain sub-directory/after-move-to-sub-directory.txt > .git/sub-directory/after-move-to-sub-directory.baseline + git blame --porcelain resolved-conflict.txt > .git/resolved-conflict.baseline git blame --porcelain file-in-one-chain-of-ancestors.txt > .git/file-in-one-chain-of-ancestors.baseline git blame --porcelain different-file-in-another-chain-of-ancestors.txt > .git/different-file-in-another-chain-of-ancestors.baseline From f899d6d533b6fb0d1ce5d08d0ec6c38df294398a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christoph=20R=C3=BC=C3=9Fler?= Date: Thu, 22 May 2025 16:01:40 +0200 Subject: [PATCH 106/166] Adapt to changes in `gix-blame` --- gitoxide-core/src/repository/blame.rs | 27 ++++++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/gitoxide-core/src/repository/blame.rs b/gitoxide-core/src/repository/blame.rs index 0d42c75f9e0..259018b4a5e 100644 --- a/gitoxide-core/src/repository/blame.rs +++ b/gitoxide-core/src/repository/blame.rs @@ -47,7 +47,7 @@ pub fn blame_file( options, )?; let statistics = outcome.statistics; - write_blame_entries(out, outcome)?; + write_blame_entries(out, outcome, file)?; if let Some(err) = err { writeln!(err, "{statistics:#?}")?; @@ -55,7 +55,15 @@ pub fn blame_file( Ok(()) } -fn write_blame_entries(mut out: impl std::io::Write, outcome: gix::blame::Outcome) -> Result<(), std::io::Error> { +fn write_blame_entries( + mut out: impl std::io::Write, + outcome: gix::blame::Outcome, + source_file_name: gix::bstr::BString, +) -> Result<(), std::io::Error> { + let show_file_names = outcome + .entries_with_lines() + .any(|(entry, _)| entry.source_file_name.is_some()); + for (entry, lines_in_hunk) in outcome.entries_with_lines() { for ((actual_lno, source_lno), line) in entry .range_in_blamed_file() @@ -64,11 +72,20 @@ fn write_blame_entries(mut out: impl std::io::Write, outcome: gix::blame::Outcom { write!( out, - "{short_id} {line_no} {src_line_no} {line}", - line_no = actual_lno + 1, - src_line_no = source_lno + 1, + "{short_id} {line_no} ", short_id = entry.commit_id.to_hex_with_len(8), + line_no = actual_lno + 1, )?; + + if show_file_names { + if let Some(ref source_file_name) = entry.source_file_name { + write!(out, "{source_file_name} ")?; + } else { + write!(out, "{source_file_name} ")?; + } + } + + write!(out, "{src_line_no} {line}", src_line_no = source_lno + 1)?; } } From 7435ed5a9a7370a12332e12bd40fdbc757284a85 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christoph=20R=C3=BC=C3=9Fler?= Date: Wed, 28 May 2025 18:52:11 +0200 Subject: [PATCH 107/166] Get current file_path from unblamed hunk --- gix-blame/src/file/function.rs | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/gix-blame/src/file/function.rs b/gix-blame/src/file/function.rs index 7fa4e511e28..feaf3a95680 100644 --- a/gix-blame/src/file/function.rs +++ b/gix-blame/src/file/function.rs @@ -72,21 +72,19 @@ pub fn file( ) -> Result { let _span = gix_trace::coarse!("gix_blame::file()", ?file_path, ?suspect); - let mut current_file_path: BString = file_path.into(); - let mut stats = Statistics::default(); let (mut buf, mut buf2, mut buf3) = (Vec::new(), Vec::new(), Vec::new()); let blamed_file_entry_id = find_path_entry_in_commit( &odb, &suspect, - current_file_path.as_ref(), + file_path, cache.as_ref(), &mut buf, &mut buf2, &mut stats, )? .ok_or_else(|| Error::FileMissing { - file_path: current_file_path.to_owned(), + file_path: file_path.to_owned(), commit_id: suspect, })?; let blamed_file_blob = odb.find_blob(&blamed_file_entry_id, &mut buf)?.data.to_vec(); @@ -123,13 +121,22 @@ pub fn file( break; } - let is_still_suspect = hunks_to_blame.iter().any(|hunk| hunk.has_suspect(&suspect)); + let first_hunk_for_suspect = hunks_to_blame.iter().find(|hunk| hunk.has_suspect(&suspect)); + let is_still_suspect = first_hunk_for_suspect.is_some(); if !is_still_suspect { // There are no `UnblamedHunk`s associated with this `suspect`, so we can continue with // the next one. continue 'outer; } + // We know `first_hunk_for_suspect` can’t be `None` here because we check `is_some()` + // above. + let current_file_path: BString = first_hunk_for_suspect + .unwrap() + .source_file_name + .clone() + .unwrap_or_else(|| file_path.to_owned()); + let commit = find_commit(cache.as_ref(), &odb, &suspect, &mut buf)?; let commit_time = commit.commit_time()?; @@ -285,7 +292,7 @@ pub fn file( resource_cache, id, previous_id, - current_file_path.as_ref(), + file_path, options.diff_algorithm, &mut stats, )?; @@ -301,7 +308,7 @@ pub fn file( resource_cache, id, source_id, - current_file_path.as_ref(), + file_path, options.diff_algorithm, &mut stats, )?; @@ -312,8 +319,6 @@ pub fn file( hunk.source_file_name = Some(source_location.clone()); } } - - current_file_path = source_location; } } } From 3e5365cb066895c787a22422964a2b9459f37ec3 Mon Sep 17 00:00:00 2001 From: Sebastian Thiel Date: Thu, 5 Jun 2025 08:35:51 +0200 Subject: [PATCH 108/166] refactor - assure the previous path is passed when diffing, and when available. - make rewrites configurable as part of `Options`. --- gitoxide-core/src/repository/blame.rs | 17 ++++---------- gix-blame/src/file/function.rs | 32 +++++++++++++++++++-------- gix-blame/src/types.rs | 3 +++ gix-blame/tests/blame.rs | 6 +++++ src/plumbing/main.rs | 1 + 5 files changed, 37 insertions(+), 22 deletions(-) diff --git a/gitoxide-core/src/repository/blame.rs b/gitoxide-core/src/repository/blame.rs index 259018b4a5e..0adab07d0e6 100644 --- a/gitoxide-core/src/repository/blame.rs +++ b/gitoxide-core/src/repository/blame.rs @@ -47,7 +47,7 @@ pub fn blame_file( options, )?; let statistics = outcome.statistics; - write_blame_entries(out, outcome, file)?; + show_blame_entries(out, outcome, file)?; if let Some(err) = err { writeln!(err, "{statistics:#?}")?; @@ -55,15 +55,11 @@ pub fn blame_file( Ok(()) } -fn write_blame_entries( +fn show_blame_entries( mut out: impl std::io::Write, outcome: gix::blame::Outcome, source_file_name: gix::bstr::BString, ) -> Result<(), std::io::Error> { - let show_file_names = outcome - .entries_with_lines() - .any(|(entry, _)| entry.source_file_name.is_some()); - for (entry, lines_in_hunk) in outcome.entries_with_lines() { for ((actual_lno, source_lno), line) in entry .range_in_blamed_file() @@ -77,13 +73,8 @@ fn write_blame_entries( line_no = actual_lno + 1, )?; - if show_file_names { - if let Some(ref source_file_name) = entry.source_file_name { - write!(out, "{source_file_name} ")?; - } else { - write!(out, "{source_file_name} ")?; - } - } + let source_file_name = entry.source_file_name.as_ref().unwrap_or(&source_file_name); + write!(out, "{source_file_name} ")?; write!(out, "{src_line_no} {line}", src_line_no = source_lno + 1)?; } diff --git a/gix-blame/src/file/function.rs b/gix-blame/src/file/function.rs index feaf3a95680..298d8e38be2 100644 --- a/gix-blame/src/file/function.rs +++ b/gix-blame/src/file/function.rs @@ -122,17 +122,15 @@ pub fn file( } let first_hunk_for_suspect = hunks_to_blame.iter().find(|hunk| hunk.has_suspect(&suspect)); - let is_still_suspect = first_hunk_for_suspect.is_some(); - if !is_still_suspect { + let Some(first_hunk_for_suspect) = first_hunk_for_suspect else { // There are no `UnblamedHunk`s associated with this `suspect`, so we can continue with // the next one. continue 'outer; - } + }; // We know `first_hunk_for_suspect` can’t be `None` here because we check `is_some()` // above. - let current_file_path: BString = first_hunk_for_suspect - .unwrap() + let current_file_path = first_hunk_for_suspect .source_file_name .clone() .unwrap_or_else(|| file_path.to_owned()); @@ -259,6 +257,7 @@ pub fn file( &mut buf, &mut buf2, &mut buf3, + options.rewrites, )?; let Some(modification) = changes_for_file_path else { if more_than_one_parent { @@ -293,6 +292,7 @@ pub fn file( id, previous_id, file_path, + file_path, options.diff_algorithm, &mut stats, )?; @@ -309,6 +309,7 @@ pub fn file( id, source_id, file_path, + source_location.as_ref(), options.diff_algorithm, &mut stats, )?; @@ -433,6 +434,8 @@ fn coalesce_blame_entries(lines_blamed: Vec) -> Vec { }) } +/// The union of [`gix_diff::tree::recorder::Change`] and [`gix_diff::tree_with_rewrites::Change`], +/// keeping only the blame-relevant information. enum TreeDiffChange { Addition, Deletion, @@ -497,6 +500,7 @@ fn tree_diff_at_file_path( commit_buf: &mut Vec, lhs_tree_buf: &mut Vec, rhs_tree_buf: &mut Vec, + rewrites: Option, ) -> Result, Error> { let parent_tree_id = find_commit(cache, &odb, &parent_id, commit_buf)?.tree_id()?; @@ -513,9 +517,15 @@ fn tree_diff_at_file_path( // Here, we follow git’s behaviour. We return when we’ve found a `Modification`. We try a // second time with rename tracking when the change is either an `Addition` or a `Deletion` // because those can turn out to have been a `Rewrite`. + // TODO(perf): renames are usually rare enough to not care about the work duplication done here. + // But in theory, a rename tracker could be used by us, on demand, and we could stuff the + // changes in there and have it find renames, without repeating the diff. if matches!(result, Some(TreeDiffChange::Modification { .. })) { return Ok(result); } + let Some(rewrites) = rewrites else { + return Ok(result); + }; let result = tree_diff_with_rewrites_at_file_path( &odb, @@ -525,6 +535,7 @@ fn tree_diff_at_file_path( resource_cache, parent_tree_iter, tree_iter, + rewrites, )?; Ok(result) @@ -626,7 +637,7 @@ fn tree_diff_without_rewrites_at_file_path( stats.trees_diffed += 1; match result { - Ok(_) | Err(gix_diff::tree::Error::Cancelled) => Ok(recorder.change.map(std::convert::Into::into)), + Ok(_) | Err(gix_diff::tree::Error::Cancelled) => Ok(recorder.change.map(Into::into)), Err(error) => Err(Error::DiffTree(error)), } } @@ -640,12 +651,13 @@ fn tree_diff_with_rewrites_at_file_path( resource_cache: &mut gix_diff::blob::Platform, parent_tree_iter: gix_object::TreeRefIter<'_>, tree_iter: gix_object::TreeRefIter<'_>, + rewrites: gix_diff::Rewrites, ) -> Result, Error> { let mut change: Option = None; let options: gix_diff::tree_with_rewrites::Options = gix_diff::tree_with_rewrites::Options { location: Some(gix_diff::tree::recorder::Location::Path), - rewrites: Some(gix_diff::Rewrites::default()), + rewrites: Some(rewrites), }; let result = gix_diff::tree_with_rewrites( parent_tree_iter, @@ -667,18 +679,20 @@ fn tree_diff_with_rewrites_at_file_path( match result { Ok(_) | Err(gix_diff::tree_with_rewrites::Error::Diff(gix_diff::tree::Error::Cancelled)) => { - Ok(change.map(std::convert::Into::into)) + Ok(change.map(Into::into)) } Err(error) => Err(Error::DiffTreeWithRewrites(error)), } } +#[allow(clippy::too_many_arguments)] fn blob_changes( odb: impl gix_object::Find + gix_object::FindHeader, resource_cache: &mut gix_diff::blob::Platform, oid: ObjectId, previous_oid: ObjectId, file_path: &BStr, + previous_file_path: &BStr, diff_algorithm: gix_diff::blob::Algorithm, stats: &mut Statistics, ) -> Result, Error> { @@ -738,7 +752,7 @@ fn blob_changes( resource_cache.set_resource( previous_oid, gix_object::tree::EntryKind::Blob, - file_path, + previous_file_path, gix_diff::blob::ResourceKind::OldOrSource, &odb, )?; diff --git a/gix-blame/src/types.rs b/gix-blame/src/types.rs index 6db5499b3d1..5672eaf679d 100644 --- a/gix-blame/src/types.rs +++ b/gix-blame/src/types.rs @@ -147,6 +147,8 @@ pub struct Options { pub range: BlameRanges, /// Don't consider commits before the given date. pub since: Option, + /// Determine if rename tracking should be performed, and how. + pub rewrites: Option, } /// The outcome of [`file()`](crate::file()). @@ -280,6 +282,7 @@ pub struct BlameEntry { /// The commit that introduced the section into the *Source File*. pub commit_id: ObjectId, /// The *Source File*'s name, in case it differs from *Blamed File*'s name. + /// This happens when the file was renamed. pub source_file_name: Option, } diff --git a/gix-blame/tests/blame.rs b/gix-blame/tests/blame.rs index e54c47d4065..7b7d1e39e1d 100644 --- a/gix-blame/tests/blame.rs +++ b/gix-blame/tests/blame.rs @@ -231,6 +231,7 @@ macro_rules! mktest { diff_algorithm: gix_diff::blob::Algorithm::Histogram, range: BlameRanges::default(), since: None, + rewrites: Some(gix_diff::Rewrites::default()), }, )? .entries; @@ -315,6 +316,7 @@ fn diff_disparity() { diff_algorithm: gix_diff::blob::Algorithm::Histogram, range: BlameRanges::default(), since: None, + rewrites: Some(gix_diff::Rewrites::default()), }, ) .unwrap() @@ -349,6 +351,7 @@ fn since() { diff_algorithm: gix_diff::blob::Algorithm::Histogram, range: BlameRanges::default(), since: Some(gix_date::parse("2025-01-31", None).unwrap()), + rewrites: Some(gix_diff::Rewrites::default()), }, ) .unwrap() @@ -386,6 +389,7 @@ mod blame_ranges { diff_algorithm: gix_diff::blob::Algorithm::Histogram, range: BlameRanges::from_range(1..=2), since: None, + rewrites: Some(gix_diff::Rewrites::default()), }, ) .unwrap() @@ -424,6 +428,7 @@ mod blame_ranges { diff_algorithm: gix_diff::blob::Algorithm::Histogram, range: ranges, since: None, + rewrites: None, }, ) .unwrap() @@ -463,6 +468,7 @@ mod blame_ranges { diff_algorithm: gix_diff::blob::Algorithm::Histogram, range: ranges, since: None, + rewrites: None, }, ) .unwrap() diff --git a/src/plumbing/main.rs b/src/plumbing/main.rs index fe111b065cf..136f977a60a 100644 --- a/src/plumbing/main.rs +++ b/src/plumbing/main.rs @@ -1590,6 +1590,7 @@ pub fn main() -> Result<()> { diff_algorithm, range: gix::blame::BlameRanges::from_ranges(ranges), since, + rewrites: Some(gix::diff::Rewrites::default()), }, out, statistics.then_some(err), From 8bebd2e84b4e9d9a31a6ff8dcd17da83534f3c95 Mon Sep 17 00:00:00 2001 From: Ilya Grigoriev Date: Thu, 5 Jun 2025 15:51:03 -0700 Subject: [PATCH 109/166] gix-actor docs: document conversions between `Signature` and `SignatureRef` Cc: https://github.com/GitoxideLabs/gitoxide/pull/1935 --- gix-actor/src/lib.rs | 4 +++- gix-actor/src/signature/mod.rs | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/gix-actor/src/lib.rs b/gix-actor/src/lib.rs index e5f7ac87cd0..ab1361b456e 100644 --- a/gix-actor/src/lib.rs +++ b/gix-actor/src/lib.rs @@ -71,6 +71,8 @@ pub struct Signature { /// An immutable signature that is created by an actor at a certain time. /// +/// Not fully parsed. +/// /// Note that this is not a cryptographical signature. #[derive(Default, PartialEq, Eq, Debug, Hash, Ord, PartialOrd, Clone, Copy)] #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] @@ -84,6 +86,6 @@ pub struct SignatureRef<'a> { /// /// Use [SignatureRef::trim()] or trim manually to be able to clean it up. pub email: &'a BStr, - /// The timestamp at which the signature was performed. + /// The timestamp at which the signature was performed, potentially malformed. pub time: &'a str, } diff --git a/gix-actor/src/signature/mod.rs b/gix-actor/src/signature/mod.rs index f7f7b331e43..b300ff4baf8 100644 --- a/gix-actor/src/signature/mod.rs +++ b/gix-actor/src/signature/mod.rs @@ -14,7 +14,7 @@ mod _ref { decode.parse_next(&mut data) } - /// Create an owned instance from this shared one. + /// Try to parse the timestamp and create an owned instance from this shared one. pub fn to_owned(&self) -> Result { Ok(Signature { name: self.name.to_owned(), @@ -71,6 +71,8 @@ mod convert { impl Signature { /// Borrow this instance as immutable, serializing the `time` field into `buf`. + /// + /// Commonly used as `signature.to_ref(&mut TimeBuf::default())`. pub fn to_ref<'a>(&'a self, time_buf: &'a mut TimeBuf) -> SignatureRef<'a> { SignatureRef { name: self.name.as_ref(), From aff23d65a1a44e5356fb362a857d736280d3a580 Mon Sep 17 00:00:00 2001 From: Sebastian Thiel Date: Fri, 6 Jun 2025 04:53:41 +0200 Subject: [PATCH 110/166] refactor --- gix-actor/src/lib.rs | 12 ++++++++---- gix-actor/src/signature/mod.rs | 3 ++- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/gix-actor/src/lib.rs b/gix-actor/src/lib.rs index ab1361b456e..bc7ccc8a9b7 100644 --- a/gix-actor/src/lib.rs +++ b/gix-actor/src/lib.rs @@ -71,7 +71,8 @@ pub struct Signature { /// An immutable signature that is created by an actor at a certain time. /// -/// Not fully parsed. +/// All of its fields are references to the backing buffer to allow lossless +/// round-tripping, as decoding the `time` field could be a lossy transformation. /// /// Note that this is not a cryptographical signature. #[derive(Default, PartialEq, Eq, Debug, Hash, Ord, PartialOrd, Clone, Copy)] @@ -79,13 +80,16 @@ pub struct Signature { pub struct SignatureRef<'a> { /// The actors name, potentially with whitespace as parsed. /// - /// Use [SignatureRef::trim()] or trim manually to be able to clean it up. + /// Use [SignatureRef::trim()] or trim manually for cleanup. #[cfg_attr(feature = "serde", serde(borrow))] pub name: &'a BStr, /// The actor's email, potentially with whitespace and garbage as parsed. /// - /// Use [SignatureRef::trim()] or trim manually to be able to clean it up. + /// Use [SignatureRef::trim()] or trim manually for cleanup. pub email: &'a BStr, - /// The timestamp at which the signature was performed, potentially malformed. + /// The timestamp at which the signature was performed, + /// potentially malformed due to lenient parsing. + /// + /// Use [`SignatureRef::time()`] to decode. pub time: &'a str, } diff --git a/gix-actor/src/signature/mod.rs b/gix-actor/src/signature/mod.rs index b300ff4baf8..ecb702dbd10 100644 --- a/gix-actor/src/signature/mod.rs +++ b/gix-actor/src/signature/mod.rs @@ -72,7 +72,7 @@ mod convert { impl Signature { /// Borrow this instance as immutable, serializing the `time` field into `buf`. /// - /// Commonly used as `signature.to_ref(&mut TimeBuf::default())`. + /// Commonly used as [`signature.to_ref(&mut TimeBuf::default())`](TimeBuf::default). pub fn to_ref<'a>(&'a self, time_buf: &'a mut TimeBuf) -> SignatureRef<'a> { SignatureRef { name: self.name.as_ref(), @@ -82,6 +82,7 @@ mod convert { } } + /// Note that this conversion is lossy due to the lenient parsing of the [`time`](SignatureRef::time) field. impl From> for Signature { fn from(other: SignatureRef<'_>) -> Signature { Signature { From 8ba513c64d98463e3bf7d01a02c6d882897ebee0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christoph=20R=C3=BC=C3=9Fler?= Date: Sat, 7 Jun 2025 13:16:20 +0200 Subject: [PATCH 111/166] Add test for source file name tracking per hunk This is a test case for the issue fixed in 7435ed5a9a7370a12332e12bd40fdbc757284a85. The issue was related to the fact that, before the fix, `source_file_name` was only tracked globally, as opposed to locally, i. e. on a per-hunk basis. The test case constructs a repository that has the same rename twice, in two different branches. Tracking `source_file_name` globally is insufficient to capture this history which is why this test fails without the fix. --- gix-blame/tests/blame.rs | 42 +++++++++++++++++++ .../make_blame_rename_tracking_repo.sh | 37 ++++++++++++++++ 2 files changed, 79 insertions(+) create mode 100755 gix-blame/tests/fixtures/make_blame_rename_tracking_repo.sh diff --git a/gix-blame/tests/blame.rs b/gix-blame/tests/blame.rs index 7b7d1e39e1d..5791d90a678 100644 --- a/gix-blame/tests/blame.rs +++ b/gix-blame/tests/blame.rs @@ -487,6 +487,48 @@ mod blame_ranges { } } +mod rename_tracking { + use gix_blame::BlameRanges; + + use crate::{Baseline, Fixture}; + + #[test] + fn source_file_name_is_tracked_per_hunk() { + let worktree_path = gix_testtools::scripted_fixture_read_only("make_blame_rename_tracking_repo.sh").unwrap(); + + let Fixture { + odb, + mut resource_cache, + suspect, + } = Fixture::for_worktree_path(worktree_path.to_path_buf()).unwrap(); + + let source_file_name: gix_object::bstr::BString = "after-rename.txt".into(); + + let lines_blamed = gix_blame::file( + &odb, + suspect, + None, + &mut resource_cache, + source_file_name.as_ref(), + gix_blame::Options { + diff_algorithm: gix_diff::blob::Algorithm::Histogram, + range: BlameRanges::default(), + since: None, + rewrites: Some(gix_diff::Rewrites::default()), + }, + ) + .unwrap() + .entries; + + assert_eq!(lines_blamed.len(), 3); + + let git_dir = worktree_path.join(".git"); + let baseline = Baseline::collect(git_dir.join("after-rename.baseline"), source_file_name).unwrap(); + + pretty_assertions::assert_eq!(lines_blamed, baseline); + } +} + fn fixture_path() -> PathBuf { gix_testtools::scripted_fixture_read_only("make_blame_repo.sh").unwrap() } diff --git a/gix-blame/tests/fixtures/make_blame_rename_tracking_repo.sh b/gix-blame/tests/fixtures/make_blame_rename_tracking_repo.sh new file mode 100755 index 00000000000..d34f56a86f8 --- /dev/null +++ b/gix-blame/tests/fixtures/make_blame_rename_tracking_repo.sh @@ -0,0 +1,37 @@ +#!/usr/bin/env bash +set -eu -o pipefail + +git init -q +git config --local diff.algorithm histogram + +git config merge.ff false + +git checkout -q -b main + +echo -e "line 1\nline 2\nline 3\nline 4" > before-rename.txt +git add before-rename.txt +git commit -q -m c1 + +mv before-rename.txt after-rename.txt +git add before-rename.txt after-rename.txt +git commit -q -m c2 + +echo -e "line 1\nline 2\nline 3\nline 4\nline 5" > after-rename.txt +git add after-rename.txt +git commit -q -m c3 + +git checkout -b different-branch +git reset --hard HEAD~2 + +echo -e "line 0\nline 1\nline 2\nline 3\nline 4" > before-rename.txt +git add before-rename.txt +git commit -q -m c10 + +mv before-rename.txt after-rename.txt +git add before-rename.txt after-rename.txt +git commit -q -m c11 + +git checkout main +git merge different-branch || true + +git blame --porcelain after-rename.txt > .git/after-rename.baseline From 25413788e3c5c9059d39b125e3543b9b9301e8fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christoph=20R=C3=BC=C3=9Fler?= Date: Sat, 7 Jun 2025 13:22:44 +0200 Subject: [PATCH 112/166] Remove obsolete comment --- gix-blame/src/file/function.rs | 2 -- 1 file changed, 2 deletions(-) diff --git a/gix-blame/src/file/function.rs b/gix-blame/src/file/function.rs index 298d8e38be2..b69780ae244 100644 --- a/gix-blame/src/file/function.rs +++ b/gix-blame/src/file/function.rs @@ -128,8 +128,6 @@ pub fn file( continue 'outer; }; - // We know `first_hunk_for_suspect` can’t be `None` here because we check `is_some()` - // above. let current_file_path = first_hunk_for_suspect .source_file_name .clone() From 8e2bc0fb3e0d3b3a4ac58af76317e13e11b72117 Mon Sep 17 00:00:00 2001 From: Sebastian Thiel Date: Mon, 9 Jun 2025 11:14:44 +0200 Subject: [PATCH 113/166] refactor - an easier way of generate changing lines. --- gix-blame/tests/blame.rs | 7 +++---- .../make_blame_rename_tracking_repo.tar | Bin 0 -> 85504 bytes .../fixtures/make_blame_rename_tracking_repo.sh | 6 +++--- 3 files changed, 6 insertions(+), 7 deletions(-) create mode 100644 gix-blame/tests/fixtures/generated-archives/make_blame_rename_tracking_repo.tar diff --git a/gix-blame/tests/blame.rs b/gix-blame/tests/blame.rs index 5791d90a678..f0f90dcfaa5 100644 --- a/gix-blame/tests/blame.rs +++ b/gix-blame/tests/blame.rs @@ -502,14 +502,13 @@ mod rename_tracking { suspect, } = Fixture::for_worktree_path(worktree_path.to_path_buf()).unwrap(); - let source_file_name: gix_object::bstr::BString = "after-rename.txt".into(); - + let source_file_name = "after-rename.txt"; let lines_blamed = gix_blame::file( &odb, suspect, None, &mut resource_cache, - source_file_name.as_ref(), + source_file_name.into(), gix_blame::Options { diff_algorithm: gix_diff::blob::Algorithm::Histogram, range: BlameRanges::default(), @@ -523,7 +522,7 @@ mod rename_tracking { assert_eq!(lines_blamed.len(), 3); let git_dir = worktree_path.join(".git"); - let baseline = Baseline::collect(git_dir.join("after-rename.baseline"), source_file_name).unwrap(); + let baseline = Baseline::collect(git_dir.join("after-rename.baseline"), source_file_name.into()).unwrap(); pretty_assertions::assert_eq!(lines_blamed, baseline); } diff --git a/gix-blame/tests/fixtures/generated-archives/make_blame_rename_tracking_repo.tar b/gix-blame/tests/fixtures/generated-archives/make_blame_rename_tracking_repo.tar new file mode 100644 index 0000000000000000000000000000000000000000..fd9ab6b5202064e78ad72888d81ec5d4d4e9dd82 GIT binary patch literal 85504 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 literal 0 HcmV?d00001 diff --git a/gix-blame/tests/fixtures/make_blame_rename_tracking_repo.sh b/gix-blame/tests/fixtures/make_blame_rename_tracking_repo.sh index d34f56a86f8..d37b906a14a 100755 --- a/gix-blame/tests/fixtures/make_blame_rename_tracking_repo.sh +++ b/gix-blame/tests/fixtures/make_blame_rename_tracking_repo.sh @@ -8,7 +8,7 @@ git config merge.ff false git checkout -q -b main -echo -e "line 1\nline 2\nline 3\nline 4" > before-rename.txt +seq 1 4 > before-rename.txt git add before-rename.txt git commit -q -m c1 @@ -16,14 +16,14 @@ mv before-rename.txt after-rename.txt git add before-rename.txt after-rename.txt git commit -q -m c2 -echo -e "line 1\nline 2\nline 3\nline 4\nline 5" > after-rename.txt +seq 1 5 > after-rename.txt git add after-rename.txt git commit -q -m c3 git checkout -b different-branch git reset --hard HEAD~2 -echo -e "line 0\nline 1\nline 2\nline 3\nline 4" > before-rename.txt +seq 0 4 > before-rename.txt git add before-rename.txt git commit -q -m c10 From 4bf61f5671b097b82605009ad0dfc48de428ff18 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christoph=20R=C3=BC=C3=9Fler?= Date: Tue, 10 Jun 2025 18:36:35 +0200 Subject: [PATCH 114/166] Remove most .unwrap()'s in gix-blame tests --- gix-blame/tests/blame.rs | 81 +++++++++++++++++++++------------------- 1 file changed, 42 insertions(+), 39 deletions(-) diff --git a/gix-blame/tests/blame.rs b/gix-blame/tests/blame.rs index f0f90dcfaa5..bec002c6dd7 100644 --- a/gix-blame/tests/blame.rs +++ b/gix-blame/tests/blame.rs @@ -149,7 +149,7 @@ struct Fixture { impl Fixture { fn new() -> gix_testtools::Result { - Self::for_worktree_path(fixture_path()) + Self::for_worktree_path(fixture_path()?) } fn for_worktree_path(worktree_path: PathBuf) -> gix_testtools::Result { @@ -212,7 +212,7 @@ impl Fixture { macro_rules! mktest { ($name:ident, $case:expr, $number_of_lines:literal) => { #[test] - fn $name() -> gix_testtools::Result<()> { + fn $name() -> gix_testtools::Result { let Fixture { odb, mut resource_cache, @@ -238,7 +238,7 @@ macro_rules! mktest { assert_eq!(lines_blamed.len(), $number_of_lines); - let git_dir = fixture_path().join(".git"); + let git_dir = fixture_path()?.join(".git"); let baseline = Baseline::collect(git_dir.join(format!("{}.baseline", $case)), source_file_name)?; assert_eq!(baseline.len(), $number_of_lines); @@ -324,7 +324,7 @@ fn diff_disparity() { assert_eq!(lines_blamed.len(), 5); - let git_dir = fixture_path().join(".git"); + let git_dir = fixture_path().unwrap().join(".git"); let baseline = Baseline::collect(git_dir.join(format!("{case}.baseline")), source_file_name).unwrap(); pretty_assertions::assert_eq!(lines_blamed, baseline, "{case}"); @@ -332,12 +332,12 @@ fn diff_disparity() { } #[test] -fn since() { +fn since() -> gix_testtools::Result { let Fixture { odb, mut resource_cache, suspect, - } = Fixture::new().unwrap(); + } = Fixture::new()?; let source_file_name: gix_object::bstr::BString = "simple.txt".into(); @@ -350,19 +350,20 @@ fn since() { gix_blame::Options { diff_algorithm: gix_diff::blob::Algorithm::Histogram, range: BlameRanges::default(), - since: Some(gix_date::parse("2025-01-31", None).unwrap()), + since: Some(gix_date::parse("2025-01-31", None)?), rewrites: Some(gix_diff::Rewrites::default()), }, - ) - .unwrap() + )? .entries; assert_eq!(lines_blamed.len(), 1); - let git_dir = fixture_path().join(".git"); - let baseline = Baseline::collect(git_dir.join("simple-since.baseline"), source_file_name).unwrap(); + let git_dir = fixture_path()?.join(".git"); + let baseline = Baseline::collect(git_dir.join("simple-since.baseline"), source_file_name)?; pretty_assertions::assert_eq!(lines_blamed, baseline); + + Ok(()) } mod blame_ranges { @@ -370,12 +371,12 @@ mod blame_ranges { use gix_blame::BlameRanges; #[test] - fn line_range() { + fn line_range() -> gix_testtools::Result { let Fixture { odb, mut resource_cache, suspect, - } = Fixture::new().unwrap(); + } = Fixture::new()?; let source_file_name: gix_object::bstr::BString = "simple.txt".into(); @@ -391,25 +392,26 @@ mod blame_ranges { since: None, rewrites: Some(gix_diff::Rewrites::default()), }, - ) - .unwrap() + )? .entries; assert_eq!(lines_blamed.len(), 2); - let git_dir = fixture_path().join(".git"); - let baseline = Baseline::collect(git_dir.join("simple-lines-1-2.baseline"), source_file_name).unwrap(); + let git_dir = fixture_path()?.join(".git"); + let baseline = Baseline::collect(git_dir.join("simple-lines-1-2.baseline"), source_file_name)?; pretty_assertions::assert_eq!(lines_blamed, baseline); + + Ok(()) } #[test] - fn multiple_ranges_using_add_range() { + fn multiple_ranges_using_add_range() -> gix_testtools::Result { let Fixture { odb, mut resource_cache, suspect, - } = Fixture::new().unwrap(); + } = Fixture::new()?; let mut ranges = BlameRanges::new(); ranges.add_range(1..=2); // Lines 1-2 @@ -430,29 +432,29 @@ mod blame_ranges { since: None, rewrites: None, }, - ) - .unwrap() + )? .entries; assert_eq!(lines_blamed.len(), 3); // Should have 3 lines total (2 from first range + 1 from second range) - let git_dir = fixture_path().join(".git"); + let git_dir = fixture_path()?.join(".git"); let baseline = Baseline::collect( git_dir.join("simple-lines-multiple-1-2-and-4.baseline"), source_file_name, - ) - .unwrap(); + )?; pretty_assertions::assert_eq!(lines_blamed, baseline); + + Ok(()) } #[test] - fn multiple_ranges_usingfrom_ranges() { + fn multiple_ranges_using_from_ranges() -> gix_testtools::Result { let Fixture { odb, mut resource_cache, suspect, - } = Fixture::new().unwrap(); + } = Fixture::new()?; let ranges = BlameRanges::from_ranges(vec![1..=2, 1..=1, 4..=4]); @@ -470,20 +472,20 @@ mod blame_ranges { since: None, rewrites: None, }, - ) - .unwrap() + )? .entries; assert_eq!(lines_blamed.len(), 3); // Should have 3 lines total (2 from first range + 1 from second range) - let git_dir = fixture_path().join(".git"); + let git_dir = fixture_path()?.join(".git"); let baseline = Baseline::collect( git_dir.join("simple-lines-multiple-1-2-and-4.baseline"), source_file_name, - ) - .unwrap(); + )?; pretty_assertions::assert_eq!(lines_blamed, baseline); + + Ok(()) } } @@ -493,14 +495,14 @@ mod rename_tracking { use crate::{Baseline, Fixture}; #[test] - fn source_file_name_is_tracked_per_hunk() { - let worktree_path = gix_testtools::scripted_fixture_read_only("make_blame_rename_tracking_repo.sh").unwrap(); + fn source_file_name_is_tracked_per_hunk() -> gix_testtools::Result { + let worktree_path = gix_testtools::scripted_fixture_read_only("make_blame_rename_tracking_repo.sh")?; let Fixture { odb, mut resource_cache, suspect, - } = Fixture::for_worktree_path(worktree_path.to_path_buf()).unwrap(); + } = Fixture::for_worktree_path(worktree_path.to_path_buf())?; let source_file_name = "after-rename.txt"; let lines_blamed = gix_blame::file( @@ -515,19 +517,20 @@ mod rename_tracking { since: None, rewrites: Some(gix_diff::Rewrites::default()), }, - ) - .unwrap() + )? .entries; assert_eq!(lines_blamed.len(), 3); let git_dir = worktree_path.join(".git"); - let baseline = Baseline::collect(git_dir.join("after-rename.baseline"), source_file_name.into()).unwrap(); + let baseline = Baseline::collect(git_dir.join("after-rename.baseline"), source_file_name.into())?; pretty_assertions::assert_eq!(lines_blamed, baseline); + + Ok(()) } } -fn fixture_path() -> PathBuf { - gix_testtools::scripted_fixture_read_only("make_blame_repo.sh").unwrap() +fn fixture_path() -> gix_testtools::Result { + gix_testtools::scripted_fixture_read_only("make_blame_repo.sh") } From 0d102f4bdf1450f9c5f8d4176707c73b499bd665 Mon Sep 17 00:00:00 2001 From: Sebastian Thiel Date: Wed, 11 Jun 2025 05:07:03 +0200 Subject: [PATCH 115/166] fix: `blob::UnifiedDiff` now produces non-overlapping hunks. Previously it was possible to see two hunks with overlapping context lines due to an off-by-one error. --- gix-diff/src/blob/unified_diff.rs | 4 +- gix-diff/tests/diff/blob/unified_diff.rs | 62 ++++++++++++++++++++++++ 2 files changed, 63 insertions(+), 3 deletions(-) diff --git a/gix-diff/src/blob/unified_diff.rs b/gix-diff/src/blob/unified_diff.rs index e0870d2eb0b..de051266152 100644 --- a/gix-diff/src/blob/unified_diff.rs +++ b/gix-diff/src/blob/unified_diff.rs @@ -218,9 +218,7 @@ pub(super) mod _impl { if self.err.is_some() { return; } - if ((self.pos == 0) && (before.start - self.pos > self.ctx_size)) - || (before.start - self.pos > 2 * self.ctx_size) - { + if before.start - self.pos > 2 * self.ctx_size { if let Err(err) = self.flush() { self.err = Some(err); return; diff --git a/gix-diff/tests/diff/blob/unified_diff.rs b/gix-diff/tests/diff/blob/unified_diff.rs index db5cd9106b5..87f060e7df4 100644 --- a/gix-diff/tests/diff/blob/unified_diff.rs +++ b/gix-diff/tests/diff/blob/unified_diff.rs @@ -108,6 +108,68 @@ fn removed_modified_added() -> crate::Result { Ok(()) } +#[test] +fn context_overlap_by_one_line_move_up() -> crate::Result { + let a = "2\n3\n4\n5\n6\n7\n"; + let b = "7\n2\n3\n4\n5\n6\n"; + + let interner = gix_diff::blob::intern::InternedInput::new(a, b); + let actual = gix_diff::blob::diff( + Algorithm::Myers, + &interner, + UnifiedDiff::new( + &interner, + String::new(), + NewlineSeparator::AfterHeaderAndLine("\n"), + ContextSize::symmetrical(3), + ), + )?; + + // merged by context. + insta::assert_snapshot!(actual, @r" + @@ -1,6 +1,6 @@ + +7 + 2 + 3 + 4 + 5 + 6 + -7 + "); + Ok(()) +} + +#[test] +fn context_overlap_by_one_line_move_down() -> crate::Result { + let a = "2\n3\n4\n5\n6\n7\n"; + let b = "7\n2\n3\n4\n5\n6\n"; + + let interner = gix_diff::blob::intern::InternedInput::new(b, a); + let actual = gix_diff::blob::diff( + Algorithm::Myers, + &interner, + UnifiedDiff::new( + &interner, + String::new(), + NewlineSeparator::AfterHeaderAndLine("\n"), + ContextSize::symmetrical(3), + ), + )?; + + // merged by context. + insta::assert_snapshot!(actual, @r" + @@ -1,6 +1,6 @@ + -7 + 2 + 3 + 4 + 5 + 6 + +7 + "); + Ok(()) +} + #[test] fn removed_modified_added_with_newlines_in_tokens() -> crate::Result { let a = "1\n2\n3\n4\n5\n6\n7\n8\n9\n10"; From b7c1f2c25c7485095022fec290492aa4b7c5c5a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20St=C3=B6ger?= Date: Fri, 13 Jun 2025 09:15:00 +0200 Subject: [PATCH 116/166] #2020: Fixed no_locations options for diffing --- gix/src/diff.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gix/src/diff.rs b/gix/src/diff.rs index b6120568559..2d490a22339 100644 --- a/gix/src/diff.rs +++ b/gix/src/diff.rs @@ -67,7 +67,7 @@ impl Options { impl Options { /// Do not keep track of filepaths at all, which will leave all `location` fields empty. pub fn no_locations(&mut self) -> &mut Self { - self.location = Some(Location::FileName); + self.location = None; self } From 81297cf2b85072ad13824f9821a0102dc6497f80 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christoph=20R=C3=BC=C3=9Fler?= Date: Mon, 9 Jun 2025 18:23:33 +0200 Subject: [PATCH 117/166] feat!: add `debug_track_path` and `blame_path` --- gix-blame/src/file/function.rs | 73 +++++++++++++++++++++++++++++++--- gix-blame/src/lib.rs | 2 +- gix-blame/src/types.rs | 26 ++++++++++++ gix-blame/tests/blame.rs | 7 ++++ 4 files changed, 102 insertions(+), 6 deletions(-) diff --git a/gix-blame/src/file/function.rs b/gix-blame/src/file/function.rs index b69780ae244..df52850f35c 100644 --- a/gix-blame/src/file/function.rs +++ b/gix-blame/src/file/function.rs @@ -10,7 +10,7 @@ use gix_traverse::commit::find as find_commit; use smallvec::SmallVec; use super::{process_changes, Change, UnblamedHunk}; -use crate::{BlameEntry, Error, Options, Outcome, Statistics}; +use crate::{types::BlamePathEntry, BlameEntry, Error, Options, Outcome, Statistics}; /// Produce a list of consecutive [`BlameEntry`] instances to indicate in which commits the ranges of the file /// at `suspect:` originated in. @@ -115,6 +115,12 @@ pub fn file( let mut out = Vec::new(); let mut diff_state = gix_diff::tree::State::default(); let mut previous_entry: Option<(ObjectId, ObjectId)> = None; + let mut blame_path = if options.debug_track_path { + Some(Vec::new()) + } else { + None + }; + 'outer: while let Some(suspect) = queue.pop_value() { stats.commits_traversed += 1; if hunks_to_blame.is_empty() { @@ -156,6 +162,22 @@ pub fn file( // true here. We could perhaps use diff-tree-to-tree to compare `suspect` against // an empty tree to validate this assumption. if unblamed_to_out_is_done(&mut hunks_to_blame, &mut out, suspect) { + if let Some(ref mut blame_path) = blame_path { + let entry = previous_entry + .take() + .filter(|(id, _)| *id == suspect) + .map(|(_, entry)| entry); + + let blame_path_entry = BlamePathEntry { + source_file_path: current_file_path.clone(), + previous_source_file_path: None, + commit_id: suspect, + blob_id: entry.unwrap_or(ObjectId::null(gix_hash::Kind::Sha1)), + previous_blob_id: ObjectId::null(gix_hash::Kind::Sha1), + }; + blame_path.push(blame_path_entry); + } + break 'outer; } } @@ -271,12 +293,23 @@ pub fn file( }; match modification { - TreeDiffChange::Addition => { + TreeDiffChange::Addition { id } => { if more_than_one_parent { // Do nothing under the assumption that this always (or almost always) // implies that the file comes from a different parent, compared to which // it was modified, not added. } else if unblamed_to_out_is_done(&mut hunks_to_blame, &mut out, suspect) { + if let Some(ref mut blame_path) = blame_path { + let blame_path_entry = BlamePathEntry { + source_file_path: current_file_path.clone(), + previous_source_file_path: None, + commit_id: suspect, + blob_id: id, + previous_blob_id: ObjectId::null(gix_hash::Kind::Sha1), + }; + blame_path.push(blame_path_entry); + } + break 'outer; } } @@ -295,6 +328,16 @@ pub fn file( &mut stats, )?; hunks_to_blame = process_changes(hunks_to_blame, changes, suspect, parent_id); + if let Some(ref mut blame_path) = blame_path { + let blame_path_entry = BlamePathEntry { + source_file_path: current_file_path.clone(), + previous_source_file_path: Some(current_file_path.clone()), + commit_id: suspect, + blob_id: id, + previous_blob_id: previous_id, + }; + blame_path.push(blame_path_entry); + } } TreeDiffChange::Rewrite { source_location, @@ -313,9 +356,26 @@ pub fn file( )?; hunks_to_blame = process_changes(hunks_to_blame, changes, suspect, parent_id); + let mut has_blame_been_passed = false; + for hunk in hunks_to_blame.iter_mut() { if hunk.has_suspect(&parent_id) { hunk.source_file_name = Some(source_location.clone()); + + has_blame_been_passed = true; + } + } + + if has_blame_been_passed { + if let Some(ref mut blame_path) = blame_path { + let blame_path_entry = BlamePathEntry { + source_file_path: current_file_path.clone(), + previous_source_file_path: Some(source_location.clone()), + commit_id: suspect, + blob_id: id, + previous_blob_id: source_id, + }; + blame_path.push(blame_path_entry); } } } @@ -351,6 +411,7 @@ pub fn file( entries: coalesce_blame_entries(out), blob: blamed_file_blob, statistics: stats, + blame_path, }) } @@ -435,7 +496,9 @@ fn coalesce_blame_entries(lines_blamed: Vec) -> Vec { /// The union of [`gix_diff::tree::recorder::Change`] and [`gix_diff::tree_with_rewrites::Change`], /// keeping only the blame-relevant information. enum TreeDiffChange { - Addition, + Addition { + id: ObjectId, + }, Deletion, Modification { previous_id: ObjectId, @@ -453,7 +516,7 @@ impl From for TreeDiffChange { use gix_diff::tree::recorder::Change; match value { - Change::Addition { .. } => Self::Addition, + Change::Addition { oid, .. } => Self::Addition { id: oid }, Change::Deletion { .. } => Self::Deletion, Change::Modification { previous_oid, oid, .. } => Self::Modification { previous_id: previous_oid, @@ -468,7 +531,7 @@ impl From for TreeDiffChange { use gix_diff::tree_with_rewrites::Change; match value { - Change::Addition { .. } => Self::Addition, + Change::Addition { id, .. } => Self::Addition { id }, Change::Deletion { .. } => Self::Deletion, Change::Modification { previous_id, id, .. } => Self::Modification { previous_id, id }, Change::Rewrite { diff --git a/gix-blame/src/lib.rs b/gix-blame/src/lib.rs index e811ab88ddb..2a31c874f8f 100644 --- a/gix-blame/src/lib.rs +++ b/gix-blame/src/lib.rs @@ -17,7 +17,7 @@ mod error; pub use error::Error; mod types; -pub use types::{BlameEntry, BlameRanges, Options, Outcome, Statistics}; +pub use types::{BlameEntry, BlamePathEntry, BlameRanges, Options, Outcome, Statistics}; mod file; pub use file::function::file; diff --git a/gix-blame/src/types.rs b/gix-blame/src/types.rs index 5672eaf679d..8cf94a23d33 100644 --- a/gix-blame/src/types.rs +++ b/gix-blame/src/types.rs @@ -149,6 +149,30 @@ pub struct Options { pub since: Option, /// Determine if rename tracking should be performed, and how. pub rewrites: Option, + /// Collect debug information whenever there's a diff or rename that affects the outcome of a + /// blame. + pub debug_track_path: bool, +} + +/// Represents a change during history traversal for blame. It is supposed to capture enough +/// information to allow reconstruction of the way a blame was performed, i. e. the path the +/// history traversal, combined with repeated diffing of two subsequent states in this history, has +/// taken. +/// +/// This is intended for debugging purposes. +#[derive(Clone, Debug)] +pub struct BlamePathEntry { + /// The path to the *Source File* in the blob after the change. + pub source_file_path: BString, + /// The path to the *Source File* in the blob before the change. Allows + /// detection of renames. `None` for root commits. + pub previous_source_file_path: Option, + /// The commit id associated with the state after the change. + pub commit_id: ObjectId, + /// The blob id associated with the state after the change. + pub blob_id: ObjectId, + /// The blob id associated with the state before the change. + pub previous_blob_id: ObjectId, } /// The outcome of [`file()`](crate::file()). @@ -161,6 +185,8 @@ pub struct Outcome { pub blob: Vec, /// Additional information about the amount of work performed to produce the blame. pub statistics: Statistics, + /// Contains a log of all changes that affected the outcome of this blame. + pub blame_path: Option>, } /// Additional information about the performed operations. diff --git a/gix-blame/tests/blame.rs b/gix-blame/tests/blame.rs index bec002c6dd7..cdd91f852a9 100644 --- a/gix-blame/tests/blame.rs +++ b/gix-blame/tests/blame.rs @@ -232,6 +232,7 @@ macro_rules! mktest { range: BlameRanges::default(), since: None, rewrites: Some(gix_diff::Rewrites::default()), + debug_track_path: false, }, )? .entries; @@ -317,6 +318,7 @@ fn diff_disparity() { range: BlameRanges::default(), since: None, rewrites: Some(gix_diff::Rewrites::default()), + debug_track_path: false, }, ) .unwrap() @@ -352,6 +354,7 @@ fn since() -> gix_testtools::Result { range: BlameRanges::default(), since: Some(gix_date::parse("2025-01-31", None)?), rewrites: Some(gix_diff::Rewrites::default()), + debug_track_path: false, }, )? .entries; @@ -391,6 +394,7 @@ mod blame_ranges { range: BlameRanges::from_range(1..=2), since: None, rewrites: Some(gix_diff::Rewrites::default()), + debug_track_path: false, }, )? .entries; @@ -431,6 +435,7 @@ mod blame_ranges { range: ranges, since: None, rewrites: None, + debug_track_path: false, }, )? .entries; @@ -471,6 +476,7 @@ mod blame_ranges { range: ranges, since: None, rewrites: None, + debug_track_path: false, }, )? .entries; @@ -516,6 +522,7 @@ mod rename_tracking { range: BlameRanges::default(), since: None, rewrites: Some(gix_diff::Rewrites::default()), + debug_track_path: false, }, )? .entries; From 4afc51d4ba669ad3c4b26f1c4222442d1dab1695 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christoph=20R=C3=BC=C3=9Fler?= Date: Mon, 9 Jun 2025 18:42:10 +0200 Subject: [PATCH 118/166] Adapt to changes in `gix-blame` --- src/plumbing/main.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/plumbing/main.rs b/src/plumbing/main.rs index aedee5cc052..8db7d3603be 100644 --- a/src/plumbing/main.rs +++ b/src/plumbing/main.rs @@ -1591,6 +1591,7 @@ pub fn main() -> Result<()> { range: gix::blame::BlameRanges::from_ranges(ranges), since, rewrites: Some(gix::diff::Rewrites::default()), + debug_track_path: false, }, out, statistics.then_some(err), From b01d624ee48f9131ac622173ba18bb07326b2ef5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christoph=20R=C3=BC=C3=9Fler?= Date: Mon, 9 Jun 2025 18:24:36 +0200 Subject: [PATCH 119/166] Add `it blame-copy-royal` --- tests/it/Cargo.toml | 2 +- tests/it/src/args.rs | 24 ++ tests/it/src/commands/blame_copy_royal.rs | 302 ++++++++++++++++++++++ tests/it/src/commands/mod.rs | 3 + tests/it/src/main.rs | 13 + 5 files changed, 343 insertions(+), 1 deletion(-) create mode 100644 tests/it/src/commands/blame_copy_royal.rs diff --git a/tests/it/Cargo.toml b/tests/it/Cargo.toml index 5895ee5dab8..197d37a2179 100644 --- a/tests/it/Cargo.toml +++ b/tests/it/Cargo.toml @@ -17,6 +17,6 @@ path = "src/main.rs" [dependencies] anyhow = "1.0.98" clap = { version = "4.5.39", features = ["derive"] } -gix = { version = "^0.72.1", path = "../../gix", default-features = false, features = ["attributes", "revision"] } +gix = { version = "^0.72.1", path = "../../gix", default-features = false, features = ["attributes", "blame", "blob-diff", "revision"] } once_cell = "1.21.3" regex = { version = "1.11.1", default-features = false, features = ["std"] } diff --git a/tests/it/src/args.rs b/tests/it/src/args.rs index 85c95d92648..28f023bb480 100644 --- a/tests/it/src/args.rs +++ b/tests/it/src/args.rs @@ -14,6 +14,30 @@ pub struct Args { #[derive(Debug, clap::Subcommand)] pub enum Subcommands { + /// Extract a file’s history so that its blame shows the same characteristics, in particular + /// bugs, as the original, but in a way that can't be traced back uniquely to its source. + /// + /// The idea is that we don't want to deal with licensing, it's more about patterns in order to + /// reproduce cases for tests. + #[clap(visible_alias = "bcr")] + BlameCopyRoyal { + /// Don't really copy anything. + #[clap(long, short = 'n')] + dry_run: bool, + /// The git root whose history to extract the blame-relevant parts from. + worktree_dir: PathBuf, + /// The directory into which to copy the files. + destination_dir: PathBuf, + /// The file to extract the history for. + file: std::ffi::OsString, + /// Do not use `copy-royal` to obfuscate the content of blobs, but copy it verbatim. + /// + /// Note that this should only be done if the source repository only contains information + /// you’re willing to share. Also note that the obfuscation leaves the structure of the + /// source intact, so a few of its properties can still be inferred. + #[clap(long)] + verbatim: bool, + }, /// Copy a tree so that it diffs the same but can't be traced back uniquely to its source. /// /// The idea is that we don't want to deal with licensing, it's more about patterns in order to diff --git a/tests/it/src/commands/blame_copy_royal.rs b/tests/it/src/commands/blame_copy_royal.rs new file mode 100644 index 00000000000..72b4204b1bb --- /dev/null +++ b/tests/it/src/commands/blame_copy_royal.rs @@ -0,0 +1,302 @@ +pub struct Options { + pub verbatim: bool, +} + +pub(super) mod function { + use anyhow::Context; + use gix::{ + blame::BlamePathEntry, + bstr::{BStr, ByteSlice}, + objs::FindExt, + ObjectId, + }; + use std::{ + collections::BTreeSet, + ffi::OsStr, + path::{Path, PathBuf}, + }; + + use super::Options; + + pub fn blame_copy_royal( + dry_run: bool, + worktree_dir: &Path, + destination_dir: PathBuf, + file: &OsStr, + Options { verbatim }: Options, + ) -> anyhow::Result<()> { + let prefix = if dry_run { "WOULD" } else { "Will" }; + let repo = gix::open(worktree_dir)?; + + let suspect: gix::ObjectId = repo.head()?.into_peeled_id()?.into(); + let cache: Option = repo.commit_graph_if_enabled()?; + let mut resource_cache = repo.diff_resource_cache_for_tree_diff()?; + let diff_algorithm = repo.diff_algorithm()?; + + let options = gix::blame::Options { + diff_algorithm, + range: gix::blame::BlameRanges::default(), + since: None, + rewrites: Some(gix::diff::Rewrites::default()), + debug_track_path: true, + }; + + let index = repo.index_or_empty()?; + + // The following block, including the `TODO` comment, comes from + // `gitoxide_core::repository::blame`. + let file = gix::path::os_str_into_bstr(file)?; + let specs = repo.pathspec( + false, + [file], + true, + &index, + gix::worktree::stack::state::attributes::Source::WorktreeThenIdMapping.adjust_for_bare(repo.is_bare()), + )?; + // TODO: there should be a way to normalize paths without going through patterns, at least in this case maybe? + // `Search` actually sorts patterns by excluding or not, all that can lead to strange results. + let file = specs + .search() + .patterns() + .map(|p| p.path().to_owned()) + .next() + .expect("exactly one pattern"); + + let outcome = gix::blame::file( + &repo.objects, + suspect, + cache, + &mut resource_cache, + file.as_bstr(), + options, + )?; + + let blame_path = outcome + .blame_path + .expect("blame path to be present as `debug_track_path == true`"); + + // TODO + // Potentially make `"assets"` configurable (it is in `git_to_sh`). + let assets = destination_dir.join("assets"); + + eprintln!("{prefix} create directory '{assets}'", assets = assets.display()); + + if !dry_run { + std::fs::create_dir_all(&assets)?; + } + + let mut buf = Vec::new(); + + for blame_path_entry in &blame_path { + let src: &BStr = blame_path_entry.source_file_path.as_bstr(); + let dst = assets.join(format!("{}.commit", blame_path_entry.commit_id)); + + eprintln!( + "{prefix} copy file '{}' at commit {} to '{dst}'", + src, + blame_path_entry.commit_id, + dst = dst.display() + ); + + if !dry_run { + let blob = repo.objects.find_blob(&blame_path_entry.blob_id, &mut buf)?.data; + + if verbatim { + std::fs::write(dst, blob)?; + } else { + let blob = std::str::from_utf8(blob).with_context(|| { + format!( + "Entry in blob '{blob_id}' was not valid UTF8 and can't be remapped", + blob_id = blame_path_entry.blob_id + ) + })?; + + let blob = crate::commands::copy_royal::remapped(blob); + + std::fs::write(dst, blob)?; + } + } + } + + let mut blame_script = BlameScript::new(blame_path, Options { verbatim }); + + blame_script.generate()?; + + let script_file = destination_dir.join("create-history.sh"); + + eprintln!( + "{prefix} write script file at '{script_file}'", + script_file = script_file.display() + ); + + if !dry_run { + std::fs::write(script_file, blame_script.script)?; + } + + Ok(()) + } + + struct BlameScript { + blame_path: Vec, + seen: BTreeSet, + script: String, + options: Options, + } + + impl BlameScript { + fn new(blame_path: Vec, options: Options) -> Self { + let mut script = String::new(); + + script.push_str( + r"#!/bin/sh + +set -e + +git init +echo .gitignore >> .gitignore +echo assets/ >> .gitignore +echo create-history.sh >> .gitignore + +", + ); + + Self { + blame_path, + seen: BTreeSet::default(), + script, + options, + } + } + + fn generate(&mut self) -> anyhow::Result<()> { + // `self.blame_path`, before calling `reverse`, has parents before children, with the + // history’s root being the last element. We reverse the order in place so that all + // methods can rely on the assumption that the root comes first, followed by its + // descendants. That way, we can use a simple `for` loop to iterate through + // `self.blame_path` below. + self.blame_path.reverse(); + + for blame_path_entry in self.blame_path.clone() { + if !self.seen.contains(&blame_path_entry.commit_id) { + self.process_entry(&blame_path_entry)?; + } + + self.seen.insert(blame_path_entry.commit_id); + } + + Ok(()) + } + + fn process_entry(&mut self, blame_path_entry: &BlamePathEntry) -> anyhow::Result<()> { + let source_file_path = blame_path_entry.source_file_path.clone(); + let parents = self.parents_of(blame_path_entry); + + let src = if self.options.verbatim { + source_file_path.clone() + } else { + let source_file_path = std::str::from_utf8(source_file_path.as_slice()).with_context(|| { + format!("Source file path '{source_file_path}' was not valid UTF8 and can't be remapped",) + })?; + + crate::commands::copy_royal::remapped(source_file_path).into() + }; + let commit_id = blame_path_entry.commit_id; + + let delete_previous_file_script = match &blame_path_entry.previous_source_file_path { + Some(previous_source_file_path) if source_file_path != *previous_source_file_path => { + let src = if self.options.verbatim { + previous_source_file_path.to_string() + } else { + let source_file_path = + std::str::from_utf8(previous_source_file_path.as_slice()).with_context(|| { + format!("Source file path '{previous_source_file_path}' was not valid UTF8 and can't be remapped",) + })?; + + crate::commands::copy_royal::remapped(source_file_path) + }; + + format!( + r"# delete previous version of file +git rm {src} +" + ) + } + _ => String::new(), + }; + + let script = format!( + r"# make file {src} contain content at commit {commit_id} +mkdir -p $(dirname {src}) +cp ./assets/{commit_id}.commit ./{src} +# create commit +git add {src} +git commit -m {commit_id} +" + ); + + if parents.is_empty() { + self.script.push_str(delete_previous_file_script.as_str()); + self.script.push_str(script.as_str()); + } else { + let ([first], rest) = parents.split_at(1) else { + unreachable!(); + }; + + self.script + .push_str(format!("git checkout tag-{}\n", first.commit_id).as_str()); + + if rest.is_empty() { + self.script.push_str(delete_previous_file_script.as_str()); + self.script.push_str(script.as_str()); + } else { + self.script.push_str( + format!( + "git merge --no-commit {} || true\n", + rest.iter() + .map(|blame_path_entry| format!("tag-{}", blame_path_entry.commit_id)) + .collect::>() + .join(" ") + ) + .as_str(), + ); + + self.script.push_str(delete_previous_file_script.as_str()); + self.script.push_str(script.as_str()); + } + } + + self.script.push_str(format!("git tag tag-{commit_id}\n\n").as_str()); + + Ok(()) + } + + fn parents_of(&self, child: &BlamePathEntry) -> Vec { + // In almost all cases, `children` will only have one element. The exception are merge + // commits where there’s changes against each parent. Each of these changes would + // produce a diff that’s represented in `self.blame_path`. + let children = self + .blame_path + .iter() + .enumerate() + .filter(|(_, x)| x.commit_id == child.commit_id); + + let parents = children + .filter_map(|(index, child)| { + let parent_blob_id = child.previous_blob_id; + let parent_source_file_path = &child.previous_source_file_path; + + // When we search for a parent we only have to consider entries up to and + // excluding `index` as anything after `index` can only be a child. + self.blame_path[..index] + .iter() + .rfind(|&x| { + x.blob_id == parent_blob_id && Some(&x.source_file_path) == parent_source_file_path.as_ref() + }) + .cloned() + }) + .collect(); + + parents + } + } +} diff --git a/tests/it/src/commands/mod.rs b/tests/it/src/commands/mod.rs index ae00a26a8d7..6bec01671df 100644 --- a/tests/it/src/commands/mod.rs +++ b/tests/it/src/commands/mod.rs @@ -1,3 +1,6 @@ +pub mod blame_copy_royal; +pub use blame_copy_royal::function::blame_copy_royal; + pub mod copy_royal; pub use copy_royal::function::copy_royal; diff --git a/tests/it/src/main.rs b/tests/it/src/main.rs index f18dd3450be..d2799b99cb4 100644 --- a/tests/it/src/main.rs +++ b/tests/it/src/main.rs @@ -25,6 +25,19 @@ fn main() -> anyhow::Result<()> { max_count: count, }, ), + Subcommands::BlameCopyRoyal { + dry_run, + worktree_dir: worktree_root, + destination_dir, + file, + verbatim, + } => commands::blame_copy_royal( + dry_run, + &worktree_root, + destination_dir, + &file, + commands::blame_copy_royal::Options { verbatim }, + ), Subcommands::CopyRoyal { dry_run, worktree_dir: worktree_root, From 6f569cea08297501f332f4d7114065df38fa98f7 Mon Sep 17 00:00:00 2001 From: Sebastian Thiel Date: Sun, 15 Jun 2025 20:51:52 +0200 Subject: [PATCH 120/166] update `hashbrown` to 0.15. --- gix-index/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gix-index/Cargo.toml b/gix-index/Cargo.toml index cf34775d764..6c443032833 100644 --- a/gix-index/Cargo.toml +++ b/gix-index/Cargo.toml @@ -34,7 +34,7 @@ gix-lock = { version = "^17.1.0", path = "../gix-lock" } gix-fs = { version = "^0.15.0", path = "../gix-fs" } gix-utils = { version = "^0.3.0", path = "../gix-utils" } -hashbrown = "0.14.3" +hashbrown = "0.15.4" fnv = "1.0.7" thiserror = "2.0.0" memmap2 = "0.9.0" From c1d0868c331c2f8ca8b22d22ff68744926a907b3 Mon Sep 17 00:00:00 2001 From: blinxen Date: Sun, 15 Jun 2025 20:23:09 +0200 Subject: [PATCH 121/166] chore!: Update hashbrown to the latest version This updates re-exports, removing `raw` and adding `hash_table`. --- Cargo.lock | 60 ++++++++-------------------------------- gix-hashtable/Cargo.toml | 5 +--- gix-hashtable/src/lib.rs | 2 +- 3 files changed, 14 insertions(+), 53 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 0b04d4447a1..2cc5787b025 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -17,18 +17,6 @@ version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" -[[package]] -name = "ahash" -version = "0.8.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" -dependencies = [ - "cfg-if", - "once_cell", - "version_check", - "zerocopy 0.7.35", -] - [[package]] name = "aho-corasick" version = "1.1.3" @@ -1841,7 +1829,7 @@ name = "gix-hashtable" version = "0.8.1" dependencies = [ "gix-hash", - "hashbrown 0.14.5", + "hashbrown 0.15.4", "parking_lot", ] @@ -1879,7 +1867,7 @@ dependencies = [ "gix-traverse", "gix-utils", "gix-validate", - "hashbrown 0.14.5", + "hashbrown 0.15.4", "itoa", "libc", "memmap2", @@ -2702,16 +2690,12 @@ name = "hashbrown" version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" -dependencies = [ - "ahash", - "allocator-api2", -] [[package]] name = "hashbrown" -version = "0.15.2" +version = "0.15.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" +checksum = "5971ac85611da7067dbfcabef3c70ebb5606018acd9e2a3903a0da507521e0d5" dependencies = [ "allocator-api2", "equivalent", @@ -2724,7 +2708,7 @@ version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7382cf6263419f2d8df38c55d7da83da5c18aef87fc7a7fc1fb1e344edfe14c1" dependencies = [ - "hashbrown 0.15.2", + "hashbrown 0.15.4", ] [[package]] @@ -2996,7 +2980,7 @@ version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "17d34b7d42178945f775e84bc4c36dde7c1c6cdfea656d3354d009056f2bb3d2" dependencies = [ - "hashbrown 0.15.2", + "hashbrown 0.15.4", ] [[package]] @@ -3006,7 +2990,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e" dependencies = [ "equivalent", - "hashbrown 0.15.2", + "hashbrown 0.15.4", ] [[package]] @@ -3282,7 +3266,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "07033963ba89ebaf1584d767badaa2e8fcec21aedea6b8c0346d487d49c28667" dependencies = [ "cfg-if", - "windows-targets 0.48.5", + "windows-targets 0.53.0", ] [[package]] @@ -3377,7 +3361,7 @@ version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38" dependencies = [ - "hashbrown 0.15.2", + "hashbrown 0.15.4", ] [[package]] @@ -3831,7 +3815,7 @@ version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" dependencies = [ - "zerocopy 0.8.23", + "zerocopy", ] [[package]] @@ -5375,7 +5359,7 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" dependencies = [ - "windows-sys 0.48.0", + "windows-sys 0.59.0", ] [[package]] @@ -5866,33 +5850,13 @@ dependencies = [ "synstructure", ] -[[package]] -name = "zerocopy" -version = "0.7.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" -dependencies = [ - "zerocopy-derive 0.7.35", -] - [[package]] name = "zerocopy" version = "0.8.23" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fd97444d05a4328b90e75e503a34bad781f14e28a823ad3557f0750df1ebcbc6" dependencies = [ - "zerocopy-derive 0.8.23", -] - -[[package]] -name = "zerocopy-derive" -version = "0.7.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", + "zerocopy-derive", ] [[package]] diff --git a/gix-hashtable/Cargo.toml b/gix-hashtable/Cargo.toml index 31fadc49451..3b84f51cac2 100644 --- a/gix-hashtable/Cargo.toml +++ b/gix-hashtable/Cargo.toml @@ -16,8 +16,5 @@ doctest = false [dependencies] parking_lot = "0.12.4" -hashbrown = { version = "0.14.0", default-features = false, features = [ - "inline-more", - "raw" -] } +hashbrown = { version = "0.15.4", default-features = false, features = ["inline-more"] } gix-hash = { version = "^0.18.0", path = "../gix-hash" } diff --git a/gix-hashtable/src/lib.rs b/gix-hashtable/src/lib.rs index 54935bcbca7..dab18be0f06 100644 --- a/gix-hashtable/src/lib.rs +++ b/gix-hashtable/src/lib.rs @@ -5,7 +5,7 @@ #![forbid(unsafe_code)] use gix_hash::ObjectId; -pub use hashbrown::{hash_map, hash_set, raw, Equivalent}; +pub use hashbrown::{hash_map, hash_set, hash_table, Equivalent}; /// thread-safe types pub mod sync { From 62e4bab024ee1cdefe4026e35098da8fff18fb0d Mon Sep 17 00:00:00 2001 From: ralphmodales Date: Mon, 16 Jun 2025 14:11:54 +0800 Subject: [PATCH 122/166] add committer fallback for fetch --- gix/src/clone/fetch/mod.rs | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/gix/src/clone/fetch/mod.rs b/gix/src/clone/fetch/mod.rs index 65210022c2e..86a07b8523d 100644 --- a/gix/src/clone/fetch/mod.rs +++ b/gix/src/clone/fetch/mod.rs @@ -1,6 +1,7 @@ use crate::{ bstr::{BString, ByteSlice}, clone::PrepareFetch, + config::tree::gitoxide, }; /// The error returned by [`PrepareFetch::fetch_only()`]. @@ -80,6 +81,19 @@ impl PrepareFetch { .as_mut() .expect("user error: multiple calls are allowed only until it succeeds"); + if repo.committer().is_none() { + let mut config = gix_config::File::new(gix_config::file::Metadata::api()); + config + .set_raw_value(&gitoxide::Committer::NAME_FALLBACK, "no name configured during fetch") + .expect("works - statically known"); + config + .set_raw_value(&gitoxide::Committer::EMAIL_FALLBACK, "noEmailAvailable@example.com") + .expect("works - statically known"); + let mut repo_config = repo.config_snapshot_mut(); + repo_config.append(config); + repo_config.commit().expect("configuration is still valid"); + } + if !self.config_overrides.is_empty() { let mut snapshot = repo.config_snapshot_mut(); snapshot.append_config(&self.config_overrides, gix_config::Source::Api)?; From 90c2bb8701beb21a07f7dcf41401b863c638824a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christoph=20R=C3=BC=C3=9Fler?= Date: Tue, 17 Jun 2025 18:11:45 +0200 Subject: [PATCH 123/166] Add `index` to `BlamePathEntry` --- gix-blame/src/file/function.rs | 18 +++++++++++------- gix-blame/src/types.rs | 3 +++ 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/gix-blame/src/file/function.rs b/gix-blame/src/file/function.rs index df52850f35c..d78777ac984 100644 --- a/gix-blame/src/file/function.rs +++ b/gix-blame/src/file/function.rs @@ -174,6 +174,7 @@ pub fn file( commit_id: suspect, blob_id: entry.unwrap_or(ObjectId::null(gix_hash::Kind::Sha1)), previous_blob_id: ObjectId::null(gix_hash::Kind::Sha1), + index: 0, }; blame_path.push(blame_path_entry); } @@ -263,13 +264,13 @@ pub fn file( } let more_than_one_parent = parent_ids.len() > 1; - for (parent_id, parent_commit_time) in parent_ids { - queue.insert(parent_commit_time, parent_id); + for (index, (parent_id, parent_commit_time)) in parent_ids.iter().enumerate() { + queue.insert(*parent_commit_time, *parent_id); let changes_for_file_path = tree_diff_at_file_path( &odb, current_file_path.as_ref(), suspect, - parent_id, + *parent_id, cache.as_ref(), &mut stats, &mut diff_state, @@ -284,10 +285,10 @@ pub fn file( // None of the changes affected the file we’re currently blaming. // Copy blame to parent. for unblamed_hunk in &mut hunks_to_blame { - unblamed_hunk.clone_blame(suspect, parent_id); + unblamed_hunk.clone_blame(suspect, *parent_id); } } else { - pass_blame_from_to(suspect, parent_id, &mut hunks_to_blame); + pass_blame_from_to(suspect, *parent_id, &mut hunks_to_blame); } continue; }; @@ -306,6 +307,7 @@ pub fn file( commit_id: suspect, blob_id: id, previous_blob_id: ObjectId::null(gix_hash::Kind::Sha1), + index, }; blame_path.push(blame_path_entry); } @@ -327,7 +329,7 @@ pub fn file( options.diff_algorithm, &mut stats, )?; - hunks_to_blame = process_changes(hunks_to_blame, changes, suspect, parent_id); + hunks_to_blame = process_changes(hunks_to_blame, changes, suspect, *parent_id); if let Some(ref mut blame_path) = blame_path { let blame_path_entry = BlamePathEntry { source_file_path: current_file_path.clone(), @@ -335,6 +337,7 @@ pub fn file( commit_id: suspect, blob_id: id, previous_blob_id: previous_id, + index, }; blame_path.push(blame_path_entry); } @@ -354,7 +357,7 @@ pub fn file( options.diff_algorithm, &mut stats, )?; - hunks_to_blame = process_changes(hunks_to_blame, changes, suspect, parent_id); + hunks_to_blame = process_changes(hunks_to_blame, changes, suspect, *parent_id); let mut has_blame_been_passed = false; @@ -374,6 +377,7 @@ pub fn file( commit_id: suspect, blob_id: id, previous_blob_id: source_id, + index, }; blame_path.push(blame_path_entry); } diff --git a/gix-blame/src/types.rs b/gix-blame/src/types.rs index 8cf94a23d33..bd3502ef993 100644 --- a/gix-blame/src/types.rs +++ b/gix-blame/src/types.rs @@ -173,6 +173,9 @@ pub struct BlamePathEntry { pub blob_id: ObjectId, /// The blob id associated with the state before the change. pub previous_blob_id: ObjectId, + /// When there is more than one `BlamePathEntry` for a commit, this indicates to which parent + /// commit the change is related. + pub index: usize, } /// The outcome of [`file()`](crate::file()). From 952c577b7b84725c49e3273eb10f235d1dd9e2ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christoph=20R=C3=BC=C3=9Fler?= Date: Tue, 17 Jun 2025 18:12:11 +0200 Subject: [PATCH 124/166] Sort parents by `index` --- tests/it/src/commands/blame_copy_royal.rs | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/tests/it/src/commands/blame_copy_royal.rs b/tests/it/src/commands/blame_copy_royal.rs index 72b4204b1bb..1f9188288e5 100644 --- a/tests/it/src/commands/blame_copy_royal.rs +++ b/tests/it/src/commands/blame_copy_royal.rs @@ -274,20 +274,24 @@ git commit -m {commit_id} // In almost all cases, `children` will only have one element. The exception are merge // commits where there’s changes against each parent. Each of these changes would // produce a diff that’s represented in `self.blame_path`. - let children = self + let mut children: Vec<_> = self .blame_path .iter() .enumerate() - .filter(|(_, x)| x.commit_id == child.commit_id); + .filter(|(_, x)| x.commit_id == child.commit_id) + .collect(); + + children.sort_by_key(|(_, x)| x.index); let parents = children + .iter() .filter_map(|(index, child)| { let parent_blob_id = child.previous_blob_id; let parent_source_file_path = &child.previous_source_file_path; // When we search for a parent we only have to consider entries up to and // excluding `index` as anything after `index` can only be a child. - self.blame_path[..index] + self.blame_path[..(*index)] .iter() .rfind(|&x| { x.blob_id == parent_blob_id && Some(&x.source_file_path) == parent_source_file_path.as_ref() From e768c94b9035fc7a026efcafee8023faa0886d4e Mon Sep 17 00:00:00 2001 From: Josh Triplett Date: Tue, 17 Jun 2025 20:47:57 -0700 Subject: [PATCH 125/166] Upgrade to zip 4, which uses zlib-rs by default --- Cargo.lock | 111 ++++++++++++++++----------------------- gix-archive/Cargo.toml | 5 +- gix-archive/src/write.rs | 2 +- 3 files changed, 49 insertions(+), 69 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 2cc5787b025..c4b6e45c433 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -13,9 +13,9 @@ dependencies = [ [[package]] name = "adler2" -version = "2.0.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" [[package]] name = "aho-corasick" @@ -274,7 +274,7 @@ checksum = "e539d3fca749fcee5236ab05e93a52867dd549cc157c8cb7f99595f3cedffdb5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.103", ] [[package]] @@ -352,7 +352,7 @@ dependencies = [ "regex", "rustc-hash 1.1.0", "shlex", - "syn 2.0.101", + "syn 2.0.103", "which", ] @@ -486,9 +486,9 @@ dependencies = [ [[package]] name = "cfg-if" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +checksum = "9555578bc9e57714c812a1f84e4fc5b4d21fcb063490c624de019f7464c91268" [[package]] name = "cfg_aliases" @@ -574,7 +574,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.103", ] [[package]] @@ -912,7 +912,7 @@ checksum = "30542c1ad912e0e3d22a1935c290e12e8a29d704a420177a31faad4a601a0800" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.103", ] [[package]] @@ -939,7 +939,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.103", ] [[package]] @@ -1097,9 +1097,9 @@ dependencies = [ [[package]] name = "flate2" -version = "1.1.1" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ced92e76e966ca2fd84c8f7aa01a4aea65b0eb6648d72f7c8f3e2764a67fece" +checksum = "4a3d7db9596fecd151c5f638c0ee5d5bd487b6e0ea232e5dc96d5250f6f94b1d" dependencies = [ "crc32fast", "libz-rs-sys", @@ -1911,7 +1911,7 @@ version = "0.1.5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.103", "trybuild", ] @@ -3139,7 +3139,7 @@ checksum = "6c6e1db7ed32c6c71b759497fae34bf7933636f75a251b9e736555da426f6442" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.103", ] [[package]] @@ -3293,9 +3293,9 @@ dependencies = [ [[package]] name = "libz-rs-sys" -version = "0.5.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6489ca9bd760fe9642d7644e827b0c9add07df89857b0416ee15c1cc1a3b8c5a" +checksum = "172a788537a2221661b480fee8dc5f96c580eb34fa88764d3205dc356c7e4221" dependencies = [ "zlib-rs", ] @@ -3395,14 +3395,14 @@ checksum = "5cf92c10c7e361d6b99666ec1c6f9805b0bea2c3bd8c78dc6fe98ac5bd78db11" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.103", ] [[package]] name = "memchr" -version = "2.7.4" +version = "2.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" +checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" [[package]] name = "memmap2" @@ -3436,9 +3436,9 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "miniz_oxide" -version = "0.8.8" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3be647b768db090acb35d5ec5db2b0e1f1de11133ca123b9eacf5137868f892a" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" dependencies = [ "adler2", ] @@ -3633,7 +3633,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.103", ] [[package]] @@ -3835,7 +3835,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9dee91521343f4c5c6a63edd65e54f31f5c92fe8978c40a4282f8372194c6a7d" dependencies = [ "proc-macro2", - "syn 2.0.101", + "syn 2.0.103", ] [[package]] @@ -4381,7 +4381,7 @@ checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.103", ] [[package]] @@ -4439,7 +4439,7 @@ checksum = "5d69265a08751de7844521fd15003ae0a888e035773ba05695c5c759a6f89eef" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.103", ] [[package]] @@ -4514,12 +4514,6 @@ dependencies = [ "libc", ] -[[package]] -name = "simd-adler32" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" - [[package]] name = "similar" version = "2.7.0" @@ -4561,7 +4555,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d904e7009df136af5297832a3ace3370cd14ff1546a232f4f185036c2736fcac" dependencies = [ "quote", - "syn 2.0.101", + "syn 2.0.103", ] [[package]] @@ -4601,7 +4595,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.101", + "syn 2.0.103", ] [[package]] @@ -4629,9 +4623,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.101" +version = "2.0.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ce2b7fc941b3a24138a0a7cf8e858bfc6a992e7978a068a5c760deb0ed43caf" +checksum = "e4307e30089d6fd6aff212f2da3a1f9e32f3223b1f010fb09b7c95f90f3ca1e8" dependencies = [ "proc-macro2", "quote", @@ -4655,7 +4649,7 @@ checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.103", ] [[package]] @@ -4774,7 +4768,7 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.103", ] [[package]] @@ -4785,7 +4779,7 @@ checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.103", ] [[package]] @@ -4986,7 +4980,7 @@ checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.103", ] [[package]] @@ -5238,7 +5232,7 @@ dependencies = [ "log", "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.103", "wasm-bindgen-shared", ] @@ -5273,7 +5267,7 @@ checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.103", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -5430,7 +5424,7 @@ checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.103", ] [[package]] @@ -5441,7 +5435,7 @@ checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.103", ] [[package]] @@ -5769,9 +5763,9 @@ checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" [[package]] name = "winnow" -version = "0.7.10" +version = "0.7.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c06928c8748d81b05c9be96aad92e1b6ff01833332f281e8cfca3be4b35fc9ec" +checksum = "74c7b26e3480b707944fc872477815d29a8e429d2f93a1ce000f5fa84a15cbcd" dependencies = [ "memchr", ] @@ -5846,7 +5840,7 @@ checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.103", "synstructure", ] @@ -5867,7 +5861,7 @@ checksum = "6352c01d0edd5db859a63e2605f4ea3183ddbd15e2c4a9e7d32184df75e4f154" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.103", ] [[package]] @@ -5887,7 +5881,7 @@ checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.103", "synstructure", ] @@ -5927,37 +5921,24 @@ checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.103", ] [[package]] name = "zip" -version = "4.0.0" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "153a6fff49d264c4babdcfa6b4d534747f520e56e8f0f384f3b808c4b64cc1fd" +checksum = "af7dcdb4229c0e79c2531a24de7726a0e980417a74fb4d030a35f535665439a0" dependencies = [ "arbitrary", "crc32fast", "flate2", "indexmap", "memchr", - "zopfli", ] [[package]] name = "zlib-rs" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "868b928d7949e09af2f6086dfc1e01936064cc7a819253bce650d4e2a2d63ba8" - -[[package]] -name = "zopfli" -version = "0.8.2" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edfc5ee405f504cd4984ecc6f14d02d55cfda60fa4b689434ef4102aae150cd7" -dependencies = [ - "bumpalo", - "crc32fast", - "log", - "simd-adler32", -] +checksum = "626bd9fa9734751fc50d6060752170984d7053f5a39061f524cda68023d4db8a" diff --git a/gix-archive/Cargo.toml b/gix-archive/Cargo.toml index d45d86888b2..945bdf5cae1 100644 --- a/gix-archive/Cargo.toml +++ b/gix-archive/Cargo.toml @@ -23,8 +23,7 @@ tar = ["dep:tar", "dep:gix-path"] tar_gz = ["tar", "dep:flate2"] ## Enable the `zip` archive format. -## This also enables the `flate2` dependency in order to enable `zlib-rs` on it. -zip = ["dep:flate2", "dep:zip"] +zip = ["dep:zip"] [dependencies] @@ -34,7 +33,7 @@ gix-path = { version = "^0.10.18", path = "../gix-path", optional = true } gix-date = { version = "^0.10.2", path = "../gix-date" } flate2 = { version = "1.1.1", optional = true, default-features = false, features = ["zlib-rs"] } -zip = { version = "4.0.0", optional = true, default-features = false, features = ["deflate"] } +zip = { version = "4.0.0", optional = true, default-features = false, features = ["deflate-flate2"] } jiff = { version = "0.2.14", default-features = false, features = ["std"] } thiserror = "2.0.0" diff --git a/gix-archive/src/write.rs b/gix-archive/src/write.rs index a801cc2d2d2..bd5d4decaff 100644 --- a/gix-archive/src/write.rs +++ b/gix-archive/src/write.rs @@ -176,7 +176,7 @@ fn append_zip_entry( compression_level: Option, tree_prefix: Option<&bstr::BString>, ) -> Result<(), Error> { - let file_opts = zip::write::FileOptions::<'_, ()>::default() + let file_opts = zip::write::SimpleFileOptions::default() .compression_method(zip::CompressionMethod::Deflated) .compression_level(compression_level) .large_file(entry.bytes_remaining().map_or(true, |len| len > u32::MAX as usize)) From 5d748af0f956ee62c7327c4bf6361c6817d04fbd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christoph=20R=C3=BC=C3=9Fler?= Date: Thu, 19 Jun 2025 09:01:12 +0200 Subject: [PATCH 126/166] Only add entry when blame was passed --- gix-blame/src/file/function.rs | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/gix-blame/src/file/function.rs b/gix-blame/src/file/function.rs index d78777ac984..fdbeb7c996f 100644 --- a/gix-blame/src/file/function.rs +++ b/gix-blame/src/file/function.rs @@ -329,17 +329,21 @@ pub fn file( options.diff_algorithm, &mut stats, )?; - hunks_to_blame = process_changes(hunks_to_blame, changes, suspect, *parent_id); + hunks_to_blame = process_changes(hunks_to_blame, changes.clone(), suspect, *parent_id); if let Some(ref mut blame_path) = blame_path { - let blame_path_entry = BlamePathEntry { - source_file_path: current_file_path.clone(), - previous_source_file_path: Some(current_file_path.clone()), - commit_id: suspect, - blob_id: id, - previous_blob_id: previous_id, - index, - }; - blame_path.push(blame_path_entry); + let has_blame_been_passed = hunks_to_blame.iter().any(|hunk| hunk.has_suspect(parent_id)); + + if has_blame_been_passed { + let blame_path_entry = BlamePathEntry { + source_file_path: current_file_path.clone(), + previous_source_file_path: Some(current_file_path.clone()), + commit_id: suspect, + blob_id: id, + previous_blob_id: previous_id, + index, + }; + blame_path.push(blame_path_entry); + } } } TreeDiffChange::Rewrite { From ab52a49a555ab25e6cf632cb0b080eab72958a7d Mon Sep 17 00:00:00 2001 From: Sebastian Thiel Date: Thu, 19 Jun 2025 09:31:10 +0200 Subject: [PATCH 127/166] feat: `gix revision list --long-hashes` for faster iteration. The performance of the short-hash generation was improved as well. --- .../src/repository/commitgraph/list.rs | 21 +------- gitoxide-core/src/repository/mod.rs | 48 +++++++++++++------ gitoxide-core/src/repository/revision/list.rs | 10 ++-- src/plumbing/main.rs | 8 +++- src/plumbing/options/mod.rs | 5 +- 5 files changed, 53 insertions(+), 39 deletions(-) diff --git a/gitoxide-core/src/repository/commitgraph/list.rs b/gitoxide-core/src/repository/commitgraph/list.rs index c0d1182b819..aa203388cee 100644 --- a/gitoxide-core/src/repository/commitgraph/list.rs +++ b/gitoxide-core/src/repository/commitgraph/list.rs @@ -1,10 +1,10 @@ pub(crate) mod function { + use crate::repository::HexId; use crate::OutputFormat; use anyhow::{bail, Context}; use gix::odb::store::RefreshMode; use gix::revision::plumbing::Spec; use gix::{prelude::ObjectIdExt, revision::walk::Sorting}; - use std::fmt::Formatter; use std::{borrow::Cow, ffi::OsString}; pub fn list( @@ -70,23 +70,4 @@ pub(crate) mod function { .context("Need committish as starting point")? .id()) } - - struct HexId<'a>(gix::Id<'a>, bool); - - impl<'a> HexId<'a> { - pub fn new(id: gix::Id<'a>, long_hex: bool) -> Self { - HexId(id, long_hex) - } - } - - impl std::fmt::Display for HexId<'_> { - fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { - let HexId(id, long_hex) = self; - if *long_hex { - id.fmt(f) - } else { - id.shorten_or_id().fmt(f) - } - } - } } diff --git a/gitoxide-core/src/repository/mod.rs b/gitoxide-core/src/repository/mod.rs index 5b51e5c1ac3..8158f7cf0b6 100644 --- a/gitoxide-core/src/repository/mod.rs +++ b/gitoxide-core/src/repository/mod.rs @@ -1,22 +1,9 @@ +use std::fmt::Formatter; use std::path::PathBuf; use anyhow::{Context as AnyhowContext, Result}; use gix::bstr::BString; -pub fn init(directory: Option) -> Result { - gix::create::into( - directory.unwrap_or_default(), - gix::create::Kind::WithWorktree, - gix::create::Options::default(), - ) - .with_context(|| "Repository initialization failed") -} - -pub enum PathsOrPatterns { - Paths(Box>), - Patterns(Vec), -} - #[cfg(feature = "archive")] pub mod archive; pub mod cat; @@ -60,3 +47,36 @@ pub mod submodule; pub mod tree; pub mod verify; pub mod worktree; + +pub fn init(directory: Option) -> Result { + gix::create::into( + directory.unwrap_or_default(), + gix::create::Kind::WithWorktree, + gix::create::Options::default(), + ) + .with_context(|| "Repository initialization failed") +} + +pub enum PathsOrPatterns { + Paths(Box>), + Patterns(Vec), +} + +struct HexId<'a>(gix::Id<'a>, bool); + +impl<'a> HexId<'a> { + pub fn new(id: gix::Id<'a>, long_hex: bool) -> Self { + HexId(id, long_hex) + } +} + +impl std::fmt::Display for HexId<'_> { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + let HexId(id, long_hex) = self; + if *long_hex { + id.fmt(f) + } else { + id.shorten_or_id().fmt(f) + } + } +} diff --git a/gitoxide-core/src/repository/revision/list.rs b/gitoxide-core/src/repository/revision/list.rs index c47f1bc3b27..87997f41f27 100644 --- a/gitoxide-core/src/repository/revision/list.rs +++ b/gitoxide-core/src/repository/revision/list.rs @@ -7,6 +7,7 @@ pub struct Context { pub spec: OsString, pub format: OutputFormat, pub text: Format, + pub long_hashes: bool, } pub enum Format { @@ -16,7 +17,10 @@ pub enum Format { pub const PROGRESS_RANGE: std::ops::RangeInclusive = 0..=2; pub(crate) mod function { + use crate::repository::HexId; + use crate::{repository::revision::list::Format, OutputFormat}; use anyhow::{bail, Context}; + use gix::odb::store::RefreshMode; use gix::{hashtable::HashMap, revision::walk::Sorting, Progress}; use layout::{ backends::svg::SVGWriter, @@ -24,8 +28,6 @@ pub(crate) mod function { std_shapes::shapes::{Arrow, Element, ShapeKind}, }; - use crate::{repository::revision::list::Format, OutputFormat}; - pub fn list( mut repo: gix::Repository, mut progress: impl Progress, @@ -35,12 +37,14 @@ pub(crate) mod function { format, text, limit, + long_hashes, }: super::Context, ) -> anyhow::Result<()> { if format != OutputFormat::Human { bail!("Only human output is currently supported"); } repo.object_cache_size_if_unset(4 * 1024 * 1024); + repo.objects.refresh = RefreshMode::Never; let spec = gix::path::os_str_into_bstr(&spec)?; let id = repo @@ -101,7 +105,7 @@ pub(crate) mod function { writeln!( out, "{} {} {}", - commit.id().shorten_or_id(), + HexId::new(commit.id(), long_hashes), commit.commit_time.expect("traversal with date"), commit.parent_ids.len() )?; diff --git a/src/plumbing/main.rs b/src/plumbing/main.rs index aedee5cc052..fd88efa87a5 100644 --- a/src/plumbing/main.rs +++ b/src/plumbing/main.rs @@ -1148,7 +1148,12 @@ pub fn main() -> Result<()> { }, ), Subcommands::Revision(cmd) => match cmd { - revision::Subcommands::List { spec, svg, limit } => prepare_and_run( + revision::Subcommands::List { + spec, + svg, + limit, + long_hashes, + } => prepare_and_run( "revision-list", trace, auto_verbose, @@ -1164,6 +1169,7 @@ pub fn main() -> Result<()> { limit, spec, format, + long_hashes, text: svg.map_or(core::repository::revision::list::Format::Text, |path| { core::repository::revision::list::Format::Svg { path } }), diff --git a/src/plumbing/options/mod.rs b/src/plumbing/options/mod.rs index f0d02c2c6bc..fcefffba26a 100644 --- a/src/plumbing/options/mod.rs +++ b/src/plumbing/options/mod.rs @@ -996,8 +996,11 @@ pub mod revision { /// List all commits reachable from the given rev-spec. #[clap(visible_alias = "l")] List { - /// How many commits to list at most. + /// Display long hashes, instead of expensively shortened versions for best performance. #[clap(long, short = 'l')] + long_hashes: bool, + /// How many commits to list at most. + #[clap(long)] limit: Option, /// Write the graph as SVG file to the given path. #[clap(long, short = 's')] From 54af5abe9c38976b56c6b8d75198e2c206aff925 Mon Sep 17 00:00:00 2001 From: Sebastian Thiel Date: Sun, 22 Jun 2025 08:39:35 +0200 Subject: [PATCH 128/166] Report for June 2025 --- etc/reports/25-06.md | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 etc/reports/25-06.md diff --git a/etc/reports/25-06.md b/etc/reports/25-06.md new file mode 100644 index 00000000000..8f43a800b2d --- /dev/null +++ b/etc/reports/25-06.md @@ -0,0 +1,37 @@ +I have been busy, just not in `gitoxide` directly. Yet, there is one related topic I am very excited to share! + +### Hide… + +Ominous, isn't it? What the title is referring to is a long-absent feature which is absolutely critical for commit-graph traversals of the sort +`this..that`, including all of `that` without any of `this`. +Previously, we would only support traversals with a `boundary()` condition, which just says that if you run over `that`, do not continue in that direction. However, this would also mean that one could easily get past the boundary by finding other paths to the history of `that`, leading to longer-than-wanted traversals. This made `boundary()` quite useless outside of traversals on well-known graphs. + +Now with `hide()`, we can finally assure that we see none of the commits reachable by hidden tips in the traversal. Of course, this means that the traversal is a little more costly when hidden tips are involved, but it's the price to pay for this extremely relevant feature. + +You can try it yourself with the likes of `gix commit-graph list main~10..origin/main`. + +### GitButler - The Graph + +Most of my time went into working on the foundations of the new GitButler, a Butler which is able to act more like a normal Git client without forcing the user into the `gitbutler/workspace` branch. + +For this to work, one will need to be able to express any starting point in terms of stacks with segments. +My initial attempt to do that failed as I started out with the 'quick' version that is just a more flexible variant of the code that existed before, i.e. code that fiddles with merge-bases and linear single-parent traversals to synthesize stacks from a graph. It just wouldn't work right and admittedly, I stopped being able to understand it well enough to get it right, discarding it as impossible. After all, stacks with segments are an oversimplification which cannot represent the underlying commit-graph, how is one supposed to be able to have algorithms making reliable decisions on top of that? + +Thus, "The Graph" was born, as a simplified, but not over-simplified, representation of the underlying commit-graph which can tell GitButler all it needs to know, concisely, and in a data structure that is easy to traverse both backwards and forwards. From there, stacks and branches are merely a mapping for the sole purpose of being viewed by the user. + +Now the traversal of the graph is completed, and it seems to work well *and* fast even in the toughest repositories I could find. + +Next up is to generate the mapping of the graph to stacks, which will enable GitButler to see the world from any starting point, making it a 'normal' Git client that can show whatever you throw at it. + +## Community + +### Gix in Cargo + +Now it has already been more than 4 weeks since [the PR](https://github.com/rust-lang/cargo/pull/15534) to use `gitoxide` for `cargo package` was opened. Since then, it was decided that the `git2` version of it can be removed entirely, bringing the benefits of the new implementation to everyone soon. + +However, I didn't get to work on it since (despite wanting to today) but plan to do it in one of the coming weekends. + +Cheers +Sebastian + +PS: The latest timesheets can be found [here (2025)](https://github.com/Byron/byron/blob/main/timesheets/2025.csv). \ No newline at end of file From d7db360d5b42ec9d2b4d9977f7b7bee0f6cc4d58 Mon Sep 17 00:00:00 2001 From: Sebastian Thiel Date: Mon, 23 Jun 2025 09:01:35 +0200 Subject: [PATCH 129/166] feat: add `Repository::committer_or_set_generic_fallback()`. That way one can always obtain a committer, even though it might not represent the entity actually committing. --- gix/src/clone/fetch/mod.rs | 17 +++-------------- gix/src/clone/mod.rs | 17 ++++------------- gix/src/repository/identity.rs | 18 ++++++++++++++++++ gix/tests/gix-init.rs | 2 +- gix/tests/gix/clone.rs | 2 +- gix/tests/gix/object/tree/diff.rs | 2 +- 6 files changed, 28 insertions(+), 30 deletions(-) diff --git a/gix/src/clone/fetch/mod.rs b/gix/src/clone/fetch/mod.rs index 86a07b8523d..34641a89fb1 100644 --- a/gix/src/clone/fetch/mod.rs +++ b/gix/src/clone/fetch/mod.rs @@ -1,7 +1,6 @@ use crate::{ bstr::{BString, ByteSlice}, clone::PrepareFetch, - config::tree::gitoxide, }; /// The error returned by [`PrepareFetch::fetch_only()`]. @@ -46,6 +45,8 @@ pub enum Error { wanted: gix_ref::PartialName, candidates: Vec, }, + #[error(transparent)] + CommitterOrFallback(#[from] crate::config::time::Error), } /// Modification @@ -81,23 +82,11 @@ impl PrepareFetch { .as_mut() .expect("user error: multiple calls are allowed only until it succeeds"); - if repo.committer().is_none() { - let mut config = gix_config::File::new(gix_config::file::Metadata::api()); - config - .set_raw_value(&gitoxide::Committer::NAME_FALLBACK, "no name configured during fetch") - .expect("works - statically known"); - config - .set_raw_value(&gitoxide::Committer::EMAIL_FALLBACK, "noEmailAvailable@example.com") - .expect("works - statically known"); - let mut repo_config = repo.config_snapshot_mut(); - repo_config.append(config); - repo_config.commit().expect("configuration is still valid"); - } + repo.committer_or_set_generic_fallback()?; if !self.config_overrides.is_empty() { let mut snapshot = repo.config_snapshot_mut(); snapshot.append_config(&self.config_overrides, gix_config::Source::Api)?; - snapshot.commit()?; } let remote_name = match self.remote_name.as_ref() { diff --git a/gix/src/clone/mod.rs b/gix/src/clone/mod.rs index 920214d3f20..23903943724 100644 --- a/gix/src/clone/mod.rs +++ b/gix/src/clone/mod.rs @@ -1,5 +1,5 @@ #![allow(clippy::result_large_err)] -use crate::{bstr::BString, config::tree::gitoxide, remote}; +use crate::{bstr::BString, remote}; type ConfigureRemoteFn = Box) -> Result, Box>>; @@ -46,6 +46,8 @@ pub enum Error { #[error(transparent)] Init(#[from] crate::init::Error), #[error(transparent)] + CommitterOrFallback(#[from] crate::config::time::Error), + #[error(transparent)] UrlParse(#[from] gix_url::parse::Error), #[error("Failed to turn a the relative file url \"{}\" into an absolute one", url.to_bstring())] CanonicalizeUrl { @@ -102,18 +104,7 @@ impl PrepareFetch { url: url.clone(), source: err, })?; - if repo.committer().is_none() { - let mut config = gix_config::File::new(gix_config::file::Metadata::api()); - config - .set_raw_value(&gitoxide::Committer::NAME_FALLBACK, "no name configured during clone") - .expect("works - statically known"); - config - .set_raw_value(&gitoxide::Committer::EMAIL_FALLBACK, "noEmailAvailable@example.com") - .expect("works - statically known"); - let mut repo_config = repo.config_snapshot_mut(); - repo_config.append(config); - repo_config.commit().expect("configuration is still valid"); - } + repo.committer_or_set_generic_fallback()?; Ok(PrepareFetch { url, #[cfg(any(feature = "async-network-client", feature = "blocking-network-client"))] diff --git a/gix/src/repository/identity.rs b/gix/src/repository/identity.rs index c3385746753..7837e9f2d65 100644 --- a/gix/src/repository/identity.rs +++ b/gix/src/repository/identity.rs @@ -43,6 +43,24 @@ impl crate::Repository { .into() } + /// Return the committer or its fallback just like [`committer()`](Self::committer()), but if *not* set generate a + /// possibly arbitrary fallback and configure it in memory on this instance. That fallback is then returned and future + /// calls to [`committer()`](Self::committer()) will return it as well. + pub fn committer_or_set_generic_fallback(&mut self) -> Result, config::time::Error> { + if self.committer().is_none() { + let mut config = gix_config::File::new(gix_config::file::Metadata::api()); + config + .set_raw_value(&gitoxide::Committer::NAME_FALLBACK, "no name configured") + .expect("works - statically known"); + config + .set_raw_value(&gitoxide::Committer::EMAIL_FALLBACK, "noEmailAvailable@example.com") + .expect("works - statically known"); + let mut repo_config = self.config_snapshot_mut(); + repo_config.append(config); + } + self.committer().expect("committer was just set") + } + /// Return the author as configured by this repository, which is determined by… /// /// * …the git configuration `author.name|email`… diff --git a/gix/tests/gix-init.rs b/gix/tests/gix-init.rs index 6a63c719c55..6a116b6d293 100644 --- a/gix/tests/gix-init.rs +++ b/gix/tests/gix-init.rs @@ -268,7 +268,7 @@ mod with_overrides { Ok(()) } - fn cow_bstr(s: &str) -> Cow { + fn cow_bstr(s: &str) -> Cow<'_, BStr> { Cow::Borrowed(s.into()) } } diff --git a/gix/tests/gix/clone.rs b/gix/tests/gix/clone.rs index ce9d47de3a5..573a8e3ddfe 100644 --- a/gix/tests/gix/clone.rs +++ b/gix/tests/gix/clone.rs @@ -334,7 +334,7 @@ mod blocking_io { .expect("one line")? .signature .to_owned()?; - assert_eq!(sig.name, "no name configured during clone"); + assert_eq!(sig.name, "no name configured"); assert_eq!(sig.email, "noEmailAvailable@example.com"); match out.status { diff --git a/gix/tests/gix/object/tree/diff.rs b/gix/tests/gix/object/tree/diff.rs index 6a260ce403a..225dc3148db 100644 --- a/gix/tests/gix/object/tree/diff.rs +++ b/gix/tests/gix/object/tree/diff.rs @@ -879,7 +879,7 @@ mod track_rewrites { } } -fn tree_named(repo: &gix::Repository, rev_spec: impl AsRef) -> gix::Tree { +fn tree_named(repo: &gix::Repository, rev_spec: impl AsRef) -> gix::Tree<'_> { repo.rev_parse_single(rev_spec.as_ref()) .unwrap() .object() From a75b4a2bc0cc602da336421ebcfda11dd36545b7 Mon Sep 17 00:00:00 2001 From: Sebastian Thiel Date: Mon, 23 Jun 2025 17:31:08 +0200 Subject: [PATCH 130/166] fix: `Repository::branch_remote_ref_name()` won't fail on short names anymore. Instead, these partial names are turned into branch names, which seems more in line with what Git can do. --- gix/src/repository/config/branch.rs | 11 +++++++- gix/tests/gix/repository/config/remote.rs | 31 +++++++++++++---------- 2 files changed, 28 insertions(+), 14 deletions(-) diff --git a/gix/src/repository/config/branch.rs b/gix/src/repository/config/branch.rs index eadc480861d..1d8a6d3af57 100644 --- a/gix/src/repository/config/branch.rs +++ b/gix/src/repository/config/branch.rs @@ -52,7 +52,16 @@ impl crate::Repository { self.config .resolved .string_by("branch", Some(short_name), Branch::MERGE.name) - .map(|name| crate::config::tree::branch::Merge::try_into_fullrefname(name).map_err(Into::into)) + .map(|name| { + if name.starts_with(b"refs/") { + crate::config::tree::branch::Merge::try_into_fullrefname(name) + } else { + gix_ref::Category::LocalBranch + .to_full_name(name.as_ref()) + .map(Cow::Owned) + } + .map_err(Into::into) + }) } remote::Direction::Push => { let remote = match self.branch_remote(name.shorten(), direction)? { diff --git a/gix/tests/gix/repository/config/remote.rs b/gix/tests/gix/repository/config/remote.rs index fd09592f289..14f586bb8b2 100644 --- a/gix/tests/gix/repository/config/remote.rs +++ b/gix/tests/gix/repository/config/remote.rs @@ -131,15 +131,21 @@ mod branch_remote { .as_ref(), "remote_repo" ); + assert_eq!( + repo.branch_remote_name("broken", direction) + .expect("Remote name exists") + .as_ref(), + "remote_repo" + ); } - let merge_branch_invalid_msg = "The configured name of the remote ref to merge wasn't valid"; assert_eq!( repo.branch_remote_ref_name("refs/heads/broken".try_into()?, remote::Direction::Fetch) .expect("Remote Merge ref exists") - .unwrap_err() - .to_string(), - merge_branch_invalid_msg + .expect("merge ref is turned into a full-name") + .as_bstr(), + "refs/heads/not_a_valid_merge_ref", + "short names are simply turned into branch names - this doesn't always work, but sometimes." ); assert!(repo .branch_remote_ref_name("refs/heads/missing".try_into()?, remote::Direction::Fetch) @@ -152,11 +158,11 @@ mod branch_remote { } assert_eq!( repo.branch_remote_tracking_ref_name("refs/heads/broken".try_into()?, remote::Direction::Fetch) - .expect("err") - .unwrap_err() - .to_string(), - "Could not get the remote reference to translate into the local tracking branch", - "the merge ref is broken, hence there can't be a tracking ref", + .expect("no error") + .expect("valid result") + .as_bstr(), + "refs/remotes/remote_repo/not_a_valid_merge_ref", + "the merge ref is broken, but we turned it into a full ref name from which everything else was derived", ); Ok(()) @@ -219,10 +225,9 @@ mod branch_remote { ); } - assert_eq!( - repo.branch_remote_tracking_ref_name("refs/heads/broken".try_into()?, remote::Direction::Push).expect("has err").unwrap_err().to_string(), - "Could not get the remote reference to translate into the local tracking branch", - "push.default = simple, hence we need to verify the merge-branch is the same as us, but retrieving it fails", + assert!( + repo.branch_remote_tracking_ref_name("refs/heads/broken".try_into()?, remote::Direction::Push).is_none(), + "push.default = simple, hence we need to verify the merge-branch is the same as us, and retrieving it succeeds due to auto-fullnamification but then it doesn't match", ); Ok(()) From 427274bdf64d30e3bcd330e849ea067e359588fe Mon Sep 17 00:00:00 2001 From: Sebastian Thiel Date: Tue, 24 Jun 2025 08:25:00 +0200 Subject: [PATCH 131/166] fix: don't panic if `remote::Connection::ref_map()` doesn't finish the handshake (#2055) --- gix/src/remote/connection/ref_map.rs | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/gix/src/remote/connection/ref_map.rs b/gix/src/remote/connection/ref_map.rs index 95d92a40ad5..47b46b6cbdf 100644 --- a/gix/src/remote/connection/ref_map.rs +++ b/gix/src/remote/connection/ref_map.rs @@ -90,9 +90,11 @@ where progress: impl Progress, options: Options, ) -> Result<(fetch::RefMap, gix_protocol::handshake::Outcome), Error> { - let refmap = self.ref_map_by_ref(progress, options).await; - let handshake = self.handshake.expect("refmap always performs handshake"); - refmap.map(|map| (map, handshake)) + let refmap = self.ref_map_by_ref(progress, options).await?; + let handshake = self + .handshake + .expect("refmap always performs handshake and stores it if it succeeds"); + Ok((refmap, handshake)) } #[allow(clippy::result_large_err)] From c614970bd47ca27ec7ba890b463ea7eba3ea46ac Mon Sep 17 00:00:00 2001 From: Sebastian Thiel Date: Tue, 24 Jun 2025 08:37:51 +0200 Subject: [PATCH 132/166] Use structured format for blame script Also provide more context in comment --- tests/it/src/args.rs | 36 ++++-- tests/it/src/commands/blame_copy_royal.rs | 132 +++++++++++++--------- 2 files changed, 109 insertions(+), 59 deletions(-) diff --git a/tests/it/src/args.rs b/tests/it/src/args.rs index 28f023bb480..d3b1bf75131 100644 --- a/tests/it/src/args.rs +++ b/tests/it/src/args.rs @@ -14,11 +14,34 @@ pub struct Args { #[derive(Debug, clap::Subcommand)] pub enum Subcommands { - /// Extract a file’s history so that its blame shows the same characteristics, in particular - /// bugs, as the original, but in a way that can't be traced back uniquely to its source. + /// Generate a shell script that creates a git repository containing all commits that are + /// traversed when a blame is generated. /// - /// The idea is that we don't want to deal with licensing, it's more about patterns in order to - /// reproduce cases for tests. + /// This command extracts the file’s history so that blame, when run on the repository created + /// by the script, shows the same characteristics, in particular bugs, as the original, but in + /// a way that the original source file's content cannot be reconstructed. + /// + /// The idea is that by obfuscating the file's content we make it easier for people to share + /// the subset of data that's required for debugging purposes from repositories that are not + /// public. + /// + /// Note that the obfuscation leaves certain properties of the source intact, so they can still + /// be inferred from the extracted history. Among these properties are directory structure + /// (though not the directories' names), renames, number of lines, and whitespace. + /// + /// This command can also be helpful in debugging the blame algorithm itself. + /// + /// ### Terminology + /// + /// A **blame history** is the set of commits that the blame algorithm, at some point, treated + /// as potential suspects for any line in a file. It is a subset of all commits that ever + /// changed a file in its history. + /// + /// With respect to branches and merge commits, the **blame history** will not necessarily be + /// identical to the file's history in the source repository. This is because the blame + /// algorithm will stop following a file's history for branches that only touch lines for which + /// the source has already been found. The **blame history**, thus, looks likely "cleaner" and + /// "simpler" than the source history. #[clap(visible_alias = "bcr")] BlameCopyRoyal { /// Don't really copy anything. @@ -32,9 +55,8 @@ pub enum Subcommands { file: std::ffi::OsString, /// Do not use `copy-royal` to obfuscate the content of blobs, but copy it verbatim. /// - /// Note that this should only be done if the source repository only contains information - /// you’re willing to share. Also note that the obfuscation leaves the structure of the - /// source intact, so a few of its properties can still be inferred. + /// Note that this should only be done if the source history does not contain information + /// you're not willing to share. #[clap(long)] verbatim: bool, }, diff --git a/tests/it/src/commands/blame_copy_royal.rs b/tests/it/src/commands/blame_copy_royal.rs index 1f9188288e5..2f1f0c6e44d 100644 --- a/tests/it/src/commands/blame_copy_royal.rs +++ b/tests/it/src/commands/blame_copy_royal.rs @@ -6,7 +6,7 @@ pub(super) mod function { use anyhow::Context; use gix::{ blame::BlamePathEntry, - bstr::{BStr, ByteSlice}, + bstr::{BStr, BString, ByteSlice}, objs::FindExt, ObjectId, }; @@ -130,25 +130,31 @@ pub(super) mod function { ); if !dry_run { - std::fs::write(script_file, blame_script.script)?; + let blocks: Vec<_> = blame_script + .script + .iter() + .map(|operation| operation.to_string()) + .collect(); + + std::fs::write(script_file, blocks.join(""))?; } Ok(()) } - struct BlameScript { - blame_path: Vec, - seen: BTreeSet, - script: String, - options: Options, + enum BlameScriptOperation { + InitRepository, + RemoveFile(String), + CommitFile(BString, ObjectId), + CheckoutTag(ObjectId), + PrepareMerge(Vec), + CreateTag(ObjectId), } - impl BlameScript { - fn new(blame_path: Vec, options: Options) -> Self { - let mut script = String::new(); - - script.push_str( - r"#!/bin/sh + impl BlameScriptOperation { + fn to_string(&self) -> String { + match self { + BlameScriptOperation::InitRepository => r"#!/bin/sh set -e @@ -157,8 +163,46 @@ echo .gitignore >> .gitignore echo assets/ >> .gitignore echo create-history.sh >> .gitignore -", - ); +" + .into(), + BlameScriptOperation::RemoveFile(src) => format!( + r"# delete previous version of file +git rm {src} +" + ), + BlameScriptOperation::CommitFile(src, commit_id) => format!( + r"# make file {src} contain content at commit {commit_id} +mkdir -p $(dirname {src}) +cp ./assets/{commit_id}.commit ./{src} +# create commit +git add {src} +git commit -m {commit_id} +" + ), + BlameScriptOperation::CheckoutTag(commit_id) => format!("git checkout tag-{}\n", commit_id), + BlameScriptOperation::PrepareMerge(commit_ids) => format!( + "git merge --no-commit {} || true\n", + commit_ids + .iter() + .map(|commit_id| format!("tag-{commit_id}")) + .collect::>() + .join(" ") + ), + BlameScriptOperation::CreateTag(commit_id) => format!("git tag tag-{commit_id}\n\n"), + } + } + } + + struct BlameScript { + blame_path: Vec, + seen: BTreeSet, + script: Vec, + options: Options, + } + + impl BlameScript { + fn new(blame_path: Vec, options: Options) -> Self { + let script = vec![BlameScriptOperation::InitRepository]; Self { blame_path, @@ -202,7 +246,7 @@ echo create-history.sh >> .gitignore }; let commit_id = blame_path_entry.commit_id; - let delete_previous_file_script = match &blame_path_entry.previous_source_file_path { + let delete_previous_file_operation = match &blame_path_entry.previous_source_file_path { Some(previous_source_file_path) if source_file_path != *previous_source_file_path => { let src = if self.options.verbatim { previous_source_file_path.to_string() @@ -215,57 +259,41 @@ echo create-history.sh >> .gitignore crate::commands::copy_royal::remapped(source_file_path) }; - format!( - r"# delete previous version of file -git rm {src} -" - ) + Some(BlameScriptOperation::RemoveFile(src)) } - _ => String::new(), + _ => None, }; - let script = format!( - r"# make file {src} contain content at commit {commit_id} -mkdir -p $(dirname {src}) -cp ./assets/{commit_id}.commit ./{src} -# create commit -git add {src} -git commit -m {commit_id} -" - ); - if parents.is_empty() { - self.script.push_str(delete_previous_file_script.as_str()); - self.script.push_str(script.as_str()); + if let Some(delete_previous_file_operation) = delete_previous_file_operation { + self.script.push(delete_previous_file_operation); + } + self.script.push(BlameScriptOperation::CommitFile(src, commit_id)); } else { let ([first], rest) = parents.split_at(1) else { unreachable!(); }; - self.script - .push_str(format!("git checkout tag-{}\n", first.commit_id).as_str()); + self.script.push(BlameScriptOperation::CheckoutTag(first.commit_id)); if rest.is_empty() { - self.script.push_str(delete_previous_file_script.as_str()); - self.script.push_str(script.as_str()); + if let Some(delete_previous_file_operation) = delete_previous_file_operation { + self.script.push(delete_previous_file_operation); + } + self.script.push(BlameScriptOperation::CommitFile(src, commit_id)); } else { - self.script.push_str( - format!( - "git merge --no-commit {} || true\n", - rest.iter() - .map(|blame_path_entry| format!("tag-{}", blame_path_entry.commit_id)) - .collect::>() - .join(" ") - ) - .as_str(), - ); - - self.script.push_str(delete_previous_file_script.as_str()); - self.script.push_str(script.as_str()); + self.script.push(BlameScriptOperation::PrepareMerge( + rest.iter().map(|blame_path_entry| blame_path_entry.commit_id).collect(), + )); + + if let Some(delete_previous_file_operation) = delete_previous_file_operation { + self.script.push(delete_previous_file_operation); + } + self.script.push(BlameScriptOperation::CommitFile(src, commit_id)); } } - self.script.push_str(format!("git tag tag-{commit_id}\n\n").as_str()); + self.script.push(BlameScriptOperation::CreateTag(commit_id)); Ok(()) } From c7a2e802215ec2c2512262b9d54e580297964e8c Mon Sep 17 00:00:00 2001 From: Sebastian Thiel Date: Tue, 24 Jun 2025 08:36:37 +0200 Subject: [PATCH 133/166] Thanks clippy --- gix-blame/src/file/function.rs | 2 +- tests/it/src/commands/blame_copy_royal.rs | 28 ++++++++++++++--------- 2 files changed, 18 insertions(+), 12 deletions(-) diff --git a/gix-blame/src/file/function.rs b/gix-blame/src/file/function.rs index fdbeb7c996f..b5a4067171c 100644 --- a/gix-blame/src/file/function.rs +++ b/gix-blame/src/file/function.rs @@ -366,7 +366,7 @@ pub fn file( let mut has_blame_been_passed = false; for hunk in hunks_to_blame.iter_mut() { - if hunk.has_suspect(&parent_id) { + if hunk.has_suspect(parent_id) { hunk.source_file_name = Some(source_location.clone()); has_blame_been_passed = true; diff --git a/tests/it/src/commands/blame_copy_royal.rs b/tests/it/src/commands/blame_copy_royal.rs index 2f1f0c6e44d..d73741cd8f4 100644 --- a/tests/it/src/commands/blame_copy_royal.rs +++ b/tests/it/src/commands/blame_copy_royal.rs @@ -13,6 +13,7 @@ pub(super) mod function { use std::{ collections::BTreeSet, ffi::OsStr, + fmt::Display, path::{Path, PathBuf}, }; @@ -133,7 +134,7 @@ pub(super) mod function { let blocks: Vec<_> = blame_script .script .iter() - .map(|operation| operation.to_string()) + .map(std::string::ToString::to_string) .collect(); std::fs::write(script_file, blocks.join(""))?; @@ -151,10 +152,12 @@ pub(super) mod function { CreateTag(ObjectId), } - impl BlameScriptOperation { - fn to_string(&self) -> String { + impl Display for BlameScriptOperation { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { match self { - BlameScriptOperation::InitRepository => r"#!/bin/sh + BlameScriptOperation::InitRepository => write!( + f, + r"#!/bin/sh set -e @@ -164,13 +167,15 @@ echo assets/ >> .gitignore echo create-history.sh >> .gitignore " - .into(), - BlameScriptOperation::RemoveFile(src) => format!( + ), + BlameScriptOperation::RemoveFile(src) => write!( + f, r"# delete previous version of file git rm {src} " ), - BlameScriptOperation::CommitFile(src, commit_id) => format!( + BlameScriptOperation::CommitFile(src, commit_id) => write!( + f, r"# make file {src} contain content at commit {commit_id} mkdir -p $(dirname {src}) cp ./assets/{commit_id}.commit ./{src} @@ -179,16 +184,17 @@ git add {src} git commit -m {commit_id} " ), - BlameScriptOperation::CheckoutTag(commit_id) => format!("git checkout tag-{}\n", commit_id), - BlameScriptOperation::PrepareMerge(commit_ids) => format!( - "git merge --no-commit {} || true\n", + BlameScriptOperation::CheckoutTag(commit_id) => writeln!(f, "git checkout tag-{commit_id}"), + BlameScriptOperation::PrepareMerge(commit_ids) => writeln!( + f, + "git merge --no-commit {} || true", commit_ids .iter() .map(|commit_id| format!("tag-{commit_id}")) .collect::>() .join(" ") ), - BlameScriptOperation::CreateTag(commit_id) => format!("git tag tag-{commit_id}\n\n"), + BlameScriptOperation::CreateTag(commit_id) => write!(f, "git tag tag-{commit_id}\n\n"), } } } From 378b1beb9359f9f1ef26f01065f303ec8ec9ee28 Mon Sep 17 00:00:00 2001 From: Sebastian Thiel Date: Tue, 24 Jun 2025 08:35:32 +0200 Subject: [PATCH 134/166] refactor * rename `index` to `parent_index`. * add test for clap definition of internal-tools * optimize generated script a bit --- gix-blame/src/file/function.rs | 8 +-- gix-blame/src/types.rs | 2 +- tests/it/src/commands/blame_copy_royal.rs | 61 +++++++++++------------ tests/it/src/main.rs | 11 ++++ 4 files changed, 44 insertions(+), 38 deletions(-) diff --git a/gix-blame/src/file/function.rs b/gix-blame/src/file/function.rs index b5a4067171c..98ed9790cd5 100644 --- a/gix-blame/src/file/function.rs +++ b/gix-blame/src/file/function.rs @@ -174,7 +174,7 @@ pub fn file( commit_id: suspect, blob_id: entry.unwrap_or(ObjectId::null(gix_hash::Kind::Sha1)), previous_blob_id: ObjectId::null(gix_hash::Kind::Sha1), - index: 0, + parent_index: 0, }; blame_path.push(blame_path_entry); } @@ -307,7 +307,7 @@ pub fn file( commit_id: suspect, blob_id: id, previous_blob_id: ObjectId::null(gix_hash::Kind::Sha1), - index, + parent_index: index, }; blame_path.push(blame_path_entry); } @@ -340,7 +340,7 @@ pub fn file( commit_id: suspect, blob_id: id, previous_blob_id: previous_id, - index, + parent_index: index, }; blame_path.push(blame_path_entry); } @@ -381,7 +381,7 @@ pub fn file( commit_id: suspect, blob_id: id, previous_blob_id: source_id, - index, + parent_index: index, }; blame_path.push(blame_path_entry); } diff --git a/gix-blame/src/types.rs b/gix-blame/src/types.rs index bd3502ef993..bbd54591eb9 100644 --- a/gix-blame/src/types.rs +++ b/gix-blame/src/types.rs @@ -175,7 +175,7 @@ pub struct BlamePathEntry { pub previous_blob_id: ObjectId, /// When there is more than one `BlamePathEntry` for a commit, this indicates to which parent /// commit the change is related. - pub index: usize, + pub parent_index: usize, } /// The outcome of [`file()`](crate::file()). diff --git a/tests/it/src/commands/blame_copy_royal.rs b/tests/it/src/commands/blame_copy_royal.rs index d73741cd8f4..cbb18c50e57 100644 --- a/tests/it/src/commands/blame_copy_royal.rs +++ b/tests/it/src/commands/blame_copy_royal.rs @@ -6,7 +6,7 @@ pub(super) mod function { use anyhow::Context; use gix::{ blame::BlamePathEntry, - bstr::{BStr, BString, ByteSlice}, + bstr::{BString, ByteSlice}, objs::FindExt, ObjectId, }; @@ -72,14 +72,11 @@ pub(super) mod function { options, )?; - let blame_path = outcome + let blame_infos = outcome .blame_path .expect("blame path to be present as `debug_track_path == true`"); - // TODO - // Potentially make `"assets"` configurable (it is in `git_to_sh`). let assets = destination_dir.join("assets"); - eprintln!("{prefix} create directory '{assets}'", assets = assets.display()); if !dry_run { @@ -88,17 +85,9 @@ pub(super) mod function { let mut buf = Vec::new(); - for blame_path_entry in &blame_path { - let src: &BStr = blame_path_entry.source_file_path.as_bstr(); + eprintln!("{prefix} perform {} asset copy operations", blame_infos.len(),); + for blame_path_entry in &blame_infos { let dst = assets.join(format!("{}.commit", blame_path_entry.commit_id)); - - eprintln!( - "{prefix} copy file '{}' at commit {} to '{dst}'", - src, - blame_path_entry.commit_id, - dst = dst.display() - ); - if !dry_run { let blob = repo.objects.find_blob(&blame_path_entry.blob_id, &mut buf)?.data; @@ -113,18 +102,15 @@ pub(super) mod function { })?; let blob = crate::commands::copy_royal::remapped(blob); - std::fs::write(dst, blob)?; } } } - let mut blame_script = BlameScript::new(blame_path, Options { verbatim }); - + let mut blame_script = BlameScript::new(blame_infos, Options { verbatim }); blame_script.generate()?; let script_file = destination_dir.join("create-history.sh"); - eprintln!( "{prefix} write script file at '{script_file}'", script_file = script_file.display() @@ -174,16 +160,25 @@ echo create-history.sh >> .gitignore git rm {src} " ), - BlameScriptOperation::CommitFile(src, commit_id) => write!( - f, - r"# make file {src} contain content at commit {commit_id} -mkdir -p $(dirname {src}) + BlameScriptOperation::CommitFile(src, commit_id) => { + write!( + f, + r"# make file {src} contain content at commit {commit_id} +" + )?; + if let Some(pos) = src.rfind_byte(b'/') { + let dirname = src[..pos].as_bstr(); + write!(f, "mkdir -p \"{dirname}\"\n")?; + } + write!( + f, + r"# cp ./assets/{commit_id}.commit ./{src} -# create commit git add {src} git commit -m {commit_id} " - ), + ) + } BlameScriptOperation::CheckoutTag(commit_id) => writeln!(f, "git checkout tag-{commit_id}"), BlameScriptOperation::PrepareMerge(commit_ids) => writeln!( f, @@ -200,18 +195,18 @@ git commit -m {commit_id} } struct BlameScript { - blame_path: Vec, + blame_infos: Vec, seen: BTreeSet, script: Vec, options: Options, } impl BlameScript { - fn new(blame_path: Vec, options: Options) -> Self { + fn new(blame_infos: Vec, options: Options) -> Self { let script = vec![BlameScriptOperation::InitRepository]; Self { - blame_path, + blame_infos, seen: BTreeSet::default(), script, options, @@ -224,9 +219,9 @@ git commit -m {commit_id} // methods can rely on the assumption that the root comes first, followed by its // descendants. That way, we can use a simple `for` loop to iterate through // `self.blame_path` below. - self.blame_path.reverse(); + self.blame_infos.reverse(); - for blame_path_entry in self.blame_path.clone() { + for blame_path_entry in self.blame_infos.clone() { if !self.seen.contains(&blame_path_entry.commit_id) { self.process_entry(&blame_path_entry)?; } @@ -309,13 +304,13 @@ git commit -m {commit_id} // commits where there’s changes against each parent. Each of these changes would // produce a diff that’s represented in `self.blame_path`. let mut children: Vec<_> = self - .blame_path + .blame_infos .iter() .enumerate() .filter(|(_, x)| x.commit_id == child.commit_id) .collect(); - children.sort_by_key(|(_, x)| x.index); + children.sort_by_key(|(_, x)| x.parent_index); let parents = children .iter() @@ -325,7 +320,7 @@ git commit -m {commit_id} // When we search for a parent we only have to consider entries up to and // excluding `index` as anything after `index` can only be a child. - self.blame_path[..(*index)] + self.blame_infos[..(*index)] .iter() .rfind(|&x| { x.blob_id == parent_blob_id && Some(&x.source_file_path) == parent_source_file_path.as_ref() diff --git a/tests/it/src/main.rs b/tests/it/src/main.rs index d2799b99cb4..9ce46e98a87 100644 --- a/tests/it/src/main.rs +++ b/tests/it/src/main.rs @@ -51,3 +51,14 @@ fn main() -> anyhow::Result<()> { mod args; use args::{Args, Subcommands}; + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn clap() { + use clap::CommandFactory; + Args::command().debug_assert(); + } +} From 554ce134bc4b514b52a935f17f57f76ebf23ab97 Mon Sep 17 00:00:00 2001 From: Sebastian Thiel Date: Tue, 24 Jun 2025 09:22:46 +0200 Subject: [PATCH 135/166] thanks clippy With latest nightly --- gix-attributes/tests/parse/mod.rs | 18 +++++++++--------- gix-config/tests/config/parse/section.rs | 2 +- gix-odb/src/store_impls/dynamic/load_index.rs | 1 + gix-ref/src/name.rs | 1 + gix-refspec/src/spec.rs | 1 + gix/tests/gix-init.rs | 2 +- gix/tests/gix/object/tree/diff.rs | 2 +- tests/it/src/commands/blame_copy_royal.rs | 8 ++------ 8 files changed, 17 insertions(+), 18 deletions(-) diff --git a/gix-attributes/tests/parse/mod.rs b/gix-attributes/tests/parse/mod.rs index 0092b38928c..b7d929360d7 100644 --- a/gix-attributes/tests/parse/mod.rs +++ b/gix-attributes/tests/parse/mod.rs @@ -322,15 +322,15 @@ fn trailing_whitespace_in_attributes_is_ignored() { type ExpandedAttribute<'a> = (parse::Kind, Vec<(BString, gix_attributes::StateRef<'a>)>, usize); -fn set(attr: &str) -> (BString, StateRef) { +fn set(attr: &str) -> (BString, StateRef<'_>) { (attr.into(), StateRef::Set) } -fn unset(attr: &str) -> (BString, StateRef) { +fn unset(attr: &str) -> (BString, StateRef<'_>) { (attr.into(), StateRef::Unset) } -fn unspecified(attr: &str) -> (BString, StateRef) { +fn unspecified(attr: &str) -> (BString, StateRef<'_>) { (attr.into(), StateRef::Unspecified) } @@ -350,36 +350,36 @@ fn pattern(name: &str, flags: gix_glob::pattern::Mode, first_wildcard_pos: Optio }) } -fn try_line(input: &str) -> Result { +fn try_line(input: &str) -> Result, parse::Error> { let mut lines = gix_attributes::parse(input.as_bytes()); let res = expand(lines.next().unwrap())?; assert!(lines.next().is_none(), "expected only one line"); Ok(res) } -fn line(input: &str) -> ExpandedAttribute { +fn line(input: &str) -> ExpandedAttribute<'_> { try_line(input).unwrap() } -fn byte_line(input: &[u8]) -> ExpandedAttribute { +fn byte_line(input: &[u8]) -> ExpandedAttribute<'_> { try_byte_line(input).unwrap() } -fn try_byte_line(input: &[u8]) -> Result { +fn try_byte_line(input: &[u8]) -> Result, parse::Error> { let mut lines = gix_attributes::parse(input); let res = expand(lines.next().unwrap())?; assert!(lines.next().is_none(), "expected only one line"); Ok(res) } -fn lenient_lines(input: &str) -> Vec { +fn lenient_lines(input: &str) -> Vec> { gix_attributes::parse(input.as_bytes()) .map(expand) .filter_map(Result::ok) .collect() } -fn try_lines(input: &str) -> Result, parse::Error> { +fn try_lines(input: &str) -> Result>, parse::Error> { gix_attributes::parse(input.as_bytes()).map(expand).collect() } diff --git a/gix-config/tests/config/parse/section.rs b/gix-config/tests/config/parse/section.rs index 902d2a93bb9..1b1612b20d0 100644 --- a/gix-config/tests/config/parse/section.rs +++ b/gix-config/tests/config/parse/section.rs @@ -11,7 +11,7 @@ mod header { use bstr::BStr; - fn cow_section(name: &str) -> Option> { + fn cow_section(name: &str) -> Option> { Some(Cow::Borrowed(name.into())) } mod write_to { diff --git a/gix-odb/src/store_impls/dynamic/load_index.rs b/gix-odb/src/store_impls/dynamic/load_index.rs index 839ceb9e459..facd1eeeac4 100644 --- a/gix-odb/src/store_impls/dynamic/load_index.rs +++ b/gix-odb/src/store_impls/dynamic/load_index.rs @@ -734,6 +734,7 @@ impl PartialEq for Either { } } +#[allow(clippy::non_canonical_partial_ord_impl)] impl PartialOrd for Either { fn partial_cmp(&self, other: &Self) -> Option { Some(self.path().cmp(other.path())) diff --git a/gix-ref/src/name.rs b/gix-ref/src/name.rs index 4da2a9db9d8..f48a2691420 100644 --- a/gix-ref/src/name.rs +++ b/gix-ref/src/name.rs @@ -221,6 +221,7 @@ impl<'a> convert::TryFrom<&'a str> for PartialName { } } +#[allow(clippy::infallible_try_from)] impl<'a> convert::TryFrom<&'a FullName> for &'a PartialNameRef { type Error = Infallible; diff --git a/gix-refspec/src/spec.rs b/gix-refspec/src/spec.rs index 0e6cc80479d..c24f78c9fb1 100644 --- a/gix-refspec/src/spec.rs +++ b/gix-refspec/src/spec.rs @@ -69,6 +69,7 @@ mod impls { } } + #[allow(clippy::non_canonical_partial_ord_impl)] impl PartialOrd for RefSpec { fn partial_cmp(&self, other: &Self) -> Option { Some(self.to_ref().cmp(&other.to_ref())) diff --git a/gix/tests/gix-init.rs b/gix/tests/gix-init.rs index 6a63c719c55..6a116b6d293 100644 --- a/gix/tests/gix-init.rs +++ b/gix/tests/gix-init.rs @@ -268,7 +268,7 @@ mod with_overrides { Ok(()) } - fn cow_bstr(s: &str) -> Cow { + fn cow_bstr(s: &str) -> Cow<'_, BStr> { Cow::Borrowed(s.into()) } } diff --git a/gix/tests/gix/object/tree/diff.rs b/gix/tests/gix/object/tree/diff.rs index 6a260ce403a..225dc3148db 100644 --- a/gix/tests/gix/object/tree/diff.rs +++ b/gix/tests/gix/object/tree/diff.rs @@ -879,7 +879,7 @@ mod track_rewrites { } } -fn tree_named(repo: &gix::Repository, rev_spec: impl AsRef) -> gix::Tree { +fn tree_named(repo: &gix::Repository, rev_spec: impl AsRef) -> gix::Tree<'_> { repo.rev_parse_single(rev_spec.as_ref()) .unwrap() .object() diff --git a/tests/it/src/commands/blame_copy_royal.rs b/tests/it/src/commands/blame_copy_royal.rs index cbb18c50e57..cef93929a9b 100644 --- a/tests/it/src/commands/blame_copy_royal.rs +++ b/tests/it/src/commands/blame_copy_royal.rs @@ -161,14 +161,10 @@ git rm {src} " ), BlameScriptOperation::CommitFile(src, commit_id) => { - write!( - f, - r"# make file {src} contain content at commit {commit_id} -" - )?; + writeln!(f, r"# make file {src} contain content at commit {commit_id}")?; if let Some(pos) = src.rfind_byte(b'/') { let dirname = src[..pos].as_bstr(); - write!(f, "mkdir -p \"{dirname}\"\n")?; + writeln!(f, "mkdir -p \"{dirname}\"")?; } write!( f, From fce70950006892f51b32af233656be6fe5de9df3 Mon Sep 17 00:00:00 2001 From: Brad Larsen Date: Tue, 24 Jun 2025 16:00:46 -0400 Subject: [PATCH 136/166] gix-pack: delta application is a fallible operation --- gix-pack/src/cache/delta/traverse/mod.rs | 2 ++ gix-pack/src/cache/delta/traverse/resolve.rs | 4 ++-- gix-pack/src/data/delta.rs | 22 ++++++++++++++++---- gix-pack/src/data/file/decode/entry.rs | 2 +- gix-pack/src/data/file/decode/mod.rs | 2 ++ 5 files changed, 25 insertions(+), 7 deletions(-) diff --git a/gix-pack/src/cache/delta/traverse/mod.rs b/gix-pack/src/cache/delta/traverse/mod.rs index 290f389bbe4..456cd7ec3e4 100644 --- a/gix-pack/src/cache/delta/traverse/mod.rs +++ b/gix-pack/src/cache/delta/traverse/mod.rs @@ -41,6 +41,8 @@ pub enum Error { }, #[error("Failed to spawn thread when switching to work-stealing mode")] SpawnThread(#[from] std::io::Error), + #[error(transparent)] + Delta(#[from] crate::data::delta::Error), } /// Additional context passed to the `inspect_object(…)` function of the [`Tree::traverse()`] method. diff --git a/gix-pack/src/cache/delta/traverse/resolve.rs b/gix-pack/src/cache/delta/traverse/resolve.rs index 407baa1e782..fbb038b5d09 100644 --- a/gix-pack/src/cache/delta/traverse/resolve.rs +++ b/gix-pack/src/cache/delta/traverse/resolve.rs @@ -188,7 +188,7 @@ where header_ofs += consumed; fully_resolved_delta_bytes.resize(result_size as usize, 0); - data::delta::apply(&base_bytes, fully_resolved_delta_bytes, &delta_bytes[header_ofs..]); + data::delta::apply(&base_bytes, fully_resolved_delta_bytes, &delta_bytes[header_ofs..])?; // FIXME: this actually invalidates the "pack_offset()" computation, which is not obvious to consumers // at all @@ -367,7 +367,7 @@ where &base_bytes, &mut fully_resolved_delta_bytes, &delta_bytes[header_ofs..], - ); + )?; // FIXME: this actually invalidates the "pack_offset()" computation, which is not obvious to consumers // at all diff --git a/gix-pack/src/data/delta.rs b/gix-pack/src/data/delta.rs index f7ee9bd7504..376271fa888 100644 --- a/gix-pack/src/data/delta.rs +++ b/gix-pack/src/data/delta.rs @@ -1,3 +1,15 @@ +/// Returned by [`Tree::traverse()`] +#[derive(thiserror::Error, Debug)] +#[allow(missing_docs)] +pub enum Error { + #[error("Encountered unsupported command code: 0")] + UnsupportedCommandCode, + #[error("Delta copy from base: byte slices must match")] + DeltaCopyBaseSliceMismatch, + #[error("Delta copy data: byte slices must match")] + DeltaCopyDataSliceMismatch, +} + /// Given the decompressed pack delta `d`, decode a size in bytes (either the base object size or the result object size) /// Equivalent to [this canonical git function](https://github.com/git/git/blob/311531c9de557d25ac087c1637818bd2aad6eb3a/delta.h#L89) pub fn decode_header_size(d: &[u8]) -> (u64, usize) { @@ -15,7 +27,7 @@ pub fn decode_header_size(d: &[u8]) -> (u64, usize) { (size, consumed) } -pub fn apply(base: &[u8], mut target: &mut [u8], data: &[u8]) { +pub fn apply(base: &[u8], mut target: &mut [u8], data: &[u8]) -> Result<(), Error> { let mut i = 0; while let Some(cmd) = data.get(i) { i += 1; @@ -55,16 +67,18 @@ pub fn apply(base: &[u8], mut target: &mut [u8], data: &[u8]) { } let ofs = ofs as usize; std::io::Write::write(&mut target, &base[ofs..ofs + size as usize]) - .expect("delta copy from base: byte slices must match"); + .map_err(|_e| Error::DeltaCopyBaseSliceMismatch)?; } - 0 => panic!("encountered unsupported command code: 0"), + 0 => return Err(Error::UnsupportedCommandCode), size => { std::io::Write::write(&mut target, &data[i..i + *size as usize]) - .expect("delta copy data: slice sizes to match up"); + .map_err(|_e| Error::DeltaCopyDataSliceMismatch)?; i += *size as usize; } } } assert_eq!(i, data.len()); assert_eq!(target.len(), 0); + + Ok(()) } diff --git a/gix-pack/src/data/file/decode/entry.rs b/gix-pack/src/data/file/decode/entry.rs index 50030ac705b..bc8d5a2ca41 100644 --- a/gix-pack/src/data/file/decode/entry.rs +++ b/gix-pack/src/data/file/decode/entry.rs @@ -374,7 +374,7 @@ impl File { if delta_idx + 1 == chain_len { last_result_size = Some(result_size); } - delta::apply(&source_buf[..base_size], &mut target_buf[..result_size], data); + delta::apply(&source_buf[..base_size], &mut target_buf[..result_size], data)?; // use the target as source for the next delta std::mem::swap(&mut source_buf, &mut target_buf); } diff --git a/gix-pack/src/data/file/decode/mod.rs b/gix-pack/src/data/file/decode/mod.rs index 205ee757bc9..abd8bf39103 100644 --- a/gix-pack/src/data/file/decode/mod.rs +++ b/gix-pack/src/data/file/decode/mod.rs @@ -19,6 +19,8 @@ pub enum Error { EntryType(#[from] crate::data::entry::decode::Error), #[error("Entry too large to fit in memory")] OutOfMemory, + #[error(transparent)] + Delta(#[from] crate::data::delta::Error), } impl From for Error { From 04bc4a81614146f56f341e15b459dfc1a880bd45 Mon Sep 17 00:00:00 2001 From: Yuya Nishihara Date: Wed, 25 Jun 2025 12:15:44 +0900 Subject: [PATCH 137/166] fix: username in scp-like url is no longer percent-encoded (#2056) Since Git doesn't percent-decode characters in scp-like URL, we shouldn't encode username at all. https://github.com/git/git/blob/v2.50.0/connect.c#L1081 I've split write_to() function to clarify that any non-path components that should be separated by ":" cannot be serialized in alternative form. I've made it fall back to the URL syntax if password or port number was set. Maybe we can also check if the user or host includes ":", but I'm not sure how much foolproof we should add here. --- gix-url/src/lib.rs | 46 +++++++++++++++++++++++++++++----- gix-url/tests/url/parse/ssh.rs | 42 ++++++++++++++++++++++++++++++- 2 files changed, 81 insertions(+), 7 deletions(-) diff --git a/gix-url/src/lib.rs b/gix-url/src/lib.rs index bbde5a08295..7f3494f85c1 100644 --- a/gix-url/src/lib.rs +++ b/gix-url/src/lib.rs @@ -315,11 +315,23 @@ fn percent_encode(s: &str) -> Cow<'_, str> { /// Serialization impl Url { /// Write this URL losslessly to `out`, ready to be parsed again. - pub fn write_to(&self, mut out: &mut dyn std::io::Write) -> std::io::Result<()> { - if !(self.serialize_alternative_form && (self.scheme == Scheme::File || self.scheme == Scheme::Ssh)) { - out.write_all(self.scheme.as_str().as_bytes())?; - out.write_all(b"://")?; + pub fn write_to(&self, out: &mut dyn std::io::Write) -> std::io::Result<()> { + // Since alternative form doesn't employ any escape syntax, password and + // port number cannot be encoded. + if self.serialize_alternative_form + && (self.scheme == Scheme::File || self.scheme == Scheme::Ssh) + && self.password.is_none() + && self.port.is_none() + { + self.write_alternative_form_to(out) + } else { + self.write_canonical_form_to(out) } + } + + fn write_canonical_form_to(&self, out: &mut dyn std::io::Write) -> std::io::Result<()> { + out.write_all(self.scheme.as_str().as_bytes())?; + out.write_all(b"://")?; match (&self.user, &self.host) { (Some(user), Some(host)) => { out.write_all(percent_encode(user).as_bytes())?; @@ -337,9 +349,31 @@ impl Url { (Some(_user), None) => unreachable!("BUG: should not be possible to have a user but no host"), } if let Some(port) = &self.port { - write!(&mut out, ":{port}")?; + write!(out, ":{port}")?; + } + out.write_all(&self.path)?; + Ok(()) + } + + fn write_alternative_form_to(&self, out: &mut dyn std::io::Write) -> std::io::Result<()> { + match (&self.user, &self.host) { + (Some(user), Some(host)) => { + out.write_all(user.as_bytes())?; + assert!( + self.password.is_none(), + "BUG: cannot serialize password in alternative form" + ); + out.write_all(b"@")?; + out.write_all(host.as_bytes())?; + } + (None, Some(host)) => { + out.write_all(host.as_bytes())?; + } + (None, None) => {} + (Some(_user), None) => unreachable!("BUG: should not be possible to have a user but no host"), } - if self.serialize_alternative_form && self.scheme == Scheme::Ssh { + assert!(self.port.is_none(), "BUG: cannot serialize port in alternative form"); + if self.scheme == Scheme::Ssh { out.write_all(b":")?; } out.write_all(&self.path)?; diff --git a/gix-url/tests/url/parse/ssh.rs b/gix-url/tests/url/parse/ssh.rs index 1ef4cc5115c..3dbef52c76b 100644 --- a/gix-url/tests/url/parse/ssh.rs +++ b/gix-url/tests/url/parse/ssh.rs @@ -1,6 +1,6 @@ use gix_url::Scheme; -use crate::parse::{assert_url, assert_url_roundtrip, url, url_alternate}; +use crate::parse::{assert_url, assert_url_roundtrip, url, url_alternate, url_with_pass}; #[test] fn without_user_and_without_port() -> crate::Result { @@ -184,6 +184,30 @@ fn scp_like_with_windows_path_and_port_thinks_port_is_part_of_path() -> crate::R Ok(()) } +#[test] +fn scp_like_with_non_alphanumeric_username() -> crate::Result { + let url = assert_url( + "_user.name@host.xz:C:/path", + url_alternate(Scheme::Ssh, "_user.name", "host.xz", None, b"C:/path"), + )? + .to_bstring(); + assert_eq!(url, "_user.name@host.xz:C:/path"); + Ok(()) +} + +// Git passes the non-path part "user@name@host.xz" to OpenSSH, and the ssh +// command interprets it as user = "user@name", host = "host.xz". +#[test] +fn scp_like_with_username_including_at() -> crate::Result { + let url = assert_url( + "user@name@host.xz:path", + url_alternate(Scheme::Ssh, "user@name", "host.xz", None, b"path"), + )? + .to_bstring(); + assert_eq!(url, "user@name@host.xz:path"); + Ok(()) +} + // Git does not care that the host is named `file`, it still treats it as an SCP url. // I btw tested this, yes you can really clone a repository from there, just `git init` // in the directory above your home directory on the remote machine. @@ -193,3 +217,19 @@ fn strange_scp_like_with_host_named_file() -> crate::Result { assert_eq!(url.to_bstring(), "file:.."); Ok(()) } + +#[test] +fn bad_alternative_form_with_password() -> crate::Result { + let url = url_with_pass(Scheme::Ssh, "user", "password", "host.xz", None, b"/") + .serialize_alternate_form(true) + .to_bstring(); + assert_eq!(url, "ssh://user:password@host.xz/"); + Ok(()) +} + +#[test] +fn bad_alternative_form_with_port() -> crate::Result { + let url = url_alternate(Scheme::Ssh, None, "host.xz", 21, b"/").to_bstring(); + assert_eq!(url, "ssh://host.xz:21/"); + Ok(()) +} From 56ca4bf8e818bbdc14ee9dda68e39acded8f0287 Mon Sep 17 00:00:00 2001 From: Sebastian Thiel Date: Wed, 25 Jun 2025 10:07:00 +0200 Subject: [PATCH 138/166] refactor * put error into more specific spot and export it --- gix-pack/src/cache/delta/traverse/mod.rs | 2 +- gix-pack/src/data/delta.rs | 33 +++++++++++++----------- gix-pack/src/data/file/decode/mod.rs | 2 +- gix-pack/src/data/mod.rs | 3 ++- 4 files changed, 22 insertions(+), 18 deletions(-) diff --git a/gix-pack/src/cache/delta/traverse/mod.rs b/gix-pack/src/cache/delta/traverse/mod.rs index 456cd7ec3e4..6d36c50e5a6 100644 --- a/gix-pack/src/cache/delta/traverse/mod.rs +++ b/gix-pack/src/cache/delta/traverse/mod.rs @@ -42,7 +42,7 @@ pub enum Error { #[error("Failed to spawn thread when switching to work-stealing mode")] SpawnThread(#[from] std::io::Error), #[error(transparent)] - Delta(#[from] crate::data::delta::Error), + Delta(#[from] crate::data::delta::apply::Error), } /// Additional context passed to the `inspect_object(…)` function of the [`Tree::traverse()`] method. diff --git a/gix-pack/src/data/delta.rs b/gix-pack/src/data/delta.rs index 376271fa888..f5b7dfb05e0 100644 --- a/gix-pack/src/data/delta.rs +++ b/gix-pack/src/data/delta.rs @@ -1,18 +1,21 @@ -/// Returned by [`Tree::traverse()`] -#[derive(thiserror::Error, Debug)] -#[allow(missing_docs)] -pub enum Error { - #[error("Encountered unsupported command code: 0")] - UnsupportedCommandCode, - #[error("Delta copy from base: byte slices must match")] - DeltaCopyBaseSliceMismatch, - #[error("Delta copy data: byte slices must match")] - DeltaCopyDataSliceMismatch, +/// +pub mod apply { + /// Returned when failing to apply deltas. + #[derive(thiserror::Error, Debug)] + #[allow(missing_docs)] + pub enum Error { + #[error("Encountered unsupported command code: 0")] + UnsupportedCommandCode, + #[error("Delta copy from base: byte slices must match")] + DeltaCopyBaseSliceMismatch, + #[error("Delta copy data: byte slices must match")] + DeltaCopyDataSliceMismatch, + } } /// Given the decompressed pack delta `d`, decode a size in bytes (either the base object size or the result object size) /// Equivalent to [this canonical git function](https://github.com/git/git/blob/311531c9de557d25ac087c1637818bd2aad6eb3a/delta.h#L89) -pub fn decode_header_size(d: &[u8]) -> (u64, usize) { +pub(crate) fn decode_header_size(d: &[u8]) -> (u64, usize) { let mut i = 0; let mut size = 0u64; let mut consumed = 0; @@ -27,7 +30,7 @@ pub fn decode_header_size(d: &[u8]) -> (u64, usize) { (size, consumed) } -pub fn apply(base: &[u8], mut target: &mut [u8], data: &[u8]) -> Result<(), Error> { +pub(crate) fn apply(base: &[u8], mut target: &mut [u8], data: &[u8]) -> Result<(), apply::Error> { let mut i = 0; while let Some(cmd) = data.get(i) { i += 1; @@ -67,12 +70,12 @@ pub fn apply(base: &[u8], mut target: &mut [u8], data: &[u8]) -> Result<(), Erro } let ofs = ofs as usize; std::io::Write::write(&mut target, &base[ofs..ofs + size as usize]) - .map_err(|_e| Error::DeltaCopyBaseSliceMismatch)?; + .map_err(|_e| apply::Error::DeltaCopyBaseSliceMismatch)?; } - 0 => return Err(Error::UnsupportedCommandCode), + 0 => return Err(apply::Error::UnsupportedCommandCode), size => { std::io::Write::write(&mut target, &data[i..i + *size as usize]) - .map_err(|_e| Error::DeltaCopyDataSliceMismatch)?; + .map_err(|_e| apply::Error::DeltaCopyDataSliceMismatch)?; i += *size as usize; } } diff --git a/gix-pack/src/data/file/decode/mod.rs b/gix-pack/src/data/file/decode/mod.rs index abd8bf39103..71bbf1595c4 100644 --- a/gix-pack/src/data/file/decode/mod.rs +++ b/gix-pack/src/data/file/decode/mod.rs @@ -20,7 +20,7 @@ pub enum Error { #[error("Entry too large to fit in memory")] OutOfMemory, #[error(transparent)] - Delta(#[from] crate::data::delta::Error), + Delta(#[from] crate::data::delta::apply::Error), } impl From for Error { diff --git a/gix-pack/src/data/mod.rs b/gix-pack/src/data/mod.rs index 9286310c1af..077ea7417de 100644 --- a/gix-pack/src/data/mod.rs +++ b/gix-pack/src/data/mod.rs @@ -128,4 +128,5 @@ impl File { } } -pub(crate) mod delta; +/// +pub mod delta; From bfb1c34f75997a603b8f85fca75bf9e1ca310be0 Mon Sep 17 00:00:00 2001 From: Frederick Price Date: Wed, 25 Jun 2025 17:17:22 -0400 Subject: [PATCH 139/166] Small documentation fixes Small grammar and spelling changes to make the codebase better. --- gitoxide-core/src/hours/mod.rs | 2 +- gix-archive/src/lib.rs | 2 +- gix-command/src/lib.rs | 2 +- gix-features/src/parallel/in_parallel.rs | 16 ++++++++-------- gix-features/src/parallel/reduce.rs | 2 +- gix-features/src/parallel/serial.rs | 14 +++++++------- gix-filter/src/driver/apply.rs | 8 ++++---- gix-fs/src/lib.rs | 2 +- gix-hash/src/oid.rs | 2 +- gix-object/src/commit/message/mod.rs | 2 +- gix-pack/src/cache/delta/traverse/mod.rs | 8 ++++---- gix-pack/src/data/input/mod.rs | 2 +- gix-pack/src/data/output/count/objects/mod.rs | 6 +++--- gix-pack/src/index/traverse/mod.rs | 4 ++-- gix-pack/src/index/traverse/types.rs | 2 +- gix-pack/src/index/traverse/with_index.rs | 4 ++-- gix-pack/src/index/traverse/with_lookup.rs | 4 ++-- gix-pack/src/multi_index/chunk.rs | 4 ++-- gix-protocol/src/fetch/types.rs | 2 +- gix-tempfile/src/lib.rs | 2 +- gix-transport/src/client/async_io/traits.rs | 2 +- gix-transport/src/client/blocking_io/traits.rs | 2 +- gix/src/commit.rs | 2 +- src/plumbing/options/mod.rs | 2 +- src/porcelain/options.rs | 2 +- 25 files changed, 50 insertions(+), 50 deletions(-) diff --git a/gitoxide-core/src/hours/mod.rs b/gitoxide-core/src/hours/mod.rs index bdc4f585839..bbd3e3d4146 100644 --- a/gitoxide-core/src/hours/mod.rs +++ b/gitoxide-core/src/hours/mod.rs @@ -17,7 +17,7 @@ pub struct Context { pub file_stats: bool, /// Collect how many lines in files have been added, removed and modified (without rename tracking). pub line_stats: bool, - /// The amount of threads to use. If unset, use all cores, if 0 use al physical cores. + /// The number of threads to use. If unset, use all cores, if 0 use all physical cores. pub threads: Option, /// Omit unifying identities by name and email which can lead to the same author appear multiple times /// due to using different names or email addresses. diff --git a/gix-archive/src/lib.rs b/gix-archive/src/lib.rs index 78e3b4f81ab..150d064ca81 100644 --- a/gix-archive/src/lib.rs +++ b/gix-archive/src/lib.rs @@ -80,7 +80,7 @@ pub struct Options { pub format: Format, /// Given a `path`, originating in the git tree, to place into the archive, put `/path` in front of it. /// - /// Note that that `/` should be used as separator, and that a prefix directory has to end with `/`. + /// Note that `/` should be used as separator, and that a prefix directory has to end with `/`. pub tree_prefix: Option, /// The modification time for all entries in the archive as seen since UNIX epoch. /// diff --git a/gix-command/src/lib.rs b/gix-command/src/lib.rs index a3c428edeba..2ad032c3bf8 100644 --- a/gix-command/src/lib.rs +++ b/gix-command/src/lib.rs @@ -159,7 +159,7 @@ mod prepare { /// Set the name or path to the shell `program` to use if a shell is to be used, to avoid /// using the default shell which is `sh`. /// - /// Note that that shells that are not Bourne-style cannot be expected to work correctly, + /// Note that shells that are not Bourne-style cannot be expected to work correctly, /// because POSIX shell syntax is assumed when searching for and conditionally adding /// `"$@"` to receive arguments, where applicable (and in the behaviour of /// [`with_quoted_command()`](Self::with_quoted_command()), if called). diff --git a/gix-features/src/parallel/in_parallel.rs b/gix-features/src/parallel/in_parallel.rs index 2fcd28d696b..8c85b5426ac 100644 --- a/gix-features/src/parallel/in_parallel.rs +++ b/gix-features/src/parallel/in_parallel.rs @@ -38,11 +38,11 @@ pub fn build_thread() -> std::thread::Builder { } /// Read items from `input` and `consume` them in multiple threads, -/// whose output output is collected by a `reducer`. Its task is to -/// aggregate these outputs into the final result returned by this function with the benefit of not having to be thread-safe. +/// whose output is collected by a `reducer`. Its task is to +/// aggregate these outputs into the final result returned by this function, with the benefit of not having to be thread-safe. /// -/// * if `thread_limit` is `Some`, the given amount of threads will be used. If `None`, all logical cores will be used. -/// * `new_thread_state(thread_number) -> State` produces thread-local state once per thread to be based to `consume` +/// * if `thread_limit` is `Some`, then the given number of threads will be used. If `None`, all logical cores will be used. +/// * `new_thread_state(thread_number) -> State` produces thread-local state once per thread to be passed to `consume` /// * `consume(Item, &mut State) -> Output` produces an output given an input obtained by `input` along with mutable state initially /// created by `new_thread_state(…)`. /// * For `reducer`, see the [`Reduce`] trait @@ -103,12 +103,12 @@ where } /// Read items from `input` and `consume` them in multiple threads, -/// whose output output is collected by a `reducer`. Its task is to +/// whose output is collected by a `reducer`. Its task is to /// aggregate these outputs into the final result returned by this function with the benefit of not having to be thread-safe. -/// Caall `finalize` to finish the computation, once per thread, if there was no error sending results earlier. +/// Call `finalize` to finish the computation, once per thread, if there was no error sending results earlier. /// -/// * if `thread_limit` is `Some`, the given amount of threads will be used. If `None`, all logical cores will be used. -/// * `new_thread_state(thread_number) -> State` produces thread-local state once per thread to be based to `consume` +/// * if `thread_limit` is `Some`, then the given number of threads will be used. If `None`, all logical cores will be used. +/// * `new_thread_state(thread_number) -> State` produces thread-local state once per thread to be passed to `consume` /// * `consume(Item, &mut State) -> Output` produces an output given an input obtained by `input` along with mutable state initially /// created by `new_thread_state(…)`. /// * `finalize(State) -> Output` is called to potentially process remaining work that was placed in `State`. diff --git a/gix-features/src/parallel/reduce.rs b/gix-features/src/parallel/reduce.rs index f9992cfd23d..dce92159ed8 100644 --- a/gix-features/src/parallel/reduce.rs +++ b/gix-features/src/parallel/reduce.rs @@ -232,7 +232,7 @@ pub trait Reduce { /// /// If an `Error` is returned, the entire operation will be stopped. fn feed(&mut self, item: Self::Input) -> Result; - /// Called once once all items where passed to `feed()`, producing the final `Output` of the operation or an `Error`. + /// Called once for all items that were passed to `feed()`, producing the final `Output` of the operation or an `Error`. fn finalize(self) -> Result; } diff --git a/gix-features/src/parallel/serial.rs b/gix-features/src/parallel/serial.rs index 67c170f7a4d..e146481c469 100644 --- a/gix-features/src/parallel/serial.rs +++ b/gix-features/src/parallel/serial.rs @@ -116,12 +116,12 @@ mod not_parallel { pub use not_parallel::{build_thread, in_parallel_with_slice, join, threads, Scope}; /// Read items from `input` and `consume` them in a single thread, producing an output to be collected by a `reducer`, -/// whose task is to aggregate these outputs into the final result returned by this function. +/// whose task it is to aggregate these outputs into the final result returned by this function. /// -/// * `new_thread_state(thread_number) -> State` produces thread-local state once per thread to be based to `consume` +/// * `new_thread_state(thread_number) -> State` produces thread-local state once per thread to be passed to `consume` /// * `consume(Item, &mut State) -> Output` produces an output given an input along with mutable state. /// * For `reducer`, see the [`Reduce`] trait -/// * if `thread_limit` has no effect as everything is run on the main thread, but is present to keep the signature +/// * `thread_limit` has no effect as everything is run on the main thread, but is present to keep the signature /// similar to the parallel version. /// /// **This serial version performing all calculations on the current thread.** @@ -143,12 +143,12 @@ where } /// Read items from `input` and `consume` them in multiple threads, -/// whose output output is collected by a `reducer`. Its task is to +/// whose output is collected by a `reducer`. Its task is to /// aggregate these outputs into the final result returned by this function with the benefit of not having to be thread-safe. -/// Caall `finalize` to finish the computation, once per thread, if there was no error sending results earlier. +/// Call `finalize` to finish the computation, once per thread, if there was no error sending results earlier. /// -/// * if `thread_limit` is `Some`, the given amount of threads will be used. If `None`, all logical cores will be used. -/// * `new_thread_state(thread_number) -> State` produces thread-local state once per thread to be based to `consume` +/// * if `thread_limit` is `Some`, the given number of threads will be used. If `None`, all logical cores will be used. +/// * `new_thread_state(thread_number) -> State` produces thread-local state once per thread to be passed to `consume` /// * `consume(Item, &mut State) -> Output` produces an output given an input obtained by `input` along with mutable state initially /// created by `new_thread_state(…)`. /// * `finalize(State) -> Output` is called to potentially process remaining work that was placed in `State`. diff --git a/gix-filter/src/driver/apply.rs b/gix-filter/src/driver/apply.rs index 25c8d3199b8..0a530e39c55 100644 --- a/gix-filter/src/driver/apply.rs +++ b/gix-filter/src/driver/apply.rs @@ -72,14 +72,14 @@ impl State { /// Each call to this method will cause the corresponding filter to be invoked unless `driver` indicates a `process` filter, /// which is only launched once and maintained using this state. /// - /// Note that it's not an error if there is no filter process for `operation` or if a long-running process doesn't supported + /// Note that it's not an error if there is no filter process for `operation` or if a long-running process doesn't support /// the desired capability. /// /// ### Deviation /// - /// If a long running process returns the 'abort' status after receiving the data, it will be removed similar to how `git` does it. - /// However, it delivers an unsuccessful error status later, it will not be removed, but reports the error only. - /// If any other non-'error' status is received, the process will be stopped. But that doesn't happen if if such a status is received + /// If a long running process returns the 'abort' status after receiving the data, it will be removed similarly to how `git` does it. + /// However, if it returns an unsuccessful error status later, it will not be removed, but reports the error only. + /// If any other non-'error' status is received, the process will be stopped. But that doesn't happen if such a status is received /// after reading the filtered result. pub fn apply<'a>( &'a mut self, diff --git a/gix-fs/src/lib.rs b/gix-fs/src/lib.rs index b04ba80eced..551059aae29 100644 --- a/gix-fs/src/lib.rs +++ b/gix-fs/src/lib.rs @@ -96,7 +96,7 @@ pub mod io_err { } #[cfg(not(unix))] -/// Returns whether a a file has the executable permission set. +/// Returns whether a file has the executable permission set. pub fn is_executable(_metadata: &std::fs::Metadata) -> bool { false } diff --git a/gix-hash/src/oid.rs b/gix-hash/src/oid.rs index 4e67dadf9f1..7b35c310d3c 100644 --- a/gix-hash/src/oid.rs +++ b/gix-hash/src/oid.rs @@ -34,7 +34,7 @@ impl hash::Hash for oid { } } -/// A utility able to format itself with the given amount of characters in hex. +/// A utility able to format itself with the given number of characters in hex. #[derive(PartialEq, Eq, Hash, Ord, PartialOrd)] pub struct HexDisplay<'a> { inner: &'a oid, diff --git a/gix-object/src/commit/message/mod.rs b/gix-object/src/commit/message/mod.rs index e0cf1187849..9f60b23ab2f 100644 --- a/gix-object/src/commit/message/mod.rs +++ b/gix-object/src/commit/message/mod.rs @@ -75,7 +75,7 @@ impl<'a> MessageRef<'a> { summary(self.title) } - /// Further parse the body into into non-trailer and trailers, which can be iterated from the returned [`BodyRef`]. + /// Further parse the body into non-trailer and trailers, which can be iterated from the returned [`BodyRef`]. pub fn body(&self) -> Option> { self.body.map(|b| BodyRef::from_bytes(b)) } diff --git a/gix-pack/src/cache/delta/traverse/mod.rs b/gix-pack/src/cache/delta/traverse/mod.rs index 6d36c50e5a6..1e0026af782 100644 --- a/gix-pack/src/cache/delta/traverse/mod.rs +++ b/gix-pack/src/cache/delta/traverse/mod.rs @@ -53,8 +53,8 @@ pub struct Context<'a> { pub entry_end: u64, /// The decompressed object itself, ready to be decoded. pub decompressed: &'a [u8], - /// The depth at which this object resides in the delta-tree. It represents the amount of base objects, with 0 indicating - /// an 'undeltified' object, and higher values indicating delta objects with the given amount of bases. + /// The depth at which this object resides in the delta-tree. It represents the number of base objects, with 0 indicating + /// an 'undeltified' object, and higher values indicating delta objects with the given number of bases. pub level: u16, } @@ -64,8 +64,8 @@ pub struct Options<'a, 's> { pub object_progress: Box, /// is a progress instance to track the overall progress. pub size_progress: &'s mut dyn Progress, - /// If `Some`, only use the given amount of threads. Otherwise, the amount of threads to use will be selected based on - /// the amount of available logical cores. + /// If `Some`, only use the given number of threads. Otherwise, the number of threads to use will be selected based on + /// the number of available logical cores. pub thread_limit: Option, /// Abort the operation if the value is `true`. pub should_interrupt: &'a AtomicBool, diff --git a/gix-pack/src/data/input/mod.rs b/gix-pack/src/data/input/mod.rs index d3a36416ed1..a6476fd7a9a 100644 --- a/gix-pack/src/data/input/mod.rs +++ b/gix-pack/src/data/input/mod.rs @@ -14,7 +14,7 @@ pub struct Entry { /// when resolving thin packs. /// Depends on `CompressionMode` when the iterator is initialized. pub compressed: Option>, - /// The amount of bytes the compressed portion of the entry takes, i.e. the portion behind behind the header. + /// The amount of bytes the compressed portion of the entry takes, i.e. the portion behind the header. pub compressed_size: u64, /// The CRC32 over the complete entry, that is encoded header and compressed object data. /// Depends on `CompressionMode` when the iterator is initialized diff --git a/gix-pack/src/data/output/count/objects/mod.rs b/gix-pack/src/data/output/count/objects/mod.rs index 17e5c68d266..a057d45a986 100644 --- a/gix-pack/src/data/output/count/objects/mod.rs +++ b/gix-pack/src/data/output/count/objects/mod.rs @@ -14,14 +14,14 @@ pub use types::{Error, ObjectExpansion, Options, Outcome}; mod tree; /// Generate [`Count`][output::Count]s from input `objects` with object expansion based on [`options`][Options] -/// to learn which objects would would constitute a pack. This step is required to know exactly how many objects would -/// be in a pack while keeping data around to avoid minimize object database access. +/// to learn which objects would constitute a pack. This step is required to know exactly how many objects would +/// be in a pack while keeping data around to minimize database object access. /// /// A [`Count`][output::Count] object maintains enough state to greatly accelerate future access of packed objects. /// /// * `db` - the object store to use for accessing objects. /// * `objects_ids` -/// * A list of objects ids to add to the pack. Duplication checks are performed so no object is ever added to a pack twice. +/// * A list of objects IDs to add to the pack. Duplication checks are performed so no object is ever added to a pack twice. /// * Objects may be expanded based on the provided [`options`][Options] /// * `objects` /// * count the amount of objects we encounter diff --git a/gix-pack/src/index/traverse/mod.rs b/gix-pack/src/index/traverse/mod.rs index 8f13774f0ab..d6b3c5cac0b 100644 --- a/gix-pack/src/index/traverse/mod.rs +++ b/gix-pack/src/index/traverse/mod.rs @@ -23,8 +23,8 @@ pub use types::{Algorithm, ProgressId, SafetyCheck, Statistics}; pub struct Options { /// The algorithm to employ. pub traversal: Algorithm, - /// If `Some`, only use the given amount of threads. Otherwise, the amount of threads to use will be selected based on - /// the amount of available logical cores. + /// If `Some`, only use the given number of threads. Otherwise, the number of threads to use will be selected based on + /// the number of available logical cores. pub thread_limit: Option, /// The kinds of safety checks to perform. pub check: SafetyCheck, diff --git a/gix-pack/src/index/traverse/types.rs b/gix-pack/src/index/traverse/types.rs index 9fc21c0dcd5..91b8d90909f 100644 --- a/gix-pack/src/index/traverse/types.rs +++ b/gix-pack/src/index/traverse/types.rs @@ -8,7 +8,7 @@ pub struct Statistics { pub average: crate::data::decode::entry::Outcome, /// A mapping of the length of the chain to the amount of objects at that length. /// - /// A length of 0 indicates full objects, and everything above that involves the given amount + /// A length of 0 indicates full objects, and everything more than that uses the given number /// of delta objects. pub objects_per_chain_length: BTreeMap, /// The amount of bytes in all compressed streams, one per entry diff --git a/gix-pack/src/index/traverse/with_index.rs b/gix-pack/src/index/traverse/with_index.rs index b3c0f672b08..e31cc2e08e2 100644 --- a/gix-pack/src/index/traverse/with_index.rs +++ b/gix-pack/src/index/traverse/with_index.rs @@ -11,8 +11,8 @@ use crate::{ /// Traversal options for [`traverse_with_index()`][index::File::traverse_with_index()] #[derive(Default)] pub struct Options { - /// If `Some`, only use the given amount of threads. Otherwise, the amount of threads to use will be selected based on - /// the amount of available logical cores. + /// If `Some`, only use the given number of threads. Otherwise, the number of threads to use will be selected based on + /// the number of available logical cores. pub thread_limit: Option, /// The kinds of safety checks to perform. pub check: crate::index::traverse::SafetyCheck, diff --git a/gix-pack/src/index/traverse/with_lookup.rs b/gix-pack/src/index/traverse/with_lookup.rs index e6b9269ea3b..598f5d05db6 100644 --- a/gix-pack/src/index/traverse/with_lookup.rs +++ b/gix-pack/src/index/traverse/with_lookup.rs @@ -15,8 +15,8 @@ use crate::{ /// Traversal options for [`index::File::traverse_with_lookup()`] pub struct Options { - /// If `Some`, only use the given amount of threads. Otherwise, the amount of threads to use will be selected based on - /// the amount of available logical cores. + /// If `Some`, only use the given number of threads. Otherwise, the number of threads to use will be selected based on + /// the number of available logical cores. pub thread_limit: Option, /// The kinds of safety checks to perform. pub check: index::traverse::SafetyCheck, diff --git a/gix-pack/src/multi_index/chunk.rs b/gix-pack/src/multi_index/chunk.rs index b0a1bddba78..b156afdc274 100644 --- a/gix-pack/src/multi_index/chunk.rs +++ b/gix-pack/src/multi_index/chunk.rs @@ -148,7 +148,7 @@ pub mod lookup { /// The id uniquely identifying the oid lookup table. pub const ID: gix_chunk::Id = *b"OIDL"; - /// Return the amount of bytes needed to store the data on disk for the given amount of `entries` + /// Return the number of bytes needed to store the data on disk for the given amount of `entries` pub fn storage_size(entries: usize, object_hash: gix_hash::Kind) -> u64 { (entries * object_hash.len_in_bytes()) as u64 } @@ -267,7 +267,7 @@ pub mod large_offsets { Ok(()) } - /// Return the amount of bytes needed to store the given amount of `large_offsets` + /// Return the number of bytes needed to store the given amount of `large_offsets` pub(crate) fn storage_size(large_offsets: usize) -> u64 { 8 * large_offsets as u64 } diff --git a/gix-protocol/src/fetch/types.rs b/gix-protocol/src/fetch/types.rs index db737b5bcde..f7d3415a783 100644 --- a/gix-protocol/src/fetch/types.rs +++ b/gix-protocol/src/fetch/types.rs @@ -33,7 +33,7 @@ pub struct Context<'a, T> { /// /// This could be read from the `gitoxide.userAgent` configuration variable. pub user_agent: (&'static str, Option>), - /// If `true`, output all packetlines using the the `gix-trace` machinery. + /// If `true`, output all packetlines using the `gix-trace` machinery. pub trace_packetlines: bool, } diff --git a/gix-tempfile/src/lib.rs b/gix-tempfile/src/lib.rs index fc1580903b5..ee87b5825f4 100644 --- a/gix-tempfile/src/lib.rs +++ b/gix-tempfile/src/lib.rs @@ -138,7 +138,7 @@ static REGISTRY: Lazy>> = Lazy::new(|| { pub enum ContainingDirectory { /// Assume the directory for the tempfile exists and cause failure if it doesn't Exists, - /// Create the directory recursively with the given amount of retries in a way that is somewhat race resistant + /// Create the directory recursively with the given number of retries in a way that is somewhat race resistant /// depending on the amount of retries. CreateAllRaceProof(create_dir::Retries), } diff --git a/gix-transport/src/client/async_io/traits.rs b/gix-transport/src/client/async_io/traits.rs index acd27dcee17..6a5577d1725 100644 --- a/gix-transport/src/client/async_io/traits.rs +++ b/gix-transport/src/client/async_io/traits.rs @@ -31,7 +31,7 @@ pub trait Transport: TransportWithoutIO { /// `extra_parameters` are interpreted as `key=value` pairs if the second parameter is `Some` or as `key` /// if it is None. /// - /// Returns the service capabilities according according to the actual [Protocol] it supports, + /// Returns the service capabilities according to the actual [Protocol] it supports, /// and possibly a list of refs to be obtained. /// This means that asking for an unsupported protocol might result in a protocol downgrade to the given one /// if [TransportWithoutIO::supported_protocol_versions()] includes it or is empty. diff --git a/gix-transport/src/client/blocking_io/traits.rs b/gix-transport/src/client/blocking_io/traits.rs index 07c7addcacc..31fb83dc313 100644 --- a/gix-transport/src/client/blocking_io/traits.rs +++ b/gix-transport/src/client/blocking_io/traits.rs @@ -28,7 +28,7 @@ pub trait Transport: TransportWithoutIO { /// `extra_parameters` are interpreted as `key=value` pairs if the second parameter is `Some` or as `key` /// if it is None. /// - /// Returns the service capabilities according according to the actual [Protocol] it supports, + /// Returns the service capabilities according to the actual [Protocol] it supports, /// and possibly a list of refs to be obtained. /// This means that asking for an unsupported protocol might result in a protocol downgrade to the given one /// if [`TransportWithoutIO::supported_protocol_versions()`] includes it. diff --git a/gix/src/commit.rs b/gix/src/commit.rs index 2a5af16f404..caeecc54416 100644 --- a/gix/src/commit.rs +++ b/gix/src/commit.rs @@ -202,7 +202,7 @@ pub mod describe { self } - /// Only consider the given amount of candidates, instead of the default of 10. + /// Only consider the given number of candidates, instead of the default of 10. pub fn max_candidates(mut self, candidates: usize) -> Self { self.max_candidates = candidates; self diff --git a/src/plumbing/options/mod.rs b/src/plumbing/options/mod.rs index fcefffba26a..ae1ea443551 100644 --- a/src/plumbing/options/mod.rs +++ b/src/plumbing/options/mod.rs @@ -605,7 +605,7 @@ pub mod fetch { #[clap(long, help_heading = Some("SHALLOW"), conflicts_with_all = ["shallow_since", "shallow_exclude", "deepen", "unshallow"])] pub depth: Option, - /// Extend the current shallow boundary by the given amount of commits, with 0 meaning no change. + /// Extend the current shallow boundary by the given number of commits, with 0 meaning no change. #[clap(long, help_heading = Some("SHALLOW"), value_name = "DEPTH", conflicts_with_all = ["depth", "shallow_since", "shallow_exclude", "unshallow"])] pub deepen: Option, diff --git a/src/porcelain/options.rs b/src/porcelain/options.rs index 75c287e7bac..595d3ff3bad 100644 --- a/src/porcelain/options.rs +++ b/src/porcelain/options.rs @@ -13,7 +13,7 @@ pub struct Args { /// Bring up a terminal user interface displaying progress visually. #[clap(long, conflicts_with("quiet"))] pub progress: bool, - /// The amount of threads to use. If unset, use all cores, if 0 use al physical cores. + /// The number of threads to use. If unset, use all cores, if 0 use all physical cores. #[clap(short = 't', long)] pub threads: Option, From 212b618c5f99cc75ed612431669dcc2ec4c49a5e Mon Sep 17 00:00:00 2001 From: Sebastian Thiel Date: Thu, 26 Jun 2025 05:10:55 +0200 Subject: [PATCH 140/166] add baseline tests for `_` and `@` in username However, these don't show any differences as we already parsed these correctly, while the recent changes have been about serialization. --- gix-url/tests/fixtures/make_baseline.sh | 4 ++-- gix-url/tests/url/baseline.rs | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/gix-url/tests/fixtures/make_baseline.sh b/gix-url/tests/fixtures/make_baseline.sh index 5c7d4ff00ec..06e783d43d6 100755 --- a/gix-url/tests/fixtures/make_baseline.sh +++ b/gix-url/tests/fixtures/make_baseline.sh @@ -15,7 +15,7 @@ tests_windows=() for path in "repo" "re:po" "re/po"; do # normal urls for protocol in "ssh+git" "git+ssh" "git" "ssh"; do - for host in "host" "user@host" "user@[::1]" "user@::1"; do + for host in "host" "user@host" "user_name@host" "user@[::1]" "user@::1"; do for port_separator in "" ":"; do tests+=("$protocol://$host$port_separator/$path") @@ -42,7 +42,7 @@ for path in "repo" "re:po" "re/po"; do tests+=("./$protocol:$host/~$path") done # SCP like urls - for host in "host" "[::1]"; do + for host in "user@name@host" "user_name@host" "host" "[::1]"; do tests+=("$host:$path") tests+=("$host:/~$path") done diff --git a/gix-url/tests/url/baseline.rs b/gix-url/tests/url/baseline.rs index 1186fa2366a..60e6c09b386 100644 --- a/gix-url/tests/url/baseline.rs +++ b/gix-url/tests/url/baseline.rs @@ -84,7 +84,7 @@ fn run() { } assert!( - failure_count_reserialization <= 42, + failure_count_reserialization <= 63, "the number of reserialization errors should ideally get better, not worse - if this panic is not due to regressions but to new passing test cases, you can set this check to {failure_count_reserialization}" ); assert_eq!(failure_count_roundtrips, 0, "there should be no roundtrip errors"); @@ -185,8 +185,8 @@ mod baseline { pub fn max_num_failures(&self) -> usize { match self { - Kind::Unix => 165, - Kind::Windows => 171, + Kind::Unix => 198, + Kind::Windows => 198 + 6, } } From 7d6e4f05140d5f3d4f44b2e6db0263db1c98b705 Mon Sep 17 00:00:00 2001 From: Sebastian Thiel Date: Thu, 26 Jun 2025 06:47:13 +0200 Subject: [PATCH 141/166] update README landing area --- README.md | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index aa26ba83926..e23f4dc4490 100644 --- a/README.md +++ b/README.md @@ -39,18 +39,20 @@ What follows is a high-level list of features and those which are planned: * [x] clone * [x] fetch -* [ ] blame * [ ] push -* [ ] reset -* [ ] status -* [x] blob-diff +* [x] blame (*plumbing*) +* [x] status +* [x] blob and tree-diff * [ ] merge - [x] blobs - [x] trees - [ ] commits +* [x] commit + - [ ] hooks +* [x] commit-graph traversal * [ ] rebase -* [ ] commit * [x] worktree checkout and worktree stream +* [ ] reset * [x] reading and writing of objects * [x] reading and writing of refs * [x] reading and writing of `.git/index` From 9568c6ef6f280cea107fb1c8e779864b491e3879 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christoph=20R=C3=BC=C3=9Fler?= Date: Thu, 26 Jun 2025 19:29:08 +0200 Subject: [PATCH 142/166] Add --asset_dir to blame-copy-royal --- tests/it/src/args.rs | 4 +++ tests/it/src/commands/blame_copy_royal.rs | 34 +++++++++++++---------- tests/it/src/main.rs | 2 ++ 3 files changed, 26 insertions(+), 14 deletions(-) diff --git a/tests/it/src/args.rs b/tests/it/src/args.rs index d3b1bf75131..145bbd9563b 100644 --- a/tests/it/src/args.rs +++ b/tests/it/src/args.rs @@ -4,6 +4,7 @@ use clap::{ builder::{OsStringValueParser, TypedValueParser}, Arg, Command, Error, }; +use gix::bstr::BString; #[derive(Debug, clap::Parser)] #[clap(name = "it", about = "internal tools to help create test cases")] @@ -51,6 +52,9 @@ pub enum Subcommands { worktree_dir: PathBuf, /// The directory into which to copy the files. destination_dir: PathBuf, + /// The directory to place assets in. + #[clap(long)] + asset_dir: Option, /// The file to extract the history for. file: std::ffi::OsString, /// Do not use `copy-royal` to obfuscate the content of blobs, but copy it verbatim. diff --git a/tests/it/src/commands/blame_copy_royal.rs b/tests/it/src/commands/blame_copy_royal.rs index cef93929a9b..75a31bd90e2 100644 --- a/tests/it/src/commands/blame_copy_royal.rs +++ b/tests/it/src/commands/blame_copy_royal.rs @@ -23,6 +23,7 @@ pub(super) mod function { dry_run: bool, worktree_dir: &Path, destination_dir: PathBuf, + asset_dir: Option, file: &OsStr, Options { verbatim }: Options, ) -> anyhow::Result<()> { @@ -76,7 +77,8 @@ pub(super) mod function { .blame_path .expect("blame path to be present as `debug_track_path == true`"); - let assets = destination_dir.join("assets"); + let asset_dir = asset_dir.unwrap_or("assets".into()); + let assets = destination_dir.join(asset_dir.to_os_str()?); eprintln!("{prefix} create directory '{assets}'", assets = assets.display()); if !dry_run { @@ -107,7 +109,7 @@ pub(super) mod function { } } - let mut blame_script = BlameScript::new(blame_infos, Options { verbatim }); + let mut blame_script = BlameScript::new(blame_infos, asset_dir, Options { verbatim }); blame_script.generate()?; let script_file = destination_dir.join("create-history.sh"); @@ -130,9 +132,9 @@ pub(super) mod function { } enum BlameScriptOperation { - InitRepository, + InitRepository(BString), RemoveFile(String), - CommitFile(BString, ObjectId), + CommitFile(BString, BString, ObjectId), CheckoutTag(ObjectId), PrepareMerge(Vec), CreateTag(ObjectId), @@ -141,7 +143,7 @@ pub(super) mod function { impl Display for BlameScriptOperation { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { match self { - BlameScriptOperation::InitRepository => write!( + BlameScriptOperation::InitRepository(asset_dir) => write!( f, r"#!/bin/sh @@ -149,7 +151,7 @@ set -e git init echo .gitignore >> .gitignore -echo assets/ >> .gitignore +echo {asset_dir}/ >> .gitignore echo create-history.sh >> .gitignore " @@ -160,7 +162,7 @@ echo create-history.sh >> .gitignore git rm {src} " ), - BlameScriptOperation::CommitFile(src, commit_id) => { + BlameScriptOperation::CommitFile(asset_dir, src, commit_id) => { writeln!(f, r"# make file {src} contain content at commit {commit_id}")?; if let Some(pos) = src.rfind_byte(b'/') { let dirname = src[..pos].as_bstr(); @@ -168,8 +170,7 @@ git rm {src} } write!( f, - r"# -cp ./assets/{commit_id}.commit ./{src} + r"cp ./{asset_dir}/{commit_id}.commit ./{src} git add {src} git commit -m {commit_id} " @@ -194,17 +195,19 @@ git commit -m {commit_id} blame_infos: Vec, seen: BTreeSet, script: Vec, + asset_dir: BString, options: Options, } impl BlameScript { - fn new(blame_infos: Vec, options: Options) -> Self { - let script = vec![BlameScriptOperation::InitRepository]; + fn new(blame_infos: Vec, asset_dir: BString, options: Options) -> Self { + let script = vec![BlameScriptOperation::InitRepository(asset_dir.clone())]; Self { blame_infos, seen: BTreeSet::default(), script, + asset_dir, options, } } @@ -265,7 +268,8 @@ git commit -m {commit_id} if let Some(delete_previous_file_operation) = delete_previous_file_operation { self.script.push(delete_previous_file_operation); } - self.script.push(BlameScriptOperation::CommitFile(src, commit_id)); + self.script + .push(BlameScriptOperation::CommitFile(self.asset_dir.clone(), src, commit_id)); } else { let ([first], rest) = parents.split_at(1) else { unreachable!(); @@ -277,7 +281,8 @@ git commit -m {commit_id} if let Some(delete_previous_file_operation) = delete_previous_file_operation { self.script.push(delete_previous_file_operation); } - self.script.push(BlameScriptOperation::CommitFile(src, commit_id)); + self.script + .push(BlameScriptOperation::CommitFile(self.asset_dir.clone(), src, commit_id)); } else { self.script.push(BlameScriptOperation::PrepareMerge( rest.iter().map(|blame_path_entry| blame_path_entry.commit_id).collect(), @@ -286,7 +291,8 @@ git commit -m {commit_id} if let Some(delete_previous_file_operation) = delete_previous_file_operation { self.script.push(delete_previous_file_operation); } - self.script.push(BlameScriptOperation::CommitFile(src, commit_id)); + self.script + .push(BlameScriptOperation::CommitFile(self.asset_dir.clone(), src, commit_id)); } } diff --git a/tests/it/src/main.rs b/tests/it/src/main.rs index 9ce46e98a87..df22a7e8c6f 100644 --- a/tests/it/src/main.rs +++ b/tests/it/src/main.rs @@ -29,12 +29,14 @@ fn main() -> anyhow::Result<()> { dry_run, worktree_dir: worktree_root, destination_dir, + asset_dir, file, verbatim, } => commands::blame_copy_royal( dry_run, &worktree_root, destination_dir, + asset_dir, &file, commands::blame_copy_royal::Options { verbatim }, ), From 73a30f8a91fcf5db1244a9a5388e05f4349b0c2e Mon Sep 17 00:00:00 2001 From: Sebastian Thiel Date: Fri, 27 Jun 2025 05:01:06 +0200 Subject: [PATCH 143/166] Fix CI by not using `-t bad` --- .github/workflows/ci.yml | 1 + .../make_rev_spec_parse_repos.tar | Bin 1125888 -> 1125888 bytes .../fixtures/make_rev_spec_parse_repos.sh | 35 ++++++++++++++++-- 3 files changed, 33 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 46bdb84b19c..ab698934c86 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -298,6 +298,7 @@ jobs: libssl-dev libstdc++6:${{ matrix.runner-arch }} # To support external 64-bit Node.js for actions. pkgconf + python3-minimal ) dpkg --add-architecture ${{ matrix.runner-arch }} apt-get update diff --git a/gix/tests/fixtures/generated-archives/make_rev_spec_parse_repos.tar b/gix/tests/fixtures/generated-archives/make_rev_spec_parse_repos.tar index 580318e487613f19e9e0ac89cdf74d8b06ecf542..bfd170c64aa2817476be80defa78259d41d82f1b 100644 GIT binary patch delta 2740 zcmb7`eNa?Y7{>QpfxUNk@7_gLKwudh5SZlS?k?_vAu6tbh80vZMTJ>vOJnq*k~m80 zxGp-A2y1(ZA>9-hKQI{4dl)1_#t(83Ej2L_W*k#17H1-Ch61|h+-o0B1DC(vzn=HJ z=Xaj-oU^spwzb#RsL=%5^Ji&@s<)aSSD;V?_{P{?bwz1%^uELEVa@l)?;R;^i{afv zy!n3FPjH)u`Uq462Xmp1n5C{!gOam%`>;)wTJI6UVrp_W#}Jy#g7xohELgQVd*z$! zxV~QISt=!kO)@20tgK6Q`e6kh&Mj!AXO~CJstEUS+3yMRRxiNvHktA^+OH|9VBzQUvbtAX=zOv}SNoAs|P;iK;49 zRe8=t)@Np(ymhfrzB~Ryn1IzD#nP6ugu`_Sl&O9GJ&lj|VYDk3mjZZ^0+;5x$)lMST z4-&CTRS{ld#)_&Mv;?Z+5*dCX>~H^UT3PYym1FB})CPyf7Z>)QF5WJ}cGoK{$eam+ zw>bL=B?~J(O79n#OgbqOzdMUu#IYS95;s|>Hp0&`$N_+xWKE%ol?ywpi^omcfC0<1 zWy|Z8CN8K^XZmL&&y(KQ3CmpQ{F2O`^t3Lz-O6|ve}e4y$1t_dv1sv^uKZ-_8| zA3Jr)6;jf(X;s!$SNnsvOY*N4OEA00Ct;o^C75iZ8qv7ntT+N}^dfg)aX? z^F!J4F7ip5MU+JI8YPEj7b(!}p(L8q6$|$wny5-Nn=s7)+wiB>uH#3S=N4td2Se>M zsdxK0<3_C+dhUQFz&%JMBYVaPrwZ)@ltB!JJu0~{cdODwnBxXt&YngJ)~rxTF!xQN zOA4~)oc~y}Qnq}MNL`)~IvzHb+lt&5O%+ z1f0?DZFu3_zBN}Cu8>kUPp$b5IbR)mZ|mseDyq|y@C(A&iJaYed{*bhO zAT6bSGcEUUPta*xghv;R&CyC5#3!I_3i^56e3pq3Z`$L?>5#4Oq*J)mBqmnW2ht{3 zb)NpEmawwWxmNq!q?vQU9Z0i~eP7!vW{$Gf>5sUfDsr>6h}=TII`F}ofZe->p1FCc z)U$uXoZQlU3H@GeDoov>T`Jy;Xhtr)I3^QiwgHSDP~a2?6@g3nU4r&;j9)& zPP%3MT)Q`GlVNfav%HS5nxXRtCU;WZSwUll=04`;3~W;Kf^&C}Nl_J1E#|qX-VzK UHxw3ZggJMa1|S4SU9>;>7aeD|x&QzG delta 2514 zcma);drVVT9LIYukKWt%_O{B)N=b~?LKyKufVl^bp>773>7eW(noTCV=ibX6#;*MJ`{(z) z=XXBmd%ovZk2jAYG-`X3jl{v$;qK}>l z*6Hg9wUwAL4Z4E>_3Ju!mT0H5%+1V;=G&`A1SdFztcy7yfSJ>8-o=q$+ zSah;;$zj+BVf|IG0Mr#@b;Tid#i739FmM_Gh-t!SLQsthpCJHnVM*Z-OOndApe4#Q zjT`69R$+g4s>6IELUmQ0J(jJ&p#vkU8NlhSanM>=tk z2a$sZq08jq%UQYyEaJu4@-(<_1wIaVao!xn8EouPm7W)O0WB{p2r6rl8rW#B%J9#? zkK+?1Sh^XyKEw+G`Oc1g&M;Cv)VJYR)I2Sf{>~mm3ssTUDuLGX`KR`6Z&dCZncmsf zIi@}It7FwHt$zGoT79@k%Si;I0qnaDx%s}i%*NZXLB>y{ z!qgS=OT6>erte(Y!J*`<7zOWhQ6Mjj&?ghWztZ|@s;a*w{;A)F|5)A8(Jf|Pv0QP1 zPfSTxSrn%(MO9GSLeYCNKRelyp11P&6W;3!rox8W*1fpna(m6#Ho)X5bWpccF@BBr zy&R0X(Ltgr9%P7ckYxPGGiyGI3p+UcX|rj=2js#huT+VvN0DOUo+N{vT^pIn>O87M z{>(c`tq{LmbI>hg?KHJmxE-^3&=XX5hP1La6O|-2{Uu~yixgB;6NB) zqDUIjFDOTaKnP=WLkJA20vNkj0Hc-v?5{d;>gHFu9RsItd}i5l?!7wE;k%VKXxpXC z7o43)1*4Nf<)XyY@+OM|sgPYl`Gv$xnS42>0IrUHer5CKG>B7)Hez(xY0BVP-D14+Uz6>L%4B#=YX4AQs)| z3XINxuA_nbkEtd@(W~!O)t2&*l> baseline.git } +function loose-obj() { + # Read content from stdin, compute header and hash, write compressed object + script=$(cat <<'EOF' +import sys +import hashlib +import zlib +import os + +type = sys.argv[1] +objects_dir = sys.argv[2] +content = sys.stdin.buffer.read() +header = f"{type} {len(content)}\0".encode() +full = header + content +sha1 = hashlib.sha1(full).hexdigest() +compressed = zlib.compress(full) + +bucket = f"{objects_dir}/" + sha1[:2] +filename = sha1[2:] + +os.makedirs(bucket, exist_ok=True) +with open(f"{bucket}/{filename}", "wb") as f: + f.write(compressed) + +print(sha1) +EOF +) + python3 -c "$script" "$@" +} + # The contents of this file is based on https://github.com/git/git/blob/8168d5e9c23ed44ae3d604f392320d66556453c9/t/t1512-rev-parse-disambiguation.sh#L38 git init --bare blob.prefix ( @@ -31,11 +60,11 @@ git init --bare blob.bad cd blob.bad # Both have the prefix "bad0" # Maybe one day we have a test to see how disambiguation reporting deals with this. - echo xyzfaowcoh | git hash-object -t bad -w --stdin --literally - echo xyzhjpyvwl | git hash-object -t bad -w --stdin --literally + echo xyzfaowcoh | loose-obj bad objects + echo xyzhjpyvwl | loose-obj bad objects baseline "bad0" - echo 1bbfctrkc | git hash-object -t bad -w --stdin --literally + echo 1bbfctrkc | loose-obj bad objects baseline "e328" baseline "e328^{object}" ) From 92751b725e9ce9f6915577fbdf50f1fac9e8db41 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christoph=20R=C3=BC=C3=9Fler?= Date: Fri, 27 Jun 2025 09:03:51 +0200 Subject: [PATCH 144/166] Add test for file with two roots --- gix-blame/tests/blame.rs | 31 ++++++++++++++ .../make_blame_two_roots_repo.tar | Bin 0 -> 90624 bytes .../fixtures/make_blame_two_roots_repo.sh | 40 ++++++++++++++++++ 3 files changed, 71 insertions(+) create mode 100644 gix-blame/tests/fixtures/generated-archives/make_blame_two_roots_repo.tar create mode 100755 gix-blame/tests/fixtures/make_blame_two_roots_repo.sh diff --git a/gix-blame/tests/blame.rs b/gix-blame/tests/blame.rs index cdd91f852a9..d32d316ee53 100644 --- a/gix-blame/tests/blame.rs +++ b/gix-blame/tests/blame.rs @@ -333,6 +333,37 @@ fn diff_disparity() { } } +#[test] +fn file_that_was_added_in_two_branches() -> gix_testtools::Result { + let worktree_path = gix_testtools::scripted_fixture_read_only("make_blame_two_roots_repo.sh")?; + + let Fixture { + odb, + mut resource_cache, + suspect, + } = Fixture::for_worktree_path(worktree_path.to_path_buf())?; + + let source_file_name = "file-with-two-roots.txt"; + let lines_blamed = gix_blame::file( + &odb, + suspect, + None, + &mut resource_cache, + source_file_name.into(), + gix_blame::Options::default(), + )? + .entries; + + assert_eq!(lines_blamed.len(), 4); + + let git_dir = worktree_path.join(".git"); + let baseline = Baseline::collect(git_dir.join("file-with-two-roots.baseline"), source_file_name.into())?; + + pretty_assertions::assert_eq!(lines_blamed, baseline); + + Ok(()) +} + #[test] fn since() -> gix_testtools::Result { let Fixture { diff --git a/gix-blame/tests/fixtures/generated-archives/make_blame_two_roots_repo.tar b/gix-blame/tests/fixtures/generated-archives/make_blame_two_roots_repo.tar new file mode 100644 index 0000000000000000000000000000000000000000..bd43717b012224066d2bd15c7c052caca1c071e3 GIT binary patch literal 90624 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 F{C{XTqs#yR literal 0 HcmV?d00001 diff --git a/gix-blame/tests/fixtures/make_blame_two_roots_repo.sh b/gix-blame/tests/fixtures/make_blame_two_roots_repo.sh new file mode 100755 index 00000000000..e59beb6c3da --- /dev/null +++ b/gix-blame/tests/fixtures/make_blame_two_roots_repo.sh @@ -0,0 +1,40 @@ +#!/usr/bin/env bash +set -eu -o pipefail + +git init -q +git config --local diff.algorithm histogram + +git config merge.ff false + +git checkout -q -b main + +seq 1 4 > unrelated-file.txt +git add unrelated-file.txt +git commit -q -m c1 + +seq 1 4 > file-with-two-roots.txt +git add file-with-two-roots.txt +git commit -q -m c2 + +seq 1 5 > file-with-two-roots.txt +git add file-with-two-roots.txt +git commit -q -m c3 + +git checkout -b different-branch +git reset --hard HEAD~2 + +seq 4 6 > file-with-two-roots.txt +git add file-with-two-roots.txt +git commit -q -m c10 + +seq 4 8 > file-with-two-roots.txt +git add file-with-two-roots.txt +git commit -q -m c11 + +git checkout main +git merge different-branch || true +seq 1 8 > file-with-two-roots.txt +git add file-with-two-roots.txt +git commit -q -m c20 + +git blame --porcelain file-with-two-roots.txt > .git/file-with-two-roots.baseline From 770db9c263da0f099b17943d9ca3359c78186c28 Mon Sep 17 00:00:00 2001 From: Eliah Kagan Date: Wed, 2 Jul 2025 01:14:22 -0400 Subject: [PATCH 145/166] Get only patch version updates to `imara-diff` This configures Dependabot version updates to keep `imara-diff` at 0.1.*. It does not affect Dependabot security updates, nor other ways of updating besides Dependabot, nor other crate dependencies if they are unrelated to `imara-diff`. See: - https://github.blog/changelog/2021-05-21-dependabot-version-updates-can-now-ignore-major-minor-patch-releases/ - https://docs.github.com/en/code-security/dependabot/working-with-dependabot/dependabot-options-reference#ignore-- This is by the same technique as used in: https://github.com/GitoxideLabs/cargo-smart-release/commit/aeb91ee22bcd8aadd64a3261e3de2ed985c99485 See discussion in #2068 for details for why we are not upgrading `imara-diff` to 0.2 at this time. --- .github/dependabot.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 9946b189a3f..f54c2a3097b 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -9,6 +9,12 @@ updates: prefix: '' allow: - dependency-type: all + ignore: + # Keep imara-diff at 0.1.* for now (see comments in #2068). + - dependency-name: imara-diff + update-types: + - 'version-update:semver-major' + - 'version-update:semver-minor' groups: cargo: patterns: ['*'] From a9a8ea1472532dde03bce4e0afdfa82924af1f96 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 2 Jul 2025 07:37:14 +0000 Subject: [PATCH 146/166] Bump the cargo group across 1 directory with 68 updates --- updated-dependencies: - dependency-name: clap dependency-version: 4.5.40 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: cargo - dependency-name: clap_complete dependency-version: 4.5.54 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: cargo - dependency-name: prodash dependency-version: 30.0.1 dependency-type: direct:production update-type: version-update:semver-major dependency-group: cargo - dependency-name: smallvec dependency-version: 1.15.1 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: cargo - dependency-name: libc dependency-version: 0.2.174 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: cargo - dependency-name: tracing-core dependency-version: 0.1.34 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: cargo - dependency-name: jiff dependency-version: 0.2.15 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: cargo - dependency-name: portable-atomic dependency-version: 1.11.1 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: cargo - dependency-name: syn dependency-version: 2.0.104 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: cargo - dependency-name: curl dependency-version: 0.4.48 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: cargo - dependency-name: reqwest dependency-version: 0.12.22 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: cargo - dependency-name: windows dependency-version: 0.61.3 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: cargo - dependency-name: fs-err dependency-version: 3.1.1 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: cargo - dependency-name: sysinfo dependency-version: 0.35.2 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: cargo - dependency-name: zip dependency-version: 4.2.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: cargo - dependency-name: anstream dependency-version: 0.6.19 dependency-type: indirect update-type: version-update:semver-patch dependency-group: cargo - dependency-name: anstyle dependency-version: 1.0.11 dependency-type: indirect update-type: version-update:semver-patch dependency-group: cargo - dependency-name: anstyle-parse dependency-version: 0.2.7 dependency-type: indirect update-type: version-update:semver-patch dependency-group: cargo - dependency-name: anstyle-query dependency-version: 1.1.3 dependency-type: indirect update-type: version-update:semver-patch dependency-group: cargo - dependency-name: anstyle-wincon dependency-version: 3.0.9 dependency-type: indirect update-type: version-update:semver-patch dependency-group: cargo - dependency-name: autocfg dependency-version: 1.5.0 dependency-type: indirect update-type: version-update:semver-minor dependency-group: cargo - dependency-name: bumpalo dependency-version: 3.19.0 dependency-type: indirect update-type: version-update:semver-minor dependency-group: cargo - dependency-name: cc dependency-version: 1.2.27 dependency-type: indirect update-type: version-update:semver-patch dependency-group: cargo - dependency-name: clap_builder dependency-version: 4.5.40 dependency-type: indirect update-type: version-update:semver-patch dependency-group: cargo - dependency-name: clap_derive dependency-version: 4.5.40 dependency-type: indirect update-type: version-update:semver-patch dependency-group: cargo - dependency-name: clap_lex dependency-version: 0.7.5 dependency-type: indirect update-type: version-update:semver-patch dependency-group: cargo - dependency-name: colorchoice dependency-version: 1.0.4 dependency-type: indirect update-type: version-update:semver-patch dependency-group: cargo - dependency-name: crunchy dependency-version: 0.2.4 dependency-type: indirect update-type: version-update:semver-patch dependency-group: cargo - dependency-name: curl-sys dependency-version: 0.4.82+curl-8.14.1 dependency-type: indirect update-type: version-update:semver-patch dependency-group: cargo - dependency-name: errno dependency-version: 0.3.13 dependency-type: indirect update-type: version-update:semver-patch dependency-group: cargo - dependency-name: h2 dependency-version: 0.4.11 dependency-type: indirect update-type: version-update:semver-patch dependency-group: cargo - dependency-name: hermit-abi dependency-version: 0.5.2 dependency-type: indirect update-type: version-update:semver-patch dependency-group: cargo - dependency-name: hyper-rustls dependency-version: 0.27.7 dependency-type: indirect update-type: version-update:semver-patch dependency-group: cargo - dependency-name: hyper-util dependency-version: 0.1.14 dependency-type: indirect update-type: version-update:semver-patch dependency-group: cargo - dependency-name: indexmap dependency-version: 2.10.0 dependency-type: indirect update-type: version-update:semver-minor dependency-group: cargo - dependency-name: jiff-static dependency-version: 0.2.15 dependency-type: indirect update-type: version-update:semver-patch dependency-group: cargo - dependency-name: jni dependency-version: 0.21.1 dependency-type: indirect update-type: version-update:semver-minor dependency-group: cargo - dependency-name: libredox dependency-version: 0.1.4 dependency-type: indirect update-type: version-update:semver-patch dependency-group: cargo - dependency-name: prettyplease dependency-version: 0.2.35 dependency-type: indirect update-type: version-update:semver-patch dependency-group: cargo - dependency-name: quinn-udp dependency-version: 0.5.13 dependency-type: indirect update-type: version-update:semver-patch dependency-group: cargo - dependency-name: r-efi dependency-version: 5.3.0 dependency-type: indirect update-type: version-update:semver-minor dependency-group: cargo - dependency-name: redox_syscall dependency-version: 0.5.13 dependency-type: indirect update-type: version-update:semver-patch dependency-group: cargo - dependency-name: rustc-demangle dependency-version: 0.1.25 dependency-type: indirect update-type: version-update:semver-patch dependency-group: cargo - dependency-name: rustls dependency-version: 0.23.28 dependency-type: indirect update-type: version-update:semver-patch dependency-group: cargo - dependency-name: rustls-ffi dependency-version: 0.15.0 dependency-type: indirect update-type: version-update:semver-minor dependency-group: cargo - dependency-name: rustls-native-certs dependency-version: 0.8.1 dependency-type: indirect update-type: version-update:semver-minor dependency-group: cargo - dependency-name: rustls-platform-verifier dependency-version: 0.5.3 dependency-type: indirect update-type: version-update:semver-minor dependency-group: cargo - dependency-name: rustls-webpki dependency-version: 0.103.3 dependency-type: indirect update-type: version-update:semver-minor dependency-group: cargo - dependency-name: serde_spanned dependency-version: 0.6.9 dependency-type: indirect update-type: version-update:semver-patch dependency-group: cargo - dependency-name: slab dependency-version: 0.4.10 dependency-type: indirect update-type: version-update:semver-patch dependency-group: cargo - dependency-name: thread_local dependency-version: 1.1.9 dependency-type: indirect update-type: version-update:semver-patch dependency-group: cargo - dependency-name: toml dependency-version: 0.8.23 dependency-type: indirect update-type: version-update:semver-patch dependency-group: cargo - dependency-name: toml_datetime dependency-version: 0.6.11 dependency-type: indirect update-type: version-update:semver-patch dependency-group: cargo - dependency-name: toml_edit dependency-version: 0.22.27 dependency-type: indirect update-type: version-update:semver-patch dependency-group: cargo - dependency-name: toml_write dependency-version: 0.1.2 dependency-type: indirect update-type: version-update:semver-patch dependency-group: cargo - dependency-name: tower-http dependency-version: 0.6.6 dependency-type: indirect update-type: version-update:semver-patch dependency-group: cargo - dependency-name: tracing-attributes dependency-version: 0.1.30 dependency-type: indirect update-type: version-update:semver-patch dependency-group: cargo - dependency-name: wasi dependency-version: 0.11.1+wasi-snapshot-preview1 dependency-type: indirect update-type: version-update:semver-patch dependency-group: cargo - dependency-name: webpki-roots dependency-version: 1.0.0 dependency-type: indirect update-type: version-update:semver-major dependency-group: cargo - dependency-name: windows-core dependency-version: 0.61.2 dependency-type: indirect update-type: version-update:semver-patch dependency-group: cargo - dependency-name: windows-future dependency-version: 0.2.1 dependency-type: indirect update-type: version-update:semver-patch dependency-group: cargo - dependency-name: windows-link dependency-version: 0.1.3 dependency-type: indirect update-type: version-update:semver-patch dependency-group: cargo - dependency-name: windows-registry dependency-version: 0.5.3 dependency-type: indirect update-type: version-update:semver-minor dependency-group: cargo - dependency-name: windows-result dependency-version: 0.3.4 dependency-type: indirect update-type: version-update:semver-patch dependency-group: cargo - dependency-name: windows-strings dependency-version: 0.4.2 dependency-type: indirect update-type: version-update:semver-minor dependency-group: cargo - dependency-name: xattr dependency-version: 1.5.1 dependency-type: indirect update-type: version-update:semver-patch dependency-group: cargo - dependency-name: zerocopy dependency-version: 0.8.26 dependency-type: indirect update-type: version-update:semver-patch dependency-group: cargo - dependency-name: zerocopy-derive dependency-version: 0.8.26 dependency-type: indirect update-type: version-update:semver-patch dependency-group: cargo ... Signed-off-by: dependabot[bot] --- Cargo.lock | 546 +++++++++++++++++--------------------- Cargo.toml | 6 +- gitoxide-core/Cargo.toml | 6 +- gix-archive/Cargo.toml | 4 +- gix-attributes/Cargo.toml | 2 +- gix-blame/Cargo.toml | 2 +- gix-config/Cargo.toml | 2 +- gix-date/Cargo.toml | 4 +- gix-features/Cargo.toml | 4 +- gix-filter/Cargo.toml | 2 +- gix-index/Cargo.toml | 4 +- gix-negotiate/Cargo.toml | 2 +- gix-object/Cargo.toml | 2 +- gix-pack/Cargo.toml | 2 +- gix-path/Cargo.toml | 2 +- gix-refspec/Cargo.toml | 2 +- gix-revwalk/Cargo.toml | 2 +- gix-sec/Cargo.toml | 2 +- gix-tempfile/Cargo.toml | 2 +- gix-trace/Cargo.toml | 2 +- gix-transport/Cargo.toml | 2 +- gix-traverse/Cargo.toml | 2 +- gix/Cargo.toml | 4 +- tests/it/Cargo.toml | 2 +- 24 files changed, 270 insertions(+), 340 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index c4b6e45c433..a809a7fba01 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -49,9 +49,9 @@ dependencies = [ [[package]] name = "anstream" -version = "0.6.18" +version = "0.6.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b" +checksum = "301af1932e46185686725e0fad2f8f2aa7da69dd70bf6ecc44d6b703844a3933" dependencies = [ "anstyle", "anstyle-parse", @@ -64,33 +64,33 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.10" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" +checksum = "862ed96ca487e809f1c8e5a8447f6ee2cf102f846893800b20cebdf541fc6bbd" [[package]] name = "anstyle-parse" -version = "0.2.6" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9" +checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2" dependencies = [ "utf8parse", ] [[package]] name = "anstyle-query" -version = "1.1.2" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" +checksum = "6c8bdeb6047d8983be085bab0ba1472e6dc604e7041dbf6fcd5e71523014fae9" dependencies = [ "windows-sys 0.59.0", ] [[package]] name = "anstyle-wincon" -version = "3.0.8" +version = "3.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6680de5231bd6ee4c6191b8a1325daa282b415391ec9d3a37bd34f2060dc73fa" +checksum = "403f75924867bb1033c59fbf0797484329750cfbe3c4325cd33127941fabc882" dependencies = [ "anstyle", "once_cell_polyfill", @@ -274,7 +274,7 @@ checksum = "e539d3fca749fcee5236ab05e93a52867dd549cc157c8cb7f99595f3cedffdb5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.103", + "syn 2.0.104", ] [[package]] @@ -285,9 +285,9 @@ checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" [[package]] name = "autocfg" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" [[package]] name = "aws-lc-rs" @@ -342,7 +342,7 @@ dependencies = [ "bitflags 2.9.1", "cexpr", "clang-sys", - "itertools 0.12.1", + "itertools 0.10.5", "lazy_static", "lazycell", "log", @@ -352,7 +352,7 @@ dependencies = [ "regex", "rustc-hash 1.1.0", "shlex", - "syn 2.0.103", + "syn 2.0.104", "which", ] @@ -406,9 +406,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.17.0" +version = "3.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" +checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" [[package]] name = "byteorder" @@ -460,9 +460,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.25" +version = "1.2.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0fc897dc1e865cc67c0e05a836d9d3f1df3cbe442aa4a9473b18e12624a4951" +checksum = "d487aa071b5f64da6f19a3e848e3578944b726ee5a4854b82172f02aa876bfdc" dependencies = [ "jobserver", "libc", @@ -536,9 +536,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.39" +version = "4.5.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd60e63e9be68e5fb56422e397cf9baddded06dae1d2e523401542383bc72a9f" +checksum = "40b6887a1d8685cebccf115538db5c0efe625ccac9696ad45c409d96566e910f" dependencies = [ "clap_builder", "clap_derive", @@ -546,9 +546,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.39" +version = "4.5.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89cc6392a1f72bbeb820d71f32108f61fdaf18bc526e1d23954168a67759ef51" +checksum = "e0c66c08ce9f0c698cbce5c0279d0bb6ac936d8674174fe48f736533b964f59e" dependencies = [ "anstream", "anstyle", @@ -558,30 +558,30 @@ dependencies = [ [[package]] name = "clap_complete" -version = "4.5.52" +version = "4.5.54" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a554639e42d0c838336fc4fbedb9e2df3ad1fa4acda149f9126b4ccfcd7900f" +checksum = "aad5b1b4de04fead402672b48897030eec1f3bfe1550776322f59f6d6e6a5677" dependencies = [ "clap", ] [[package]] name = "clap_derive" -version = "4.5.32" +version = "4.5.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09176aae279615badda0765c0c0b3f6ed53f4709118af73cf4655d85d1530cd7" +checksum = "d2c7947ae4cc3d851207c1adb5b5e260ff0cca11446b1d6d1423788e442257ce" dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.103", + "syn 2.0.104", ] [[package]] name = "clap_lex" -version = "0.7.4" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6" +checksum = "b94f61472cee1439c0b966b47e3aca9ae07e45d070759512cd390ea2bebc6675" [[package]] name = "clru" @@ -600,9 +600,9 @@ dependencies = [ [[package]] name = "colorchoice" -version = "1.0.3" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" +checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" [[package]] name = "combine" @@ -667,6 +667,16 @@ dependencies = [ "libc", ] +[[package]] +name = "core-foundation" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "core-foundation-sys" version = "0.8.7" @@ -839,9 +849,9 @@ dependencies = [ [[package]] name = "crunchy" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43da5946c66ffcc7745f48db692ffbb10a83bfe0afd96235c5c2a4fb23994929" +checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" [[package]] name = "crypto-common" @@ -855,9 +865,9 @@ dependencies = [ [[package]] name = "curl" -version = "0.4.47" +version = "0.4.48" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9fb4d13a1be2b58f14d60adba57c9834b78c62fd86c3e76a148f732686e9265" +checksum = "9e2d5c8f48d9c0c23250e52b55e82a6ab4fdba6650c931f5a0a57a43abda812b" dependencies = [ "curl-sys", "libc", @@ -865,14 +875,14 @@ dependencies = [ "openssl-sys", "schannel", "socket2", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] name = "curl-sys" -version = "0.4.80+curl-8.12.1" +version = "0.4.82+curl-8.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55f7df2eac63200c3ab25bde3b2268ef2ee56af3d238e76d61f01c3c49bff734" +checksum = "c4d63638b5ec65f1a4ae945287b3fd035be4554bbaf211901159c9a2a74fb5be" dependencies = [ "cc", "libc", @@ -881,7 +891,7 @@ dependencies = [ "pkg-config", "rustls-ffi", "vcpkg", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -912,7 +922,7 @@ checksum = "30542c1ad912e0e3d22a1935c290e12e8a29d704a420177a31faad4a601a0800" dependencies = [ "proc-macro2", "quote", - "syn 2.0.103", + "syn 2.0.104", ] [[package]] @@ -939,7 +949,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.103", + "syn 2.0.104", ] [[package]] @@ -1008,12 +1018,12 @@ checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" [[package]] name = "errno" -version = "0.3.12" +version = "0.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cea14ef9355e3beab063703aa9dab15afd25f0667c341310c1e5274bb1d0da18" +checksum = "778e2ac28f6c47af28e4907f13ffd1e1ddbd400980a9abd7c8df189bf578a5ad" dependencies = [ "libc", - "windows-sys 0.59.0", + "windows-sys 0.52.0", ] [[package]] @@ -1144,9 +1154,9 @@ dependencies = [ [[package]] name = "fs-err" -version = "3.1.0" +version = "3.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f89bda4c2a21204059a977ed3bfe746677dfd137b83c339e702b0ac91d482aa" +checksum = "88d7be93788013f265201256d58f04936a8079ad5dc898743aa20525f503b683" dependencies = [ "autocfg", ] @@ -1266,7 +1276,7 @@ dependencies = [ "cfg-if", "js-sys", "libc", - "wasi 0.11.0+wasi-snapshot-preview1", + "wasi 0.11.1+wasi-snapshot-preview1", "wasm-bindgen", ] @@ -1911,7 +1921,7 @@ version = "0.1.5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.103", + "syn 2.0.104", "trybuild", ] @@ -2129,7 +2139,7 @@ dependencies = [ "once_cell", "serial_test", "thiserror 2.0.12", - "windows 0.61.1", + "windows 0.61.3", "winreg", ] @@ -2649,9 +2659,9 @@ dependencies = [ [[package]] name = "h2" -version = "0.4.10" +version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9421a676d1b147b16b82c9225157dc629087ef8ec4d5e2960f9437a90dac0a5" +checksum = "17da50a276f1e01e0ba6c029e47b7100754904ee8a278f886546e98575380785" dependencies = [ "atomic-waker", "bytes", @@ -2729,9 +2739,9 @@ checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] name = "hermit-abi" -version = "0.5.0" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbd780fe5cc30f81464441920d82ac8740e2e46b29a6fad543ddd075229ce37e" +checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" [[package]] name = "home" @@ -2810,9 +2820,9 @@ dependencies = [ [[package]] name = "hyper-rustls" -version = "0.27.6" +version = "0.27.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03a01595e11bdcec50946522c32dde3fc6914743000a68b93000965f2f02406d" +checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58" dependencies = [ "http", "hyper", @@ -2822,7 +2832,7 @@ dependencies = [ "tokio", "tokio-rustls", "tower-service", - "webpki-roots 1.0.0", + "webpki-roots", ] [[package]] @@ -2843,9 +2853,9 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.13" +version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1c293b6b3d21eca78250dc7dbebd6b9210ec5530e038cbfe0661b5c47ab06e8" +checksum = "dc2fdfdbff08affe55bb779f33b053aa1fe5dd5b54c257343c17edfa55711bdb" dependencies = [ "base64", "bytes", @@ -2985,9 +2995,9 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.9.0" +version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e" +checksum = "fe4cd85333e22411419a0bcae1297d25e58c9443848b11dc6a86fefe8c78a661" dependencies = [ "equivalent", "hashbrown 0.15.4", @@ -3058,7 +3068,7 @@ checksum = "e04d7f318608d35d4b61ddd75cbdaee86b023ebe2bd5a66ee0915f0bf93095a9" dependencies = [ "hermit-abi", "libc", - "windows-sys 0.59.0", + "windows-sys 0.52.0", ] [[package]] @@ -3118,9 +3128,9 @@ checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" [[package]] name = "jiff" -version = "0.2.14" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a194df1107f33c79f4f93d02c80798520551949d59dfad22b6157048a88cca93" +checksum = "be1f93b8b1eb69c77f24bbb0afdf66f54b632ee39af40ca21c4365a1d7347e49" dependencies = [ "jiff-static", "jiff-tzdb-platform", @@ -3128,18 +3138,18 @@ dependencies = [ "portable-atomic", "portable-atomic-util", "serde", - "windows-sys 0.59.0", + "windows-sys 0.52.0", ] [[package]] name = "jiff-static" -version = "0.2.14" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c6e1db7ed32c6c71b759497fae34bf7933636f75a251b9e736555da426f6442" +checksum = "03343451ff899767262ec32146f6d559dd759fdadf42ff0e227c7c48f72594b4" dependencies = [ "proc-macro2", "quote", - "syn 2.0.103", + "syn 2.0.104", ] [[package]] @@ -3159,16 +3169,18 @@ dependencies = [ [[package]] name = "jni" -version = "0.19.0" +version = "0.21.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6df18c2e3db7e453d3c6ac5b3e9d5182664d28788126d39b91f2d1e22b017ec" +checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" dependencies = [ "cesu8", + "cfg-if", "combine", "jni-sys", "log", "thiserror 1.0.69", "walkdir", + "windows-sys 0.45.0", ] [[package]] @@ -3255,9 +3267,9 @@ checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" [[package]] name = "libc" -version = "0.2.172" +version = "0.2.174" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa" +checksum = "1171693293099992e19cddea4e8b849964e9846f4acee11b3948bcc337be8776" [[package]] name = "libloading" @@ -3266,14 +3278,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "07033963ba89ebaf1584d767badaa2e8fcec21aedea6b8c0346d487d49c28667" dependencies = [ "cfg-if", - "windows-targets 0.53.0", + "windows-targets 0.48.5", ] [[package]] name = "libredox" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" +checksum = "1580801010e535496706ba011c15f8532df6b42297d2e471fec38ceadd8c0638" dependencies = [ "bitflags 2.9.1", "libc", @@ -3395,7 +3407,7 @@ checksum = "5cf92c10c7e361d6b99666ec1c6f9805b0bea2c3bd8c78dc6fe98ac5bd78db11" dependencies = [ "proc-macro2", "quote", - "syn 2.0.103", + "syn 2.0.104", ] [[package]] @@ -3451,7 +3463,7 @@ checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" dependencies = [ "libc", "log", - "wasi 0.11.0+wasi-snapshot-preview1", + "wasi 0.11.1+wasi-snapshot-preview1", "windows-sys 0.48.0", ] @@ -3462,7 +3474,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" dependencies = [ "libc", - "wasi 0.11.0+wasi-snapshot-preview1", + "wasi 0.11.1+wasi-snapshot-preview1", "windows-sys 0.52.0", ] @@ -3478,7 +3490,7 @@ dependencies = [ "openssl-probe", "openssl-sys", "schannel", - "security-framework", + "security-framework 2.11.1", "security-framework-sys", "tempfile", ] @@ -3525,25 +3537,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "num-bigint" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" -dependencies = [ - "num-integer", - "num-traits", -] - -[[package]] -name = "num-integer" -version = "0.1.46" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" -dependencies = [ - "num-traits", -] - [[package]] name = "num-traits" version = "0.2.19" @@ -3633,7 +3626,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.103", + "syn 2.0.104", ] [[package]] @@ -3787,9 +3780,9 @@ dependencies = [ [[package]] name = "portable-atomic" -version = "1.11.0" +version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "350e9b48cbc6b0e028b0473b114454c6316e57336ee184ceab6e53f72c178b3e" +checksum = "f84267b20a16ea918e43c6a88433c2d54fa145c92a811b5b047ccbe153674483" [[package]] name = "portable-atomic-util" @@ -3830,12 +3823,12 @@ dependencies = [ [[package]] name = "prettyplease" -version = "0.2.33" +version = "0.2.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9dee91521343f4c5c6a63edd65e54f31f5c92fe8978c40a4282f8372194c6a7d" +checksum = "061c1221631e079b26479d25bbf2275bfe5917ae8419cd7e34f13bfc2aa7539a" dependencies = [ "proc-macro2", - "syn 2.0.103", + "syn 2.0.104", ] [[package]] @@ -3849,9 +3842,9 @@ dependencies = [ [[package]] name = "prodash" -version = "29.0.2" +version = "30.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f04bb108f648884c23b98a0e940ebc2c93c0c3b89f04dbaf7eb8256ce617d1bc" +checksum = "5a6efc566849d3d9d737c5cb06cc50e48950ebe3d3f9d70631490fff3a07b139" dependencies = [ "async-io", "bytesize", @@ -3922,16 +3915,16 @@ dependencies = [ [[package]] name = "quinn-udp" -version = "0.5.12" +version = "0.5.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee4e529991f949c5e25755532370b8af5d114acae52326361d68d47af64aa842" +checksum = "fcebb1209ee276352ef14ff8732e24cc2b02bbac986cd74a4c81bcb2f9881970" dependencies = [ "cfg_aliases", "libc", "once_cell", "socket2", "tracing", - "windows-sys 0.59.0", + "windows-sys 0.52.0", ] [[package]] @@ -3945,9 +3938,9 @@ dependencies = [ [[package]] name = "r-efi" -version = "5.2.0" +version = "5.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" [[package]] name = "rand" @@ -4020,9 +4013,9 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.12" +version = "0.5.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "928fca9cf2aa042393a8325b9ead81d2f0df4cb12e1e24cef072922ccd99c5af" +checksum = "0d04b7d0ee6b4a0207a0a7adb104d23ecb0b47d6beae7152d0fa34b692b29fd6" dependencies = [ "bitflags 2.9.1", ] @@ -4058,9 +4051,9 @@ checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" [[package]] name = "reqwest" -version = "0.12.18" +version = "0.12.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e98ff6b0dbbe4d5a37318f433d4fc82babd21631f194d370409ceb2e40b2f0b5" +checksum = "cbc931937e6ca3a06e3b6c0aa7841849b160a90351d6ab467a8b9b9959767531" dependencies = [ "base64", "bytes", @@ -4076,12 +4069,10 @@ dependencies = [ "hyper-rustls", "hyper-tls", "hyper-util", - "ipnet", "js-sys", "log", "mime", "native-tls", - "once_cell", "percent-encoding", "pin-project-lite", "quinn", @@ -4101,7 +4092,7 @@ dependencies = [ "wasm-bindgen", "wasm-bindgen-futures", "web-sys", - "webpki-roots 1.0.0", + "webpki-roots", ] [[package]] @@ -4134,9 +4125,9 @@ dependencies = [ [[package]] name = "rustc-demangle" -version = "0.1.24" +version = "0.1.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" +checksum = "989e6739f80c4ad5b13e0fd7fe89531180375b18520cc8c82080e4dc4035b84f" [[package]] name = "rustc-hash" @@ -4160,7 +4151,7 @@ dependencies = [ "errno", "libc", "linux-raw-sys 0.4.15", - "windows-sys 0.59.0", + "windows-sys 0.52.0", ] [[package]] @@ -4173,59 +4164,47 @@ dependencies = [ "errno", "libc", "linux-raw-sys 0.9.3", - "windows-sys 0.59.0", + "windows-sys 0.52.0", ] [[package]] name = "rustls" -version = "0.23.27" +version = "0.23.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "730944ca083c1c233a75c09f199e973ca499344a2b7ba9e755c457e86fb4a321" +checksum = "7160e3e10bf4535308537f3c4e1641468cd0e485175d6163087c0393c7d46643" dependencies = [ "aws-lc-rs", "once_cell", "ring", "rustls-pki-types", - "rustls-webpki 0.103.3", + "rustls-webpki", "subtle", "zeroize", ] [[package]] name = "rustls-ffi" -version = "0.14.1" +version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c916a3be537e52de0f3e311048dd1cfbdb2972048b1417d6088826d7d1477ec2" +checksum = "4128514cb6472050cba340cdac098a235c53e6aad276737ce1d7b24a19260392" dependencies = [ "libc", "log", "rustls", - "rustls-pemfile", - "rustls-pki-types", "rustls-platform-verifier", - "rustls-webpki 0.102.8", + "rustls-webpki", ] [[package]] name = "rustls-native-certs" -version = "0.7.3" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5bfb394eeed242e909609f56089eecfe5fda225042e8b171791b9c95f5931e5" +checksum = "7fcff2dd52b58a8d98a70243663a0d234c4e2b79235637849d15913394a247d3" dependencies = [ "openssl-probe", - "rustls-pemfile", "rustls-pki-types", "schannel", - "security-framework", -] - -[[package]] -name = "rustls-pemfile" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" -dependencies = [ - "rustls-pki-types", + "security-framework 3.2.0", ] [[package]] @@ -4240,11 +4219,11 @@ dependencies = [ [[package]] name = "rustls-platform-verifier" -version = "0.3.4" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afbb878bdfdf63a336a5e63561b1835e7a8c91524f51621db870169eac84b490" +checksum = "19787cda76408ec5404443dc8b31795c87cd8fec49762dc75fa727740d34acc1" dependencies = [ - "core-foundation", + "core-foundation 0.10.1", "core-foundation-sys", "jni", "log", @@ -4252,11 +4231,11 @@ dependencies = [ "rustls", "rustls-native-certs", "rustls-platform-verifier-android", - "rustls-webpki 0.102.8", - "security-framework", + "rustls-webpki", + "security-framework 3.2.0", "security-framework-sys", - "webpki-roots 0.26.11", - "winapi", + "webpki-root-certs 0.26.11", + "windows-sys 0.52.0", ] [[package]] @@ -4265,18 +4244,6 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f87165f0995f63a9fbeea62b64d10b4d9d8e78ec6d7d51fb2125fda7bb36788f" -[[package]] -name = "rustls-webpki" -version = "0.102.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9" -dependencies = [ - "aws-lc-rs", - "ring", - "rustls-pki-types", - "untrusted", -] - [[package]] name = "rustls-webpki" version = "0.103.3" @@ -4347,10 +4314,22 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" dependencies = [ "bitflags 2.9.1", - "core-foundation", + "core-foundation 0.9.4", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "271720403f46ca04f7ba6f55d438f8bd878d6b8ca0a1046e8228c4145bcbb316" +dependencies = [ + "bitflags 2.9.1", + "core-foundation 0.10.1", "core-foundation-sys", "libc", - "num-bigint", "security-framework-sys", ] @@ -4381,7 +4360,7 @@ checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" dependencies = [ "proc-macro2", "quote", - "syn 2.0.103", + "syn 2.0.104", ] [[package]] @@ -4398,9 +4377,9 @@ dependencies = [ [[package]] name = "serde_spanned" -version = "0.6.8" +version = "0.6.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" +checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3" dependencies = [ "serde", ] @@ -4439,7 +4418,7 @@ checksum = "5d69265a08751de7844521fd15003ae0a888e035773ba05695c5c759a6f89eef" dependencies = [ "proc-macro2", "quote", - "syn 2.0.103", + "syn 2.0.104", ] [[package]] @@ -4522,18 +4501,15 @@ checksum = "bbbb5d9659141646ae647b42fe094daf6c6192d1620870b449d9557f748b2daa" [[package]] name = "slab" -version = "0.4.9" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" -dependencies = [ - "autocfg", -] +checksum = "04dc19736151f35336d325007ac991178d504a119863a2fcb3758cdb5e52c50d" [[package]] name = "smallvec" -version = "1.15.0" +version = "1.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8917285742e9f3e1683f0a9c4e6b57960b7314d0b08d30d1ecd426713ee2eee9" +checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" dependencies = [ "serde", ] @@ -4555,7 +4531,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d904e7009df136af5297832a3ace3370cd14ff1546a232f4f185036c2736fcac" dependencies = [ "quote", - "syn 2.0.103", + "syn 2.0.104", ] [[package]] @@ -4595,7 +4571,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.103", + "syn 2.0.104", ] [[package]] @@ -4623,9 +4599,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.103" +version = "2.0.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4307e30089d6fd6aff212f2da3a1f9e32f3223b1f010fb09b7c95f90f3ca1e8" +checksum = "17b6f705963418cdb9927482fa304bc562ece2fdd4f616084c50b7023b435a40" dependencies = [ "proc-macro2", "quote", @@ -4649,21 +4625,21 @@ checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.103", + "syn 2.0.104", ] [[package]] name = "sysinfo" -version = "0.35.1" +version = "0.35.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79251336d17c72d9762b8b54be4befe38d2db56fbbc0241396d70f173c39d47a" +checksum = "3c3ffa3e4ff2b324a57f7aeb3c349656c7b127c3c189520251a648102a92496e" dependencies = [ "libc", "memchr", "ntapi", "objc2-core-foundation", "objc2-io-kit", - "windows 0.61.1", + "windows 0.61.3", ] [[package]] @@ -4673,7 +4649,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" dependencies = [ "bitflags 2.9.1", - "core-foundation", + "core-foundation 0.9.4", "system-configuration-sys", ] @@ -4714,7 +4690,7 @@ dependencies = [ "getrandom 0.3.2", "once_cell", "rustix 1.0.7", - "windows-sys 0.59.0", + "windows-sys 0.52.0", ] [[package]] @@ -4768,7 +4744,7 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.103", + "syn 2.0.104", ] [[package]] @@ -4779,17 +4755,16 @@ checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.103", + "syn 2.0.104", ] [[package]] name = "thread_local" -version = "1.1.8" +version = "1.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" +checksum = "f60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185" dependencies = [ "cfg-if", - "once_cell", ] [[package]] @@ -4877,9 +4852,9 @@ dependencies = [ [[package]] name = "toml" -version = "0.8.22" +version = "0.8.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05ae329d1f08c4d17a59bed7ff5b5a769d062e64a62d34a3261b219e62cd5aae" +checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362" dependencies = [ "serde", "serde_spanned", @@ -4889,18 +4864,18 @@ dependencies = [ [[package]] name = "toml_datetime" -version = "0.6.9" +version = "0.6.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3da5db5a963e24bc68be8b17b6fa82814bb22ee8660f192bb182771d498f09a3" +checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" dependencies = [ "serde", ] [[package]] name = "toml_edit" -version = "0.22.26" +version = "0.22.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "310068873db2c5b3e7659d2cc35d21855dbafa50d1ce336397c666e3cb08137e" +checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" dependencies = [ "indexmap", "serde", @@ -4912,9 +4887,9 @@ dependencies = [ [[package]] name = "toml_write" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfb942dfe1d8e29a7ee7fcbde5bd2b9a25fb89aa70caea2eba3bee836ff41076" +checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801" [[package]] name = "tower" @@ -4933,9 +4908,9 @@ dependencies = [ [[package]] name = "tower-http" -version = "0.6.4" +version = "0.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fdb0c213ca27a9f57ab69ddb290fd80d970922355b83ae380b395d3986b8a2e" +checksum = "adc82fd73de2a9722ac5da747f12383d2bfdb93591ee6c58486e0097890f05f2" dependencies = [ "bitflags 2.9.1", "bytes", @@ -4974,20 +4949,20 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.28" +version = "0.1.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" +checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903" dependencies = [ "proc-macro2", "quote", - "syn 2.0.103", + "syn 2.0.104", ] [[package]] name = "tracing-core" -version = "0.1.33" +version = "0.1.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" +checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678" dependencies = [ "once_cell", "valuable", @@ -5197,9 +5172,9 @@ dependencies = [ [[package]] name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" +version = "0.11.1+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" [[package]] name = "wasi" @@ -5232,7 +5207,7 @@ dependencies = [ "log", "proc-macro2", "quote", - "syn 2.0.103", + "syn 2.0.104", "wasm-bindgen-shared", ] @@ -5267,7 +5242,7 @@ checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" dependencies = [ "proc-macro2", "quote", - "syn 2.0.103", + "syn 2.0.104", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -5302,12 +5277,21 @@ dependencies = [ ] [[package]] -name = "webpki-roots" +name = "webpki-root-certs" version = "0.26.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "521bc38abb08001b01866da9f51eb7c5d647a19260e00054a8c7fd5f9e57f7a9" +checksum = "75c7f0ef91146ebfb530314f5f1d24528d7f0767efbfd31dce919275413e393e" +dependencies = [ + "webpki-root-certs 1.0.1", +] + +[[package]] +name = "webpki-root-certs" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86138b15b2b7d561bc4469e77027b8dd005a43dc502e9031d1f5afc8ce1f280e" dependencies = [ - "webpki-roots 1.0.0", + "rustls-pki-types", ] [[package]] @@ -5353,7 +5337,7 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" dependencies = [ - "windows-sys 0.59.0", + "windows-sys 0.48.0", ] [[package]] @@ -5373,9 +5357,9 @@ dependencies = [ [[package]] name = "windows" -version = "0.61.1" +version = "0.61.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5ee8f3d025738cb02bad7868bbb5f8a6327501e870bf51f1b455b0a2454a419" +checksum = "9babd3a767a4c1aef6900409f85f5d53ce2544ccdfaa86dad48c91782c6d6893" dependencies = [ "windows-collections", "windows-core", @@ -5395,25 +5379,26 @@ dependencies = [ [[package]] name = "windows-core" -version = "0.61.0" +version = "0.61.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4763c1de310c86d75a878046489e2e5ba02c649d185f21c67d4cf8a56d098980" +checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" dependencies = [ "windows-implement", "windows-interface", "windows-link", "windows-result", - "windows-strings 0.4.0", + "windows-strings", ] [[package]] name = "windows-future" -version = "0.2.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a1d6bbefcb7b60acd19828e1bc965da6fcf18a7e39490c5f8be71e54a19ba32" +checksum = "fc6a41e98427b19fe4b73c550f060b59fa592d7d686537eebf9385621bfbad8e" dependencies = [ "windows-core", "windows-link", + "windows-threading", ] [[package]] @@ -5424,7 +5409,7 @@ checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" dependencies = [ "proc-macro2", "quote", - "syn 2.0.103", + "syn 2.0.104", ] [[package]] @@ -5435,14 +5420,14 @@ checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.103", + "syn 2.0.104", ] [[package]] name = "windows-link" -version = "0.1.1" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76840935b766e1b0a05c0066835fb9ec80071d4c09a16f6bd5f7e655e3c14c38" +checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" [[package]] name = "windows-numerics" @@ -5456,40 +5441,40 @@ dependencies = [ [[package]] name = "windows-registry" -version = "0.4.0" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4286ad90ddb45071efd1a66dfa43eb02dd0dfbae1545ad6cc3c51cf34d7e8ba3" +checksum = "5b8a9ed28765efc97bbc954883f4e6796c33a06546ebafacbabee9696967499e" dependencies = [ + "windows-link", "windows-result", - "windows-strings 0.3.1", - "windows-targets 0.53.0", + "windows-strings", ] [[package]] name = "windows-result" -version = "0.3.2" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c64fd11a4fd95df68efcfee5f44a294fe71b8bc6a91993e2791938abcc712252" +checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" dependencies = [ "windows-link", ] [[package]] name = "windows-strings" -version = "0.3.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87fa48cc5d406560701792be122a10132491cff9d0aeb23583cc2dcafc847319" +checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" dependencies = [ "windows-link", ] [[package]] -name = "windows-strings" -version = "0.4.0" +name = "windows-sys" +version = "0.45.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a2ba9642430ee452d5a7aa78d72907ebe8cfda358e8cb7918a2050581322f97" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" dependencies = [ - "windows-link", + "windows-targets 0.42.2", ] [[package]] @@ -5558,7 +5543,7 @@ dependencies = [ "windows_aarch64_gnullvm 0.52.6", "windows_aarch64_msvc 0.52.6", "windows_i686_gnu 0.52.6", - "windows_i686_gnullvm 0.52.6", + "windows_i686_gnullvm", "windows_i686_msvc 0.52.6", "windows_x86_64_gnu 0.52.6", "windows_x86_64_gnullvm 0.52.6", @@ -5566,19 +5551,12 @@ dependencies = [ ] [[package]] -name = "windows-targets" -version = "0.53.0" +name = "windows-threading" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1e4c7e8ceaaf9cb7d7507c974735728ab453b67ef8f18febdd7c11fe59dca8b" +checksum = "b66463ad2e0ea3bbf808b7f1d371311c80e115c0b71d60efc142cafbcfb057a6" dependencies = [ - "windows_aarch64_gnullvm 0.53.0", - "windows_aarch64_msvc 0.53.0", - "windows_i686_gnu 0.53.0", - "windows_i686_gnullvm 0.53.0", - "windows_i686_msvc 0.53.0", - "windows_x86_64_gnu 0.53.0", - "windows_x86_64_gnullvm 0.53.0", - "windows_x86_64_msvc 0.53.0", + "windows-link", ] [[package]] @@ -5599,12 +5577,6 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" - [[package]] name = "windows_aarch64_msvc" version = "0.42.2" @@ -5623,12 +5595,6 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" -[[package]] -name = "windows_aarch64_msvc" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" - [[package]] name = "windows_i686_gnu" version = "0.42.2" @@ -5647,24 +5613,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" -[[package]] -name = "windows_i686_gnu" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" - [[package]] name = "windows_i686_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" -[[package]] -name = "windows_i686_gnullvm" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" - [[package]] name = "windows_i686_msvc" version = "0.42.2" @@ -5683,12 +5637,6 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" -[[package]] -name = "windows_i686_msvc" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" - [[package]] name = "windows_x86_64_gnu" version = "0.42.2" @@ -5707,12 +5655,6 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" -[[package]] -name = "windows_x86_64_gnu" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" - [[package]] name = "windows_x86_64_gnullvm" version = "0.42.2" @@ -5731,12 +5673,6 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" - [[package]] name = "windows_x86_64_msvc" version = "0.42.2" @@ -5755,12 +5691,6 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" -[[package]] -name = "windows_x86_64_msvc" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" - [[package]] name = "winnow" version = "0.7.11" @@ -5797,9 +5727,9 @@ checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" [[package]] name = "xattr" -version = "1.5.0" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d65cbf2f12c15564212d48f4e3dfb87923d25d611f2aed18f4cb23f0413d89e" +checksum = "af3a19837351dc82ba89f8a125e22a3c475f05aba604acc023d62b2739ae2909" dependencies = [ "libc", "rustix 1.0.7", @@ -5840,28 +5770,28 @@ checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.103", + "syn 2.0.104", "synstructure", ] [[package]] name = "zerocopy" -version = "0.8.23" +version = "0.8.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd97444d05a4328b90e75e503a34bad781f14e28a823ad3557f0750df1ebcbc6" +checksum = "1039dd0d3c310cf05de012d8a39ff557cb0d23087fd44cad61df08fc31907a2f" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.23" +version = "0.8.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6352c01d0edd5db859a63e2605f4ea3183ddbd15e2c4a9e7d32184df75e4f154" +checksum = "9ecf5b4cc5364572d7f4c329661bcc82724222973f2cab6f050a4e5c22f75181" dependencies = [ "proc-macro2", "quote", - "syn 2.0.103", + "syn 2.0.104", ] [[package]] @@ -5881,7 +5811,7 @@ checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" dependencies = [ "proc-macro2", "quote", - "syn 2.0.103", + "syn 2.0.104", "synstructure", ] @@ -5921,14 +5851,14 @@ checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.103", + "syn 2.0.104", ] [[package]] name = "zip" -version = "4.1.0" +version = "4.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af7dcdb4229c0e79c2531a24de7726a0e980417a74fb4d030a35f535665439a0" +checksum = "95ab361742de920c5535880f89bbd611ee62002bf11341d16a5f057bb8ba6899" dependencies = [ "arbitrary", "crc32fast", diff --git a/Cargo.toml b/Cargo.toml index 6bbd0fe4da8..a9e1f0ae63a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -155,9 +155,9 @@ gitoxide-core = { version = "^0.47.1", path = "gitoxide-core" } gix-features = { version = "^0.42.1", path = "gix-features" } gix = { version = "^0.72.1", path = "gix", default-features = false } -clap = { version = "4.5.39", features = ["derive", "cargo"] } -clap_complete = "4.5.52" -prodash = { version = "29.0.2", optional = true } +clap = { version = "4.5.40", features = ["derive", "cargo"] } +clap_complete = "4.5.54" +prodash = { version = "30.0.1", optional = true } is-terminal = { version = "0.4.0", optional = true } env_logger = { version = "0.11.8", default-features = false } crosstermion = { version = "0.14.0", optional = true, default-features = false } diff --git a/gitoxide-core/Cargo.toml b/gitoxide-core/Cargo.toml index 5a1482e9db0..8769ace145a 100644 --- a/gitoxide-core/Cargo.toml +++ b/gitoxide-core/Cargo.toml @@ -74,16 +74,16 @@ gix-url = { version = "^0.31.0", path = "../gix-url", optional = true } jwalk = { version = "0.8.0", optional = true } # for 'hours' -fs-err = { version = "3.1.0", optional = true } +fs-err = { version = "3.1.1", optional = true } crossbeam-channel = { version = "0.5.15", optional = true } -smallvec = { version = "1.15.0", optional = true } +smallvec = { version = "1.15.1", optional = true } # for 'query' and 'corpus' rusqlite = { version = "0.36.0", optional = true, features = ["bundled"] } # for 'corpus' parking_lot = { version = "0.12.4", optional = true } -sysinfo = { version = "0.35.1", optional = true, default-features = false, features = ["system"] } +sysinfo = { version = "0.35.2", optional = true, default-features = false, features = ["system"] } serde_json = { version = "1.0.65", optional = true } tracing-forest = { version = "0.1.5", features = ["serde"], optional = true } tracing-subscriber = { version = "0.3.17", optional = true } diff --git a/gix-archive/Cargo.toml b/gix-archive/Cargo.toml index 945bdf5cae1..16fa629efe5 100644 --- a/gix-archive/Cargo.toml +++ b/gix-archive/Cargo.toml @@ -33,8 +33,8 @@ gix-path = { version = "^0.10.18", path = "../gix-path", optional = true } gix-date = { version = "^0.10.2", path = "../gix-date" } flate2 = { version = "1.1.1", optional = true, default-features = false, features = ["zlib-rs"] } -zip = { version = "4.0.0", optional = true, default-features = false, features = ["deflate-flate2"] } -jiff = { version = "0.2.14", default-features = false, features = ["std"] } +zip = { version = "4.2.0", optional = true, default-features = false, features = ["deflate-flate2"] } +jiff = { version = "0.2.15", default-features = false, features = ["std"] } thiserror = "2.0.0" bstr = { version = "1.12.0", default-features = false } diff --git a/gix-attributes/Cargo.toml b/gix-attributes/Cargo.toml index 978b9a793e6..7b5ac5822f0 100644 --- a/gix-attributes/Cargo.toml +++ b/gix-attributes/Cargo.toml @@ -25,7 +25,7 @@ gix-glob = { version = "^0.20.1", path = "../gix-glob" } gix-trace = { version = "^0.1.12", path = "../gix-trace" } bstr = { version = "1.12.0", default-features = false, features = ["std", "unicode"] } -smallvec = "1.15.0" +smallvec = "1.15.1" kstring = "2.0.0" unicode-bom = { version = "2.0.3" } thiserror = "2.0.0" diff --git a/gix-blame/Cargo.toml b/gix-blame/Cargo.toml index 22298622e83..ed39ae34b08 100644 --- a/gix-blame/Cargo.toml +++ b/gix-blame/Cargo.toml @@ -21,7 +21,7 @@ gix-hash = { version = "^0.18.0", path = "../gix-hash" } gix-worktree = { version = "^0.41.0", path = "../gix-worktree", default-features = false, features = ["attributes"] } gix-traverse = { version = "^0.46.2", path = "../gix-traverse" } -smallvec = "1.15.0" +smallvec = "1.15.1" thiserror = "2.0.0" [dev-dependencies] diff --git a/gix-config/Cargo.toml b/gix-config/Cargo.toml index ebfc4fddb2e..ce9151307c2 100644 --- a/gix-config/Cargo.toml +++ b/gix-config/Cargo.toml @@ -32,7 +32,7 @@ thiserror = "2.0.0" unicode-bom = { version = "2.0.3" } bstr = { version = "1.12.0", default-features = false, features = ["std"] } serde = { version = "1.0.114", optional = true, default-features = false, features = ["derive"] } -smallvec = "1.15.0" +smallvec = "1.15.1" once_cell = "1.21.3" document-features = { version = "0.2.0", optional = true } diff --git a/gix-date/Cargo.toml b/gix-date/Cargo.toml index c1bb1e9cd7d..1c810711ae5 100644 --- a/gix-date/Cargo.toml +++ b/gix-date/Cargo.toml @@ -22,11 +22,11 @@ serde = ["dep:serde", "bstr/serde"] bstr = { version = "1.12.0", default-features = false, features = ["std"] } serde = { version = "1.0.114", optional = true, default-features = false, features = ["derive"] } itoa = "1.0.1" -jiff = "0.2.14" +jiff = "0.2.15" thiserror = "2.0.0" # TODO: used for quick and easy `TimeBacking: std::io::Write` implementation, but could make that `Copy` # and remove this dep with custom impl -smallvec = { version = "1.15.0", features = ["write"] } +smallvec = { version = "1.15.1", features = ["write"] } document-features = { version = "0.2.0", optional = true } diff --git a/gix-features/Cargo.toml b/gix-features/Cargo.toml index 6942cb3fdb8..e89ac4b233c 100644 --- a/gix-features/Cargo.toml +++ b/gix-features/Cargo.toml @@ -114,7 +114,7 @@ walkdir = { version = "2.3.2", optional = true } # used when parallel is off crc32fast = { version = "1.2.1", optional = true } # progress -prodash = { version = "29.0.2", optional = true } +prodash = { version = "30.0.1", optional = true } bytesize = { version = "2.0.1", optional = true } # pipe @@ -129,7 +129,7 @@ once_cell = { version = "1.21.3", optional = true } document-features = { version = "0.2.0", optional = true } [target.'cfg(unix)'.dependencies] -libc = { version = "0.2.172" } +libc = { version = "0.2.174" } [dev-dependencies] bstr = { version = "1.12.0", default-features = false } diff --git a/gix-filter/Cargo.toml b/gix-filter/Cargo.toml index d21e0a6305e..3347968cfe2 100644 --- a/gix-filter/Cargo.toml +++ b/gix-filter/Cargo.toml @@ -28,7 +28,7 @@ gix-attributes = { version = "^0.26.1", path = "../gix-attributes" } encoding_rs = "0.8.32" bstr = { version = "1.12.0", default-features = false, features = ["std"] } thiserror = "2.0.0" -smallvec = "1.15.0" +smallvec = "1.15.1" [dev-dependencies] diff --git a/gix-index/Cargo.toml b/gix-index/Cargo.toml index 6c443032833..c5a00c68c07 100644 --- a/gix-index/Cargo.toml +++ b/gix-index/Cargo.toml @@ -44,7 +44,7 @@ bstr = { version = "1.12.0", default-features = false } serde = { version = "1.0.114", optional = true, default-features = false, features = [ "derive", ] } -smallvec = "1.15.0" +smallvec = "1.15.1" itoa = "1.0.3" bitflags = "2" @@ -55,7 +55,7 @@ rustix = { version = "1.0.7", default-features = false, features = [ "std", "fs", ] } -libc = { version = "0.2.172" } +libc = { version = "0.2.174" } [dev-dependencies] gix-testtools = { path = "../tests/tools" } diff --git a/gix-negotiate/Cargo.toml b/gix-negotiate/Cargo.toml index 882f039b848..7a409c7d05d 100644 --- a/gix-negotiate/Cargo.toml +++ b/gix-negotiate/Cargo.toml @@ -22,7 +22,7 @@ gix-date = { version = "^0.10.2", path = "../gix-date" } gix-commitgraph = { version = "^0.28.0", path = "../gix-commitgraph" } gix-revwalk = { version = "^0.20.1", path = "../gix-revwalk" } thiserror = "2.0.0" -smallvec = "1.15.0" +smallvec = "1.15.1" bitflags = "2" [dev-dependencies] diff --git a/gix-object/Cargo.toml b/gix-object/Cargo.toml index 81067ef4722..0d9b89fbe64 100644 --- a/gix-object/Cargo.toml +++ b/gix-object/Cargo.toml @@ -59,7 +59,7 @@ bstr = { version = "1.12.0", default-features = false, features = [ "unicode", ] } winnow = { version = "0.7.10", features = ["simd"] } -smallvec = { version = "1.15.0", features = ["write"] } +smallvec = { version = "1.15.1", features = ["write"] } serde = { version = "1.0.114", optional = true, default-features = false, features = [ "derive", ] } diff --git a/gix-pack/Cargo.toml b/gix-pack/Cargo.toml index b463e18136c..1ae3c6edbd1 100644 --- a/gix-pack/Cargo.toml +++ b/gix-pack/Cargo.toml @@ -46,7 +46,7 @@ gix-traverse = { version = "^0.46.2", path = "../gix-traverse", optional = true gix-diff = { version = "^0.52.1", path = "../gix-diff", default-features = false, optional = true } memmap2 = "0.9.0" -smallvec = "1.15.0" +smallvec = "1.15.1" parking_lot = { version = "0.12.4", default-features = false, optional = true } thiserror = "2.0.0" diff --git a/gix-path/Cargo.toml b/gix-path/Cargo.toml index 10d5a931b3e..5502116cfdb 100644 --- a/gix-path/Cargo.toml +++ b/gix-path/Cargo.toml @@ -30,5 +30,5 @@ serial_test = { version = "3.1.0", default-features = false } [target.'cfg(windows)'.dev-dependencies] known-folders = "1.1.0" -windows = { version = "0.61.1", features = ["Win32_System_Threading"] } +windows = { version = "0.61.3", features = ["Win32_System_Threading"] } winreg = "0.55.0" diff --git a/gix-refspec/Cargo.toml b/gix-refspec/Cargo.toml index 0eaaebf740e..aa9fa5f89a8 100644 --- a/gix-refspec/Cargo.toml +++ b/gix-refspec/Cargo.toml @@ -21,7 +21,7 @@ gix-hash = { version = "^0.18.0", path = "../gix-hash" } bstr = { version = "1.12.0", default-features = false, features = ["std"] } thiserror = "2.0.0" -smallvec = "1.15.0" +smallvec = "1.15.1" [dev-dependencies] gix-testtools = { path = "../tests/tools" } diff --git a/gix-revwalk/Cargo.toml b/gix-revwalk/Cargo.toml index 0a478b81fc7..ca5a3183f95 100644 --- a/gix-revwalk/Cargo.toml +++ b/gix-revwalk/Cargo.toml @@ -22,7 +22,7 @@ gix-hashtable = { version = "^0.8.1", path = "../gix-hashtable" } gix-commitgraph = { version = "^0.28.0", path = "../gix-commitgraph" } thiserror = "2.0.0" -smallvec = "1.15.0" +smallvec = "1.15.1" [dev-dependencies] gix-testtools = { path = "../tests/tools" } diff --git a/gix-sec/Cargo.toml b/gix-sec/Cargo.toml index eece240a201..8ea90242095 100644 --- a/gix-sec/Cargo.toml +++ b/gix-sec/Cargo.toml @@ -28,7 +28,7 @@ bitflags = "2" document-features = { version = "0.2.1", optional = true } [target.'cfg(not(windows))'.dependencies] -libc = "0.2.172" +libc = "0.2.174" [target.'cfg(windows)'.dependencies] gix-path = { version = "^0.10.18", path = "../gix-path" } diff --git a/gix-tempfile/Cargo.toml b/gix-tempfile/Cargo.toml index 7369bd3b310..a52a1d048bb 100644 --- a/gix-tempfile/Cargo.toml +++ b/gix-tempfile/Cargo.toml @@ -51,7 +51,7 @@ signals = ["dep:signal-hook", "dep:signal-hook-registry"] hp-hashmap = ["dep:dashmap"] [target.'cfg(not(windows))'.dependencies] -libc = { version = "0.2.172", default-features = false } +libc = { version = "0.2.174", default-features = false } [package.metadata.docs.rs] all-features = true diff --git a/gix-trace/Cargo.toml b/gix-trace/Cargo.toml index 0292fa4963e..5fb8b3bcf1d 100644 --- a/gix-trace/Cargo.toml +++ b/gix-trace/Cargo.toml @@ -31,7 +31,7 @@ tracing-detail = [] [dependencies] -tracing-core = { version = "0.1.31", optional = true } +tracing-core = { version = "0.1.34", optional = true } document-features = { version = "0.2.0", optional = true } diff --git a/gix-transport/Cargo.toml b/gix-transport/Cargo.toml index eeea87b8bcd..e1abc0443eb 100644 --- a/gix-transport/Cargo.toml +++ b/gix-transport/Cargo.toml @@ -113,7 +113,7 @@ curl = { version = "0.4", optional = true } # for http-client-reqwest # all but the 'default-tls' feature -reqwest = { version = "0.12.18", optional = true, default-features = false, features = ["blocking", "charset", "http2", "macos-system-configuration"] } +reqwest = { version = "0.12.22", optional = true, default-features = false, features = ["blocking", "charset", "http2", "macos-system-configuration"] } ## If used in conjunction with `async-client`, the `connect()` method will become available along with supporting the git protocol over TCP, ## where the TCP stream is created using this crate. diff --git a/gix-traverse/Cargo.toml b/gix-traverse/Cargo.toml index 754a114c9ff..0dfb2a0e31b 100644 --- a/gix-traverse/Cargo.toml +++ b/gix-traverse/Cargo.toml @@ -22,6 +22,6 @@ gix-date = { version = "^0.10.2", path = "../gix-date" } gix-hashtable = { version = "^0.8.1", path = "../gix-hashtable" } gix-revwalk = { version = "^0.20.1", path = "../gix-revwalk" } gix-commitgraph = { version = "^0.28.0", path = "../gix-commitgraph" } -smallvec = "1.15.0" +smallvec = "1.15.1" thiserror = "2.0.0" bitflags = "2" diff --git a/gix/Cargo.toml b/gix/Cargo.toml index 6cc8c1e50a1..9413dd575a3 100644 --- a/gix/Cargo.toml +++ b/gix/Cargo.toml @@ -370,14 +370,14 @@ gix-protocol = { version = "^0.50.1", path = "../gix-protocol" } gix-transport = { version = "^0.47.0", path = "../gix-transport", optional = true } # Just to get the progress-tree feature -prodash = { version = "29.0.2", optional = true, features = ["progress-tree"] } +prodash = { version = "30.0.1", optional = true, features = ["progress-tree"] } once_cell = "1.21.3" signal-hook = { version = "0.3.18", default-features = false, optional = true } thiserror = "2.0.0" serde = { version = "1.0.114", optional = true, default-features = false, features = [ "derive", ] } -smallvec = "1.15.0" +smallvec = "1.15.1" async-std = { version = "1.12.0", optional = true } ## For use in rev-parse, which provides searching commits by running a regex on their message. diff --git a/tests/it/Cargo.toml b/tests/it/Cargo.toml index 197d37a2179..25abc5edad7 100644 --- a/tests/it/Cargo.toml +++ b/tests/it/Cargo.toml @@ -16,7 +16,7 @@ path = "src/main.rs" [dependencies] anyhow = "1.0.98" -clap = { version = "4.5.39", features = ["derive"] } +clap = { version = "4.5.40", features = ["derive"] } gix = { version = "^0.72.1", path = "../../gix", default-features = false, features = ["attributes", "blame", "blob-diff", "revision"] } once_cell = "1.21.3" regex = { version = "1.11.1", default-features = false, features = ["std"] } From bd0189360152325b3d0eb8a19a1c96af938071b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christoph=20R=C3=BC=C3=9Fler?= Date: Wed, 2 Jul 2025 11:07:01 +0200 Subject: [PATCH 147/166] feat: add explicit accessors for common fields --- gix-diff/src/index/change.rs | 40 ++++++++++++++++++++++++++++++++++++ gix-diff/tests/diff/index.rs | 27 +++++++++++++++++++++--- 2 files changed, 64 insertions(+), 3 deletions(-) diff --git a/gix-diff/src/index/change.rs b/gix-diff/src/index/change.rs index 923e80dee2e..f2ae34827e7 100644 --- a/gix-diff/src/index/change.rs +++ b/gix-diff/src/index/change.rs @@ -114,6 +114,46 @@ impl ChangeRef<'_, '_> { } => (location.as_ref(), *index, *entry_mode, id), } } + + /// Return the `location`, in the case of rewrites referring to the current change. + pub fn location(&self) -> &BStr { + match self { + ChangeRef::Addition { location, .. } + | ChangeRef::Deletion { location, .. } + | ChangeRef::Modification { location, .. } + | ChangeRef::Rewrite { location, .. } => location.as_ref(), + } + } + + /// Return the `index`, in the case of rewrites referring to the current change. + pub fn index(&self) -> usize { + match self { + ChangeRef::Addition { index, .. } + | ChangeRef::Deletion { index, .. } + | ChangeRef::Modification { index, .. } + | ChangeRef::Rewrite { index, .. } => *index, + } + } + + /// Return the `entry_mode`, in the case of rewrites referring to the current change. + pub fn entry_mode(&self) -> gix_index::entry::Mode { + match self { + ChangeRef::Addition { entry_mode, .. } + | ChangeRef::Deletion { entry_mode, .. } + | ChangeRef::Modification { entry_mode, .. } + | ChangeRef::Rewrite { entry_mode, .. } => *entry_mode, + } + } + + /// Return the `id`, in the case of rewrites referring to the current change. + pub fn id(&self) -> &gix_hash::oid { + match self { + ChangeRef::Addition { id, .. } + | ChangeRef::Deletion { id, .. } + | ChangeRef::Modification { id, .. } + | ChangeRef::Rewrite { id, .. } => id, + } + } } impl rewrites::tracker::Change for ChangeRef<'_, '_> { diff --git a/gix-diff/tests/diff/index.rs b/gix-diff/tests/diff/index.rs index f38c30f14df..edeaa9a3c35 100644 --- a/gix-diff/tests/diff/index.rs +++ b/gix-diff/tests/diff/index.rs @@ -1,3 +1,5 @@ +use std::str::FromStr; + use gix_diff::{ index::Change, rewrites::{Copies, CopySource}, @@ -313,8 +315,27 @@ fn renames_by_similarity_with_limit() -> crate::Result { 0, "fuzzy tracking is effectively disabled due to limit" ); - let actual: Vec<_> = changes.iter().map(|c| c.fields().0).collect(); - assert_eq!(actual, ["f1", "f1-renamed", "f2", "f2-renamed"]); + let actual_locations: Vec<_> = changes.iter().map(|c| c.location()).collect(); + assert_eq!(actual_locations, ["f1", "f1-renamed", "f2", "f2-renamed"]); + + let actual_indices: Vec<_> = changes.iter().map(|c| c.index()).collect(); + assert_eq!(actual_indices, [6, 6, 7, 7]); + + use gix_index::entry::Mode; + + let actual_entry_modes: Vec<_> = changes.iter().map(|c| c.entry_mode()).collect(); + assert_eq!(actual_entry_modes, [Mode::FILE, Mode::FILE, Mode::FILE, Mode::FILE]); + + let actual_ids: Vec<_> = changes.iter().map(|c| c.id()).collect(); + assert_eq!( + actual_ids, + [ + gix_hash::ObjectId::from_str("f00c965d8307308469e537302baa73048488f162")?, + gix_hash::ObjectId::from_str("683cfcc0f47566c332aa45d81c5cc98acb4aab49")?, + gix_hash::ObjectId::from_str("3bb459b831ea471b9cd1cbb7c6d54a74251a711b")?, + gix_hash::ObjectId::from_str("0a805f8e02d72bd354c1f00607906de2e49e00d6")?, + ] + ); let out = out.expect("tracking enabled"); assert_eq!(out.num_similarity_checks, 0); @@ -481,7 +502,7 @@ fn copies_in_entire_tree_by_similarity() -> crate::Result { 0, "needs --find-copies-harder to detect rewrites here" ); - let actual: Vec<_> = changes.iter().map(|c| c.fields().0).collect(); + let actual: Vec<_> = changes.iter().map(|c| c.location()).collect(); assert_eq!(actual, ["b", "c6", "c7", "newly-added"]); let out = out.expect("tracking enabled"); From a0cef8bd5351acd334459b115c139a9c75e41f55 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christoph=20R=C3=BC=C3=9Fler?= Date: Wed, 2 Jul 2025 11:07:46 +0200 Subject: [PATCH 148/166] Adapt to changes in `gix-diff` --- gix/src/status/iter/types.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gix/src/status/iter/types.rs b/gix/src/status/iter/types.rs index 1ee9e17ea4d..c6ce3470513 100644 --- a/gix/src/status/iter/types.rs +++ b/gix/src/status/iter/types.rs @@ -135,7 +135,7 @@ impl Item { pub fn location(&self) -> &BStr { match self { Item::IndexWorktree(change) => change.rela_path(), - Item::TreeIndex(change) => change.fields().0, + Item::TreeIndex(change) => change.location(), } } } From fad0118b53dbd9a18ee80e76b16f2b732496ac73 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christoph=20R=C3=BC=C3=9Fler?= Date: Wed, 2 Jul 2025 11:22:20 +0200 Subject: [PATCH 149/166] Reference new methods in docs for `ChangeRef::field()` --- gix-diff/src/index/change.rs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/gix-diff/src/index/change.rs b/gix-diff/src/index/change.rs index f2ae34827e7..0f8967ea33b 100644 --- a/gix-diff/src/index/change.rs +++ b/gix-diff/src/index/change.rs @@ -82,6 +82,12 @@ impl ChangeRef<'_, '_> { /// Return all shared fields among all variants: `(location, index, entry_mode, id)` /// /// In case of rewrites, the fields return to the current change. + /// + /// Note that there are also more specific accessors in case you only need to access to one of + /// these fields individually. + /// + /// See [`ChangeRef::location()`], [`ChangeRef::index()`], [`ChangeRef::entry_mode()`] and + /// [`ChangeRef::id()`]. pub fn fields(&self) -> (&BStr, usize, gix_index::entry::Mode, &gix_hash::oid) { match self { ChangeRef::Addition { From 79b8f0656e34e5099cf09ecd9a9bf569f24c7c0b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christoph=20R=C3=BC=C3=9Fler?= Date: Wed, 2 Jul 2025 12:32:23 +0200 Subject: [PATCH 150/166] Thanks clippy --- gix-diff/tests/diff/index.rs | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/gix-diff/tests/diff/index.rs b/gix-diff/tests/diff/index.rs index edeaa9a3c35..5d08ff52866 100644 --- a/gix-diff/tests/diff/index.rs +++ b/gix-diff/tests/diff/index.rs @@ -315,18 +315,21 @@ fn renames_by_similarity_with_limit() -> crate::Result { 0, "fuzzy tracking is effectively disabled due to limit" ); - let actual_locations: Vec<_> = changes.iter().map(|c| c.location()).collect(); + + use gix_diff::index::ChangeRef; + + let actual_locations: Vec<_> = changes.iter().map(ChangeRef::location).collect(); assert_eq!(actual_locations, ["f1", "f1-renamed", "f2", "f2-renamed"]); - let actual_indices: Vec<_> = changes.iter().map(|c| c.index()).collect(); + let actual_indices: Vec<_> = changes.iter().map(ChangeRef::index).collect(); assert_eq!(actual_indices, [6, 6, 7, 7]); use gix_index::entry::Mode; - let actual_entry_modes: Vec<_> = changes.iter().map(|c| c.entry_mode()).collect(); + let actual_entry_modes: Vec<_> = changes.iter().map(ChangeRef::entry_mode).collect(); assert_eq!(actual_entry_modes, [Mode::FILE, Mode::FILE, Mode::FILE, Mode::FILE]); - let actual_ids: Vec<_> = changes.iter().map(|c| c.id()).collect(); + let actual_ids: Vec<_> = changes.iter().map(ChangeRef::id).collect(); assert_eq!( actual_ids, [ @@ -502,7 +505,7 @@ fn copies_in_entire_tree_by_similarity() -> crate::Result { 0, "needs --find-copies-harder to detect rewrites here" ); - let actual: Vec<_> = changes.iter().map(|c| c.location()).collect(); + let actual: Vec<_> = changes.iter().map(gix_diff::index::ChangeRef::location).collect(); assert_eq!(actual, ["b", "c6", "c7", "newly-added"]); let out = out.expect("tracking enabled"); From 37d3bf24ac1a79302f3e97b97372e4ad381c45e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christoph=20R=C3=BC=C3=9Fler?= Date: Wed, 2 Jul 2025 13:57:44 +0200 Subject: [PATCH 151/166] feat: add first debug version of `gix tag list` --- gitoxide-core/src/repository/mod.rs | 1 + gitoxide-core/src/repository/tag.rs | 17 +++++++++++++++++ src/plumbing/main.rs | 13 ++++++++++++- src/plumbing/options/mod.rs | 11 +++++++++++ 4 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 gitoxide-core/src/repository/tag.rs diff --git a/gitoxide-core/src/repository/mod.rs b/gitoxide-core/src/repository/mod.rs index 8158f7cf0b6..bf3f5fe0e6d 100644 --- a/gitoxide-core/src/repository/mod.rs +++ b/gitoxide-core/src/repository/mod.rs @@ -44,6 +44,7 @@ pub mod remote; pub mod revision; pub mod status; pub mod submodule; +pub mod tag; pub mod tree; pub mod verify; pub mod worktree; diff --git a/gitoxide-core/src/repository/tag.rs b/gitoxide-core/src/repository/tag.rs new file mode 100644 index 00000000000..7dc9e3d93d6 --- /dev/null +++ b/gitoxide-core/src/repository/tag.rs @@ -0,0 +1,17 @@ +pub fn list(repo: gix::Repository, out: &mut dyn std::io::Write) -> anyhow::Result<()> { + let platform = repo.references()?; + + for mut reference in (platform.tags()?).flatten() { + let tag = reference.peel_to_tag(); + let tag_ref = tag.as_ref().map(gix::Tag::decode); + + let name = match tag_ref { + Ok(Ok(tag)) => tag.name.to_string(), + _ => reference.name().shorten().to_string(), + }; + + writeln!(out, "{name}")?; + } + + Ok(()) +} diff --git a/src/plumbing/main.rs b/src/plumbing/main.rs index 3a81447d701..00aea889375 100644 --- a/src/plumbing/main.rs +++ b/src/plumbing/main.rs @@ -17,7 +17,7 @@ use crate::{ plumbing::{ options::{ attributes, commit, commitgraph, config, credential, exclude, free, fsck, index, mailmap, merge, odb, - revision, tree, Args, Subcommands, + revision, tag, tree, Args, Subcommands, }, show_progress, }, @@ -1304,6 +1304,17 @@ pub fn main() -> Result<()> { }, ), }, + Subcommands::Tag(cmd) => match cmd { + tag::Subcommands::List => prepare_and_run( + "tag-list", + trace, + auto_verbose, + progress, + progress_keep_open, + None, + move |_progress, out, _err| core::repository::tag::list(repository(Mode::Lenient)?, out), + ), + }, Subcommands::Tree(cmd) => match cmd { tree::Subcommands::Entries { treeish, diff --git a/src/plumbing/options/mod.rs b/src/plumbing/options/mod.rs index ae1ea443551..5b982599d81 100644 --- a/src/plumbing/options/mod.rs +++ b/src/plumbing/options/mod.rs @@ -100,6 +100,9 @@ pub enum Subcommands { /// Interact with commit objects. #[clap(subcommand)] Commit(commit::Subcommands), + /// Interact with tag objects. + #[clap(subcommand)] + Tag(tag::Subcommands), /// Verify the integrity of the entire repository Verify { #[clap(flatten)] @@ -928,6 +931,14 @@ pub mod commit { } } +pub mod tag { + #[derive(Debug, clap::Subcommand)] + pub enum Subcommands { + /// List all tags. + List, + } +} + pub mod credential { #[derive(Debug, clap::Subcommand)] pub enum Subcommands { From 5e64298ba4864636779ae72e301475e9cfe01ac8 Mon Sep 17 00:00:00 2001 From: Sebastian Thiel Date: Wed, 2 Jul 2025 10:49:53 +0200 Subject: [PATCH 152/166] Reproduce unified diff issue A change on 2x context lines will have two much context from the top. --- gix-diff/src/blob/unified_diff.rs | 108 +++++++++++++------- gix-diff/tests/diff/blob/unified_diff.rs | 119 +++++++++++++++++++++++ 2 files changed, 193 insertions(+), 34 deletions(-) diff --git a/gix-diff/src/blob/unified_diff.rs b/gix-diff/src/blob/unified_diff.rs index de051266152..437ed132f0f 100644 --- a/gix-diff/src/blob/unified_diff.rs +++ b/gix-diff/src/blob/unified_diff.rs @@ -77,6 +77,10 @@ pub(super) mod _impl { use super::{ConsumeHunk, ContextSize, NewlineSeparator}; + const CONTEXT: char = ' '; + const ADDITION: char = '+'; + const REMOVAL: char = '-'; + /// A [`Sink`] that creates a textual diff in the format typically output by git or `gnu-diff` if the `-u` option is used, /// and passes it in full to a consumer. pub struct UnifiedDiff<'a, T, D> @@ -88,18 +92,25 @@ pub(super) mod _impl { after: &'a [Token], interner: &'a Interner, - pos: u32, + /// The 0-based start position in the 'before' tokens for the accumulated hunk for display in the header. before_hunk_start: u32, - after_hunk_start: u32, + /// The size of the accumulated 'before' hunk in lines for display in the header. before_hunk_len: u32, + /// The 0-based start position in the 'after' tokens for the accumulated hunk for display in the header. + after_hunk_start: u32, + /// The size of the accumulated 'after' hunk in lines. after_hunk_len: u32, + // An index into `before` and the context line to print next, + // or `None` if this value was never computed to be the correct starting point for an accumulated hunk. + ctx_pos: Option, + /// Symmetrical context before and after the changed hunk. ctx_size: u32, + newline: NewlineSeparator<'a>, buffer: Vec, header_buf: String, delegate: D, - newline: NewlineSeparator<'a>, err: Option, } @@ -122,19 +133,22 @@ pub(super) mod _impl { context_size: ContextSize, ) -> Self { Self { + interner: &input.interner, + before: &input.before, + after: &input.after, + before_hunk_start: 0, - after_hunk_start: 0, before_hunk_len: 0, after_hunk_len: 0, + after_hunk_start: 0, + ctx_pos: None, + + ctx_size: context_size.symmetrical, + newline: newline_separator, + buffer: Vec::with_capacity(8), header_buf: String::new(), delegate: consume_hunk, - interner: &input.interner, - before: &input.before, - after: &input.after, - pos: 0, - ctx_size: context_size.symmetrical, - newline: newline_separator, err: None, } @@ -158,23 +172,25 @@ pub(super) mod _impl { } } - fn flush(&mut self) -> std::io::Result<()> { - if self.before_hunk_len == 0 && self.after_hunk_len == 0 { + fn flush_accumulated_hunk(&mut self) -> std::io::Result<()> { + if self.nothing_to_flush() { return Ok(()); } - let end = (self.pos + self.ctx_size).min(self.before.len() as u32); - self.update_pos(end, end); + let ctx_pos = self.ctx_pos.expect("has been set if we started a hunk"); + let end = (ctx_pos + self.ctx_size).min(self.before.len() as u32); + self.print_context_and_update_pos(ctx_pos..end, end); + let hunk_start = self.before_hunk_start + 1; + let hunk_end = self.after_hunk_start + 1; self.header_buf.clear(); - std::fmt::Write::write_fmt( &mut self.header_buf, format_args!( "@@ -{},{} +{},{} @@{nl}", - self.before_hunk_start + 1, + hunk_start, self.before_hunk_len, - self.after_hunk_start + 1, + hunk_end, self.after_hunk_len, nl = match self.newline { NewlineSeparator::AfterHeaderAndLine(nl) | NewlineSeparator::AfterHeaderAndWhenNeeded(nl) => { @@ -185,26 +201,35 @@ pub(super) mod _impl { ) .map_err(|err| std::io::Error::new(ErrorKind::Other, err))?; self.delegate.consume_hunk( - self.before_hunk_start + 1, + hunk_start, self.before_hunk_len, - self.after_hunk_start + 1, + hunk_end, self.after_hunk_len, &self.header_buf, &self.buffer, )?; - self.buffer.clear(); - self.before_hunk_len = 0; - self.after_hunk_len = 0; + + self.reset_hunks(); Ok(()) } - fn update_pos(&mut self, print_to: u32, move_to: u32) { - self.print_tokens(&self.before[self.pos as usize..print_to as usize], ' '); - let len = print_to - self.pos; - self.pos = move_to; + fn print_context_and_update_pos(&mut self, print: Range, move_to: u32) { + self.print_tokens(&self.before[print.start as usize..print.end as usize], CONTEXT); + let len = print.end - print.start; + self.ctx_pos = Some(move_to); self.before_hunk_len += len; self.after_hunk_len += len; } + + fn reset_hunks(&mut self) { + self.buffer.clear(); + self.before_hunk_len = 0; + self.after_hunk_len = 0; + } + + fn nothing_to_flush(&self) -> bool { + self.before_hunk_len == 0 && self.after_hunk_len == 0 + } } impl Sink for UnifiedDiff<'_, T, D> @@ -218,24 +243,39 @@ pub(super) mod _impl { if self.err.is_some() { return; } - if before.start - self.pos > 2 * self.ctx_size { - if let Err(err) = self.flush() { + let start_next_hunk = self + .ctx_pos + .is_some_and(|ctx_pos| before.start - ctx_pos > 2 * self.ctx_size); + if start_next_hunk { + if let Err(err) = self.flush_accumulated_hunk() { self.err = Some(err); return; } - self.pos = before.start - self.ctx_size; - self.before_hunk_start = self.pos; + let ctx_pos = before.start - self.ctx_size; + self.ctx_pos = Some(ctx_pos); + self.before_hunk_start = ctx_pos; self.after_hunk_start = after.start - self.ctx_size; } - self.update_pos(before.start, before.end); + let ctx_pos = match self.ctx_pos { + None => { + // TODO: can this be made so the code above does the job? + let ctx_pos = before.start.saturating_sub(self.ctx_size); + self.before_hunk_start = ctx_pos; + self.after_hunk_start = after.start.saturating_sub(self.ctx_size); + ctx_pos + } + Some(pos) => pos, + }; + self.print_context_and_update_pos(ctx_pos..before.start, before.end); self.before_hunk_len += before.end - before.start; self.after_hunk_len += after.end - after.start; - self.print_tokens(&self.before[before.start as usize..before.end as usize], '-'); - self.print_tokens(&self.after[after.start as usize..after.end as usize], '+'); + + self.print_tokens(&self.before[before.start as usize..before.end as usize], REMOVAL); + self.print_tokens(&self.after[after.start as usize..after.end as usize], ADDITION); } fn finish(mut self) -> Self::Out { - if let Err(err) = self.flush() { + if let Err(err) = self.flush_accumulated_hunk() { self.err = Some(err); } if let Some(err) = self.err { diff --git a/gix-diff/tests/diff/blob/unified_diff.rs b/gix-diff/tests/diff/blob/unified_diff.rs index 87f060e7df4..4bb2df7d421 100644 --- a/gix-diff/tests/diff/blob/unified_diff.rs +++ b/gix-diff/tests/diff/blob/unified_diff.rs @@ -170,6 +170,125 @@ fn context_overlap_by_one_line_move_down() -> crate::Result { Ok(()) } +#[test] +fn added_on_top_keeps_context_correctly_sized() -> crate::Result { + let a = "1\n2\n3\n4\n5\n6\n7\n8\n9\n10"; + let b = "1\n2\n3\n4\n4.5\n5\n6\n7\n8\n9\n10"; + + let a = gix_diff::blob::sources::lines_with_terminator(a); + let b = gix_diff::blob::sources::lines_with_terminator(b); + let interner = gix_diff::blob::intern::InternedInput::new(a, b); + + let actual = gix_diff::blob::diff( + Algorithm::Myers, + &interner, + UnifiedDiff::new( + &interner, + String::new(), + NewlineSeparator::AfterHeaderAndWhenNeeded("\n"), + ContextSize::symmetrical(3), + ), + )?; + // TODO: fix this + insta::assert_snapshot!(actual, @r" + @@ -2,6 +2,7 @@ + 2 + 3 + 4 + +4.5 + 5 + 6 + 7 + "); + + let a = "1\n2\n3\n4\n5\n6\n7\n8\n9\n10"; + let b = "1\n2\n3\n4\n5\n6\n6.5\n7\n8\n9\n10"; + + let a = gix_diff::blob::sources::lines_with_terminator(a); + let b = gix_diff::blob::sources::lines_with_terminator(b); + let interner = gix_diff::blob::intern::InternedInput::new(a, b); + + let actual = gix_diff::blob::diff( + Algorithm::Myers, + &interner, + UnifiedDiff::new( + &interner, + String::new(), + NewlineSeparator::AfterHeaderAndWhenNeeded("\n"), + ContextSize::symmetrical(3), + ), + )?; + + insta::assert_snapshot!(actual, @r" + @@ -4,6 +4,7 @@ + 4 + 5 + 6 + +6.5 + 7 + 8 + 9 + "); + let a = "1\n2\n3\n4\n5\n6\n7\n8\n9\n10"; + let b = "1\n2\n3\n3.5\n4\n5\n6\n7\n8\n9\n10"; + + let a = gix_diff::blob::sources::lines_with_terminator(a); + let b = gix_diff::blob::sources::lines_with_terminator(b); + let interner = gix_diff::blob::intern::InternedInput::new(a, b); + + let actual = gix_diff::blob::diff( + Algorithm::Myers, + &interner, + UnifiedDiff::new( + &interner, + String::new(), + NewlineSeparator::AfterHeaderAndWhenNeeded("\n"), + ContextSize::symmetrical(3), + ), + )?; + + insta::assert_snapshot!(actual, @r" + @@ -1,6 +1,7 @@ + 1 + 2 + 3 + +3.5 + 4 + 5 + 6 + "); + + // From the end, for good measure + let a = "1\n2\n3\n4\n5\n6\n7\n8\n9\n10"; + let b = "1\n2\n3\n4\n5\n6\n7\n7.5\n8\n9\n10"; + + let a = gix_diff::blob::sources::lines_with_terminator(a); + let b = gix_diff::blob::sources::lines_with_terminator(b); + let interner = gix_diff::blob::intern::InternedInput::new(a, b); + + let actual = gix_diff::blob::diff( + Algorithm::Myers, + &interner, + UnifiedDiff::new( + &interner, + String::new(), + NewlineSeparator::AfterHeaderAndWhenNeeded("\n"), + ContextSize::symmetrical(3), + ), + )?; + insta::assert_snapshot!(actual, @r" + @@ -5,6 +5,7 @@ + 5 + 6 + 7 + +7.5 + 8 + 9 + 10 + "); + Ok(()) +} + #[test] fn removed_modified_added_with_newlines_in_tokens() -> crate::Result { let a = "1\n2\n3\n4\n5\n6\n7\n8\n9\n10"; From a845a4b5b0579cd65f1e2f5c18a751329ff9504f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christoph=20R=C3=BC=C3=9Fler?= Date: Fri, 4 Jul 2025 12:15:55 +0200 Subject: [PATCH 153/166] Make output more verbose --- gitoxide-core/src/repository/tag.rs | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/gitoxide-core/src/repository/tag.rs b/gitoxide-core/src/repository/tag.rs index 7dc9e3d93d6..4d51aed3c9e 100644 --- a/gitoxide-core/src/repository/tag.rs +++ b/gitoxide-core/src/repository/tag.rs @@ -5,12 +5,26 @@ pub fn list(repo: gix::Repository, out: &mut dyn std::io::Write) -> anyhow::Resu let tag = reference.peel_to_tag(); let tag_ref = tag.as_ref().map(gix::Tag::decode); - let name = match tag_ref { - Ok(Ok(tag)) => tag.name.to_string(), - _ => reference.name().shorten().to_string(), - }; + // `name` is the name of the file in `refs/tags/`. This applies to both lightweight as well + // as annotated tags. + let name = reference.name().shorten(); - writeln!(out, "{name}")?; + match tag_ref { + Ok(Ok(tag_ref)) => { + // `tag_name` is the name provided by the user via `git tag -a/-s/-u`. It is only + // present for annotated tags. + let tag_name = tag_ref.name; + + if name == tag_name { + writeln!(out, "{name} *")?; + } else { + writeln!(out, "{name} [tag name: {}]", tag_ref.name)?; + } + } + _ => { + writeln!(out, "{name}")?; + } + } } Ok(()) From 750ae9bc3cf72c1d9a358307e423523324eb25fb Mon Sep 17 00:00:00 2001 From: Sebastian Thiel Date: Sun, 6 Jul 2025 15:54:53 +0200 Subject: [PATCH 154/166] refactor - add alias - support `tags` as alias, invoked without explicit `list` - always put annotated tag information into `[]`, despite being more noisy. --- gitoxide-core/src/repository/tag.rs | 26 ++++++++++++++------------ src/plumbing/main.rs | 4 ++-- src/plumbing/options/mod.rs | 10 ++++++++-- 3 files changed, 24 insertions(+), 16 deletions(-) diff --git a/gitoxide-core/src/repository/tag.rs b/gitoxide-core/src/repository/tag.rs index 4d51aed3c9e..2bc109020e5 100644 --- a/gitoxide-core/src/repository/tag.rs +++ b/gitoxide-core/src/repository/tag.rs @@ -1,25 +1,27 @@ pub fn list(repo: gix::Repository, out: &mut dyn std::io::Write) -> anyhow::Result<()> { let platform = repo.references()?; - for mut reference in (platform.tags()?).flatten() { + for mut reference in platform.tags()?.flatten() { let tag = reference.peel_to_tag(); let tag_ref = tag.as_ref().map(gix::Tag::decode); - // `name` is the name of the file in `refs/tags/`. This applies to both lightweight as well - // as annotated tags. + // `name` is the name of the file in `refs/tags/`. + // This applies to both lightweight and annotated tags. let name = reference.name().shorten(); - + let mut fields = Vec::new(); match tag_ref { Ok(Ok(tag_ref)) => { - // `tag_name` is the name provided by the user via `git tag -a/-s/-u`. It is only - // present for annotated tags. - let tag_name = tag_ref.name; - - if name == tag_name { - writeln!(out, "{name} *")?; - } else { - writeln!(out, "{name} [tag name: {}]", tag_ref.name)?; + // `tag_name` is the name provided by the user via `git tag -a/-s/-u`. + // It is only present for annotated tags. + fields.push(format!( + "tag name: {}", + if name == tag_ref.name { "*".into() } else { tag_ref.name } + )); + if tag_ref.pgp_signature.is_some() { + fields.push("signed".into()); } + + writeln!(out, "{name} [{fields}]", fields = fields.join(", "))?; } _ => { writeln!(out, "{name}")?; diff --git a/src/plumbing/main.rs b/src/plumbing/main.rs index 00aea889375..12f2e5e7733 100644 --- a/src/plumbing/main.rs +++ b/src/plumbing/main.rs @@ -1304,8 +1304,8 @@ pub fn main() -> Result<()> { }, ), }, - Subcommands::Tag(cmd) => match cmd { - tag::Subcommands::List => prepare_and_run( + Subcommands::Tag(platform) => match platform.cmds { + Some(tag::Subcommands::List) | None => prepare_and_run( "tag-list", trace, auto_verbose, diff --git a/src/plumbing/options/mod.rs b/src/plumbing/options/mod.rs index 5b982599d81..33f636b323b 100644 --- a/src/plumbing/options/mod.rs +++ b/src/plumbing/options/mod.rs @@ -101,8 +101,8 @@ pub enum Subcommands { #[clap(subcommand)] Commit(commit::Subcommands), /// Interact with tag objects. - #[clap(subcommand)] - Tag(tag::Subcommands), + #[clap(visible_alias = "tags")] + Tag(tag::Platform), /// Verify the integrity of the entire repository Verify { #[clap(flatten)] @@ -932,6 +932,12 @@ pub mod commit { } pub mod tag { + #[derive(Debug, clap::Parser)] + pub struct Platform { + #[clap(subcommand)] + pub cmds: Option, + } + #[derive(Debug, clap::Subcommand)] pub enum Subcommands { /// List all tags. From 6c77b541b476656827ee0542a650b9731ba549cf Mon Sep 17 00:00:00 2001 From: Colin Nelson Date: Tue, 24 Jun 2025 15:20:31 -0700 Subject: [PATCH 155/166] feat!: walkdir_sorted_new adds max_depth parameter max_depth parameter determines the maximum depth the WalkDir will recurse into. Example values: * 0 -> Returns only the root path with no children. * 1 -> Returns the root path, with children. * 2..n -> Returns the root path, children and {n}-grandchildren --- gix-features/src/fs.rs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/gix-features/src/fs.rs b/gix-features/src/fs.rs index 1838dcdbd87..a1769cd0b21 100644 --- a/gix-features/src/fs.rs +++ b/gix-features/src/fs.rs @@ -207,9 +207,14 @@ pub mod walkdir { /// Instantiate a new directory iterator which will not skip hidden files and is sorted, with the given level of `parallelism`. /// /// Use `precompose_unicode` to represent the `core.precomposeUnicode` configuration option. - pub fn walkdir_sorted_new(root: &Path, _: Parallelism, precompose_unicode: bool) -> WalkDir { + /// Use `max_depth` to limit the depth of the recursive walk. + /// * 0 -> Returns only the root path with no children + /// * 1 -> Root directory and children. + /// * 2..n -> Root directory, children and {n}-grandchildren + pub fn walkdir_sorted_new(root: &Path, _: Parallelism, max_depth: usize, precompose_unicode: bool) -> WalkDir { WalkDir { inner: WalkDirImpl::new(root) + .max_depth(max_depth) .sort_by(|a, b| { let storage_a; let storage_b; From a2741da85fe04907f8773a99813e3802333b402d Mon Sep 17 00:00:00 2001 From: Colin Nelson Date: Tue, 24 Jun 2025 15:20:31 -0700 Subject: [PATCH 156/166] adapt to changes in gix_features::walkdir_sorted_new --- gix-ref/src/store/file/loose/iter.rs | 1 + gix-submodule/tests/file/baseline.rs | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/gix-ref/src/store/file/loose/iter.rs b/gix-ref/src/store/file/loose/iter.rs index 31d91a4b094..2b8be91da4b 100644 --- a/gix-ref/src/store/file/loose/iter.rs +++ b/gix-ref/src/store/file/loose/iter.rs @@ -24,6 +24,7 @@ impl SortedLoosePaths { gix_features::fs::walkdir_sorted_new( path, gix_features::fs::walkdir::Parallelism::Serial, + usize::MAX, precompose_unicode, ) .into_iter() diff --git a/gix-submodule/tests/file/baseline.rs b/gix-submodule/tests/file/baseline.rs index 6971cdb33a7..513b5051af0 100644 --- a/gix-submodule/tests/file/baseline.rs +++ b/gix-submodule/tests/file/baseline.rs @@ -61,7 +61,7 @@ fn common_values_and_names_by_path() -> crate::Result { fn module_files() -> impl Iterator { let dir = gix_testtools::scripted_fixture_read_only("basic.sh").expect("valid fixture"); - gix_features::fs::walkdir_sorted_new(&dir, Parallelism::Serial, false) + gix_features::fs::walkdir_sorted_new(&dir, Parallelism::Serial, usize::MAX, false) .follow_links(false) .into_iter() .filter_map(move |entry| { From fdf5153d9fe5e7c059b5a9687b7041e16ba54683 Mon Sep 17 00:00:00 2001 From: Colin Nelson Date: Tue, 24 Jun 2025 15:20:31 -0700 Subject: [PATCH 157/166] feat: refs support pseudo refs --- gix-ref/src/store/file/loose/iter.rs | 20 +++- gix-ref/src/store/file/overlay_iter.rs | 111 +++++++++++++----- .../make_pref_repository.tar | Bin 0 -> 81920 bytes .../tests/fixtures/make_pref_repository.sh | 41 +++++++ gix-ref/tests/refs/main.rs | 1 + gix-ref/tests/refs/pseudo_refs.rs | 21 ++++ 6 files changed, 160 insertions(+), 34 deletions(-) create mode 100644 gix-ref/tests/fixtures/generated-archives/make_pref_repository.tar create mode 100755 gix-ref/tests/fixtures/make_pref_repository.sh create mode 100644 gix-ref/tests/refs/pseudo_refs.rs diff --git a/gix-ref/src/store/file/loose/iter.rs b/gix-ref/src/store/file/loose/iter.rs index 2b8be91da4b..a44ff92b7b8 100644 --- a/gix-ref/src/store/file/loose/iter.rs +++ b/gix-ref/src/store/file/loose/iter.rs @@ -11,20 +11,31 @@ pub(in crate::store_impl::file) struct SortedLoosePaths { pub(crate) base: PathBuf, /// An prefix like `refs/heads/foo/` or `refs/heads/prefix` that a returned reference must match against.. prefix: Option, + /// A suffix like `HEAD` that a returned reference must match against.. + suffix: Option, file_walk: Option, } impl SortedLoosePaths { - pub fn at(path: &Path, base: PathBuf, prefix: Option, precompose_unicode: bool) -> Self { + pub fn at( + path: &Path, + base: PathBuf, + prefix: Option, + suffix: Option, + root_only: bool, + precompose_unicode: bool, + ) -> Self { + let depth = if root_only { 1 } else { usize::MAX }; SortedLoosePaths { base, prefix, + suffix, file_walk: path.is_dir().then(|| { // serial iteration as we expect most refs in packed-refs anyway. gix_features::fs::walkdir_sorted_new( path, gix_features::fs::walkdir::Parallelism::Serial, - usize::MAX, + depth, precompose_unicode, ) .into_iter() @@ -57,6 +68,11 @@ impl Iterator for SortedLoosePaths { continue; } } + if let Some(suffix) = &self.suffix { + if !full_name.ends_with(suffix) { + continue; + } + } if gix_validate::reference::name_partial(full_name.as_bstr()).is_ok() { let name = FullName(full_name); return Some(Ok((full_path, name))); diff --git a/gix-ref/src/store/file/overlay_iter.rs b/gix-ref/src/store/file/overlay_iter.rs index d6c3b5ae8c8..6850fba2137 100644 --- a/gix-ref/src/store/file/overlay_iter.rs +++ b/gix-ref/src/store/file/overlay_iter.rs @@ -10,7 +10,7 @@ use gix_object::bstr::ByteSlice; use gix_path::RelativePath; use crate::{ - file::{loose, loose::iter::SortedLoosePaths}, + file::loose::{self, iter::SortedLoosePaths}, store_impl::{file, packed}, BStr, FullName, Namespace, Reference, }; @@ -85,36 +85,48 @@ impl<'p> LooseThenPacked<'p, '_> { } fn convert_loose(&mut self, res: std::io::Result<(PathBuf, FullName)>) -> Result { - let (refpath, name) = res.map_err(Error::Traversal)?; - std::fs::File::open(&refpath) - .and_then(|mut f| { - self.buf.clear(); - f.read_to_end(&mut self.buf) - }) - .map_err(|err| Error::ReadFileContents { - source: err, - path: refpath.to_owned(), - })?; - loose::Reference::try_from_path(name, &self.buf) - .map_err(|err| { - let relative_path = refpath - .strip_prefix(self.git_dir) - .ok() - .or_else(|| { - self.common_dir - .and_then(|common_dir| refpath.strip_prefix(common_dir).ok()) - }) - .expect("one of our bases contains the path"); - Error::ReferenceCreation { - source: err, - relative_path: relative_path.into(), - } - }) - .map(Into::into) - .map(|r| self.strip_namespace(r)) + convert_loose(&mut self.buf, self.git_dir, self.common_dir, self.namespace, res) } } +pub(crate) fn convert_loose( + buf: &mut Vec, + git_dir: &Path, + common_dir: Option<&Path>, + namespace: Option<&Namespace>, + res: std::io::Result<(PathBuf, FullName)>, +) -> Result { + let (refpath, name) = res.map_err(Error::Traversal)?; + std::fs::File::open(&refpath) + .and_then(|mut f| { + buf.clear(); + f.read_to_end(buf) + }) + .map_err(|err| Error::ReadFileContents { + source: err, + path: refpath.to_owned(), + })?; + loose::Reference::try_from_path(name, buf) + .map_err(|err| { + let relative_path = refpath + .strip_prefix(git_dir) + .ok() + .or_else(|| common_dir.and_then(|common_dir| refpath.strip_prefix(common_dir).ok())) + .expect("one of our bases contains the path"); + Error::ReferenceCreation { + source: err, + relative_path: relative_path.into(), + } + }) + .map(Into::into) + .map(|mut r: Reference| { + if let Some(namespace) = namespace { + r.strip_namespace(namespace); + } + r + }) +} + impl Iterator for LooseThenPacked<'_, '_> { type Item = Result; @@ -210,6 +222,11 @@ impl Platform<'_> { self.store .iter_prefixed_packed(prefix, self.packed.as_ref().map(|b| &***b)) } + + /// Return an iterator over the pseudo references + pub fn psuedo_refs(&self) -> std::io::Result> { + self.store.iter_pseudo_refs() + } } impl file::Store { @@ -254,6 +271,10 @@ pub(crate) enum IterInfo<'a> { /// If `true`, we will convert decomposed into precomposed unicode. precompose_unicode: bool, }, + PseudoRefs { + base: &'a Path, + precompose_unicode: bool, + }, } impl<'a> IterInfo<'a> { @@ -263,6 +284,7 @@ impl<'a> IterInfo<'a> { IterInfo::PrefixAndBase { prefix, .. } => Some(gix_path::into_bstr(*prefix)), IterInfo::BaseAndIterRoot { prefix, .. } => Some(gix_path::into_bstr(prefix.clone())), IterInfo::ComputedIterationRoot { prefix, .. } => Some(prefix.clone()), + IterInfo::PseudoRefs { .. } => None, } } @@ -271,24 +293,35 @@ impl<'a> IterInfo<'a> { IterInfo::Base { base, precompose_unicode, - } => SortedLoosePaths::at(&base.join("refs"), base.into(), None, precompose_unicode), + } => SortedLoosePaths::at(&base.join("refs"), base.into(), None, None, false, precompose_unicode), IterInfo::BaseAndIterRoot { base, iter_root, prefix: _, precompose_unicode, - } => SortedLoosePaths::at(&iter_root, base.into(), None, precompose_unicode), + } => SortedLoosePaths::at(&iter_root, base.into(), None, None, false, precompose_unicode), IterInfo::PrefixAndBase { base, prefix, precompose_unicode, - } => SortedLoosePaths::at(&base.join(prefix), base.into(), None, precompose_unicode), + } => SortedLoosePaths::at(&base.join(prefix), base.into(), None, None, false, precompose_unicode), IterInfo::ComputedIterationRoot { iter_root, base, prefix, precompose_unicode, - } => SortedLoosePaths::at(&iter_root, base.into(), Some(prefix.into_owned()), precompose_unicode), + } => SortedLoosePaths::at( + &iter_root, + base.into(), + Some(prefix.into_owned()), + None, + false, + precompose_unicode, + ), + IterInfo::PseudoRefs { + base, + precompose_unicode, + } => SortedLoosePaths::at(base, base.into(), None, Some("HEAD".into()), true, precompose_unicode), } .peekable() } @@ -354,6 +387,20 @@ impl file::Store { } } + /// Return an iterator over all pseudo references, loose or `packed`, sorted by their name. + /// + /// Errors are returned similarly to what would happen when loose and packed refs where iterated by themselves. + pub fn iter_pseudo_refs<'p>(&'_ self) -> std::io::Result> { + self.iter_from_info( + IterInfo::PseudoRefs { + base: self.git_dir(), + precompose_unicode: self.precompose_unicode, + }, + None, + None, + ) + } + /// As [`iter(…)`](file::Store::iter()), but filters by `prefix`, i.e. `refs/heads/` or /// `refs/heads/feature-`. /// Note that if a prefix isn't using a trailing `/`, like in `refs/heads/foo`, it will effectively diff --git a/gix-ref/tests/fixtures/generated-archives/make_pref_repository.tar b/gix-ref/tests/fixtures/generated-archives/make_pref_repository.tar new file mode 100644 index 0000000000000000000000000000000000000000..e8942611672e0792c012edba1bf008c46dc0f280 GIT binary patch literal 81920 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 literal 0 HcmV?d00001 diff --git a/gix-ref/tests/fixtures/make_pref_repository.sh b/gix-ref/tests/fixtures/make_pref_repository.sh new file mode 100755 index 00000000000..df3faa2eb82 --- /dev/null +++ b/gix-ref/tests/fixtures/make_pref_repository.sh @@ -0,0 +1,41 @@ +#!/usr/bin/env bash +set -eu -o pipefail + +git init -q + +git checkout -q -b main +git commit -q --allow-empty -m c1 +git branch dt1 +git branch d1 +git branch A + +mkdir -p .git/refs/remotes/origin +mkdir -p .git/refs/prefix/feature/sub/dir + +cp .git/refs/heads/main .git/refs/remotes/origin/ +cp .git/refs/heads/main .git/refs/d1 +cp .git/refs/heads/main .git/refs/prefix/feature-suffix +cp .git/refs/heads/main .git/refs/prefix/feature/sub/dir/algo + +echo "ref: refs/remotes/origin/main" > .git/refs/remotes/origin/HEAD +echo "notahexsha" > .git/refs/broken + +git rev-parse HEAD > .git/JIRI_HEAD +touch .git/SOME_ALL_CAPS_FILE +touch .git/refs/SHOULD_BE_EXCLUDED_HEAD + +cat <> .git/FETCH_HEAD +9064ea31fae4dc59a56bdd3a06c0ddc990ee689e branch 'main' of https://github.com/Byron/gitoxide +1b8d9e6a408e480ae1912e919c37a26e5c46639d not-for-merge branch 'faster-discovery' of https://github.com/Byron/gitoxide +43f695a9607f1f85f859f2ef944b785b5b6dd238 not-for-merge branch 'fix-823' of https://github.com/Byron/gitoxide +96267708958ead2646aae8766a50fa060739003c not-for-merge branch 'fix-bare-with-index' of https://github.com/Byron/gitoxide +1397e19375bb98522f951b8a452b08c1b35ffbac not-for-merge branch 'gix-archive' of https://github.com/Byron/gitoxide +db71ec8b7c7f2730c47dde3bb662ab56ae89ae7d not-for-merge branch 'index-from-files' of https://github.com/Byron/gitoxide +9f0c71917e57653d2e7121eae65d9385a188a8df not-for-merge branch 'moonwalk' of https://github.com/Byron/gitoxide +44d2b67de5639d4ea3d08ab030ecfe4bdfc8cbfb not-for-merge branch 'release-gix' of https://github.com/Byron/gitoxide +37c3d073b15dafcb52b2040e4b92a413c69a726d not-for-merge branch 'smart-release-without-git2' of https://github.com/Byron/gitoxide +af3608ad397784795c3758a1ac99ec6a367de9be not-for-merge branch 'walk-with-commitgraph' of https://github.com/Byron/gitoxide +EOF + +git tag t1 +git tag -m "tag object" dt1 diff --git a/gix-ref/tests/refs/main.rs b/gix-ref/tests/refs/main.rs index ddd06716f88..05123b5fdf5 100644 --- a/gix-ref/tests/refs/main.rs +++ b/gix-ref/tests/refs/main.rs @@ -39,6 +39,7 @@ mod partialname { } mod namespace; mod packed; +mod pseudo_refs; mod reference; mod store; mod transaction; diff --git a/gix-ref/tests/refs/pseudo_refs.rs b/gix-ref/tests/refs/pseudo_refs.rs new file mode 100644 index 00000000000..097ca217e85 --- /dev/null +++ b/gix-ref/tests/refs/pseudo_refs.rs @@ -0,0 +1,21 @@ +use crate::file::store_at; + +#[test] +fn pseudo_refs_iterate_valid_pseudorefs() -> crate::Result { + let store = store_at("make_pref_repository.sh")?; + + let prefs = store + .iter_pseudo_refs()? + .map(Result::unwrap) + .map(|r: gix_ref::Reference| r.name) + .collect::>(); + + let expected_prefs = vec!["FETCH_HEAD", "HEAD", "JIRI_HEAD"]; + + assert_eq!( + prefs.iter().map(gix_ref::FullName::as_bstr).collect::>(), + expected_prefs + ); + + Ok(()) +} From 2affbab7491d6b4667572d4d17db864c5b703c7a Mon Sep 17 00:00:00 2001 From: Sebastian Thiel Date: Fri, 11 Jul 2025 06:54:02 +0200 Subject: [PATCH 158/166] feat: add `repo.references().pseudo()` for traversing refs like `HEAD` and `FETCH_HEAD`. --- gix/src/reference/iter.rs | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/gix/src/reference/iter.rs b/gix/src/reference/iter.rs index a18ecbeda91..62fcbe8d02e 100644 --- a/gix/src/reference/iter.rs +++ b/gix/src/reference/iter.rs @@ -32,7 +32,8 @@ impl<'r> Iter<'r> { } impl Platform<'_> { - /// Return an iterator over all references in the repository. + /// Return an iterator over all references in the repository, excluding + /// pseudo references. /// /// Even broken or otherwise unparsable or inaccessible references are returned and have to be handled by the caller on a /// case by case basis. @@ -69,6 +70,12 @@ impl Platform<'_> { )) } + // TODO: tests + /// Return an iterator over all local pseudo references. + pub fn pseudo_refs(&self) -> Result, init::Error> { + Ok(Iter::new(self.repo, self.platform.psuedo_refs()?)) + } + // TODO: tests /// Return an iterator over all remote branches. /// From 43f92b5285af6696cd21f0e94f3bec568aef8468 Mon Sep 17 00:00:00 2001 From: Sebastian Thiel Date: Fri, 11 Jul 2025 06:56:24 +0200 Subject: [PATCH 159/166] refactor - fix typo - move and simplify test; minimize its fixture - adjust docs --- gix-features/src/fs.rs | 9 +- gix-ref/src/lib.rs | 2 +- gix-ref/src/store/file/loose/iter.rs | 3 +- gix-ref/src/store/file/overlay_iter.rs | 110 ++++++++---------- ...ory.tar => make_pseudo_ref_repository.tar} | Bin 81920 -> 58880 bytes .../tests/fixtures/make_pref_repository.sh | 41 ------- .../fixtures/make_pseudo_ref_repository.sh | 14 +++ gix-ref/tests/refs/file/store/iter.rs | 17 ++- gix-ref/tests/refs/main.rs | 1 - gix-ref/tests/refs/pseudo_refs.rs | 21 ---- gix/src/reference/iter.rs | 4 +- 11 files changed, 88 insertions(+), 134 deletions(-) rename gix-ref/tests/fixtures/generated-archives/{make_pref_repository.tar => make_pseudo_ref_repository.tar} (57%) delete mode 100755 gix-ref/tests/fixtures/make_pref_repository.sh create mode 100755 gix-ref/tests/fixtures/make_pseudo_ref_repository.sh delete mode 100644 gix-ref/tests/refs/pseudo_refs.rs diff --git a/gix-features/src/fs.rs b/gix-features/src/fs.rs index a1769cd0b21..164d6913483 100644 --- a/gix-features/src/fs.rs +++ b/gix-features/src/fs.rs @@ -208,9 +208,12 @@ pub mod walkdir { /// /// Use `precompose_unicode` to represent the `core.precomposeUnicode` configuration option. /// Use `max_depth` to limit the depth of the recursive walk. - /// * 0 -> Returns only the root path with no children - /// * 1 -> Root directory and children. - /// * 2..n -> Root directory, children and {n}-grandchildren + /// * `0` + /// - Returns only the root path with no children + /// * `1` + /// - Root directory and children. + /// * `1..n` + /// - Root directory, children and {n}-grandchildren pub fn walkdir_sorted_new(root: &Path, _: Parallelism, max_depth: usize, precompose_unicode: bool) -> WalkDir { WalkDir { inner: WalkDirImpl::new(root) diff --git a/gix-ref/src/lib.rs b/gix-ref/src/lib.rs index a564d0f6488..1d9eded44cc 100644 --- a/gix-ref/src/lib.rs +++ b/gix-ref/src/lib.rs @@ -166,7 +166,7 @@ pub enum Category<'a> { RemoteBranch, /// A tag in `refs/notes` Note, - /// Something outside of `ref/` in the current worktree, typically `HEAD`. + /// Something outside `ref/` in the current worktree, typically `HEAD`. PseudoRef, /// A `PseudoRef`, but referenced so that it will always refer to the main worktree by /// prefixing it with `main-worktree/`. diff --git a/gix-ref/src/store/file/loose/iter.rs b/gix-ref/src/store/file/loose/iter.rs index a44ff92b7b8..c0c7b7f3a8b 100644 --- a/gix-ref/src/store/file/loose/iter.rs +++ b/gix-ref/src/store/file/loose/iter.rs @@ -22,10 +22,9 @@ impl SortedLoosePaths { base: PathBuf, prefix: Option, suffix: Option, - root_only: bool, precompose_unicode: bool, ) -> Self { - let depth = if root_only { 1 } else { usize::MAX }; + let depth = if suffix.is_some() { 1 } else { usize::MAX }; SortedLoosePaths { base, prefix, diff --git a/gix-ref/src/store/file/overlay_iter.rs b/gix-ref/src/store/file/overlay_iter.rs index 6850fba2137..8c4b2c36809 100644 --- a/gix-ref/src/store/file/overlay_iter.rs +++ b/gix-ref/src/store/file/overlay_iter.rs @@ -1,3 +1,5 @@ +use gix_object::bstr::ByteSlice; +use gix_path::RelativePath; use std::{ borrow::Cow, cmp::Ordering, @@ -6,9 +8,6 @@ use std::{ path::{Path, PathBuf}, }; -use gix_object::bstr::ByteSlice; -use gix_path::RelativePath; - use crate::{ file::loose::{self, iter::SortedLoosePaths}, store_impl::{file, packed}, @@ -85,46 +84,34 @@ impl<'p> LooseThenPacked<'p, '_> { } fn convert_loose(&mut self, res: std::io::Result<(PathBuf, FullName)>) -> Result { - convert_loose(&mut self.buf, self.git_dir, self.common_dir, self.namespace, res) - } -} - -pub(crate) fn convert_loose( - buf: &mut Vec, - git_dir: &Path, - common_dir: Option<&Path>, - namespace: Option<&Namespace>, - res: std::io::Result<(PathBuf, FullName)>, -) -> Result { - let (refpath, name) = res.map_err(Error::Traversal)?; - std::fs::File::open(&refpath) - .and_then(|mut f| { - buf.clear(); - f.read_to_end(buf) - }) - .map_err(|err| Error::ReadFileContents { - source: err, - path: refpath.to_owned(), - })?; - loose::Reference::try_from_path(name, buf) - .map_err(|err| { - let relative_path = refpath - .strip_prefix(git_dir) - .ok() - .or_else(|| common_dir.and_then(|common_dir| refpath.strip_prefix(common_dir).ok())) - .expect("one of our bases contains the path"); - Error::ReferenceCreation { + let buf = &mut self.buf; + let git_dir = self.git_dir; + let common_dir = self.common_dir; + let (refpath, name) = res.map_err(Error::Traversal)?; + std::fs::File::open(&refpath) + .and_then(|mut f| { + buf.clear(); + f.read_to_end(buf) + }) + .map_err(|err| Error::ReadFileContents { source: err, - relative_path: relative_path.into(), - } - }) - .map(Into::into) - .map(|mut r: Reference| { - if let Some(namespace) = namespace { - r.strip_namespace(namespace); - } - r - }) + path: refpath.to_owned(), + })?; + loose::Reference::try_from_path(name, buf) + .map_err(|err| { + let relative_path = refpath + .strip_prefix(git_dir) + .ok() + .or_else(|| common_dir.and_then(|common_dir| refpath.strip_prefix(common_dir).ok())) + .expect("one of our bases contains the path"); + Error::ReferenceCreation { + source: err, + relative_path: relative_path.into(), + } + }) + .map(Into::into) + .map(|r| self.strip_namespace(r)) + } } impl Iterator for LooseThenPacked<'_, '_> { @@ -203,9 +190,9 @@ impl Iterator for LooseThenPacked<'_, '_> { } impl Platform<'_> { - /// Return an iterator over all references, loose or `packed`, sorted by their name. + /// Return an iterator over all references, loose or packed, sorted by their name. /// - /// Errors are returned similarly to what would happen when loose and packed refs where iterated by themselves. + /// Errors are returned similarly to what would happen when loose and packed refs were iterated by themselves. pub fn all(&self) -> std::io::Result> { self.store.iter_packed(self.packed.as_ref().map(|b| &***b)) } @@ -223,16 +210,17 @@ impl Platform<'_> { .iter_prefixed_packed(prefix, self.packed.as_ref().map(|b| &***b)) } - /// Return an iterator over the pseudo references - pub fn psuedo_refs(&self) -> std::io::Result> { - self.store.iter_pseudo_refs() + /// Return an iterator over the pseudo references, like `HEAD` or `FETCH_HEAD`, or anything else suffixed with `HEAD` + /// in the root of the `.git` directory, sorted by name. + pub fn pseudo(&self) -> std::io::Result> { + self.store.iter_pseudo() } } impl file::Store { /// Return a platform to obtain iterator over all references, or prefixed ones, loose or packed, sorted by their name. /// - /// Errors are returned similarly to what would happen when loose and packed refs where iterated by themselves. + /// Errors are returned similarly to what would happen when loose and packed refs were iterated by themselves. /// /// Note that since packed-refs are storing refs as precomposed unicode if [`Self::precompose_unicode`] is true, for consistency /// we also return loose references as precomposed unicode. @@ -271,7 +259,7 @@ pub(crate) enum IterInfo<'a> { /// If `true`, we will convert decomposed into precomposed unicode. precompose_unicode: bool, }, - PseudoRefs { + Pseudo { base: &'a Path, precompose_unicode: bool, }, @@ -284,7 +272,7 @@ impl<'a> IterInfo<'a> { IterInfo::PrefixAndBase { prefix, .. } => Some(gix_path::into_bstr(*prefix)), IterInfo::BaseAndIterRoot { prefix, .. } => Some(gix_path::into_bstr(prefix.clone())), IterInfo::ComputedIterationRoot { prefix, .. } => Some(prefix.clone()), - IterInfo::PseudoRefs { .. } => None, + IterInfo::Pseudo { .. } => None, } } @@ -293,18 +281,18 @@ impl<'a> IterInfo<'a> { IterInfo::Base { base, precompose_unicode, - } => SortedLoosePaths::at(&base.join("refs"), base.into(), None, None, false, precompose_unicode), + } => SortedLoosePaths::at(&base.join("refs"), base.into(), None, None, precompose_unicode), IterInfo::BaseAndIterRoot { base, iter_root, prefix: _, precompose_unicode, - } => SortedLoosePaths::at(&iter_root, base.into(), None, None, false, precompose_unicode), + } => SortedLoosePaths::at(&iter_root, base.into(), None, None, precompose_unicode), IterInfo::PrefixAndBase { base, prefix, precompose_unicode, - } => SortedLoosePaths::at(&base.join(prefix), base.into(), None, None, false, precompose_unicode), + } => SortedLoosePaths::at(&base.join(prefix), base.into(), None, None, precompose_unicode), IterInfo::ComputedIterationRoot { iter_root, base, @@ -315,13 +303,12 @@ impl<'a> IterInfo<'a> { base.into(), Some(prefix.into_owned()), None, - false, precompose_unicode, ), - IterInfo::PseudoRefs { + IterInfo::Pseudo { base, precompose_unicode, - } => SortedLoosePaths::at(base, base.into(), None, Some("HEAD".into()), true, precompose_unicode), + } => SortedLoosePaths::at(base, base.into(), None, Some("HEAD".into()), precompose_unicode), } .peekable() } @@ -354,7 +341,7 @@ impl<'a> IterInfo<'a> { impl file::Store { /// Return an iterator over all references, loose or `packed`, sorted by their name. /// - /// Errors are returned similarly to what would happen when loose and packed refs where iterated by themselves. + /// Errors are returned similarly to what would happen when loose and packed refs were iterated by themselves. pub fn iter_packed<'s, 'p>( &'s self, packed: Option<&'p packed::Buffer>, @@ -387,12 +374,13 @@ impl file::Store { } } - /// Return an iterator over all pseudo references, loose or `packed`, sorted by their name. + /// Return an iterator over the pseudo references, like `HEAD` or `FETCH_HEAD`, or anything else suffixed with `HEAD` + /// in the root of the `.git` directory, sorted by name. /// - /// Errors are returned similarly to what would happen when loose and packed refs where iterated by themselves. - pub fn iter_pseudo_refs<'p>(&'_ self) -> std::io::Result> { + /// Errors are returned similarly to what would happen when loose refs were iterated by themselves. + pub fn iter_pseudo<'p>(&'_ self) -> std::io::Result> { self.iter_from_info( - IterInfo::PseudoRefs { + IterInfo::Pseudo { base: self.git_dir(), precompose_unicode: self.precompose_unicode, }, diff --git a/gix-ref/tests/fixtures/generated-archives/make_pref_repository.tar b/gix-ref/tests/fixtures/generated-archives/make_pseudo_ref_repository.tar similarity index 57% rename from gix-ref/tests/fixtures/generated-archives/make_pref_repository.tar rename to gix-ref/tests/fixtures/generated-archives/make_pseudo_ref_repository.tar index e8942611672e0792c012edba1bf008c46dc0f280..68efa91bb9c1692a30f40a20e40e8d9e9491ffb4 100644 GIT binary patch delta 971 zcmZo@U~M?Vyn&TvG3yMb$*c?NqzsIWj2R3KOw0@oj0}v74Hygz3=NIVOc)F%C$gt( zW?XoQadXu&UB*dM+Qd!K6&eARLKIGBWc<&PnU`6z+0ke}<3t79P0v_aHnYBCWm?W9 z#t0-d7@0P6{a|C-F2Kh4fl(tZF)hV1#lRxb!q_s!(lRB<%pl3g$S66*)FRa=)gTEd zZ|CJO3-4LBu-nPkjO4dH3) zG%I8MAp-#y+vnQf^iG)NZI{+~v|i<<81pd?kAvsU7hGvBt~`7oIq9UOsl<<(j8IXH z4%z7^Qj!yR&nYkN6A6pF5joLx#Uy8=y6o*i54(RJUcIlT?%r1s?|lu*X^M_5%HL+# zeOtdwv@ZAF>-pBc&39ub%dMPgKCj!1hXD#UTRx~}+;oMHWi#Ko@2rzqAJsD%8E$U- zP{lauNsJC>W_n(JQEGBxajJr?LP=3+Di>z~ke{DhkYAiynwOcJp8}Hsrql|?Wk!rF z{D!9Hrk17#CPpT@KqVEM72n(k<_Mu_7L2VDCK&0%#M~SjAln%&8F?8+j4ky{6*L?R e3UX2v+%rpb4NXln!P#K5!J7+=U}ACsdp!UT`!cft delta 5558 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 .git/refs/remotes/origin/HEAD -echo "notahexsha" > .git/refs/broken - -git rev-parse HEAD > .git/JIRI_HEAD -touch .git/SOME_ALL_CAPS_FILE -touch .git/refs/SHOULD_BE_EXCLUDED_HEAD - -cat <> .git/FETCH_HEAD -9064ea31fae4dc59a56bdd3a06c0ddc990ee689e branch 'main' of https://github.com/Byron/gitoxide -1b8d9e6a408e480ae1912e919c37a26e5c46639d not-for-merge branch 'faster-discovery' of https://github.com/Byron/gitoxide -43f695a9607f1f85f859f2ef944b785b5b6dd238 not-for-merge branch 'fix-823' of https://github.com/Byron/gitoxide -96267708958ead2646aae8766a50fa060739003c not-for-merge branch 'fix-bare-with-index' of https://github.com/Byron/gitoxide -1397e19375bb98522f951b8a452b08c1b35ffbac not-for-merge branch 'gix-archive' of https://github.com/Byron/gitoxide -db71ec8b7c7f2730c47dde3bb662ab56ae89ae7d not-for-merge branch 'index-from-files' of https://github.com/Byron/gitoxide -9f0c71917e57653d2e7121eae65d9385a188a8df not-for-merge branch 'moonwalk' of https://github.com/Byron/gitoxide -44d2b67de5639d4ea3d08ab030ecfe4bdfc8cbfb not-for-merge branch 'release-gix' of https://github.com/Byron/gitoxide -37c3d073b15dafcb52b2040e4b92a413c69a726d not-for-merge branch 'smart-release-without-git2' of https://github.com/Byron/gitoxide -af3608ad397784795c3758a1ac99ec6a367de9be not-for-merge branch 'walk-with-commitgraph' of https://github.com/Byron/gitoxide -EOF - -git tag t1 -git tag -m "tag object" dt1 diff --git a/gix-ref/tests/fixtures/make_pseudo_ref_repository.sh b/gix-ref/tests/fixtures/make_pseudo_ref_repository.sh new file mode 100755 index 00000000000..ef4b3476dae --- /dev/null +++ b/gix-ref/tests/fixtures/make_pseudo_ref_repository.sh @@ -0,0 +1,14 @@ +#!/usr/bin/env bash +set -eu -o pipefail + +git init -q +git commit -m "init" --allow-empty + +git rev-parse HEAD > .git/JIRI_HEAD +touch .git/SOME_ALL_CAPS_FILE +touch .git/refs/SHOULD_BE_EXCLUDED_HEAD + +cat <> .git/FETCH_HEAD +9064ea31fae4dc59a56bdd3a06c0ddc990ee689e branch 'main' of https://github.com/Byron/gitoxide +1b8d9e6a408e480ae1912e919c37a26e5c46639d not-for-merge branch 'faster-discovery' of https://github.com/Byron/gitoxide +EOF \ No newline at end of file diff --git a/gix-ref/tests/refs/file/store/iter.rs b/gix-ref/tests/refs/file/store/iter.rs index 68259c0b1b9..91639672e6e 100644 --- a/gix-ref/tests/refs/file/store/iter.rs +++ b/gix-ref/tests/refs/file/store/iter.rs @@ -1,9 +1,8 @@ -use gix_object::bstr::ByteSlice; - use crate::{ file::{store, store_at, store_with_packed_refs}, hex_to_id, }; +use gix_object::bstr::ByteSlice; mod with_namespace { use gix_object::bstr::{BString, ByteSlice}; @@ -257,6 +256,20 @@ fn packed_file_iter() -> crate::Result { Ok(()) } +#[test] +fn pseudo_refs_iter() -> crate::Result { + let store = store_at("make_pseudo_ref_repository.sh")?; + + let actual = store + .iter_pseudo()? + .map(Result::unwrap) + .map(|r: gix_ref::Reference| r.name.as_bstr().to_string()) + .collect::>(); + + assert_eq!(actual, ["FETCH_HEAD", "HEAD", "JIRI_HEAD"]); + Ok(()) +} + #[test] fn loose_iter_with_broken_refs() -> crate::Result { let store = store()?; diff --git a/gix-ref/tests/refs/main.rs b/gix-ref/tests/refs/main.rs index 05123b5fdf5..ddd06716f88 100644 --- a/gix-ref/tests/refs/main.rs +++ b/gix-ref/tests/refs/main.rs @@ -39,7 +39,6 @@ mod partialname { } mod namespace; mod packed; -mod pseudo_refs; mod reference; mod store; mod transaction; diff --git a/gix-ref/tests/refs/pseudo_refs.rs b/gix-ref/tests/refs/pseudo_refs.rs deleted file mode 100644 index 097ca217e85..00000000000 --- a/gix-ref/tests/refs/pseudo_refs.rs +++ /dev/null @@ -1,21 +0,0 @@ -use crate::file::store_at; - -#[test] -fn pseudo_refs_iterate_valid_pseudorefs() -> crate::Result { - let store = store_at("make_pref_repository.sh")?; - - let prefs = store - .iter_pseudo_refs()? - .map(Result::unwrap) - .map(|r: gix_ref::Reference| r.name) - .collect::>(); - - let expected_prefs = vec!["FETCH_HEAD", "HEAD", "JIRI_HEAD"]; - - assert_eq!( - prefs.iter().map(gix_ref::FullName::as_bstr).collect::>(), - expected_prefs - ); - - Ok(()) -} diff --git a/gix/src/reference/iter.rs b/gix/src/reference/iter.rs index 62fcbe8d02e..66952577b64 100644 --- a/gix/src/reference/iter.rs +++ b/gix/src/reference/iter.rs @@ -72,8 +72,8 @@ impl Platform<'_> { // TODO: tests /// Return an iterator over all local pseudo references. - pub fn pseudo_refs(&self) -> Result, init::Error> { - Ok(Iter::new(self.repo, self.platform.psuedo_refs()?)) + pub fn pseudo(&self) -> Result, init::Error> { + Ok(Iter::new(self.repo, self.platform.pseudo()?)) } // TODO: tests From e249706a52c372329814dc4437ae46288fb25055 Mon Sep 17 00:00:00 2001 From: Eliah Kagan Date: Sat, 12 Jul 2025 23:00:25 -0400 Subject: [PATCH 160/166] Add `just` recipes that trigger `release.yml` This adds three recipes to the `justfile`. Two of these recipes trigger the release workflow. 1. `unique-v-tag`, which delegates to a script, looks at tags that point to `HEAD`, reports an error if none, or more than one, of them are named starting with `v`, and otherwise outputs the name of the unique `v*` tag that it found. 2. `run-release-workflow` triggers the `release.yml` workflow for a tag obtained via `unique-v-tag`. By default, it runs it on the `GitoxideLabs/gitoxide` repository. This can be adjusted by setting the `GH_REPO` environment variable, as usual for `gh`. It can also be adjusted by passing an optional argument to the recipe (which takes precedence over `GH_REPO` if set). 3. `roll-release` runs `cargo smart-release`, forwarding its arguments to it, and then runs the `release.yml` workflow via `run-release-workflow`. Because all arguments to `roll-release` are passed to `cargo smart-release`, the repository to run `release.yml` on cannot be specified as an argument to `roll-release`, but `GH_REPO` can still be used to customize it. (Also, since `roll-release` is meant to be used when actually creating releases and publishing them, it's not expected to run on forks nearly as often as the upstream.) See #1970. --- etc/unique-v-tag.sh | 17 +++++++++++++++++ justfile | 17 +++++++++++++++++ 2 files changed, 34 insertions(+) create mode 100755 etc/unique-v-tag.sh diff --git a/etc/unique-v-tag.sh b/etc/unique-v-tag.sh new file mode 100755 index 00000000000..07d258f440a --- /dev/null +++ b/etc/unique-v-tag.sh @@ -0,0 +1,17 @@ +#!/usr/bin/env bash + +set -efu +IFS=$'\n' + +# shellcheck disable=SC2207 # Intentionally splitting. No globbing due to set -f. +tags=( + $(git tag --points-at HEAD -- 'v*') +) + +count="${#tags[@]}" +if ((count != 1)); then + printf '%s: error: Found %d matching v* tags, need exactly 1.\n' "$0" "$count" >&2 + exit 1 +fi + +printf '%s\n' "${tags[0]}" diff --git a/justfile b/justfile index 6129408cb74..8a4c4ffa95c 100755 --- a/justfile +++ b/justfile @@ -295,3 +295,20 @@ check-mode: # Delete `gix-packetline-blocking/src` and regenerate from `gix-packetline/src` copy-packetline: etc/copy-packetline.sh + +# Get the unique `v*` tag at `HEAD`, or fail with an error +unique-v-tag: + etc/unique-v-tag.sh + +# Trigger the `release.yml` workflow on the current `v*` tag +run-release-workflow repo='': + optional_repo_arg={{ quote(repo) }} && \ + export GH_REPO="${optional_repo_arg:-"${GH_REPO:-GitoxideLabs/gitoxide}"}" && \ + tag_name="$({{ j }} unique-v-tag)" && \ + printf 'Running release.yml in %s repo for %s tag.\n' "$GH_REPO" "$tag_name" && \ + gh workflow run release.yml --ref "refs/tags/$tag_name" + +# Run `cargo smart-release` and then trigger `release.yml` for the `v*` tag +roll-release *csr-args: + cargo smart-release {{ csr-args }} + {{ j }} run-release-workflow From ef5fff179953e846c7073f4d07539529282f4031 Mon Sep 17 00:00:00 2001 From: Eliah Kagan Date: Sun, 13 Jul 2025 02:03:37 -0400 Subject: [PATCH 161/166] Don't run `release.yml` on `push` except in testing For now, this makes it so the `workflow_dispatch` event has to be used to run the `release.yml` workflow, except for fake testing releases (tags that end in `-DO-NOT-USE`). As noted in the explanatory comment, the `push` event rarely if ever occurs when tags are pushed to the `GitoxideLabs/gitoxide` repository. It is uncommon for a `gitoxide` crate release to be tagged at a commit that does not also have three or more library crates tagged. But `cargo smart-release` pushes all relevant tags at once, and GitHub Actions currently does not register a `push` event when more than three tags are pushed together. So the `release.yml` workflow is run via `workflow_dispatch` instead. The preceding commit adds `justfile` recipes to make it easier to trigger `release.yml` via `workflow_dispatch`. But this runs the risk that, in the rare case that there are few enough tags pushed for the `push` trigger to work, the workflow might be run more than once for the same release. Therefore, this prevents `push` from ever triggering the workflow for tags representing actual releases. See #1970 for some other details. (Allowing `push` to still work in testing makes it easier to test in a fork without risking accidentally triggering the workflow in the upstream repository. So the pattern is narrowed to still allow that, rather than being removed altogether, at least for now.) --- .github/workflows/release.yml | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index c47e9148ee9..af5096d2d39 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -7,9 +7,16 @@ on: push: # Enable when testing release infrastructure on a branch. # branches: - # - fix-releases + # - fix-releases tags: - - 'v*' + # For now, real releases always use `workflow_dispatch`, and running the workflow on tag pushes + # is only done in testing. This is because we usually push too many tags at once for the `push` + # event to be triggered, since there are usually more than 3 crates tagged together. So the + # `push` trigger doesn't usually work. If we allow it, we risk running the workflow twice if + # it is also manually triggered based on the assumption that it would not run. See #1970 for + # details. See also the `run-release-workflow` and `roll-release` recipes in the `justfile`. + # - 'v*' + - 'v*-DO-NOT-USE' # Pattern for tags used to test the workflow (usually done in a fork). workflow_dispatch: permissions: From 45b369c65e7d36d42c8250b020ea5523615046e3 Mon Sep 17 00:00:00 2001 From: Sebastian Thiel Date: Fri, 4 Jul 2025 05:58:59 +0200 Subject: [PATCH 162/166] doc: Improve and correct `normalize()` documentation (#2074) --- gix-path/Cargo.toml | 2 +- gix-path/src/convert.rs | 28 +++++++++++++++++++++++----- 2 files changed, 24 insertions(+), 6 deletions(-) diff --git a/gix-path/Cargo.toml b/gix-path/Cargo.toml index 5502116cfdb..e5644dbb062 100644 --- a/gix-path/Cargo.toml +++ b/gix-path/Cargo.toml @@ -12,7 +12,7 @@ include = ["src/**/*", "LICENSE-*"] rust-version = "1.70" [lib] -doctest = false +doctest = true [dependencies] gix-trace = { version = "^0.1.12", path = "../gix-trace" } diff --git a/gix-path/src/convert.rs b/gix-path/src/convert.rs index 000deb3798b..6391a4c2e8c 100644 --- a/gix-path/src/convert.rs +++ b/gix-path/src/convert.rs @@ -247,16 +247,34 @@ pub fn to_windows_separators<'a>(path: impl Into>) -> Cow<'a, BStr /// /// For example, this turns `a/./b/c/.././..` into `a`, and turns `/a/../b/..` into `/`. /// -/// If the input path was relative and ends up being the `current_dir`, `.` is returned instead of -/// the full path to `current_dir`. +/// ``` +/// # fn main() { +/// # use std::path::Path; +/// # use gix_path::normalize; +/// for (input, expected) in [ +/// ("a/./b/c/.././..", "a"), +/// ("/a/../b/..", "/"), +/// ("/base/a/..", "/base"), +/// ("./a/..", "."), +/// ("./a/../..", "/"), +/// (".///", ".///"), +/// ("a//b", "a//b"), +/// ("/base/../base", "/base"), +/// ] { +/// let input = Path::new(input); +/// let expected = Path::new(expected); +/// assert_eq!(normalize(input.into(), Path::new("/cwd")), Some(expected.into())); +/// } +/// # } +/// ``` /// -/// Single `.` components as well as duplicate separators are left untouched. +/// Leading `.` components as well as duplicate separators are left untouched. /// /// This is particularly useful when manipulating paths that are based on user input, and not /// resolving intermediate symlinks keeps the path similar to what the user provided. If that's not -/// desirable, use `[realpath()][crate::realpath()` instead. +/// desirable, use [`realpath()`](crate::realpath()) instead. /// -/// Note that we might access the `current_dir` if we run out of path components to pop off, which +/// Note that we will use the `current_dir` if we run out of path components to pop off, which /// is expected to be absolute as typical return value of `std::env::current_dir()` or /// `gix_fs::current_dir(…)` when `core.precomposeUnicode` is known. As a `current_dir` like `/c` /// can be exhausted by paths like `../../r`, `None` will be returned to indicate the inability to From a773854a798bb2315dcce347d86b856b8fac8dc9 Mon Sep 17 00:00:00 2001 From: Sebastian Thiel Date: Sun, 6 Jul 2025 15:28:04 +0200 Subject: [PATCH 163/166] fix: improve error message for when there is too many packs. Affects https://github.com/jj-vcs/jj/issues/6906 --- gix-odb/src/store_impls/dynamic/init.rs | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/gix-odb/src/store_impls/dynamic/init.rs b/gix-odb/src/store_impls/dynamic/init.rs index be6a1ea9475..8f62ca34e58 100644 --- a/gix-odb/src/store_impls/dynamic/init.rs +++ b/gix-odb/src/store_impls/dynamic/init.rs @@ -99,17 +99,24 @@ impl Store { let mut db_paths = crate::alternate::resolve(objects_dir.clone(), ¤t_dir) .map_err(|err| std::io::Error::new(std::io::ErrorKind::Other, err))?; db_paths.insert(0, objects_dir.clone()); - let num_slots = super::Store::collect_indices_and_mtime_sorted_by_size(db_paths, None, None) + let num_slots = Store::collect_indices_and_mtime_sorted_by_size(db_paths, None, None) .map_err(|err| std::io::Error::new(std::io::ErrorKind::Other, err))? .len(); - ((num_slots as f32 * multiplier) as usize).max(minimum) + let candidate = ((num_slots as f32 * multiplier) as usize).max(minimum); + if candidate > crate::store::types::PackId::max_indices() { + // A chance for this to work without 10% extra allocation - this already + // is an insane amount of packs. + num_slots + } else { + candidate + } } }; if slot_count > crate::store::types::PackId::max_indices() { return Err(std::io::Error::new( std::io::ErrorKind::Other, - "Cannot use more than 1^15 slots", + format!("Cannot use more than 2^15-1 slots, got {slot_count}"), )); } let mut replacements: Vec<_> = replacements.collect(); From a8b5751369234b29199f035b98d4fb36183fced7 Mon Sep 17 00:00:00 2001 From: Sebastian Thiel Date: Wed, 9 Jul 2025 08:02:27 +0200 Subject: [PATCH 164/166] fix: `gix submodule list` now prints the submodule path in debug mode That way, special characters won't affect the terminal. --- gitoxide-core/src/repository/submodule.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/gitoxide-core/src/repository/submodule.rs b/gitoxide-core/src/repository/submodule.rs index 9938eb71a8e..0da81100eb4 100644 --- a/gitoxide-core/src/repository/submodule.rs +++ b/gitoxide-core/src/repository/submodule.rs @@ -31,7 +31,7 @@ fn print_sm(sm: Submodule<'_>, dirty_suffix: Option<&str>, out: &mut impl std::i } writeln!( out, - " {is_active} {path} {config} head:{head_id} index:{index_id} ({worktree}) [{url}]", + " {is_active} {path:?} {config} head:{head_id} index:{index_id} ({worktree}) [{url}]", is_active = if !sm.is_active()? || !state.repository_exists { "ⅹ" } else { @@ -48,8 +48,8 @@ fn print_sm(sm: Submodule<'_>, dirty_suffix: Option<&str>, out: &mut impl std::i worktree = match sm_repo { Some(repo) => { // TODO(name-revision): this is the simple version, `git` gives it - // multiple tries https://github.com/git/git/blob/fac96dfbb1c24369ba7d37a5affd8adfe6c650fd/builtin/submodule--helper.c#L161 - // and even uses `git name-rev`/`git describe --contains` which we can't do yet. + // multiple tries https://github.com/git/git/blob/fac96dfbb1c24369ba7d37a5affd8adfe6c650fd/builtin/submodule--helper.c#L161 + // and even uses `git name-rev`/`git describe --contains` which we can't do yet. repo.head_commit()? .describe() .names(SelectRef::AllRefs) @@ -60,7 +60,7 @@ fn print_sm(sm: Submodule<'_>, dirty_suffix: Option<&str>, out: &mut impl std::i .to_string() } None => { - "no worktree".to_string() + "no worktree".into() } }, url = sm.url()?.to_bstring() From 65037b56918b90ac07454a815b0ed136df2fca3b Mon Sep 17 00:00:00 2001 From: Sebastian Thiel Date: Tue, 15 Jul 2025 05:18:16 +0200 Subject: [PATCH 165/166] update changelogs prior to release --- CHANGELOG.md | 53 ++++++++++++ gitoxide-core/CHANGELOG.md | 67 +++++++++++++++- gix-actor/CHANGELOG.md | 36 ++++++++- gix-archive/CHANGELOG.md | 34 +++++++- gix-attributes/CHANGELOG.md | 42 +++++++++- gix-blame/CHANGELOG.md | 79 +++++++++++++++++- gix-command/CHANGELOG.md | 28 ++++++- gix-commitgraph/CHANGELOG.md | 27 ++++++- gix-config-value/CHANGELOG.md | 29 ++++++- gix-config/CHANGELOG.md | 65 ++++++++++++++- gix-credentials/CHANGELOG.md | 42 +++++++++- gix-date/CHANGELOG.md | 30 ++++++- gix-diff/CHANGELOG.md | 76 +++++++++++++++++- gix-dir/CHANGELOG.md | 31 ++++++- gix-discover/CHANGELOG.md | 31 ++++++- gix-features/CHANGELOG.md | 45 ++++++++++- gix-filter/CHANGELOG.md | 32 +++++++- gix-fs/CHANGELOG.md | 31 ++++++- gix-fsck/CHANGELOG.md | 27 ++++++- gix-glob/CHANGELOG.md | 32 +++++++- gix-hash/CHANGELOG.md | 35 +++++++- gix-hashtable/CHANGELOG.md | 33 +++++++- gix-ignore/CHANGELOG.md | 37 ++++++++- gix-index/CHANGELOG.md | 34 +++++++- gix-lock/CHANGELOG.md | 29 ++++++- gix-mailmap/CHANGELOG.md | 29 ++++++- gix-merge/CHANGELOG.md | 33 +++++++- gix-negotiate/CHANGELOG.md | 31 ++++++- gix-object/CHANGELOG.md | 39 ++++++++- gix-odb/CHANGELOG.md | 45 ++++++++++- gix-pack/CHANGELOG.md | 40 ++++++++- gix-packetline-blocking/CHANGELOG.md | 33 +++++++- gix-packetline/CHANGELOG.md | 33 +++++++- gix-path/CHANGELOG.md | 40 ++++++++- gix-pathspec/CHANGELOG.md | 39 ++++++++- gix-prompt/CHANGELOG.md | 33 +++++++- gix-protocol/CHANGELOG.md | 41 +++++++++- gix-ref/CHANGELOG.md | 53 +++++++++++- gix-refspec/CHANGELOG.md | 37 ++++++++- gix-revision/CHANGELOG.md | 29 ++++++- gix-revwalk/CHANGELOG.md | 29 ++++++- gix-sec/CHANGELOG.md | 38 ++++++++- gix-shallow/CHANGELOG.md | 27 ++++++- gix-status/CHANGELOG.md | 37 ++++++++- gix-submodule/CHANGELOG.md | 31 ++++++- gix-tempfile/CHANGELOG.md | 33 +++++++- gix-trace/CHANGELOG.md | 27 ++++++- gix-transport/CHANGELOG.md | 45 ++++++++++- gix-traverse/CHANGELOG.md | 35 +++++++- gix-url/CHANGELOG.md | 37 ++++++++- gix-worktree-state/CHANGELOG.md | 31 ++++++- gix-worktree-stream/CHANGELOG.md | 28 ++++++- gix-worktree/CHANGELOG.md | 37 ++++++++- gix/CHANGELOG.md | 116 ++++++++++++++++++++++++++- 54 files changed, 2058 insertions(+), 53 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6ffd57a4853..70adf625851 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,59 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## Unreleased + +### New Features + + - add first debug version of `gix tag list` + - `gix revision list --long-hashes` for faster iteration. + The performance of the short-hash generation was improved as well. + - support for `commitgraph list from..to` to exercise the new 'hide' capability. + - 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`. + - add support for multiple blame ranges like `gix blame -L -L ...` + Update the blame subcommand to handle multiple line ranges. This allows specifying multiple `-L` options similar to the usage of git. + +### Commit Statistics + + + + - 19 commits contributed to the release over the course of 78 calendar days. + - 79 days passed between releases. + - 5 commits were understood as [conventional](https://www.conventionalcommits.org). + - 0 issues like '(#ID)' were seen in commit messages + +### Commit Details + + + +
view details + + * **Uncategorized** + - Merge pull request #2073 from cruessler/add-tag-list ([`c7af04d`](https://github.com/GitoxideLabs/gitoxide/commit/c7af04db9b6bb1204e0f4c436d1db8f48a491e86)) + - Refactor ([`750ae9b`](https://github.com/GitoxideLabs/gitoxide/commit/750ae9bc3cf72c1d9a358307e423523324eb25fb)) + - Add first debug version of `gix tag list` ([`37d3bf2`](https://github.com/GitoxideLabs/gitoxide/commit/37d3bf24ac1a79302f3e97b97372e4ad381c45e2)) + - Merge pull request #2062 from rickprice/minor_documentation_fixups ([`c2eb0c1`](https://github.com/GitoxideLabs/gitoxide/commit/c2eb0c144dd21cac87fd08829f4a5ca02f85008d)) + - Small documentation fixes ([`bfb1c34`](https://github.com/GitoxideLabs/gitoxide/commit/bfb1c34f75997a603b8f85fca75bf9e1ca310be0)) + - Merge pull request #2041 from cruessler/add-blame-extraction ([`dd5f0a4`](https://github.com/GitoxideLabs/gitoxide/commit/dd5f0a4811bc738051f7af164b8d2815aaa23220)) + - Merge pull request #2051 from GitoxideLabs/improvements ([`f933f80`](https://github.com/GitoxideLabs/gitoxide/commit/f933f8065c218ee1e9ae7158b15c8a0917140803)) + - `gix revision list --long-hashes` for faster iteration. ([`ab52a49`](https://github.com/GitoxideLabs/gitoxide/commit/ab52a49a555ab25e6cf632cb0b080eab72958a7d)) + - Adapt to changes in `gix-blame` ([`4afc51d`](https://github.com/GitoxideLabs/gitoxide/commit/4afc51d4ba669ad3c4b26f1c4222442d1dab1695)) + - Merge pull request #2022 from cruessler/add-rename-tracking-to-blame ([`76eddf8`](https://github.com/GitoxideLabs/gitoxide/commit/76eddf86b91afc3535f7eb0d9004652823ccda36)) + - Refactor ([`3e5365c`](https://github.com/GitoxideLabs/gitoxide/commit/3e5365cb066895c787a22422964a2b9459f37ec3)) + - Merge pull request #2037 from GitoxideLabs/hide ([`92febae`](https://github.com/GitoxideLabs/gitoxide/commit/92febae025165c55e596d58511b1634fb6580b9c)) + - Support for `commitgraph list from..to` to exercise the new 'hide' capability. ([`c5bc49f`](https://github.com/GitoxideLabs/gitoxide/commit/c5bc49f2a02e9b28c2466ea4c7ae711d091ffc96)) + - Merge pull request #2019 from GitoxideLabs/precious-opt-in ([`5f9de52`](https://github.com/GitoxideLabs/gitoxide/commit/5f9de52cf286163b503047b1ab3b51dfa093b4d4)) + - Enable precious file parsing in `gix` CLI by default, allow overrides. ([`1df1ebb`](https://github.com/GitoxideLabs/gitoxide/commit/1df1ebb34dd3e2101d8a112dda66f6bac5261ea7)) + - Merge pull request #1973 from holodorum/feature/blame-range-support ([`de13b16`](https://github.com/GitoxideLabs/gitoxide/commit/de13b16728f6d29452cb97b50281aa91d498eb49)) + - Refactor ([`d4461e7`](https://github.com/GitoxideLabs/gitoxide/commit/d4461e700657d049a8cbc1552f328e35b27c92c3)) + - Add support for multiple blame ranges like `gix blame -L -L ...` ([`36a6ffe`](https://github.com/GitoxideLabs/gitoxide/commit/36a6ffeea7bbde7fb3689ddf2a107e09a50e602c)) + - Adapt to changes in `gix-blame` ([`8143d69`](https://github.com/GitoxideLabs/gitoxide/commit/8143d692e51c8d1b3d8c2323e83676e1be122f13)) +
+ ## 0.44.0 (2025-04-26) ## 0.43.0 (2025-04-25) diff --git a/gitoxide-core/CHANGELOG.md b/gitoxide-core/CHANGELOG.md index ae3d157bd5d..3aef71c62f5 100644 --- a/gitoxide-core/CHANGELOG.md +++ b/gitoxide-core/CHANGELOG.md @@ -5,13 +5,76 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## Unreleased + +### New Features + + - add first debug version of `gix tag list` + - `gix revision list --long-hashes` for faster iteration. + The performance of the short-hash generation was improved as well. + - support for `commitgraph list from..to` to exercise the new 'hide' capability. + +### Bug Fixes + + - `gix submodule list` now prints the submodule path in debug mode + That way, special characters won't affect the terminal. + +### Commit Statistics + + + + - 25 commits contributed to the release over the course of 79 calendar days. + - 79 days passed between releases. + - 4 commits were understood as [conventional](https://www.conventionalcommits.org). + - 0 issues like '(#ID)' were seen in commit messages + +### Thanks Clippy + + + +[Clippy](https://github.com/rust-lang/rust-clippy) helped 1 time to make code idiomatic. + +### Commit Details + + + +
view details + + * **Uncategorized** + - `gix submodule list` now prints the submodule path in debug mode ([`a8b5751`](https://github.com/GitoxideLabs/gitoxide/commit/a8b5751369234b29199f035b98d4fb36183fced7)) + - Merge pull request #2073 from cruessler/add-tag-list ([`c7af04d`](https://github.com/GitoxideLabs/gitoxide/commit/c7af04db9b6bb1204e0f4c436d1db8f48a491e86)) + - Refactor ([`750ae9b`](https://github.com/GitoxideLabs/gitoxide/commit/750ae9bc3cf72c1d9a358307e423523324eb25fb)) + - Make output more verbose ([`a845a4b`](https://github.com/GitoxideLabs/gitoxide/commit/a845a4b5b0579cd65f1e2f5c18a751329ff9504f)) + - Add first debug version of `gix tag list` ([`37d3bf2`](https://github.com/GitoxideLabs/gitoxide/commit/37d3bf24ac1a79302f3e97b97372e4ad381c45e2)) + - Merge pull request #2070 from GitoxideLabs/dependabot/cargo/cargo-827bceb7eb ([`dab97f7`](https://github.com/GitoxideLabs/gitoxide/commit/dab97f7618f160421b6e31de8f3e2f3d11dc2ef2)) + - Bump the cargo group across 1 directory with 68 updates ([`a9a8ea1`](https://github.com/GitoxideLabs/gitoxide/commit/a9a8ea1472532dde03bce4e0afdfa82924af1f96)) + - Merge pull request #2062 from rickprice/minor_documentation_fixups ([`c2eb0c1`](https://github.com/GitoxideLabs/gitoxide/commit/c2eb0c144dd21cac87fd08829f4a5ca02f85008d)) + - Small documentation fixes ([`bfb1c34`](https://github.com/GitoxideLabs/gitoxide/commit/bfb1c34f75997a603b8f85fca75bf9e1ca310be0)) + - Merge pull request #2051 from GitoxideLabs/improvements ([`f933f80`](https://github.com/GitoxideLabs/gitoxide/commit/f933f8065c218ee1e9ae7158b15c8a0917140803)) + - `gix revision list --long-hashes` for faster iteration. ([`ab52a49`](https://github.com/GitoxideLabs/gitoxide/commit/ab52a49a555ab25e6cf632cb0b080eab72958a7d)) + - Merge pull request #2022 from cruessler/add-rename-tracking-to-blame ([`76eddf8`](https://github.com/GitoxideLabs/gitoxide/commit/76eddf86b91afc3535f7eb0d9004652823ccda36)) + - Refactor ([`3e5365c`](https://github.com/GitoxideLabs/gitoxide/commit/3e5365cb066895c787a22422964a2b9459f37ec3)) + - Adapt to changes in `gix-blame` ([`f899d6d`](https://github.com/GitoxideLabs/gitoxide/commit/f899d6d533b6fb0d1ce5d08d0ec6c38df294398a)) + - Merge pull request #2037 from GitoxideLabs/hide ([`92febae`](https://github.com/GitoxideLabs/gitoxide/commit/92febae025165c55e596d58511b1634fb6580b9c)) + - Support for `commitgraph list from..to` to exercise the new 'hide' capability. ([`c5bc49f`](https://github.com/GitoxideLabs/gitoxide/commit/c5bc49f2a02e9b28c2466ea4c7ae711d091ffc96)) + - Merge pull request #2033 from GitoxideLabs/dependabot/cargo/cargo-b72232998d ([`f8d7c0a`](https://github.com/GitoxideLabs/gitoxide/commit/f8d7c0ad8fa7745c973c6b87e7eee70831300207)) + - Bump the cargo group with 56 updates ([`151e3a5`](https://github.com/GitoxideLabs/gitoxide/commit/151e3a5cca06444eea4c6a362649e66c831673d6)) + - Merge pull request #2019 from GitoxideLabs/precious-opt-in ([`5f9de52`](https://github.com/GitoxideLabs/gitoxide/commit/5f9de52cf286163b503047b1ab3b51dfa093b4d4)) + - Adapt to changes in `gix-ignore` and `gix-glob`, and more. ([`4ef7806`](https://github.com/GitoxideLabs/gitoxide/commit/4ef7806e62954d069861bddb06cb8c0baf47bb69)) + - Merge pull request #2014 from GitoxideLabs/zip ([`648022b`](https://github.com/GitoxideLabs/gitoxide/commit/648022b44e12f597cae55cc45830d0a19b87eb4c)) + - Release gix-glob v0.20.1, gix-attributes v0.26.1, gix-command v0.6.1, gix-filter v0.19.2, gix-worktree-stream v0.21.2, gix-archive v0.21.2 ([`f0ed2cc`](https://github.com/GitoxideLabs/gitoxide/commit/f0ed2cc0046f866e67944bff9aef0579c12d5852)) + - Merge pull request #1975 from GitoxideLabs/improvements ([`28935a5`](https://github.com/GitoxideLabs/gitoxide/commit/28935a56ff91f1fc2c17a7d23b057cf7119144e9)) + - Thanks clippy ([`dbf65c9`](https://github.com/GitoxideLabs/gitoxide/commit/dbf65c95644e6a134e7f9b75e7871479720b4deb)) + - Merge pull request #1971 from GitoxideLabs/new-release ([`8d4c4d1`](https://github.com/GitoxideLabs/gitoxide/commit/8d4c4d1e09f84c962c29d98a686c64228196ac13)) +
+ ## 0.47.1 (2025-04-26) ### Commit Statistics - - 1 commit contributed to the release. + - 3 commits contributed to the release. - 0 commits were understood as [conventional](https://www.conventionalcommits.org). - 0 issues like '(#ID)' were seen in commit messages @@ -22,7 +85,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
view details * **Uncategorized** + - Release gix-date v0.10.1, gix-utils v0.3.0, gix-actor v0.35.1, gix-validate v0.10.0, gix-path v0.10.17, gix-features v0.42.1, gix-hash v0.18.0, gix-hashtable v0.8.1, gix-object v0.49.1, gix-glob v0.20.0, gix-quote v0.6.0, gix-attributes v0.26.0, gix-command v0.6.0, gix-packetline-blocking v0.19.0, gix-filter v0.19.1, gix-fs v0.15.0, gix-commitgraph v0.28.0, gix-revwalk v0.20.1, gix-traverse v0.46.1, gix-worktree-stream v0.21.1, gix-archive v0.21.1, gix-tempfile v17.1.0, gix-lock v17.1.0, gix-index v0.40.0, gix-config-value v0.15.0, gix-pathspec v0.11.0, gix-ignore v0.15.0, gix-worktree v0.41.0, gix-diff v0.52.1, gix-blame v0.2.1, gix-ref v0.52.1, gix-sec v0.11.0, gix-config v0.45.1, gix-prompt v0.11.0, gix-url v0.31.0, gix-credentials v0.29.0, gix-discover v0.40.1, gix-dir v0.14.1, gix-mailmap v0.27.1, gix-revision v0.34.1, gix-merge v0.5.1, gix-negotiate v0.20.1, gix-pack v0.59.1, gix-odb v0.69.1, gix-refspec v0.30.1, gix-shallow v0.4.0, gix-packetline v0.19.0, gix-transport v0.47.0, gix-protocol v0.50.1, gix-status v0.19.1, gix-submodule v0.19.1, gix-worktree-state v0.19.0, gix v0.72.1, gix-fsck v0.11.1, gitoxide-core v0.47.1, gitoxide v0.44.0 ([`e104545`](https://github.com/GitoxideLabs/gitoxide/commit/e104545b78951ca882481d4a58f4425a8bc81c87)) - Bump all prior pratch levels to majors ([`5f7f805`](https://github.com/GitoxideLabs/gitoxide/commit/5f7f80570e1a5522e76ea58cccbb957249a0dffe)) + - Merge pull request #1969 from GitoxideLabs/new-release ([`631f07a`](https://github.com/GitoxideLabs/gitoxide/commit/631f07ad0c1cb93d9da42cf2c8499584fe91880a))
## 0.47.0 (2025-04-25) diff --git a/gix-actor/CHANGELOG.md b/gix-actor/CHANGELOG.md index bb69a18f7cf..ec95c2b47bd 100644 --- a/gix-actor/CHANGELOG.md +++ b/gix-actor/CHANGELOG.md @@ -5,13 +5,45 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## Unreleased + +### New Features + + - implement `From for Identity` for convenient conversions of owned types. + +### Commit Statistics + + + + - 8 commits contributed to the release over the course of 79 calendar days. + - 79 days passed between releases. + - 1 commit was understood as [conventional](https://www.conventionalcommits.org). + - 0 issues like '(#ID)' were seen in commit messages + +### Commit Details + + + +
view details + + * **Uncategorized** + - Merge pull request #2038 from ilyagr/signature-doc ([`8f6ecfe`](https://github.com/GitoxideLabs/gitoxide/commit/8f6ecfe4b017fc6ed33d8932a1cb911ed0879713)) + - Refactor ([`aff23d6`](https://github.com/GitoxideLabs/gitoxide/commit/aff23d65a1a44e5356fb362a857d736280d3a580)) + - Gix-actor docs: document conversions between `Signature` and `SignatureRef` ([`8bebd2e`](https://github.com/GitoxideLabs/gitoxide/commit/8bebd2e84b4e9d9a31a6ff8dcd17da83534f3c95)) + - Merge pull request #2036 from GitoxideLabs/improvements ([`249bf9a`](https://github.com/GitoxideLabs/gitoxide/commit/249bf9a2add29caa339c5f9783dd63f87a718c6e)) + - Implement `From for Identity` for convenient conversions of owned types. ([`8c34d9f`](https://github.com/GitoxideLabs/gitoxide/commit/8c34d9fd3cade8e9e0cd2b648dfe70d2d73ccd40)) + - Merge pull request #2033 from GitoxideLabs/dependabot/cargo/cargo-b72232998d ([`f8d7c0a`](https://github.com/GitoxideLabs/gitoxide/commit/f8d7c0ad8fa7745c973c6b87e7eee70831300207)) + - Bump the cargo group with 56 updates ([`151e3a5`](https://github.com/GitoxideLabs/gitoxide/commit/151e3a5cca06444eea4c6a362649e66c831673d6)) + - Merge pull request #1971 from GitoxideLabs/new-release ([`8d4c4d1`](https://github.com/GitoxideLabs/gitoxide/commit/8d4c4d1e09f84c962c29d98a686c64228196ac13)) +
+ ## 0.35.1 (2025-04-26) ### Commit Statistics - - 1 commit contributed to the release. + - 3 commits contributed to the release. - 0 commits were understood as [conventional](https://www.conventionalcommits.org). - 0 issues like '(#ID)' were seen in commit messages @@ -22,7 +54,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
view details * **Uncategorized** + - Release gix-date v0.10.1, gix-utils v0.3.0, gix-actor v0.35.1, gix-validate v0.10.0, gix-path v0.10.17, gix-features v0.42.1, gix-hash v0.18.0, gix-hashtable v0.8.1, gix-object v0.49.1, gix-glob v0.20.0, gix-quote v0.6.0, gix-attributes v0.26.0, gix-command v0.6.0, gix-packetline-blocking v0.19.0, gix-filter v0.19.1, gix-fs v0.15.0, gix-commitgraph v0.28.0, gix-revwalk v0.20.1, gix-traverse v0.46.1, gix-worktree-stream v0.21.1, gix-archive v0.21.1, gix-tempfile v17.1.0, gix-lock v17.1.0, gix-index v0.40.0, gix-config-value v0.15.0, gix-pathspec v0.11.0, gix-ignore v0.15.0, gix-worktree v0.41.0, gix-diff v0.52.1, gix-blame v0.2.1, gix-ref v0.52.1, gix-sec v0.11.0, gix-config v0.45.1, gix-prompt v0.11.0, gix-url v0.31.0, gix-credentials v0.29.0, gix-discover v0.40.1, gix-dir v0.14.1, gix-mailmap v0.27.1, gix-revision v0.34.1, gix-merge v0.5.1, gix-negotiate v0.20.1, gix-pack v0.59.1, gix-odb v0.69.1, gix-refspec v0.30.1, gix-shallow v0.4.0, gix-packetline v0.19.0, gix-transport v0.47.0, gix-protocol v0.50.1, gix-status v0.19.1, gix-submodule v0.19.1, gix-worktree-state v0.19.0, gix v0.72.1, gix-fsck v0.11.1, gitoxide-core v0.47.1, gitoxide v0.44.0 ([`e104545`](https://github.com/GitoxideLabs/gitoxide/commit/e104545b78951ca882481d4a58f4425a8bc81c87)) - Bump all prior pratch levels to majors ([`5f7f805`](https://github.com/GitoxideLabs/gitoxide/commit/5f7f80570e1a5522e76ea58cccbb957249a0dffe)) + - Merge pull request #1969 from GitoxideLabs/new-release ([`631f07a`](https://github.com/GitoxideLabs/gitoxide/commit/631f07ad0c1cb93d9da42cf2c8499584fe91880a))
## 0.35.0 (2025-04-25) diff --git a/gix-archive/CHANGELOG.md b/gix-archive/CHANGELOG.md index 9ff90248f04..6fefce521be 100644 --- a/gix-archive/CHANGELOG.md +++ b/gix-archive/CHANGELOG.md @@ -5,6 +5,37 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## Unreleased + +A maintenance release without user-facing changes. + +### Commit Statistics + + + + - 9 commits contributed to the release over the course of 59 calendar days. + - 59 days passed between releases. + - 0 commits were understood as [conventional](https://www.conventionalcommits.org). + - 0 issues like '(#ID)' were seen in commit messages + +### Commit Details + + + +
view details + + * **Uncategorized** + - Merge pull request #2070 from GitoxideLabs/dependabot/cargo/cargo-827bceb7eb ([`dab97f7`](https://github.com/GitoxideLabs/gitoxide/commit/dab97f7618f160421b6e31de8f3e2f3d11dc2ef2)) + - Bump the cargo group across 1 directory with 68 updates ([`a9a8ea1`](https://github.com/GitoxideLabs/gitoxide/commit/a9a8ea1472532dde03bce4e0afdfa82924af1f96)) + - Merge pull request #2062 from rickprice/minor_documentation_fixups ([`c2eb0c1`](https://github.com/GitoxideLabs/gitoxide/commit/c2eb0c144dd21cac87fd08829f4a5ca02f85008d)) + - Small documentation fixes ([`bfb1c34`](https://github.com/GitoxideLabs/gitoxide/commit/bfb1c34f75997a603b8f85fca75bf9e1ca310be0)) + - Merge pull request #2049 from joshtriplett/zip4 ([`b8f2ab6`](https://github.com/GitoxideLabs/gitoxide/commit/b8f2ab6e01f34b6f2a45c7df0ae2df7633c9038f)) + - Upgrade to zip 4, which uses zlib-rs by default ([`e768c94`](https://github.com/GitoxideLabs/gitoxide/commit/e768c94b9035fc7a026efcafee8023faa0886d4e)) + - Merge pull request #2033 from GitoxideLabs/dependabot/cargo/cargo-b72232998d ([`f8d7c0a`](https://github.com/GitoxideLabs/gitoxide/commit/f8d7c0ad8fa7745c973c6b87e7eee70831300207)) + - Bump the cargo group with 56 updates ([`151e3a5`](https://github.com/GitoxideLabs/gitoxide/commit/151e3a5cca06444eea4c6a362649e66c831673d6)) + - Merge pull request #2014 from GitoxideLabs/zip ([`648022b`](https://github.com/GitoxideLabs/gitoxide/commit/648022b44e12f597cae55cc45830d0a19b87eb4c)) +
+ ## 0.21.2 (2025-05-16) Update the `zip` dependency to the unyanked version 3.0. @@ -13,7 +44,7 @@ Update the `zip` dependency to the unyanked version 3.0. - - 7 commits contributed to the release over the course of 20 calendar days. + - 8 commits contributed to the release over the course of 20 calendar days. - 20 days passed between releases. - 0 commits were understood as [conventional](https://www.conventionalcommits.org). - 2 unique issues were worked on: [#1984](https://github.com/GitoxideLabs/gitoxide/issues/1984), [#2013](https://github.com/GitoxideLabs/gitoxide/issues/2013) @@ -29,6 +60,7 @@ Update the `zip` dependency to the unyanked version 3.0. * **[#2013](https://github.com/GitoxideLabs/gitoxide/issues/2013)** - Avoid yanked `zip` dependency ([`8692657`](https://github.com/GitoxideLabs/gitoxide/commit/8692657ec7c7ab765fcf1aeb9f0e1c55384e39d3)) * **Uncategorized** + - Release gix-glob v0.20.1, gix-attributes v0.26.1, gix-command v0.6.1, gix-filter v0.19.2, gix-worktree-stream v0.21.2, gix-archive v0.21.2 ([`f0ed2cc`](https://github.com/GitoxideLabs/gitoxide/commit/f0ed2cc0046f866e67944bff9aef0579c12d5852)) - Update changelogs prior to release ([`31b86ee`](https://github.com/GitoxideLabs/gitoxide/commit/31b86ee6774ad6762f941aa0e8377e709bd41f5e)) - Merge pull request #2009 from GitoxideLabs/release-gix-index ([`c3f06ae`](https://github.com/GitoxideLabs/gitoxide/commit/c3f06ae424ab4e1918a364cabe8276297465a73a)) - Release gix-path v0.10.18, gix-date v0.10.2, gix-traverse v0.46.2, gix-index v0.40.1 ([`d2b4c44`](https://github.com/GitoxideLabs/gitoxide/commit/d2b4c44fcb2bf43e80d67532262631a5086f08de)) diff --git a/gix-attributes/CHANGELOG.md b/gix-attributes/CHANGELOG.md index 37abf9e6997..28e8b297f58 100644 --- a/gix-attributes/CHANGELOG.md +++ b/gix-attributes/CHANGELOG.md @@ -5,6 +5,45 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## Unreleased + +### New Features (BREAKING) + + - Pattern parser in is now stateful to allow options for how to parse ignore patterns. + That way it can support settings and other state that affect parsing. + This affects various crates which are all marked as breaking now. + +### Commit Statistics + + + + - 7 commits contributed to the release over the course of 59 calendar days. + - 59 days passed between releases. + - 1 commit was understood as [conventional](https://www.conventionalcommits.org). + - 0 issues like '(#ID)' were seen in commit messages + +### Thanks Clippy + + + +[Clippy](https://github.com/rust-lang/rust-clippy) helped 1 time to make code idiomatic. + +### Commit Details + + + +
view details + + * **Uncategorized** + - Merge pull request #2070 from GitoxideLabs/dependabot/cargo/cargo-827bceb7eb ([`dab97f7`](https://github.com/GitoxideLabs/gitoxide/commit/dab97f7618f160421b6e31de8f3e2f3d11dc2ef2)) + - Bump the cargo group across 1 directory with 68 updates ([`a9a8ea1`](https://github.com/GitoxideLabs/gitoxide/commit/a9a8ea1472532dde03bce4e0afdfa82924af1f96)) + - Merge pull request #2041 from cruessler/add-blame-extraction ([`dd5f0a4`](https://github.com/GitoxideLabs/gitoxide/commit/dd5f0a4811bc738051f7af164b8d2815aaa23220)) + - Thanks clippy ([`554ce13`](https://github.com/GitoxideLabs/gitoxide/commit/554ce134bc4b514b52a935f17f57f76ebf23ab97)) + - Merge pull request #2019 from GitoxideLabs/precious-opt-in ([`5f9de52`](https://github.com/GitoxideLabs/gitoxide/commit/5f9de52cf286163b503047b1ab3b51dfa093b4d4)) + - Pattern parser in is now stateful to allow options for how to parse ignore patterns. ([`828e903`](https://github.com/GitoxideLabs/gitoxide/commit/828e9035a40796f79650cf5e3becb8d8e5e29883)) + - Merge pull request #2014 from GitoxideLabs/zip ([`648022b`](https://github.com/GitoxideLabs/gitoxide/commit/648022b44e12f597cae55cc45830d0a19b87eb4c)) +
+ ## 0.26.1 (2025-05-16) A maintenance release without user-facing changes. @@ -13,7 +52,7 @@ A maintenance release without user-facing changes. - - 4 commits contributed to the release over the course of 20 calendar days. + - 5 commits contributed to the release over the course of 20 calendar days. - 20 days passed between releases. - 0 commits were understood as [conventional](https://www.conventionalcommits.org). - 0 issues like '(#ID)' were seen in commit messages @@ -25,6 +64,7 @@ A maintenance release without user-facing changes.
view details * **Uncategorized** + - Release gix-glob v0.20.1, gix-attributes v0.26.1, gix-command v0.6.1, gix-filter v0.19.2, gix-worktree-stream v0.21.2, gix-archive v0.21.2 ([`f0ed2cc`](https://github.com/GitoxideLabs/gitoxide/commit/f0ed2cc0046f866e67944bff9aef0579c12d5852)) - Update changelogs prior to release ([`31b86ee`](https://github.com/GitoxideLabs/gitoxide/commit/31b86ee6774ad6762f941aa0e8377e709bd41f5e)) - Merge pull request #2009 from GitoxideLabs/release-gix-index ([`c3f06ae`](https://github.com/GitoxideLabs/gitoxide/commit/c3f06ae424ab4e1918a364cabe8276297465a73a)) - Release gix-path v0.10.18, gix-date v0.10.2, gix-traverse v0.46.2, gix-index v0.40.1 ([`d2b4c44`](https://github.com/GitoxideLabs/gitoxide/commit/d2b4c44fcb2bf43e80d67532262631a5086f08de)) diff --git a/gix-blame/CHANGELOG.md b/gix-blame/CHANGELOG.md index f7ee9927de9..26cf9d1e33d 100644 --- a/gix-blame/CHANGELOG.md +++ b/gix-blame/CHANGELOG.md @@ -5,13 +5,88 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## Unreleased + +### New Features (BREAKING) + + - add `debug_track_path` and `blame_path` + - follow renames in blame + - Add `BlameRanges` to enable multi-range blame support + This update replaces single-range handling with the `BlameRanges` type, allowing multiple 1-based inclusive line ranges to be specified for blame operations. + + It hides some of the implementation details of the range logic, prepares for compatibility with `git` behavior, and adds tests to validate multi-range scenarios. + +### Commit Statistics + + + + - 40 commits contributed to the release over the course of 79 calendar days. + - 79 days passed between releases. + - 3 commits were understood as [conventional](https://www.conventionalcommits.org). + - 0 issues like '(#ID)' were seen in commit messages + +### Thanks Clippy + + + +[Clippy](https://github.com/rust-lang/rust-clippy) helped 2 times to make code idiomatic. + +### Commit Details + + + +
view details + + * **Uncategorized** + - Merge pull request #2070 from GitoxideLabs/dependabot/cargo/cargo-827bceb7eb ([`dab97f7`](https://github.com/GitoxideLabs/gitoxide/commit/dab97f7618f160421b6e31de8f3e2f3d11dc2ef2)) + - Bump the cargo group across 1 directory with 68 updates ([`a9a8ea1`](https://github.com/GitoxideLabs/gitoxide/commit/a9a8ea1472532dde03bce4e0afdfa82924af1f96)) + - Merge pull request #2066 from cruessler/add-test-for-file-added-in-two-different-branches ([`8007f1d`](https://github.com/GitoxideLabs/gitoxide/commit/8007f1d0bad357688acd1235d079bf164290cda6)) + - Add test for file with two roots ([`92751b7`](https://github.com/GitoxideLabs/gitoxide/commit/92751b725e9ce9f6915577fbdf50f1fac9e8db41)) + - Merge pull request #2041 from cruessler/add-blame-extraction ([`dd5f0a4`](https://github.com/GitoxideLabs/gitoxide/commit/dd5f0a4811bc738051f7af164b8d2815aaa23220)) + - Refactor ([`378b1be`](https://github.com/GitoxideLabs/gitoxide/commit/378b1beb9359f9f1ef26f01065f303ec8ec9ee28)) + - Thanks clippy ([`c7a2e80`](https://github.com/GitoxideLabs/gitoxide/commit/c7a2e802215ec2c2512262b9d54e580297964e8c)) + - Only add entry when blame was passed ([`5d748af`](https://github.com/GitoxideLabs/gitoxide/commit/5d748af0f956ee62c7327c4bf6361c6817d04fbd)) + - Add `index` to `BlamePathEntry` ([`90c2bb8`](https://github.com/GitoxideLabs/gitoxide/commit/90c2bb8701beb21a07f7dcf41401b863c638824a)) + - Add `debug_track_path` and `blame_path` ([`81297cf`](https://github.com/GitoxideLabs/gitoxide/commit/81297cf2b85072ad13824f9821a0102dc6497f80)) + - Merge pull request #2042 from cruessler/remove-unwrap-in-tests ([`e09825a`](https://github.com/GitoxideLabs/gitoxide/commit/e09825aed4b80a53e6317b75a4cea4e1ce9a759a)) + - Remove most .unwrap()'s in gix-blame tests ([`4bf61f5`](https://github.com/GitoxideLabs/gitoxide/commit/4bf61f5671b097b82605009ad0dfc48de428ff18)) + - Merge pull request #2039 from cruessler/add-test-for-rename-tracking ([`073487b`](https://github.com/GitoxideLabs/gitoxide/commit/073487b38ed40bcd7eb45dc110ae1ce84f9275a9)) + - Refactor ([`8e2bc0f`](https://github.com/GitoxideLabs/gitoxide/commit/8e2bc0fb3e0d3b3a4ac58af76317e13e11b72117)) + - Remove obsolete comment ([`2541378`](https://github.com/GitoxideLabs/gitoxide/commit/25413788e3c5c9059d39b125e3543b9b9301e8fe)) + - Add test for source file name tracking per hunk ([`8ba513c`](https://github.com/GitoxideLabs/gitoxide/commit/8ba513c64d98463e3bf7d01a02c6d882897ebee0)) + - Merge pull request #2022 from cruessler/add-rename-tracking-to-blame ([`76eddf8`](https://github.com/GitoxideLabs/gitoxide/commit/76eddf86b91afc3535f7eb0d9004652823ccda36)) + - Refactor ([`3e5365c`](https://github.com/GitoxideLabs/gitoxide/commit/3e5365cb066895c787a22422964a2b9459f37ec3)) + - Get current file_path from unblamed hunk ([`7435ed5`](https://github.com/GitoxideLabs/gitoxide/commit/7435ed5a9a7370a12332e12bd40fdbc757284a85)) + - Follow renames in blame ([`d2e98f3`](https://github.com/GitoxideLabs/gitoxide/commit/d2e98f3cf458121da3d23933d6a7421d70309a20)) + - Use `pretty_assertion::assert_equal` ([`6e6836b`](https://github.com/GitoxideLabs/gitoxide/commit/6e6836b4857fa19c20deadaacb1a079b3ef675a9)) + - Merge pull request #2023 from cruessler/add-tests-for-blame-in-sub-directory ([`f606bd5`](https://github.com/GitoxideLabs/gitoxide/commit/f606bd5090f639942834c2eb2bd4d975c009a58e)) + - Add test for blame in sub-directory ([`cca22e2`](https://github.com/GitoxideLabs/gitoxide/commit/cca22e205f0414a727639af97ca12e7c3cab0280)) + - Merge pull request #2009 from GitoxideLabs/release-gix-index ([`c3f06ae`](https://github.com/GitoxideLabs/gitoxide/commit/c3f06ae424ab4e1918a364cabe8276297465a73a)) + - Release gix-path v0.10.18, gix-date v0.10.2, gix-traverse v0.46.2, gix-index v0.40.1 ([`d2b4c44`](https://github.com/GitoxideLabs/gitoxide/commit/d2b4c44fcb2bf43e80d67532262631a5086f08de)) + - Merge pull request #1983 from cruessler/make-process-changes-work-with-overlapping-ranges ([`83e1b73`](https://github.com/GitoxideLabs/gitoxide/commit/83e1b73f1db090f76d7b0d8062975f1f91346c37)) + - Refactor ([`b2121bc`](https://github.com/GitoxideLabs/gitoxide/commit/b2121bcd8be3546cf708242dae070c7173a7d384)) + - Thanks clippy ([`ee6f5cc`](https://github.com/GitoxideLabs/gitoxide/commit/ee6f5cc1dc08975da364836adf3a3261d20c7ded)) + - Use *Blamed File* and *Source File* more consistently ([`2f6786b`](https://github.com/GitoxideLabs/gitoxide/commit/2f6786b08a0c94106b4e93f7835a708adc859fed)) + - Correctly process overlapping unblamed hunks ([`6e1ea6d`](https://github.com/GitoxideLabs/gitoxide/commit/6e1ea6d85b8396b8348498c643d92eafb832987c)) + - Provide more context in assertion ([`d46766a`](https://github.com/GitoxideLabs/gitoxide/commit/d46766aa29c4ac0bb198aa74fadb5b07ba82f03b)) + - Merge pull request #1978 from cruessler/make-mutation-more-idiomatic ([`dc3c7c9`](https://github.com/GitoxideLabs/gitoxide/commit/dc3c7c9b461a33afe422d1785e3b0b0eb194d67a)) + - Make mutation more idiomatic ([`4423cae`](https://github.com/GitoxideLabs/gitoxide/commit/4423cae45570f73a11ca34867794c5a05c342524)) + - Remove obsolete comment ([`2d2365e`](https://github.com/GitoxideLabs/gitoxide/commit/2d2365e605e568e88e0c01917a12de4e7fd724f2)) + - Merge pull request #1974 from cruessler/move-commit-time-to-either ([`8be3193`](https://github.com/GitoxideLabs/gitoxide/commit/8be3193eb34ac5deadb0ade60ba01cb3c97f6135)) + - Make use of `gix_traverse::commit::Either::commit_time()` ([`f59a794`](https://github.com/GitoxideLabs/gitoxide/commit/f59a7946eda3c6bbdb2c5710eabf32df0b1ac63d)) + - Merge pull request #1973 from holodorum/feature/blame-range-support ([`de13b16`](https://github.com/GitoxideLabs/gitoxide/commit/de13b16728f6d29452cb97b50281aa91d498eb49)) + - Refactor ([`d4461e7`](https://github.com/GitoxideLabs/gitoxide/commit/d4461e700657d049a8cbc1552f328e35b27c92c3)) + - Add `BlameRanges` to enable multi-range blame support ([`f189031`](https://github.com/GitoxideLabs/gitoxide/commit/f1890313c42d8f5b347feef1f48ec53f054dff08)) + - Merge pull request #1971 from GitoxideLabs/new-release ([`8d4c4d1`](https://github.com/GitoxideLabs/gitoxide/commit/8d4c4d1e09f84c962c29d98a686c64228196ac13)) +
+ ## 0.2.1 (2025-04-26) ### Commit Statistics - - 1 commit contributed to the release. + - 3 commits contributed to the release. - 0 commits were understood as [conventional](https://www.conventionalcommits.org). - 0 issues like '(#ID)' were seen in commit messages @@ -22,7 +97,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
view details * **Uncategorized** + - Release gix-date v0.10.1, gix-utils v0.3.0, gix-actor v0.35.1, gix-validate v0.10.0, gix-path v0.10.17, gix-features v0.42.1, gix-hash v0.18.0, gix-hashtable v0.8.1, gix-object v0.49.1, gix-glob v0.20.0, gix-quote v0.6.0, gix-attributes v0.26.0, gix-command v0.6.0, gix-packetline-blocking v0.19.0, gix-filter v0.19.1, gix-fs v0.15.0, gix-commitgraph v0.28.0, gix-revwalk v0.20.1, gix-traverse v0.46.1, gix-worktree-stream v0.21.1, gix-archive v0.21.1, gix-tempfile v17.1.0, gix-lock v17.1.0, gix-index v0.40.0, gix-config-value v0.15.0, gix-pathspec v0.11.0, gix-ignore v0.15.0, gix-worktree v0.41.0, gix-diff v0.52.1, gix-blame v0.2.1, gix-ref v0.52.1, gix-sec v0.11.0, gix-config v0.45.1, gix-prompt v0.11.0, gix-url v0.31.0, gix-credentials v0.29.0, gix-discover v0.40.1, gix-dir v0.14.1, gix-mailmap v0.27.1, gix-revision v0.34.1, gix-merge v0.5.1, gix-negotiate v0.20.1, gix-pack v0.59.1, gix-odb v0.69.1, gix-refspec v0.30.1, gix-shallow v0.4.0, gix-packetline v0.19.0, gix-transport v0.47.0, gix-protocol v0.50.1, gix-status v0.19.1, gix-submodule v0.19.1, gix-worktree-state v0.19.0, gix v0.72.1, gix-fsck v0.11.1, gitoxide-core v0.47.1, gitoxide v0.44.0 ([`e104545`](https://github.com/GitoxideLabs/gitoxide/commit/e104545b78951ca882481d4a58f4425a8bc81c87)) - Bump all prior pratch levels to majors ([`5f7f805`](https://github.com/GitoxideLabs/gitoxide/commit/5f7f80570e1a5522e76ea58cccbb957249a0dffe)) + - Merge pull request #1969 from GitoxideLabs/new-release ([`631f07a`](https://github.com/GitoxideLabs/gitoxide/commit/631f07ad0c1cb93d9da42cf2c8499584fe91880a))
## 0.2.0 (2025-04-25) diff --git a/gix-command/CHANGELOG.md b/gix-command/CHANGELOG.md index cc1e369e5a5..7b81fd68ff1 100644 --- a/gix-command/CHANGELOG.md +++ b/gix-command/CHANGELOG.md @@ -5,6 +5,31 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## Unreleased + +A maintenance release without user-facing changes. + +### Commit Statistics + + + + - 3 commits contributed to the release over the course of 59 calendar days. + - 59 days passed between releases. + - 0 commits were understood as [conventional](https://www.conventionalcommits.org). + - 0 issues like '(#ID)' were seen in commit messages + +### Commit Details + + + +
view details + + * **Uncategorized** + - Merge pull request #2062 from rickprice/minor_documentation_fixups ([`c2eb0c1`](https://github.com/GitoxideLabs/gitoxide/commit/c2eb0c144dd21cac87fd08829f4a5ca02f85008d)) + - Small documentation fixes ([`bfb1c34`](https://github.com/GitoxideLabs/gitoxide/commit/bfb1c34f75997a603b8f85fca75bf9e1ca310be0)) + - Merge pull request #2014 from GitoxideLabs/zip ([`648022b`](https://github.com/GitoxideLabs/gitoxide/commit/648022b44e12f597cae55cc45830d0a19b87eb4c)) +
+ ## 0.6.1 (2025-05-16) A maintenance release without user-facing changes. @@ -13,7 +38,7 @@ A maintenance release without user-facing changes. - - 4 commits contributed to the release over the course of 20 calendar days. + - 5 commits contributed to the release over the course of 20 calendar days. - 20 days passed between releases. - 0 commits were understood as [conventional](https://www.conventionalcommits.org). - 0 issues like '(#ID)' were seen in commit messages @@ -25,6 +50,7 @@ A maintenance release without user-facing changes.
view details * **Uncategorized** + - Release gix-glob v0.20.1, gix-attributes v0.26.1, gix-command v0.6.1, gix-filter v0.19.2, gix-worktree-stream v0.21.2, gix-archive v0.21.2 ([`f0ed2cc`](https://github.com/GitoxideLabs/gitoxide/commit/f0ed2cc0046f866e67944bff9aef0579c12d5852)) - Update changelogs prior to release ([`31b86ee`](https://github.com/GitoxideLabs/gitoxide/commit/31b86ee6774ad6762f941aa0e8377e709bd41f5e)) - Merge pull request #2009 from GitoxideLabs/release-gix-index ([`c3f06ae`](https://github.com/GitoxideLabs/gitoxide/commit/c3f06ae424ab4e1918a364cabe8276297465a73a)) - Release gix-path v0.10.18, gix-date v0.10.2, gix-traverse v0.46.2, gix-index v0.40.1 ([`d2b4c44`](https://github.com/GitoxideLabs/gitoxide/commit/d2b4c44fcb2bf43e80d67532262631a5086f08de)) diff --git a/gix-commitgraph/CHANGELOG.md b/gix-commitgraph/CHANGELOG.md index 8cf688f71c5..95e9dc8f290 100644 --- a/gix-commitgraph/CHANGELOG.md +++ b/gix-commitgraph/CHANGELOG.md @@ -5,13 +5,36 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## Unreleased + +A maintenance release without user-facing changes. + +### Commit Statistics + + + + - 1 commit contributed to the release over the course of 79 calendar days. + - 79 days passed between releases. + - 0 commits were understood as [conventional](https://www.conventionalcommits.org). + - 0 issues like '(#ID)' were seen in commit messages + +### Commit Details + + + +
view details + + * **Uncategorized** + - Merge pull request #1971 from GitoxideLabs/new-release ([`8d4c4d1`](https://github.com/GitoxideLabs/gitoxide/commit/8d4c4d1e09f84c962c29d98a686c64228196ac13)) +
+ ## 0.28.0 (2025-04-26) ### Commit Statistics - - 1 commit contributed to the release. + - 3 commits contributed to the release. - 0 commits were understood as [conventional](https://www.conventionalcommits.org). - 0 issues like '(#ID)' were seen in commit messages @@ -22,7 +45,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
view details * **Uncategorized** + - Release gix-date v0.10.1, gix-utils v0.3.0, gix-actor v0.35.1, gix-validate v0.10.0, gix-path v0.10.17, gix-features v0.42.1, gix-hash v0.18.0, gix-hashtable v0.8.1, gix-object v0.49.1, gix-glob v0.20.0, gix-quote v0.6.0, gix-attributes v0.26.0, gix-command v0.6.0, gix-packetline-blocking v0.19.0, gix-filter v0.19.1, gix-fs v0.15.0, gix-commitgraph v0.28.0, gix-revwalk v0.20.1, gix-traverse v0.46.1, gix-worktree-stream v0.21.1, gix-archive v0.21.1, gix-tempfile v17.1.0, gix-lock v17.1.0, gix-index v0.40.0, gix-config-value v0.15.0, gix-pathspec v0.11.0, gix-ignore v0.15.0, gix-worktree v0.41.0, gix-diff v0.52.1, gix-blame v0.2.1, gix-ref v0.52.1, gix-sec v0.11.0, gix-config v0.45.1, gix-prompt v0.11.0, gix-url v0.31.0, gix-credentials v0.29.0, gix-discover v0.40.1, gix-dir v0.14.1, gix-mailmap v0.27.1, gix-revision v0.34.1, gix-merge v0.5.1, gix-negotiate v0.20.1, gix-pack v0.59.1, gix-odb v0.69.1, gix-refspec v0.30.1, gix-shallow v0.4.0, gix-packetline v0.19.0, gix-transport v0.47.0, gix-protocol v0.50.1, gix-status v0.19.1, gix-submodule v0.19.1, gix-worktree-state v0.19.0, gix v0.72.1, gix-fsck v0.11.1, gitoxide-core v0.47.1, gitoxide v0.44.0 ([`e104545`](https://github.com/GitoxideLabs/gitoxide/commit/e104545b78951ca882481d4a58f4425a8bc81c87)) - Bump all prior pratch levels to majors ([`5f7f805`](https://github.com/GitoxideLabs/gitoxide/commit/5f7f80570e1a5522e76ea58cccbb957249a0dffe)) + - Merge pull request #1969 from GitoxideLabs/new-release ([`631f07a`](https://github.com/GitoxideLabs/gitoxide/commit/631f07ad0c1cb93d9da42cf2c8499584fe91880a))
## 0.27.1 (2025-04-25) diff --git a/gix-config-value/CHANGELOG.md b/gix-config-value/CHANGELOG.md index 58d8e7ca87e..1883b8024c4 100644 --- a/gix-config-value/CHANGELOG.md +++ b/gix-config-value/CHANGELOG.md @@ -5,13 +5,38 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## Unreleased + +A maintenance release without user-facing changes. + +### Commit Statistics + + + + - 3 commits contributed to the release over the course of 79 calendar days. + - 79 days passed between releases. + - 0 commits were understood as [conventional](https://www.conventionalcommits.org). + - 0 issues like '(#ID)' were seen in commit messages + +### Commit Details + + + +
view details + + * **Uncategorized** + - Merge pull request #2009 from GitoxideLabs/release-gix-index ([`c3f06ae`](https://github.com/GitoxideLabs/gitoxide/commit/c3f06ae424ab4e1918a364cabe8276297465a73a)) + - Release gix-path v0.10.18, gix-date v0.10.2, gix-traverse v0.46.2, gix-index v0.40.1 ([`d2b4c44`](https://github.com/GitoxideLabs/gitoxide/commit/d2b4c44fcb2bf43e80d67532262631a5086f08de)) + - Merge pull request #1971 from GitoxideLabs/new-release ([`8d4c4d1`](https://github.com/GitoxideLabs/gitoxide/commit/8d4c4d1e09f84c962c29d98a686c64228196ac13)) +
+ ## 0.15.0 (2025-04-26) ### Commit Statistics - - 1 commit contributed to the release. + - 3 commits contributed to the release. - 0 commits were understood as [conventional](https://www.conventionalcommits.org). - 0 issues like '(#ID)' were seen in commit messages @@ -22,7 +47,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
view details * **Uncategorized** + - Release gix-date v0.10.1, gix-utils v0.3.0, gix-actor v0.35.1, gix-validate v0.10.0, gix-path v0.10.17, gix-features v0.42.1, gix-hash v0.18.0, gix-hashtable v0.8.1, gix-object v0.49.1, gix-glob v0.20.0, gix-quote v0.6.0, gix-attributes v0.26.0, gix-command v0.6.0, gix-packetline-blocking v0.19.0, gix-filter v0.19.1, gix-fs v0.15.0, gix-commitgraph v0.28.0, gix-revwalk v0.20.1, gix-traverse v0.46.1, gix-worktree-stream v0.21.1, gix-archive v0.21.1, gix-tempfile v17.1.0, gix-lock v17.1.0, gix-index v0.40.0, gix-config-value v0.15.0, gix-pathspec v0.11.0, gix-ignore v0.15.0, gix-worktree v0.41.0, gix-diff v0.52.1, gix-blame v0.2.1, gix-ref v0.52.1, gix-sec v0.11.0, gix-config v0.45.1, gix-prompt v0.11.0, gix-url v0.31.0, gix-credentials v0.29.0, gix-discover v0.40.1, gix-dir v0.14.1, gix-mailmap v0.27.1, gix-revision v0.34.1, gix-merge v0.5.1, gix-negotiate v0.20.1, gix-pack v0.59.1, gix-odb v0.69.1, gix-refspec v0.30.1, gix-shallow v0.4.0, gix-packetline v0.19.0, gix-transport v0.47.0, gix-protocol v0.50.1, gix-status v0.19.1, gix-submodule v0.19.1, gix-worktree-state v0.19.0, gix v0.72.1, gix-fsck v0.11.1, gitoxide-core v0.47.1, gitoxide v0.44.0 ([`e104545`](https://github.com/GitoxideLabs/gitoxide/commit/e104545b78951ca882481d4a58f4425a8bc81c87)) - Bump all prior pratch levels to majors ([`5f7f805`](https://github.com/GitoxideLabs/gitoxide/commit/5f7f80570e1a5522e76ea58cccbb957249a0dffe)) + - Merge pull request #1969 from GitoxideLabs/new-release ([`631f07a`](https://github.com/GitoxideLabs/gitoxide/commit/631f07ad0c1cb93d9da42cf2c8499584fe91880a))
## 0.14.13 (2025-04-25) diff --git a/gix-config/CHANGELOG.md b/gix-config/CHANGELOG.md index 26fb2bcc31c..ae37ff9087d 100644 --- a/gix-config/CHANGELOG.md +++ b/gix-config/CHANGELOG.md @@ -5,13 +5,54 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## Unreleased + +A maintenance release without user-facing changes. + +### Commit Statistics + + + + - 13 commits contributed to the release over the course of 79 calendar days. + - 79 days passed between releases. + - 0 commits were understood as [conventional](https://www.conventionalcommits.org). + - 0 issues like '(#ID)' were seen in commit messages + +### Thanks Clippy + + + +[Clippy](https://github.com/rust-lang/rust-clippy) helped 1 time to make code idiomatic. + +### Commit Details + + + +
view details + + * **Uncategorized** + - Merge pull request #2070 from GitoxideLabs/dependabot/cargo/cargo-827bceb7eb ([`dab97f7`](https://github.com/GitoxideLabs/gitoxide/commit/dab97f7618f160421b6e31de8f3e2f3d11dc2ef2)) + - Bump the cargo group across 1 directory with 68 updates ([`a9a8ea1`](https://github.com/GitoxideLabs/gitoxide/commit/a9a8ea1472532dde03bce4e0afdfa82924af1f96)) + - Merge pull request #2041 from cruessler/add-blame-extraction ([`dd5f0a4`](https://github.com/GitoxideLabs/gitoxide/commit/dd5f0a4811bc738051f7af164b8d2815aaa23220)) + - Thanks clippy ([`554ce13`](https://github.com/GitoxideLabs/gitoxide/commit/554ce134bc4b514b52a935f17f57f76ebf23ab97)) + - Merge pull request #2033 from GitoxideLabs/dependabot/cargo/cargo-b72232998d ([`f8d7c0a`](https://github.com/GitoxideLabs/gitoxide/commit/f8d7c0ad8fa7745c973c6b87e7eee70831300207)) + - Adapt `gix-config`/`gix-object` benches to changes in `criterion` ([`91aef25`](https://github.com/GitoxideLabs/gitoxide/commit/91aef25a9febd440a8c14ce9d73716b5b1de6257)) + - Adapt `gix-config` tests to changes in `tempfile` ([`eccd13a`](https://github.com/GitoxideLabs/gitoxide/commit/eccd13a4b5b39422e04a00cedc81c8991c9eba3e)) + - Bump the cargo group with 56 updates ([`151e3a5`](https://github.com/GitoxideLabs/gitoxide/commit/151e3a5cca06444eea4c6a362649e66c831673d6)) + - Merge pull request #2014 from GitoxideLabs/zip ([`648022b`](https://github.com/GitoxideLabs/gitoxide/commit/648022b44e12f597cae55cc45830d0a19b87eb4c)) + - Release gix-glob v0.20.1, gix-attributes v0.26.1, gix-command v0.6.1, gix-filter v0.19.2, gix-worktree-stream v0.21.2, gix-archive v0.21.2 ([`f0ed2cc`](https://github.com/GitoxideLabs/gitoxide/commit/f0ed2cc0046f866e67944bff9aef0579c12d5852)) + - Merge pull request #2009 from GitoxideLabs/release-gix-index ([`c3f06ae`](https://github.com/GitoxideLabs/gitoxide/commit/c3f06ae424ab4e1918a364cabe8276297465a73a)) + - Release gix-path v0.10.18, gix-date v0.10.2, gix-traverse v0.46.2, gix-index v0.40.1 ([`d2b4c44`](https://github.com/GitoxideLabs/gitoxide/commit/d2b4c44fcb2bf43e80d67532262631a5086f08de)) + - Merge pull request #1971 from GitoxideLabs/new-release ([`8d4c4d1`](https://github.com/GitoxideLabs/gitoxide/commit/8d4c4d1e09f84c962c29d98a686c64228196ac13)) +
+ ## 0.45.1 (2025-04-26) ### Commit Statistics - - 1 commit contributed to the release. + - 3 commits contributed to the release. - 0 commits were understood as [conventional](https://www.conventionalcommits.org). - 0 issues like '(#ID)' were seen in commit messages @@ -22,7 +63,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
view details * **Uncategorized** + - Release gix-date v0.10.1, gix-utils v0.3.0, gix-actor v0.35.1, gix-validate v0.10.0, gix-path v0.10.17, gix-features v0.42.1, gix-hash v0.18.0, gix-hashtable v0.8.1, gix-object v0.49.1, gix-glob v0.20.0, gix-quote v0.6.0, gix-attributes v0.26.0, gix-command v0.6.0, gix-packetline-blocking v0.19.0, gix-filter v0.19.1, gix-fs v0.15.0, gix-commitgraph v0.28.0, gix-revwalk v0.20.1, gix-traverse v0.46.1, gix-worktree-stream v0.21.1, gix-archive v0.21.1, gix-tempfile v17.1.0, gix-lock v17.1.0, gix-index v0.40.0, gix-config-value v0.15.0, gix-pathspec v0.11.0, gix-ignore v0.15.0, gix-worktree v0.41.0, gix-diff v0.52.1, gix-blame v0.2.1, gix-ref v0.52.1, gix-sec v0.11.0, gix-config v0.45.1, gix-prompt v0.11.0, gix-url v0.31.0, gix-credentials v0.29.0, gix-discover v0.40.1, gix-dir v0.14.1, gix-mailmap v0.27.1, gix-revision v0.34.1, gix-merge v0.5.1, gix-negotiate v0.20.1, gix-pack v0.59.1, gix-odb v0.69.1, gix-refspec v0.30.1, gix-shallow v0.4.0, gix-packetline v0.19.0, gix-transport v0.47.0, gix-protocol v0.50.1, gix-status v0.19.1, gix-submodule v0.19.1, gix-worktree-state v0.19.0, gix v0.72.1, gix-fsck v0.11.1, gitoxide-core v0.47.1, gitoxide v0.44.0 ([`e104545`](https://github.com/GitoxideLabs/gitoxide/commit/e104545b78951ca882481d4a58f4425a8bc81c87)) - Bump all prior pratch levels to majors ([`5f7f805`](https://github.com/GitoxideLabs/gitoxide/commit/5f7f80570e1a5522e76ea58cccbb957249a0dffe)) + - Merge pull request #1969 from GitoxideLabs/new-release ([`631f07a`](https://github.com/GitoxideLabs/gitoxide/commit/631f07ad0c1cb93d9da42cf2c8499584fe91880a))
## 0.45.0 (2025-04-25) @@ -3793,6 +3836,24 @@ This is a maintenance release without functional changes. - `len` - `from_env` - `open` + - `len` + - `from_env` + - `open` + - `len` + - `from_env` + - `open` + - `len` + - `from_env` + - `open` +- `len` +- `from_env` +- `open` +- `len` +- `from_env` +- `open` +- `len` +- `from_env` +- `open` - `len` - `from_env` - `open` @@ -4044,6 +4105,7 @@ This is a maintenance release without functional changes. `ParserFromIoError` +lenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopen lenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopen lenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopen lenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopen @@ -4059,6 +4121,7 @@ lenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfr + ## v0.1.1 (2021-05-09) diff --git a/gix-credentials/CHANGELOG.md b/gix-credentials/CHANGELOG.md index 6df6a675255..479d3f08a06 100644 --- a/gix-credentials/CHANGELOG.md +++ b/gix-credentials/CHANGELOG.md @@ -5,13 +5,51 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## Unreleased + +### New Features + + - add `protocol::Context::redacted()` as convenient way to not leak secrets. + +### Bug Fixes (BREAKING) + + - pass `password_expiry_utc` and `oauth_refresh_token` in credential helper invocations + +### Commit Statistics + + + + - 9 commits contributed to the release over the course of 79 calendar days. + - 79 days passed between releases. + - 2 commits were understood as [conventional](https://www.conventionalcommits.org). + - 1 unique issue was worked on: [#1998](https://github.com/GitoxideLabs/gitoxide/issues/1998) + +### Commit Details + + + +
view details + + * **[#1998](https://github.com/GitoxideLabs/gitoxide/issues/1998)** + - Pass `password_expiry_utc` and `oauth_refresh_token` in credential helper invocations ([`3a50af5`](https://github.com/GitoxideLabs/gitoxide/commit/3a50af524ad5e13bbd08bbb96cbf0817d5e89038)) + * **Uncategorized** + - Merge pull request #2014 from GitoxideLabs/zip ([`648022b`](https://github.com/GitoxideLabs/gitoxide/commit/648022b44e12f597cae55cc45830d0a19b87eb4c)) + - Release gix-glob v0.20.1, gix-attributes v0.26.1, gix-command v0.6.1, gix-filter v0.19.2, gix-worktree-stream v0.21.2, gix-archive v0.21.2 ([`f0ed2cc`](https://github.com/GitoxideLabs/gitoxide/commit/f0ed2cc0046f866e67944bff9aef0579c12d5852)) + - Merge pull request #1999 from GitoxideLabs/credential-helper-protocol-fix ([`8d30ab1`](https://github.com/GitoxideLabs/gitoxide/commit/8d30ab1260fa69468b66d6df3297bb2b43530b93)) + - Adapt to changes in `gix-sec` ([`6880175`](https://github.com/GitoxideLabs/gitoxide/commit/6880175ab1bb70af39d18919cb8bfdc1df32b46f)) + - Merge pull request #2009 from GitoxideLabs/release-gix-index ([`c3f06ae`](https://github.com/GitoxideLabs/gitoxide/commit/c3f06ae424ab4e1918a364cabe8276297465a73a)) + - Release gix-path v0.10.18, gix-date v0.10.2, gix-traverse v0.46.2, gix-index v0.40.1 ([`d2b4c44`](https://github.com/GitoxideLabs/gitoxide/commit/d2b4c44fcb2bf43e80d67532262631a5086f08de)) + - Add `protocol::Context::redacted()` as convenient way to not leak secrets. ([`f0cacb0`](https://github.com/GitoxideLabs/gitoxide/commit/f0cacb0e80c8aace4bc60eb228ae184744633a21)) + - Merge pull request #1971 from GitoxideLabs/new-release ([`8d4c4d1`](https://github.com/GitoxideLabs/gitoxide/commit/8d4c4d1e09f84c962c29d98a686c64228196ac13)) +
+ ## 0.29.0 (2025-04-26) ### Commit Statistics - - 1 commit contributed to the release. + - 3 commits contributed to the release. - 0 commits were understood as [conventional](https://www.conventionalcommits.org). - 0 issues like '(#ID)' were seen in commit messages @@ -22,7 +60,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
view details * **Uncategorized** + - Release gix-date v0.10.1, gix-utils v0.3.0, gix-actor v0.35.1, gix-validate v0.10.0, gix-path v0.10.17, gix-features v0.42.1, gix-hash v0.18.0, gix-hashtable v0.8.1, gix-object v0.49.1, gix-glob v0.20.0, gix-quote v0.6.0, gix-attributes v0.26.0, gix-command v0.6.0, gix-packetline-blocking v0.19.0, gix-filter v0.19.1, gix-fs v0.15.0, gix-commitgraph v0.28.0, gix-revwalk v0.20.1, gix-traverse v0.46.1, gix-worktree-stream v0.21.1, gix-archive v0.21.1, gix-tempfile v17.1.0, gix-lock v17.1.0, gix-index v0.40.0, gix-config-value v0.15.0, gix-pathspec v0.11.0, gix-ignore v0.15.0, gix-worktree v0.41.0, gix-diff v0.52.1, gix-blame v0.2.1, gix-ref v0.52.1, gix-sec v0.11.0, gix-config v0.45.1, gix-prompt v0.11.0, gix-url v0.31.0, gix-credentials v0.29.0, gix-discover v0.40.1, gix-dir v0.14.1, gix-mailmap v0.27.1, gix-revision v0.34.1, gix-merge v0.5.1, gix-negotiate v0.20.1, gix-pack v0.59.1, gix-odb v0.69.1, gix-refspec v0.30.1, gix-shallow v0.4.0, gix-packetline v0.19.0, gix-transport v0.47.0, gix-protocol v0.50.1, gix-status v0.19.1, gix-submodule v0.19.1, gix-worktree-state v0.19.0, gix v0.72.1, gix-fsck v0.11.1, gitoxide-core v0.47.1, gitoxide v0.44.0 ([`e104545`](https://github.com/GitoxideLabs/gitoxide/commit/e104545b78951ca882481d4a58f4425a8bc81c87)) - Bump all prior pratch levels to majors ([`5f7f805`](https://github.com/GitoxideLabs/gitoxide/commit/5f7f80570e1a5522e76ea58cccbb957249a0dffe)) + - Merge pull request #1969 from GitoxideLabs/new-release ([`631f07a`](https://github.com/GitoxideLabs/gitoxide/commit/631f07ad0c1cb93d9da42cf2c8499584fe91880a))
## 0.28.1 (2025-04-25) diff --git a/gix-date/CHANGELOG.md b/gix-date/CHANGELOG.md index 816b6b41aba..694e403c95b 100644 --- a/gix-date/CHANGELOG.md +++ b/gix-date/CHANGELOG.md @@ -5,6 +5,33 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## Unreleased + +A maintenance release without user-facing changes. + +### Commit Statistics + + + + - 5 commits contributed to the release over the course of 65 calendar days. + - 65 days passed between releases. + - 0 commits were understood as [conventional](https://www.conventionalcommits.org). + - 0 issues like '(#ID)' were seen in commit messages + +### Commit Details + + + +
view details + + * **Uncategorized** + - Merge pull request #2070 from GitoxideLabs/dependabot/cargo/cargo-827bceb7eb ([`dab97f7`](https://github.com/GitoxideLabs/gitoxide/commit/dab97f7618f160421b6e31de8f3e2f3d11dc2ef2)) + - Bump the cargo group across 1 directory with 68 updates ([`a9a8ea1`](https://github.com/GitoxideLabs/gitoxide/commit/a9a8ea1472532dde03bce4e0afdfa82924af1f96)) + - Merge pull request #2033 from GitoxideLabs/dependabot/cargo/cargo-b72232998d ([`f8d7c0a`](https://github.com/GitoxideLabs/gitoxide/commit/f8d7c0ad8fa7745c973c6b87e7eee70831300207)) + - Bump the cargo group with 56 updates ([`151e3a5`](https://github.com/GitoxideLabs/gitoxide/commit/151e3a5cca06444eea4c6a362649e66c831673d6)) + - Merge pull request #2009 from GitoxideLabs/release-gix-index ([`c3f06ae`](https://github.com/GitoxideLabs/gitoxide/commit/c3f06ae424ab4e1918a364cabe8276297465a73a)) +
+ ## 0.10.2 (2025-05-10) A maintenance release without user-facing changes. @@ -13,7 +40,7 @@ A maintenance release without user-facing changes. - - 5 commits contributed to the release over the course of 14 calendar days. + - 6 commits contributed to the release over the course of 14 calendar days. - 14 days passed between releases. - 0 commits were understood as [conventional](https://www.conventionalcommits.org). - 2 unique issues were worked on: [#1979](https://github.com/GitoxideLabs/gitoxide/issues/1979), [#1984](https://github.com/GitoxideLabs/gitoxide/issues/1984) @@ -29,6 +56,7 @@ A maintenance release without user-facing changes. * **[#1984](https://github.com/GitoxideLabs/gitoxide/issues/1984)** - Further upgrade `jiff` to fix fuzz failures ([`0be4dd4`](https://github.com/GitoxideLabs/gitoxide/commit/0be4dd4e037e8a3080ef335913e06bc2584fd96d)) * **Uncategorized** + - Release gix-path v0.10.18, gix-date v0.10.2, gix-traverse v0.46.2, gix-index v0.40.1 ([`d2b4c44`](https://github.com/GitoxideLabs/gitoxide/commit/d2b4c44fcb2bf43e80d67532262631a5086f08de)) - Prepare changelogs prior to release of `gix-index` ([`bfc4880`](https://github.com/GitoxideLabs/gitoxide/commit/bfc48801bf3ed39cdf7ec02e01aa3cfb6181705f)) - Merge pull request #1984 from GitoxideLabs/fuzz ([`f965540`](https://github.com/GitoxideLabs/gitoxide/commit/f965540c162ed3e23bd0d7ad9083093033647e51)) - Merge pull request #1971 from GitoxideLabs/new-release ([`8d4c4d1`](https://github.com/GitoxideLabs/gitoxide/commit/8d4c4d1e09f84c962c29d98a686c64228196ac13)) diff --git a/gix-diff/CHANGELOG.md b/gix-diff/CHANGELOG.md index 36f9ca64791..dbb2ddc890e 100644 --- a/gix-diff/CHANGELOG.md +++ b/gix-diff/CHANGELOG.md @@ -5,13 +5,85 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## Unreleased + +### New Features + + - add explicit accessors for common fields + - Add `Sink` that implements git's diffing improvement heuristics + +### Bug Fixes + + - `blob::UnifiedDiff` now produces non-overlapping hunks. + Previously it was possible to see two hunks with overlapping context lines + due to an off-by-one error. + - remove `blob::GitDiff` Sink as it doesn't work concistently. + Against better judgement I was compelled to merge this implementation in, + assuming one test must be enough given that it is a transcription. + + This, however, wasn't the case and there is strong evidence that it produces + diffs that aren't correct. + - improve rename tracking performance characteristics to make exponential runtime less likely. + This optimizes specifically for the case where there are a lot of added files, but no deletion to + pair it up with. + +### Commit Statistics + + + + - 25 commits contributed to the release over the course of 79 calendar days. + - 79 days passed between releases. + - 5 commits were understood as [conventional](https://www.conventionalcommits.org). + - 1 unique issue was worked on: [#2011](https://github.com/GitoxideLabs/gitoxide/issues/2011) + +### Thanks Clippy + + + +[Clippy](https://github.com/rust-lang/rust-clippy) helped 2 times to make code idiomatic. + +### Commit Details + + + +
view details + + * **[#2011](https://github.com/GitoxideLabs/gitoxide/issues/2011)** + - Remove `blob::GitDiff` Sink as it doesn't work concistently. ([`4f27179`](https://github.com/GitoxideLabs/gitoxide/commit/4f271796041655d80ab0435a76281446e21ad8cd)) + * **Uncategorized** + - Merge pull request #2071 from cruessler/add-accessors-to-change-ref ([`5335c84`](https://github.com/GitoxideLabs/gitoxide/commit/5335c84a68739adc5a7db31220037c83b7be2429)) + - Merge pull request #2072 from GitoxideLabs/fix-unidiff ([`f87967d`](https://github.com/GitoxideLabs/gitoxide/commit/f87967d4983f96133d184eff9d689a333c819958)) + - Reproduce unified diff issue ([`5e64298`](https://github.com/GitoxideLabs/gitoxide/commit/5e64298ba4864636779ae72e301475e9cfe01ac8)) + - Thanks clippy ([`79b8f06`](https://github.com/GitoxideLabs/gitoxide/commit/79b8f0656e34e5099cf09ecd9a9bf569f24c7c0b)) + - Reference new methods in docs for `ChangeRef::field()` ([`fad0118`](https://github.com/GitoxideLabs/gitoxide/commit/fad0118b53dbd9a18ee80e76b16f2b732496ac73)) + - Add explicit accessors for common fields ([`bd01893`](https://github.com/GitoxideLabs/gitoxide/commit/bd0189360152325b3d0eb8a19a1c96af938071b1)) + - Merge pull request #2043 from GitoxideLabs/fix-unidiff ([`08e7777`](https://github.com/GitoxideLabs/gitoxide/commit/08e7777454bdce466363321fce7b168d425bb833)) + - `blob::UnifiedDiff` now produces non-overlapping hunks. ([`0d102f4`](https://github.com/GitoxideLabs/gitoxide/commit/0d102f4bdf1450f9c5f8d4176707c73b499bd665)) + - Merge pull request #2017 from GitoxideLabs/improvements ([`3094214`](https://github.com/GitoxideLabs/gitoxide/commit/309421424fa02037f7609fc4ca0c03a99909cdb6)) + - Improve rename tracking performance characteristics to make exponential runtime less likely. ([`0eaced9`](https://github.com/GitoxideLabs/gitoxide/commit/0eaced934a4d52d80d680222fc0c9f7aae74f056)) + - Merge pull request #2011 from blinxen/main ([`fd49eee`](https://github.com/GitoxideLabs/gitoxide/commit/fd49eeeb850ea3c3956ca15be2bf4e04a3d319ad)) + - Make `GitDiff` compatible to strings and bytes. ([`5505646`](https://github.com/GitoxideLabs/gitoxide/commit/55056467e8b1d2ee327e4f29df058224fb64db5e)) + - Refactor ([`5e699d2`](https://github.com/GitoxideLabs/gitoxide/commit/5e699d26846740ee098e780bb2b861fcae2d31ca)) + - Add `Sink` that implements git's diffing improvement heuristics ([`c84296b`](https://github.com/GitoxideLabs/gitoxide/commit/c84296b98876539e1b21072f32c0339932215f42)) + - Update `imara-diff` to the latest version. ([`732adb8`](https://github.com/GitoxideLabs/gitoxide/commit/732adb87c90283bd8f8fce6d633eacc25e10b353)) + - Merge pull request #2014 from GitoxideLabs/zip ([`648022b`](https://github.com/GitoxideLabs/gitoxide/commit/648022b44e12f597cae55cc45830d0a19b87eb4c)) + - Release gix-glob v0.20.1, gix-attributes v0.26.1, gix-command v0.6.1, gix-filter v0.19.2, gix-worktree-stream v0.21.2, gix-archive v0.21.2 ([`f0ed2cc`](https://github.com/GitoxideLabs/gitoxide/commit/f0ed2cc0046f866e67944bff9aef0579c12d5852)) + - Merge pull request #2009 from GitoxideLabs/release-gix-index ([`c3f06ae`](https://github.com/GitoxideLabs/gitoxide/commit/c3f06ae424ab4e1918a364cabe8276297465a73a)) + - Release gix-path v0.10.18, gix-date v0.10.2, gix-traverse v0.46.2, gix-index v0.40.1 ([`d2b4c44`](https://github.com/GitoxideLabs/gitoxide/commit/d2b4c44fcb2bf43e80d67532262631a5086f08de)) + - Merge pull request #1975 from GitoxideLabs/improvements ([`28935a5`](https://github.com/GitoxideLabs/gitoxide/commit/28935a56ff91f1fc2c17a7d23b057cf7119144e9)) + - Thanks clippy ([`dbf65c9`](https://github.com/GitoxideLabs/gitoxide/commit/dbf65c95644e6a134e7f9b75e7871479720b4deb)) + - Merge pull request #1977 from GitoxideLabs/dependabot/cargo/cargo-811d7b929d ([`800738a`](https://github.com/GitoxideLabs/gitoxide/commit/800738a37f3d33926a427edfa294423bbe3f2b66)) + - Bump the cargo group with 12 updates ([`4408166`](https://github.com/GitoxideLabs/gitoxide/commit/4408166bf56197a67419277a4ef8feeba9060fee)) + - Merge pull request #1971 from GitoxideLabs/new-release ([`8d4c4d1`](https://github.com/GitoxideLabs/gitoxide/commit/8d4c4d1e09f84c962c29d98a686c64228196ac13)) +
+ ## 0.52.1 (2025-04-26) ### Commit Statistics - - 1 commit contributed to the release. + - 3 commits contributed to the release. - 0 commits were understood as [conventional](https://www.conventionalcommits.org). - 0 issues like '(#ID)' were seen in commit messages @@ -22,7 +94,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
view details * **Uncategorized** + - Release gix-date v0.10.1, gix-utils v0.3.0, gix-actor v0.35.1, gix-validate v0.10.0, gix-path v0.10.17, gix-features v0.42.1, gix-hash v0.18.0, gix-hashtable v0.8.1, gix-object v0.49.1, gix-glob v0.20.0, gix-quote v0.6.0, gix-attributes v0.26.0, gix-command v0.6.0, gix-packetline-blocking v0.19.0, gix-filter v0.19.1, gix-fs v0.15.0, gix-commitgraph v0.28.0, gix-revwalk v0.20.1, gix-traverse v0.46.1, gix-worktree-stream v0.21.1, gix-archive v0.21.1, gix-tempfile v17.1.0, gix-lock v17.1.0, gix-index v0.40.0, gix-config-value v0.15.0, gix-pathspec v0.11.0, gix-ignore v0.15.0, gix-worktree v0.41.0, gix-diff v0.52.1, gix-blame v0.2.1, gix-ref v0.52.1, gix-sec v0.11.0, gix-config v0.45.1, gix-prompt v0.11.0, gix-url v0.31.0, gix-credentials v0.29.0, gix-discover v0.40.1, gix-dir v0.14.1, gix-mailmap v0.27.1, gix-revision v0.34.1, gix-merge v0.5.1, gix-negotiate v0.20.1, gix-pack v0.59.1, gix-odb v0.69.1, gix-refspec v0.30.1, gix-shallow v0.4.0, gix-packetline v0.19.0, gix-transport v0.47.0, gix-protocol v0.50.1, gix-status v0.19.1, gix-submodule v0.19.1, gix-worktree-state v0.19.0, gix v0.72.1, gix-fsck v0.11.1, gitoxide-core v0.47.1, gitoxide v0.44.0 ([`e104545`](https://github.com/GitoxideLabs/gitoxide/commit/e104545b78951ca882481d4a58f4425a8bc81c87)) - Bump all prior pratch levels to majors ([`5f7f805`](https://github.com/GitoxideLabs/gitoxide/commit/5f7f80570e1a5522e76ea58cccbb957249a0dffe)) + - Merge pull request #1969 from GitoxideLabs/new-release ([`631f07a`](https://github.com/GitoxideLabs/gitoxide/commit/631f07ad0c1cb93d9da42cf2c8499584fe91880a))
## 0.52.0 (2025-04-25) diff --git a/gix-dir/CHANGELOG.md b/gix-dir/CHANGELOG.md index 24537a9e356..309b35cc0c8 100644 --- a/gix-dir/CHANGELOG.md +++ b/gix-dir/CHANGELOG.md @@ -5,13 +5,40 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## Unreleased + +A maintenance release without user-facing changes. + +### Commit Statistics + + + + - 5 commits contributed to the release over the course of 79 calendar days. + - 79 days passed between releases. + - 0 commits were understood as [conventional](https://www.conventionalcommits.org). + - 0 issues like '(#ID)' were seen in commit messages + +### Commit Details + + + +
view details + + * **Uncategorized** + - Merge pull request #2019 from GitoxideLabs/precious-opt-in ([`5f9de52`](https://github.com/GitoxideLabs/gitoxide/commit/5f9de52cf286163b503047b1ab3b51dfa093b4d4)) + - Adapt to changes in `gix-ignore` and `gix-glob`, and more. ([`4ef7806`](https://github.com/GitoxideLabs/gitoxide/commit/4ef7806e62954d069861bddb06cb8c0baf47bb69)) + - Merge pull request #2009 from GitoxideLabs/release-gix-index ([`c3f06ae`](https://github.com/GitoxideLabs/gitoxide/commit/c3f06ae424ab4e1918a364cabe8276297465a73a)) + - Release gix-path v0.10.18, gix-date v0.10.2, gix-traverse v0.46.2, gix-index v0.40.1 ([`d2b4c44`](https://github.com/GitoxideLabs/gitoxide/commit/d2b4c44fcb2bf43e80d67532262631a5086f08de)) + - Merge pull request #1971 from GitoxideLabs/new-release ([`8d4c4d1`](https://github.com/GitoxideLabs/gitoxide/commit/8d4c4d1e09f84c962c29d98a686c64228196ac13)) +
+ ## 0.14.1 (2025-04-26) ### Commit Statistics - - 1 commit contributed to the release. + - 3 commits contributed to the release. - 0 commits were understood as [conventional](https://www.conventionalcommits.org). - 0 issues like '(#ID)' were seen in commit messages @@ -22,7 +49,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
view details * **Uncategorized** + - Release gix-date v0.10.1, gix-utils v0.3.0, gix-actor v0.35.1, gix-validate v0.10.0, gix-path v0.10.17, gix-features v0.42.1, gix-hash v0.18.0, gix-hashtable v0.8.1, gix-object v0.49.1, gix-glob v0.20.0, gix-quote v0.6.0, gix-attributes v0.26.0, gix-command v0.6.0, gix-packetline-blocking v0.19.0, gix-filter v0.19.1, gix-fs v0.15.0, gix-commitgraph v0.28.0, gix-revwalk v0.20.1, gix-traverse v0.46.1, gix-worktree-stream v0.21.1, gix-archive v0.21.1, gix-tempfile v17.1.0, gix-lock v17.1.0, gix-index v0.40.0, gix-config-value v0.15.0, gix-pathspec v0.11.0, gix-ignore v0.15.0, gix-worktree v0.41.0, gix-diff v0.52.1, gix-blame v0.2.1, gix-ref v0.52.1, gix-sec v0.11.0, gix-config v0.45.1, gix-prompt v0.11.0, gix-url v0.31.0, gix-credentials v0.29.0, gix-discover v0.40.1, gix-dir v0.14.1, gix-mailmap v0.27.1, gix-revision v0.34.1, gix-merge v0.5.1, gix-negotiate v0.20.1, gix-pack v0.59.1, gix-odb v0.69.1, gix-refspec v0.30.1, gix-shallow v0.4.0, gix-packetline v0.19.0, gix-transport v0.47.0, gix-protocol v0.50.1, gix-status v0.19.1, gix-submodule v0.19.1, gix-worktree-state v0.19.0, gix v0.72.1, gix-fsck v0.11.1, gitoxide-core v0.47.1, gitoxide v0.44.0 ([`e104545`](https://github.com/GitoxideLabs/gitoxide/commit/e104545b78951ca882481d4a58f4425a8bc81c87)) - Bump all prior pratch levels to majors ([`5f7f805`](https://github.com/GitoxideLabs/gitoxide/commit/5f7f80570e1a5522e76ea58cccbb957249a0dffe)) + - Merge pull request #1969 from GitoxideLabs/new-release ([`631f07a`](https://github.com/GitoxideLabs/gitoxide/commit/631f07ad0c1cb93d9da42cf2c8499584fe91880a))
## 0.14.0 (2025-04-25) diff --git a/gix-discover/CHANGELOG.md b/gix-discover/CHANGELOG.md index 69d388d6c4f..897f623d611 100644 --- a/gix-discover/CHANGELOG.md +++ b/gix-discover/CHANGELOG.md @@ -5,13 +5,40 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## Unreleased + +A maintenance release without user-facing changes. + +### Commit Statistics + + + + - 5 commits contributed to the release over the course of 79 calendar days. + - 79 days passed between releases. + - 0 commits were understood as [conventional](https://www.conventionalcommits.org). + - 0 issues like '(#ID)' were seen in commit messages + +### Commit Details + + + +
view details + + * **Uncategorized** + - Merge pull request #2033 from GitoxideLabs/dependabot/cargo/cargo-b72232998d ([`f8d7c0a`](https://github.com/GitoxideLabs/gitoxide/commit/f8d7c0ad8fa7745c973c6b87e7eee70831300207)) + - Bump the cargo group with 56 updates ([`151e3a5`](https://github.com/GitoxideLabs/gitoxide/commit/151e3a5cca06444eea4c6a362649e66c831673d6)) + - Merge pull request #2009 from GitoxideLabs/release-gix-index ([`c3f06ae`](https://github.com/GitoxideLabs/gitoxide/commit/c3f06ae424ab4e1918a364cabe8276297465a73a)) + - Release gix-path v0.10.18, gix-date v0.10.2, gix-traverse v0.46.2, gix-index v0.40.1 ([`d2b4c44`](https://github.com/GitoxideLabs/gitoxide/commit/d2b4c44fcb2bf43e80d67532262631a5086f08de)) + - Merge pull request #1971 from GitoxideLabs/new-release ([`8d4c4d1`](https://github.com/GitoxideLabs/gitoxide/commit/8d4c4d1e09f84c962c29d98a686c64228196ac13)) +
+ ## 0.40.1 (2025-04-26) ### Commit Statistics - - 1 commit contributed to the release. + - 3 commits contributed to the release. - 0 commits were understood as [conventional](https://www.conventionalcommits.org). - 0 issues like '(#ID)' were seen in commit messages @@ -22,7 +49,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
view details * **Uncategorized** + - Release gix-date v0.10.1, gix-utils v0.3.0, gix-actor v0.35.1, gix-validate v0.10.0, gix-path v0.10.17, gix-features v0.42.1, gix-hash v0.18.0, gix-hashtable v0.8.1, gix-object v0.49.1, gix-glob v0.20.0, gix-quote v0.6.0, gix-attributes v0.26.0, gix-command v0.6.0, gix-packetline-blocking v0.19.0, gix-filter v0.19.1, gix-fs v0.15.0, gix-commitgraph v0.28.0, gix-revwalk v0.20.1, gix-traverse v0.46.1, gix-worktree-stream v0.21.1, gix-archive v0.21.1, gix-tempfile v17.1.0, gix-lock v17.1.0, gix-index v0.40.0, gix-config-value v0.15.0, gix-pathspec v0.11.0, gix-ignore v0.15.0, gix-worktree v0.41.0, gix-diff v0.52.1, gix-blame v0.2.1, gix-ref v0.52.1, gix-sec v0.11.0, gix-config v0.45.1, gix-prompt v0.11.0, gix-url v0.31.0, gix-credentials v0.29.0, gix-discover v0.40.1, gix-dir v0.14.1, gix-mailmap v0.27.1, gix-revision v0.34.1, gix-merge v0.5.1, gix-negotiate v0.20.1, gix-pack v0.59.1, gix-odb v0.69.1, gix-refspec v0.30.1, gix-shallow v0.4.0, gix-packetline v0.19.0, gix-transport v0.47.0, gix-protocol v0.50.1, gix-status v0.19.1, gix-submodule v0.19.1, gix-worktree-state v0.19.0, gix v0.72.1, gix-fsck v0.11.1, gitoxide-core v0.47.1, gitoxide v0.44.0 ([`e104545`](https://github.com/GitoxideLabs/gitoxide/commit/e104545b78951ca882481d4a58f4425a8bc81c87)) - Bump all prior pratch levels to majors ([`5f7f805`](https://github.com/GitoxideLabs/gitoxide/commit/5f7f80570e1a5522e76ea58cccbb957249a0dffe)) + - Merge pull request #1969 from GitoxideLabs/new-release ([`631f07a`](https://github.com/GitoxideLabs/gitoxide/commit/631f07ad0c1cb93d9da42cf2c8499584fe91880a))
## 0.40.0 (2025-04-25) diff --git a/gix-features/CHANGELOG.md b/gix-features/CHANGELOG.md index 2e4271a6bd0..b2002a47f86 100644 --- a/gix-features/CHANGELOG.md +++ b/gix-features/CHANGELOG.md @@ -5,13 +5,54 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## Unreleased + +### New Features (BREAKING) + + - walkdir_sorted_new adds max_depth parameter + max_depth parameter determines the maximum depth the WalkDir will + recurse into. + + Example values: + * 0 -> Returns only the root path with no children. + * 1 -> Returns the root path, with children. + * 2..n -> Returns the root path, children and {n}-grandchildren + +### Commit Statistics + + + + - 10 commits contributed to the release over the course of 79 calendar days. + - 79 days passed between releases. + - 1 commit was understood as [conventional](https://www.conventionalcommits.org). + - 0 issues like '(#ID)' were seen in commit messages + +### Commit Details + + + +
view details + + * **Uncategorized** + - Merge pull request #2061 from orthros/pseudo-refs ([`60c29a5`](https://github.com/GitoxideLabs/gitoxide/commit/60c29a59302bfc9d0be7aab5dd3ef05e4ee8e3fa)) + - Refactor ([`43f92b5`](https://github.com/GitoxideLabs/gitoxide/commit/43f92b5285af6696cd21f0e94f3bec568aef8468)) + - Walkdir_sorted_new adds max_depth parameter ([`6c77b54`](https://github.com/GitoxideLabs/gitoxide/commit/6c77b541b476656827ee0542a650b9731ba549cf)) + - Merge pull request #2070 from GitoxideLabs/dependabot/cargo/cargo-827bceb7eb ([`dab97f7`](https://github.com/GitoxideLabs/gitoxide/commit/dab97f7618f160421b6e31de8f3e2f3d11dc2ef2)) + - Bump the cargo group across 1 directory with 68 updates ([`a9a8ea1`](https://github.com/GitoxideLabs/gitoxide/commit/a9a8ea1472532dde03bce4e0afdfa82924af1f96)) + - Merge pull request #2062 from rickprice/minor_documentation_fixups ([`c2eb0c1`](https://github.com/GitoxideLabs/gitoxide/commit/c2eb0c144dd21cac87fd08829f4a5ca02f85008d)) + - Small documentation fixes ([`bfb1c34`](https://github.com/GitoxideLabs/gitoxide/commit/bfb1c34f75997a603b8f85fca75bf9e1ca310be0)) + - Merge pull request #2033 from GitoxideLabs/dependabot/cargo/cargo-b72232998d ([`f8d7c0a`](https://github.com/GitoxideLabs/gitoxide/commit/f8d7c0ad8fa7745c973c6b87e7eee70831300207)) + - Bump the cargo group with 56 updates ([`151e3a5`](https://github.com/GitoxideLabs/gitoxide/commit/151e3a5cca06444eea4c6a362649e66c831673d6)) + - Merge pull request #1971 from GitoxideLabs/new-release ([`8d4c4d1`](https://github.com/GitoxideLabs/gitoxide/commit/8d4c4d1e09f84c962c29d98a686c64228196ac13)) +
+ ## 0.42.1 (2025-04-26) ### Commit Statistics - - 1 commit contributed to the release. + - 3 commits contributed to the release. - 0 commits were understood as [conventional](https://www.conventionalcommits.org). - 0 issues like '(#ID)' were seen in commit messages @@ -22,7 +63,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
view details * **Uncategorized** + - Release gix-date v0.10.1, gix-utils v0.3.0, gix-actor v0.35.1, gix-validate v0.10.0, gix-path v0.10.17, gix-features v0.42.1, gix-hash v0.18.0, gix-hashtable v0.8.1, gix-object v0.49.1, gix-glob v0.20.0, gix-quote v0.6.0, gix-attributes v0.26.0, gix-command v0.6.0, gix-packetline-blocking v0.19.0, gix-filter v0.19.1, gix-fs v0.15.0, gix-commitgraph v0.28.0, gix-revwalk v0.20.1, gix-traverse v0.46.1, gix-worktree-stream v0.21.1, gix-archive v0.21.1, gix-tempfile v17.1.0, gix-lock v17.1.0, gix-index v0.40.0, gix-config-value v0.15.0, gix-pathspec v0.11.0, gix-ignore v0.15.0, gix-worktree v0.41.0, gix-diff v0.52.1, gix-blame v0.2.1, gix-ref v0.52.1, gix-sec v0.11.0, gix-config v0.45.1, gix-prompt v0.11.0, gix-url v0.31.0, gix-credentials v0.29.0, gix-discover v0.40.1, gix-dir v0.14.1, gix-mailmap v0.27.1, gix-revision v0.34.1, gix-merge v0.5.1, gix-negotiate v0.20.1, gix-pack v0.59.1, gix-odb v0.69.1, gix-refspec v0.30.1, gix-shallow v0.4.0, gix-packetline v0.19.0, gix-transport v0.47.0, gix-protocol v0.50.1, gix-status v0.19.1, gix-submodule v0.19.1, gix-worktree-state v0.19.0, gix v0.72.1, gix-fsck v0.11.1, gitoxide-core v0.47.1, gitoxide v0.44.0 ([`e104545`](https://github.com/GitoxideLabs/gitoxide/commit/e104545b78951ca882481d4a58f4425a8bc81c87)) - Bump all prior pratch levels to majors ([`5f7f805`](https://github.com/GitoxideLabs/gitoxide/commit/5f7f80570e1a5522e76ea58cccbb957249a0dffe)) + - Merge pull request #1969 from GitoxideLabs/new-release ([`631f07a`](https://github.com/GitoxideLabs/gitoxide/commit/631f07ad0c1cb93d9da42cf2c8499584fe91880a))
## 0.42.0 (2025-04-25) diff --git a/gix-filter/CHANGELOG.md b/gix-filter/CHANGELOG.md index 6de82166739..c7f1ef21f37 100644 --- a/gix-filter/CHANGELOG.md +++ b/gix-filter/CHANGELOG.md @@ -5,6 +5,35 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## Unreleased + +A maintenance release without user-facing changes. + +### Commit Statistics + + + + - 7 commits contributed to the release over the course of 59 calendar days. + - 59 days passed between releases. + - 0 commits were understood as [conventional](https://www.conventionalcommits.org). + - 0 issues like '(#ID)' were seen in commit messages + +### Commit Details + + + +
view details + + * **Uncategorized** + - Merge pull request #2070 from GitoxideLabs/dependabot/cargo/cargo-827bceb7eb ([`dab97f7`](https://github.com/GitoxideLabs/gitoxide/commit/dab97f7618f160421b6e31de8f3e2f3d11dc2ef2)) + - Bump the cargo group across 1 directory with 68 updates ([`a9a8ea1`](https://github.com/GitoxideLabs/gitoxide/commit/a9a8ea1472532dde03bce4e0afdfa82924af1f96)) + - Merge pull request #2062 from rickprice/minor_documentation_fixups ([`c2eb0c1`](https://github.com/GitoxideLabs/gitoxide/commit/c2eb0c144dd21cac87fd08829f4a5ca02f85008d)) + - Small documentation fixes ([`bfb1c34`](https://github.com/GitoxideLabs/gitoxide/commit/bfb1c34f75997a603b8f85fca75bf9e1ca310be0)) + - Merge pull request #2019 from GitoxideLabs/precious-opt-in ([`5f9de52`](https://github.com/GitoxideLabs/gitoxide/commit/5f9de52cf286163b503047b1ab3b51dfa093b4d4)) + - Adapt to changes in `gix-ignore` and `gix-glob`, and more. ([`4ef7806`](https://github.com/GitoxideLabs/gitoxide/commit/4ef7806e62954d069861bddb06cb8c0baf47bb69)) + - Merge pull request #2014 from GitoxideLabs/zip ([`648022b`](https://github.com/GitoxideLabs/gitoxide/commit/648022b44e12f597cae55cc45830d0a19b87eb4c)) +
+ ## 0.19.2 (2025-05-16) A maintenance release without user-facing changes. @@ -13,7 +42,7 @@ A maintenance release without user-facing changes. - - 4 commits contributed to the release over the course of 20 calendar days. + - 5 commits contributed to the release over the course of 20 calendar days. - 20 days passed between releases. - 0 commits were understood as [conventional](https://www.conventionalcommits.org). - 0 issues like '(#ID)' were seen in commit messages @@ -25,6 +54,7 @@ A maintenance release without user-facing changes.
view details * **Uncategorized** + - Release gix-glob v0.20.1, gix-attributes v0.26.1, gix-command v0.6.1, gix-filter v0.19.2, gix-worktree-stream v0.21.2, gix-archive v0.21.2 ([`f0ed2cc`](https://github.com/GitoxideLabs/gitoxide/commit/f0ed2cc0046f866e67944bff9aef0579c12d5852)) - Update changelogs prior to release ([`31b86ee`](https://github.com/GitoxideLabs/gitoxide/commit/31b86ee6774ad6762f941aa0e8377e709bd41f5e)) - Merge pull request #2009 from GitoxideLabs/release-gix-index ([`c3f06ae`](https://github.com/GitoxideLabs/gitoxide/commit/c3f06ae424ab4e1918a364cabe8276297465a73a)) - Release gix-path v0.10.18, gix-date v0.10.2, gix-traverse v0.46.2, gix-index v0.40.1 ([`d2b4c44`](https://github.com/GitoxideLabs/gitoxide/commit/d2b4c44fcb2bf43e80d67532262631a5086f08de)) diff --git a/gix-fs/CHANGELOG.md b/gix-fs/CHANGELOG.md index 8ca0c0c3c7f..015d3ce7d7d 100644 --- a/gix-fs/CHANGELOG.md +++ b/gix-fs/CHANGELOG.md @@ -5,13 +5,40 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## Unreleased + +A maintenance release without user-facing changes. + +### Commit Statistics + + + + - 5 commits contributed to the release over the course of 79 calendar days. + - 79 days passed between releases. + - 0 commits were understood as [conventional](https://www.conventionalcommits.org). + - 0 issues like '(#ID)' were seen in commit messages + +### Commit Details + + + +
view details + + * **Uncategorized** + - Merge pull request #2062 from rickprice/minor_documentation_fixups ([`c2eb0c1`](https://github.com/GitoxideLabs/gitoxide/commit/c2eb0c144dd21cac87fd08829f4a5ca02f85008d)) + - Small documentation fixes ([`bfb1c34`](https://github.com/GitoxideLabs/gitoxide/commit/bfb1c34f75997a603b8f85fca75bf9e1ca310be0)) + - Merge pull request #2033 from GitoxideLabs/dependabot/cargo/cargo-b72232998d ([`f8d7c0a`](https://github.com/GitoxideLabs/gitoxide/commit/f8d7c0ad8fa7745c973c6b87e7eee70831300207)) + - Bump the cargo group with 56 updates ([`151e3a5`](https://github.com/GitoxideLabs/gitoxide/commit/151e3a5cca06444eea4c6a362649e66c831673d6)) + - Merge pull request #1971 from GitoxideLabs/new-release ([`8d4c4d1`](https://github.com/GitoxideLabs/gitoxide/commit/8d4c4d1e09f84c962c29d98a686c64228196ac13)) +
+ ## 0.15.0 (2025-04-26) ### Commit Statistics - - 1 commit contributed to the release. + - 3 commits contributed to the release. - 0 commits were understood as [conventional](https://www.conventionalcommits.org). - 0 issues like '(#ID)' were seen in commit messages @@ -22,7 +49,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
view details * **Uncategorized** + - Release gix-date v0.10.1, gix-utils v0.3.0, gix-actor v0.35.1, gix-validate v0.10.0, gix-path v0.10.17, gix-features v0.42.1, gix-hash v0.18.0, gix-hashtable v0.8.1, gix-object v0.49.1, gix-glob v0.20.0, gix-quote v0.6.0, gix-attributes v0.26.0, gix-command v0.6.0, gix-packetline-blocking v0.19.0, gix-filter v0.19.1, gix-fs v0.15.0, gix-commitgraph v0.28.0, gix-revwalk v0.20.1, gix-traverse v0.46.1, gix-worktree-stream v0.21.1, gix-archive v0.21.1, gix-tempfile v17.1.0, gix-lock v17.1.0, gix-index v0.40.0, gix-config-value v0.15.0, gix-pathspec v0.11.0, gix-ignore v0.15.0, gix-worktree v0.41.0, gix-diff v0.52.1, gix-blame v0.2.1, gix-ref v0.52.1, gix-sec v0.11.0, gix-config v0.45.1, gix-prompt v0.11.0, gix-url v0.31.0, gix-credentials v0.29.0, gix-discover v0.40.1, gix-dir v0.14.1, gix-mailmap v0.27.1, gix-revision v0.34.1, gix-merge v0.5.1, gix-negotiate v0.20.1, gix-pack v0.59.1, gix-odb v0.69.1, gix-refspec v0.30.1, gix-shallow v0.4.0, gix-packetline v0.19.0, gix-transport v0.47.0, gix-protocol v0.50.1, gix-status v0.19.1, gix-submodule v0.19.1, gix-worktree-state v0.19.0, gix v0.72.1, gix-fsck v0.11.1, gitoxide-core v0.47.1, gitoxide v0.44.0 ([`e104545`](https://github.com/GitoxideLabs/gitoxide/commit/e104545b78951ca882481d4a58f4425a8bc81c87)) - Bump all prior pratch levels to majors ([`5f7f805`](https://github.com/GitoxideLabs/gitoxide/commit/5f7f80570e1a5522e76ea58cccbb957249a0dffe)) + - Merge pull request #1969 from GitoxideLabs/new-release ([`631f07a`](https://github.com/GitoxideLabs/gitoxide/commit/631f07ad0c1cb93d9da42cf2c8499584fe91880a))
## 0.14.1 (2025-04-25) diff --git a/gix-fsck/CHANGELOG.md b/gix-fsck/CHANGELOG.md index 31e9177e3f5..23293935944 100644 --- a/gix-fsck/CHANGELOG.md +++ b/gix-fsck/CHANGELOG.md @@ -5,13 +5,36 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## Unreleased + +A maintenance release without user-facing changes. + +### Commit Statistics + + + + - 1 commit contributed to the release over the course of 79 calendar days. + - 79 days passed between releases. + - 0 commits were understood as [conventional](https://www.conventionalcommits.org). + - 0 issues like '(#ID)' were seen in commit messages + +### Commit Details + + + +
view details + + * **Uncategorized** + - Merge pull request #1971 from GitoxideLabs/new-release ([`8d4c4d1`](https://github.com/GitoxideLabs/gitoxide/commit/8d4c4d1e09f84c962c29d98a686c64228196ac13)) +
+ ## 0.11.1 (2025-04-26) ### Commit Statistics - - 1 commit contributed to the release. + - 3 commits contributed to the release. - 0 commits were understood as [conventional](https://www.conventionalcommits.org). - 0 issues like '(#ID)' were seen in commit messages @@ -22,7 +45,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
view details * **Uncategorized** + - Release gix-date v0.10.1, gix-utils v0.3.0, gix-actor v0.35.1, gix-validate v0.10.0, gix-path v0.10.17, gix-features v0.42.1, gix-hash v0.18.0, gix-hashtable v0.8.1, gix-object v0.49.1, gix-glob v0.20.0, gix-quote v0.6.0, gix-attributes v0.26.0, gix-command v0.6.0, gix-packetline-blocking v0.19.0, gix-filter v0.19.1, gix-fs v0.15.0, gix-commitgraph v0.28.0, gix-revwalk v0.20.1, gix-traverse v0.46.1, gix-worktree-stream v0.21.1, gix-archive v0.21.1, gix-tempfile v17.1.0, gix-lock v17.1.0, gix-index v0.40.0, gix-config-value v0.15.0, gix-pathspec v0.11.0, gix-ignore v0.15.0, gix-worktree v0.41.0, gix-diff v0.52.1, gix-blame v0.2.1, gix-ref v0.52.1, gix-sec v0.11.0, gix-config v0.45.1, gix-prompt v0.11.0, gix-url v0.31.0, gix-credentials v0.29.0, gix-discover v0.40.1, gix-dir v0.14.1, gix-mailmap v0.27.1, gix-revision v0.34.1, gix-merge v0.5.1, gix-negotiate v0.20.1, gix-pack v0.59.1, gix-odb v0.69.1, gix-refspec v0.30.1, gix-shallow v0.4.0, gix-packetline v0.19.0, gix-transport v0.47.0, gix-protocol v0.50.1, gix-status v0.19.1, gix-submodule v0.19.1, gix-worktree-state v0.19.0, gix v0.72.1, gix-fsck v0.11.1, gitoxide-core v0.47.1, gitoxide v0.44.0 ([`e104545`](https://github.com/GitoxideLabs/gitoxide/commit/e104545b78951ca882481d4a58f4425a8bc81c87)) - Bump all prior pratch levels to majors ([`5f7f805`](https://github.com/GitoxideLabs/gitoxide/commit/5f7f80570e1a5522e76ea58cccbb957249a0dffe)) + - Merge pull request #1969 from GitoxideLabs/new-release ([`631f07a`](https://github.com/GitoxideLabs/gitoxide/commit/631f07ad0c1cb93d9da42cf2c8499584fe91880a))
## 0.11.0 (2025-04-25) diff --git a/gix-glob/CHANGELOG.md b/gix-glob/CHANGELOG.md index 00afacb802f..dac004ff448 100644 --- a/gix-glob/CHANGELOG.md +++ b/gix-glob/CHANGELOG.md @@ -5,6 +5,35 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## Unreleased + +### New Features (BREAKING) + + - Pattern parser in is now stateful to allow options for how to parse ignore patterns. + That way it can support settings and other state that affect parsing. + This affects various crates which are all marked as breaking now. + +### Commit Statistics + + + + - 3 commits contributed to the release over the course of 59 calendar days. + - 59 days passed between releases. + - 1 commit was understood as [conventional](https://www.conventionalcommits.org). + - 0 issues like '(#ID)' were seen in commit messages + +### Commit Details + + + +
view details + + * **Uncategorized** + - Merge pull request #2019 from GitoxideLabs/precious-opt-in ([`5f9de52`](https://github.com/GitoxideLabs/gitoxide/commit/5f9de52cf286163b503047b1ab3b51dfa093b4d4)) + - Pattern parser in is now stateful to allow options for how to parse ignore patterns. ([`828e903`](https://github.com/GitoxideLabs/gitoxide/commit/828e9035a40796f79650cf5e3becb8d8e5e29883)) + - Merge pull request #2014 from GitoxideLabs/zip ([`648022b`](https://github.com/GitoxideLabs/gitoxide/commit/648022b44e12f597cae55cc45830d0a19b87eb4c)) +
+ ## 0.20.1 (2025-05-16) A maintenance release without user-facing changes. @@ -13,7 +42,7 @@ A maintenance release without user-facing changes. - - 4 commits contributed to the release over the course of 20 calendar days. + - 5 commits contributed to the release over the course of 20 calendar days. - 20 days passed between releases. - 0 commits were understood as [conventional](https://www.conventionalcommits.org). - 0 issues like '(#ID)' were seen in commit messages @@ -25,6 +54,7 @@ A maintenance release without user-facing changes.
view details * **Uncategorized** + - Release gix-glob v0.20.1, gix-attributes v0.26.1, gix-command v0.6.1, gix-filter v0.19.2, gix-worktree-stream v0.21.2, gix-archive v0.21.2 ([`f0ed2cc`](https://github.com/GitoxideLabs/gitoxide/commit/f0ed2cc0046f866e67944bff9aef0579c12d5852)) - Update changelogs prior to release ([`31b86ee`](https://github.com/GitoxideLabs/gitoxide/commit/31b86ee6774ad6762f941aa0e8377e709bd41f5e)) - Merge pull request #2009 from GitoxideLabs/release-gix-index ([`c3f06ae`](https://github.com/GitoxideLabs/gitoxide/commit/c3f06ae424ab4e1918a364cabe8276297465a73a)) - Release gix-path v0.10.18, gix-date v0.10.2, gix-traverse v0.46.2, gix-index v0.40.1 ([`d2b4c44`](https://github.com/GitoxideLabs/gitoxide/commit/d2b4c44fcb2bf43e80d67532262631a5086f08de)) diff --git a/gix-hash/CHANGELOG.md b/gix-hash/CHANGELOG.md index 5a346786c7f..928b1f18979 100644 --- a/gix-hash/CHANGELOG.md +++ b/gix-hash/CHANGELOG.md @@ -5,13 +5,44 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## Unreleased + +### Bug Fixes + + - Actually avoid `serde` as dependency, when the serde feature is off + `faster-hex` has serde as default dependency, and was not marked with + `default-features = false`. + +### Commit Statistics + + + + - 5 commits contributed to the release over the course of 79 calendar days. + - 79 days passed between releases. + - 1 commit was understood as [conventional](https://www.conventionalcommits.org). + - 0 issues like '(#ID)' were seen in commit messages + +### Commit Details + + + +
view details + + * **Uncategorized** + - Merge pull request #2062 from rickprice/minor_documentation_fixups ([`c2eb0c1`](https://github.com/GitoxideLabs/gitoxide/commit/c2eb0c144dd21cac87fd08829f4a5ca02f85008d)) + - Small documentation fixes ([`bfb1c34`](https://github.com/GitoxideLabs/gitoxide/commit/bfb1c34f75997a603b8f85fca75bf9e1ca310be0)) + - Merge pull request #2031 from bpeetz/serde ([`874cc38`](https://github.com/GitoxideLabs/gitoxide/commit/874cc388e1e6af558e7cab4e9238f447e8c122e1)) + - Actually avoid `serde` as dependency, when the serde feature is off ([`0d67c85`](https://github.com/GitoxideLabs/gitoxide/commit/0d67c8524058a718083d31eae827f7f60332b20a)) + - Merge pull request #1971 from GitoxideLabs/new-release ([`8d4c4d1`](https://github.com/GitoxideLabs/gitoxide/commit/8d4c4d1e09f84c962c29d98a686c64228196ac13)) +
+ ## 0.18.0 (2025-04-26) ### Commit Statistics - - 1 commit contributed to the release. + - 3 commits contributed to the release. - 0 commits were understood as [conventional](https://www.conventionalcommits.org). - 0 issues like '(#ID)' were seen in commit messages @@ -22,7 +53,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
view details * **Uncategorized** + - Release gix-date v0.10.1, gix-utils v0.3.0, gix-actor v0.35.1, gix-validate v0.10.0, gix-path v0.10.17, gix-features v0.42.1, gix-hash v0.18.0, gix-hashtable v0.8.1, gix-object v0.49.1, gix-glob v0.20.0, gix-quote v0.6.0, gix-attributes v0.26.0, gix-command v0.6.0, gix-packetline-blocking v0.19.0, gix-filter v0.19.1, gix-fs v0.15.0, gix-commitgraph v0.28.0, gix-revwalk v0.20.1, gix-traverse v0.46.1, gix-worktree-stream v0.21.1, gix-archive v0.21.1, gix-tempfile v17.1.0, gix-lock v17.1.0, gix-index v0.40.0, gix-config-value v0.15.0, gix-pathspec v0.11.0, gix-ignore v0.15.0, gix-worktree v0.41.0, gix-diff v0.52.1, gix-blame v0.2.1, gix-ref v0.52.1, gix-sec v0.11.0, gix-config v0.45.1, gix-prompt v0.11.0, gix-url v0.31.0, gix-credentials v0.29.0, gix-discover v0.40.1, gix-dir v0.14.1, gix-mailmap v0.27.1, gix-revision v0.34.1, gix-merge v0.5.1, gix-negotiate v0.20.1, gix-pack v0.59.1, gix-odb v0.69.1, gix-refspec v0.30.1, gix-shallow v0.4.0, gix-packetline v0.19.0, gix-transport v0.47.0, gix-protocol v0.50.1, gix-status v0.19.1, gix-submodule v0.19.1, gix-worktree-state v0.19.0, gix v0.72.1, gix-fsck v0.11.1, gitoxide-core v0.47.1, gitoxide v0.44.0 ([`e104545`](https://github.com/GitoxideLabs/gitoxide/commit/e104545b78951ca882481d4a58f4425a8bc81c87)) - Bump all prior pratch levels to majors ([`5f7f805`](https://github.com/GitoxideLabs/gitoxide/commit/5f7f80570e1a5522e76ea58cccbb957249a0dffe)) + - Merge pull request #1969 from GitoxideLabs/new-release ([`631f07a`](https://github.com/GitoxideLabs/gitoxide/commit/631f07ad0c1cb93d9da42cf2c8499584fe91880a))
## 0.17.1 (2025-04-25) diff --git a/gix-hashtable/CHANGELOG.md b/gix-hashtable/CHANGELOG.md index d30a85bd07f..3a917cbad0a 100644 --- a/gix-hashtable/CHANGELOG.md +++ b/gix-hashtable/CHANGELOG.md @@ -5,13 +5,43 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## Unreleased + +### Chore (BREAKING) + + - Update hashbrown to the latest version + This updates re-exports, removing `raw` and adding `hash_table`. + +### Commit Statistics + + + + - 5 commits contributed to the release over the course of 79 calendar days. + - 79 days passed between releases. + - 1 commit was understood as [conventional](https://www.conventionalcommits.org). + - 0 issues like '(#ID)' were seen in commit messages + +### Commit Details + + + +
view details + + * **Uncategorized** + - Merge pull request #2047 from blinxen/update-hashbrown ([`00bd1fa`](https://github.com/GitoxideLabs/gitoxide/commit/00bd1fac8753a98fd0d4cdd8cf239b34e62b7d80)) + - Update hashbrown to the latest version ([`c1d0868`](https://github.com/GitoxideLabs/gitoxide/commit/c1d0868c331c2f8ca8b22d22ff68744926a907b3)) + - Merge pull request #2033 from GitoxideLabs/dependabot/cargo/cargo-b72232998d ([`f8d7c0a`](https://github.com/GitoxideLabs/gitoxide/commit/f8d7c0ad8fa7745c973c6b87e7eee70831300207)) + - Bump the cargo group with 56 updates ([`151e3a5`](https://github.com/GitoxideLabs/gitoxide/commit/151e3a5cca06444eea4c6a362649e66c831673d6)) + - Merge pull request #1971 from GitoxideLabs/new-release ([`8d4c4d1`](https://github.com/GitoxideLabs/gitoxide/commit/8d4c4d1e09f84c962c29d98a686c64228196ac13)) +
+ ## 0.8.1 (2025-04-26) ### Commit Statistics - - 2 commits contributed to the release. + - 3 commits contributed to the release. - 0 commits were understood as [conventional](https://www.conventionalcommits.org). - 0 issues like '(#ID)' were seen in commit messages @@ -22,6 +52,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
view details * **Uncategorized** + - Release gix-date v0.10.1, gix-utils v0.3.0, gix-actor v0.35.1, gix-validate v0.10.0, gix-path v0.10.17, gix-features v0.42.1, gix-hash v0.18.0, gix-hashtable v0.8.1, gix-object v0.49.1, gix-glob v0.20.0, gix-quote v0.6.0, gix-attributes v0.26.0, gix-command v0.6.0, gix-packetline-blocking v0.19.0, gix-filter v0.19.1, gix-fs v0.15.0, gix-commitgraph v0.28.0, gix-revwalk v0.20.1, gix-traverse v0.46.1, gix-worktree-stream v0.21.1, gix-archive v0.21.1, gix-tempfile v17.1.0, gix-lock v17.1.0, gix-index v0.40.0, gix-config-value v0.15.0, gix-pathspec v0.11.0, gix-ignore v0.15.0, gix-worktree v0.41.0, gix-diff v0.52.1, gix-blame v0.2.1, gix-ref v0.52.1, gix-sec v0.11.0, gix-config v0.45.1, gix-prompt v0.11.0, gix-url v0.31.0, gix-credentials v0.29.0, gix-discover v0.40.1, gix-dir v0.14.1, gix-mailmap v0.27.1, gix-revision v0.34.1, gix-merge v0.5.1, gix-negotiate v0.20.1, gix-pack v0.59.1, gix-odb v0.69.1, gix-refspec v0.30.1, gix-shallow v0.4.0, gix-packetline v0.19.0, gix-transport v0.47.0, gix-protocol v0.50.1, gix-status v0.19.1, gix-submodule v0.19.1, gix-worktree-state v0.19.0, gix v0.72.1, gix-fsck v0.11.1, gitoxide-core v0.47.1, gitoxide v0.44.0 ([`e104545`](https://github.com/GitoxideLabs/gitoxide/commit/e104545b78951ca882481d4a58f4425a8bc81c87)) - Bump all prior pratch levels to majors ([`5f7f805`](https://github.com/GitoxideLabs/gitoxide/commit/5f7f80570e1a5522e76ea58cccbb957249a0dffe)) - Merge pull request #1919 from GitoxideLabs/release ([`420e730`](https://github.com/GitoxideLabs/gitoxide/commit/420e730f765b91e1d17daca6bb1f99bdb2e54fda))
diff --git a/gix-ignore/CHANGELOG.md b/gix-ignore/CHANGELOG.md index 572e9130d04..daf8dcca5fb 100644 --- a/gix-ignore/CHANGELOG.md +++ b/gix-ignore/CHANGELOG.md @@ -5,13 +5,46 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## Unreleased + +### New Features (BREAKING) + + - Pattern parser in is now stateful to allow options for how to parse ignore patterns. + That way it can support settings and other state that affect parsing. + This affects various crates which are all marked as breaking now. + +### Commit Statistics + + + + - 7 commits contributed to the release over the course of 79 calendar days. + - 79 days passed between releases. + - 1 commit was understood as [conventional](https://www.conventionalcommits.org). + - 0 issues like '(#ID)' were seen in commit messages + +### Commit Details + + + +
view details + + * **Uncategorized** + - Merge pull request #2019 from GitoxideLabs/precious-opt-in ([`5f9de52`](https://github.com/GitoxideLabs/gitoxide/commit/5f9de52cf286163b503047b1ab3b51dfa093b4d4)) + - Pattern parser in is now stateful to allow options for how to parse ignore patterns. ([`828e903`](https://github.com/GitoxideLabs/gitoxide/commit/828e9035a40796f79650cf5e3becb8d8e5e29883)) + - Merge pull request #2014 from GitoxideLabs/zip ([`648022b`](https://github.com/GitoxideLabs/gitoxide/commit/648022b44e12f597cae55cc45830d0a19b87eb4c)) + - Release gix-glob v0.20.1, gix-attributes v0.26.1, gix-command v0.6.1, gix-filter v0.19.2, gix-worktree-stream v0.21.2, gix-archive v0.21.2 ([`f0ed2cc`](https://github.com/GitoxideLabs/gitoxide/commit/f0ed2cc0046f866e67944bff9aef0579c12d5852)) + - Merge pull request #2009 from GitoxideLabs/release-gix-index ([`c3f06ae`](https://github.com/GitoxideLabs/gitoxide/commit/c3f06ae424ab4e1918a364cabe8276297465a73a)) + - Release gix-path v0.10.18, gix-date v0.10.2, gix-traverse v0.46.2, gix-index v0.40.1 ([`d2b4c44`](https://github.com/GitoxideLabs/gitoxide/commit/d2b4c44fcb2bf43e80d67532262631a5086f08de)) + - Merge pull request #1971 from GitoxideLabs/new-release ([`8d4c4d1`](https://github.com/GitoxideLabs/gitoxide/commit/8d4c4d1e09f84c962c29d98a686c64228196ac13)) +
+ ## 0.15.0 (2025-04-26) ### Commit Statistics - - 1 commit contributed to the release. + - 3 commits contributed to the release. - 0 commits were understood as [conventional](https://www.conventionalcommits.org). - 0 issues like '(#ID)' were seen in commit messages @@ -22,7 +55,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
view details * **Uncategorized** + - Release gix-date v0.10.1, gix-utils v0.3.0, gix-actor v0.35.1, gix-validate v0.10.0, gix-path v0.10.17, gix-features v0.42.1, gix-hash v0.18.0, gix-hashtable v0.8.1, gix-object v0.49.1, gix-glob v0.20.0, gix-quote v0.6.0, gix-attributes v0.26.0, gix-command v0.6.0, gix-packetline-blocking v0.19.0, gix-filter v0.19.1, gix-fs v0.15.0, gix-commitgraph v0.28.0, gix-revwalk v0.20.1, gix-traverse v0.46.1, gix-worktree-stream v0.21.1, gix-archive v0.21.1, gix-tempfile v17.1.0, gix-lock v17.1.0, gix-index v0.40.0, gix-config-value v0.15.0, gix-pathspec v0.11.0, gix-ignore v0.15.0, gix-worktree v0.41.0, gix-diff v0.52.1, gix-blame v0.2.1, gix-ref v0.52.1, gix-sec v0.11.0, gix-config v0.45.1, gix-prompt v0.11.0, gix-url v0.31.0, gix-credentials v0.29.0, gix-discover v0.40.1, gix-dir v0.14.1, gix-mailmap v0.27.1, gix-revision v0.34.1, gix-merge v0.5.1, gix-negotiate v0.20.1, gix-pack v0.59.1, gix-odb v0.69.1, gix-refspec v0.30.1, gix-shallow v0.4.0, gix-packetline v0.19.0, gix-transport v0.47.0, gix-protocol v0.50.1, gix-status v0.19.1, gix-submodule v0.19.1, gix-worktree-state v0.19.0, gix v0.72.1, gix-fsck v0.11.1, gitoxide-core v0.47.1, gitoxide v0.44.0 ([`e104545`](https://github.com/GitoxideLabs/gitoxide/commit/e104545b78951ca882481d4a58f4425a8bc81c87)) - Bump all prior pratch levels to majors ([`5f7f805`](https://github.com/GitoxideLabs/gitoxide/commit/5f7f80570e1a5522e76ea58cccbb957249a0dffe)) + - Merge pull request #1969 from GitoxideLabs/new-release ([`631f07a`](https://github.com/GitoxideLabs/gitoxide/commit/631f07ad0c1cb93d9da42cf2c8499584fe91880a))
## 0.14.1 (2025-04-25) diff --git a/gix-index/CHANGELOG.md b/gix-index/CHANGELOG.md index b376b35a52c..23830871d2b 100644 --- a/gix-index/CHANGELOG.md +++ b/gix-index/CHANGELOG.md @@ -5,6 +5,37 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## Unreleased + +### Bug Fixes + + - Prefer the actual state over following `core.symlinks` in `entry::Mode` + +### Commit Statistics + + + + - 7 commits contributed to the release over the course of 65 calendar days. + - 65 days passed between releases. + - 1 commit was understood as [conventional](https://www.conventionalcommits.org). + - 0 issues like '(#ID)' were seen in commit messages + +### Commit Details + + + +
view details + + * **Uncategorized** + - Merge pull request #2070 from GitoxideLabs/dependabot/cargo/cargo-827bceb7eb ([`dab97f7`](https://github.com/GitoxideLabs/gitoxide/commit/dab97f7618f160421b6e31de8f3e2f3d11dc2ef2)) + - Bump the cargo group across 1 directory with 68 updates ([`a9a8ea1`](https://github.com/GitoxideLabs/gitoxide/commit/a9a8ea1472532dde03bce4e0afdfa82924af1f96)) + - Merge pull request #2047 from blinxen/update-hashbrown ([`00bd1fa`](https://github.com/GitoxideLabs/gitoxide/commit/00bd1fac8753a98fd0d4cdd8cf239b34e62b7d80)) + - Update `hashbrown` to 0.15. ([`6f569ce`](https://github.com/GitoxideLabs/gitoxide/commit/6f569cea08297501f332f4d7114065df38fa98f7)) + - Merge pull request #2016 from GitoxideLabs/improvements ([`7ae3797`](https://github.com/GitoxideLabs/gitoxide/commit/7ae3797f19cf2dd3bc3e02a6437643e5f50ed338)) + - Prefer the actual state over following `core.symlinks` in `entry::Mode` ([`c85b92d`](https://github.com/GitoxideLabs/gitoxide/commit/c85b92d991a91bb1044fe5f784524f568e72c45b)) + - Merge pull request #2009 from GitoxideLabs/release-gix-index ([`c3f06ae`](https://github.com/GitoxideLabs/gitoxide/commit/c3f06ae424ab4e1918a364cabe8276297465a73a)) +
+ ## 0.40.1 (2025-05-10) ### Bug Fixes @@ -15,7 +46,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - - 6 commits contributed to the release over the course of 14 calendar days. + - 7 commits contributed to the release over the course of 14 calendar days. - 14 days passed between releases. - 1 commit was understood as [conventional](https://www.conventionalcommits.org). - 0 issues like '(#ID)' were seen in commit messages @@ -27,6 +58,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
view details * **Uncategorized** + - Release gix-path v0.10.18, gix-date v0.10.2, gix-traverse v0.46.2, gix-index v0.40.1 ([`d2b4c44`](https://github.com/GitoxideLabs/gitoxide/commit/d2b4c44fcb2bf43e80d67532262631a5086f08de)) - Prepare changelogs prior to release of `gix-index` ([`bfc4880`](https://github.com/GitoxideLabs/gitoxide/commit/bfc48801bf3ed39cdf7ec02e01aa3cfb6181705f)) - Merge pull request #2005 from 0-wiz-0/main ([`33c4d6b`](https://github.com/GitoxideLabs/gitoxide/commit/33c4d6b6656c994ed090f2fddd70e014401baf30)) - Fix build on NetBSD ([`00e8934`](https://github.com/GitoxideLabs/gitoxide/commit/00e89341cd89f58d031eee8a4e60f6ebdcd53185)) diff --git a/gix-lock/CHANGELOG.md b/gix-lock/CHANGELOG.md index 5ea7ff4cbc8..5ca950e6aba 100644 --- a/gix-lock/CHANGELOG.md +++ b/gix-lock/CHANGELOG.md @@ -5,13 +5,38 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## Unreleased + +A maintenance release without user-facing changes. + +### Commit Statistics + + + + - 3 commits contributed to the release over the course of 79 calendar days. + - 79 days passed between releases. + - 0 commits were understood as [conventional](https://www.conventionalcommits.org). + - 0 issues like '(#ID)' were seen in commit messages + +### Commit Details + + + +
view details + + * **Uncategorized** + - Merge pull request #2033 from GitoxideLabs/dependabot/cargo/cargo-b72232998d ([`f8d7c0a`](https://github.com/GitoxideLabs/gitoxide/commit/f8d7c0ad8fa7745c973c6b87e7eee70831300207)) + - Bump the cargo group with 56 updates ([`151e3a5`](https://github.com/GitoxideLabs/gitoxide/commit/151e3a5cca06444eea4c6a362649e66c831673d6)) + - Merge pull request #1971 from GitoxideLabs/new-release ([`8d4c4d1`](https://github.com/GitoxideLabs/gitoxide/commit/8d4c4d1e09f84c962c29d98a686c64228196ac13)) +
+ ## 17.1.0 (2025-04-26) ### Commit Statistics - - 1 commit contributed to the release. + - 3 commits contributed to the release. - 0 commits were understood as [conventional](https://www.conventionalcommits.org). - 0 issues like '(#ID)' were seen in commit messages @@ -22,7 +47,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
view details * **Uncategorized** + - Release gix-date v0.10.1, gix-utils v0.3.0, gix-actor v0.35.1, gix-validate v0.10.0, gix-path v0.10.17, gix-features v0.42.1, gix-hash v0.18.0, gix-hashtable v0.8.1, gix-object v0.49.1, gix-glob v0.20.0, gix-quote v0.6.0, gix-attributes v0.26.0, gix-command v0.6.0, gix-packetline-blocking v0.19.0, gix-filter v0.19.1, gix-fs v0.15.0, gix-commitgraph v0.28.0, gix-revwalk v0.20.1, gix-traverse v0.46.1, gix-worktree-stream v0.21.1, gix-archive v0.21.1, gix-tempfile v17.1.0, gix-lock v17.1.0, gix-index v0.40.0, gix-config-value v0.15.0, gix-pathspec v0.11.0, gix-ignore v0.15.0, gix-worktree v0.41.0, gix-diff v0.52.1, gix-blame v0.2.1, gix-ref v0.52.1, gix-sec v0.11.0, gix-config v0.45.1, gix-prompt v0.11.0, gix-url v0.31.0, gix-credentials v0.29.0, gix-discover v0.40.1, gix-dir v0.14.1, gix-mailmap v0.27.1, gix-revision v0.34.1, gix-merge v0.5.1, gix-negotiate v0.20.1, gix-pack v0.59.1, gix-odb v0.69.1, gix-refspec v0.30.1, gix-shallow v0.4.0, gix-packetline v0.19.0, gix-transport v0.47.0, gix-protocol v0.50.1, gix-status v0.19.1, gix-submodule v0.19.1, gix-worktree-state v0.19.0, gix v0.72.1, gix-fsck v0.11.1, gitoxide-core v0.47.1, gitoxide v0.44.0 ([`e104545`](https://github.com/GitoxideLabs/gitoxide/commit/e104545b78951ca882481d4a58f4425a8bc81c87)) - Bump all prior pratch levels to majors ([`5f7f805`](https://github.com/GitoxideLabs/gitoxide/commit/5f7f80570e1a5522e76ea58cccbb957249a0dffe)) + - Merge pull request #1969 from GitoxideLabs/new-release ([`631f07a`](https://github.com/GitoxideLabs/gitoxide/commit/631f07ad0c1cb93d9da42cf2c8499584fe91880a))
## 17.0.1 (2025-04-25) diff --git a/gix-mailmap/CHANGELOG.md b/gix-mailmap/CHANGELOG.md index 0a5d89cbd2b..c22ed8c3a08 100644 --- a/gix-mailmap/CHANGELOG.md +++ b/gix-mailmap/CHANGELOG.md @@ -5,13 +5,38 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## Unreleased + +A maintenance release without user-facing changes. + +### Commit Statistics + + + + - 3 commits contributed to the release over the course of 79 calendar days. + - 79 days passed between releases. + - 0 commits were understood as [conventional](https://www.conventionalcommits.org). + - 0 issues like '(#ID)' were seen in commit messages + +### Commit Details + + + +
view details + + * **Uncategorized** + - Merge pull request #2009 from GitoxideLabs/release-gix-index ([`c3f06ae`](https://github.com/GitoxideLabs/gitoxide/commit/c3f06ae424ab4e1918a364cabe8276297465a73a)) + - Release gix-path v0.10.18, gix-date v0.10.2, gix-traverse v0.46.2, gix-index v0.40.1 ([`d2b4c44`](https://github.com/GitoxideLabs/gitoxide/commit/d2b4c44fcb2bf43e80d67532262631a5086f08de)) + - Merge pull request #1971 from GitoxideLabs/new-release ([`8d4c4d1`](https://github.com/GitoxideLabs/gitoxide/commit/8d4c4d1e09f84c962c29d98a686c64228196ac13)) +
+ ## 0.27.1 (2025-04-26) ### Commit Statistics - - 1 commit contributed to the release. + - 3 commits contributed to the release. - 0 commits were understood as [conventional](https://www.conventionalcommits.org). - 0 issues like '(#ID)' were seen in commit messages @@ -22,7 +47,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
view details * **Uncategorized** + - Release gix-date v0.10.1, gix-utils v0.3.0, gix-actor v0.35.1, gix-validate v0.10.0, gix-path v0.10.17, gix-features v0.42.1, gix-hash v0.18.0, gix-hashtable v0.8.1, gix-object v0.49.1, gix-glob v0.20.0, gix-quote v0.6.0, gix-attributes v0.26.0, gix-command v0.6.0, gix-packetline-blocking v0.19.0, gix-filter v0.19.1, gix-fs v0.15.0, gix-commitgraph v0.28.0, gix-revwalk v0.20.1, gix-traverse v0.46.1, gix-worktree-stream v0.21.1, gix-archive v0.21.1, gix-tempfile v17.1.0, gix-lock v17.1.0, gix-index v0.40.0, gix-config-value v0.15.0, gix-pathspec v0.11.0, gix-ignore v0.15.0, gix-worktree v0.41.0, gix-diff v0.52.1, gix-blame v0.2.1, gix-ref v0.52.1, gix-sec v0.11.0, gix-config v0.45.1, gix-prompt v0.11.0, gix-url v0.31.0, gix-credentials v0.29.0, gix-discover v0.40.1, gix-dir v0.14.1, gix-mailmap v0.27.1, gix-revision v0.34.1, gix-merge v0.5.1, gix-negotiate v0.20.1, gix-pack v0.59.1, gix-odb v0.69.1, gix-refspec v0.30.1, gix-shallow v0.4.0, gix-packetline v0.19.0, gix-transport v0.47.0, gix-protocol v0.50.1, gix-status v0.19.1, gix-submodule v0.19.1, gix-worktree-state v0.19.0, gix v0.72.1, gix-fsck v0.11.1, gitoxide-core v0.47.1, gitoxide v0.44.0 ([`e104545`](https://github.com/GitoxideLabs/gitoxide/commit/e104545b78951ca882481d4a58f4425a8bc81c87)) - Bump all prior pratch levels to majors ([`5f7f805`](https://github.com/GitoxideLabs/gitoxide/commit/5f7f80570e1a5522e76ea58cccbb957249a0dffe)) + - Merge pull request #1969 from GitoxideLabs/new-release ([`631f07a`](https://github.com/GitoxideLabs/gitoxide/commit/631f07ad0c1cb93d9da42cf2c8499584fe91880a))
## 0.27.0 (2025-04-25) diff --git a/gix-merge/CHANGELOG.md b/gix-merge/CHANGELOG.md index 1c353c70069..b482813c44b 100644 --- a/gix-merge/CHANGELOG.md +++ b/gix-merge/CHANGELOG.md @@ -5,13 +5,42 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## Unreleased + +A maintenance release without user-facing changes. + +### Commit Statistics + + + + - 7 commits contributed to the release over the course of 79 calendar days. + - 79 days passed between releases. + - 0 commits were understood as [conventional](https://www.conventionalcommits.org). + - 0 issues like '(#ID)' were seen in commit messages + +### Commit Details + + + +
view details + + * **Uncategorized** + - Merge pull request #2011 from blinxen/main ([`fd49eee`](https://github.com/GitoxideLabs/gitoxide/commit/fd49eeeb850ea3c3956ca15be2bf4e04a3d319ad)) + - Update `imara-diff` to the latest version. ([`732adb8`](https://github.com/GitoxideLabs/gitoxide/commit/732adb87c90283bd8f8fce6d633eacc25e10b353)) + - Merge pull request #2014 from GitoxideLabs/zip ([`648022b`](https://github.com/GitoxideLabs/gitoxide/commit/648022b44e12f597cae55cc45830d0a19b87eb4c)) + - Release gix-glob v0.20.1, gix-attributes v0.26.1, gix-command v0.6.1, gix-filter v0.19.2, gix-worktree-stream v0.21.2, gix-archive v0.21.2 ([`f0ed2cc`](https://github.com/GitoxideLabs/gitoxide/commit/f0ed2cc0046f866e67944bff9aef0579c12d5852)) + - Merge pull request #2009 from GitoxideLabs/release-gix-index ([`c3f06ae`](https://github.com/GitoxideLabs/gitoxide/commit/c3f06ae424ab4e1918a364cabe8276297465a73a)) + - Release gix-path v0.10.18, gix-date v0.10.2, gix-traverse v0.46.2, gix-index v0.40.1 ([`d2b4c44`](https://github.com/GitoxideLabs/gitoxide/commit/d2b4c44fcb2bf43e80d67532262631a5086f08de)) + - Merge pull request #1971 from GitoxideLabs/new-release ([`8d4c4d1`](https://github.com/GitoxideLabs/gitoxide/commit/8d4c4d1e09f84c962c29d98a686c64228196ac13)) +
+ ## 0.5.1 (2025-04-26) ### Commit Statistics - - 1 commit contributed to the release. + - 3 commits contributed to the release. - 0 commits were understood as [conventional](https://www.conventionalcommits.org). - 0 issues like '(#ID)' were seen in commit messages @@ -22,7 +51,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
view details * **Uncategorized** + - Release gix-date v0.10.1, gix-utils v0.3.0, gix-actor v0.35.1, gix-validate v0.10.0, gix-path v0.10.17, gix-features v0.42.1, gix-hash v0.18.0, gix-hashtable v0.8.1, gix-object v0.49.1, gix-glob v0.20.0, gix-quote v0.6.0, gix-attributes v0.26.0, gix-command v0.6.0, gix-packetline-blocking v0.19.0, gix-filter v0.19.1, gix-fs v0.15.0, gix-commitgraph v0.28.0, gix-revwalk v0.20.1, gix-traverse v0.46.1, gix-worktree-stream v0.21.1, gix-archive v0.21.1, gix-tempfile v17.1.0, gix-lock v17.1.0, gix-index v0.40.0, gix-config-value v0.15.0, gix-pathspec v0.11.0, gix-ignore v0.15.0, gix-worktree v0.41.0, gix-diff v0.52.1, gix-blame v0.2.1, gix-ref v0.52.1, gix-sec v0.11.0, gix-config v0.45.1, gix-prompt v0.11.0, gix-url v0.31.0, gix-credentials v0.29.0, gix-discover v0.40.1, gix-dir v0.14.1, gix-mailmap v0.27.1, gix-revision v0.34.1, gix-merge v0.5.1, gix-negotiate v0.20.1, gix-pack v0.59.1, gix-odb v0.69.1, gix-refspec v0.30.1, gix-shallow v0.4.0, gix-packetline v0.19.0, gix-transport v0.47.0, gix-protocol v0.50.1, gix-status v0.19.1, gix-submodule v0.19.1, gix-worktree-state v0.19.0, gix v0.72.1, gix-fsck v0.11.1, gitoxide-core v0.47.1, gitoxide v0.44.0 ([`e104545`](https://github.com/GitoxideLabs/gitoxide/commit/e104545b78951ca882481d4a58f4425a8bc81c87)) - Bump all prior pratch levels to majors ([`5f7f805`](https://github.com/GitoxideLabs/gitoxide/commit/5f7f80570e1a5522e76ea58cccbb957249a0dffe)) + - Merge pull request #1969 from GitoxideLabs/new-release ([`631f07a`](https://github.com/GitoxideLabs/gitoxide/commit/631f07ad0c1cb93d9da42cf2c8499584fe91880a))
## 0.5.0 (2025-04-25) diff --git a/gix-negotiate/CHANGELOG.md b/gix-negotiate/CHANGELOG.md index 4f0f5e450e3..725ca1fd899 100644 --- a/gix-negotiate/CHANGELOG.md +++ b/gix-negotiate/CHANGELOG.md @@ -5,13 +5,40 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## Unreleased + +A maintenance release without user-facing changes. + +### Commit Statistics + + + + - 5 commits contributed to the release over the course of 79 calendar days. + - 79 days passed between releases. + - 0 commits were understood as [conventional](https://www.conventionalcommits.org). + - 0 issues like '(#ID)' were seen in commit messages + +### Commit Details + + + +
view details + + * **Uncategorized** + - Merge pull request #2070 from GitoxideLabs/dependabot/cargo/cargo-827bceb7eb ([`dab97f7`](https://github.com/GitoxideLabs/gitoxide/commit/dab97f7618f160421b6e31de8f3e2f3d11dc2ef2)) + - Bump the cargo group across 1 directory with 68 updates ([`a9a8ea1`](https://github.com/GitoxideLabs/gitoxide/commit/a9a8ea1472532dde03bce4e0afdfa82924af1f96)) + - Merge pull request #2009 from GitoxideLabs/release-gix-index ([`c3f06ae`](https://github.com/GitoxideLabs/gitoxide/commit/c3f06ae424ab4e1918a364cabe8276297465a73a)) + - Release gix-path v0.10.18, gix-date v0.10.2, gix-traverse v0.46.2, gix-index v0.40.1 ([`d2b4c44`](https://github.com/GitoxideLabs/gitoxide/commit/d2b4c44fcb2bf43e80d67532262631a5086f08de)) + - Merge pull request #1971 from GitoxideLabs/new-release ([`8d4c4d1`](https://github.com/GitoxideLabs/gitoxide/commit/8d4c4d1e09f84c962c29d98a686c64228196ac13)) +
+ ## 0.20.1 (2025-04-26) ### Commit Statistics - - 1 commit contributed to the release. + - 3 commits contributed to the release. - 0 commits were understood as [conventional](https://www.conventionalcommits.org). - 0 issues like '(#ID)' were seen in commit messages @@ -22,7 +49,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
view details * **Uncategorized** + - Release gix-date v0.10.1, gix-utils v0.3.0, gix-actor v0.35.1, gix-validate v0.10.0, gix-path v0.10.17, gix-features v0.42.1, gix-hash v0.18.0, gix-hashtable v0.8.1, gix-object v0.49.1, gix-glob v0.20.0, gix-quote v0.6.0, gix-attributes v0.26.0, gix-command v0.6.0, gix-packetline-blocking v0.19.0, gix-filter v0.19.1, gix-fs v0.15.0, gix-commitgraph v0.28.0, gix-revwalk v0.20.1, gix-traverse v0.46.1, gix-worktree-stream v0.21.1, gix-archive v0.21.1, gix-tempfile v17.1.0, gix-lock v17.1.0, gix-index v0.40.0, gix-config-value v0.15.0, gix-pathspec v0.11.0, gix-ignore v0.15.0, gix-worktree v0.41.0, gix-diff v0.52.1, gix-blame v0.2.1, gix-ref v0.52.1, gix-sec v0.11.0, gix-config v0.45.1, gix-prompt v0.11.0, gix-url v0.31.0, gix-credentials v0.29.0, gix-discover v0.40.1, gix-dir v0.14.1, gix-mailmap v0.27.1, gix-revision v0.34.1, gix-merge v0.5.1, gix-negotiate v0.20.1, gix-pack v0.59.1, gix-odb v0.69.1, gix-refspec v0.30.1, gix-shallow v0.4.0, gix-packetline v0.19.0, gix-transport v0.47.0, gix-protocol v0.50.1, gix-status v0.19.1, gix-submodule v0.19.1, gix-worktree-state v0.19.0, gix v0.72.1, gix-fsck v0.11.1, gitoxide-core v0.47.1, gitoxide v0.44.0 ([`e104545`](https://github.com/GitoxideLabs/gitoxide/commit/e104545b78951ca882481d4a58f4425a8bc81c87)) - Bump all prior pratch levels to majors ([`5f7f805`](https://github.com/GitoxideLabs/gitoxide/commit/5f7f80570e1a5522e76ea58cccbb957249a0dffe)) + - Merge pull request #1969 from GitoxideLabs/new-release ([`631f07a`](https://github.com/GitoxideLabs/gitoxide/commit/631f07ad0c1cb93d9da42cf2c8499584fe91880a))
## 0.20.0 (2025-04-25) diff --git a/gix-object/CHANGELOG.md b/gix-object/CHANGELOG.md index 8bad4ca0de1..45a29823d15 100644 --- a/gix-object/CHANGELOG.md +++ b/gix-object/CHANGELOG.md @@ -5,13 +5,48 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## Unreleased + +### New Features + + - add convenience methods for common Git trailers + +### Commit Statistics + + + + - 11 commits contributed to the release over the course of 79 calendar days. + - 79 days passed between releases. + - 1 commit was understood as [conventional](https://www.conventionalcommits.org). + - 0 issues like '(#ID)' were seen in commit messages + +### Commit Details + + + +
view details + + * **Uncategorized** + - Merge pull request #2070 from GitoxideLabs/dependabot/cargo/cargo-827bceb7eb ([`dab97f7`](https://github.com/GitoxideLabs/gitoxide/commit/dab97f7618f160421b6e31de8f3e2f3d11dc2ef2)) + - Bump the cargo group across 1 directory with 68 updates ([`a9a8ea1`](https://github.com/GitoxideLabs/gitoxide/commit/a9a8ea1472532dde03bce4e0afdfa82924af1f96)) + - Merge pull request #2062 from rickprice/minor_documentation_fixups ([`c2eb0c1`](https://github.com/GitoxideLabs/gitoxide/commit/c2eb0c144dd21cac87fd08829f4a5ca02f85008d)) + - Small documentation fixes ([`bfb1c34`](https://github.com/GitoxideLabs/gitoxide/commit/bfb1c34f75997a603b8f85fca75bf9e1ca310be0)) + - Merge pull request #2033 from GitoxideLabs/dependabot/cargo/cargo-b72232998d ([`f8d7c0a`](https://github.com/GitoxideLabs/gitoxide/commit/f8d7c0ad8fa7745c973c6b87e7eee70831300207)) + - Adapt `gix-config`/`gix-object` benches to changes in `criterion` ([`91aef25`](https://github.com/GitoxideLabs/gitoxide/commit/91aef25a9febd440a8c14ce9d73716b5b1de6257)) + - Bump the cargo group with 56 updates ([`151e3a5`](https://github.com/GitoxideLabs/gitoxide/commit/151e3a5cca06444eea4c6a362649e66c831673d6)) + - Merge pull request #2030 from ralphmodales/trailer-conviences ([`3820a0f`](https://github.com/GitoxideLabs/gitoxide/commit/3820a0ff32cc543a5f389a20e2bc1c6efd1cd009)) + - Refactor ([`6c6dfd0`](https://github.com/GitoxideLabs/gitoxide/commit/6c6dfd0204b65a03bbe464c312d7decce78e7c98)) + - Add convenience methods for common Git trailers ([`c9a312e`](https://github.com/GitoxideLabs/gitoxide/commit/c9a312edce09f968ece7ed51a4cf68fdcab43e8a)) + - Merge pull request #1971 from GitoxideLabs/new-release ([`8d4c4d1`](https://github.com/GitoxideLabs/gitoxide/commit/8d4c4d1e09f84c962c29d98a686c64228196ac13)) +
+ ## 0.49.1 (2025-04-26) ### Commit Statistics - - 1 commit contributed to the release. + - 3 commits contributed to the release. - 0 commits were understood as [conventional](https://www.conventionalcommits.org). - 0 issues like '(#ID)' were seen in commit messages @@ -22,7 +57,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
view details * **Uncategorized** + - Release gix-date v0.10.1, gix-utils v0.3.0, gix-actor v0.35.1, gix-validate v0.10.0, gix-path v0.10.17, gix-features v0.42.1, gix-hash v0.18.0, gix-hashtable v0.8.1, gix-object v0.49.1, gix-glob v0.20.0, gix-quote v0.6.0, gix-attributes v0.26.0, gix-command v0.6.0, gix-packetline-blocking v0.19.0, gix-filter v0.19.1, gix-fs v0.15.0, gix-commitgraph v0.28.0, gix-revwalk v0.20.1, gix-traverse v0.46.1, gix-worktree-stream v0.21.1, gix-archive v0.21.1, gix-tempfile v17.1.0, gix-lock v17.1.0, gix-index v0.40.0, gix-config-value v0.15.0, gix-pathspec v0.11.0, gix-ignore v0.15.0, gix-worktree v0.41.0, gix-diff v0.52.1, gix-blame v0.2.1, gix-ref v0.52.1, gix-sec v0.11.0, gix-config v0.45.1, gix-prompt v0.11.0, gix-url v0.31.0, gix-credentials v0.29.0, gix-discover v0.40.1, gix-dir v0.14.1, gix-mailmap v0.27.1, gix-revision v0.34.1, gix-merge v0.5.1, gix-negotiate v0.20.1, gix-pack v0.59.1, gix-odb v0.69.1, gix-refspec v0.30.1, gix-shallow v0.4.0, gix-packetline v0.19.0, gix-transport v0.47.0, gix-protocol v0.50.1, gix-status v0.19.1, gix-submodule v0.19.1, gix-worktree-state v0.19.0, gix v0.72.1, gix-fsck v0.11.1, gitoxide-core v0.47.1, gitoxide v0.44.0 ([`e104545`](https://github.com/GitoxideLabs/gitoxide/commit/e104545b78951ca882481d4a58f4425a8bc81c87)) - Bump all prior pratch levels to majors ([`5f7f805`](https://github.com/GitoxideLabs/gitoxide/commit/5f7f80570e1a5522e76ea58cccbb957249a0dffe)) + - Merge pull request #1969 from GitoxideLabs/new-release ([`631f07a`](https://github.com/GitoxideLabs/gitoxide/commit/631f07ad0c1cb93d9da42cf2c8499584fe91880a))
## 0.49.0 (2025-04-25) diff --git a/gix-odb/CHANGELOG.md b/gix-odb/CHANGELOG.md index 4373cefe1e6..044b93b83d7 100644 --- a/gix-odb/CHANGELOG.md +++ b/gix-odb/CHANGELOG.md @@ -5,13 +5,54 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## Unreleased + +### Bug Fixes + + - improve error message for when there is too many packs. + Affects https://github.com/jj-vcs/jj/issues/6906 + +### Commit Statistics + + + + - 10 commits contributed to the release over the course of 79 calendar days. + - 79 days passed between releases. + - 1 commit was understood as [conventional](https://www.conventionalcommits.org). + - 0 issues like '(#ID)' were seen in commit messages + +### Thanks Clippy + + + +[Clippy](https://github.com/rust-lang/rust-clippy) helped 2 times to make code idiomatic. + +### Commit Details + + + +
view details + + * **Uncategorized** + - Improve error message for when there is too many packs. ([`a773854`](https://github.com/GitoxideLabs/gitoxide/commit/a773854a798bb2315dcce347d86b856b8fac8dc9)) + - Merge pull request #2041 from cruessler/add-blame-extraction ([`dd5f0a4`](https://github.com/GitoxideLabs/gitoxide/commit/dd5f0a4811bc738051f7af164b8d2815aaa23220)) + - Thanks clippy ([`554ce13`](https://github.com/GitoxideLabs/gitoxide/commit/554ce134bc4b514b52a935f17f57f76ebf23ab97)) + - Merge pull request #2033 from GitoxideLabs/dependabot/cargo/cargo-b72232998d ([`f8d7c0a`](https://github.com/GitoxideLabs/gitoxide/commit/f8d7c0ad8fa7745c973c6b87e7eee70831300207)) + - Bump the cargo group with 56 updates ([`151e3a5`](https://github.com/GitoxideLabs/gitoxide/commit/151e3a5cca06444eea4c6a362649e66c831673d6)) + - Merge pull request #2009 from GitoxideLabs/release-gix-index ([`c3f06ae`](https://github.com/GitoxideLabs/gitoxide/commit/c3f06ae424ab4e1918a364cabe8276297465a73a)) + - Release gix-path v0.10.18, gix-date v0.10.2, gix-traverse v0.46.2, gix-index v0.40.1 ([`d2b4c44`](https://github.com/GitoxideLabs/gitoxide/commit/d2b4c44fcb2bf43e80d67532262631a5086f08de)) + - Merge pull request #1975 from GitoxideLabs/improvements ([`28935a5`](https://github.com/GitoxideLabs/gitoxide/commit/28935a56ff91f1fc2c17a7d23b057cf7119144e9)) + - Thanks clippy ([`dbf65c9`](https://github.com/GitoxideLabs/gitoxide/commit/dbf65c95644e6a134e7f9b75e7871479720b4deb)) + - Merge pull request #1971 from GitoxideLabs/new-release ([`8d4c4d1`](https://github.com/GitoxideLabs/gitoxide/commit/8d4c4d1e09f84c962c29d98a686c64228196ac13)) +
+ ## 0.69.1 (2025-04-26) ### Commit Statistics - - 1 commit contributed to the release. + - 3 commits contributed to the release. - 0 commits were understood as [conventional](https://www.conventionalcommits.org). - 0 issues like '(#ID)' were seen in commit messages @@ -22,7 +63,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
view details * **Uncategorized** + - Release gix-date v0.10.1, gix-utils v0.3.0, gix-actor v0.35.1, gix-validate v0.10.0, gix-path v0.10.17, gix-features v0.42.1, gix-hash v0.18.0, gix-hashtable v0.8.1, gix-object v0.49.1, gix-glob v0.20.0, gix-quote v0.6.0, gix-attributes v0.26.0, gix-command v0.6.0, gix-packetline-blocking v0.19.0, gix-filter v0.19.1, gix-fs v0.15.0, gix-commitgraph v0.28.0, gix-revwalk v0.20.1, gix-traverse v0.46.1, gix-worktree-stream v0.21.1, gix-archive v0.21.1, gix-tempfile v17.1.0, gix-lock v17.1.0, gix-index v0.40.0, gix-config-value v0.15.0, gix-pathspec v0.11.0, gix-ignore v0.15.0, gix-worktree v0.41.0, gix-diff v0.52.1, gix-blame v0.2.1, gix-ref v0.52.1, gix-sec v0.11.0, gix-config v0.45.1, gix-prompt v0.11.0, gix-url v0.31.0, gix-credentials v0.29.0, gix-discover v0.40.1, gix-dir v0.14.1, gix-mailmap v0.27.1, gix-revision v0.34.1, gix-merge v0.5.1, gix-negotiate v0.20.1, gix-pack v0.59.1, gix-odb v0.69.1, gix-refspec v0.30.1, gix-shallow v0.4.0, gix-packetline v0.19.0, gix-transport v0.47.0, gix-protocol v0.50.1, gix-status v0.19.1, gix-submodule v0.19.1, gix-worktree-state v0.19.0, gix v0.72.1, gix-fsck v0.11.1, gitoxide-core v0.47.1, gitoxide v0.44.0 ([`e104545`](https://github.com/GitoxideLabs/gitoxide/commit/e104545b78951ca882481d4a58f4425a8bc81c87)) - Bump all prior pratch levels to majors ([`5f7f805`](https://github.com/GitoxideLabs/gitoxide/commit/5f7f80570e1a5522e76ea58cccbb957249a0dffe)) + - Merge pull request #1969 from GitoxideLabs/new-release ([`631f07a`](https://github.com/GitoxideLabs/gitoxide/commit/631f07ad0c1cb93d9da42cf2c8499584fe91880a))
## 0.69.0 (2025-04-25) diff --git a/gix-pack/CHANGELOG.md b/gix-pack/CHANGELOG.md index 224eec74073..1447f8803a8 100644 --- a/gix-pack/CHANGELOG.md +++ b/gix-pack/CHANGELOG.md @@ -5,13 +5,49 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## Unreleased + +### Other + + - delta application is a fallible operation + +### Commit Statistics + + + + - 12 commits contributed to the release over the course of 79 calendar days. + - 79 days passed between releases. + - 1 commit was understood as [conventional](https://www.conventionalcommits.org). + - 0 issues like '(#ID)' were seen in commit messages + +### Commit Details + + + +
view details + + * **Uncategorized** + - Merge pull request #2070 from GitoxideLabs/dependabot/cargo/cargo-827bceb7eb ([`dab97f7`](https://github.com/GitoxideLabs/gitoxide/commit/dab97f7618f160421b6e31de8f3e2f3d11dc2ef2)) + - Bump the cargo group across 1 directory with 68 updates ([`a9a8ea1`](https://github.com/GitoxideLabs/gitoxide/commit/a9a8ea1472532dde03bce4e0afdfa82924af1f96)) + - Merge pull request #2062 from rickprice/minor_documentation_fixups ([`c2eb0c1`](https://github.com/GitoxideLabs/gitoxide/commit/c2eb0c144dd21cac87fd08829f4a5ca02f85008d)) + - Small documentation fixes ([`bfb1c34`](https://github.com/GitoxideLabs/gitoxide/commit/bfb1c34f75997a603b8f85fca75bf9e1ca310be0)) + - Merge pull request #2059 from bradlarsen/main ([`52906fb`](https://github.com/GitoxideLabs/gitoxide/commit/52906fb848e8ba088dc2662c4cd44a0a74148ceb)) + - Refactor ([`56ca4bf`](https://github.com/GitoxideLabs/gitoxide/commit/56ca4bf8e818bbdc14ee9dda68e39acded8f0287)) + - Delta application is a fallible operation ([`fce7095`](https://github.com/GitoxideLabs/gitoxide/commit/fce70950006892f51b32af233656be6fe5de9df3)) + - Merge pull request #2033 from GitoxideLabs/dependabot/cargo/cargo-b72232998d ([`f8d7c0a`](https://github.com/GitoxideLabs/gitoxide/commit/f8d7c0ad8fa7745c973c6b87e7eee70831300207)) + - Bump the cargo group with 56 updates ([`151e3a5`](https://github.com/GitoxideLabs/gitoxide/commit/151e3a5cca06444eea4c6a362649e66c831673d6)) + - Merge pull request #2009 from GitoxideLabs/release-gix-index ([`c3f06ae`](https://github.com/GitoxideLabs/gitoxide/commit/c3f06ae424ab4e1918a364cabe8276297465a73a)) + - Release gix-path v0.10.18, gix-date v0.10.2, gix-traverse v0.46.2, gix-index v0.40.1 ([`d2b4c44`](https://github.com/GitoxideLabs/gitoxide/commit/d2b4c44fcb2bf43e80d67532262631a5086f08de)) + - Merge pull request #1971 from GitoxideLabs/new-release ([`8d4c4d1`](https://github.com/GitoxideLabs/gitoxide/commit/8d4c4d1e09f84c962c29d98a686c64228196ac13)) +
+ ## 0.59.1 (2025-04-26) ### Commit Statistics - - 1 commit contributed to the release. + - 3 commits contributed to the release. - 0 commits were understood as [conventional](https://www.conventionalcommits.org). - 0 issues like '(#ID)' were seen in commit messages @@ -22,7 +58,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
view details * **Uncategorized** + - Release gix-date v0.10.1, gix-utils v0.3.0, gix-actor v0.35.1, gix-validate v0.10.0, gix-path v0.10.17, gix-features v0.42.1, gix-hash v0.18.0, gix-hashtable v0.8.1, gix-object v0.49.1, gix-glob v0.20.0, gix-quote v0.6.0, gix-attributes v0.26.0, gix-command v0.6.0, gix-packetline-blocking v0.19.0, gix-filter v0.19.1, gix-fs v0.15.0, gix-commitgraph v0.28.0, gix-revwalk v0.20.1, gix-traverse v0.46.1, gix-worktree-stream v0.21.1, gix-archive v0.21.1, gix-tempfile v17.1.0, gix-lock v17.1.0, gix-index v0.40.0, gix-config-value v0.15.0, gix-pathspec v0.11.0, gix-ignore v0.15.0, gix-worktree v0.41.0, gix-diff v0.52.1, gix-blame v0.2.1, gix-ref v0.52.1, gix-sec v0.11.0, gix-config v0.45.1, gix-prompt v0.11.0, gix-url v0.31.0, gix-credentials v0.29.0, gix-discover v0.40.1, gix-dir v0.14.1, gix-mailmap v0.27.1, gix-revision v0.34.1, gix-merge v0.5.1, gix-negotiate v0.20.1, gix-pack v0.59.1, gix-odb v0.69.1, gix-refspec v0.30.1, gix-shallow v0.4.0, gix-packetline v0.19.0, gix-transport v0.47.0, gix-protocol v0.50.1, gix-status v0.19.1, gix-submodule v0.19.1, gix-worktree-state v0.19.0, gix v0.72.1, gix-fsck v0.11.1, gitoxide-core v0.47.1, gitoxide v0.44.0 ([`e104545`](https://github.com/GitoxideLabs/gitoxide/commit/e104545b78951ca882481d4a58f4425a8bc81c87)) - Bump all prior pratch levels to majors ([`5f7f805`](https://github.com/GitoxideLabs/gitoxide/commit/5f7f80570e1a5522e76ea58cccbb957249a0dffe)) + - Merge pull request #1969 from GitoxideLabs/new-release ([`631f07a`](https://github.com/GitoxideLabs/gitoxide/commit/631f07ad0c1cb93d9da42cf2c8499584fe91880a))
## 0.59.0 (2025-04-25) diff --git a/gix-packetline-blocking/CHANGELOG.md b/gix-packetline-blocking/CHANGELOG.md index 802e870db8e..adf5a5e4c8d 100644 --- a/gix-packetline-blocking/CHANGELOG.md +++ b/gix-packetline-blocking/CHANGELOG.md @@ -5,13 +5,42 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## Unreleased + +### Bug Fixes + + - Actually avoid `serde` as dependency, when the serde feature is off + `faster-hex` has serde as default dependency, and was not marked with + `default-features = false`. + +### Commit Statistics + + + + - 3 commits contributed to the release over the course of 79 calendar days. + - 79 days passed between releases. + - 1 commit was understood as [conventional](https://www.conventionalcommits.org). + - 0 issues like '(#ID)' were seen in commit messages + +### Commit Details + + + +
view details + + * **Uncategorized** + - Merge pull request #2031 from bpeetz/serde ([`874cc38`](https://github.com/GitoxideLabs/gitoxide/commit/874cc388e1e6af558e7cab4e9238f447e8c122e1)) + - Actually avoid `serde` as dependency, when the serde feature is off ([`0d67c85`](https://github.com/GitoxideLabs/gitoxide/commit/0d67c8524058a718083d31eae827f7f60332b20a)) + - Merge pull request #1971 from GitoxideLabs/new-release ([`8d4c4d1`](https://github.com/GitoxideLabs/gitoxide/commit/8d4c4d1e09f84c962c29d98a686c64228196ac13)) +
+ ## 0.19.0 (2025-04-26) ### Commit Statistics - - 1 commit contributed to the release. + - 3 commits contributed to the release. - 0 commits were understood as [conventional](https://www.conventionalcommits.org). - 0 issues like '(#ID)' were seen in commit messages @@ -22,7 +51,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
view details * **Uncategorized** + - Release gix-date v0.10.1, gix-utils v0.3.0, gix-actor v0.35.1, gix-validate v0.10.0, gix-path v0.10.17, gix-features v0.42.1, gix-hash v0.18.0, gix-hashtable v0.8.1, gix-object v0.49.1, gix-glob v0.20.0, gix-quote v0.6.0, gix-attributes v0.26.0, gix-command v0.6.0, gix-packetline-blocking v0.19.0, gix-filter v0.19.1, gix-fs v0.15.0, gix-commitgraph v0.28.0, gix-revwalk v0.20.1, gix-traverse v0.46.1, gix-worktree-stream v0.21.1, gix-archive v0.21.1, gix-tempfile v17.1.0, gix-lock v17.1.0, gix-index v0.40.0, gix-config-value v0.15.0, gix-pathspec v0.11.0, gix-ignore v0.15.0, gix-worktree v0.41.0, gix-diff v0.52.1, gix-blame v0.2.1, gix-ref v0.52.1, gix-sec v0.11.0, gix-config v0.45.1, gix-prompt v0.11.0, gix-url v0.31.0, gix-credentials v0.29.0, gix-discover v0.40.1, gix-dir v0.14.1, gix-mailmap v0.27.1, gix-revision v0.34.1, gix-merge v0.5.1, gix-negotiate v0.20.1, gix-pack v0.59.1, gix-odb v0.69.1, gix-refspec v0.30.1, gix-shallow v0.4.0, gix-packetline v0.19.0, gix-transport v0.47.0, gix-protocol v0.50.1, gix-status v0.19.1, gix-submodule v0.19.1, gix-worktree-state v0.19.0, gix v0.72.1, gix-fsck v0.11.1, gitoxide-core v0.47.1, gitoxide v0.44.0 ([`e104545`](https://github.com/GitoxideLabs/gitoxide/commit/e104545b78951ca882481d4a58f4425a8bc81c87)) - Bump all prior pratch levels to majors ([`5f7f805`](https://github.com/GitoxideLabs/gitoxide/commit/5f7f80570e1a5522e76ea58cccbb957249a0dffe)) + - Merge pull request #1969 from GitoxideLabs/new-release ([`631f07a`](https://github.com/GitoxideLabs/gitoxide/commit/631f07ad0c1cb93d9da42cf2c8499584fe91880a))
## 0.18.4 (2025-04-25) diff --git a/gix-packetline/CHANGELOG.md b/gix-packetline/CHANGELOG.md index deebf1094fe..240769f78d3 100644 --- a/gix-packetline/CHANGELOG.md +++ b/gix-packetline/CHANGELOG.md @@ -5,13 +5,42 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## Unreleased + +### Bug Fixes + + - Actually avoid `serde` as dependency, when the serde feature is off + `faster-hex` has serde as default dependency, and was not marked with + `default-features = false`. + +### Commit Statistics + + + + - 3 commits contributed to the release over the course of 79 calendar days. + - 79 days passed between releases. + - 1 commit was understood as [conventional](https://www.conventionalcommits.org). + - 0 issues like '(#ID)' were seen in commit messages + +### Commit Details + + + +
view details + + * **Uncategorized** + - Merge pull request #2031 from bpeetz/serde ([`874cc38`](https://github.com/GitoxideLabs/gitoxide/commit/874cc388e1e6af558e7cab4e9238f447e8c122e1)) + - Actually avoid `serde` as dependency, when the serde feature is off ([`0d67c85`](https://github.com/GitoxideLabs/gitoxide/commit/0d67c8524058a718083d31eae827f7f60332b20a)) + - Merge pull request #1971 from GitoxideLabs/new-release ([`8d4c4d1`](https://github.com/GitoxideLabs/gitoxide/commit/8d4c4d1e09f84c962c29d98a686c64228196ac13)) +
+ ## 0.19.0 (2025-04-26) ### Commit Statistics - - 1 commit contributed to the release. + - 3 commits contributed to the release. - 0 commits were understood as [conventional](https://www.conventionalcommits.org). - 0 issues like '(#ID)' were seen in commit messages @@ -22,7 +51,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
view details * **Uncategorized** + - Release gix-date v0.10.1, gix-utils v0.3.0, gix-actor v0.35.1, gix-validate v0.10.0, gix-path v0.10.17, gix-features v0.42.1, gix-hash v0.18.0, gix-hashtable v0.8.1, gix-object v0.49.1, gix-glob v0.20.0, gix-quote v0.6.0, gix-attributes v0.26.0, gix-command v0.6.0, gix-packetline-blocking v0.19.0, gix-filter v0.19.1, gix-fs v0.15.0, gix-commitgraph v0.28.0, gix-revwalk v0.20.1, gix-traverse v0.46.1, gix-worktree-stream v0.21.1, gix-archive v0.21.1, gix-tempfile v17.1.0, gix-lock v17.1.0, gix-index v0.40.0, gix-config-value v0.15.0, gix-pathspec v0.11.0, gix-ignore v0.15.0, gix-worktree v0.41.0, gix-diff v0.52.1, gix-blame v0.2.1, gix-ref v0.52.1, gix-sec v0.11.0, gix-config v0.45.1, gix-prompt v0.11.0, gix-url v0.31.0, gix-credentials v0.29.0, gix-discover v0.40.1, gix-dir v0.14.1, gix-mailmap v0.27.1, gix-revision v0.34.1, gix-merge v0.5.1, gix-negotiate v0.20.1, gix-pack v0.59.1, gix-odb v0.69.1, gix-refspec v0.30.1, gix-shallow v0.4.0, gix-packetline v0.19.0, gix-transport v0.47.0, gix-protocol v0.50.1, gix-status v0.19.1, gix-submodule v0.19.1, gix-worktree-state v0.19.0, gix v0.72.1, gix-fsck v0.11.1, gitoxide-core v0.47.1, gitoxide v0.44.0 ([`e104545`](https://github.com/GitoxideLabs/gitoxide/commit/e104545b78951ca882481d4a58f4425a8bc81c87)) - Bump all prior pratch levels to majors ([`5f7f805`](https://github.com/GitoxideLabs/gitoxide/commit/5f7f80570e1a5522e76ea58cccbb957249a0dffe)) + - Merge pull request #1969 from GitoxideLabs/new-release ([`631f07a`](https://github.com/GitoxideLabs/gitoxide/commit/631f07ad0c1cb93d9da42cf2c8499584fe91880a))
## 0.18.5 (2025-04-25) diff --git a/gix-path/CHANGELOG.md b/gix-path/CHANGELOG.md index 991876ede72..54409c08d60 100644 --- a/gix-path/CHANGELOG.md +++ b/gix-path/CHANGELOG.md @@ -5,6 +5,35 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## Unreleased + +### Other + + - Improve and correct `normalize()` documentation + +### Commit Statistics + + + + - 4 commits contributed to the release over the course of 65 calendar days. + - 65 days passed between releases. + - 1 commit was understood as [conventional](https://www.conventionalcommits.org). + - 1 unique issue was worked on: [#2074](https://github.com/GitoxideLabs/gitoxide/issues/2074) + +### Commit Details + + + +
view details + + * **[#2074](https://github.com/GitoxideLabs/gitoxide/issues/2074)** + - Improve and correct `normalize()` documentation ([`45b369c`](https://github.com/GitoxideLabs/gitoxide/commit/45b369c65e7d36d42c8250b020ea5523615046e3)) + * **Uncategorized** + - Merge pull request #2070 from GitoxideLabs/dependabot/cargo/cargo-827bceb7eb ([`dab97f7`](https://github.com/GitoxideLabs/gitoxide/commit/dab97f7618f160421b6e31de8f3e2f3d11dc2ef2)) + - Bump the cargo group across 1 directory with 68 updates ([`a9a8ea1`](https://github.com/GitoxideLabs/gitoxide/commit/a9a8ea1472532dde03bce4e0afdfa82924af1f96)) + - Merge pull request #2009 from GitoxideLabs/release-gix-index ([`c3f06ae`](https://github.com/GitoxideLabs/gitoxide/commit/c3f06ae424ab4e1918a364cabe8276297465a73a)) +
+ ## 0.10.18 (2025-05-10) A maintenance release without user-facing changes. @@ -13,7 +42,7 @@ A maintenance release without user-facing changes. - - 4 commits contributed to the release over the course of 14 calendar days. + - 5 commits contributed to the release over the course of 14 calendar days. - 14 days passed between releases. - 0 commits were understood as [conventional](https://www.conventionalcommits.org). - 0 issues like '(#ID)' were seen in commit messages @@ -31,6 +60,7 @@ A maintenance release without user-facing changes.
view details * **Uncategorized** + - Release gix-path v0.10.18, gix-date v0.10.2, gix-traverse v0.46.2, gix-index v0.40.1 ([`d2b4c44`](https://github.com/GitoxideLabs/gitoxide/commit/d2b4c44fcb2bf43e80d67532262631a5086f08de)) - Prepare changelogs prior to release of `gix-index` ([`bfc4880`](https://github.com/GitoxideLabs/gitoxide/commit/bfc48801bf3ed39cdf7ec02e01aa3cfb6181705f)) - Merge pull request #1975 from GitoxideLabs/improvements ([`28935a5`](https://github.com/GitoxideLabs/gitoxide/commit/28935a56ff91f1fc2c17a7d23b057cf7119144e9)) - Thanks clippy ([`dbf65c9`](https://github.com/GitoxideLabs/gitoxide/commit/dbf65c95644e6a134e7f9b75e7871479720b4deb)) @@ -149,6 +179,14 @@ A maintenance release without user-facing changes. - https://github.com/GitoxideLabs/gitoxide/pull/1862#issuecomment-2692158831 - https://github.com/GitoxideLabs/gitoxide/pull/1862#issuecomment-2692158831 - https://github.com/GitoxideLabs/gitoxide/pull/1862#issuecomment-2692158831 + - https://github.com/GitoxideLabs/gitoxide/pull/1862#issuecomment-2692158831 +- https://github.com/GitoxideLabs/gitoxide/pull/1862#issuecomment-2692158831 +- https://github.com/GitoxideLabs/gitoxide/pull/1862#issuecomment-2692158831 +- https://github.com/GitoxideLabs/gitoxide/pull/1862#issuecomment-2692158831 +- https://github.com/GitoxideLabs/gitoxide/pull/1862#issuecomment-2692158831 +- https://github.com/GitoxideLabs/gitoxide/pull/1862#issuecomment-2692158831 +- https://github.com/GitoxideLabs/gitoxide/pull/1862#issuecomment-2692158831 +- https://github.com/GitoxideLabs/gitoxide/pull/1862#issuecomment-2692158831 - https://github.com/GitoxideLabs/gitoxide/pull/1862#issuecomment-2692158831 - https://github.com/GitoxideLabs/gitoxide/pull/1862#issuecomment-2692158831 - https://github.com/GitoxideLabs/gitoxide/pull/1862#issuecomment-2692158831 diff --git a/gix-pathspec/CHANGELOG.md b/gix-pathspec/CHANGELOG.md index 70844566be0..879d2481efc 100644 --- a/gix-pathspec/CHANGELOG.md +++ b/gix-pathspec/CHANGELOG.md @@ -5,13 +5,48 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## Unreleased + +A maintenance release without user-facing changes. + +### Commit Statistics + + + + - 7 commits contributed to the release over the course of 79 calendar days. + - 79 days passed between releases. + - 0 commits were understood as [conventional](https://www.conventionalcommits.org). + - 0 issues like '(#ID)' were seen in commit messages + +### Thanks Clippy + + + +[Clippy](https://github.com/rust-lang/rust-clippy) helped 1 time to make code idiomatic. + +### Commit Details + + + +
view details + + * **Uncategorized** + - Merge pull request #2014 from GitoxideLabs/zip ([`648022b`](https://github.com/GitoxideLabs/gitoxide/commit/648022b44e12f597cae55cc45830d0a19b87eb4c)) + - Release gix-glob v0.20.1, gix-attributes v0.26.1, gix-command v0.6.1, gix-filter v0.19.2, gix-worktree-stream v0.21.2, gix-archive v0.21.2 ([`f0ed2cc`](https://github.com/GitoxideLabs/gitoxide/commit/f0ed2cc0046f866e67944bff9aef0579c12d5852)) + - Merge pull request #2009 from GitoxideLabs/release-gix-index ([`c3f06ae`](https://github.com/GitoxideLabs/gitoxide/commit/c3f06ae424ab4e1918a364cabe8276297465a73a)) + - Release gix-path v0.10.18, gix-date v0.10.2, gix-traverse v0.46.2, gix-index v0.40.1 ([`d2b4c44`](https://github.com/GitoxideLabs/gitoxide/commit/d2b4c44fcb2bf43e80d67532262631a5086f08de)) + - Merge pull request #1975 from GitoxideLabs/improvements ([`28935a5`](https://github.com/GitoxideLabs/gitoxide/commit/28935a56ff91f1fc2c17a7d23b057cf7119144e9)) + - Thanks clippy ([`dbf65c9`](https://github.com/GitoxideLabs/gitoxide/commit/dbf65c95644e6a134e7f9b75e7871479720b4deb)) + - Merge pull request #1971 from GitoxideLabs/new-release ([`8d4c4d1`](https://github.com/GitoxideLabs/gitoxide/commit/8d4c4d1e09f84c962c29d98a686c64228196ac13)) +
+ ## 0.11.0 (2025-04-26) ### Commit Statistics - - 1 commit contributed to the release. + - 3 commits contributed to the release. - 0 commits were understood as [conventional](https://www.conventionalcommits.org). - 0 issues like '(#ID)' were seen in commit messages @@ -22,7 +57,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
view details * **Uncategorized** + - Release gix-date v0.10.1, gix-utils v0.3.0, gix-actor v0.35.1, gix-validate v0.10.0, gix-path v0.10.17, gix-features v0.42.1, gix-hash v0.18.0, gix-hashtable v0.8.1, gix-object v0.49.1, gix-glob v0.20.0, gix-quote v0.6.0, gix-attributes v0.26.0, gix-command v0.6.0, gix-packetline-blocking v0.19.0, gix-filter v0.19.1, gix-fs v0.15.0, gix-commitgraph v0.28.0, gix-revwalk v0.20.1, gix-traverse v0.46.1, gix-worktree-stream v0.21.1, gix-archive v0.21.1, gix-tempfile v17.1.0, gix-lock v17.1.0, gix-index v0.40.0, gix-config-value v0.15.0, gix-pathspec v0.11.0, gix-ignore v0.15.0, gix-worktree v0.41.0, gix-diff v0.52.1, gix-blame v0.2.1, gix-ref v0.52.1, gix-sec v0.11.0, gix-config v0.45.1, gix-prompt v0.11.0, gix-url v0.31.0, gix-credentials v0.29.0, gix-discover v0.40.1, gix-dir v0.14.1, gix-mailmap v0.27.1, gix-revision v0.34.1, gix-merge v0.5.1, gix-negotiate v0.20.1, gix-pack v0.59.1, gix-odb v0.69.1, gix-refspec v0.30.1, gix-shallow v0.4.0, gix-packetline v0.19.0, gix-transport v0.47.0, gix-protocol v0.50.1, gix-status v0.19.1, gix-submodule v0.19.1, gix-worktree-state v0.19.0, gix v0.72.1, gix-fsck v0.11.1, gitoxide-core v0.47.1, gitoxide v0.44.0 ([`e104545`](https://github.com/GitoxideLabs/gitoxide/commit/e104545b78951ca882481d4a58f4425a8bc81c87)) - Bump all prior pratch levels to majors ([`5f7f805`](https://github.com/GitoxideLabs/gitoxide/commit/5f7f80570e1a5522e76ea58cccbb957249a0dffe)) + - Merge pull request #1969 from GitoxideLabs/new-release ([`631f07a`](https://github.com/GitoxideLabs/gitoxide/commit/631f07ad0c1cb93d9da42cf2c8499584fe91880a))
## 0.10.1 (2025-04-25) diff --git a/gix-prompt/CHANGELOG.md b/gix-prompt/CHANGELOG.md index c9f9d7251ca..c25bbd05a04 100644 --- a/gix-prompt/CHANGELOG.md +++ b/gix-prompt/CHANGELOG.md @@ -5,13 +5,42 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## Unreleased + +A maintenance release without user-facing changes. + +### Commit Statistics + + + + - 7 commits contributed to the release over the course of 79 calendar days. + - 79 days passed between releases. + - 0 commits were understood as [conventional](https://www.conventionalcommits.org). + - 0 issues like '(#ID)' were seen in commit messages + +### Commit Details + + + +
view details + + * **Uncategorized** + - Merge pull request #2033 from GitoxideLabs/dependabot/cargo/cargo-b72232998d ([`f8d7c0a`](https://github.com/GitoxideLabs/gitoxide/commit/f8d7c0ad8fa7745c973c6b87e7eee70831300207)) + - Bump the cargo group with 56 updates ([`151e3a5`](https://github.com/GitoxideLabs/gitoxide/commit/151e3a5cca06444eea4c6a362649e66c831673d6)) + - Merge pull request #2014 from GitoxideLabs/zip ([`648022b`](https://github.com/GitoxideLabs/gitoxide/commit/648022b44e12f597cae55cc45830d0a19b87eb4c)) + - Release gix-glob v0.20.1, gix-attributes v0.26.1, gix-command v0.6.1, gix-filter v0.19.2, gix-worktree-stream v0.21.2, gix-archive v0.21.2 ([`f0ed2cc`](https://github.com/GitoxideLabs/gitoxide/commit/f0ed2cc0046f866e67944bff9aef0579c12d5852)) + - Merge pull request #1977 from GitoxideLabs/dependabot/cargo/cargo-811d7b929d ([`800738a`](https://github.com/GitoxideLabs/gitoxide/commit/800738a37f3d33926a427edfa294423bbe3f2b66)) + - Bump the cargo group with 12 updates ([`4408166`](https://github.com/GitoxideLabs/gitoxide/commit/4408166bf56197a67419277a4ef8feeba9060fee)) + - Merge pull request #1971 from GitoxideLabs/new-release ([`8d4c4d1`](https://github.com/GitoxideLabs/gitoxide/commit/8d4c4d1e09f84c962c29d98a686c64228196ac13)) +
+ ## 0.11.0 (2025-04-26) ### Commit Statistics - - 1 commit contributed to the release. + - 3 commits contributed to the release. - 0 commits were understood as [conventional](https://www.conventionalcommits.org). - 0 issues like '(#ID)' were seen in commit messages @@ -22,7 +51,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
view details * **Uncategorized** + - Release gix-date v0.10.1, gix-utils v0.3.0, gix-actor v0.35.1, gix-validate v0.10.0, gix-path v0.10.17, gix-features v0.42.1, gix-hash v0.18.0, gix-hashtable v0.8.1, gix-object v0.49.1, gix-glob v0.20.0, gix-quote v0.6.0, gix-attributes v0.26.0, gix-command v0.6.0, gix-packetline-blocking v0.19.0, gix-filter v0.19.1, gix-fs v0.15.0, gix-commitgraph v0.28.0, gix-revwalk v0.20.1, gix-traverse v0.46.1, gix-worktree-stream v0.21.1, gix-archive v0.21.1, gix-tempfile v17.1.0, gix-lock v17.1.0, gix-index v0.40.0, gix-config-value v0.15.0, gix-pathspec v0.11.0, gix-ignore v0.15.0, gix-worktree v0.41.0, gix-diff v0.52.1, gix-blame v0.2.1, gix-ref v0.52.1, gix-sec v0.11.0, gix-config v0.45.1, gix-prompt v0.11.0, gix-url v0.31.0, gix-credentials v0.29.0, gix-discover v0.40.1, gix-dir v0.14.1, gix-mailmap v0.27.1, gix-revision v0.34.1, gix-merge v0.5.1, gix-negotiate v0.20.1, gix-pack v0.59.1, gix-odb v0.69.1, gix-refspec v0.30.1, gix-shallow v0.4.0, gix-packetline v0.19.0, gix-transport v0.47.0, gix-protocol v0.50.1, gix-status v0.19.1, gix-submodule v0.19.1, gix-worktree-state v0.19.0, gix v0.72.1, gix-fsck v0.11.1, gitoxide-core v0.47.1, gitoxide v0.44.0 ([`e104545`](https://github.com/GitoxideLabs/gitoxide/commit/e104545b78951ca882481d4a58f4425a8bc81c87)) - Bump all prior pratch levels to majors ([`5f7f805`](https://github.com/GitoxideLabs/gitoxide/commit/5f7f80570e1a5522e76ea58cccbb957249a0dffe)) + - Merge pull request #1969 from GitoxideLabs/new-release ([`631f07a`](https://github.com/GitoxideLabs/gitoxide/commit/631f07ad0c1cb93d9da42cf2c8499584fe91880a))
## 0.10.1 (2025-04-25) diff --git a/gix-protocol/CHANGELOG.md b/gix-protocol/CHANGELOG.md index 47a44ac32ee..0d3f8e411bf 100644 --- a/gix-protocol/CHANGELOG.md +++ b/gix-protocol/CHANGELOG.md @@ -5,13 +5,50 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## Unreleased + +A maintenance release without user-facing changes. + +### Commit Statistics + + + + - 9 commits contributed to the release over the course of 79 calendar days. + - 79 days passed between releases. + - 0 commits were understood as [conventional](https://www.conventionalcommits.org). + - 0 issues like '(#ID)' were seen in commit messages + +### Thanks Clippy + + + +[Clippy](https://github.com/rust-lang/rust-clippy) helped 1 time to make code idiomatic. + +### Commit Details + + + +
view details + + * **Uncategorized** + - Merge pull request #2062 from rickprice/minor_documentation_fixups ([`c2eb0c1`](https://github.com/GitoxideLabs/gitoxide/commit/c2eb0c144dd21cac87fd08829f4a5ca02f85008d)) + - Small documentation fixes ([`bfb1c34`](https://github.com/GitoxideLabs/gitoxide/commit/bfb1c34f75997a603b8f85fca75bf9e1ca310be0)) + - Merge pull request #2033 from GitoxideLabs/dependabot/cargo/cargo-b72232998d ([`f8d7c0a`](https://github.com/GitoxideLabs/gitoxide/commit/f8d7c0ad8fa7745c973c6b87e7eee70831300207)) + - Bump the cargo group with 56 updates ([`151e3a5`](https://github.com/GitoxideLabs/gitoxide/commit/151e3a5cca06444eea4c6a362649e66c831673d6)) + - Merge pull request #2009 from GitoxideLabs/release-gix-index ([`c3f06ae`](https://github.com/GitoxideLabs/gitoxide/commit/c3f06ae424ab4e1918a364cabe8276297465a73a)) + - Release gix-path v0.10.18, gix-date v0.10.2, gix-traverse v0.46.2, gix-index v0.40.1 ([`d2b4c44`](https://github.com/GitoxideLabs/gitoxide/commit/d2b4c44fcb2bf43e80d67532262631a5086f08de)) + - Merge pull request #1975 from GitoxideLabs/improvements ([`28935a5`](https://github.com/GitoxideLabs/gitoxide/commit/28935a56ff91f1fc2c17a7d23b057cf7119144e9)) + - Thanks clippy ([`dbf65c9`](https://github.com/GitoxideLabs/gitoxide/commit/dbf65c95644e6a134e7f9b75e7871479720b4deb)) + - Merge pull request #1971 from GitoxideLabs/new-release ([`8d4c4d1`](https://github.com/GitoxideLabs/gitoxide/commit/8d4c4d1e09f84c962c29d98a686c64228196ac13)) +
+ ## 0.50.1 (2025-04-26) ### Commit Statistics - - 1 commit contributed to the release. + - 3 commits contributed to the release. - 0 commits were understood as [conventional](https://www.conventionalcommits.org). - 0 issues like '(#ID)' were seen in commit messages @@ -22,7 +59,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
view details * **Uncategorized** + - Release gix-date v0.10.1, gix-utils v0.3.0, gix-actor v0.35.1, gix-validate v0.10.0, gix-path v0.10.17, gix-features v0.42.1, gix-hash v0.18.0, gix-hashtable v0.8.1, gix-object v0.49.1, gix-glob v0.20.0, gix-quote v0.6.0, gix-attributes v0.26.0, gix-command v0.6.0, gix-packetline-blocking v0.19.0, gix-filter v0.19.1, gix-fs v0.15.0, gix-commitgraph v0.28.0, gix-revwalk v0.20.1, gix-traverse v0.46.1, gix-worktree-stream v0.21.1, gix-archive v0.21.1, gix-tempfile v17.1.0, gix-lock v17.1.0, gix-index v0.40.0, gix-config-value v0.15.0, gix-pathspec v0.11.0, gix-ignore v0.15.0, gix-worktree v0.41.0, gix-diff v0.52.1, gix-blame v0.2.1, gix-ref v0.52.1, gix-sec v0.11.0, gix-config v0.45.1, gix-prompt v0.11.0, gix-url v0.31.0, gix-credentials v0.29.0, gix-discover v0.40.1, gix-dir v0.14.1, gix-mailmap v0.27.1, gix-revision v0.34.1, gix-merge v0.5.1, gix-negotiate v0.20.1, gix-pack v0.59.1, gix-odb v0.69.1, gix-refspec v0.30.1, gix-shallow v0.4.0, gix-packetline v0.19.0, gix-transport v0.47.0, gix-protocol v0.50.1, gix-status v0.19.1, gix-submodule v0.19.1, gix-worktree-state v0.19.0, gix v0.72.1, gix-fsck v0.11.1, gitoxide-core v0.47.1, gitoxide v0.44.0 ([`e104545`](https://github.com/GitoxideLabs/gitoxide/commit/e104545b78951ca882481d4a58f4425a8bc81c87)) - Bump all prior pratch levels to majors ([`5f7f805`](https://github.com/GitoxideLabs/gitoxide/commit/5f7f80570e1a5522e76ea58cccbb957249a0dffe)) + - Merge pull request #1969 from GitoxideLabs/new-release ([`631f07a`](https://github.com/GitoxideLabs/gitoxide/commit/631f07ad0c1cb93d9da42cf2c8499584fe91880a))
## 0.50.0 (2025-04-25) diff --git a/gix-ref/CHANGELOG.md b/gix-ref/CHANGELOG.md index cfab4776ca2..20f3acaec85 100644 --- a/gix-ref/CHANGELOG.md +++ b/gix-ref/CHANGELOG.md @@ -5,13 +5,62 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## Unreleased + +### New Features + + - refs support pseudo refs + - add `Category::to_full_name()` to easily generate full names from short ones. + - add `file::Store::is_empty()` + +### Commit Statistics + + + + - 17 commits contributed to the release over the course of 79 calendar days. + - 79 days passed between releases. + - 3 commits were understood as [conventional](https://www.conventionalcommits.org). + - 0 issues like '(#ID)' were seen in commit messages + +### Thanks Clippy + + + +[Clippy](https://github.com/rust-lang/rust-clippy) helped 1 time to make code idiomatic. + +### Commit Details + + + +
view details + + * **Uncategorized** + - Merge pull request #2061 from orthros/pseudo-refs ([`60c29a5`](https://github.com/GitoxideLabs/gitoxide/commit/60c29a59302bfc9d0be7aab5dd3ef05e4ee8e3fa)) + - Refactor ([`43f92b5`](https://github.com/GitoxideLabs/gitoxide/commit/43f92b5285af6696cd21f0e94f3bec568aef8468)) + - Refs support pseudo refs ([`fdf5153`](https://github.com/GitoxideLabs/gitoxide/commit/fdf5153d9fe5e7c059b5a9687b7041e16ba54683)) + - Adapt to changes in gix_features::walkdir_sorted_new ([`a2741da`](https://github.com/GitoxideLabs/gitoxide/commit/a2741da85fe04907f8773a99813e3802333b402d)) + - Merge pull request #2041 from cruessler/add-blame-extraction ([`dd5f0a4`](https://github.com/GitoxideLabs/gitoxide/commit/dd5f0a4811bc738051f7af164b8d2815aaa23220)) + - Thanks clippy ([`554ce13`](https://github.com/GitoxideLabs/gitoxide/commit/554ce134bc4b514b52a935f17f57f76ebf23ab97)) + - Merge pull request #2036 from GitoxideLabs/improvements ([`249bf9a`](https://github.com/GitoxideLabs/gitoxide/commit/249bf9a2add29caa339c5f9783dd63f87a718c6e)) + - Add `Category::to_full_name()` to easily generate full names from short ones. ([`f8b87f1`](https://github.com/GitoxideLabs/gitoxide/commit/f8b87f1ffb871ca3ce8c6ef6538c64780bd1b452)) + - Merge pull request #2033 from GitoxideLabs/dependabot/cargo/cargo-b72232998d ([`f8d7c0a`](https://github.com/GitoxideLabs/gitoxide/commit/f8d7c0ad8fa7745c973c6b87e7eee70831300207)) + - Bump the cargo group with 56 updates ([`151e3a5`](https://github.com/GitoxideLabs/gitoxide/commit/151e3a5cca06444eea4c6a362649e66c831673d6)) + - Merge pull request #2016 from GitoxideLabs/improvements ([`7ae3797`](https://github.com/GitoxideLabs/gitoxide/commit/7ae3797f19cf2dd3bc3e02a6437643e5f50ed338)) + - Add `file::Store::is_empty()` ([`c8a63ab`](https://github.com/GitoxideLabs/gitoxide/commit/c8a63ab4618d3a71176703a04ab69da02d850267)) + - Merge pull request #2009 from GitoxideLabs/release-gix-index ([`c3f06ae`](https://github.com/GitoxideLabs/gitoxide/commit/c3f06ae424ab4e1918a364cabe8276297465a73a)) + - Release gix-path v0.10.18, gix-date v0.10.2, gix-traverse v0.46.2, gix-index v0.40.1 ([`d2b4c44`](https://github.com/GitoxideLabs/gitoxide/commit/d2b4c44fcb2bf43e80d67532262631a5086f08de)) + - Merge pull request #1977 from GitoxideLabs/dependabot/cargo/cargo-811d7b929d ([`800738a`](https://github.com/GitoxideLabs/gitoxide/commit/800738a37f3d33926a427edfa294423bbe3f2b66)) + - Bump the cargo group with 12 updates ([`4408166`](https://github.com/GitoxideLabs/gitoxide/commit/4408166bf56197a67419277a4ef8feeba9060fee)) + - Merge pull request #1971 from GitoxideLabs/new-release ([`8d4c4d1`](https://github.com/GitoxideLabs/gitoxide/commit/8d4c4d1e09f84c962c29d98a686c64228196ac13)) +
+ ## 0.52.1 (2025-04-26) ### Commit Statistics - - 1 commit contributed to the release. + - 3 commits contributed to the release. - 0 commits were understood as [conventional](https://www.conventionalcommits.org). - 0 issues like '(#ID)' were seen in commit messages @@ -22,7 +71,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
view details * **Uncategorized** + - Release gix-date v0.10.1, gix-utils v0.3.0, gix-actor v0.35.1, gix-validate v0.10.0, gix-path v0.10.17, gix-features v0.42.1, gix-hash v0.18.0, gix-hashtable v0.8.1, gix-object v0.49.1, gix-glob v0.20.0, gix-quote v0.6.0, gix-attributes v0.26.0, gix-command v0.6.0, gix-packetline-blocking v0.19.0, gix-filter v0.19.1, gix-fs v0.15.0, gix-commitgraph v0.28.0, gix-revwalk v0.20.1, gix-traverse v0.46.1, gix-worktree-stream v0.21.1, gix-archive v0.21.1, gix-tempfile v17.1.0, gix-lock v17.1.0, gix-index v0.40.0, gix-config-value v0.15.0, gix-pathspec v0.11.0, gix-ignore v0.15.0, gix-worktree v0.41.0, gix-diff v0.52.1, gix-blame v0.2.1, gix-ref v0.52.1, gix-sec v0.11.0, gix-config v0.45.1, gix-prompt v0.11.0, gix-url v0.31.0, gix-credentials v0.29.0, gix-discover v0.40.1, gix-dir v0.14.1, gix-mailmap v0.27.1, gix-revision v0.34.1, gix-merge v0.5.1, gix-negotiate v0.20.1, gix-pack v0.59.1, gix-odb v0.69.1, gix-refspec v0.30.1, gix-shallow v0.4.0, gix-packetline v0.19.0, gix-transport v0.47.0, gix-protocol v0.50.1, gix-status v0.19.1, gix-submodule v0.19.1, gix-worktree-state v0.19.0, gix v0.72.1, gix-fsck v0.11.1, gitoxide-core v0.47.1, gitoxide v0.44.0 ([`e104545`](https://github.com/GitoxideLabs/gitoxide/commit/e104545b78951ca882481d4a58f4425a8bc81c87)) - Bump all prior pratch levels to majors ([`5f7f805`](https://github.com/GitoxideLabs/gitoxide/commit/5f7f80570e1a5522e76ea58cccbb957249a0dffe)) + - Merge pull request #1969 from GitoxideLabs/new-release ([`631f07a`](https://github.com/GitoxideLabs/gitoxide/commit/631f07ad0c1cb93d9da42cf2c8499584fe91880a))
## 0.52.0 (2025-04-25) diff --git a/gix-refspec/CHANGELOG.md b/gix-refspec/CHANGELOG.md index 858f2e2b992..0ef650d241e 100644 --- a/gix-refspec/CHANGELOG.md +++ b/gix-refspec/CHANGELOG.md @@ -5,13 +5,46 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## Unreleased + +A maintenance release without user-facing changes. + +### Commit Statistics + + + + - 5 commits contributed to the release over the course of 79 calendar days. + - 79 days passed between releases. + - 0 commits were understood as [conventional](https://www.conventionalcommits.org). + - 0 issues like '(#ID)' were seen in commit messages + +### Thanks Clippy + + + +[Clippy](https://github.com/rust-lang/rust-clippy) helped 1 time to make code idiomatic. + +### Commit Details + + + +
view details + + * **Uncategorized** + - Merge pull request #2070 from GitoxideLabs/dependabot/cargo/cargo-827bceb7eb ([`dab97f7`](https://github.com/GitoxideLabs/gitoxide/commit/dab97f7618f160421b6e31de8f3e2f3d11dc2ef2)) + - Bump the cargo group across 1 directory with 68 updates ([`a9a8ea1`](https://github.com/GitoxideLabs/gitoxide/commit/a9a8ea1472532dde03bce4e0afdfa82924af1f96)) + - Merge pull request #2041 from cruessler/add-blame-extraction ([`dd5f0a4`](https://github.com/GitoxideLabs/gitoxide/commit/dd5f0a4811bc738051f7af164b8d2815aaa23220)) + - Thanks clippy ([`554ce13`](https://github.com/GitoxideLabs/gitoxide/commit/554ce134bc4b514b52a935f17f57f76ebf23ab97)) + - Merge pull request #1971 from GitoxideLabs/new-release ([`8d4c4d1`](https://github.com/GitoxideLabs/gitoxide/commit/8d4c4d1e09f84c962c29d98a686c64228196ac13)) +
+ ## 0.30.1 (2025-04-26) ### Commit Statistics - - 1 commit contributed to the release. + - 3 commits contributed to the release. - 0 commits were understood as [conventional](https://www.conventionalcommits.org). - 0 issues like '(#ID)' were seen in commit messages @@ -22,7 +55,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
view details * **Uncategorized** + - Release gix-date v0.10.1, gix-utils v0.3.0, gix-actor v0.35.1, gix-validate v0.10.0, gix-path v0.10.17, gix-features v0.42.1, gix-hash v0.18.0, gix-hashtable v0.8.1, gix-object v0.49.1, gix-glob v0.20.0, gix-quote v0.6.0, gix-attributes v0.26.0, gix-command v0.6.0, gix-packetline-blocking v0.19.0, gix-filter v0.19.1, gix-fs v0.15.0, gix-commitgraph v0.28.0, gix-revwalk v0.20.1, gix-traverse v0.46.1, gix-worktree-stream v0.21.1, gix-archive v0.21.1, gix-tempfile v17.1.0, gix-lock v17.1.0, gix-index v0.40.0, gix-config-value v0.15.0, gix-pathspec v0.11.0, gix-ignore v0.15.0, gix-worktree v0.41.0, gix-diff v0.52.1, gix-blame v0.2.1, gix-ref v0.52.1, gix-sec v0.11.0, gix-config v0.45.1, gix-prompt v0.11.0, gix-url v0.31.0, gix-credentials v0.29.0, gix-discover v0.40.1, gix-dir v0.14.1, gix-mailmap v0.27.1, gix-revision v0.34.1, gix-merge v0.5.1, gix-negotiate v0.20.1, gix-pack v0.59.1, gix-odb v0.69.1, gix-refspec v0.30.1, gix-shallow v0.4.0, gix-packetline v0.19.0, gix-transport v0.47.0, gix-protocol v0.50.1, gix-status v0.19.1, gix-submodule v0.19.1, gix-worktree-state v0.19.0, gix v0.72.1, gix-fsck v0.11.1, gitoxide-core v0.47.1, gitoxide v0.44.0 ([`e104545`](https://github.com/GitoxideLabs/gitoxide/commit/e104545b78951ca882481d4a58f4425a8bc81c87)) - Bump all prior pratch levels to majors ([`5f7f805`](https://github.com/GitoxideLabs/gitoxide/commit/5f7f80570e1a5522e76ea58cccbb957249a0dffe)) + - Merge pull request #1969 from GitoxideLabs/new-release ([`631f07a`](https://github.com/GitoxideLabs/gitoxide/commit/631f07ad0c1cb93d9da42cf2c8499584fe91880a))
## 0.30.0 (2025-04-25) diff --git a/gix-revision/CHANGELOG.md b/gix-revision/CHANGELOG.md index 52400e0b7e2..5192e67452c 100644 --- a/gix-revision/CHANGELOG.md +++ b/gix-revision/CHANGELOG.md @@ -5,13 +5,38 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## Unreleased + +A maintenance release without user-facing changes. + +### Commit Statistics + + + + - 3 commits contributed to the release over the course of 79 calendar days. + - 79 days passed between releases. + - 0 commits were understood as [conventional](https://www.conventionalcommits.org). + - 0 issues like '(#ID)' were seen in commit messages + +### Commit Details + + + +
view details + + * **Uncategorized** + - Merge pull request #2009 from GitoxideLabs/release-gix-index ([`c3f06ae`](https://github.com/GitoxideLabs/gitoxide/commit/c3f06ae424ab4e1918a364cabe8276297465a73a)) + - Release gix-path v0.10.18, gix-date v0.10.2, gix-traverse v0.46.2, gix-index v0.40.1 ([`d2b4c44`](https://github.com/GitoxideLabs/gitoxide/commit/d2b4c44fcb2bf43e80d67532262631a5086f08de)) + - Merge pull request #1971 from GitoxideLabs/new-release ([`8d4c4d1`](https://github.com/GitoxideLabs/gitoxide/commit/8d4c4d1e09f84c962c29d98a686c64228196ac13)) +
+ ## 0.34.1 (2025-04-26) ### Commit Statistics - - 1 commit contributed to the release. + - 3 commits contributed to the release. - 0 commits were understood as [conventional](https://www.conventionalcommits.org). - 0 issues like '(#ID)' were seen in commit messages @@ -22,7 +47,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
view details * **Uncategorized** + - Release gix-date v0.10.1, gix-utils v0.3.0, gix-actor v0.35.1, gix-validate v0.10.0, gix-path v0.10.17, gix-features v0.42.1, gix-hash v0.18.0, gix-hashtable v0.8.1, gix-object v0.49.1, gix-glob v0.20.0, gix-quote v0.6.0, gix-attributes v0.26.0, gix-command v0.6.0, gix-packetline-blocking v0.19.0, gix-filter v0.19.1, gix-fs v0.15.0, gix-commitgraph v0.28.0, gix-revwalk v0.20.1, gix-traverse v0.46.1, gix-worktree-stream v0.21.1, gix-archive v0.21.1, gix-tempfile v17.1.0, gix-lock v17.1.0, gix-index v0.40.0, gix-config-value v0.15.0, gix-pathspec v0.11.0, gix-ignore v0.15.0, gix-worktree v0.41.0, gix-diff v0.52.1, gix-blame v0.2.1, gix-ref v0.52.1, gix-sec v0.11.0, gix-config v0.45.1, gix-prompt v0.11.0, gix-url v0.31.0, gix-credentials v0.29.0, gix-discover v0.40.1, gix-dir v0.14.1, gix-mailmap v0.27.1, gix-revision v0.34.1, gix-merge v0.5.1, gix-negotiate v0.20.1, gix-pack v0.59.1, gix-odb v0.69.1, gix-refspec v0.30.1, gix-shallow v0.4.0, gix-packetline v0.19.0, gix-transport v0.47.0, gix-protocol v0.50.1, gix-status v0.19.1, gix-submodule v0.19.1, gix-worktree-state v0.19.0, gix v0.72.1, gix-fsck v0.11.1, gitoxide-core v0.47.1, gitoxide v0.44.0 ([`e104545`](https://github.com/GitoxideLabs/gitoxide/commit/e104545b78951ca882481d4a58f4425a8bc81c87)) - Bump all prior pratch levels to majors ([`5f7f805`](https://github.com/GitoxideLabs/gitoxide/commit/5f7f80570e1a5522e76ea58cccbb957249a0dffe)) + - Merge pull request #1969 from GitoxideLabs/new-release ([`631f07a`](https://github.com/GitoxideLabs/gitoxide/commit/631f07ad0c1cb93d9da42cf2c8499584fe91880a))
## 0.34.0 (2025-04-25) diff --git a/gix-revwalk/CHANGELOG.md b/gix-revwalk/CHANGELOG.md index 3f95a6b47c3..a365b37bef7 100644 --- a/gix-revwalk/CHANGELOG.md +++ b/gix-revwalk/CHANGELOG.md @@ -5,13 +5,38 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## Unreleased + +A maintenance release without user-facing changes. + +### Commit Statistics + + + + - 3 commits contributed to the release over the course of 79 calendar days. + - 79 days passed between releases. + - 0 commits were understood as [conventional](https://www.conventionalcommits.org). + - 0 issues like '(#ID)' were seen in commit messages + +### Commit Details + + + +
view details + + * **Uncategorized** + - Merge pull request #2070 from GitoxideLabs/dependabot/cargo/cargo-827bceb7eb ([`dab97f7`](https://github.com/GitoxideLabs/gitoxide/commit/dab97f7618f160421b6e31de8f3e2f3d11dc2ef2)) + - Bump the cargo group across 1 directory with 68 updates ([`a9a8ea1`](https://github.com/GitoxideLabs/gitoxide/commit/a9a8ea1472532dde03bce4e0afdfa82924af1f96)) + - Merge pull request #1971 from GitoxideLabs/new-release ([`8d4c4d1`](https://github.com/GitoxideLabs/gitoxide/commit/8d4c4d1e09f84c962c29d98a686c64228196ac13)) +
+ ## 0.20.1 (2025-04-26) ### Commit Statistics - - 1 commit contributed to the release. + - 3 commits contributed to the release. - 0 commits were understood as [conventional](https://www.conventionalcommits.org). - 0 issues like '(#ID)' were seen in commit messages @@ -22,7 +47,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
view details * **Uncategorized** + - Release gix-date v0.10.1, gix-utils v0.3.0, gix-actor v0.35.1, gix-validate v0.10.0, gix-path v0.10.17, gix-features v0.42.1, gix-hash v0.18.0, gix-hashtable v0.8.1, gix-object v0.49.1, gix-glob v0.20.0, gix-quote v0.6.0, gix-attributes v0.26.0, gix-command v0.6.0, gix-packetline-blocking v0.19.0, gix-filter v0.19.1, gix-fs v0.15.0, gix-commitgraph v0.28.0, gix-revwalk v0.20.1, gix-traverse v0.46.1, gix-worktree-stream v0.21.1, gix-archive v0.21.1, gix-tempfile v17.1.0, gix-lock v17.1.0, gix-index v0.40.0, gix-config-value v0.15.0, gix-pathspec v0.11.0, gix-ignore v0.15.0, gix-worktree v0.41.0, gix-diff v0.52.1, gix-blame v0.2.1, gix-ref v0.52.1, gix-sec v0.11.0, gix-config v0.45.1, gix-prompt v0.11.0, gix-url v0.31.0, gix-credentials v0.29.0, gix-discover v0.40.1, gix-dir v0.14.1, gix-mailmap v0.27.1, gix-revision v0.34.1, gix-merge v0.5.1, gix-negotiate v0.20.1, gix-pack v0.59.1, gix-odb v0.69.1, gix-refspec v0.30.1, gix-shallow v0.4.0, gix-packetline v0.19.0, gix-transport v0.47.0, gix-protocol v0.50.1, gix-status v0.19.1, gix-submodule v0.19.1, gix-worktree-state v0.19.0, gix v0.72.1, gix-fsck v0.11.1, gitoxide-core v0.47.1, gitoxide v0.44.0 ([`e104545`](https://github.com/GitoxideLabs/gitoxide/commit/e104545b78951ca882481d4a58f4425a8bc81c87)) - Bump all prior pratch levels to majors ([`5f7f805`](https://github.com/GitoxideLabs/gitoxide/commit/5f7f80570e1a5522e76ea58cccbb957249a0dffe)) + - Merge pull request #1969 from GitoxideLabs/new-release ([`631f07a`](https://github.com/GitoxideLabs/gitoxide/commit/631f07ad0c1cb93d9da42cf2c8499584fe91880a))
## 0.20.0 (2025-04-25) diff --git a/gix-sec/CHANGELOG.md b/gix-sec/CHANGELOG.md index b72a0fdcd02..e3e7640eb87 100644 --- a/gix-sec/CHANGELOG.md +++ b/gix-sec/CHANGELOG.md @@ -5,13 +5,47 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## Unreleased + +### New Features (BREAKING) + + - Add optional `oauth_refresh_token` field to `identity::Account` + +### Commit Statistics + + + + - 9 commits contributed to the release over the course of 79 calendar days. + - 79 days passed between releases. + - 1 commit was understood as [conventional](https://www.conventionalcommits.org). + - 1 unique issue was worked on: [#1998](https://github.com/GitoxideLabs/gitoxide/issues/1998) + +### Commit Details + + + +
view details + + * **[#1998](https://github.com/GitoxideLabs/gitoxide/issues/1998)** + - Add optional `oauth_refresh_token` field to `identity::Account` ([`dc9b103`](https://github.com/GitoxideLabs/gitoxide/commit/dc9b103c2ef813931becefcf082daeda5a3cf869)) + * **Uncategorized** + - Merge pull request #2070 from GitoxideLabs/dependabot/cargo/cargo-827bceb7eb ([`dab97f7`](https://github.com/GitoxideLabs/gitoxide/commit/dab97f7618f160421b6e31de8f3e2f3d11dc2ef2)) + - Bump the cargo group across 1 directory with 68 updates ([`a9a8ea1`](https://github.com/GitoxideLabs/gitoxide/commit/a9a8ea1472532dde03bce4e0afdfa82924af1f96)) + - Merge pull request #2033 from GitoxideLabs/dependabot/cargo/cargo-b72232998d ([`f8d7c0a`](https://github.com/GitoxideLabs/gitoxide/commit/f8d7c0ad8fa7745c973c6b87e7eee70831300207)) + - Bump the cargo group with 56 updates ([`151e3a5`](https://github.com/GitoxideLabs/gitoxide/commit/151e3a5cca06444eea4c6a362649e66c831673d6)) + - Merge pull request #1999 from GitoxideLabs/credential-helper-protocol-fix ([`8d30ab1`](https://github.com/GitoxideLabs/gitoxide/commit/8d30ab1260fa69468b66d6df3297bb2b43530b93)) + - Merge pull request #2009 from GitoxideLabs/release-gix-index ([`c3f06ae`](https://github.com/GitoxideLabs/gitoxide/commit/c3f06ae424ab4e1918a364cabe8276297465a73a)) + - Release gix-path v0.10.18, gix-date v0.10.2, gix-traverse v0.46.2, gix-index v0.40.1 ([`d2b4c44`](https://github.com/GitoxideLabs/gitoxide/commit/d2b4c44fcb2bf43e80d67532262631a5086f08de)) + - Merge pull request #1971 from GitoxideLabs/new-release ([`8d4c4d1`](https://github.com/GitoxideLabs/gitoxide/commit/8d4c4d1e09f84c962c29d98a686c64228196ac13)) +
+ ## 0.11.0 (2025-04-26) ### Commit Statistics - - 1 commit contributed to the release. + - 3 commits contributed to the release. - 0 commits were understood as [conventional](https://www.conventionalcommits.org). - 0 issues like '(#ID)' were seen in commit messages @@ -22,7 +56,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
view details * **Uncategorized** + - Release gix-date v0.10.1, gix-utils v0.3.0, gix-actor v0.35.1, gix-validate v0.10.0, gix-path v0.10.17, gix-features v0.42.1, gix-hash v0.18.0, gix-hashtable v0.8.1, gix-object v0.49.1, gix-glob v0.20.0, gix-quote v0.6.0, gix-attributes v0.26.0, gix-command v0.6.0, gix-packetline-blocking v0.19.0, gix-filter v0.19.1, gix-fs v0.15.0, gix-commitgraph v0.28.0, gix-revwalk v0.20.1, gix-traverse v0.46.1, gix-worktree-stream v0.21.1, gix-archive v0.21.1, gix-tempfile v17.1.0, gix-lock v17.1.0, gix-index v0.40.0, gix-config-value v0.15.0, gix-pathspec v0.11.0, gix-ignore v0.15.0, gix-worktree v0.41.0, gix-diff v0.52.1, gix-blame v0.2.1, gix-ref v0.52.1, gix-sec v0.11.0, gix-config v0.45.1, gix-prompt v0.11.0, gix-url v0.31.0, gix-credentials v0.29.0, gix-discover v0.40.1, gix-dir v0.14.1, gix-mailmap v0.27.1, gix-revision v0.34.1, gix-merge v0.5.1, gix-negotiate v0.20.1, gix-pack v0.59.1, gix-odb v0.69.1, gix-refspec v0.30.1, gix-shallow v0.4.0, gix-packetline v0.19.0, gix-transport v0.47.0, gix-protocol v0.50.1, gix-status v0.19.1, gix-submodule v0.19.1, gix-worktree-state v0.19.0, gix v0.72.1, gix-fsck v0.11.1, gitoxide-core v0.47.1, gitoxide v0.44.0 ([`e104545`](https://github.com/GitoxideLabs/gitoxide/commit/e104545b78951ca882481d4a58f4425a8bc81c87)) - Bump all prior pratch levels to majors ([`5f7f805`](https://github.com/GitoxideLabs/gitoxide/commit/5f7f80570e1a5522e76ea58cccbb957249a0dffe)) + - Merge pull request #1969 from GitoxideLabs/new-release ([`631f07a`](https://github.com/GitoxideLabs/gitoxide/commit/631f07ad0c1cb93d9da42cf2c8499584fe91880a))
## 0.10.13 (2025-04-25) diff --git a/gix-shallow/CHANGELOG.md b/gix-shallow/CHANGELOG.md index 0124fb815f4..1072b07730c 100644 --- a/gix-shallow/CHANGELOG.md +++ b/gix-shallow/CHANGELOG.md @@ -5,13 +5,36 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## Unreleased + +A maintenance release without user-facing changes. + +### Commit Statistics + + + + - 1 commit contributed to the release over the course of 79 calendar days. + - 79 days passed between releases. + - 0 commits were understood as [conventional](https://www.conventionalcommits.org). + - 0 issues like '(#ID)' were seen in commit messages + +### Commit Details + + + +
view details + + * **Uncategorized** + - Merge pull request #1971 from GitoxideLabs/new-release ([`8d4c4d1`](https://github.com/GitoxideLabs/gitoxide/commit/8d4c4d1e09f84c962c29d98a686c64228196ac13)) +
+ ## 0.4.0 (2025-04-26) ### Commit Statistics - - 1 commit contributed to the release. + - 3 commits contributed to the release. - 0 commits were understood as [conventional](https://www.conventionalcommits.org). - 0 issues like '(#ID)' were seen in commit messages @@ -22,7 +45,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
view details * **Uncategorized** + - Release gix-date v0.10.1, gix-utils v0.3.0, gix-actor v0.35.1, gix-validate v0.10.0, gix-path v0.10.17, gix-features v0.42.1, gix-hash v0.18.0, gix-hashtable v0.8.1, gix-object v0.49.1, gix-glob v0.20.0, gix-quote v0.6.0, gix-attributes v0.26.0, gix-command v0.6.0, gix-packetline-blocking v0.19.0, gix-filter v0.19.1, gix-fs v0.15.0, gix-commitgraph v0.28.0, gix-revwalk v0.20.1, gix-traverse v0.46.1, gix-worktree-stream v0.21.1, gix-archive v0.21.1, gix-tempfile v17.1.0, gix-lock v17.1.0, gix-index v0.40.0, gix-config-value v0.15.0, gix-pathspec v0.11.0, gix-ignore v0.15.0, gix-worktree v0.41.0, gix-diff v0.52.1, gix-blame v0.2.1, gix-ref v0.52.1, gix-sec v0.11.0, gix-config v0.45.1, gix-prompt v0.11.0, gix-url v0.31.0, gix-credentials v0.29.0, gix-discover v0.40.1, gix-dir v0.14.1, gix-mailmap v0.27.1, gix-revision v0.34.1, gix-merge v0.5.1, gix-negotiate v0.20.1, gix-pack v0.59.1, gix-odb v0.69.1, gix-refspec v0.30.1, gix-shallow v0.4.0, gix-packetline v0.19.0, gix-transport v0.47.0, gix-protocol v0.50.1, gix-status v0.19.1, gix-submodule v0.19.1, gix-worktree-state v0.19.0, gix v0.72.1, gix-fsck v0.11.1, gitoxide-core v0.47.1, gitoxide v0.44.0 ([`e104545`](https://github.com/GitoxideLabs/gitoxide/commit/e104545b78951ca882481d4a58f4425a8bc81c87)) - Bump all prior pratch levels to majors ([`5f7f805`](https://github.com/GitoxideLabs/gitoxide/commit/5f7f80570e1a5522e76ea58cccbb957249a0dffe)) + - Merge pull request #1969 from GitoxideLabs/new-release ([`631f07a`](https://github.com/GitoxideLabs/gitoxide/commit/631f07ad0c1cb93d9da42cf2c8499584fe91880a))
## 0.3.1 (2025-04-25) diff --git a/gix-status/CHANGELOG.md b/gix-status/CHANGELOG.md index f81078b25fd..daa001907d6 100644 --- a/gix-status/CHANGELOG.md +++ b/gix-status/CHANGELOG.md @@ -5,13 +5,46 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## Unreleased + +### Bug Fixes + + - if `core.symlinks=false`, don't misclassify actual symlinks as files. + Thus, prefer the actual observation over the stored and maybe incorrect filesystem settings. + This avoids false-positives when checking for changes. + +### Commit Statistics + + + + - 7 commits contributed to the release over the course of 79 calendar days. + - 79 days passed between releases. + - 1 commit was understood as [conventional](https://www.conventionalcommits.org). + - 0 issues like '(#ID)' were seen in commit messages + +### Commit Details + + + +
view details + + * **Uncategorized** + - Merge pull request #2016 from GitoxideLabs/improvements ([`7ae3797`](https://github.com/GitoxideLabs/gitoxide/commit/7ae3797f19cf2dd3bc3e02a6437643e5f50ed338)) + - If `core.symlinks=false`, don't misclassify actual symlinks as files. ([`376ed0c`](https://github.com/GitoxideLabs/gitoxide/commit/376ed0cb602e4df457b0b6c87fe16af027bdff48)) + - Merge pull request #2014 from GitoxideLabs/zip ([`648022b`](https://github.com/GitoxideLabs/gitoxide/commit/648022b44e12f597cae55cc45830d0a19b87eb4c)) + - Release gix-glob v0.20.1, gix-attributes v0.26.1, gix-command v0.6.1, gix-filter v0.19.2, gix-worktree-stream v0.21.2, gix-archive v0.21.2 ([`f0ed2cc`](https://github.com/GitoxideLabs/gitoxide/commit/f0ed2cc0046f866e67944bff9aef0579c12d5852)) + - Merge pull request #2009 from GitoxideLabs/release-gix-index ([`c3f06ae`](https://github.com/GitoxideLabs/gitoxide/commit/c3f06ae424ab4e1918a364cabe8276297465a73a)) + - Release gix-path v0.10.18, gix-date v0.10.2, gix-traverse v0.46.2, gix-index v0.40.1 ([`d2b4c44`](https://github.com/GitoxideLabs/gitoxide/commit/d2b4c44fcb2bf43e80d67532262631a5086f08de)) + - Merge pull request #1971 from GitoxideLabs/new-release ([`8d4c4d1`](https://github.com/GitoxideLabs/gitoxide/commit/8d4c4d1e09f84c962c29d98a686c64228196ac13)) +
+ ## 0.19.1 (2025-04-26) ### Commit Statistics - - 1 commit contributed to the release. + - 3 commits contributed to the release. - 0 commits were understood as [conventional](https://www.conventionalcommits.org). - 0 issues like '(#ID)' were seen in commit messages @@ -22,7 +55,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
view details * **Uncategorized** + - Release gix-date v0.10.1, gix-utils v0.3.0, gix-actor v0.35.1, gix-validate v0.10.0, gix-path v0.10.17, gix-features v0.42.1, gix-hash v0.18.0, gix-hashtable v0.8.1, gix-object v0.49.1, gix-glob v0.20.0, gix-quote v0.6.0, gix-attributes v0.26.0, gix-command v0.6.0, gix-packetline-blocking v0.19.0, gix-filter v0.19.1, gix-fs v0.15.0, gix-commitgraph v0.28.0, gix-revwalk v0.20.1, gix-traverse v0.46.1, gix-worktree-stream v0.21.1, gix-archive v0.21.1, gix-tempfile v17.1.0, gix-lock v17.1.0, gix-index v0.40.0, gix-config-value v0.15.0, gix-pathspec v0.11.0, gix-ignore v0.15.0, gix-worktree v0.41.0, gix-diff v0.52.1, gix-blame v0.2.1, gix-ref v0.52.1, gix-sec v0.11.0, gix-config v0.45.1, gix-prompt v0.11.0, gix-url v0.31.0, gix-credentials v0.29.0, gix-discover v0.40.1, gix-dir v0.14.1, gix-mailmap v0.27.1, gix-revision v0.34.1, gix-merge v0.5.1, gix-negotiate v0.20.1, gix-pack v0.59.1, gix-odb v0.69.1, gix-refspec v0.30.1, gix-shallow v0.4.0, gix-packetline v0.19.0, gix-transport v0.47.0, gix-protocol v0.50.1, gix-status v0.19.1, gix-submodule v0.19.1, gix-worktree-state v0.19.0, gix v0.72.1, gix-fsck v0.11.1, gitoxide-core v0.47.1, gitoxide v0.44.0 ([`e104545`](https://github.com/GitoxideLabs/gitoxide/commit/e104545b78951ca882481d4a58f4425a8bc81c87)) - Bump all prior pratch levels to majors ([`5f7f805`](https://github.com/GitoxideLabs/gitoxide/commit/5f7f80570e1a5522e76ea58cccbb957249a0dffe)) + - Merge pull request #1969 from GitoxideLabs/new-release ([`631f07a`](https://github.com/GitoxideLabs/gitoxide/commit/631f07ad0c1cb93d9da42cf2c8499584fe91880a))
## 0.19.0 (2025-04-25) diff --git a/gix-submodule/CHANGELOG.md b/gix-submodule/CHANGELOG.md index 5fbb2691be5..345d4902b7d 100644 --- a/gix-submodule/CHANGELOG.md +++ b/gix-submodule/CHANGELOG.md @@ -5,13 +5,40 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## Unreleased + +A maintenance release without user-facing changes. + +### Commit Statistics + + + + - 5 commits contributed to the release over the course of 79 calendar days. + - 79 days passed between releases. + - 0 commits were understood as [conventional](https://www.conventionalcommits.org). + - 0 issues like '(#ID)' were seen in commit messages + +### Commit Details + + + +
view details + + * **Uncategorized** + - Merge pull request #2061 from orthros/pseudo-refs ([`60c29a5`](https://github.com/GitoxideLabs/gitoxide/commit/60c29a59302bfc9d0be7aab5dd3ef05e4ee8e3fa)) + - Adapt to changes in gix_features::walkdir_sorted_new ([`a2741da`](https://github.com/GitoxideLabs/gitoxide/commit/a2741da85fe04907f8773a99813e3802333b402d)) + - Merge pull request #2009 from GitoxideLabs/release-gix-index ([`c3f06ae`](https://github.com/GitoxideLabs/gitoxide/commit/c3f06ae424ab4e1918a364cabe8276297465a73a)) + - Release gix-path v0.10.18, gix-date v0.10.2, gix-traverse v0.46.2, gix-index v0.40.1 ([`d2b4c44`](https://github.com/GitoxideLabs/gitoxide/commit/d2b4c44fcb2bf43e80d67532262631a5086f08de)) + - Merge pull request #1971 from GitoxideLabs/new-release ([`8d4c4d1`](https://github.com/GitoxideLabs/gitoxide/commit/8d4c4d1e09f84c962c29d98a686c64228196ac13)) +
+ ## 0.19.1 (2025-04-26) ### Commit Statistics - - 1 commit contributed to the release. + - 3 commits contributed to the release. - 0 commits were understood as [conventional](https://www.conventionalcommits.org). - 0 issues like '(#ID)' were seen in commit messages @@ -22,7 +49,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
view details * **Uncategorized** + - Release gix-date v0.10.1, gix-utils v0.3.0, gix-actor v0.35.1, gix-validate v0.10.0, gix-path v0.10.17, gix-features v0.42.1, gix-hash v0.18.0, gix-hashtable v0.8.1, gix-object v0.49.1, gix-glob v0.20.0, gix-quote v0.6.0, gix-attributes v0.26.0, gix-command v0.6.0, gix-packetline-blocking v0.19.0, gix-filter v0.19.1, gix-fs v0.15.0, gix-commitgraph v0.28.0, gix-revwalk v0.20.1, gix-traverse v0.46.1, gix-worktree-stream v0.21.1, gix-archive v0.21.1, gix-tempfile v17.1.0, gix-lock v17.1.0, gix-index v0.40.0, gix-config-value v0.15.0, gix-pathspec v0.11.0, gix-ignore v0.15.0, gix-worktree v0.41.0, gix-diff v0.52.1, gix-blame v0.2.1, gix-ref v0.52.1, gix-sec v0.11.0, gix-config v0.45.1, gix-prompt v0.11.0, gix-url v0.31.0, gix-credentials v0.29.0, gix-discover v0.40.1, gix-dir v0.14.1, gix-mailmap v0.27.1, gix-revision v0.34.1, gix-merge v0.5.1, gix-negotiate v0.20.1, gix-pack v0.59.1, gix-odb v0.69.1, gix-refspec v0.30.1, gix-shallow v0.4.0, gix-packetline v0.19.0, gix-transport v0.47.0, gix-protocol v0.50.1, gix-status v0.19.1, gix-submodule v0.19.1, gix-worktree-state v0.19.0, gix v0.72.1, gix-fsck v0.11.1, gitoxide-core v0.47.1, gitoxide v0.44.0 ([`e104545`](https://github.com/GitoxideLabs/gitoxide/commit/e104545b78951ca882481d4a58f4425a8bc81c87)) - Bump all prior pratch levels to majors ([`5f7f805`](https://github.com/GitoxideLabs/gitoxide/commit/5f7f80570e1a5522e76ea58cccbb957249a0dffe)) + - Merge pull request #1969 from GitoxideLabs/new-release ([`631f07a`](https://github.com/GitoxideLabs/gitoxide/commit/631f07ad0c1cb93d9da42cf2c8499584fe91880a))
## 0.19.0 (2025-04-25) diff --git a/gix-tempfile/CHANGELOG.md b/gix-tempfile/CHANGELOG.md index 61a5589842d..4fef671571d 100644 --- a/gix-tempfile/CHANGELOG.md +++ b/gix-tempfile/CHANGELOG.md @@ -5,13 +5,42 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## Unreleased + +A maintenance release without user-facing changes. + +### Commit Statistics + + + + - 7 commits contributed to the release over the course of 79 calendar days. + - 79 days passed between releases. + - 0 commits were understood as [conventional](https://www.conventionalcommits.org). + - 0 issues like '(#ID)' were seen in commit messages + +### Commit Details + + + +
view details + + * **Uncategorized** + - Merge pull request #2070 from GitoxideLabs/dependabot/cargo/cargo-827bceb7eb ([`dab97f7`](https://github.com/GitoxideLabs/gitoxide/commit/dab97f7618f160421b6e31de8f3e2f3d11dc2ef2)) + - Bump the cargo group across 1 directory with 68 updates ([`a9a8ea1`](https://github.com/GitoxideLabs/gitoxide/commit/a9a8ea1472532dde03bce4e0afdfa82924af1f96)) + - Merge pull request #2062 from rickprice/minor_documentation_fixups ([`c2eb0c1`](https://github.com/GitoxideLabs/gitoxide/commit/c2eb0c144dd21cac87fd08829f4a5ca02f85008d)) + - Small documentation fixes ([`bfb1c34`](https://github.com/GitoxideLabs/gitoxide/commit/bfb1c34f75997a603b8f85fca75bf9e1ca310be0)) + - Merge pull request #2033 from GitoxideLabs/dependabot/cargo/cargo-b72232998d ([`f8d7c0a`](https://github.com/GitoxideLabs/gitoxide/commit/f8d7c0ad8fa7745c973c6b87e7eee70831300207)) + - Bump the cargo group with 56 updates ([`151e3a5`](https://github.com/GitoxideLabs/gitoxide/commit/151e3a5cca06444eea4c6a362649e66c831673d6)) + - Merge pull request #1971 from GitoxideLabs/new-release ([`8d4c4d1`](https://github.com/GitoxideLabs/gitoxide/commit/8d4c4d1e09f84c962c29d98a686c64228196ac13)) +
+ ## 17.1.0 (2025-04-26) ### Commit Statistics - - 1 commit contributed to the release. + - 3 commits contributed to the release. - 0 commits were understood as [conventional](https://www.conventionalcommits.org). - 0 issues like '(#ID)' were seen in commit messages @@ -22,7 +51,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
view details * **Uncategorized** + - Release gix-date v0.10.1, gix-utils v0.3.0, gix-actor v0.35.1, gix-validate v0.10.0, gix-path v0.10.17, gix-features v0.42.1, gix-hash v0.18.0, gix-hashtable v0.8.1, gix-object v0.49.1, gix-glob v0.20.0, gix-quote v0.6.0, gix-attributes v0.26.0, gix-command v0.6.0, gix-packetline-blocking v0.19.0, gix-filter v0.19.1, gix-fs v0.15.0, gix-commitgraph v0.28.0, gix-revwalk v0.20.1, gix-traverse v0.46.1, gix-worktree-stream v0.21.1, gix-archive v0.21.1, gix-tempfile v17.1.0, gix-lock v17.1.0, gix-index v0.40.0, gix-config-value v0.15.0, gix-pathspec v0.11.0, gix-ignore v0.15.0, gix-worktree v0.41.0, gix-diff v0.52.1, gix-blame v0.2.1, gix-ref v0.52.1, gix-sec v0.11.0, gix-config v0.45.1, gix-prompt v0.11.0, gix-url v0.31.0, gix-credentials v0.29.0, gix-discover v0.40.1, gix-dir v0.14.1, gix-mailmap v0.27.1, gix-revision v0.34.1, gix-merge v0.5.1, gix-negotiate v0.20.1, gix-pack v0.59.1, gix-odb v0.69.1, gix-refspec v0.30.1, gix-shallow v0.4.0, gix-packetline v0.19.0, gix-transport v0.47.0, gix-protocol v0.50.1, gix-status v0.19.1, gix-submodule v0.19.1, gix-worktree-state v0.19.0, gix v0.72.1, gix-fsck v0.11.1, gitoxide-core v0.47.1, gitoxide v0.44.0 ([`e104545`](https://github.com/GitoxideLabs/gitoxide/commit/e104545b78951ca882481d4a58f4425a8bc81c87)) - Bump all prior pratch levels to majors ([`5f7f805`](https://github.com/GitoxideLabs/gitoxide/commit/5f7f80570e1a5522e76ea58cccbb957249a0dffe)) + - Merge pull request #1969 from GitoxideLabs/new-release ([`631f07a`](https://github.com/GitoxideLabs/gitoxide/commit/631f07ad0c1cb93d9da42cf2c8499584fe91880a))
## 17.0.1 (2025-04-25) diff --git a/gix-trace/CHANGELOG.md b/gix-trace/CHANGELOG.md index c5198d21303..79d4215311f 100644 --- a/gix-trace/CHANGELOG.md +++ b/gix-trace/CHANGELOG.md @@ -5,6 +5,30 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## Unreleased + +A maintenance release without user-facing changes. + +### Commit Statistics + + + + - 3 commits contributed to the release. + - 0 commits were understood as [conventional](https://www.conventionalcommits.org). + - 0 issues like '(#ID)' were seen in commit messages + +### Commit Details + + + +
view details + + * **Uncategorized** + - Merge pull request #2070 from GitoxideLabs/dependabot/cargo/cargo-827bceb7eb ([`dab97f7`](https://github.com/GitoxideLabs/gitoxide/commit/dab97f7618f160421b6e31de8f3e2f3d11dc2ef2)) + - Bump the cargo group across 1 directory with 68 updates ([`a9a8ea1`](https://github.com/GitoxideLabs/gitoxide/commit/a9a8ea1472532dde03bce4e0afdfa82924af1f96)) + - Merge pull request #1778 from GitoxideLabs/new-release ([`8df0db2`](https://github.com/GitoxideLabs/gitoxide/commit/8df0db2f8fe1832a5efd86d6aba6fb12c4c855de)) +
+ ## 0.1.12 (2025-01-18) @@ -19,7 +43,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - - 4 commits contributed to the release. + - 5 commits contributed to the release. - 1 commit was understood as [conventional](https://www.conventionalcommits.org). - 0 issues like '(#ID)' were seen in commit messages @@ -30,6 +54,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
view details * **Uncategorized** + - Release gix-utils v0.1.14, gix-actor v0.33.2, gix-hash v0.16.0, gix-trace v0.1.12, gix-features v0.40.0, gix-hashtable v0.7.0, gix-path v0.10.14, gix-validate v0.9.3, gix-object v0.47.0, gix-glob v0.18.0, gix-quote v0.4.15, gix-attributes v0.24.0, gix-command v0.4.1, gix-packetline-blocking v0.18.2, gix-filter v0.17.0, gix-fs v0.13.0, gix-chunk v0.4.11, gix-commitgraph v0.26.0, gix-revwalk v0.18.0, gix-traverse v0.44.0, gix-worktree-stream v0.19.0, gix-archive v0.19.0, gix-bitmap v0.2.14, gix-tempfile v16.0.0, gix-lock v16.0.0, gix-index v0.38.0, gix-config-value v0.14.11, gix-pathspec v0.9.0, gix-ignore v0.13.0, gix-worktree v0.39.0, gix-diff v0.50.0, gix-blame v0.0.0, gix-ref v0.50.0, gix-sec v0.10.11, gix-config v0.43.0, gix-prompt v0.9.1, gix-url v0.29.0, gix-credentials v0.27.0, gix-discover v0.38.0, gix-dir v0.12.0, gix-mailmap v0.25.2, gix-revision v0.32.0, gix-merge v0.3.0, gix-negotiate v0.18.0, gix-pack v0.57.0, gix-odb v0.67.0, gix-refspec v0.28.0, gix-shallow v0.2.0, gix-packetline v0.18.3, gix-transport v0.45.0, gix-protocol v0.48.0, gix-status v0.17.0, gix-submodule v0.17.0, gix-worktree-state v0.17.0, gix v0.70.0, gix-fsck v0.9.0, gitoxide-core v0.45.0, gitoxide v0.41.0, safety bump 42 crates ([`dea106a`](https://github.com/GitoxideLabs/gitoxide/commit/dea106a8c4fecc1f0a8f891a2691ad9c63964d25)) - Update all changelogs prior to release ([`1f6390c`](https://github.com/GitoxideLabs/gitoxide/commit/1f6390c53ba68ce203ae59eb3545e2631dd8a106)) - Merge pull request #1762 from GitoxideLabs/fix-1759 ([`7ec21bb`](https://github.com/GitoxideLabs/gitoxide/commit/7ec21bb96ce05b29dde74b2efdf22b6e43189aab)) - Bump `rust-version` to 1.70 ([`17835bc`](https://github.com/GitoxideLabs/gitoxide/commit/17835bccb066bbc47cc137e8ec5d9fe7d5665af0)) diff --git a/gix-transport/CHANGELOG.md b/gix-transport/CHANGELOG.md index 32ce7d3f4ad..4b7355324e0 100644 --- a/gix-transport/CHANGELOG.md +++ b/gix-transport/CHANGELOG.md @@ -5,13 +5,54 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## Unreleased + +A maintenance release without user-facing changes. + +### Commit Statistics + + + + - 13 commits contributed to the release over the course of 79 calendar days. + - 79 days passed between releases. + - 0 commits were understood as [conventional](https://www.conventionalcommits.org). + - 0 issues like '(#ID)' were seen in commit messages + +### Thanks Clippy + + + +[Clippy](https://github.com/rust-lang/rust-clippy) helped 1 time to make code idiomatic. + +### Commit Details + + + +
view details + + * **Uncategorized** + - Merge pull request #2070 from GitoxideLabs/dependabot/cargo/cargo-827bceb7eb ([`dab97f7`](https://github.com/GitoxideLabs/gitoxide/commit/dab97f7618f160421b6e31de8f3e2f3d11dc2ef2)) + - Bump the cargo group across 1 directory with 68 updates ([`a9a8ea1`](https://github.com/GitoxideLabs/gitoxide/commit/a9a8ea1472532dde03bce4e0afdfa82924af1f96)) + - Merge pull request #2062 from rickprice/minor_documentation_fixups ([`c2eb0c1`](https://github.com/GitoxideLabs/gitoxide/commit/c2eb0c144dd21cac87fd08829f4a5ca02f85008d)) + - Small documentation fixes ([`bfb1c34`](https://github.com/GitoxideLabs/gitoxide/commit/bfb1c34f75997a603b8f85fca75bf9e1ca310be0)) + - Merge pull request #2033 from GitoxideLabs/dependabot/cargo/cargo-b72232998d ([`f8d7c0a`](https://github.com/GitoxideLabs/gitoxide/commit/f8d7c0ad8fa7745c973c6b87e7eee70831300207)) + - Bump the cargo group with 56 updates ([`151e3a5`](https://github.com/GitoxideLabs/gitoxide/commit/151e3a5cca06444eea4c6a362649e66c831673d6)) + - Merge pull request #2014 from GitoxideLabs/zip ([`648022b`](https://github.com/GitoxideLabs/gitoxide/commit/648022b44e12f597cae55cc45830d0a19b87eb4c)) + - Release gix-glob v0.20.1, gix-attributes v0.26.1, gix-command v0.6.1, gix-filter v0.19.2, gix-worktree-stream v0.21.2, gix-archive v0.21.2 ([`f0ed2cc`](https://github.com/GitoxideLabs/gitoxide/commit/f0ed2cc0046f866e67944bff9aef0579c12d5852)) + - Merge pull request #1999 from GitoxideLabs/credential-helper-protocol-fix ([`8d30ab1`](https://github.com/GitoxideLabs/gitoxide/commit/8d30ab1260fa69468b66d6df3297bb2b43530b93)) + - Adapt to changes in `gix-sec` ([`6880175`](https://github.com/GitoxideLabs/gitoxide/commit/6880175ab1bb70af39d18919cb8bfdc1df32b46f)) + - Merge pull request #1975 from GitoxideLabs/improvements ([`28935a5`](https://github.com/GitoxideLabs/gitoxide/commit/28935a56ff91f1fc2c17a7d23b057cf7119144e9)) + - Thanks clippy ([`dbf65c9`](https://github.com/GitoxideLabs/gitoxide/commit/dbf65c95644e6a134e7f9b75e7871479720b4deb)) + - Merge pull request #1971 from GitoxideLabs/new-release ([`8d4c4d1`](https://github.com/GitoxideLabs/gitoxide/commit/8d4c4d1e09f84c962c29d98a686c64228196ac13)) +
+ ## 0.47.0 (2025-04-26) ### Commit Statistics - - 1 commit contributed to the release. + - 3 commits contributed to the release. - 0 commits were understood as [conventional](https://www.conventionalcommits.org). - 0 issues like '(#ID)' were seen in commit messages @@ -22,7 +63,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
view details * **Uncategorized** + - Release gix-date v0.10.1, gix-utils v0.3.0, gix-actor v0.35.1, gix-validate v0.10.0, gix-path v0.10.17, gix-features v0.42.1, gix-hash v0.18.0, gix-hashtable v0.8.1, gix-object v0.49.1, gix-glob v0.20.0, gix-quote v0.6.0, gix-attributes v0.26.0, gix-command v0.6.0, gix-packetline-blocking v0.19.0, gix-filter v0.19.1, gix-fs v0.15.0, gix-commitgraph v0.28.0, gix-revwalk v0.20.1, gix-traverse v0.46.1, gix-worktree-stream v0.21.1, gix-archive v0.21.1, gix-tempfile v17.1.0, gix-lock v17.1.0, gix-index v0.40.0, gix-config-value v0.15.0, gix-pathspec v0.11.0, gix-ignore v0.15.0, gix-worktree v0.41.0, gix-diff v0.52.1, gix-blame v0.2.1, gix-ref v0.52.1, gix-sec v0.11.0, gix-config v0.45.1, gix-prompt v0.11.0, gix-url v0.31.0, gix-credentials v0.29.0, gix-discover v0.40.1, gix-dir v0.14.1, gix-mailmap v0.27.1, gix-revision v0.34.1, gix-merge v0.5.1, gix-negotiate v0.20.1, gix-pack v0.59.1, gix-odb v0.69.1, gix-refspec v0.30.1, gix-shallow v0.4.0, gix-packetline v0.19.0, gix-transport v0.47.0, gix-protocol v0.50.1, gix-status v0.19.1, gix-submodule v0.19.1, gix-worktree-state v0.19.0, gix v0.72.1, gix-fsck v0.11.1, gitoxide-core v0.47.1, gitoxide v0.44.0 ([`e104545`](https://github.com/GitoxideLabs/gitoxide/commit/e104545b78951ca882481d4a58f4425a8bc81c87)) - Bump all prior pratch levels to majors ([`5f7f805`](https://github.com/GitoxideLabs/gitoxide/commit/5f7f80570e1a5522e76ea58cccbb957249a0dffe)) + - Merge pull request #1969 from GitoxideLabs/new-release ([`631f07a`](https://github.com/GitoxideLabs/gitoxide/commit/631f07ad0c1cb93d9da42cf2c8499584fe91880a))
## 0.46.1 (2025-04-25) diff --git a/gix-traverse/CHANGELOG.md b/gix-traverse/CHANGELOG.md index 80f60db630d..b0d8163f9b7 100644 --- a/gix-traverse/CHANGELOG.md +++ b/gix-traverse/CHANGELOG.md @@ -5,6 +5,38 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## Unreleased + +### New Features + + - add `commit::Simple::hide()` to hide a given set of tips. + That means, these tips and all their ancestors will be hidden from + the traversal. + +### Commit Statistics + + + + - 6 commits contributed to the release over the course of 65 calendar days. + - 65 days passed between releases. + - 1 commit was understood as [conventional](https://www.conventionalcommits.org). + - 0 issues like '(#ID)' were seen in commit messages + +### Commit Details + + + +
view details + + * **Uncategorized** + - Merge pull request #2070 from GitoxideLabs/dependabot/cargo/cargo-827bceb7eb ([`dab97f7`](https://github.com/GitoxideLabs/gitoxide/commit/dab97f7618f160421b6e31de8f3e2f3d11dc2ef2)) + - Bump the cargo group across 1 directory with 68 updates ([`a9a8ea1`](https://github.com/GitoxideLabs/gitoxide/commit/a9a8ea1472532dde03bce4e0afdfa82924af1f96)) + - Merge pull request #2037 from GitoxideLabs/hide ([`92febae`](https://github.com/GitoxideLabs/gitoxide/commit/92febae025165c55e596d58511b1634fb6580b9c)) + - Improve traversal performance when hidden tips are used. ([`219655f`](https://github.com/GitoxideLabs/gitoxide/commit/219655fb0001b4e88a56fdcaebed1679ff6e7118)) + - Add `commit::Simple::hide()` to hide a given set of tips. ([`1b08fd9`](https://github.com/GitoxideLabs/gitoxide/commit/1b08fd937056d0a674b1d4bba40ad3098f54ffbf)) + - Merge pull request #2009 from GitoxideLabs/release-gix-index ([`c3f06ae`](https://github.com/GitoxideLabs/gitoxide/commit/c3f06ae424ab4e1918a364cabe8276297465a73a)) +
+ ## 0.46.2 (2025-05-10) ### New Features @@ -15,7 +47,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - - 7 commits contributed to the release over the course of 14 calendar days. + - 8 commits contributed to the release over the course of 14 calendar days. - 14 days passed between releases. - 1 commit was understood as [conventional](https://www.conventionalcommits.org). - 0 issues like '(#ID)' were seen in commit messages @@ -27,6 +59,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
view details * **Uncategorized** + - Release gix-path v0.10.18, gix-date v0.10.2, gix-traverse v0.46.2, gix-index v0.40.1 ([`d2b4c44`](https://github.com/GitoxideLabs/gitoxide/commit/d2b4c44fcb2bf43e80d67532262631a5086f08de)) - Prepare changelogs prior to release of `gix-index` ([`bfc4880`](https://github.com/GitoxideLabs/gitoxide/commit/bfc48801bf3ed39cdf7ec02e01aa3cfb6181705f)) - Merge pull request #1977 from GitoxideLabs/dependabot/cargo/cargo-811d7b929d ([`800738a`](https://github.com/GitoxideLabs/gitoxide/commit/800738a37f3d33926a427edfa294423bbe3f2b66)) - Bump the cargo group with 12 updates ([`4408166`](https://github.com/GitoxideLabs/gitoxide/commit/4408166bf56197a67419277a4ef8feeba9060fee)) diff --git a/gix-url/CHANGELOG.md b/gix-url/CHANGELOG.md index c7bf2981b14..23937a1cfa6 100644 --- a/gix-url/CHANGELOG.md +++ b/gix-url/CHANGELOG.md @@ -5,13 +5,46 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## Unreleased + +### Bug Fixes + + - username in scp-like url is no longer percent-encoded + Since Git doesn't percent-decode characters in scp-like URL, we shouldn't encode + username at all. + +### Commit Statistics + + + + - 6 commits contributed to the release over the course of 79 calendar days. + - 79 days passed between releases. + - 1 commit was understood as [conventional](https://www.conventionalcommits.org). + - 1 unique issue was worked on: [#2056](https://github.com/GitoxideLabs/gitoxide/issues/2056) + +### Commit Details + + + +
view details + + * **[#2056](https://github.com/GitoxideLabs/gitoxide/issues/2056)** + - Username in scp-like url is no longer percent-encoded ([`04bc4a8`](https://github.com/GitoxideLabs/gitoxide/commit/04bc4a81614146f56f341e15b459dfc1a880bd45)) + * **Uncategorized** + - Merge pull request #2060 from yuja/push-urolxnurwtsn ([`68d761c`](https://github.com/GitoxideLabs/gitoxide/commit/68d761cdc87a46b72028153e096f1a22012239bc)) + - Add baseline tests for `_` and `@` in username ([`212b618`](https://github.com/GitoxideLabs/gitoxide/commit/212b618c5f99cc75ed612431669dcc2ec4c49a5e)) + - Merge pull request #2009 from GitoxideLabs/release-gix-index ([`c3f06ae`](https://github.com/GitoxideLabs/gitoxide/commit/c3f06ae424ab4e1918a364cabe8276297465a73a)) + - Release gix-path v0.10.18, gix-date v0.10.2, gix-traverse v0.46.2, gix-index v0.40.1 ([`d2b4c44`](https://github.com/GitoxideLabs/gitoxide/commit/d2b4c44fcb2bf43e80d67532262631a5086f08de)) + - Merge pull request #1971 from GitoxideLabs/new-release ([`8d4c4d1`](https://github.com/GitoxideLabs/gitoxide/commit/8d4c4d1e09f84c962c29d98a686c64228196ac13)) +
+ ## 0.31.0 (2025-04-26) ### Commit Statistics - - 1 commit contributed to the release. + - 3 commits contributed to the release. - 0 commits were understood as [conventional](https://www.conventionalcommits.org). - 0 issues like '(#ID)' were seen in commit messages @@ -22,7 +55,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
view details * **Uncategorized** + - Release gix-date v0.10.1, gix-utils v0.3.0, gix-actor v0.35.1, gix-validate v0.10.0, gix-path v0.10.17, gix-features v0.42.1, gix-hash v0.18.0, gix-hashtable v0.8.1, gix-object v0.49.1, gix-glob v0.20.0, gix-quote v0.6.0, gix-attributes v0.26.0, gix-command v0.6.0, gix-packetline-blocking v0.19.0, gix-filter v0.19.1, gix-fs v0.15.0, gix-commitgraph v0.28.0, gix-revwalk v0.20.1, gix-traverse v0.46.1, gix-worktree-stream v0.21.1, gix-archive v0.21.1, gix-tempfile v17.1.0, gix-lock v17.1.0, gix-index v0.40.0, gix-config-value v0.15.0, gix-pathspec v0.11.0, gix-ignore v0.15.0, gix-worktree v0.41.0, gix-diff v0.52.1, gix-blame v0.2.1, gix-ref v0.52.1, gix-sec v0.11.0, gix-config v0.45.1, gix-prompt v0.11.0, gix-url v0.31.0, gix-credentials v0.29.0, gix-discover v0.40.1, gix-dir v0.14.1, gix-mailmap v0.27.1, gix-revision v0.34.1, gix-merge v0.5.1, gix-negotiate v0.20.1, gix-pack v0.59.1, gix-odb v0.69.1, gix-refspec v0.30.1, gix-shallow v0.4.0, gix-packetline v0.19.0, gix-transport v0.47.0, gix-protocol v0.50.1, gix-status v0.19.1, gix-submodule v0.19.1, gix-worktree-state v0.19.0, gix v0.72.1, gix-fsck v0.11.1, gitoxide-core v0.47.1, gitoxide v0.44.0 ([`e104545`](https://github.com/GitoxideLabs/gitoxide/commit/e104545b78951ca882481d4a58f4425a8bc81c87)) - Bump all prior pratch levels to majors ([`5f7f805`](https://github.com/GitoxideLabs/gitoxide/commit/5f7f80570e1a5522e76ea58cccbb957249a0dffe)) + - Merge pull request #1969 from GitoxideLabs/new-release ([`631f07a`](https://github.com/GitoxideLabs/gitoxide/commit/631f07ad0c1cb93d9da42cf2c8499584fe91880a))
## 0.30.1 (2025-04-25) diff --git a/gix-worktree-state/CHANGELOG.md b/gix-worktree-state/CHANGELOG.md index 132e7dd03f0..9d91682cd2c 100644 --- a/gix-worktree-state/CHANGELOG.md +++ b/gix-worktree-state/CHANGELOG.md @@ -5,13 +5,40 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## Unreleased + +A maintenance release without user-facing changes. + +### Commit Statistics + + + + - 5 commits contributed to the release over the course of 79 calendar days. + - 79 days passed between releases. + - 0 commits were understood as [conventional](https://www.conventionalcommits.org). + - 0 issues like '(#ID)' were seen in commit messages + +### Commit Details + + + +
view details + + * **Uncategorized** + - Merge pull request #2014 from GitoxideLabs/zip ([`648022b`](https://github.com/GitoxideLabs/gitoxide/commit/648022b44e12f597cae55cc45830d0a19b87eb4c)) + - Release gix-glob v0.20.1, gix-attributes v0.26.1, gix-command v0.6.1, gix-filter v0.19.2, gix-worktree-stream v0.21.2, gix-archive v0.21.2 ([`f0ed2cc`](https://github.com/GitoxideLabs/gitoxide/commit/f0ed2cc0046f866e67944bff9aef0579c12d5852)) + - Merge pull request #2009 from GitoxideLabs/release-gix-index ([`c3f06ae`](https://github.com/GitoxideLabs/gitoxide/commit/c3f06ae424ab4e1918a364cabe8276297465a73a)) + - Release gix-path v0.10.18, gix-date v0.10.2, gix-traverse v0.46.2, gix-index v0.40.1 ([`d2b4c44`](https://github.com/GitoxideLabs/gitoxide/commit/d2b4c44fcb2bf43e80d67532262631a5086f08de)) + - Merge pull request #1971 from GitoxideLabs/new-release ([`8d4c4d1`](https://github.com/GitoxideLabs/gitoxide/commit/8d4c4d1e09f84c962c29d98a686c64228196ac13)) +
+ ## 0.19.0 (2025-04-26) ### Commit Statistics - - 1 commit contributed to the release. + - 3 commits contributed to the release. - 0 commits were understood as [conventional](https://www.conventionalcommits.org). - 0 issues like '(#ID)' were seen in commit messages @@ -22,7 +49,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
view details * **Uncategorized** + - Release gix-date v0.10.1, gix-utils v0.3.0, gix-actor v0.35.1, gix-validate v0.10.0, gix-path v0.10.17, gix-features v0.42.1, gix-hash v0.18.0, gix-hashtable v0.8.1, gix-object v0.49.1, gix-glob v0.20.0, gix-quote v0.6.0, gix-attributes v0.26.0, gix-command v0.6.0, gix-packetline-blocking v0.19.0, gix-filter v0.19.1, gix-fs v0.15.0, gix-commitgraph v0.28.0, gix-revwalk v0.20.1, gix-traverse v0.46.1, gix-worktree-stream v0.21.1, gix-archive v0.21.1, gix-tempfile v17.1.0, gix-lock v17.1.0, gix-index v0.40.0, gix-config-value v0.15.0, gix-pathspec v0.11.0, gix-ignore v0.15.0, gix-worktree v0.41.0, gix-diff v0.52.1, gix-blame v0.2.1, gix-ref v0.52.1, gix-sec v0.11.0, gix-config v0.45.1, gix-prompt v0.11.0, gix-url v0.31.0, gix-credentials v0.29.0, gix-discover v0.40.1, gix-dir v0.14.1, gix-mailmap v0.27.1, gix-revision v0.34.1, gix-merge v0.5.1, gix-negotiate v0.20.1, gix-pack v0.59.1, gix-odb v0.69.1, gix-refspec v0.30.1, gix-shallow v0.4.0, gix-packetline v0.19.0, gix-transport v0.47.0, gix-protocol v0.50.1, gix-status v0.19.1, gix-submodule v0.19.1, gix-worktree-state v0.19.0, gix v0.72.1, gix-fsck v0.11.1, gitoxide-core v0.47.1, gitoxide v0.44.0 ([`e104545`](https://github.com/GitoxideLabs/gitoxide/commit/e104545b78951ca882481d4a58f4425a8bc81c87)) - Bump all prior pratch levels to majors ([`5f7f805`](https://github.com/GitoxideLabs/gitoxide/commit/5f7f80570e1a5522e76ea58cccbb957249a0dffe)) + - Merge pull request #1969 from GitoxideLabs/new-release ([`631f07a`](https://github.com/GitoxideLabs/gitoxide/commit/631f07ad0c1cb93d9da42cf2c8499584fe91880a))
## 0.18.1 (2025-04-25) diff --git a/gix-worktree-stream/CHANGELOG.md b/gix-worktree-stream/CHANGELOG.md index 9fbb3f99f18..cc95deca803 100644 --- a/gix-worktree-stream/CHANGELOG.md +++ b/gix-worktree-stream/CHANGELOG.md @@ -5,6 +5,31 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## Unreleased + +A maintenance release without user-facing changes. + +### Commit Statistics + + + + - 3 commits contributed to the release over the course of 59 calendar days. + - 59 days passed between releases. + - 0 commits were understood as [conventional](https://www.conventionalcommits.org). + - 0 issues like '(#ID)' were seen in commit messages + +### Commit Details + + + +
view details + + * **Uncategorized** + - Merge pull request #2033 from GitoxideLabs/dependabot/cargo/cargo-b72232998d ([`f8d7c0a`](https://github.com/GitoxideLabs/gitoxide/commit/f8d7c0ad8fa7745c973c6b87e7eee70831300207)) + - Bump the cargo group with 56 updates ([`151e3a5`](https://github.com/GitoxideLabs/gitoxide/commit/151e3a5cca06444eea4c6a362649e66c831673d6)) + - Merge pull request #2014 from GitoxideLabs/zip ([`648022b`](https://github.com/GitoxideLabs/gitoxide/commit/648022b44e12f597cae55cc45830d0a19b87eb4c)) +
+ ## 0.21.2 (2025-05-16) A maintenance release without user-facing changes. @@ -13,7 +38,7 @@ A maintenance release without user-facing changes. - - 4 commits contributed to the release over the course of 20 calendar days. + - 5 commits contributed to the release over the course of 20 calendar days. - 20 days passed between releases. - 0 commits were understood as [conventional](https://www.conventionalcommits.org). - 0 issues like '(#ID)' were seen in commit messages @@ -25,6 +50,7 @@ A maintenance release without user-facing changes.
view details * **Uncategorized** + - Release gix-glob v0.20.1, gix-attributes v0.26.1, gix-command v0.6.1, gix-filter v0.19.2, gix-worktree-stream v0.21.2, gix-archive v0.21.2 ([`f0ed2cc`](https://github.com/GitoxideLabs/gitoxide/commit/f0ed2cc0046f866e67944bff9aef0579c12d5852)) - Update changelogs prior to release ([`31b86ee`](https://github.com/GitoxideLabs/gitoxide/commit/31b86ee6774ad6762f941aa0e8377e709bd41f5e)) - Merge pull request #2009 from GitoxideLabs/release-gix-index ([`c3f06ae`](https://github.com/GitoxideLabs/gitoxide/commit/c3f06ae424ab4e1918a364cabe8276297465a73a)) - Release gix-path v0.10.18, gix-date v0.10.2, gix-traverse v0.46.2, gix-index v0.40.1 ([`d2b4c44`](https://github.com/GitoxideLabs/gitoxide/commit/d2b4c44fcb2bf43e80d67532262631a5086f08de)) diff --git a/gix-worktree/CHANGELOG.md b/gix-worktree/CHANGELOG.md index c65a15f352f..335d33328ed 100644 --- a/gix-worktree/CHANGELOG.md +++ b/gix-worktree/CHANGELOG.md @@ -5,13 +5,46 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## Unreleased + +### New Features (BREAKING) + + - Pattern parser in is now stateful to allow options for how to parse ignore patterns. + That way it can support settings and other state that affect parsing. + This affects various crates which are all marked as breaking now. + +### Commit Statistics + + + + - 7 commits contributed to the release over the course of 79 calendar days. + - 79 days passed between releases. + - 1 commit was understood as [conventional](https://www.conventionalcommits.org). + - 0 issues like '(#ID)' were seen in commit messages + +### Commit Details + + + +
view details + + * **Uncategorized** + - Merge pull request #2019 from GitoxideLabs/precious-opt-in ([`5f9de52`](https://github.com/GitoxideLabs/gitoxide/commit/5f9de52cf286163b503047b1ab3b51dfa093b4d4)) + - Pattern parser in is now stateful to allow options for how to parse ignore patterns. ([`828e903`](https://github.com/GitoxideLabs/gitoxide/commit/828e9035a40796f79650cf5e3becb8d8e5e29883)) + - Merge pull request #2014 from GitoxideLabs/zip ([`648022b`](https://github.com/GitoxideLabs/gitoxide/commit/648022b44e12f597cae55cc45830d0a19b87eb4c)) + - Release gix-glob v0.20.1, gix-attributes v0.26.1, gix-command v0.6.1, gix-filter v0.19.2, gix-worktree-stream v0.21.2, gix-archive v0.21.2 ([`f0ed2cc`](https://github.com/GitoxideLabs/gitoxide/commit/f0ed2cc0046f866e67944bff9aef0579c12d5852)) + - Merge pull request #2009 from GitoxideLabs/release-gix-index ([`c3f06ae`](https://github.com/GitoxideLabs/gitoxide/commit/c3f06ae424ab4e1918a364cabe8276297465a73a)) + - Release gix-path v0.10.18, gix-date v0.10.2, gix-traverse v0.46.2, gix-index v0.40.1 ([`d2b4c44`](https://github.com/GitoxideLabs/gitoxide/commit/d2b4c44fcb2bf43e80d67532262631a5086f08de)) + - Merge pull request #1971 from GitoxideLabs/new-release ([`8d4c4d1`](https://github.com/GitoxideLabs/gitoxide/commit/8d4c4d1e09f84c962c29d98a686c64228196ac13)) +
+ ## 0.41.0 (2025-04-26) ### Commit Statistics - - 1 commit contributed to the release. + - 3 commits contributed to the release. - 0 commits were understood as [conventional](https://www.conventionalcommits.org). - 0 issues like '(#ID)' were seen in commit messages @@ -22,7 +55,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
view details * **Uncategorized** + - Release gix-date v0.10.1, gix-utils v0.3.0, gix-actor v0.35.1, gix-validate v0.10.0, gix-path v0.10.17, gix-features v0.42.1, gix-hash v0.18.0, gix-hashtable v0.8.1, gix-object v0.49.1, gix-glob v0.20.0, gix-quote v0.6.0, gix-attributes v0.26.0, gix-command v0.6.0, gix-packetline-blocking v0.19.0, gix-filter v0.19.1, gix-fs v0.15.0, gix-commitgraph v0.28.0, gix-revwalk v0.20.1, gix-traverse v0.46.1, gix-worktree-stream v0.21.1, gix-archive v0.21.1, gix-tempfile v17.1.0, gix-lock v17.1.0, gix-index v0.40.0, gix-config-value v0.15.0, gix-pathspec v0.11.0, gix-ignore v0.15.0, gix-worktree v0.41.0, gix-diff v0.52.1, gix-blame v0.2.1, gix-ref v0.52.1, gix-sec v0.11.0, gix-config v0.45.1, gix-prompt v0.11.0, gix-url v0.31.0, gix-credentials v0.29.0, gix-discover v0.40.1, gix-dir v0.14.1, gix-mailmap v0.27.1, gix-revision v0.34.1, gix-merge v0.5.1, gix-negotiate v0.20.1, gix-pack v0.59.1, gix-odb v0.69.1, gix-refspec v0.30.1, gix-shallow v0.4.0, gix-packetline v0.19.0, gix-transport v0.47.0, gix-protocol v0.50.1, gix-status v0.19.1, gix-submodule v0.19.1, gix-worktree-state v0.19.0, gix v0.72.1, gix-fsck v0.11.1, gitoxide-core v0.47.1, gitoxide v0.44.0 ([`e104545`](https://github.com/GitoxideLabs/gitoxide/commit/e104545b78951ca882481d4a58f4425a8bc81c87)) - Bump all prior pratch levels to majors ([`5f7f805`](https://github.com/GitoxideLabs/gitoxide/commit/5f7f80570e1a5522e76ea58cccbb957249a0dffe)) + - Merge pull request #1969 from GitoxideLabs/new-release ([`631f07a`](https://github.com/GitoxideLabs/gitoxide/commit/631f07ad0c1cb93d9da42cf2c8499584fe91880a))
## 0.40.1 (2025-04-25) diff --git a/gix/CHANGELOG.md b/gix/CHANGELOG.md index ff4a1dfc594..1371d56b49a 100644 --- a/gix/CHANGELOG.md +++ b/gix/CHANGELOG.md @@ -5,13 +5,125 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## Unreleased + +### New Features + + - add `repo.references().pseudo()` for traversing refs like `HEAD` and `FETCH_HEAD`. + - add `Repository::committer_or_set_generic_fallback()`. + That way one can always obtain a committer, even though it might + not represent the entity actually committing. + - add `revision::walk::Platform::hide()`. + This finally makes safe traversals possible and is what most people would want to use + instead of `boundary()`. + - add `gitoxide.parsePrecious` configuration key to opt-in to precious file parsing. + - add `Repository::is_empty()` to emulate the similar `git2` API + - add `Repository::merge_bases_many()` for simplified retrieval of multiple mergebases. + - add `tree::EntryRef::to_owned()`. + That way it's in a more reasonable spot as sibling to `Entry` and it's clearer how to convert noe into the other. + - add `EntryRef::kind()` as shortcut for `EntryRef::mode().kind()`. + +### Bug Fixes + + - don't panic if `remote::Connection::ref_map()` doesn't finish the handshake + - `Repository::branch_remote_ref_name()` won't fail on short names anymore. + Instead, these partial names are turned into branch names, which seems more + in line with what Git can do. + - `strict_config` in conjunction with `GIT_WORK_TREE` no longer triggers an error. + +### Other + + - Fixed no_locations options for diffing + +### Bug Fixes (BREAKING) + + - allow querying `Repository::submodules()` in an unborn repository. + It's a breaking change merely because the error type changed. + +### Commit Statistics + + + + - 51 commits contributed to the release over the course of 79 calendar days. + - 79 days passed between releases. + - 13 commits were understood as [conventional](https://www.conventionalcommits.org). + - 2 unique issues were worked on: [#1985](https://github.com/GitoxideLabs/gitoxide/issues/1985), [#2055](https://github.com/GitoxideLabs/gitoxide/issues/2055) + +### Thanks Clippy + + + +[Clippy](https://github.com/rust-lang/rust-clippy) helped 1 time to make code idiomatic. + +### Commit Details + + + +
view details + + * **[#1985](https://github.com/GitoxideLabs/gitoxide/issues/1985)** + - `strict_config` in conjunction with `GIT_WORK_TREE` no longer triggers an error. ([`3f85bf5`](https://github.com/GitoxideLabs/gitoxide/commit/3f85bf5e97cee359264051bb64357361c7a0f33e)) + * **[#2055](https://github.com/GitoxideLabs/gitoxide/issues/2055)** + - Don't panic if `remote::Connection::ref_map()` doesn't finish the handshake ([`427274b`](https://github.com/GitoxideLabs/gitoxide/commit/427274bdf64d30e3bcd330e849ea067e359588fe)) + * **Uncategorized** + - Merge pull request #2061 from orthros/pseudo-refs ([`60c29a5`](https://github.com/GitoxideLabs/gitoxide/commit/60c29a59302bfc9d0be7aab5dd3ef05e4ee8e3fa)) + - Refactor ([`43f92b5`](https://github.com/GitoxideLabs/gitoxide/commit/43f92b5285af6696cd21f0e94f3bec568aef8468)) + - Add `repo.references().pseudo()` for traversing refs like `HEAD` and `FETCH_HEAD`. ([`2affbab`](https://github.com/GitoxideLabs/gitoxide/commit/2affbab7491d6b4667572d4d17db864c5b703c7a)) + - Merge pull request #2071 from cruessler/add-accessors-to-change-ref ([`5335c84`](https://github.com/GitoxideLabs/gitoxide/commit/5335c84a68739adc5a7db31220037c83b7be2429)) + - Adapt to changes in `gix-diff` ([`a0cef8b`](https://github.com/GitoxideLabs/gitoxide/commit/a0cef8bd5351acd334459b115c139a9c75e41f55)) + - Merge pull request #2070 from GitoxideLabs/dependabot/cargo/cargo-827bceb7eb ([`dab97f7`](https://github.com/GitoxideLabs/gitoxide/commit/dab97f7618f160421b6e31de8f3e2f3d11dc2ef2)) + - Bump the cargo group across 1 directory with 68 updates ([`a9a8ea1`](https://github.com/GitoxideLabs/gitoxide/commit/a9a8ea1472532dde03bce4e0afdfa82924af1f96)) + - Merge pull request #2065 from cruessler/add-asset-dir-to-blame-copy-royal ([`3f2be40`](https://github.com/GitoxideLabs/gitoxide/commit/3f2be402e20f7642f89721a6a7b9ce7e833dfce7)) + - Fix CI by not using `-t bad` ([`73a30f8`](https://github.com/GitoxideLabs/gitoxide/commit/73a30f8a91fcf5db1244a9a5388e05f4349b0c2e)) + - Merge pull request #2062 from rickprice/minor_documentation_fixups ([`c2eb0c1`](https://github.com/GitoxideLabs/gitoxide/commit/c2eb0c144dd21cac87fd08829f4a5ca02f85008d)) + - Merge pull request #2057 from GitoxideLabs/improvements ([`e8b7a4e`](https://github.com/GitoxideLabs/gitoxide/commit/e8b7a4e9a0d94236af58e693aab2d1b981166704)) + - Small documentation fixes ([`bfb1c34`](https://github.com/GitoxideLabs/gitoxide/commit/bfb1c34f75997a603b8f85fca75bf9e1ca310be0)) + - Thanks clippy ([`554ce13`](https://github.com/GitoxideLabs/gitoxide/commit/554ce134bc4b514b52a935f17f57f76ebf23ab97)) + - `Repository::branch_remote_ref_name()` won't fail on short names anymore. ([`a75b4a2`](https://github.com/GitoxideLabs/gitoxide/commit/a75b4a2bc0cc602da336421ebcfda11dd36545b7)) + - Merge pull request #2048 from ralphmodales/fetch-without-commiter-config ([`5cf6d05`](https://github.com/GitoxideLabs/gitoxide/commit/5cf6d05e41bf0bf9077be80e158fabc2126d7c7b)) + - Add `Repository::committer_or_set_generic_fallback()`. ([`d7db360`](https://github.com/GitoxideLabs/gitoxide/commit/d7db360d5b42ec9d2b4d9977f7b7bee0f6cc4d58)) + - Add committer fallback for fetch ([`62e4bab`](https://github.com/GitoxideLabs/gitoxide/commit/62e4bab024ee1cdefe4026e35098da8fff18fb0d)) + - Merge pull request #2045 from uberroot4/main ([`298f22e`](https://github.com/GitoxideLabs/gitoxide/commit/298f22ee0086df86e1cae45bcb76cc8b9cad9102)) + - Fixed no_locations options for diffing ([`b7c1f2c`](https://github.com/GitoxideLabs/gitoxide/commit/b7c1f2c25c7485095022fec290492aa4b7c5c5a2)) + - Merge pull request #2037 from GitoxideLabs/hide ([`92febae`](https://github.com/GitoxideLabs/gitoxide/commit/92febae025165c55e596d58511b1634fb6580b9c)) + - Add `revision::walk::Platform::hide()`. ([`a9befb2`](https://github.com/GitoxideLabs/gitoxide/commit/a9befb284dc17d3656cf83859836bc221a42d67e)) + - Merge pull request #2033 from GitoxideLabs/dependabot/cargo/cargo-b72232998d ([`f8d7c0a`](https://github.com/GitoxideLabs/gitoxide/commit/f8d7c0ad8fa7745c973c6b87e7eee70831300207)) + - Bump the cargo group with 56 updates ([`151e3a5`](https://github.com/GitoxideLabs/gitoxide/commit/151e3a5cca06444eea4c6a362649e66c831673d6)) + - Merge pull request #2029 from GitoxideLabs/submodule-all ([`b199c6e`](https://github.com/GitoxideLabs/gitoxide/commit/b199c6eacedad0a0617cfae83541b2e7dfd1cefd)) + - Add a test to assure `subomdule..ignore = all` is handled correctly. ([`657dec4`](https://github.com/GitoxideLabs/gitoxide/commit/657dec4f10bc6babbfa71a4506b1ff1439c06eaf)) + - Merge pull request #2026 from EliahKagan/run-ci/check-msrv-next ([`40f5a56`](https://github.com/GitoxideLabs/gitoxide/commit/40f5a56937ecdd9ecebd5e2d1f28c31d9f6b1b70)) + - Use `gix` manifest `rust-version` in all MSRV checks ([`654a8fa`](https://github.com/GitoxideLabs/gitoxide/commit/654a8fa1a84ac0b9b872aa09b4cbd3cf94157d6f)) + - Merge pull request #2019 from GitoxideLabs/precious-opt-in ([`5f9de52`](https://github.com/GitoxideLabs/gitoxide/commit/5f9de52cf286163b503047b1ab3b51dfa093b4d4)) + - Adapt to changes in `gix-ignore` and `gix-glob`, and more. ([`4ef7806`](https://github.com/GitoxideLabs/gitoxide/commit/4ef7806e62954d069861bddb06cb8c0baf47bb69)) + - Add `gitoxide.parsePrecious` configuration key to opt-in to precious file parsing. ([`85a24b3`](https://github.com/GitoxideLabs/gitoxide/commit/85a24b3a07f08bc83a3ef34c3f07ed00cdbd9fe2)) + - Merge pull request #2016 from GitoxideLabs/improvements ([`7ae3797`](https://github.com/GitoxideLabs/gitoxide/commit/7ae3797f19cf2dd3bc3e02a6437643e5f50ed338)) + - Add `Repository::is_empty()` to emulate the similar `git2` API ([`b985766`](https://github.com/GitoxideLabs/gitoxide/commit/b985766c9c9c5eb09ea4c4b17be9e380bfdad9b4)) + - Allow querying `Repository::submodules()` in an unborn repository. ([`26ae766`](https://github.com/GitoxideLabs/gitoxide/commit/26ae766b182218151ae4c3f30306b6d41bab358a)) + - Merge pull request #2014 from GitoxideLabs/zip ([`648022b`](https://github.com/GitoxideLabs/gitoxide/commit/648022b44e12f597cae55cc45830d0a19b87eb4c)) + - Release gix-glob v0.20.1, gix-attributes v0.26.1, gix-command v0.6.1, gix-filter v0.19.2, gix-worktree-stream v0.21.2, gix-archive v0.21.2 ([`f0ed2cc`](https://github.com/GitoxideLabs/gitoxide/commit/f0ed2cc0046f866e67944bff9aef0579c12d5852)) + - Merge pull request #2009 from GitoxideLabs/release-gix-index ([`c3f06ae`](https://github.com/GitoxideLabs/gitoxide/commit/c3f06ae424ab4e1918a364cabe8276297465a73a)) + - Release gix-path v0.10.18, gix-date v0.10.2, gix-traverse v0.46.2, gix-index v0.40.1 ([`d2b4c44`](https://github.com/GitoxideLabs/gitoxide/commit/d2b4c44fcb2bf43e80d67532262631a5086f08de)) + - Merge pull request #2000 from GitoxideLabs/improvements ([`fdfb239`](https://github.com/GitoxideLabs/gitoxide/commit/fdfb2398d09fa496b1daa8e7318acfc40a3bd3f7)) + - Add `Repository::merge_bases_many()` for simplified retrieval of multiple mergebases. ([`f687cb1`](https://github.com/GitoxideLabs/gitoxide/commit/f687cb16676dcae37db517c5d6905be08cd9395a)) + - Merge pull request #1993 from EliahKagan/run-ci/baseline ([`7a33e2a`](https://github.com/GitoxideLabs/gitoxide/commit/7a33e2a0496e3456fcda09428f37c20907a015bb)) + - Completely remove `:/` baseline skip ([`b623bf1`](https://github.com/GitoxideLabs/gitoxide/commit/b623bf1802474d92dbd0b63856c0b3b1f664e8d7)) + - Flip `:/` baseline skip from CI to local and extend ([`2400158`](https://github.com/GitoxideLabs/gitoxide/commit/2400158d6ce2ff28d428402f2d4030c04cd5f470)) + - Merge pull request #1987 from GitoxideLabs/fix-1985 ([`189d1a0`](https://github.com/GitoxideLabs/gitoxide/commit/189d1a0a8674e52e9ad2393fc296f3231e85e689)) + - Merge pull request #1975 from GitoxideLabs/improvements ([`28935a5`](https://github.com/GitoxideLabs/gitoxide/commit/28935a56ff91f1fc2c17a7d23b057cf7119144e9)) + - Add `tree::EntryRef::to_owned()`. ([`3a5068e`](https://github.com/GitoxideLabs/gitoxide/commit/3a5068eb3f9e112cf21c4c6a8bd17aa3081c5edf)) + - Merge pull request #1977 from GitoxideLabs/dependabot/cargo/cargo-811d7b929d ([`800738a`](https://github.com/GitoxideLabs/gitoxide/commit/800738a37f3d33926a427edfa294423bbe3f2b66)) + - Bump the cargo group with 12 updates ([`4408166`](https://github.com/GitoxideLabs/gitoxide/commit/4408166bf56197a67419277a4ef8feeba9060fee)) + - Add `EntryRef::kind()` as shortcut for `EntryRef::mode().kind()`. ([`3ef6b55`](https://github.com/GitoxideLabs/gitoxide/commit/3ef6b5595f6d71d27a00b178fbe356257fe4b8a5)) + - Merge pull request #1971 from GitoxideLabs/new-release ([`8d4c4d1`](https://github.com/GitoxideLabs/gitoxide/commit/8d4c4d1e09f84c962c29d98a686c64228196ac13)) +
+ ## 0.72.1 (2025-04-26) ### Commit Statistics - - 1 commit contributed to the release. + - 3 commits contributed to the release. - 0 commits were understood as [conventional](https://www.conventionalcommits.org). - 0 issues like '(#ID)' were seen in commit messages @@ -22,7 +134,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
view details * **Uncategorized** + - Release gix-date v0.10.1, gix-utils v0.3.0, gix-actor v0.35.1, gix-validate v0.10.0, gix-path v0.10.17, gix-features v0.42.1, gix-hash v0.18.0, gix-hashtable v0.8.1, gix-object v0.49.1, gix-glob v0.20.0, gix-quote v0.6.0, gix-attributes v0.26.0, gix-command v0.6.0, gix-packetline-blocking v0.19.0, gix-filter v0.19.1, gix-fs v0.15.0, gix-commitgraph v0.28.0, gix-revwalk v0.20.1, gix-traverse v0.46.1, gix-worktree-stream v0.21.1, gix-archive v0.21.1, gix-tempfile v17.1.0, gix-lock v17.1.0, gix-index v0.40.0, gix-config-value v0.15.0, gix-pathspec v0.11.0, gix-ignore v0.15.0, gix-worktree v0.41.0, gix-diff v0.52.1, gix-blame v0.2.1, gix-ref v0.52.1, gix-sec v0.11.0, gix-config v0.45.1, gix-prompt v0.11.0, gix-url v0.31.0, gix-credentials v0.29.0, gix-discover v0.40.1, gix-dir v0.14.1, gix-mailmap v0.27.1, gix-revision v0.34.1, gix-merge v0.5.1, gix-negotiate v0.20.1, gix-pack v0.59.1, gix-odb v0.69.1, gix-refspec v0.30.1, gix-shallow v0.4.0, gix-packetline v0.19.0, gix-transport v0.47.0, gix-protocol v0.50.1, gix-status v0.19.1, gix-submodule v0.19.1, gix-worktree-state v0.19.0, gix v0.72.1, gix-fsck v0.11.1, gitoxide-core v0.47.1, gitoxide v0.44.0 ([`e104545`](https://github.com/GitoxideLabs/gitoxide/commit/e104545b78951ca882481d4a58f4425a8bc81c87)) - Bump all prior pratch levels to majors ([`5f7f805`](https://github.com/GitoxideLabs/gitoxide/commit/5f7f80570e1a5522e76ea58cccbb957249a0dffe)) + - Merge pull request #1969 from GitoxideLabs/new-release ([`631f07a`](https://github.com/GitoxideLabs/gitoxide/commit/631f07ad0c1cb93d9da42cf2c8499584fe91880a))
## 0.72.0 (2025-04-25) From 5a919c48393020d47c7034946108577dd213b80a Mon Sep 17 00:00:00 2001 From: Sebastian Thiel Date: Tue, 15 Jul 2025 05:30:53 +0200 Subject: [PATCH 166/166] Release gix-date v0.10.3, gix-actor v0.35.2, gix-trace v0.1.13, gix-path v0.10.19, gix-features v0.43.0, gix-hash v0.19.0, gix-hashtable v0.9.0, gix-object v0.50.0, gix-glob v0.21.0, gix-attributes v0.27.0, gix-command v0.6.2, gix-packetline-blocking v0.19.1, gix-filter v0.20.0, gix-fs v0.16.0, gix-commitgraph v0.29.0, gix-revwalk v0.21.0, gix-traverse v0.47.0, gix-worktree-stream v0.22.0, gix-archive v0.22.0, gix-tempfile v18.0.0, gix-lock v18.0.0, gix-index v0.41.0, gix-config-value v0.15.1, gix-pathspec v0.12.0, gix-ignore v0.16.0, gix-worktree v0.42.0, gix-diff v0.53.0, gix-blame v0.3.0, gix-ref v0.53.0, gix-sec v0.12.0, gix-config v0.46.0, gix-prompt v0.11.1, gix-url v0.32.0, gix-credentials v0.30.0, gix-discover v0.41.0, gix-dir v0.15.0, gix-mailmap v0.27.2, gix-revision v0.35.0, gix-merge v0.6.0, gix-negotiate v0.21.0, gix-pack v0.60.0, gix-odb v0.70.0, gix-refspec v0.31.0, gix-shallow v0.5.0, gix-packetline v0.19.1, gix-transport v0.48.0, gix-protocol v0.51.0, gix-status v0.20.0, gix-submodule v0.20.0, gix-worktree-state v0.20.0, gix v0.73.0, gix-fsck v0.12.0, gitoxide-core v0.48.0, gitoxide v0.45.0, safety bump 43 crates SAFETY BUMP: gix-hash v0.19.0, gix-hashtable v0.9.0, gix-object v0.50.0, gix-glob v0.21.0, gix-attributes v0.27.0, gix-filter v0.20.0, gix-fs v0.16.0, gix-commitgraph v0.29.0, gix-revwalk v0.21.0, gix-traverse v0.47.0, gix-worktree-stream v0.22.0, gix-archive v0.22.0, gix-tempfile v18.0.0, gix-lock v18.0.0, gix-index v0.41.0, gix-pathspec v0.12.0, gix-ignore v0.16.0, gix-worktree v0.42.0, gix-diff v0.53.0, gix-blame v0.3.0, gix-ref v0.53.0, gix-config v0.46.0, gix-url v0.32.0, gix-credentials v0.30.0, gix-discover v0.41.0, gix-dir v0.15.0, gix-revision v0.35.0, gix-merge v0.6.0, gix-negotiate v0.21.0, gix-pack v0.60.0, gix-odb v0.70.0, gix-refspec v0.31.0, gix-shallow v0.5.0, gix-transport v0.48.0, gix-protocol v0.51.0, gix-status v0.20.0, gix-submodule v0.20.0, gix-worktree-state v0.20.0, gix v0.73.0, gix-fsck v0.12.0, gitoxide-core v0.48.0, gitoxide v0.45.0, gix-testtools v0.17.0 --- CHANGELOG.md | 2 +- Cargo.lock | 110 +++++++++++++-------------- Cargo.toml | 8 +- gitoxide-core/CHANGELOG.md | 5 +- gitoxide-core/Cargo.toml | 16 ++-- gix-actor/CHANGELOG.md | 5 +- gix-actor/Cargo.toml | 4 +- gix-archive/CHANGELOG.md | 5 +- gix-archive/Cargo.toml | 10 +-- gix-attributes/CHANGELOG.md | 5 +- gix-attributes/Cargo.toml | 8 +- gix-blame/CHANGELOG.md | 5 +- gix-blame/Cargo.toml | 20 ++--- gix-command/CHANGELOG.md | 5 +- gix-command/Cargo.toml | 6 +- gix-commitgraph/CHANGELOG.md | 5 +- gix-commitgraph/Cargo.toml | 4 +- gix-config-value/CHANGELOG.md | 5 +- gix-config-value/Cargo.toml | 4 +- gix-config/CHANGELOG.md | 25 +++++- gix-config/Cargo.toml | 14 ++-- gix-credentials/CHANGELOG.md | 5 +- gix-credentials/Cargo.toml | 18 ++--- gix-date/CHANGELOG.md | 5 +- gix-date/Cargo.toml | 2 +- gix-diff/CHANGELOG.md | 5 +- gix-diff/Cargo.toml | 28 +++---- gix-dir/CHANGELOG.md | 5 +- gix-dir/Cargo.toml | 20 ++--- gix-discover/CHANGELOG.md | 5 +- gix-discover/Cargo.toml | 12 +-- gix-features/CHANGELOG.md | 9 ++- gix-features/Cargo.toml | 6 +- gix-filter/CHANGELOG.md | 5 +- gix-filter/Cargo.toml | 16 ++-- gix-fs/CHANGELOG.md | 5 +- gix-fs/Cargo.toml | 6 +- gix-fsck/CHANGELOG.md | 5 +- gix-fsck/Cargo.toml | 8 +- gix-glob/CHANGELOG.md | 5 +- gix-glob/Cargo.toml | 6 +- gix-hash/CHANGELOG.md | 5 +- gix-hash/Cargo.toml | 4 +- gix-hashtable/CHANGELOG.md | 7 +- gix-hashtable/Cargo.toml | 4 +- gix-ignore/CHANGELOG.md | 5 +- gix-ignore/Cargo.toml | 8 +- gix-index/CHANGELOG.md | 5 +- gix-index/Cargo.toml | 14 ++-- gix-lock/CHANGELOG.md | 5 +- gix-lock/Cargo.toml | 4 +- gix-mailmap/CHANGELOG.md | 5 +- gix-mailmap/Cargo.toml | 6 +- gix-merge/CHANGELOG.md | 5 +- gix-merge/Cargo.toml | 28 +++---- gix-negotiate/CHANGELOG.md | 5 +- gix-negotiate/Cargo.toml | 12 +-- gix-object/CHANGELOG.md | 5 +- gix-object/Cargo.toml | 14 ++-- gix-odb/CHANGELOG.md | 5 +- gix-odb/Cargo.toml | 18 ++--- gix-pack/CHANGELOG.md | 7 +- gix-pack/Cargo.toml | 18 ++--- gix-packetline-blocking/CHANGELOG.md | 5 +- gix-packetline-blocking/Cargo.toml | 4 +- gix-packetline/CHANGELOG.md | 5 +- gix-packetline/Cargo.toml | 4 +- gix-path/CHANGELOG.md | 16 +++- gix-path/Cargo.toml | 4 +- gix-pathspec/CHANGELOG.md | 5 +- gix-pathspec/Cargo.toml | 10 +-- gix-prompt/CHANGELOG.md | 5 +- gix-prompt/Cargo.toml | 6 +- gix-protocol/CHANGELOG.md | 5 +- gix-protocol/Cargo.toml | 30 ++++---- gix-ref/CHANGELOG.md | 5 +- gix-ref/Cargo.toml | 18 ++--- gix-refspec/CHANGELOG.md | 5 +- gix-refspec/Cargo.toml | 6 +- gix-revision/CHANGELOG.md | 5 +- gix-revision/Cargo.toml | 16 ++-- gix-revwalk/CHANGELOG.md | 5 +- gix-revwalk/Cargo.toml | 12 +-- gix-sec/CHANGELOG.md | 5 +- gix-sec/Cargo.toml | 4 +- gix-shallow/CHANGELOG.md | 5 +- gix-shallow/Cargo.toml | 6 +- gix-status/CHANGELOG.md | 5 +- gix-status/Cargo.toml | 26 +++---- gix-submodule/CHANGELOG.md | 5 +- gix-submodule/Cargo.toml | 12 +-- gix-tempfile/CHANGELOG.md | 5 +- gix-tempfile/Cargo.toml | 4 +- gix-trace/CHANGELOG.md | 5 +- gix-trace/Cargo.toml | 2 +- gix-transport/CHANGELOG.md | 5 +- gix-transport/Cargo.toml | 14 ++-- gix-traverse/CHANGELOG.md | 5 +- gix-traverse/Cargo.toml | 14 ++-- gix-url/CHANGELOG.md | 5 +- gix-url/Cargo.toml | 6 +- gix-worktree-state/CHANGELOG.md | 5 +- gix-worktree-state/Cargo.toml | 20 ++--- gix-worktree-stream/CHANGELOG.md | 5 +- gix-worktree-stream/Cargo.toml | 18 ++--- gix-worktree/CHANGELOG.md | 5 +- gix-worktree/Cargo.toml | 20 ++--- gix/CHANGELOG.md | 7 +- gix/Cargo.toml | 102 ++++++++++++------------- tests/it/Cargo.toml | 2 +- tests/tools/Cargo.toml | 12 +-- 111 files changed, 613 insertions(+), 523 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 70adf625851..1beae24740e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,7 +5,7 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## Unreleased +## 0.45.0 (2025-07-15) ### New Features diff --git a/Cargo.lock b/Cargo.lock index a809a7fba01..729c8a61507 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1302,7 +1302,7 @@ checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" [[package]] name = "gitoxide" -version = "0.44.0" +version = "0.45.0" dependencies = [ "anyhow", "clap", @@ -1326,7 +1326,7 @@ dependencies = [ [[package]] name = "gitoxide-core" -version = "0.47.1" +version = "0.48.0" dependencies = [ "anyhow", "async-io", @@ -1364,7 +1364,7 @@ dependencies = [ [[package]] name = "gix" -version = "0.72.1" +version = "0.73.0" dependencies = [ "anyhow", "async-std", @@ -1438,7 +1438,7 @@ dependencies = [ [[package]] name = "gix-actor" -version = "0.35.1" +version = "0.35.2" dependencies = [ "bstr", "document-features", @@ -1455,7 +1455,7 @@ dependencies = [ [[package]] name = "gix-archive" -version = "0.21.2" +version = "0.22.0" dependencies = [ "bstr", "document-features", @@ -1478,7 +1478,7 @@ dependencies = [ [[package]] name = "gix-attributes" -version = "0.26.1" +version = "0.27.0" dependencies = [ "bstr", "document-features", @@ -1505,7 +1505,7 @@ dependencies = [ [[package]] name = "gix-blame" -version = "0.2.1" +version = "0.3.0" dependencies = [ "gix-commitgraph", "gix-date", @@ -1536,7 +1536,7 @@ dependencies = [ [[package]] name = "gix-command" -version = "0.6.1" +version = "0.6.2" dependencies = [ "bstr", "gix-path", @@ -1549,7 +1549,7 @@ dependencies = [ [[package]] name = "gix-commitgraph" -version = "0.28.0" +version = "0.29.0" dependencies = [ "bstr", "document-features", @@ -1564,7 +1564,7 @@ dependencies = [ [[package]] name = "gix-config" -version = "0.45.1" +version = "0.46.0" dependencies = [ "bstr", "criterion", @@ -1601,7 +1601,7 @@ dependencies = [ [[package]] name = "gix-config-value" -version = "0.15.0" +version = "0.15.1" dependencies = [ "bitflags 2.9.1", "bstr", @@ -1614,7 +1614,7 @@ dependencies = [ [[package]] name = "gix-credentials" -version = "0.29.0" +version = "0.30.0" dependencies = [ "bstr", "document-features", @@ -1634,7 +1634,7 @@ dependencies = [ [[package]] name = "gix-date" -version = "0.10.2" +version = "0.10.3" dependencies = [ "bstr", "document-features", @@ -1651,7 +1651,7 @@ dependencies = [ [[package]] name = "gix-diff" -version = "0.52.1" +version = "0.53.0" dependencies = [ "bstr", "document-features", @@ -1696,7 +1696,7 @@ dependencies = [ [[package]] name = "gix-dir" -version = "0.14.1" +version = "0.15.0" dependencies = [ "bstr", "gix-discover", @@ -1716,7 +1716,7 @@ dependencies = [ [[package]] name = "gix-discover" -version = "0.40.1" +version = "0.41.0" dependencies = [ "bstr", "defer", @@ -1735,7 +1735,7 @@ dependencies = [ [[package]] name = "gix-features" -version = "0.42.1" +version = "0.43.0" dependencies = [ "bstr", "bytes", @@ -1761,7 +1761,7 @@ version = "0.0.0" [[package]] name = "gix-filter" -version = "0.19.2" +version = "0.20.0" dependencies = [ "bstr", "encoding_rs", @@ -1783,7 +1783,7 @@ dependencies = [ [[package]] name = "gix-fs" -version = "0.15.0" +version = "0.16.0" dependencies = [ "bstr", "crossbeam-channel", @@ -1799,7 +1799,7 @@ dependencies = [ [[package]] name = "gix-fsck" -version = "0.11.1" +version = "0.12.0" dependencies = [ "gix-hash", "gix-hashtable", @@ -1810,7 +1810,7 @@ dependencies = [ [[package]] name = "gix-glob" -version = "0.20.1" +version = "0.21.0" dependencies = [ "bitflags 2.9.1", "bstr", @@ -1823,7 +1823,7 @@ dependencies = [ [[package]] name = "gix-hash" -version = "0.18.0" +version = "0.19.0" dependencies = [ "document-features", "faster-hex", @@ -1836,7 +1836,7 @@ dependencies = [ [[package]] name = "gix-hashtable" -version = "0.8.1" +version = "0.9.0" dependencies = [ "gix-hash", "hashbrown 0.15.4", @@ -1845,7 +1845,7 @@ dependencies = [ [[package]] name = "gix-ignore" -version = "0.15.0" +version = "0.16.0" dependencies = [ "bstr", "document-features", @@ -1860,7 +1860,7 @@ dependencies = [ [[package]] name = "gix-index" -version = "0.40.1" +version = "0.41.0" dependencies = [ "bitflags 2.9.1", "bstr", @@ -1907,7 +1907,7 @@ version = "0.0.0" [[package]] name = "gix-lock" -version = "17.1.0" +version = "18.0.0" dependencies = [ "gix-tempfile", "gix-utils", @@ -1927,7 +1927,7 @@ dependencies = [ [[package]] name = "gix-mailmap" -version = "0.27.1" +version = "0.27.2" dependencies = [ "bstr", "document-features", @@ -1940,7 +1940,7 @@ dependencies = [ [[package]] name = "gix-merge" -version = "0.5.1" +version = "0.6.0" dependencies = [ "bstr", "document-features", @@ -1970,7 +1970,7 @@ dependencies = [ [[package]] name = "gix-negotiate" -version = "0.20.1" +version = "0.21.0" dependencies = [ "bitflags 2.9.1", "gix-commitgraph", @@ -1991,7 +1991,7 @@ version = "0.0.0" [[package]] name = "gix-object" -version = "0.49.1" +version = "0.50.0" dependencies = [ "bstr", "criterion", @@ -2017,7 +2017,7 @@ dependencies = [ [[package]] name = "gix-odb" -version = "0.69.1" +version = "0.70.0" dependencies = [ "arc-swap", "document-features", @@ -2056,7 +2056,7 @@ dependencies = [ [[package]] name = "gix-pack" -version = "0.59.1" +version = "0.60.0" dependencies = [ "clru", "document-features", @@ -2096,7 +2096,7 @@ dependencies = [ [[package]] name = "gix-packetline" -version = "0.19.0" +version = "0.19.1" dependencies = [ "async-std", "bstr", @@ -2116,7 +2116,7 @@ dependencies = [ [[package]] name = "gix-packetline-blocking" -version = "0.19.0" +version = "0.19.1" dependencies = [ "bstr", "document-features", @@ -2128,7 +2128,7 @@ dependencies = [ [[package]] name = "gix-path" -version = "0.10.18" +version = "0.10.19" dependencies = [ "bstr", "gix-testtools", @@ -2145,7 +2145,7 @@ dependencies = [ [[package]] name = "gix-pathspec" -version = "0.11.0" +version = "0.12.0" dependencies = [ "bitflags 2.9.1", "bstr", @@ -2161,7 +2161,7 @@ dependencies = [ [[package]] name = "gix-prompt" -version = "0.11.0" +version = "0.11.1" dependencies = [ "expectrl", "gix-command", @@ -2175,7 +2175,7 @@ dependencies = [ [[package]] name = "gix-protocol" -version = "0.50.1" +version = "0.51.0" dependencies = [ "async-std", "async-trait", @@ -2219,7 +2219,7 @@ version = "0.0.0" [[package]] name = "gix-ref" -version = "0.52.1" +version = "0.53.0" dependencies = [ "document-features", "gix-actor", @@ -2261,7 +2261,7 @@ dependencies = [ [[package]] name = "gix-refspec" -version = "0.30.1" +version = "0.31.0" dependencies = [ "bstr", "gix-hash", @@ -2274,7 +2274,7 @@ dependencies = [ [[package]] name = "gix-revision" -version = "0.34.1" +version = "0.35.0" dependencies = [ "bitflags 2.9.1", "bstr", @@ -2295,7 +2295,7 @@ dependencies = [ [[package]] name = "gix-revwalk" -version = "0.20.1" +version = "0.21.0" dependencies = [ "gix-commitgraph", "gix-date", @@ -2309,7 +2309,7 @@ dependencies = [ [[package]] name = "gix-sec" -version = "0.11.0" +version = "0.12.0" dependencies = [ "bitflags 2.9.1", "document-features", @@ -2326,7 +2326,7 @@ version = "0.0.0" [[package]] name = "gix-shallow" -version = "0.4.0" +version = "0.5.0" dependencies = [ "bstr", "gix-hash", @@ -2337,7 +2337,7 @@ dependencies = [ [[package]] name = "gix-status" -version = "0.19.1" +version = "0.20.0" dependencies = [ "bstr", "document-features", @@ -2382,7 +2382,7 @@ dependencies = [ [[package]] name = "gix-submodule" -version = "0.19.1" +version = "0.20.0" dependencies = [ "bstr", "gix-config", @@ -2397,7 +2397,7 @@ dependencies = [ [[package]] name = "gix-tempfile" -version = "17.1.0" +version = "18.0.0" dependencies = [ "dashmap", "document-features", @@ -2412,7 +2412,7 @@ dependencies = [ [[package]] name = "gix-testtools" -version = "0.16.1" +version = "0.17.0" dependencies = [ "bstr", "crc", @@ -2441,7 +2441,7 @@ version = "0.0.0" [[package]] name = "gix-trace" -version = "0.1.12" +version = "0.1.13" dependencies = [ "document-features", "tracing-core", @@ -2449,7 +2449,7 @@ dependencies = [ [[package]] name = "gix-transport" -version = "0.47.0" +version = "0.48.0" dependencies = [ "async-std", "async-trait", @@ -2478,7 +2478,7 @@ dependencies = [ [[package]] name = "gix-traverse" -version = "0.46.2" +version = "0.47.0" dependencies = [ "bitflags 2.9.1", "gix-commitgraph", @@ -2511,7 +2511,7 @@ version = "0.0.0" [[package]] name = "gix-url" -version = "0.31.0" +version = "0.32.0" dependencies = [ "assert_matches", "bstr", @@ -2545,7 +2545,7 @@ dependencies = [ [[package]] name = "gix-worktree" -version = "0.41.0" +version = "0.42.0" dependencies = [ "bstr", "document-features", @@ -2564,7 +2564,7 @@ dependencies = [ [[package]] name = "gix-worktree-state" -version = "0.19.0" +version = "0.20.0" dependencies = [ "bstr", "gix-features", @@ -2601,7 +2601,7 @@ dependencies = [ [[package]] name = "gix-worktree-stream" -version = "0.21.2" +version = "0.22.0" dependencies = [ "gix-attributes", "gix-features", diff --git a/Cargo.toml b/Cargo.toml index a9e1f0ae63a..913f727b4bc 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,7 +7,7 @@ repository = "https://github.com/GitoxideLabs/gitoxide" authors = ["Sebastian Thiel "] edition = "2021" license = "MIT OR Apache-2.0" -version = "0.44.0" +version = "0.45.0" rust-version = "1.74" default-run = "gix" include = ["src/**/*", "/build.rs", "LICENSE-*", "README.md"] @@ -151,9 +151,9 @@ gitoxide-core-async-client = ["gitoxide-core/async-client", "futures-lite"] [dependencies] anyhow = "1.0.98" -gitoxide-core = { version = "^0.47.1", path = "gitoxide-core" } -gix-features = { version = "^0.42.1", path = "gix-features" } -gix = { version = "^0.72.1", path = "gix", default-features = false } +gitoxide-core = { version = "^0.48.0", path = "gitoxide-core" } +gix-features = { version = "^0.43.0", path = "gix-features" } +gix = { version = "^0.73.0", path = "gix", default-features = false } clap = { version = "4.5.40", features = ["derive", "cargo"] } clap_complete = "4.5.54" diff --git a/gitoxide-core/CHANGELOG.md b/gitoxide-core/CHANGELOG.md index 3aef71c62f5..00679072d60 100644 --- a/gitoxide-core/CHANGELOG.md +++ b/gitoxide-core/CHANGELOG.md @@ -5,7 +5,7 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## Unreleased +## 0.48.0 (2025-07-15) ### New Features @@ -23,7 +23,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - - 25 commits contributed to the release over the course of 79 calendar days. + - 26 commits contributed to the release over the course of 79 calendar days. - 79 days passed between releases. - 4 commits were understood as [conventional](https://www.conventionalcommits.org). - 0 issues like '(#ID)' were seen in commit messages @@ -41,6 +41,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
view details * **Uncategorized** + - Update changelogs prior to release ([`65037b5`](https://github.com/GitoxideLabs/gitoxide/commit/65037b56918b90ac07454a815b0ed136df2fca3b)) - `gix submodule list` now prints the submodule path in debug mode ([`a8b5751`](https://github.com/GitoxideLabs/gitoxide/commit/a8b5751369234b29199f035b98d4fb36183fced7)) - Merge pull request #2073 from cruessler/add-tag-list ([`c7af04d`](https://github.com/GitoxideLabs/gitoxide/commit/c7af04db9b6bb1204e0f4c436d1db8f48a491e86)) - Refactor ([`750ae9b`](https://github.com/GitoxideLabs/gitoxide/commit/750ae9bc3cf72c1d9a358307e423523324eb25fb)) diff --git a/gitoxide-core/Cargo.toml b/gitoxide-core/Cargo.toml index 8769ace145a..82d80486002 100644 --- a/gitoxide-core/Cargo.toml +++ b/gitoxide-core/Cargo.toml @@ -4,7 +4,7 @@ lints.workspace = true name = "gitoxide-core" description = "The library implementing all capabilities of the gitoxide CLI" repository = "https://github.com/GitoxideLabs/gitoxide" -version = "0.47.1" +version = "0.48.0" authors = ["Sebastian Thiel "] license = "MIT OR Apache-2.0" edition = "2021" @@ -49,12 +49,12 @@ serde = ["gix/serde", "dep:serde_json", "dep:serde", "bytesize/serde"] [dependencies] # deselect everything else (like "performance") as this should be controllable by the parent application. -gix = { version = "^0.72.1", path = "../gix", default-features = false, features = ["merge", "blob-diff", "blame", "revision", "mailmap", "excludes", "attributes", "worktree-mutation", "credentials", "interrupt", "status", "dirwalk"] } -gix-pack-for-configuration-only = { package = "gix-pack", version = "^0.59.1", path = "../gix-pack", default-features = false, features = ["pack-cache-lru-dynamic", "pack-cache-lru-static", "generate", "streaming-input"] } -gix-transport-configuration-only = { package = "gix-transport", version = "^0.47.0", path = "../gix-transport", default-features = false } -gix-archive-for-configuration-only = { package = "gix-archive", version = "^0.21.2", path = "../gix-archive", optional = true, features = ["tar", "tar_gz"] } -gix-status = { version = "^0.19.1", path = "../gix-status" } -gix-fsck = { version = "^0.11.1", path = "../gix-fsck" } +gix = { version = "^0.73.0", path = "../gix", default-features = false, features = ["merge", "blob-diff", "blame", "revision", "mailmap", "excludes", "attributes", "worktree-mutation", "credentials", "interrupt", "status", "dirwalk"] } +gix-pack-for-configuration-only = { package = "gix-pack", version = "^0.60.0", path = "../gix-pack", default-features = false, features = ["pack-cache-lru-dynamic", "pack-cache-lru-static", "generate", "streaming-input"] } +gix-transport-configuration-only = { package = "gix-transport", version = "^0.48.0", path = "../gix-transport", default-features = false } +gix-archive-for-configuration-only = { package = "gix-archive", version = "^0.22.0", path = "../gix-archive", optional = true, features = ["tar", "tar_gz"] } +gix-status = { version = "^0.20.0", path = "../gix-status" } +gix-fsck = { version = "^0.12.0", path = "../gix-fsck" } serde = { version = "1.0.114", optional = true, default-features = false, features = ["derive"] } anyhow = "1.0.98" thiserror = "2.0.0" @@ -70,7 +70,7 @@ futures-io = { version = "0.3.16", optional = true } blocking = { version = "1.0.2", optional = true } # for 'organize' functionality -gix-url = { version = "^0.31.0", path = "../gix-url", optional = true } +gix-url = { version = "^0.32.0", path = "../gix-url", optional = true } jwalk = { version = "0.8.0", optional = true } # for 'hours' diff --git a/gix-actor/CHANGELOG.md b/gix-actor/CHANGELOG.md index ec95c2b47bd..411844ce75d 100644 --- a/gix-actor/CHANGELOG.md +++ b/gix-actor/CHANGELOG.md @@ -5,7 +5,7 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## Unreleased +## 0.35.2 (2025-07-15) ### New Features @@ -15,7 +15,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - - 8 commits contributed to the release over the course of 79 calendar days. + - 9 commits contributed to the release over the course of 79 calendar days. - 79 days passed between releases. - 1 commit was understood as [conventional](https://www.conventionalcommits.org). - 0 issues like '(#ID)' were seen in commit messages @@ -27,6 +27,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
view details * **Uncategorized** + - Update changelogs prior to release ([`65037b5`](https://github.com/GitoxideLabs/gitoxide/commit/65037b56918b90ac07454a815b0ed136df2fca3b)) - Merge pull request #2038 from ilyagr/signature-doc ([`8f6ecfe`](https://github.com/GitoxideLabs/gitoxide/commit/8f6ecfe4b017fc6ed33d8932a1cb911ed0879713)) - Refactor ([`aff23d6`](https://github.com/GitoxideLabs/gitoxide/commit/aff23d65a1a44e5356fb362a857d736280d3a580)) - Gix-actor docs: document conversions between `Signature` and `SignatureRef` ([`8bebd2e`](https://github.com/GitoxideLabs/gitoxide/commit/8bebd2e84b4e9d9a31a6ff8dcd17da83534f3c95)) diff --git a/gix-actor/Cargo.toml b/gix-actor/Cargo.toml index a67f5de1575..5b63b6262cf 100644 --- a/gix-actor/Cargo.toml +++ b/gix-actor/Cargo.toml @@ -2,7 +2,7 @@ lints.workspace = true [package] name = "gix-actor" -version = "0.35.1" +version = "0.35.2" description = "A way to identify git actors" authors = ["Sebastian Thiel "] repository = "https://github.com/GitoxideLabs/gitoxide" @@ -19,7 +19,7 @@ doctest = false serde = ["dep:serde", "bstr/serde", "gix-date/serde"] [dependencies] -gix-date = { version = "^0.10.1", path = "../gix-date" } +gix-date = { version = "^0.10.3", path = "../gix-date" } gix-utils = { version = "^0.3.0", path = "../gix-utils" } thiserror = "2.0.0" diff --git a/gix-archive/CHANGELOG.md b/gix-archive/CHANGELOG.md index 6fefce521be..2e981bbc87e 100644 --- a/gix-archive/CHANGELOG.md +++ b/gix-archive/CHANGELOG.md @@ -5,7 +5,7 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## Unreleased +## 0.22.0 (2025-07-15) A maintenance release without user-facing changes. @@ -13,7 +13,7 @@ A maintenance release without user-facing changes. - - 9 commits contributed to the release over the course of 59 calendar days. + - 10 commits contributed to the release over the course of 59 calendar days. - 59 days passed between releases. - 0 commits were understood as [conventional](https://www.conventionalcommits.org). - 0 issues like '(#ID)' were seen in commit messages @@ -25,6 +25,7 @@ A maintenance release without user-facing changes.
view details * **Uncategorized** + - Update changelogs prior to release ([`65037b5`](https://github.com/GitoxideLabs/gitoxide/commit/65037b56918b90ac07454a815b0ed136df2fca3b)) - Merge pull request #2070 from GitoxideLabs/dependabot/cargo/cargo-827bceb7eb ([`dab97f7`](https://github.com/GitoxideLabs/gitoxide/commit/dab97f7618f160421b6e31de8f3e2f3d11dc2ef2)) - Bump the cargo group across 1 directory with 68 updates ([`a9a8ea1`](https://github.com/GitoxideLabs/gitoxide/commit/a9a8ea1472532dde03bce4e0afdfa82924af1f96)) - Merge pull request #2062 from rickprice/minor_documentation_fixups ([`c2eb0c1`](https://github.com/GitoxideLabs/gitoxide/commit/c2eb0c144dd21cac87fd08829f4a5ca02f85008d)) diff --git a/gix-archive/Cargo.toml b/gix-archive/Cargo.toml index 16fa629efe5..0bb3c1802cd 100644 --- a/gix-archive/Cargo.toml +++ b/gix-archive/Cargo.toml @@ -2,7 +2,7 @@ lints.workspace = true [package] name = "gix-archive" -version = "0.21.2" +version = "0.22.0" repository = "https://github.com/GitoxideLabs/gitoxide" license = "MIT OR Apache-2.0" description = "archive generation from of a worktree stream" @@ -27,10 +27,10 @@ zip = ["dep:zip"] [dependencies] -gix-worktree-stream = { version = "^0.21.2", path = "../gix-worktree-stream" } -gix-object = { version = "^0.49.1", path = "../gix-object" } -gix-path = { version = "^0.10.18", path = "../gix-path", optional = true } -gix-date = { version = "^0.10.2", path = "../gix-date" } +gix-worktree-stream = { version = "^0.22.0", path = "../gix-worktree-stream" } +gix-object = { version = "^0.50.0", path = "../gix-object" } +gix-path = { version = "^0.10.19", path = "../gix-path", optional = true } +gix-date = { version = "^0.10.3", path = "../gix-date" } flate2 = { version = "1.1.1", optional = true, default-features = false, features = ["zlib-rs"] } zip = { version = "4.2.0", optional = true, default-features = false, features = ["deflate-flate2"] } diff --git a/gix-attributes/CHANGELOG.md b/gix-attributes/CHANGELOG.md index 28e8b297f58..fa1666cbce8 100644 --- a/gix-attributes/CHANGELOG.md +++ b/gix-attributes/CHANGELOG.md @@ -5,7 +5,7 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## Unreleased +## 0.27.0 (2025-07-15) ### New Features (BREAKING) @@ -17,7 +17,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - - 7 commits contributed to the release over the course of 59 calendar days. + - 8 commits contributed to the release over the course of 59 calendar days. - 59 days passed between releases. - 1 commit was understood as [conventional](https://www.conventionalcommits.org). - 0 issues like '(#ID)' were seen in commit messages @@ -35,6 +35,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
view details * **Uncategorized** + - Update changelogs prior to release ([`65037b5`](https://github.com/GitoxideLabs/gitoxide/commit/65037b56918b90ac07454a815b0ed136df2fca3b)) - Merge pull request #2070 from GitoxideLabs/dependabot/cargo/cargo-827bceb7eb ([`dab97f7`](https://github.com/GitoxideLabs/gitoxide/commit/dab97f7618f160421b6e31de8f3e2f3d11dc2ef2)) - Bump the cargo group across 1 directory with 68 updates ([`a9a8ea1`](https://github.com/GitoxideLabs/gitoxide/commit/a9a8ea1472532dde03bce4e0afdfa82924af1f96)) - Merge pull request #2041 from cruessler/add-blame-extraction ([`dd5f0a4`](https://github.com/GitoxideLabs/gitoxide/commit/dd5f0a4811bc738051f7af164b8d2815aaa23220)) diff --git a/gix-attributes/Cargo.toml b/gix-attributes/Cargo.toml index 7b5ac5822f0..28b0e10e471 100644 --- a/gix-attributes/Cargo.toml +++ b/gix-attributes/Cargo.toml @@ -2,7 +2,7 @@ lints.workspace = true [package] name = "gix-attributes" -version = "0.26.1" +version = "0.27.0" repository = "https://github.com/GitoxideLabs/gitoxide" license = "MIT OR Apache-2.0" description = "A crate of the gitoxide project dealing .gitattributes files" @@ -19,10 +19,10 @@ doctest = false serde = ["dep:serde", "bstr/serde", "gix-glob/serde", "kstring/serde"] [dependencies] -gix-path = { version = "^0.10.18", path = "../gix-path" } +gix-path = { version = "^0.10.19", path = "../gix-path" } gix-quote = { version = "^0.6.0", path = "../gix-quote" } -gix-glob = { version = "^0.20.1", path = "../gix-glob" } -gix-trace = { version = "^0.1.12", path = "../gix-trace" } +gix-glob = { version = "^0.21.0", path = "../gix-glob" } +gix-trace = { version = "^0.1.13", path = "../gix-trace" } bstr = { version = "1.12.0", default-features = false, features = ["std", "unicode"] } smallvec = "1.15.1" diff --git a/gix-blame/CHANGELOG.md b/gix-blame/CHANGELOG.md index 26cf9d1e33d..b853bd54f22 100644 --- a/gix-blame/CHANGELOG.md +++ b/gix-blame/CHANGELOG.md @@ -5,7 +5,7 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## Unreleased +## 0.3.0 (2025-07-15) ### New Features (BREAKING) @@ -20,7 +20,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - - 40 commits contributed to the release over the course of 79 calendar days. + - 41 commits contributed to the release over the course of 79 calendar days. - 79 days passed between releases. - 3 commits were understood as [conventional](https://www.conventionalcommits.org). - 0 issues like '(#ID)' were seen in commit messages @@ -38,6 +38,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
view details * **Uncategorized** + - Update changelogs prior to release ([`65037b5`](https://github.com/GitoxideLabs/gitoxide/commit/65037b56918b90ac07454a815b0ed136df2fca3b)) - Merge pull request #2070 from GitoxideLabs/dependabot/cargo/cargo-827bceb7eb ([`dab97f7`](https://github.com/GitoxideLabs/gitoxide/commit/dab97f7618f160421b6e31de8f3e2f3d11dc2ef2)) - Bump the cargo group across 1 directory with 68 updates ([`a9a8ea1`](https://github.com/GitoxideLabs/gitoxide/commit/a9a8ea1472532dde03bce4e0afdfa82924af1f96)) - Merge pull request #2066 from cruessler/add-test-for-file-added-in-two-different-branches ([`8007f1d`](https://github.com/GitoxideLabs/gitoxide/commit/8007f1d0bad357688acd1235d079bf164290cda6)) diff --git a/gix-blame/Cargo.toml b/gix-blame/Cargo.toml index ed39ae34b08..32609fcf720 100644 --- a/gix-blame/Cargo.toml +++ b/gix-blame/Cargo.toml @@ -2,7 +2,7 @@ lints.workspace = true [package] name = "gix-blame" -version = "0.2.1" +version = "0.3.0" repository = "https://github.com/GitoxideLabs/gitoxide" license = "MIT OR Apache-2.0" description = "A crate of the gitoxide project dedicated to implementing a 'blame' algorithm" @@ -11,15 +11,15 @@ edition = "2021" rust-version = "1.70" [dependencies] -gix-commitgraph = { version = "^0.28.0", path = "../gix-commitgraph" } -gix-revwalk = { version = "^0.20.1", path = "../gix-revwalk" } -gix-trace = { version = "^0.1.12", path = "../gix-trace" } -gix-date = { version = "^0.10.2", path = "../gix-date" } -gix-diff = { version = "^0.52.1", path = "../gix-diff", default-features = false, features = ["blob"] } -gix-object = { version = "^0.49.1", path = "../gix-object" } -gix-hash = { version = "^0.18.0", path = "../gix-hash" } -gix-worktree = { version = "^0.41.0", path = "../gix-worktree", default-features = false, features = ["attributes"] } -gix-traverse = { version = "^0.46.2", path = "../gix-traverse" } +gix-commitgraph = { version = "^0.29.0", path = "../gix-commitgraph" } +gix-revwalk = { version = "^0.21.0", path = "../gix-revwalk" } +gix-trace = { version = "^0.1.13", path = "../gix-trace" } +gix-date = { version = "^0.10.3", path = "../gix-date" } +gix-diff = { version = "^0.53.0", path = "../gix-diff", default-features = false, features = ["blob"] } +gix-object = { version = "^0.50.0", path = "../gix-object" } +gix-hash = { version = "^0.19.0", path = "../gix-hash" } +gix-worktree = { version = "^0.42.0", path = "../gix-worktree", default-features = false, features = ["attributes"] } +gix-traverse = { version = "^0.47.0", path = "../gix-traverse" } smallvec = "1.15.1" thiserror = "2.0.0" diff --git a/gix-command/CHANGELOG.md b/gix-command/CHANGELOG.md index 7b81fd68ff1..f4e9386bcff 100644 --- a/gix-command/CHANGELOG.md +++ b/gix-command/CHANGELOG.md @@ -5,7 +5,7 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## Unreleased +## 0.6.2 (2025-07-15) A maintenance release without user-facing changes. @@ -13,7 +13,7 @@ A maintenance release without user-facing changes. - - 3 commits contributed to the release over the course of 59 calendar days. + - 4 commits contributed to the release over the course of 59 calendar days. - 59 days passed between releases. - 0 commits were understood as [conventional](https://www.conventionalcommits.org). - 0 issues like '(#ID)' were seen in commit messages @@ -25,6 +25,7 @@ A maintenance release without user-facing changes.
view details * **Uncategorized** + - Update changelogs prior to release ([`65037b5`](https://github.com/GitoxideLabs/gitoxide/commit/65037b56918b90ac07454a815b0ed136df2fca3b)) - Merge pull request #2062 from rickprice/minor_documentation_fixups ([`c2eb0c1`](https://github.com/GitoxideLabs/gitoxide/commit/c2eb0c144dd21cac87fd08829f4a5ca02f85008d)) - Small documentation fixes ([`bfb1c34`](https://github.com/GitoxideLabs/gitoxide/commit/bfb1c34f75997a603b8f85fca75bf9e1ca310be0)) - Merge pull request #2014 from GitoxideLabs/zip ([`648022b`](https://github.com/GitoxideLabs/gitoxide/commit/648022b44e12f597cae55cc45830d0a19b87eb4c)) diff --git a/gix-command/Cargo.toml b/gix-command/Cargo.toml index 016cf31ca25..92a392ad88c 100644 --- a/gix-command/Cargo.toml +++ b/gix-command/Cargo.toml @@ -2,7 +2,7 @@ lints.workspace = true [package] name = "gix-command" -version = "0.6.1" +version = "0.6.2" repository = "https://github.com/GitoxideLabs/gitoxide" license = "MIT OR Apache-2.0" description = "A crate of the gitoxide project handling internal git command execution" @@ -15,8 +15,8 @@ include = ["src/lib.rs", "LICENSE-*"] doctest = false [dependencies] -gix-trace = { version = "^0.1.12", path = "../gix-trace" } -gix-path = { version = "^0.10.18", path = "../gix-path" } +gix-trace = { version = "^0.1.13", path = "../gix-trace" } +gix-path = { version = "^0.10.19", path = "../gix-path" } gix-quote = { version = "^0.6.0", path = "../gix-quote" } bstr = { version = "1.12.0", default-features = false, features = ["std", "unicode"] } diff --git a/gix-commitgraph/CHANGELOG.md b/gix-commitgraph/CHANGELOG.md index 95e9dc8f290..5e6bdd762a8 100644 --- a/gix-commitgraph/CHANGELOG.md +++ b/gix-commitgraph/CHANGELOG.md @@ -5,7 +5,7 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## Unreleased +## 0.29.0 (2025-07-15) A maintenance release without user-facing changes. @@ -13,7 +13,7 @@ A maintenance release without user-facing changes. - - 1 commit contributed to the release over the course of 79 calendar days. + - 2 commits contributed to the release over the course of 79 calendar days. - 79 days passed between releases. - 0 commits were understood as [conventional](https://www.conventionalcommits.org). - 0 issues like '(#ID)' were seen in commit messages @@ -25,6 +25,7 @@ A maintenance release without user-facing changes.
view details * **Uncategorized** + - Update changelogs prior to release ([`65037b5`](https://github.com/GitoxideLabs/gitoxide/commit/65037b56918b90ac07454a815b0ed136df2fca3b)) - Merge pull request #1971 from GitoxideLabs/new-release ([`8d4c4d1`](https://github.com/GitoxideLabs/gitoxide/commit/8d4c4d1e09f84c962c29d98a686c64228196ac13))
diff --git a/gix-commitgraph/Cargo.toml b/gix-commitgraph/Cargo.toml index 8eff229eef5..8bb51a89b8d 100644 --- a/gix-commitgraph/Cargo.toml +++ b/gix-commitgraph/Cargo.toml @@ -2,7 +2,7 @@ lints.workspace = true [package] name = "gix-commitgraph" -version = "0.28.0" +version = "0.29.0" repository = "https://github.com/GitoxideLabs/gitoxide" documentation = "https://git-scm.com/docs/commit-graph" license = "MIT OR Apache-2.0" @@ -20,7 +20,7 @@ doctest = false serde = ["dep:serde", "gix-hash/serde", "bstr/serde"] [dependencies] -gix-hash = { version = "^0.18.0", path = "../gix-hash" } +gix-hash = { version = "^0.19.0", path = "../gix-hash" } gix-chunk = { version = "^0.4.11", path = "../gix-chunk" } bstr = { version = "1.12.0", default-features = false, features = ["std"] } diff --git a/gix-config-value/CHANGELOG.md b/gix-config-value/CHANGELOG.md index 1883b8024c4..933581c6b4c 100644 --- a/gix-config-value/CHANGELOG.md +++ b/gix-config-value/CHANGELOG.md @@ -5,7 +5,7 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## Unreleased +## 0.15.1 (2025-07-15) A maintenance release without user-facing changes. @@ -13,7 +13,7 @@ A maintenance release without user-facing changes. - - 3 commits contributed to the release over the course of 79 calendar days. + - 4 commits contributed to the release over the course of 79 calendar days. - 79 days passed between releases. - 0 commits were understood as [conventional](https://www.conventionalcommits.org). - 0 issues like '(#ID)' were seen in commit messages @@ -25,6 +25,7 @@ A maintenance release without user-facing changes.
view details * **Uncategorized** + - Update changelogs prior to release ([`65037b5`](https://github.com/GitoxideLabs/gitoxide/commit/65037b56918b90ac07454a815b0ed136df2fca3b)) - Merge pull request #2009 from GitoxideLabs/release-gix-index ([`c3f06ae`](https://github.com/GitoxideLabs/gitoxide/commit/c3f06ae424ab4e1918a364cabe8276297465a73a)) - Release gix-path v0.10.18, gix-date v0.10.2, gix-traverse v0.46.2, gix-index v0.40.1 ([`d2b4c44`](https://github.com/GitoxideLabs/gitoxide/commit/d2b4c44fcb2bf43e80d67532262631a5086f08de)) - Merge pull request #1971 from GitoxideLabs/new-release ([`8d4c4d1`](https://github.com/GitoxideLabs/gitoxide/commit/8d4c4d1e09f84c962c29d98a686c64228196ac13)) diff --git a/gix-config-value/Cargo.toml b/gix-config-value/Cargo.toml index ccccf115e47..32ba0ff9f30 100644 --- a/gix-config-value/Cargo.toml +++ b/gix-config-value/Cargo.toml @@ -2,7 +2,7 @@ lints.workspace = true [package] name = "gix-config-value" -version = "0.15.0" +version = "0.15.1" repository = "https://github.com/GitoxideLabs/gitoxide" license = "MIT OR Apache-2.0" description = "A crate of the gitoxide project providing git-config value parsing" @@ -19,7 +19,7 @@ doctest = false serde = ["dep:serde", "bstr/serde"] [dependencies] -gix-path = { version = "^0.10.18", path = "../gix-path" } +gix-path = { version = "^0.10.19", path = "../gix-path" } thiserror = "2.0.0" bstr = { version = "1.12.0", default-features = false, features = ["std"] } diff --git a/gix-config/CHANGELOG.md b/gix-config/CHANGELOG.md index ae37ff9087d..4eb089694aa 100644 --- a/gix-config/CHANGELOG.md +++ b/gix-config/CHANGELOG.md @@ -5,7 +5,7 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## Unreleased +## 0.46.0 (2025-07-15) A maintenance release without user-facing changes. @@ -13,7 +13,7 @@ A maintenance release without user-facing changes. - - 13 commits contributed to the release over the course of 79 calendar days. + - 14 commits contributed to the release over the course of 79 calendar days. - 79 days passed between releases. - 0 commits were understood as [conventional](https://www.conventionalcommits.org). - 0 issues like '(#ID)' were seen in commit messages @@ -31,6 +31,7 @@ A maintenance release without user-facing changes.
view details * **Uncategorized** + - Update changelogs prior to release ([`65037b5`](https://github.com/GitoxideLabs/gitoxide/commit/65037b56918b90ac07454a815b0ed136df2fca3b)) - Merge pull request #2070 from GitoxideLabs/dependabot/cargo/cargo-827bceb7eb ([`dab97f7`](https://github.com/GitoxideLabs/gitoxide/commit/dab97f7618f160421b6e31de8f3e2f3d11dc2ef2)) - Bump the cargo group across 1 directory with 68 updates ([`a9a8ea1`](https://github.com/GitoxideLabs/gitoxide/commit/a9a8ea1472532dde03bce4e0afdfa82924af1f96)) - Merge pull request #2041 from cruessler/add-blame-extraction ([`dd5f0a4`](https://github.com/GitoxideLabs/gitoxide/commit/dd5f0a4811bc738051f7af164b8d2815aaa23220)) @@ -3845,6 +3846,24 @@ This is a maintenance release without functional changes. - `len` - `from_env` - `open` + - `len` + - `from_env` + - `open` + - `len` + - `from_env` + - `open` + - `len` + - `from_env` + - `open` +- `len` +- `from_env` +- `open` +- `len` +- `from_env` +- `open` +- `len` +- `from_env` +- `open` - `len` - `from_env` - `open` @@ -4105,6 +4124,7 @@ This is a maintenance release without functional changes. `ParserFromIoError` +lenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopen lenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopen lenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopen lenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopen @@ -4122,6 +4142,7 @@ lenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfrom_envopenlenfr + ## v0.1.1 (2021-05-09) diff --git a/gix-config/Cargo.toml b/gix-config/Cargo.toml index ce9151307c2..f37ab3ed10d 100644 --- a/gix-config/Cargo.toml +++ b/gix-config/Cargo.toml @@ -2,7 +2,7 @@ lints.workspace = true [package] name = "gix-config" -version = "0.45.1" +version = "0.46.0" repository = "https://github.com/GitoxideLabs/gitoxide" description = "A git-config file parser and editor from the gitoxide project" license = "MIT OR Apache-2.0" @@ -19,12 +19,12 @@ autotests = false serde = ["dep:serde", "bstr/serde", "gix-sec/serde", "gix-ref/serde", "gix-glob/serde", "gix-config-value/serde"] [dependencies] -gix-features = { version = "^0.42.1", path = "../gix-features" } -gix-config-value = { version = "^0.15.0", path = "../gix-config-value" } -gix-path = { version = "^0.10.18", path = "../gix-path" } -gix-sec = { version = "^0.11.0", path = "../gix-sec" } -gix-ref = { version = "^0.52.1", path = "../gix-ref" } -gix-glob = { version = "^0.20.1", path = "../gix-glob" } +gix-features = { version = "^0.43.0", path = "../gix-features" } +gix-config-value = { version = "^0.15.1", path = "../gix-config-value" } +gix-path = { version = "^0.10.19", path = "../gix-path" } +gix-sec = { version = "^0.12.0", path = "../gix-sec" } +gix-ref = { version = "^0.53.0", path = "../gix-ref" } +gix-glob = { version = "^0.21.0", path = "../gix-glob" } winnow = { version = "0.7.10", features = ["simd"] } memchr = "2" diff --git a/gix-credentials/CHANGELOG.md b/gix-credentials/CHANGELOG.md index 479d3f08a06..93ad1367da2 100644 --- a/gix-credentials/CHANGELOG.md +++ b/gix-credentials/CHANGELOG.md @@ -5,7 +5,7 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## Unreleased +## 0.30.0 (2025-07-15) ### New Features @@ -19,7 +19,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - - 9 commits contributed to the release over the course of 79 calendar days. + - 10 commits contributed to the release over the course of 79 calendar days. - 79 days passed between releases. - 2 commits were understood as [conventional](https://www.conventionalcommits.org). - 1 unique issue was worked on: [#1998](https://github.com/GitoxideLabs/gitoxide/issues/1998) @@ -33,6 +33,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 * **[#1998](https://github.com/GitoxideLabs/gitoxide/issues/1998)** - Pass `password_expiry_utc` and `oauth_refresh_token` in credential helper invocations ([`3a50af5`](https://github.com/GitoxideLabs/gitoxide/commit/3a50af524ad5e13bbd08bbb96cbf0817d5e89038)) * **Uncategorized** + - Update changelogs prior to release ([`65037b5`](https://github.com/GitoxideLabs/gitoxide/commit/65037b56918b90ac07454a815b0ed136df2fca3b)) - Merge pull request #2014 from GitoxideLabs/zip ([`648022b`](https://github.com/GitoxideLabs/gitoxide/commit/648022b44e12f597cae55cc45830d0a19b87eb4c)) - Release gix-glob v0.20.1, gix-attributes v0.26.1, gix-command v0.6.1, gix-filter v0.19.2, gix-worktree-stream v0.21.2, gix-archive v0.21.2 ([`f0ed2cc`](https://github.com/GitoxideLabs/gitoxide/commit/f0ed2cc0046f866e67944bff9aef0579c12d5852)) - Merge pull request #1999 from GitoxideLabs/credential-helper-protocol-fix ([`8d30ab1`](https://github.com/GitoxideLabs/gitoxide/commit/8d30ab1260fa69468b66d6df3297bb2b43530b93)) diff --git a/gix-credentials/Cargo.toml b/gix-credentials/Cargo.toml index 453addbfad0..772667c262b 100644 --- a/gix-credentials/Cargo.toml +++ b/gix-credentials/Cargo.toml @@ -2,7 +2,7 @@ lints.workspace = true [package] name = "gix-credentials" -version = "0.29.0" +version = "0.30.0" repository = "https://github.com/GitoxideLabs/gitoxide" license = "MIT OR Apache-2.0" description = "A crate of the gitoxide project to interact with git credentials helpers" @@ -19,14 +19,14 @@ doctest = false serde = ["dep:serde", "bstr/serde", "gix-sec/serde"] [dependencies] -gix-sec = { version = "^0.11.0", path = "../gix-sec" } -gix-url = { version = "^0.31.0", path = "../gix-url" } -gix-path = { version = "^0.10.18", path = "../gix-path" } -gix-command = { version = "^0.6.1", path = "../gix-command" } -gix-config-value = { version = "^0.15.0", path = "../gix-config-value" } -gix-prompt = { version = "^0.11.0", path = "../gix-prompt" } -gix-date = { version = "^0.10.1", path = "../gix-date" } -gix-trace = { version = "^0.1.12", path = "../gix-trace" } +gix-sec = { version = "^0.12.0", path = "../gix-sec" } +gix-url = { version = "^0.32.0", path = "../gix-url" } +gix-path = { version = "^0.10.19", path = "../gix-path" } +gix-command = { version = "^0.6.2", path = "../gix-command" } +gix-config-value = { version = "^0.15.1", path = "../gix-config-value" } +gix-prompt = { version = "^0.11.1", path = "../gix-prompt" } +gix-date = { version = "^0.10.3", path = "../gix-date" } +gix-trace = { version = "^0.1.13", path = "../gix-trace" } thiserror = "2.0.0" serde = { version = "1.0.114", optional = true, default-features = false, features = ["derive"] } diff --git a/gix-date/CHANGELOG.md b/gix-date/CHANGELOG.md index 694e403c95b..3dc15cbbf78 100644 --- a/gix-date/CHANGELOG.md +++ b/gix-date/CHANGELOG.md @@ -5,7 +5,7 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## Unreleased +## 0.10.3 (2025-07-15) A maintenance release without user-facing changes. @@ -13,7 +13,7 @@ A maintenance release without user-facing changes. - - 5 commits contributed to the release over the course of 65 calendar days. + - 6 commits contributed to the release over the course of 65 calendar days. - 65 days passed between releases. - 0 commits were understood as [conventional](https://www.conventionalcommits.org). - 0 issues like '(#ID)' were seen in commit messages @@ -25,6 +25,7 @@ A maintenance release without user-facing changes.
view details * **Uncategorized** + - Update changelogs prior to release ([`65037b5`](https://github.com/GitoxideLabs/gitoxide/commit/65037b56918b90ac07454a815b0ed136df2fca3b)) - Merge pull request #2070 from GitoxideLabs/dependabot/cargo/cargo-827bceb7eb ([`dab97f7`](https://github.com/GitoxideLabs/gitoxide/commit/dab97f7618f160421b6e31de8f3e2f3d11dc2ef2)) - Bump the cargo group across 1 directory with 68 updates ([`a9a8ea1`](https://github.com/GitoxideLabs/gitoxide/commit/a9a8ea1472532dde03bce4e0afdfa82924af1f96)) - Merge pull request #2033 from GitoxideLabs/dependabot/cargo/cargo-b72232998d ([`f8d7c0a`](https://github.com/GitoxideLabs/gitoxide/commit/f8d7c0ad8fa7745c973c6b87e7eee70831300207)) diff --git a/gix-date/Cargo.toml b/gix-date/Cargo.toml index 1c810711ae5..369906b80c0 100644 --- a/gix-date/Cargo.toml +++ b/gix-date/Cargo.toml @@ -2,7 +2,7 @@ lints.workspace = true [package] name = "gix-date" -version = "0.10.2" +version = "0.10.3" repository = "https://github.com/GitoxideLabs/gitoxide" license = "MIT OR Apache-2.0" description = "A crate of the gitoxide project parsing dates the way git does" diff --git a/gix-diff/CHANGELOG.md b/gix-diff/CHANGELOG.md index dbb2ddc890e..738d1a6f4cb 100644 --- a/gix-diff/CHANGELOG.md +++ b/gix-diff/CHANGELOG.md @@ -5,7 +5,7 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## Unreleased +## 0.53.0 (2025-07-15) ### New Features @@ -31,7 +31,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - - 25 commits contributed to the release over the course of 79 calendar days. + - 26 commits contributed to the release over the course of 79 calendar days. - 79 days passed between releases. - 5 commits were understood as [conventional](https://www.conventionalcommits.org). - 1 unique issue was worked on: [#2011](https://github.com/GitoxideLabs/gitoxide/issues/2011) @@ -51,6 +51,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 * **[#2011](https://github.com/GitoxideLabs/gitoxide/issues/2011)** - Remove `blob::GitDiff` Sink as it doesn't work concistently. ([`4f27179`](https://github.com/GitoxideLabs/gitoxide/commit/4f271796041655d80ab0435a76281446e21ad8cd)) * **Uncategorized** + - Update changelogs prior to release ([`65037b5`](https://github.com/GitoxideLabs/gitoxide/commit/65037b56918b90ac07454a815b0ed136df2fca3b)) - Merge pull request #2071 from cruessler/add-accessors-to-change-ref ([`5335c84`](https://github.com/GitoxideLabs/gitoxide/commit/5335c84a68739adc5a7db31220037c83b7be2429)) - Merge pull request #2072 from GitoxideLabs/fix-unidiff ([`f87967d`](https://github.com/GitoxideLabs/gitoxide/commit/f87967d4983f96133d184eff9d689a333c819958)) - Reproduce unified diff issue ([`5e64298`](https://github.com/GitoxideLabs/gitoxide/commit/5e64298ba4864636779ae72e301475e9cfe01ac8)) diff --git a/gix-diff/Cargo.toml b/gix-diff/Cargo.toml index e251aa5d33e..1e81f480d20 100644 --- a/gix-diff/Cargo.toml +++ b/gix-diff/Cargo.toml @@ -2,7 +2,7 @@ lints.workspace = true [package] name = "gix-diff" -version = "0.52.1" +version = "0.53.0" repository = "https://github.com/GitoxideLabs/gitoxide" license = "MIT OR Apache-2.0" description = "Calculate differences between various git objects" @@ -27,19 +27,19 @@ wasm = ["dep:getrandom"] doctest = false [dependencies] -gix-index = { version = "^0.40.1", path = "../gix-index", optional = true } -gix-pathspec = { version = "^0.11.0", path = "../gix-pathspec", optional = true } -gix-attributes = { version = "^0.26.1", path = "../gix-attributes", optional = true } -gix-hash = { version = "^0.18.0", path = "../gix-hash" } -gix-object = { version = "^0.49.1", path = "../gix-object" } -gix-filter = { version = "^0.19.2", path = "../gix-filter", optional = true } -gix-worktree = { version = "^0.41.0", path = "../gix-worktree", default-features = false, features = ["attributes"], optional = true } -gix-command = { version = "^0.6.1", path = "../gix-command", optional = true } -gix-path = { version = "^0.10.18", path = "../gix-path", optional = true } -gix-fs = { version = "^0.15.0", path = "../gix-fs", optional = true } -gix-tempfile = { version = "^17.1.0", path = "../gix-tempfile", optional = true } -gix-trace = { version = "^0.1.12", path = "../gix-trace", optional = true } -gix-traverse = { version = "^0.46.2", path = "../gix-traverse", optional = true } +gix-index = { version = "^0.41.0", path = "../gix-index", optional = true } +gix-pathspec = { version = "^0.12.0", path = "../gix-pathspec", optional = true } +gix-attributes = { version = "^0.27.0", path = "../gix-attributes", optional = true } +gix-hash = { version = "^0.19.0", path = "../gix-hash" } +gix-object = { version = "^0.50.0", path = "../gix-object" } +gix-filter = { version = "^0.20.0", path = "../gix-filter", optional = true } +gix-worktree = { version = "^0.42.0", path = "../gix-worktree", default-features = false, features = ["attributes"], optional = true } +gix-command = { version = "^0.6.2", path = "../gix-command", optional = true } +gix-path = { version = "^0.10.19", path = "../gix-path", optional = true } +gix-fs = { version = "^0.16.0", path = "../gix-fs", optional = true } +gix-tempfile = { version = "^18.0.0", path = "../gix-tempfile", optional = true } +gix-trace = { version = "^0.1.13", path = "../gix-trace", optional = true } +gix-traverse = { version = "^0.47.0", path = "../gix-traverse", optional = true } thiserror = "2.0.0" imara-diff = { version = "0.1.8", optional = true } diff --git a/gix-dir/CHANGELOG.md b/gix-dir/CHANGELOG.md index 309b35cc0c8..cbc7ecc9252 100644 --- a/gix-dir/CHANGELOG.md +++ b/gix-dir/CHANGELOG.md @@ -5,7 +5,7 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## Unreleased +## 0.15.0 (2025-07-15) A maintenance release without user-facing changes. @@ -13,7 +13,7 @@ A maintenance release without user-facing changes. - - 5 commits contributed to the release over the course of 79 calendar days. + - 6 commits contributed to the release over the course of 79 calendar days. - 79 days passed between releases. - 0 commits were understood as [conventional](https://www.conventionalcommits.org). - 0 issues like '(#ID)' were seen in commit messages @@ -25,6 +25,7 @@ A maintenance release without user-facing changes.
view details * **Uncategorized** + - Update changelogs prior to release ([`65037b5`](https://github.com/GitoxideLabs/gitoxide/commit/65037b56918b90ac07454a815b0ed136df2fca3b)) - Merge pull request #2019 from GitoxideLabs/precious-opt-in ([`5f9de52`](https://github.com/GitoxideLabs/gitoxide/commit/5f9de52cf286163b503047b1ab3b51dfa093b4d4)) - Adapt to changes in `gix-ignore` and `gix-glob`, and more. ([`4ef7806`](https://github.com/GitoxideLabs/gitoxide/commit/4ef7806e62954d069861bddb06cb8c0baf47bb69)) - Merge pull request #2009 from GitoxideLabs/release-gix-index ([`c3f06ae`](https://github.com/GitoxideLabs/gitoxide/commit/c3f06ae424ab4e1918a364cabe8276297465a73a)) diff --git a/gix-dir/Cargo.toml b/gix-dir/Cargo.toml index 86bb7178c75..358e2dccf19 100644 --- a/gix-dir/Cargo.toml +++ b/gix-dir/Cargo.toml @@ -2,7 +2,7 @@ lints.workspace = true [package] name = "gix-dir" -version = "0.14.1" +version = "0.15.0" repository = "https://github.com/GitoxideLabs/gitoxide" license = "MIT OR Apache-2.0" description = "A crate of the gitoxide project dealing with directory walks" @@ -15,15 +15,15 @@ doctest = false test = false [dependencies] -gix-trace = { version = "^0.1.12", path = "../gix-trace" } -gix-index = { version = "^0.40.1", path = "../gix-index" } -gix-discover = { version = "^0.40.1", path = "../gix-discover" } -gix-fs = { version = "^0.15.0", path = "../gix-fs" } -gix-path = { version = "^0.10.18", path = "../gix-path" } -gix-pathspec = { version = "^0.11.0", path = "../gix-pathspec" } -gix-worktree = { version = "^0.41.0", path = "../gix-worktree", default-features = false } -gix-object = { version = "^0.49.1", path = "../gix-object" } -gix-ignore = { version = "^0.15.0", path = "../gix-ignore" } +gix-trace = { version = "^0.1.13", path = "../gix-trace" } +gix-index = { version = "^0.41.0", path = "../gix-index" } +gix-discover = { version = "^0.41.0", path = "../gix-discover" } +gix-fs = { version = "^0.16.0", path = "../gix-fs" } +gix-path = { version = "^0.10.19", path = "../gix-path" } +gix-pathspec = { version = "^0.12.0", path = "../gix-pathspec" } +gix-worktree = { version = "^0.42.0", path = "../gix-worktree", default-features = false } +gix-object = { version = "^0.50.0", path = "../gix-object" } +gix-ignore = { version = "^0.16.0", path = "../gix-ignore" } gix-utils = { version = "^0.3.0", path = "../gix-utils", features = ["bstr"] } bstr = { version = "1.12.0", default-features = false } diff --git a/gix-discover/CHANGELOG.md b/gix-discover/CHANGELOG.md index 897f623d611..75bc4faa431 100644 --- a/gix-discover/CHANGELOG.md +++ b/gix-discover/CHANGELOG.md @@ -5,7 +5,7 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## Unreleased +## 0.41.0 (2025-07-15) A maintenance release without user-facing changes. @@ -13,7 +13,7 @@ A maintenance release without user-facing changes. - - 5 commits contributed to the release over the course of 79 calendar days. + - 6 commits contributed to the release over the course of 79 calendar days. - 79 days passed between releases. - 0 commits were understood as [conventional](https://www.conventionalcommits.org). - 0 issues like '(#ID)' were seen in commit messages @@ -25,6 +25,7 @@ A maintenance release without user-facing changes.
view details * **Uncategorized** + - Update changelogs prior to release ([`65037b5`](https://github.com/GitoxideLabs/gitoxide/commit/65037b56918b90ac07454a815b0ed136df2fca3b)) - Merge pull request #2033 from GitoxideLabs/dependabot/cargo/cargo-b72232998d ([`f8d7c0a`](https://github.com/GitoxideLabs/gitoxide/commit/f8d7c0ad8fa7745c973c6b87e7eee70831300207)) - Bump the cargo group with 56 updates ([`151e3a5`](https://github.com/GitoxideLabs/gitoxide/commit/151e3a5cca06444eea4c6a362649e66c831673d6)) - Merge pull request #2009 from GitoxideLabs/release-gix-index ([`c3f06ae`](https://github.com/GitoxideLabs/gitoxide/commit/c3f06ae424ab4e1918a364cabe8276297465a73a)) diff --git a/gix-discover/Cargo.toml b/gix-discover/Cargo.toml index 82e91690209..fb3e7b81ce6 100644 --- a/gix-discover/Cargo.toml +++ b/gix-discover/Cargo.toml @@ -2,7 +2,7 @@ lints.workspace = true [package] name = "gix-discover" -version = "0.40.1" +version = "0.41.0" repository = "https://github.com/GitoxideLabs/gitoxide" license = "MIT OR Apache-2.0" description = "Discover git repositories and check if a directory is a git repository" @@ -15,11 +15,11 @@ rust-version = "1.70" doctest = false [dependencies] -gix-sec = { version = "^0.11.0", path = "../gix-sec" } -gix-path = { version = "^0.10.18", path = "../gix-path" } -gix-ref = { version = "^0.52.1", path = "../gix-ref" } -gix-hash = { version = "^0.18.0", path = "../gix-hash" } -gix-fs = { version = "^0.15.0", path = "../gix-fs" } +gix-sec = { version = "^0.12.0", path = "../gix-sec" } +gix-path = { version = "^0.10.19", path = "../gix-path" } +gix-ref = { version = "^0.53.0", path = "../gix-ref" } +gix-hash = { version = "^0.19.0", path = "../gix-hash" } +gix-fs = { version = "^0.16.0", path = "../gix-fs" } bstr = { version = "1.12.0", default-features = false, features = ["std", "unicode"] } thiserror = "2.0.0" diff --git a/gix-features/CHANGELOG.md b/gix-features/CHANGELOG.md index b2002a47f86..4822046699f 100644 --- a/gix-features/CHANGELOG.md +++ b/gix-features/CHANGELOG.md @@ -5,7 +5,7 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## Unreleased +## 0.43.0 (2025-07-15) ### New Features (BREAKING) @@ -15,14 +15,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 Example values: * 0 -> Returns only the root path with no children. - * 1 -> Returns the root path, with children. - * 2..n -> Returns the root path, children and {n}-grandchildren +* 1 -> Returns the root path, with children. +* 2..n -> Returns the root path, children and {n}-grandchildren ### Commit Statistics - - 10 commits contributed to the release over the course of 79 calendar days. + - 11 commits contributed to the release over the course of 79 calendar days. - 79 days passed between releases. - 1 commit was understood as [conventional](https://www.conventionalcommits.org). - 0 issues like '(#ID)' were seen in commit messages @@ -34,6 +34,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
view details * **Uncategorized** + - Update changelogs prior to release ([`65037b5`](https://github.com/GitoxideLabs/gitoxide/commit/65037b56918b90ac07454a815b0ed136df2fca3b)) - Merge pull request #2061 from orthros/pseudo-refs ([`60c29a5`](https://github.com/GitoxideLabs/gitoxide/commit/60c29a59302bfc9d0be7aab5dd3ef05e4ee8e3fa)) - Refactor ([`43f92b5`](https://github.com/GitoxideLabs/gitoxide/commit/43f92b5285af6696cd21f0e94f3bec568aef8468)) - Walkdir_sorted_new adds max_depth parameter ([`6c77b54`](https://github.com/GitoxideLabs/gitoxide/commit/6c77b541b476656827ee0542a650b9731ba549cf)) diff --git a/gix-features/Cargo.toml b/gix-features/Cargo.toml index e89ac4b233c..b7d6cf860ac 100644 --- a/gix-features/Cargo.toml +++ b/gix-features/Cargo.toml @@ -4,7 +4,7 @@ lints.workspace = true name = "gix-features" description = "A crate to integrate various capabilities using compile-time feature flags" repository = "https://github.com/GitoxideLabs/gitoxide" -version = "0.42.1" +version = "0.43.0" authors = ["Sebastian Thiel "] license = "MIT OR Apache-2.0" edition = "2021" @@ -98,10 +98,10 @@ path = "tests/pipe.rs" required-features = ["io-pipe"] [dependencies] -gix-trace = { version = "^0.1.12", path = "../gix-trace" } +gix-trace = { version = "^0.1.13", path = "../gix-trace" } # for walkdir -gix-path = { version = "^0.10.17", path = "../gix-path", optional = true } +gix-path = { version = "^0.10.19", path = "../gix-path", optional = true } gix-utils = { version = "^0.3.0", path = "../gix-utils", optional = true } # 'parallel' feature diff --git a/gix-filter/CHANGELOG.md b/gix-filter/CHANGELOG.md index c7f1ef21f37..ed9cf6a298f 100644 --- a/gix-filter/CHANGELOG.md +++ b/gix-filter/CHANGELOG.md @@ -5,7 +5,7 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## Unreleased +## 0.20.0 (2025-07-15) A maintenance release without user-facing changes. @@ -13,7 +13,7 @@ A maintenance release without user-facing changes. - - 7 commits contributed to the release over the course of 59 calendar days. + - 8 commits contributed to the release over the course of 59 calendar days. - 59 days passed between releases. - 0 commits were understood as [conventional](https://www.conventionalcommits.org). - 0 issues like '(#ID)' were seen in commit messages @@ -25,6 +25,7 @@ A maintenance release without user-facing changes.
view details * **Uncategorized** + - Update changelogs prior to release ([`65037b5`](https://github.com/GitoxideLabs/gitoxide/commit/65037b56918b90ac07454a815b0ed136df2fca3b)) - Merge pull request #2070 from GitoxideLabs/dependabot/cargo/cargo-827bceb7eb ([`dab97f7`](https://github.com/GitoxideLabs/gitoxide/commit/dab97f7618f160421b6e31de8f3e2f3d11dc2ef2)) - Bump the cargo group across 1 directory with 68 updates ([`a9a8ea1`](https://github.com/GitoxideLabs/gitoxide/commit/a9a8ea1472532dde03bce4e0afdfa82924af1f96)) - Merge pull request #2062 from rickprice/minor_documentation_fixups ([`c2eb0c1`](https://github.com/GitoxideLabs/gitoxide/commit/c2eb0c144dd21cac87fd08829f4a5ca02f85008d)) diff --git a/gix-filter/Cargo.toml b/gix-filter/Cargo.toml index 3347968cfe2..404b8c879dd 100644 --- a/gix-filter/Cargo.toml +++ b/gix-filter/Cargo.toml @@ -2,7 +2,7 @@ lints.workspace = true [package] name = "gix-filter" -version = "0.19.2" +version = "0.20.0" repository = "https://github.com/GitoxideLabs/gitoxide" license = "MIT OR Apache-2.0" description = "A crate of the gitoxide project implementing git filters" @@ -15,15 +15,15 @@ include = ["src/**/*", "LICENSE-*"] doctest = false [dependencies] -gix-hash = { version = "^0.18.0", path = "../gix-hash" } -gix-trace = { version = "^0.1.12", path = "../gix-trace" } -gix-object = { version = "^0.49.1", path = "../gix-object" } -gix-command = { version = "^0.6.1", path = "../gix-command" } +gix-hash = { version = "^0.19.0", path = "../gix-hash" } +gix-trace = { version = "^0.1.13", path = "../gix-trace" } +gix-object = { version = "^0.50.0", path = "../gix-object" } +gix-command = { version = "^0.6.2", path = "../gix-command" } gix-quote = { version = "^0.6.0", path = "../gix-quote" } gix-utils = { version = "^0.3.0", path = "../gix-utils" } -gix-path = { version = "^0.10.18", path = "../gix-path" } -gix-packetline-blocking = { version = "^0.19.0", path = "../gix-packetline-blocking" } -gix-attributes = { version = "^0.26.1", path = "../gix-attributes" } +gix-path = { version = "^0.10.19", path = "../gix-path" } +gix-packetline-blocking = { version = "^0.19.1", path = "../gix-packetline-blocking" } +gix-attributes = { version = "^0.27.0", path = "../gix-attributes" } encoding_rs = "0.8.32" bstr = { version = "1.12.0", default-features = false, features = ["std"] } diff --git a/gix-fs/CHANGELOG.md b/gix-fs/CHANGELOG.md index 015d3ce7d7d..0a15fe38424 100644 --- a/gix-fs/CHANGELOG.md +++ b/gix-fs/CHANGELOG.md @@ -5,7 +5,7 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## Unreleased +## 0.16.0 (2025-07-15) A maintenance release without user-facing changes. @@ -13,7 +13,7 @@ A maintenance release without user-facing changes. - - 5 commits contributed to the release over the course of 79 calendar days. + - 6 commits contributed to the release over the course of 79 calendar days. - 79 days passed between releases. - 0 commits were understood as [conventional](https://www.conventionalcommits.org). - 0 issues like '(#ID)' were seen in commit messages @@ -25,6 +25,7 @@ A maintenance release without user-facing changes.
view details * **Uncategorized** + - Update changelogs prior to release ([`65037b5`](https://github.com/GitoxideLabs/gitoxide/commit/65037b56918b90ac07454a815b0ed136df2fca3b)) - Merge pull request #2062 from rickprice/minor_documentation_fixups ([`c2eb0c1`](https://github.com/GitoxideLabs/gitoxide/commit/c2eb0c144dd21cac87fd08829f4a5ca02f85008d)) - Small documentation fixes ([`bfb1c34`](https://github.com/GitoxideLabs/gitoxide/commit/bfb1c34f75997a603b8f85fca75bf9e1ca310be0)) - Merge pull request #2033 from GitoxideLabs/dependabot/cargo/cargo-b72232998d ([`f8d7c0a`](https://github.com/GitoxideLabs/gitoxide/commit/f8d7c0ad8fa7745c973c6b87e7eee70831300207)) diff --git a/gix-fs/Cargo.toml b/gix-fs/Cargo.toml index 432c2ee58fb..fede567c066 100644 --- a/gix-fs/Cargo.toml +++ b/gix-fs/Cargo.toml @@ -2,7 +2,7 @@ lints.workspace = true [package] name = "gix-fs" -version = "0.15.0" +version = "0.16.0" repository = "https://github.com/GitoxideLabs/gitoxide" license = "MIT OR Apache-2.0" description = "A crate providing file system specific utilities to `gitoxide`" @@ -20,8 +20,8 @@ serde = ["dep:serde"] [dependencies] bstr = "1.12.0" -gix-path = { version = "^0.10.17", path = "../gix-path" } -gix-features = { version = "^0.42.1", path = "../gix-features", features = ["fs-read-dir"] } +gix-path = { version = "^0.10.19", path = "../gix-path" } +gix-features = { version = "^0.43.0", path = "../gix-features", features = ["fs-read-dir"] } gix-utils = { version = "^0.3.0", path = "../gix-utils" } thiserror = "2.0.0" serde = { version = "1.0.114", optional = true, default-features = false, features = ["std", "derive"] } diff --git a/gix-fsck/CHANGELOG.md b/gix-fsck/CHANGELOG.md index 23293935944..8982763bce4 100644 --- a/gix-fsck/CHANGELOG.md +++ b/gix-fsck/CHANGELOG.md @@ -5,7 +5,7 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## Unreleased +## 0.12.0 (2025-07-15) A maintenance release without user-facing changes. @@ -13,7 +13,7 @@ A maintenance release without user-facing changes. - - 1 commit contributed to the release over the course of 79 calendar days. + - 2 commits contributed to the release over the course of 79 calendar days. - 79 days passed between releases. - 0 commits were understood as [conventional](https://www.conventionalcommits.org). - 0 issues like '(#ID)' were seen in commit messages @@ -25,6 +25,7 @@ A maintenance release without user-facing changes.
view details * **Uncategorized** + - Update changelogs prior to release ([`65037b5`](https://github.com/GitoxideLabs/gitoxide/commit/65037b56918b90ac07454a815b0ed136df2fca3b)) - Merge pull request #1971 from GitoxideLabs/new-release ([`8d4c4d1`](https://github.com/GitoxideLabs/gitoxide/commit/8d4c4d1e09f84c962c29d98a686c64228196ac13))
diff --git a/gix-fsck/Cargo.toml b/gix-fsck/Cargo.toml index cc58864459e..e9a283275ef 100644 --- a/gix-fsck/Cargo.toml +++ b/gix-fsck/Cargo.toml @@ -2,7 +2,7 @@ lints.workspace = true [package] name = "gix-fsck" -version = "0.11.1" +version = "0.12.0" repository = "https://github.com/GitoxideLabs/gitoxide" authors = ["Cameron Esfahani ", "Sebastian Thiel "] license = "MIT OR Apache-2.0" @@ -15,9 +15,9 @@ rust-version = "1.70" doctest = false [dependencies] -gix-hash = { version = "^0.18.0", path = "../gix-hash" } -gix-hashtable = { version = "^0.8.1", path = "../gix-hashtable" } -gix-object = { version = "^0.49.1", path = "../gix-object" } +gix-hash = { version = "^0.19.0", path = "../gix-hash" } +gix-hashtable = { version = "^0.9.0", path = "../gix-hashtable" } +gix-object = { version = "^0.50.0", path = "../gix-object" } [dev-dependencies] gix-odb = { path = "../gix-odb" } diff --git a/gix-glob/CHANGELOG.md b/gix-glob/CHANGELOG.md index dac004ff448..83b941d412a 100644 --- a/gix-glob/CHANGELOG.md +++ b/gix-glob/CHANGELOG.md @@ -5,7 +5,7 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## Unreleased +## 0.21.0 (2025-07-15) ### New Features (BREAKING) @@ -17,7 +17,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - - 3 commits contributed to the release over the course of 59 calendar days. + - 4 commits contributed to the release over the course of 59 calendar days. - 59 days passed between releases. - 1 commit was understood as [conventional](https://www.conventionalcommits.org). - 0 issues like '(#ID)' were seen in commit messages @@ -29,6 +29,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
view details * **Uncategorized** + - Update changelogs prior to release ([`65037b5`](https://github.com/GitoxideLabs/gitoxide/commit/65037b56918b90ac07454a815b0ed136df2fca3b)) - Merge pull request #2019 from GitoxideLabs/precious-opt-in ([`5f9de52`](https://github.com/GitoxideLabs/gitoxide/commit/5f9de52cf286163b503047b1ab3b51dfa093b4d4)) - Pattern parser in is now stateful to allow options for how to parse ignore patterns. ([`828e903`](https://github.com/GitoxideLabs/gitoxide/commit/828e9035a40796f79650cf5e3becb8d8e5e29883)) - Merge pull request #2014 from GitoxideLabs/zip ([`648022b`](https://github.com/GitoxideLabs/gitoxide/commit/648022b44e12f597cae55cc45830d0a19b87eb4c)) diff --git a/gix-glob/Cargo.toml b/gix-glob/Cargo.toml index bd2972da231..9af3e476aa5 100644 --- a/gix-glob/Cargo.toml +++ b/gix-glob/Cargo.toml @@ -2,7 +2,7 @@ lints.workspace = true [package] name = "gix-glob" -version = "0.20.1" +version = "0.21.0" repository = "https://github.com/GitoxideLabs/gitoxide" license = "MIT OR Apache-2.0" description = "A crate of the gitoxide project dealing with pattern matching" @@ -19,8 +19,8 @@ doctest = false serde = ["dep:serde", "bstr/serde", "bitflags/serde"] [dependencies] -gix-path = { version = "^0.10.18", path = "../gix-path" } -gix-features = { version = "^0.42.1", path = "../gix-features" } +gix-path = { version = "^0.10.19", path = "../gix-path" } +gix-features = { version = "^0.43.0", path = "../gix-features" } bstr = { version = "1.12.0", default-features = false, features = ["std"] } bitflags = "2" serde = { version = "1.0.114", optional = true, default-features = false, features = ["derive"] } diff --git a/gix-hash/CHANGELOG.md b/gix-hash/CHANGELOG.md index 928b1f18979..34f516529ec 100644 --- a/gix-hash/CHANGELOG.md +++ b/gix-hash/CHANGELOG.md @@ -5,7 +5,7 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## Unreleased +## 0.19.0 (2025-07-15) ### Bug Fixes @@ -17,7 +17,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - - 5 commits contributed to the release over the course of 79 calendar days. + - 6 commits contributed to the release over the course of 79 calendar days. - 79 days passed between releases. - 1 commit was understood as [conventional](https://www.conventionalcommits.org). - 0 issues like '(#ID)' were seen in commit messages @@ -29,6 +29,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
view details * **Uncategorized** + - Update changelogs prior to release ([`65037b5`](https://github.com/GitoxideLabs/gitoxide/commit/65037b56918b90ac07454a815b0ed136df2fca3b)) - Merge pull request #2062 from rickprice/minor_documentation_fixups ([`c2eb0c1`](https://github.com/GitoxideLabs/gitoxide/commit/c2eb0c144dd21cac87fd08829f4a5ca02f85008d)) - Small documentation fixes ([`bfb1c34`](https://github.com/GitoxideLabs/gitoxide/commit/bfb1c34f75997a603b8f85fca75bf9e1ca310be0)) - Merge pull request #2031 from bpeetz/serde ([`874cc38`](https://github.com/GitoxideLabs/gitoxide/commit/874cc388e1e6af558e7cab4e9238f447e8c122e1)) diff --git a/gix-hash/Cargo.toml b/gix-hash/Cargo.toml index 018e9fddc25..bb6da2f0e3b 100644 --- a/gix-hash/Cargo.toml +++ b/gix-hash/Cargo.toml @@ -2,7 +2,7 @@ lints.workspace = true [package] name = "gix-hash" -version = "0.18.0" +version = "0.19.0" description = "Borrowed and owned git hash digests used to identify git objects" authors = ["Sebastian Thiel "] repository = "https://github.com/GitoxideLabs/gitoxide" @@ -20,7 +20,7 @@ test = false serde = ["dep:serde", "faster-hex/serde"] [dependencies] -gix-features = { version = "^0.42.1", path = "../gix-features", features = ["progress"] } +gix-features = { version = "^0.43.0", path = "../gix-features", features = ["progress"] } thiserror = "2.0.0" faster-hex = { version = "0.10.0", default-features = false, features = ["std"] } diff --git a/gix-hashtable/CHANGELOG.md b/gix-hashtable/CHANGELOG.md index 3a917cbad0a..fcaeb5b5352 100644 --- a/gix-hashtable/CHANGELOG.md +++ b/gix-hashtable/CHANGELOG.md @@ -5,7 +5,9 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## Unreleased +## 0.9.0 (2025-07-15) + + ### Chore (BREAKING) @@ -16,7 +18,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - - 5 commits contributed to the release over the course of 79 calendar days. + - 6 commits contributed to the release over the course of 79 calendar days. - 79 days passed between releases. - 1 commit was understood as [conventional](https://www.conventionalcommits.org). - 0 issues like '(#ID)' were seen in commit messages @@ -28,6 +30,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
view details * **Uncategorized** + - Update changelogs prior to release ([`65037b5`](https://github.com/GitoxideLabs/gitoxide/commit/65037b56918b90ac07454a815b0ed136df2fca3b)) - Merge pull request #2047 from blinxen/update-hashbrown ([`00bd1fa`](https://github.com/GitoxideLabs/gitoxide/commit/00bd1fac8753a98fd0d4cdd8cf239b34e62b7d80)) - Update hashbrown to the latest version ([`c1d0868`](https://github.com/GitoxideLabs/gitoxide/commit/c1d0868c331c2f8ca8b22d22ff68744926a907b3)) - Merge pull request #2033 from GitoxideLabs/dependabot/cargo/cargo-b72232998d ([`f8d7c0a`](https://github.com/GitoxideLabs/gitoxide/commit/f8d7c0ad8fa7745c973c6b87e7eee70831300207)) diff --git a/gix-hashtable/Cargo.toml b/gix-hashtable/Cargo.toml index 3b84f51cac2..61b8663c8ef 100644 --- a/gix-hashtable/Cargo.toml +++ b/gix-hashtable/Cargo.toml @@ -2,7 +2,7 @@ lints.workspace = true [package] name = "gix-hashtable" -version = "0.8.1" +version = "0.9.0" repository = "https://github.com/GitoxideLabs/gitoxide" license = "MIT OR Apache-2.0" description = "A crate that provides hashtable based data structures optimized to utilize ObjectId keys" @@ -17,4 +17,4 @@ doctest = false [dependencies] parking_lot = "0.12.4" hashbrown = { version = "0.15.4", default-features = false, features = ["inline-more"] } -gix-hash = { version = "^0.18.0", path = "../gix-hash" } +gix-hash = { version = "^0.19.0", path = "../gix-hash" } diff --git a/gix-ignore/CHANGELOG.md b/gix-ignore/CHANGELOG.md index daf8dcca5fb..d85e93d77b5 100644 --- a/gix-ignore/CHANGELOG.md +++ b/gix-ignore/CHANGELOG.md @@ -5,7 +5,7 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## Unreleased +## 0.16.0 (2025-07-15) ### New Features (BREAKING) @@ -17,7 +17,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - - 7 commits contributed to the release over the course of 79 calendar days. + - 8 commits contributed to the release over the course of 79 calendar days. - 79 days passed between releases. - 1 commit was understood as [conventional](https://www.conventionalcommits.org). - 0 issues like '(#ID)' were seen in commit messages @@ -29,6 +29,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
view details * **Uncategorized** + - Update changelogs prior to release ([`65037b5`](https://github.com/GitoxideLabs/gitoxide/commit/65037b56918b90ac07454a815b0ed136df2fca3b)) - Merge pull request #2019 from GitoxideLabs/precious-opt-in ([`5f9de52`](https://github.com/GitoxideLabs/gitoxide/commit/5f9de52cf286163b503047b1ab3b51dfa093b4d4)) - Pattern parser in is now stateful to allow options for how to parse ignore patterns. ([`828e903`](https://github.com/GitoxideLabs/gitoxide/commit/828e9035a40796f79650cf5e3becb8d8e5e29883)) - Merge pull request #2014 from GitoxideLabs/zip ([`648022b`](https://github.com/GitoxideLabs/gitoxide/commit/648022b44e12f597cae55cc45830d0a19b87eb4c)) diff --git a/gix-ignore/Cargo.toml b/gix-ignore/Cargo.toml index b3d445f6a46..f50b836c323 100644 --- a/gix-ignore/Cargo.toml +++ b/gix-ignore/Cargo.toml @@ -2,7 +2,7 @@ lints.workspace = true [package] name = "gix-ignore" -version = "0.15.0" +version = "0.16.0" repository = "https://github.com/GitoxideLabs/gitoxide" license = "MIT OR Apache-2.0" description = "A crate of the gitoxide project dealing .gitignore files" @@ -19,9 +19,9 @@ doctest = false serde = ["dep:serde", "bstr/serde", "gix-glob/serde"] [dependencies] -gix-glob = { version = "^0.20.1", path = "../gix-glob" } -gix-path = { version = "^0.10.18", path = "../gix-path" } -gix-trace = { version = "^0.1.12", path = "../gix-trace" } +gix-glob = { version = "^0.21.0", path = "../gix-glob" } +gix-path = { version = "^0.10.19", path = "../gix-path" } +gix-trace = { version = "^0.1.13", path = "../gix-trace" } bstr = { version = "1.12.0", default-features = false, features = ["std", "unicode"] } unicode-bom = { version = "2.0.3" } diff --git a/gix-index/CHANGELOG.md b/gix-index/CHANGELOG.md index 23830871d2b..800d747b6aa 100644 --- a/gix-index/CHANGELOG.md +++ b/gix-index/CHANGELOG.md @@ -5,7 +5,7 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## Unreleased +## 0.41.0 (2025-07-15) ### Bug Fixes @@ -15,7 +15,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - - 7 commits contributed to the release over the course of 65 calendar days. + - 8 commits contributed to the release over the course of 65 calendar days. - 65 days passed between releases. - 1 commit was understood as [conventional](https://www.conventionalcommits.org). - 0 issues like '(#ID)' were seen in commit messages @@ -27,6 +27,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
view details * **Uncategorized** + - Update changelogs prior to release ([`65037b5`](https://github.com/GitoxideLabs/gitoxide/commit/65037b56918b90ac07454a815b0ed136df2fca3b)) - Merge pull request #2070 from GitoxideLabs/dependabot/cargo/cargo-827bceb7eb ([`dab97f7`](https://github.com/GitoxideLabs/gitoxide/commit/dab97f7618f160421b6e31de8f3e2f3d11dc2ef2)) - Bump the cargo group across 1 directory with 68 updates ([`a9a8ea1`](https://github.com/GitoxideLabs/gitoxide/commit/a9a8ea1472532dde03bce4e0afdfa82924af1f96)) - Merge pull request #2047 from blinxen/update-hashbrown ([`00bd1fa`](https://github.com/GitoxideLabs/gitoxide/commit/00bd1fac8753a98fd0d4cdd8cf239b34e62b7d80)) diff --git a/gix-index/Cargo.toml b/gix-index/Cargo.toml index c5a00c68c07..e3b9038621b 100644 --- a/gix-index/Cargo.toml +++ b/gix-index/Cargo.toml @@ -2,7 +2,7 @@ lints.workspace = true [package] name = "gix-index" -version = "0.40.1" +version = "0.41.0" repository = "https://github.com/GitoxideLabs/gitoxide" license = "MIT OR Apache-2.0" description = "A work-in-progress crate of the gitoxide project dedicated implementing the git index file" @@ -22,16 +22,16 @@ test = true serde = ["dep:serde", "smallvec/serde", "gix-hash/serde"] [dependencies] -gix-features = { version = "^0.42.1", path = "../gix-features", features = [ +gix-features = { version = "^0.43.0", path = "../gix-features", features = [ "progress", ] } -gix-hash = { version = "^0.18.0", path = "../gix-hash" } +gix-hash = { version = "^0.19.0", path = "../gix-hash" } gix-bitmap = { version = "^0.2.14", path = "../gix-bitmap" } -gix-object = { version = "^0.49.1", path = "../gix-object" } +gix-object = { version = "^0.50.0", path = "../gix-object" } gix-validate = { version = "^0.10.0", path = "../gix-validate" } -gix-traverse = { version = "^0.46.2", path = "../gix-traverse" } -gix-lock = { version = "^17.1.0", path = "../gix-lock" } -gix-fs = { version = "^0.15.0", path = "../gix-fs" } +gix-traverse = { version = "^0.47.0", path = "../gix-traverse" } +gix-lock = { version = "^18.0.0", path = "../gix-lock" } +gix-fs = { version = "^0.16.0", path = "../gix-fs" } gix-utils = { version = "^0.3.0", path = "../gix-utils" } hashbrown = "0.15.4" diff --git a/gix-lock/CHANGELOG.md b/gix-lock/CHANGELOG.md index 5ca950e6aba..c072c944fda 100644 --- a/gix-lock/CHANGELOG.md +++ b/gix-lock/CHANGELOG.md @@ -5,7 +5,7 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## Unreleased +## 18.0.0 (2025-07-15) A maintenance release without user-facing changes. @@ -13,7 +13,7 @@ A maintenance release without user-facing changes. - - 3 commits contributed to the release over the course of 79 calendar days. + - 4 commits contributed to the release over the course of 79 calendar days. - 79 days passed between releases. - 0 commits were understood as [conventional](https://www.conventionalcommits.org). - 0 issues like '(#ID)' were seen in commit messages @@ -25,6 +25,7 @@ A maintenance release without user-facing changes.
view details * **Uncategorized** + - Update changelogs prior to release ([`65037b5`](https://github.com/GitoxideLabs/gitoxide/commit/65037b56918b90ac07454a815b0ed136df2fca3b)) - Merge pull request #2033 from GitoxideLabs/dependabot/cargo/cargo-b72232998d ([`f8d7c0a`](https://github.com/GitoxideLabs/gitoxide/commit/f8d7c0ad8fa7745c973c6b87e7eee70831300207)) - Bump the cargo group with 56 updates ([`151e3a5`](https://github.com/GitoxideLabs/gitoxide/commit/151e3a5cca06444eea4c6a362649e66c831673d6)) - Merge pull request #1971 from GitoxideLabs/new-release ([`8d4c4d1`](https://github.com/GitoxideLabs/gitoxide/commit/8d4c4d1e09f84c962c29d98a686c64228196ac13)) diff --git a/gix-lock/Cargo.toml b/gix-lock/Cargo.toml index 545e0ea51b0..855a17c83f1 100644 --- a/gix-lock/Cargo.toml +++ b/gix-lock/Cargo.toml @@ -2,7 +2,7 @@ lints.workspace = true [package] name = "gix-lock" -version = "17.1.0" +version = "18.0.0" repository = "https://github.com/GitoxideLabs/gitoxide" license = "MIT OR Apache-2.0" description = "A git-style lock-file implementation" @@ -17,7 +17,7 @@ test = true [dependencies] gix-utils = { version = "^0.3.0", default-features = false, path = "../gix-utils" } -gix-tempfile = { version = "^17.1.0", default-features = false, path = "../gix-tempfile" } +gix-tempfile = { version = "^18.0.0", default-features = false, path = "../gix-tempfile" } thiserror = "2.0.0" [dev-dependencies] diff --git a/gix-mailmap/CHANGELOG.md b/gix-mailmap/CHANGELOG.md index c22ed8c3a08..fca0a330606 100644 --- a/gix-mailmap/CHANGELOG.md +++ b/gix-mailmap/CHANGELOG.md @@ -5,7 +5,7 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## Unreleased +## 0.27.2 (2025-07-15) A maintenance release without user-facing changes. @@ -13,7 +13,7 @@ A maintenance release without user-facing changes. - - 3 commits contributed to the release over the course of 79 calendar days. + - 4 commits contributed to the release over the course of 79 calendar days. - 79 days passed between releases. - 0 commits were understood as [conventional](https://www.conventionalcommits.org). - 0 issues like '(#ID)' were seen in commit messages @@ -25,6 +25,7 @@ A maintenance release without user-facing changes.
view details * **Uncategorized** + - Update changelogs prior to release ([`65037b5`](https://github.com/GitoxideLabs/gitoxide/commit/65037b56918b90ac07454a815b0ed136df2fca3b)) - Merge pull request #2009 from GitoxideLabs/release-gix-index ([`c3f06ae`](https://github.com/GitoxideLabs/gitoxide/commit/c3f06ae424ab4e1918a364cabe8276297465a73a)) - Release gix-path v0.10.18, gix-date v0.10.2, gix-traverse v0.46.2, gix-index v0.40.1 ([`d2b4c44`](https://github.com/GitoxideLabs/gitoxide/commit/d2b4c44fcb2bf43e80d67532262631a5086f08de)) - Merge pull request #1971 from GitoxideLabs/new-release ([`8d4c4d1`](https://github.com/GitoxideLabs/gitoxide/commit/8d4c4d1e09f84c962c29d98a686c64228196ac13)) diff --git a/gix-mailmap/Cargo.toml b/gix-mailmap/Cargo.toml index 13da1780038..d7e373f02e0 100644 --- a/gix-mailmap/Cargo.toml +++ b/gix-mailmap/Cargo.toml @@ -2,7 +2,7 @@ lints.workspace = true [package] name = "gix-mailmap" -version = "0.27.1" +version = "0.27.2" repository = "https://github.com/GitoxideLabs/gitoxide" license = "MIT OR Apache-2.0" description = "A crate of the gitoxide project for parsing mailmap files" @@ -19,8 +19,8 @@ doctest = false serde = ["dep:serde", "bstr/serde", "gix-actor/serde"] [dependencies] -gix-actor = { version = "^0.35.1", path = "../gix-actor" } -gix-date = { version = "^0.10.2", path = "../gix-date" } +gix-actor = { version = "^0.35.2", path = "../gix-actor" } +gix-date = { version = "^0.10.3", path = "../gix-date" } bstr = { version = "1.12.0", default-features = false, features = ["std", "unicode"] } thiserror = "2.0.0" serde = { version = "1.0.114", optional = true, default-features = false, features = ["derive"] } diff --git a/gix-merge/CHANGELOG.md b/gix-merge/CHANGELOG.md index b482813c44b..d108d71b195 100644 --- a/gix-merge/CHANGELOG.md +++ b/gix-merge/CHANGELOG.md @@ -5,7 +5,7 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## Unreleased +## 0.6.0 (2025-07-15) A maintenance release without user-facing changes. @@ -13,7 +13,7 @@ A maintenance release without user-facing changes. - - 7 commits contributed to the release over the course of 79 calendar days. + - 8 commits contributed to the release over the course of 79 calendar days. - 79 days passed between releases. - 0 commits were understood as [conventional](https://www.conventionalcommits.org). - 0 issues like '(#ID)' were seen in commit messages @@ -25,6 +25,7 @@ A maintenance release without user-facing changes.
view details * **Uncategorized** + - Update changelogs prior to release ([`65037b5`](https://github.com/GitoxideLabs/gitoxide/commit/65037b56918b90ac07454a815b0ed136df2fca3b)) - Merge pull request #2011 from blinxen/main ([`fd49eee`](https://github.com/GitoxideLabs/gitoxide/commit/fd49eeeb850ea3c3956ca15be2bf4e04a3d319ad)) - Update `imara-diff` to the latest version. ([`732adb8`](https://github.com/GitoxideLabs/gitoxide/commit/732adb87c90283bd8f8fce6d633eacc25e10b353)) - Merge pull request #2014 from GitoxideLabs/zip ([`648022b`](https://github.com/GitoxideLabs/gitoxide/commit/648022b44e12f597cae55cc45830d0a19b87eb4c)) diff --git a/gix-merge/Cargo.toml b/gix-merge/Cargo.toml index 2a0faaa6431..bccbee29cb6 100644 --- a/gix-merge/Cargo.toml +++ b/gix-merge/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "gix-merge" -version = "0.5.1" +version = "0.6.0" repository = "https://github.com/GitoxideLabs/gitoxide" license = "MIT OR Apache-2.0" description = "A crate of the gitoxide project implementing merge algorithms" @@ -19,20 +19,20 @@ doctest = false serde = ["dep:serde", "gix-hash/serde", "gix-object/serde"] [dependencies] -gix-hash = { version = "^0.18.0", path = "../gix-hash" } -gix-object = { version = "^0.49.1", path = "../gix-object" } -gix-filter = { version = "^0.19.2", path = "../gix-filter" } -gix-worktree = { version = "^0.41.0", path = "../gix-worktree", default-features = false, features = ["attributes"] } -gix-command = { version = "^0.6.1", path = "../gix-command" } -gix-path = { version = "^0.10.18", path = "../gix-path" } -gix-fs = { version = "^0.15.0", path = "../gix-fs" } -gix-tempfile = { version = "^17.1.0", path = "../gix-tempfile" } -gix-trace = { version = "^0.1.12", path = "../gix-trace" } +gix-hash = { version = "^0.19.0", path = "../gix-hash" } +gix-object = { version = "^0.50.0", path = "../gix-object" } +gix-filter = { version = "^0.20.0", path = "../gix-filter" } +gix-worktree = { version = "^0.42.0", path = "../gix-worktree", default-features = false, features = ["attributes"] } +gix-command = { version = "^0.6.2", path = "../gix-command" } +gix-path = { version = "^0.10.19", path = "../gix-path" } +gix-fs = { version = "^0.16.0", path = "../gix-fs" } +gix-tempfile = { version = "^18.0.0", path = "../gix-tempfile" } +gix-trace = { version = "^0.1.13", path = "../gix-trace" } gix-quote = { version = "^0.6.0", path = "../gix-quote" } -gix-revision = { version = "^0.34.1", path = "../gix-revision", default-features = false, features = ["merge_base"] } -gix-revwalk = { version = "^0.20.1", path = "../gix-revwalk" } -gix-diff = { version = "^0.52.1", path = "../gix-diff", default-features = false, features = ["blob"] } -gix-index = { version = "^0.40.1", path = "../gix-index" } +gix-revision = { version = "^0.35.0", path = "../gix-revision", default-features = false, features = ["merge_base"] } +gix-revwalk = { version = "^0.21.0", path = "../gix-revwalk" } +gix-diff = { version = "^0.53.0", path = "../gix-diff", default-features = false, features = ["blob"] } +gix-index = { version = "^0.41.0", path = "../gix-index" } thiserror = "2.0.0" imara-diff = { version = "0.1.8" } diff --git a/gix-negotiate/CHANGELOG.md b/gix-negotiate/CHANGELOG.md index 725ca1fd899..875d132eeae 100644 --- a/gix-negotiate/CHANGELOG.md +++ b/gix-negotiate/CHANGELOG.md @@ -5,7 +5,7 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## Unreleased +## 0.21.0 (2025-07-15) A maintenance release without user-facing changes. @@ -13,7 +13,7 @@ A maintenance release without user-facing changes. - - 5 commits contributed to the release over the course of 79 calendar days. + - 6 commits contributed to the release over the course of 79 calendar days. - 79 days passed between releases. - 0 commits were understood as [conventional](https://www.conventionalcommits.org). - 0 issues like '(#ID)' were seen in commit messages @@ -25,6 +25,7 @@ A maintenance release without user-facing changes.
view details * **Uncategorized** + - Update changelogs prior to release ([`65037b5`](https://github.com/GitoxideLabs/gitoxide/commit/65037b56918b90ac07454a815b0ed136df2fca3b)) - Merge pull request #2070 from GitoxideLabs/dependabot/cargo/cargo-827bceb7eb ([`dab97f7`](https://github.com/GitoxideLabs/gitoxide/commit/dab97f7618f160421b6e31de8f3e2f3d11dc2ef2)) - Bump the cargo group across 1 directory with 68 updates ([`a9a8ea1`](https://github.com/GitoxideLabs/gitoxide/commit/a9a8ea1472532dde03bce4e0afdfa82924af1f96)) - Merge pull request #2009 from GitoxideLabs/release-gix-index ([`c3f06ae`](https://github.com/GitoxideLabs/gitoxide/commit/c3f06ae424ab4e1918a364cabe8276297465a73a)) diff --git a/gix-negotiate/Cargo.toml b/gix-negotiate/Cargo.toml index 7a409c7d05d..c9b7dfff7ac 100644 --- a/gix-negotiate/Cargo.toml +++ b/gix-negotiate/Cargo.toml @@ -2,7 +2,7 @@ lints.workspace = true [package] name = "gix-negotiate" -version = "0.20.1" +version = "0.21.0" repository = "https://github.com/GitoxideLabs/gitoxide" license = "MIT OR Apache-2.0" description = "A crate of the gitoxide project implementing negotiation algorithms" @@ -16,11 +16,11 @@ doctest = false test = false [dependencies] -gix-hash = { version = "^0.18.0", path = "../gix-hash" } -gix-object = { version = "^0.49.1", path = "../gix-object" } -gix-date = { version = "^0.10.2", path = "../gix-date" } -gix-commitgraph = { version = "^0.28.0", path = "../gix-commitgraph" } -gix-revwalk = { version = "^0.20.1", path = "../gix-revwalk" } +gix-hash = { version = "^0.19.0", path = "../gix-hash" } +gix-object = { version = "^0.50.0", path = "../gix-object" } +gix-date = { version = "^0.10.3", path = "../gix-date" } +gix-commitgraph = { version = "^0.29.0", path = "../gix-commitgraph" } +gix-revwalk = { version = "^0.21.0", path = "../gix-revwalk" } thiserror = "2.0.0" smallvec = "1.15.1" bitflags = "2" diff --git a/gix-object/CHANGELOG.md b/gix-object/CHANGELOG.md index 45a29823d15..c3aba9dbfcb 100644 --- a/gix-object/CHANGELOG.md +++ b/gix-object/CHANGELOG.md @@ -5,7 +5,7 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## Unreleased +## 0.50.0 (2025-07-15) ### New Features @@ -15,7 +15,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - - 11 commits contributed to the release over the course of 79 calendar days. + - 12 commits contributed to the release over the course of 79 calendar days. - 79 days passed between releases. - 1 commit was understood as [conventional](https://www.conventionalcommits.org). - 0 issues like '(#ID)' were seen in commit messages @@ -27,6 +27,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
view details * **Uncategorized** + - Update changelogs prior to release ([`65037b5`](https://github.com/GitoxideLabs/gitoxide/commit/65037b56918b90ac07454a815b0ed136df2fca3b)) - Merge pull request #2070 from GitoxideLabs/dependabot/cargo/cargo-827bceb7eb ([`dab97f7`](https://github.com/GitoxideLabs/gitoxide/commit/dab97f7618f160421b6e31de8f3e2f3d11dc2ef2)) - Bump the cargo group across 1 directory with 68 updates ([`a9a8ea1`](https://github.com/GitoxideLabs/gitoxide/commit/a9a8ea1472532dde03bce4e0afdfa82924af1f96)) - Merge pull request #2062 from rickprice/minor_documentation_fixups ([`c2eb0c1`](https://github.com/GitoxideLabs/gitoxide/commit/c2eb0c144dd21cac87fd08829f4a5ca02f85008d)) diff --git a/gix-object/Cargo.toml b/gix-object/Cargo.toml index 0d9b89fbe64..a53028e1342 100644 --- a/gix-object/Cargo.toml +++ b/gix-object/Cargo.toml @@ -2,7 +2,7 @@ lints.workspace = true [package] name = "gix-object" -version = "0.49.1" +version = "0.50.0" description = "Immutable and mutable git objects with decoding and encoding support" authors = ["Sebastian Thiel "] repository = "https://github.com/GitoxideLabs/gitoxide" @@ -41,15 +41,15 @@ serde = [ verbose-object-parsing-errors = ["winnow/std"] [dependencies] -gix-features = { version = "^0.42.1", path = "../gix-features", features = [ +gix-features = { version = "^0.43.0", path = "../gix-features", features = [ "progress", ] } -gix-hash = { version = "^0.18.0", path = "../gix-hash" } -gix-hashtable = { version = "^0.8.1", path = "../gix-hashtable" } +gix-hash = { version = "^0.19.0", path = "../gix-hash" } +gix-hashtable = { version = "^0.9.0", path = "../gix-hashtable" } gix-validate = { version = "^0.10.0", path = "../gix-validate" } -gix-actor = { version = "^0.35.1", path = "../gix-actor" } -gix-date = { version = "^0.10.1", path = "../gix-date" } -gix-path = { version = "^0.10.17", path = "../gix-path" } +gix-actor = { version = "^0.35.2", path = "../gix-actor" } +gix-date = { version = "^0.10.3", path = "../gix-date" } +gix-path = { version = "^0.10.19", path = "../gix-path" } gix-utils = { version = "^0.3.0", path = "../gix-utils" } itoa = "1.0.1" diff --git a/gix-odb/CHANGELOG.md b/gix-odb/CHANGELOG.md index 044b93b83d7..b1c088c5efd 100644 --- a/gix-odb/CHANGELOG.md +++ b/gix-odb/CHANGELOG.md @@ -5,7 +5,7 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## Unreleased +## 0.70.0 (2025-07-15) ### Bug Fixes @@ -16,7 +16,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - - 10 commits contributed to the release over the course of 79 calendar days. + - 11 commits contributed to the release over the course of 79 calendar days. - 79 days passed between releases. - 1 commit was understood as [conventional](https://www.conventionalcommits.org). - 0 issues like '(#ID)' were seen in commit messages @@ -34,6 +34,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
view details * **Uncategorized** + - Update changelogs prior to release ([`65037b5`](https://github.com/GitoxideLabs/gitoxide/commit/65037b56918b90ac07454a815b0ed136df2fca3b)) - Improve error message for when there is too many packs. ([`a773854`](https://github.com/GitoxideLabs/gitoxide/commit/a773854a798bb2315dcce347d86b856b8fac8dc9)) - Merge pull request #2041 from cruessler/add-blame-extraction ([`dd5f0a4`](https://github.com/GitoxideLabs/gitoxide/commit/dd5f0a4811bc738051f7af164b8d2815aaa23220)) - Thanks clippy ([`554ce13`](https://github.com/GitoxideLabs/gitoxide/commit/554ce134bc4b514b52a935f17f57f76ebf23ab97)) diff --git a/gix-odb/Cargo.toml b/gix-odb/Cargo.toml index 8dca99eecf0..8cc5e0df69a 100644 --- a/gix-odb/Cargo.toml +++ b/gix-odb/Cargo.toml @@ -2,7 +2,7 @@ lints.workspace = true [package] name = "gix-odb" -version = "0.69.1" +version = "0.70.0" repository = "https://github.com/GitoxideLabs/gitoxide" authors = ["Sebastian Thiel "] license = "MIT OR Apache-2.0" @@ -20,15 +20,15 @@ doctest = false serde = ["dep:serde", "gix-hash/serde", "gix-object/serde", "gix-pack/serde"] [dependencies] -gix-features = { version = "^0.42.1", path = "../gix-features", features = ["walkdir", "zlib", "crc32"] } -gix-hashtable = { version = "^0.8.1", path = "../gix-hashtable" } -gix-hash = { version = "^0.18.0", path = "../gix-hash" } -gix-date = { version = "^0.10.2", path = "../gix-date" } -gix-path = { version = "^0.10.18", path = "../gix-path" } +gix-features = { version = "^0.43.0", path = "../gix-features", features = ["walkdir", "zlib", "crc32"] } +gix-hashtable = { version = "^0.9.0", path = "../gix-hashtable" } +gix-hash = { version = "^0.19.0", path = "../gix-hash" } +gix-date = { version = "^0.10.3", path = "../gix-date" } +gix-path = { version = "^0.10.19", path = "../gix-path" } gix-quote = { version = "^0.6.0", path = "../gix-quote" } -gix-object = { version = "^0.49.1", path = "../gix-object" } -gix-pack = { version = "^0.59.1", path = "../gix-pack", default-features = false } -gix-fs = { version = "^0.15.0", path = "../gix-fs" } +gix-object = { version = "^0.50.0", path = "../gix-object" } +gix-pack = { version = "^0.60.0", path = "../gix-pack", default-features = false } +gix-fs = { version = "^0.16.0", path = "../gix-fs" } serde = { version = "1.0.114", optional = true, default-features = false, features = ["derive"] } tempfile = "3.20.0" diff --git a/gix-pack/CHANGELOG.md b/gix-pack/CHANGELOG.md index 1447f8803a8..85c4bd33229 100644 --- a/gix-pack/CHANGELOG.md +++ b/gix-pack/CHANGELOG.md @@ -5,7 +5,9 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## Unreleased +## 0.60.0 (2025-07-15) + + ### Other @@ -15,7 +17,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - - 12 commits contributed to the release over the course of 79 calendar days. + - 13 commits contributed to the release over the course of 79 calendar days. - 79 days passed between releases. - 1 commit was understood as [conventional](https://www.conventionalcommits.org). - 0 issues like '(#ID)' were seen in commit messages @@ -27,6 +29,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
view details * **Uncategorized** + - Update changelogs prior to release ([`65037b5`](https://github.com/GitoxideLabs/gitoxide/commit/65037b56918b90ac07454a815b0ed136df2fca3b)) - Merge pull request #2070 from GitoxideLabs/dependabot/cargo/cargo-827bceb7eb ([`dab97f7`](https://github.com/GitoxideLabs/gitoxide/commit/dab97f7618f160421b6e31de8f3e2f3d11dc2ef2)) - Bump the cargo group across 1 directory with 68 updates ([`a9a8ea1`](https://github.com/GitoxideLabs/gitoxide/commit/a9a8ea1472532dde03bce4e0afdfa82924af1f96)) - Merge pull request #2062 from rickprice/minor_documentation_fixups ([`c2eb0c1`](https://github.com/GitoxideLabs/gitoxide/commit/c2eb0c144dd21cac87fd08829f4a5ca02f85008d)) diff --git a/gix-pack/Cargo.toml b/gix-pack/Cargo.toml index 1ae3c6edbd1..23bfb66652b 100644 --- a/gix-pack/Cargo.toml +++ b/gix-pack/Cargo.toml @@ -2,7 +2,7 @@ lints.workspace = true [package] name = "gix-pack" -version = "0.59.1" +version = "0.60.0" repository = "https://github.com/GitoxideLabs/gitoxide" authors = ["Sebastian Thiel "] license = "MIT OR Apache-2.0" @@ -34,16 +34,16 @@ serde = ["dep:serde", "gix-object/serde"] wasm = ["gix-diff?/wasm"] [dependencies] -gix-features = { version = "^0.42.1", path = "../gix-features", features = ["crc32", "progress", "zlib"] } -gix-path = { version = "^0.10.18", path = "../gix-path" } -gix-hash = { version = "^0.18.0", path = "../gix-hash" } +gix-features = { version = "^0.43.0", path = "../gix-features", features = ["crc32", "progress", "zlib"] } +gix-path = { version = "^0.10.19", path = "../gix-path" } +gix-hash = { version = "^0.19.0", path = "../gix-hash" } gix-chunk = { version = "^0.4.11", path = "../gix-chunk" } -gix-object = { version = "^0.49.1", path = "../gix-object" } -gix-hashtable = { version = "^0.8.1", path = "../gix-hashtable", optional = true } +gix-object = { version = "^0.50.0", path = "../gix-object" } +gix-hashtable = { version = "^0.9.0", path = "../gix-hashtable", optional = true } # for streaming of packs (input, output) -gix-traverse = { version = "^0.46.2", path = "../gix-traverse", optional = true } -gix-diff = { version = "^0.52.1", path = "../gix-diff", default-features = false, optional = true } +gix-traverse = { version = "^0.47.0", path = "../gix-traverse", optional = true } +gix-diff = { version = "^0.53.0", path = "../gix-diff", default-features = false, optional = true } memmap2 = "0.9.0" smallvec = "1.15.1" @@ -60,7 +60,7 @@ document-features = { version = "0.2.0", optional = true } [target.'cfg(not(target_arch = "wasm32"))'.dependencies] -gix-tempfile = { version = "^17.1.0", default-features = false, path = "../gix-tempfile", optional = true } +gix-tempfile = { version = "^18.0.0", default-features = false, path = "../gix-tempfile", optional = true } [dev-dependencies] gix-testtools = { path = "../tests/tools" } diff --git a/gix-packetline-blocking/CHANGELOG.md b/gix-packetline-blocking/CHANGELOG.md index adf5a5e4c8d..1d7ef18b1c0 100644 --- a/gix-packetline-blocking/CHANGELOG.md +++ b/gix-packetline-blocking/CHANGELOG.md @@ -5,7 +5,7 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## Unreleased +## 0.19.1 (2025-07-15) ### Bug Fixes @@ -17,7 +17,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - - 3 commits contributed to the release over the course of 79 calendar days. + - 4 commits contributed to the release over the course of 79 calendar days. - 79 days passed between releases. - 1 commit was understood as [conventional](https://www.conventionalcommits.org). - 0 issues like '(#ID)' were seen in commit messages @@ -29,6 +29,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
view details * **Uncategorized** + - Update changelogs prior to release ([`65037b5`](https://github.com/GitoxideLabs/gitoxide/commit/65037b56918b90ac07454a815b0ed136df2fca3b)) - Merge pull request #2031 from bpeetz/serde ([`874cc38`](https://github.com/GitoxideLabs/gitoxide/commit/874cc388e1e6af558e7cab4e9238f447e8c122e1)) - Actually avoid `serde` as dependency, when the serde feature is off ([`0d67c85`](https://github.com/GitoxideLabs/gitoxide/commit/0d67c8524058a718083d31eae827f7f60332b20a)) - Merge pull request #1971 from GitoxideLabs/new-release ([`8d4c4d1`](https://github.com/GitoxideLabs/gitoxide/commit/8d4c4d1e09f84c962c29d98a686c64228196ac13)) diff --git a/gix-packetline-blocking/Cargo.toml b/gix-packetline-blocking/Cargo.toml index bfb46086f49..5c72b35e8b2 100644 --- a/gix-packetline-blocking/Cargo.toml +++ b/gix-packetline-blocking/Cargo.toml @@ -2,7 +2,7 @@ lints.workspace = true [package] name = "gix-packetline-blocking" -version = "0.19.0" +version = "0.19.1" repository = "https://github.com/GitoxideLabs/gitoxide" license = "MIT OR Apache-2.0" description = "A duplicate of `gix-packetline` with the `blocking-io` feature pre-selected" @@ -29,7 +29,7 @@ async-io = [] serde = ["dep:serde", "bstr/serde", "faster-hex/serde"] [dependencies] -gix-trace = { version = "^0.1.12", path = "../gix-trace" } +gix-trace = { version = "^0.1.13", path = "../gix-trace" } serde = { version = "1.0.114", optional = true, default-features = false, features = ["std", "derive"] } thiserror = "2.0.0" diff --git a/gix-packetline/CHANGELOG.md b/gix-packetline/CHANGELOG.md index 240769f78d3..846fce99f90 100644 --- a/gix-packetline/CHANGELOG.md +++ b/gix-packetline/CHANGELOG.md @@ -5,7 +5,7 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## Unreleased +## 0.19.1 (2025-07-15) ### Bug Fixes @@ -17,7 +17,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - - 3 commits contributed to the release over the course of 79 calendar days. + - 4 commits contributed to the release over the course of 79 calendar days. - 79 days passed between releases. - 1 commit was understood as [conventional](https://www.conventionalcommits.org). - 0 issues like '(#ID)' were seen in commit messages @@ -29,6 +29,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
view details * **Uncategorized** + - Update changelogs prior to release ([`65037b5`](https://github.com/GitoxideLabs/gitoxide/commit/65037b56918b90ac07454a815b0ed136df2fca3b)) - Merge pull request #2031 from bpeetz/serde ([`874cc38`](https://github.com/GitoxideLabs/gitoxide/commit/874cc388e1e6af558e7cab4e9238f447e8c122e1)) - Actually avoid `serde` as dependency, when the serde feature is off ([`0d67c85`](https://github.com/GitoxideLabs/gitoxide/commit/0d67c8524058a718083d31eae827f7f60332b20a)) - Merge pull request #1971 from GitoxideLabs/new-release ([`8d4c4d1`](https://github.com/GitoxideLabs/gitoxide/commit/8d4c4d1e09f84c962c29d98a686c64228196ac13)) diff --git a/gix-packetline/Cargo.toml b/gix-packetline/Cargo.toml index 71caa3a327d..8d2a8a80f42 100644 --- a/gix-packetline/Cargo.toml +++ b/gix-packetline/Cargo.toml @@ -2,7 +2,7 @@ lints.workspace = true [package] name = "gix-packetline" -version = "0.19.0" +version = "0.19.1" repository = "https://github.com/GitoxideLabs/gitoxide" license = "MIT OR Apache-2.0" description = "A crate of the gitoxide project implementing the pkt-line serialization format" @@ -42,7 +42,7 @@ path = "tests/blocking-packetline.rs" required-features = ["blocking-io", "maybe-async/is_sync"] [dependencies] -gix-trace = { version = "^0.1.12", path = "../gix-trace" } +gix-trace = { version = "^0.1.13", path = "../gix-trace" } serde = { version = "1.0.114", optional = true, default-features = false, features = ["std", "derive"] } thiserror = "2.0.0" diff --git a/gix-path/CHANGELOG.md b/gix-path/CHANGELOG.md index 54409c08d60..783be232fb4 100644 --- a/gix-path/CHANGELOG.md +++ b/gix-path/CHANGELOG.md @@ -5,7 +5,9 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## Unreleased +## 0.10.19 (2025-07-15) + + ### Other @@ -15,7 +17,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - - 4 commits contributed to the release over the course of 65 calendar days. + - 5 commits contributed to the release over the course of 65 calendar days. - 65 days passed between releases. - 1 commit was understood as [conventional](https://www.conventionalcommits.org). - 1 unique issue was worked on: [#2074](https://github.com/GitoxideLabs/gitoxide/issues/2074) @@ -29,6 +31,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 * **[#2074](https://github.com/GitoxideLabs/gitoxide/issues/2074)** - Improve and correct `normalize()` documentation ([`45b369c`](https://github.com/GitoxideLabs/gitoxide/commit/45b369c65e7d36d42c8250b020ea5523615046e3)) * **Uncategorized** + - Update changelogs prior to release ([`65037b5`](https://github.com/GitoxideLabs/gitoxide/commit/65037b56918b90ac07454a815b0ed136df2fca3b)) - Merge pull request #2070 from GitoxideLabs/dependabot/cargo/cargo-827bceb7eb ([`dab97f7`](https://github.com/GitoxideLabs/gitoxide/commit/dab97f7618f160421b6e31de8f3e2f3d11dc2ef2)) - Bump the cargo group across 1 directory with 68 updates ([`a9a8ea1`](https://github.com/GitoxideLabs/gitoxide/commit/a9a8ea1472532dde03bce4e0afdfa82924af1f96)) - Merge pull request #2009 from GitoxideLabs/release-gix-index ([`c3f06ae`](https://github.com/GitoxideLabs/gitoxide/commit/c3f06ae424ab4e1918a364cabe8276297465a73a)) @@ -180,6 +183,15 @@ A maintenance release without user-facing changes. - https://github.com/GitoxideLabs/gitoxide/pull/1862#issuecomment-2692158831 - https://github.com/GitoxideLabs/gitoxide/pull/1862#issuecomment-2692158831 - https://github.com/GitoxideLabs/gitoxide/pull/1862#issuecomment-2692158831 + - https://github.com/GitoxideLabs/gitoxide/pull/1862#issuecomment-2692158831 +- https://github.com/GitoxideLabs/gitoxide/pull/1862#issuecomment-2692158831 +- https://github.com/GitoxideLabs/gitoxide/pull/1862#issuecomment-2692158831 +- https://github.com/GitoxideLabs/gitoxide/pull/1862#issuecomment-2692158831 +- https://github.com/GitoxideLabs/gitoxide/pull/1862#issuecomment-2692158831 +- https://github.com/GitoxideLabs/gitoxide/pull/1862#issuecomment-2692158831 +- https://github.com/GitoxideLabs/gitoxide/pull/1862#issuecomment-2692158831 +- https://github.com/GitoxideLabs/gitoxide/pull/1862#issuecomment-2692158831 +- https://github.com/GitoxideLabs/gitoxide/pull/1862#issuecomment-2692158831 - https://github.com/GitoxideLabs/gitoxide/pull/1862#issuecomment-2692158831 - https://github.com/GitoxideLabs/gitoxide/pull/1862#issuecomment-2692158831 - https://github.com/GitoxideLabs/gitoxide/pull/1862#issuecomment-2692158831 diff --git a/gix-path/Cargo.toml b/gix-path/Cargo.toml index e5644dbb062..2320d85bac4 100644 --- a/gix-path/Cargo.toml +++ b/gix-path/Cargo.toml @@ -2,7 +2,7 @@ lints.workspace = true [package] name = "gix-path" -version = "0.10.18" +version = "0.10.19" repository = "https://github.com/GitoxideLabs/gitoxide" license = "MIT OR Apache-2.0" description = "A crate of the gitoxide project dealing paths and their conversions" @@ -15,7 +15,7 @@ rust-version = "1.70" doctest = true [dependencies] -gix-trace = { version = "^0.1.12", path = "../gix-trace" } +gix-trace = { version = "^0.1.13", path = "../gix-trace" } gix-validate = { version = "^0.10.0", path = "../gix-validate" } bstr = { version = "1.12.0", default-features = false, features = ["std"] } thiserror = "2.0.0" diff --git a/gix-pathspec/CHANGELOG.md b/gix-pathspec/CHANGELOG.md index 879d2481efc..cd510e8246c 100644 --- a/gix-pathspec/CHANGELOG.md +++ b/gix-pathspec/CHANGELOG.md @@ -5,7 +5,7 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## Unreleased +## 0.12.0 (2025-07-15) A maintenance release without user-facing changes. @@ -13,7 +13,7 @@ A maintenance release without user-facing changes. - - 7 commits contributed to the release over the course of 79 calendar days. + - 8 commits contributed to the release over the course of 79 calendar days. - 79 days passed between releases. - 0 commits were understood as [conventional](https://www.conventionalcommits.org). - 0 issues like '(#ID)' were seen in commit messages @@ -31,6 +31,7 @@ A maintenance release without user-facing changes.
view details * **Uncategorized** + - Update changelogs prior to release ([`65037b5`](https://github.com/GitoxideLabs/gitoxide/commit/65037b56918b90ac07454a815b0ed136df2fca3b)) - Merge pull request #2014 from GitoxideLabs/zip ([`648022b`](https://github.com/GitoxideLabs/gitoxide/commit/648022b44e12f597cae55cc45830d0a19b87eb4c)) - Release gix-glob v0.20.1, gix-attributes v0.26.1, gix-command v0.6.1, gix-filter v0.19.2, gix-worktree-stream v0.21.2, gix-archive v0.21.2 ([`f0ed2cc`](https://github.com/GitoxideLabs/gitoxide/commit/f0ed2cc0046f866e67944bff9aef0579c12d5852)) - Merge pull request #2009 from GitoxideLabs/release-gix-index ([`c3f06ae`](https://github.com/GitoxideLabs/gitoxide/commit/c3f06ae424ab4e1918a364cabe8276297465a73a)) diff --git a/gix-pathspec/Cargo.toml b/gix-pathspec/Cargo.toml index 4985ea67778..1068a411fe0 100644 --- a/gix-pathspec/Cargo.toml +++ b/gix-pathspec/Cargo.toml @@ -2,7 +2,7 @@ lints.workspace = true [package] name = "gix-pathspec" -version = "0.11.0" +version = "0.12.0" repository = "https://github.com/GitoxideLabs/gitoxide" license = "MIT OR Apache-2.0" description = "A crate of the gitoxide project dealing magical pathspecs" @@ -15,10 +15,10 @@ include = ["src/**/*", "LICENSE-*", "README.md"] doctest = false [dependencies] -gix-glob = { version = "^0.20.1", path = "../gix-glob" } -gix-path = { version = "^0.10.18", path = "../gix-path" } -gix-attributes = { version = "^0.26.1", path = "../gix-attributes" } -gix-config-value = { version = "^0.15.0", path = "../gix-config-value" } +gix-glob = { version = "^0.21.0", path = "../gix-glob" } +gix-path = { version = "^0.10.19", path = "../gix-path" } +gix-attributes = { version = "^0.27.0", path = "../gix-attributes" } +gix-config-value = { version = "^0.15.1", path = "../gix-config-value" } bstr = { version = "1.12.0", default-features = false, features = ["std"] } bitflags = "2" diff --git a/gix-prompt/CHANGELOG.md b/gix-prompt/CHANGELOG.md index c25bbd05a04..dce27cc5325 100644 --- a/gix-prompt/CHANGELOG.md +++ b/gix-prompt/CHANGELOG.md @@ -5,7 +5,7 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## Unreleased +## 0.11.1 (2025-07-15) A maintenance release without user-facing changes. @@ -13,7 +13,7 @@ A maintenance release without user-facing changes. - - 7 commits contributed to the release over the course of 79 calendar days. + - 8 commits contributed to the release over the course of 79 calendar days. - 79 days passed between releases. - 0 commits were understood as [conventional](https://www.conventionalcommits.org). - 0 issues like '(#ID)' were seen in commit messages @@ -25,6 +25,7 @@ A maintenance release without user-facing changes.
view details * **Uncategorized** + - Update changelogs prior to release ([`65037b5`](https://github.com/GitoxideLabs/gitoxide/commit/65037b56918b90ac07454a815b0ed136df2fca3b)) - Merge pull request #2033 from GitoxideLabs/dependabot/cargo/cargo-b72232998d ([`f8d7c0a`](https://github.com/GitoxideLabs/gitoxide/commit/f8d7c0ad8fa7745c973c6b87e7eee70831300207)) - Bump the cargo group with 56 updates ([`151e3a5`](https://github.com/GitoxideLabs/gitoxide/commit/151e3a5cca06444eea4c6a362649e66c831673d6)) - Merge pull request #2014 from GitoxideLabs/zip ([`648022b`](https://github.com/GitoxideLabs/gitoxide/commit/648022b44e12f597cae55cc45830d0a19b87eb4c)) diff --git a/gix-prompt/Cargo.toml b/gix-prompt/Cargo.toml index cce12ffc93d..c3f36a36fe5 100644 --- a/gix-prompt/Cargo.toml +++ b/gix-prompt/Cargo.toml @@ -2,7 +2,7 @@ lints.workspace = true [package] name = "gix-prompt" -version = "0.11.0" +version = "0.11.1" repository = "https://github.com/GitoxideLabs/gitoxide" license = "MIT OR Apache-2.0" description = "A crate of the gitoxide project for handling prompts in the terminal" @@ -15,8 +15,8 @@ rust-version = "1.70" doctest = false [dependencies] -gix-command = { version = "^0.6.1", path = "../gix-command" } -gix-config-value = { version = "^0.15.0", path = "../gix-config-value" } +gix-command = { version = "^0.6.2", path = "../gix-command" } +gix-config-value = { version = "^0.15.1", path = "../gix-config-value" } thiserror = "2.0.0" diff --git a/gix-protocol/CHANGELOG.md b/gix-protocol/CHANGELOG.md index 0d3f8e411bf..cc0f3a7ecb6 100644 --- a/gix-protocol/CHANGELOG.md +++ b/gix-protocol/CHANGELOG.md @@ -5,7 +5,7 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## Unreleased +## 0.51.0 (2025-07-15) A maintenance release without user-facing changes. @@ -13,7 +13,7 @@ A maintenance release without user-facing changes. - - 9 commits contributed to the release over the course of 79 calendar days. + - 10 commits contributed to the release over the course of 79 calendar days. - 79 days passed between releases. - 0 commits were understood as [conventional](https://www.conventionalcommits.org). - 0 issues like '(#ID)' were seen in commit messages @@ -31,6 +31,7 @@ A maintenance release without user-facing changes.
view details * **Uncategorized** + - Update changelogs prior to release ([`65037b5`](https://github.com/GitoxideLabs/gitoxide/commit/65037b56918b90ac07454a815b0ed136df2fca3b)) - Merge pull request #2062 from rickprice/minor_documentation_fixups ([`c2eb0c1`](https://github.com/GitoxideLabs/gitoxide/commit/c2eb0c144dd21cac87fd08829f4a5ca02f85008d)) - Small documentation fixes ([`bfb1c34`](https://github.com/GitoxideLabs/gitoxide/commit/bfb1c34f75997a603b8f85fca75bf9e1ca310be0)) - Merge pull request #2033 from GitoxideLabs/dependabot/cargo/cargo-b72232998d ([`f8d7c0a`](https://github.com/GitoxideLabs/gitoxide/commit/f8d7c0ad8fa7745c973c6b87e7eee70831300207)) diff --git a/gix-protocol/Cargo.toml b/gix-protocol/Cargo.toml index 5afdd6da987..e2818e221a2 100644 --- a/gix-protocol/Cargo.toml +++ b/gix-protocol/Cargo.toml @@ -2,7 +2,7 @@ lints.workspace = true [package] name = "gix-protocol" -version = "0.50.1" +version = "0.51.0" repository = "https://github.com/GitoxideLabs/gitoxide" license = "MIT OR Apache-2.0" description = "A crate of the gitoxide project for implementing git protocols" @@ -68,23 +68,23 @@ path = "tests/async-protocol.rs" required-features = ["async-client"] [dependencies] -gix-features = { version = "^0.42.1", path = "../gix-features", features = [ +gix-features = { version = "^0.43.0", path = "../gix-features", features = [ "progress", ] } -gix-transport = { version = "^0.47.0", path = "../gix-transport" } -gix-hash = { version = "^0.18.0", path = "../gix-hash" } -gix-shallow = { version = "^0.4.0", path = "../gix-shallow" } -gix-date = { version = "^0.10.2", path = "../gix-date" } +gix-transport = { version = "^0.48.0", path = "../gix-transport" } +gix-hash = { version = "^0.19.0", path = "../gix-hash" } +gix-shallow = { version = "^0.5.0", path = "../gix-shallow" } +gix-date = { version = "^0.10.3", path = "../gix-date" } gix-utils = { version = "^0.3.0", path = "../gix-utils" } -gix-ref = { version = "^0.52.1", path = "../gix-ref" } +gix-ref = { version = "^0.53.0", path = "../gix-ref" } -gix-trace = { version = "^0.1.12", path = "../gix-trace", optional = true } -gix-negotiate = { version = "^0.20.1", path = "../gix-negotiate", optional = true } -gix-object = { version = "^0.49.1", path = "../gix-object", optional = true } -gix-revwalk = { version = "^0.20.1", path = "../gix-revwalk", optional = true } -gix-credentials = { version = "^0.29.0", path = "../gix-credentials", optional = true } -gix-refspec = { version = "^0.30.1", path = "../gix-refspec", optional = true } -gix-lock = { version = "^17.1.0", path = "../gix-lock", optional = true } +gix-trace = { version = "^0.1.13", path = "../gix-trace", optional = true } +gix-negotiate = { version = "^0.21.0", path = "../gix-negotiate", optional = true } +gix-object = { version = "^0.50.0", path = "../gix-object", optional = true } +gix-revwalk = { version = "^0.21.0", path = "../gix-revwalk", optional = true } +gix-credentials = { version = "^0.30.0", path = "../gix-credentials", optional = true } +gix-refspec = { version = "^0.31.0", path = "../gix-refspec", optional = true } +gix-lock = { version = "^18.0.0", path = "../gix-lock", optional = true } thiserror = "2.0.0" serde = { version = "1.0.114", optional = true, default-features = false, features = [ @@ -106,7 +106,7 @@ document-features = { version = "0.2.0", optional = true } [dev-dependencies] async-std = { version = "1.9.0", features = ["attributes"] } -gix-packetline = { path = "../gix-packetline", version = "^0.19.0" } +gix-packetline = { path = "../gix-packetline", version = "^0.19.1" } [package.metadata.docs.rs] features = ["blocking-client", "document-features", "serde"] diff --git a/gix-ref/CHANGELOG.md b/gix-ref/CHANGELOG.md index 20f3acaec85..f12d2281725 100644 --- a/gix-ref/CHANGELOG.md +++ b/gix-ref/CHANGELOG.md @@ -5,7 +5,7 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## Unreleased +## 0.53.0 (2025-07-15) ### New Features @@ -17,7 +17,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - - 17 commits contributed to the release over the course of 79 calendar days. + - 18 commits contributed to the release over the course of 79 calendar days. - 79 days passed between releases. - 3 commits were understood as [conventional](https://www.conventionalcommits.org). - 0 issues like '(#ID)' were seen in commit messages @@ -35,6 +35,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
view details * **Uncategorized** + - Update changelogs prior to release ([`65037b5`](https://github.com/GitoxideLabs/gitoxide/commit/65037b56918b90ac07454a815b0ed136df2fca3b)) - Merge pull request #2061 from orthros/pseudo-refs ([`60c29a5`](https://github.com/GitoxideLabs/gitoxide/commit/60c29a59302bfc9d0be7aab5dd3ef05e4ee8e3fa)) - Refactor ([`43f92b5`](https://github.com/GitoxideLabs/gitoxide/commit/43f92b5285af6696cd21f0e94f3bec568aef8468)) - Refs support pseudo refs ([`fdf5153`](https://github.com/GitoxideLabs/gitoxide/commit/fdf5153d9fe5e7c059b5a9687b7041e16ba54683)) diff --git a/gix-ref/Cargo.toml b/gix-ref/Cargo.toml index c878727a601..97fc548b629 100644 --- a/gix-ref/Cargo.toml +++ b/gix-ref/Cargo.toml @@ -2,7 +2,7 @@ lints.workspace = true [package] name = "gix-ref" -version = "0.52.1" +version = "0.53.0" repository = "https://github.com/GitoxideLabs/gitoxide" license = "MIT OR Apache-2.0" description = "A crate to handle git references" @@ -21,16 +21,16 @@ test = true serde = ["dep:serde", "gix-hash/serde", "gix-actor/serde", "gix-object/serde"] [dependencies] -gix-features = { version = "^0.42.1", path = "../gix-features", features = ["walkdir"] } -gix-fs = { version = "^0.15.0", path = "../gix-fs" } -gix-path = { version = "^0.10.18", path = "../gix-path" } -gix-hash = { version = "^0.18.0", path = "../gix-hash" } -gix-object = { version = "^0.49.1", path = "../gix-object" } +gix-features = { version = "^0.43.0", path = "../gix-features", features = ["walkdir"] } +gix-fs = { version = "^0.16.0", path = "../gix-fs" } +gix-path = { version = "^0.10.19", path = "../gix-path" } +gix-hash = { version = "^0.19.0", path = "../gix-hash" } +gix-object = { version = "^0.50.0", path = "../gix-object" } gix-utils = { version = "^0.3.0", path = "../gix-utils" } gix-validate = { version = "^0.10.0", path = "../gix-validate" } -gix-actor = { version = "^0.35.1", path = "../gix-actor" } -gix-lock = { version = "^17.1.0", path = "../gix-lock" } -gix-tempfile = { version = "^17.1.0", default-features = false, path = "../gix-tempfile" } +gix-actor = { version = "^0.35.2", path = "../gix-actor" } +gix-lock = { version = "^18.0.0", path = "../gix-lock" } +gix-tempfile = { version = "^18.0.0", default-features = false, path = "../gix-tempfile" } thiserror = "2.0.0" winnow = { version = "0.7.10", features = ["simd"] } diff --git a/gix-refspec/CHANGELOG.md b/gix-refspec/CHANGELOG.md index 0ef650d241e..287f4825384 100644 --- a/gix-refspec/CHANGELOG.md +++ b/gix-refspec/CHANGELOG.md @@ -5,7 +5,7 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## Unreleased +## 0.31.0 (2025-07-15) A maintenance release without user-facing changes. @@ -13,7 +13,7 @@ A maintenance release without user-facing changes. - - 5 commits contributed to the release over the course of 79 calendar days. + - 6 commits contributed to the release over the course of 79 calendar days. - 79 days passed between releases. - 0 commits were understood as [conventional](https://www.conventionalcommits.org). - 0 issues like '(#ID)' were seen in commit messages @@ -31,6 +31,7 @@ A maintenance release without user-facing changes.
view details * **Uncategorized** + - Update changelogs prior to release ([`65037b5`](https://github.com/GitoxideLabs/gitoxide/commit/65037b56918b90ac07454a815b0ed136df2fca3b)) - Merge pull request #2070 from GitoxideLabs/dependabot/cargo/cargo-827bceb7eb ([`dab97f7`](https://github.com/GitoxideLabs/gitoxide/commit/dab97f7618f160421b6e31de8f3e2f3d11dc2ef2)) - Bump the cargo group across 1 directory with 68 updates ([`a9a8ea1`](https://github.com/GitoxideLabs/gitoxide/commit/a9a8ea1472532dde03bce4e0afdfa82924af1f96)) - Merge pull request #2041 from cruessler/add-blame-extraction ([`dd5f0a4`](https://github.com/GitoxideLabs/gitoxide/commit/dd5f0a4811bc738051f7af164b8d2815aaa23220)) diff --git a/gix-refspec/Cargo.toml b/gix-refspec/Cargo.toml index aa9fa5f89a8..f4b48508e36 100644 --- a/gix-refspec/Cargo.toml +++ b/gix-refspec/Cargo.toml @@ -2,7 +2,7 @@ lints.workspace = true [package] name = "gix-refspec" -version = "0.30.1" +version = "0.31.0" repository = "https://github.com/GitoxideLabs/gitoxide" license = "MIT OR Apache-2.0" description = "A crate of the gitoxide project for parsing and representing refspecs" @@ -15,9 +15,9 @@ rust-version = "1.70" doctest = false [dependencies] -gix-revision = { version = "^0.34.1", path = "../gix-revision", default-features = false } +gix-revision = { version = "^0.35.0", path = "../gix-revision", default-features = false } gix-validate = { version = "^0.10.0", path = "../gix-validate" } -gix-hash = { version = "^0.18.0", path = "../gix-hash" } +gix-hash = { version = "^0.19.0", path = "../gix-hash" } bstr = { version = "1.12.0", default-features = false, features = ["std"] } thiserror = "2.0.0" diff --git a/gix-revision/CHANGELOG.md b/gix-revision/CHANGELOG.md index 5192e67452c..9447ec0070b 100644 --- a/gix-revision/CHANGELOG.md +++ b/gix-revision/CHANGELOG.md @@ -5,7 +5,7 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## Unreleased +## 0.35.0 (2025-07-15) A maintenance release without user-facing changes. @@ -13,7 +13,7 @@ A maintenance release without user-facing changes. - - 3 commits contributed to the release over the course of 79 calendar days. + - 4 commits contributed to the release over the course of 79 calendar days. - 79 days passed between releases. - 0 commits were understood as [conventional](https://www.conventionalcommits.org). - 0 issues like '(#ID)' were seen in commit messages @@ -25,6 +25,7 @@ A maintenance release without user-facing changes.
view details * **Uncategorized** + - Update changelogs prior to release ([`65037b5`](https://github.com/GitoxideLabs/gitoxide/commit/65037b56918b90ac07454a815b0ed136df2fca3b)) - Merge pull request #2009 from GitoxideLabs/release-gix-index ([`c3f06ae`](https://github.com/GitoxideLabs/gitoxide/commit/c3f06ae424ab4e1918a364cabe8276297465a73a)) - Release gix-path v0.10.18, gix-date v0.10.2, gix-traverse v0.46.2, gix-index v0.40.1 ([`d2b4c44`](https://github.com/GitoxideLabs/gitoxide/commit/d2b4c44fcb2bf43e80d67532262631a5086f08de)) - Merge pull request #1971 from GitoxideLabs/new-release ([`8d4c4d1`](https://github.com/GitoxideLabs/gitoxide/commit/8d4c4d1e09f84c962c29d98a686c64228196ac13)) diff --git a/gix-revision/Cargo.toml b/gix-revision/Cargo.toml index 4a9aabed1bf..e6d382b6ac3 100644 --- a/gix-revision/Cargo.toml +++ b/gix-revision/Cargo.toml @@ -2,7 +2,7 @@ lints.workspace = true [package] name = "gix-revision" -version = "0.34.1" +version = "0.35.0" repository = "https://github.com/GitoxideLabs/gitoxide" license = "MIT OR Apache-2.0" description = "A crate of the gitoxide project dealing with finding names for revisions and parsing specifications" @@ -27,13 +27,13 @@ merge_base = ["dep:gix-trace", "dep:bitflags"] serde = ["dep:serde", "gix-hash/serde", "gix-object/serde"] [dependencies] -gix-hash = { version = "^0.18.0", path = "../gix-hash" } -gix-object = { version = "^0.49.1", path = "../gix-object" } -gix-date = { version = "^0.10.2", path = "../gix-date" } -gix-hashtable = { version = "^0.8.1", path = "../gix-hashtable", optional = true } -gix-revwalk = { version = "^0.20.1", path = "../gix-revwalk" } -gix-commitgraph = { version = "^0.28.0", path = "../gix-commitgraph" } -gix-trace = { version = "^0.1.12", path = "../gix-trace", optional = true } +gix-hash = { version = "^0.19.0", path = "../gix-hash" } +gix-object = { version = "^0.50.0", path = "../gix-object" } +gix-date = { version = "^0.10.3", path = "../gix-date" } +gix-hashtable = { version = "^0.9.0", path = "../gix-hashtable", optional = true } +gix-revwalk = { version = "^0.21.0", path = "../gix-revwalk" } +gix-commitgraph = { version = "^0.29.0", path = "../gix-commitgraph" } +gix-trace = { version = "^0.1.13", path = "../gix-trace", optional = true } bstr = { version = "1.12.0", default-features = false, features = ["std"] } bitflags = { version = "2", optional = true } diff --git a/gix-revwalk/CHANGELOG.md b/gix-revwalk/CHANGELOG.md index a365b37bef7..969045b4cc7 100644 --- a/gix-revwalk/CHANGELOG.md +++ b/gix-revwalk/CHANGELOG.md @@ -5,7 +5,7 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## Unreleased +## 0.21.0 (2025-07-15) A maintenance release without user-facing changes. @@ -13,7 +13,7 @@ A maintenance release without user-facing changes. - - 3 commits contributed to the release over the course of 79 calendar days. + - 4 commits contributed to the release over the course of 79 calendar days. - 79 days passed between releases. - 0 commits were understood as [conventional](https://www.conventionalcommits.org). - 0 issues like '(#ID)' were seen in commit messages @@ -25,6 +25,7 @@ A maintenance release without user-facing changes.
view details * **Uncategorized** + - Update changelogs prior to release ([`65037b5`](https://github.com/GitoxideLabs/gitoxide/commit/65037b56918b90ac07454a815b0ed136df2fca3b)) - Merge pull request #2070 from GitoxideLabs/dependabot/cargo/cargo-827bceb7eb ([`dab97f7`](https://github.com/GitoxideLabs/gitoxide/commit/dab97f7618f160421b6e31de8f3e2f3d11dc2ef2)) - Bump the cargo group across 1 directory with 68 updates ([`a9a8ea1`](https://github.com/GitoxideLabs/gitoxide/commit/a9a8ea1472532dde03bce4e0afdfa82924af1f96)) - Merge pull request #1971 from GitoxideLabs/new-release ([`8d4c4d1`](https://github.com/GitoxideLabs/gitoxide/commit/8d4c4d1e09f84c962c29d98a686c64228196ac13)) diff --git a/gix-revwalk/Cargo.toml b/gix-revwalk/Cargo.toml index ca5a3183f95..3f343e336d2 100644 --- a/gix-revwalk/Cargo.toml +++ b/gix-revwalk/Cargo.toml @@ -2,7 +2,7 @@ lints.workspace = true [package] name = "gix-revwalk" -version = "0.20.1" +version = "0.21.0" repository = "https://github.com/GitoxideLabs/gitoxide" license = "MIT OR Apache-2.0" description = "A crate providing utilities for walking the revision graph" @@ -15,11 +15,11 @@ rust-version = "1.70" doctest = false [dependencies] -gix-hash = { version = "^0.18.0", path = "../gix-hash" } -gix-object = { version = "^0.49.1", path = "../gix-object" } -gix-date = { version = "^0.10.1", path = "../gix-date" } -gix-hashtable = { version = "^0.8.1", path = "../gix-hashtable" } -gix-commitgraph = { version = "^0.28.0", path = "../gix-commitgraph" } +gix-hash = { version = "^0.19.0", path = "../gix-hash" } +gix-object = { version = "^0.50.0", path = "../gix-object" } +gix-date = { version = "^0.10.3", path = "../gix-date" } +gix-hashtable = { version = "^0.9.0", path = "../gix-hashtable" } +gix-commitgraph = { version = "^0.29.0", path = "../gix-commitgraph" } thiserror = "2.0.0" smallvec = "1.15.1" diff --git a/gix-sec/CHANGELOG.md b/gix-sec/CHANGELOG.md index e3e7640eb87..3e867ba928b 100644 --- a/gix-sec/CHANGELOG.md +++ b/gix-sec/CHANGELOG.md @@ -5,7 +5,7 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## Unreleased +## 0.12.0 (2025-07-15) ### New Features (BREAKING) @@ -15,7 +15,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - - 9 commits contributed to the release over the course of 79 calendar days. + - 10 commits contributed to the release over the course of 79 calendar days. - 79 days passed between releases. - 1 commit was understood as [conventional](https://www.conventionalcommits.org). - 1 unique issue was worked on: [#1998](https://github.com/GitoxideLabs/gitoxide/issues/1998) @@ -29,6 +29,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 * **[#1998](https://github.com/GitoxideLabs/gitoxide/issues/1998)** - Add optional `oauth_refresh_token` field to `identity::Account` ([`dc9b103`](https://github.com/GitoxideLabs/gitoxide/commit/dc9b103c2ef813931becefcf082daeda5a3cf869)) * **Uncategorized** + - Update changelogs prior to release ([`65037b5`](https://github.com/GitoxideLabs/gitoxide/commit/65037b56918b90ac07454a815b0ed136df2fca3b)) - Merge pull request #2070 from GitoxideLabs/dependabot/cargo/cargo-827bceb7eb ([`dab97f7`](https://github.com/GitoxideLabs/gitoxide/commit/dab97f7618f160421b6e31de8f3e2f3d11dc2ef2)) - Bump the cargo group across 1 directory with 68 updates ([`a9a8ea1`](https://github.com/GitoxideLabs/gitoxide/commit/a9a8ea1472532dde03bce4e0afdfa82924af1f96)) - Merge pull request #2033 from GitoxideLabs/dependabot/cargo/cargo-b72232998d ([`f8d7c0a`](https://github.com/GitoxideLabs/gitoxide/commit/f8d7c0ad8fa7745c973c6b87e7eee70831300207)) diff --git a/gix-sec/Cargo.toml b/gix-sec/Cargo.toml index 8ea90242095..a0d3332b723 100644 --- a/gix-sec/Cargo.toml +++ b/gix-sec/Cargo.toml @@ -2,7 +2,7 @@ lints.workspace = true [package] name = "gix-sec" -version = "0.11.0" +version = "0.12.0" repository = "https://github.com/GitoxideLabs/gitoxide" license = "MIT OR Apache-2.0" description = "A crate of the gitoxide project providing a shared trust model" @@ -31,7 +31,7 @@ document-features = { version = "0.2.1", optional = true } libc = "0.2.174" [target.'cfg(windows)'.dependencies] -gix-path = { version = "^0.10.18", path = "../gix-path" } +gix-path = { version = "^0.10.19", path = "../gix-path" } windows-sys = { version = "0.59.0", features = [ "Win32_Foundation", "Win32_Security_Authorization", diff --git a/gix-shallow/CHANGELOG.md b/gix-shallow/CHANGELOG.md index 1072b07730c..c6f577f3fa2 100644 --- a/gix-shallow/CHANGELOG.md +++ b/gix-shallow/CHANGELOG.md @@ -5,7 +5,7 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## Unreleased +## 0.5.0 (2025-07-15) A maintenance release without user-facing changes. @@ -13,7 +13,7 @@ A maintenance release without user-facing changes. - - 1 commit contributed to the release over the course of 79 calendar days. + - 2 commits contributed to the release over the course of 79 calendar days. - 79 days passed between releases. - 0 commits were understood as [conventional](https://www.conventionalcommits.org). - 0 issues like '(#ID)' were seen in commit messages @@ -25,6 +25,7 @@ A maintenance release without user-facing changes.
view details * **Uncategorized** + - Update changelogs prior to release ([`65037b5`](https://github.com/GitoxideLabs/gitoxide/commit/65037b56918b90ac07454a815b0ed136df2fca3b)) - Merge pull request #1971 from GitoxideLabs/new-release ([`8d4c4d1`](https://github.com/GitoxideLabs/gitoxide/commit/8d4c4d1e09f84c962c29d98a686c64228196ac13))
diff --git a/gix-shallow/Cargo.toml b/gix-shallow/Cargo.toml index 258d57dc964..85d38ef5f20 100644 --- a/gix-shallow/Cargo.toml +++ b/gix-shallow/Cargo.toml @@ -2,7 +2,7 @@ lints.workspace = true [package] name = "gix-shallow" -version = "0.4.0" +version = "0.5.0" repository = "https://github.com/GitoxideLabs/gitoxide" authors = ["Sebastian Thiel "] license = "MIT OR Apache-2.0" @@ -20,8 +20,8 @@ test = false serde = ["dep:serde", "gix-hash/serde"] [dependencies] -gix-hash = { version = "^0.18.0", path = "../gix-hash" } -gix-lock = { version = "^17.1.0", path = "../gix-lock" } +gix-hash = { version = "^0.19.0", path = "../gix-hash" } +gix-lock = { version = "^18.0.0", path = "../gix-lock" } thiserror = "2.0.0" bstr = { version = "1.12.0", default-features = false } diff --git a/gix-status/CHANGELOG.md b/gix-status/CHANGELOG.md index daa001907d6..08b0f43e7a7 100644 --- a/gix-status/CHANGELOG.md +++ b/gix-status/CHANGELOG.md @@ -5,7 +5,7 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## Unreleased +## 0.20.0 (2025-07-15) ### Bug Fixes @@ -17,7 +17,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - - 7 commits contributed to the release over the course of 79 calendar days. + - 8 commits contributed to the release over the course of 79 calendar days. - 79 days passed between releases. - 1 commit was understood as [conventional](https://www.conventionalcommits.org). - 0 issues like '(#ID)' were seen in commit messages @@ -29,6 +29,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
view details * **Uncategorized** + - Update changelogs prior to release ([`65037b5`](https://github.com/GitoxideLabs/gitoxide/commit/65037b56918b90ac07454a815b0ed136df2fca3b)) - Merge pull request #2016 from GitoxideLabs/improvements ([`7ae3797`](https://github.com/GitoxideLabs/gitoxide/commit/7ae3797f19cf2dd3bc3e02a6437643e5f50ed338)) - If `core.symlinks=false`, don't misclassify actual symlinks as files. ([`376ed0c`](https://github.com/GitoxideLabs/gitoxide/commit/376ed0cb602e4df457b0b6c87fe16af027bdff48)) - Merge pull request #2014 from GitoxideLabs/zip ([`648022b`](https://github.com/GitoxideLabs/gitoxide/commit/648022b44e12f597cae55cc45830d0a19b87eb4c)) diff --git a/gix-status/Cargo.toml b/gix-status/Cargo.toml index 10fc9dea619..2c3ca420f52 100644 --- a/gix-status/Cargo.toml +++ b/gix-status/Cargo.toml @@ -2,7 +2,7 @@ lints.workspace = true [package] name = "gix-status" -version = "0.19.1" +version = "0.20.0" repository = "https://github.com/GitoxideLabs/gitoxide" license = "MIT OR Apache-2.0" description = "A crate of the gitoxide project dealing with 'git status'-like functionality" @@ -20,18 +20,18 @@ doctest = false worktree-rewrites = ["dep:gix-dir", "dep:gix-diff"] [dependencies] -gix-index = { version = "^0.40.1", path = "../gix-index" } -gix-fs = { version = "^0.15.0", path = "../gix-fs" } -gix-hash = { version = "^0.18.0", path = "../gix-hash" } -gix-object = { version = "^0.49.1", path = "../gix-object" } -gix-path = { version = "^0.10.18", path = "../gix-path" } -gix-features = { version = "^0.42.1", path = "../gix-features", features = ["progress"] } -gix-filter = { version = "^0.19.2", path = "../gix-filter" } -gix-worktree = { version = "^0.41.0", path = "../gix-worktree", default-features = false, features = ["attributes"] } -gix-pathspec = { version = "^0.11.0", path = "../gix-pathspec" } - -gix-dir = { version = "^0.14.1", path = "../gix-dir", optional = true } -gix-diff = { version = "^0.52.1", path = "../gix-diff", default-features = false, features = ["blob"], optional = true } +gix-index = { version = "^0.41.0", path = "../gix-index" } +gix-fs = { version = "^0.16.0", path = "../gix-fs" } +gix-hash = { version = "^0.19.0", path = "../gix-hash" } +gix-object = { version = "^0.50.0", path = "../gix-object" } +gix-path = { version = "^0.10.19", path = "../gix-path" } +gix-features = { version = "^0.43.0", path = "../gix-features", features = ["progress"] } +gix-filter = { version = "^0.20.0", path = "../gix-filter" } +gix-worktree = { version = "^0.42.0", path = "../gix-worktree", default-features = false, features = ["attributes"] } +gix-pathspec = { version = "^0.12.0", path = "../gix-pathspec" } + +gix-dir = { version = "^0.15.0", path = "../gix-dir", optional = true } +gix-diff = { version = "^0.53.0", path = "../gix-diff", default-features = false, features = ["blob"], optional = true } thiserror = "2.0.0" filetime = "0.2.15" diff --git a/gix-submodule/CHANGELOG.md b/gix-submodule/CHANGELOG.md index 345d4902b7d..4966f8fbbca 100644 --- a/gix-submodule/CHANGELOG.md +++ b/gix-submodule/CHANGELOG.md @@ -5,7 +5,7 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## Unreleased +## 0.20.0 (2025-07-15) A maintenance release without user-facing changes. @@ -13,7 +13,7 @@ A maintenance release without user-facing changes. - - 5 commits contributed to the release over the course of 79 calendar days. + - 6 commits contributed to the release over the course of 79 calendar days. - 79 days passed between releases. - 0 commits were understood as [conventional](https://www.conventionalcommits.org). - 0 issues like '(#ID)' were seen in commit messages @@ -25,6 +25,7 @@ A maintenance release without user-facing changes.
view details * **Uncategorized** + - Update changelogs prior to release ([`65037b5`](https://github.com/GitoxideLabs/gitoxide/commit/65037b56918b90ac07454a815b0ed136df2fca3b)) - Merge pull request #2061 from orthros/pseudo-refs ([`60c29a5`](https://github.com/GitoxideLabs/gitoxide/commit/60c29a59302bfc9d0be7aab5dd3ef05e4ee8e3fa)) - Adapt to changes in gix_features::walkdir_sorted_new ([`a2741da`](https://github.com/GitoxideLabs/gitoxide/commit/a2741da85fe04907f8773a99813e3802333b402d)) - Merge pull request #2009 from GitoxideLabs/release-gix-index ([`c3f06ae`](https://github.com/GitoxideLabs/gitoxide/commit/c3f06ae424ab4e1918a364cabe8276297465a73a)) diff --git a/gix-submodule/Cargo.toml b/gix-submodule/Cargo.toml index 20253c388a3..df940ed0508 100644 --- a/gix-submodule/Cargo.toml +++ b/gix-submodule/Cargo.toml @@ -2,7 +2,7 @@ lints.workspace = true [package] name = "gix-submodule" -version = "0.19.1" +version = "0.20.0" repository = "https://github.com/GitoxideLabs/gitoxide" license = "MIT OR Apache-2.0" description = "A crate of the gitoxide project dealing git submodules" @@ -15,11 +15,11 @@ include = ["src/**/*", "LICENSE-*"] doctest = false [dependencies] -gix-pathspec = { version = "^0.11.0", path = "../gix-pathspec" } -gix-refspec = { version = "^0.30.1", path = "../gix-refspec" } -gix-config = { version = "^0.45.1", path = "../gix-config" } -gix-path = { version = "^0.10.18", path = "../gix-path" } -gix-url = { version = "^0.31.0", path = "../gix-url" } +gix-pathspec = { version = "^0.12.0", path = "../gix-pathspec" } +gix-refspec = { version = "^0.31.0", path = "../gix-refspec" } +gix-config = { version = "^0.46.0", path = "../gix-config" } +gix-path = { version = "^0.10.19", path = "../gix-path" } +gix-url = { version = "^0.32.0", path = "../gix-url" } bstr = { version = "1.12.0", default-features = false } thiserror = "2.0.0" diff --git a/gix-tempfile/CHANGELOG.md b/gix-tempfile/CHANGELOG.md index 4fef671571d..60607d320b9 100644 --- a/gix-tempfile/CHANGELOG.md +++ b/gix-tempfile/CHANGELOG.md @@ -5,7 +5,7 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## Unreleased +## 18.0.0 (2025-07-15) A maintenance release without user-facing changes. @@ -13,7 +13,7 @@ A maintenance release without user-facing changes. - - 7 commits contributed to the release over the course of 79 calendar days. + - 8 commits contributed to the release over the course of 79 calendar days. - 79 days passed between releases. - 0 commits were understood as [conventional](https://www.conventionalcommits.org). - 0 issues like '(#ID)' were seen in commit messages @@ -25,6 +25,7 @@ A maintenance release without user-facing changes.
view details * **Uncategorized** + - Update changelogs prior to release ([`65037b5`](https://github.com/GitoxideLabs/gitoxide/commit/65037b56918b90ac07454a815b0ed136df2fca3b)) - Merge pull request #2070 from GitoxideLabs/dependabot/cargo/cargo-827bceb7eb ([`dab97f7`](https://github.com/GitoxideLabs/gitoxide/commit/dab97f7618f160421b6e31de8f3e2f3d11dc2ef2)) - Bump the cargo group across 1 directory with 68 updates ([`a9a8ea1`](https://github.com/GitoxideLabs/gitoxide/commit/a9a8ea1472532dde03bce4e0afdfa82924af1f96)) - Merge pull request #2062 from rickprice/minor_documentation_fixups ([`c2eb0c1`](https://github.com/GitoxideLabs/gitoxide/commit/c2eb0c144dd21cac87fd08829f4a5ca02f85008d)) diff --git a/gix-tempfile/Cargo.toml b/gix-tempfile/Cargo.toml index a52a1d048bb..257f94256ae 100644 --- a/gix-tempfile/Cargo.toml +++ b/gix-tempfile/Cargo.toml @@ -2,7 +2,7 @@ lints.workspace = true [package] name = "gix-tempfile" -version = "17.1.0" +version = "18.0.0" repository = "https://github.com/GitoxideLabs/gitoxide" license = "MIT OR Apache-2.0" description = "A tempfile implementation with a global registry to assure cleanup" @@ -31,7 +31,7 @@ doctest = false test = true [dependencies] -gix-fs = { version = "^0.15.0", path = "../gix-fs" } +gix-fs = { version = "^0.16.0", path = "../gix-fs" } parking_lot = "0.12.4" dashmap = { version = "6.0.1", optional = true } once_cell = { version = "1.21.3", default-features = false, features = ["race", "std"] } diff --git a/gix-trace/CHANGELOG.md b/gix-trace/CHANGELOG.md index 79d4215311f..2642526b117 100644 --- a/gix-trace/CHANGELOG.md +++ b/gix-trace/CHANGELOG.md @@ -5,7 +5,7 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## Unreleased +## 0.1.13 (2025-07-15) A maintenance release without user-facing changes. @@ -13,7 +13,7 @@ A maintenance release without user-facing changes. - - 3 commits contributed to the release. + - 4 commits contributed to the release. - 0 commits were understood as [conventional](https://www.conventionalcommits.org). - 0 issues like '(#ID)' were seen in commit messages @@ -24,6 +24,7 @@ A maintenance release without user-facing changes.
view details * **Uncategorized** + - Update changelogs prior to release ([`65037b5`](https://github.com/GitoxideLabs/gitoxide/commit/65037b56918b90ac07454a815b0ed136df2fca3b)) - Merge pull request #2070 from GitoxideLabs/dependabot/cargo/cargo-827bceb7eb ([`dab97f7`](https://github.com/GitoxideLabs/gitoxide/commit/dab97f7618f160421b6e31de8f3e2f3d11dc2ef2)) - Bump the cargo group across 1 directory with 68 updates ([`a9a8ea1`](https://github.com/GitoxideLabs/gitoxide/commit/a9a8ea1472532dde03bce4e0afdfa82924af1f96)) - Merge pull request #1778 from GitoxideLabs/new-release ([`8df0db2`](https://github.com/GitoxideLabs/gitoxide/commit/8df0db2f8fe1832a5efd86d6aba6fb12c4c855de)) diff --git a/gix-trace/Cargo.toml b/gix-trace/Cargo.toml index 5fb8b3bcf1d..e956b5ec20b 100644 --- a/gix-trace/Cargo.toml +++ b/gix-trace/Cargo.toml @@ -4,7 +4,7 @@ lints.workspace = true name = "gix-trace" description = "A crate to provide minimal `tracing` support that can be turned off to zero cost" repository = "https://github.com/GitoxideLabs/gitoxide" -version = "0.1.12" +version = "0.1.13" authors = ["Sebastian Thiel "] license = "MIT OR Apache-2.0" edition = "2021" diff --git a/gix-transport/CHANGELOG.md b/gix-transport/CHANGELOG.md index 4b7355324e0..19b381c1a38 100644 --- a/gix-transport/CHANGELOG.md +++ b/gix-transport/CHANGELOG.md @@ -5,7 +5,7 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## Unreleased +## 0.48.0 (2025-07-15) A maintenance release without user-facing changes. @@ -13,7 +13,7 @@ A maintenance release without user-facing changes. - - 13 commits contributed to the release over the course of 79 calendar days. + - 14 commits contributed to the release over the course of 79 calendar days. - 79 days passed between releases. - 0 commits were understood as [conventional](https://www.conventionalcommits.org). - 0 issues like '(#ID)' were seen in commit messages @@ -31,6 +31,7 @@ A maintenance release without user-facing changes.
view details * **Uncategorized** + - Update changelogs prior to release ([`65037b5`](https://github.com/GitoxideLabs/gitoxide/commit/65037b56918b90ac07454a815b0ed136df2fca3b)) - Merge pull request #2070 from GitoxideLabs/dependabot/cargo/cargo-827bceb7eb ([`dab97f7`](https://github.com/GitoxideLabs/gitoxide/commit/dab97f7618f160421b6e31de8f3e2f3d11dc2ef2)) - Bump the cargo group across 1 directory with 68 updates ([`a9a8ea1`](https://github.com/GitoxideLabs/gitoxide/commit/a9a8ea1472532dde03bce4e0afdfa82924af1f96)) - Merge pull request #2062 from rickprice/minor_documentation_fixups ([`c2eb0c1`](https://github.com/GitoxideLabs/gitoxide/commit/c2eb0c144dd21cac87fd08829f4a5ca02f85008d)) diff --git a/gix-transport/Cargo.toml b/gix-transport/Cargo.toml index e1abc0443eb..d54c822ad39 100644 --- a/gix-transport/Cargo.toml +++ b/gix-transport/Cargo.toml @@ -2,7 +2,7 @@ lints.workspace = true [package] name = "gix-transport" -version = "0.47.0" +version = "0.48.0" repository = "https://github.com/GitoxideLabs/gitoxide" license = "MIT OR Apache-2.0" description = "A crate of the gitoxide project dedicated to implementing the git transport layer" @@ -81,12 +81,12 @@ path = "tests/async-transport.rs" required-features = ["async-client"] [dependencies] -gix-command = { version = "^0.6.1", path = "../gix-command" } -gix-features = { version = "^0.42.1", path = "../gix-features" } -gix-url = { version = "^0.31.0", path = "../gix-url" } -gix-sec = { version = "^0.11.0", path = "../gix-sec" } -gix-packetline = { version = "^0.19.0", path = "../gix-packetline" } -gix-credentials = { version = "^0.29.0", path = "../gix-credentials", optional = true } +gix-command = { version = "^0.6.2", path = "../gix-command" } +gix-features = { version = "^0.43.0", path = "../gix-features" } +gix-url = { version = "^0.32.0", path = "../gix-url" } +gix-sec = { version = "^0.12.0", path = "../gix-sec" } +gix-packetline = { version = "^0.19.1", path = "../gix-packetline" } +gix-credentials = { version = "^0.30.0", path = "../gix-credentials", optional = true } gix-quote = { version = "^0.6.0", path = "../gix-quote" } serde = { version = "1.0.114", optional = true, default-features = false, features = [ diff --git a/gix-traverse/CHANGELOG.md b/gix-traverse/CHANGELOG.md index b0d8163f9b7..30bf8f1c4d6 100644 --- a/gix-traverse/CHANGELOG.md +++ b/gix-traverse/CHANGELOG.md @@ -5,7 +5,7 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## Unreleased +## 0.47.0 (2025-07-15) ### New Features @@ -17,7 +17,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - - 6 commits contributed to the release over the course of 65 calendar days. + - 7 commits contributed to the release over the course of 65 calendar days. - 65 days passed between releases. - 1 commit was understood as [conventional](https://www.conventionalcommits.org). - 0 issues like '(#ID)' were seen in commit messages @@ -29,6 +29,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
view details * **Uncategorized** + - Update changelogs prior to release ([`65037b5`](https://github.com/GitoxideLabs/gitoxide/commit/65037b56918b90ac07454a815b0ed136df2fca3b)) - Merge pull request #2070 from GitoxideLabs/dependabot/cargo/cargo-827bceb7eb ([`dab97f7`](https://github.com/GitoxideLabs/gitoxide/commit/dab97f7618f160421b6e31de8f3e2f3d11dc2ef2)) - Bump the cargo group across 1 directory with 68 updates ([`a9a8ea1`](https://github.com/GitoxideLabs/gitoxide/commit/a9a8ea1472532dde03bce4e0afdfa82924af1f96)) - Merge pull request #2037 from GitoxideLabs/hide ([`92febae`](https://github.com/GitoxideLabs/gitoxide/commit/92febae025165c55e596d58511b1634fb6580b9c)) diff --git a/gix-traverse/Cargo.toml b/gix-traverse/Cargo.toml index 0dfb2a0e31b..6f6d88666d7 100644 --- a/gix-traverse/Cargo.toml +++ b/gix-traverse/Cargo.toml @@ -2,7 +2,7 @@ lints.workspace = true [package] name = "gix-traverse" -version = "0.46.2" +version = "0.47.0" repository = "https://github.com/GitoxideLabs/gitoxide" license = "MIT OR Apache-2.0" description = "A crate of the gitoxide project" @@ -16,12 +16,12 @@ autotests = false doctest = false [dependencies] -gix-hash = { version = "^0.18.0", path = "../gix-hash" } -gix-object = { version = "^0.49.1", path = "../gix-object" } -gix-date = { version = "^0.10.2", path = "../gix-date" } -gix-hashtable = { version = "^0.8.1", path = "../gix-hashtable" } -gix-revwalk = { version = "^0.20.1", path = "../gix-revwalk" } -gix-commitgraph = { version = "^0.28.0", path = "../gix-commitgraph" } +gix-hash = { version = "^0.19.0", path = "../gix-hash" } +gix-object = { version = "^0.50.0", path = "../gix-object" } +gix-date = { version = "^0.10.3", path = "../gix-date" } +gix-hashtable = { version = "^0.9.0", path = "../gix-hashtable" } +gix-revwalk = { version = "^0.21.0", path = "../gix-revwalk" } +gix-commitgraph = { version = "^0.29.0", path = "../gix-commitgraph" } smallvec = "1.15.1" thiserror = "2.0.0" bitflags = "2" diff --git a/gix-url/CHANGELOG.md b/gix-url/CHANGELOG.md index 23937a1cfa6..5e284e0f8fa 100644 --- a/gix-url/CHANGELOG.md +++ b/gix-url/CHANGELOG.md @@ -5,7 +5,7 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## Unreleased +## 0.32.0 (2025-07-15) ### Bug Fixes @@ -17,7 +17,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - - 6 commits contributed to the release over the course of 79 calendar days. + - 7 commits contributed to the release over the course of 79 calendar days. - 79 days passed between releases. - 1 commit was understood as [conventional](https://www.conventionalcommits.org). - 1 unique issue was worked on: [#2056](https://github.com/GitoxideLabs/gitoxide/issues/2056) @@ -31,6 +31,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 * **[#2056](https://github.com/GitoxideLabs/gitoxide/issues/2056)** - Username in scp-like url is no longer percent-encoded ([`04bc4a8`](https://github.com/GitoxideLabs/gitoxide/commit/04bc4a81614146f56f341e15b459dfc1a880bd45)) * **Uncategorized** + - Update changelogs prior to release ([`65037b5`](https://github.com/GitoxideLabs/gitoxide/commit/65037b56918b90ac07454a815b0ed136df2fca3b)) - Merge pull request #2060 from yuja/push-urolxnurwtsn ([`68d761c`](https://github.com/GitoxideLabs/gitoxide/commit/68d761cdc87a46b72028153e096f1a22012239bc)) - Add baseline tests for `_` and `@` in username ([`212b618`](https://github.com/GitoxideLabs/gitoxide/commit/212b618c5f99cc75ed612431669dcc2ec4c49a5e)) - Merge pull request #2009 from GitoxideLabs/release-gix-index ([`c3f06ae`](https://github.com/GitoxideLabs/gitoxide/commit/c3f06ae424ab4e1918a364cabe8276297465a73a)) diff --git a/gix-url/Cargo.toml b/gix-url/Cargo.toml index 5735f397f6d..3accb66343c 100644 --- a/gix-url/Cargo.toml +++ b/gix-url/Cargo.toml @@ -2,7 +2,7 @@ lints.workspace = true [package] name = "gix-url" -version = "0.31.0" +version = "0.32.0" repository = "https://github.com/GitoxideLabs/gitoxide" license = "MIT OR Apache-2.0" description = "A crate of the gitoxide project implementing parsing and serialization of gix-url" @@ -19,8 +19,8 @@ doctest = false serde = ["dep:serde", "bstr/serde"] [dependencies] -gix-features = { version = "^0.42.1", path = "../gix-features" } -gix-path = { version = "^0.10.18", path = "../gix-path" } +gix-features = { version = "^0.43.0", path = "../gix-features" } +gix-path = { version = "^0.10.19", path = "../gix-path" } serde = { version = "1.0.114", optional = true, default-features = false, features = ["std", "derive"] } thiserror = "2.0.0" diff --git a/gix-worktree-state/CHANGELOG.md b/gix-worktree-state/CHANGELOG.md index 9d91682cd2c..d3583211b6d 100644 --- a/gix-worktree-state/CHANGELOG.md +++ b/gix-worktree-state/CHANGELOG.md @@ -5,7 +5,7 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## Unreleased +## 0.20.0 (2025-07-15) A maintenance release without user-facing changes. @@ -13,7 +13,7 @@ A maintenance release without user-facing changes. - - 5 commits contributed to the release over the course of 79 calendar days. + - 6 commits contributed to the release over the course of 79 calendar days. - 79 days passed between releases. - 0 commits were understood as [conventional](https://www.conventionalcommits.org). - 0 issues like '(#ID)' were seen in commit messages @@ -25,6 +25,7 @@ A maintenance release without user-facing changes.
view details * **Uncategorized** + - Update changelogs prior to release ([`65037b5`](https://github.com/GitoxideLabs/gitoxide/commit/65037b56918b90ac07454a815b0ed136df2fca3b)) - Merge pull request #2014 from GitoxideLabs/zip ([`648022b`](https://github.com/GitoxideLabs/gitoxide/commit/648022b44e12f597cae55cc45830d0a19b87eb4c)) - Release gix-glob v0.20.1, gix-attributes v0.26.1, gix-command v0.6.1, gix-filter v0.19.2, gix-worktree-stream v0.21.2, gix-archive v0.21.2 ([`f0ed2cc`](https://github.com/GitoxideLabs/gitoxide/commit/f0ed2cc0046f866e67944bff9aef0579c12d5852)) - Merge pull request #2009 from GitoxideLabs/release-gix-index ([`c3f06ae`](https://github.com/GitoxideLabs/gitoxide/commit/c3f06ae424ab4e1918a364cabe8276297465a73a)) diff --git a/gix-worktree-state/Cargo.toml b/gix-worktree-state/Cargo.toml index 90497ff6f9c..44249909b37 100644 --- a/gix-worktree-state/Cargo.toml +++ b/gix-worktree-state/Cargo.toml @@ -2,7 +2,7 @@ lints.workspace = true [package] name = "gix-worktree-state" -version = "0.19.0" +version = "0.20.0" repository = "https://github.com/GitoxideLabs/gitoxide" license = "MIT OR Apache-2.0" description = "A crate of the gitoxide project implementing setting the worktree to a particular state" @@ -16,15 +16,15 @@ autotests = false doctest = false [dependencies] -gix-worktree = { version = "^0.41.0", path = "../gix-worktree", default-features = false, features = ["attributes"] } -gix-index = { version = "^0.40.1", path = "../gix-index" } -gix-fs = { version = "^0.15.0", path = "../gix-fs" } -gix-hash = { version = "^0.18.0", path = "../gix-hash" } -gix-object = { version = "^0.49.1", path = "../gix-object" } -gix-glob = { version = "^0.20.1", path = "../gix-glob" } -gix-path = { version = "^0.10.18", path = "../gix-path" } -gix-features = { version = "^0.42.1", path = "../gix-features" } -gix-filter = { version = "^0.19.2", path = "../gix-filter" } +gix-worktree = { version = "^0.42.0", path = "../gix-worktree", default-features = false, features = ["attributes"] } +gix-index = { version = "^0.41.0", path = "../gix-index" } +gix-fs = { version = "^0.16.0", path = "../gix-fs" } +gix-hash = { version = "^0.19.0", path = "../gix-hash" } +gix-object = { version = "^0.50.0", path = "../gix-object" } +gix-glob = { version = "^0.21.0", path = "../gix-glob" } +gix-path = { version = "^0.10.19", path = "../gix-path" } +gix-features = { version = "^0.43.0", path = "../gix-features" } +gix-filter = { version = "^0.20.0", path = "../gix-filter" } io-close = "0.3.7" thiserror = "2.0.0" diff --git a/gix-worktree-stream/CHANGELOG.md b/gix-worktree-stream/CHANGELOG.md index cc95deca803..6889b0df4af 100644 --- a/gix-worktree-stream/CHANGELOG.md +++ b/gix-worktree-stream/CHANGELOG.md @@ -5,7 +5,7 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## Unreleased +## 0.22.0 (2025-07-15) A maintenance release without user-facing changes. @@ -13,7 +13,7 @@ A maintenance release without user-facing changes. - - 3 commits contributed to the release over the course of 59 calendar days. + - 4 commits contributed to the release over the course of 59 calendar days. - 59 days passed between releases. - 0 commits were understood as [conventional](https://www.conventionalcommits.org). - 0 issues like '(#ID)' were seen in commit messages @@ -25,6 +25,7 @@ A maintenance release without user-facing changes.
view details * **Uncategorized** + - Update changelogs prior to release ([`65037b5`](https://github.com/GitoxideLabs/gitoxide/commit/65037b56918b90ac07454a815b0ed136df2fca3b)) - Merge pull request #2033 from GitoxideLabs/dependabot/cargo/cargo-b72232998d ([`f8d7c0a`](https://github.com/GitoxideLabs/gitoxide/commit/f8d7c0ad8fa7745c973c6b87e7eee70831300207)) - Bump the cargo group with 56 updates ([`151e3a5`](https://github.com/GitoxideLabs/gitoxide/commit/151e3a5cca06444eea4c6a362649e66c831673d6)) - Merge pull request #2014 from GitoxideLabs/zip ([`648022b`](https://github.com/GitoxideLabs/gitoxide/commit/648022b44e12f597cae55cc45830d0a19b87eb4c)) diff --git a/gix-worktree-stream/Cargo.toml b/gix-worktree-stream/Cargo.toml index 6200b1e9933..7cccc2c9a23 100644 --- a/gix-worktree-stream/Cargo.toml +++ b/gix-worktree-stream/Cargo.toml @@ -2,7 +2,7 @@ lints.workspace = true [package] name = "gix-worktree-stream" -version = "0.21.2" +version = "0.22.0" repository = "https://github.com/GitoxideLabs/gitoxide" license = "MIT OR Apache-2.0" description = "generate a byte-stream from a git-tree" @@ -15,14 +15,14 @@ include = ["src/**/*", "LICENSE-*"] doctest = false [dependencies] -gix-features = { version = "^0.42.1", path = "../gix-features", features = ["progress", "io-pipe"] } -gix-hash = { version = "^0.18.0", path = "../gix-hash" } -gix-object = { version = "^0.49.1", path = "../gix-object" } -gix-attributes = { version = "^0.26.1", path = "../gix-attributes" } -gix-filter = { version = "^0.19.2", path = "../gix-filter" } -gix-traverse = { version = "^0.46.2", path = "../gix-traverse" } -gix-fs = { version = "^0.15.0", path = "../gix-fs" } -gix-path = { version = "^0.10.18", path = "../gix-path" } +gix-features = { version = "^0.43.0", path = "../gix-features", features = ["progress", "io-pipe"] } +gix-hash = { version = "^0.19.0", path = "../gix-hash" } +gix-object = { version = "^0.50.0", path = "../gix-object" } +gix-attributes = { version = "^0.27.0", path = "../gix-attributes" } +gix-filter = { version = "^0.20.0", path = "../gix-filter" } +gix-traverse = { version = "^0.47.0", path = "../gix-traverse" } +gix-fs = { version = "^0.16.0", path = "../gix-fs" } +gix-path = { version = "^0.10.19", path = "../gix-path" } thiserror = "2.0.0" parking_lot = "0.12.4" diff --git a/gix-worktree/CHANGELOG.md b/gix-worktree/CHANGELOG.md index 335d33328ed..e334a92dbde 100644 --- a/gix-worktree/CHANGELOG.md +++ b/gix-worktree/CHANGELOG.md @@ -5,7 +5,7 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## Unreleased +## 0.42.0 (2025-07-15) ### New Features (BREAKING) @@ -17,7 +17,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - - 7 commits contributed to the release over the course of 79 calendar days. + - 8 commits contributed to the release over the course of 79 calendar days. - 79 days passed between releases. - 1 commit was understood as [conventional](https://www.conventionalcommits.org). - 0 issues like '(#ID)' were seen in commit messages @@ -29,6 +29,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
view details * **Uncategorized** + - Update changelogs prior to release ([`65037b5`](https://github.com/GitoxideLabs/gitoxide/commit/65037b56918b90ac07454a815b0ed136df2fca3b)) - Merge pull request #2019 from GitoxideLabs/precious-opt-in ([`5f9de52`](https://github.com/GitoxideLabs/gitoxide/commit/5f9de52cf286163b503047b1ab3b51dfa093b4d4)) - Pattern parser in is now stateful to allow options for how to parse ignore patterns. ([`828e903`](https://github.com/GitoxideLabs/gitoxide/commit/828e9035a40796f79650cf5e3becb8d8e5e29883)) - Merge pull request #2014 from GitoxideLabs/zip ([`648022b`](https://github.com/GitoxideLabs/gitoxide/commit/648022b44e12f597cae55cc45830d0a19b87eb4c)) diff --git a/gix-worktree/Cargo.toml b/gix-worktree/Cargo.toml index 2751fd1fd92..d464fc2e944 100644 --- a/gix-worktree/Cargo.toml +++ b/gix-worktree/Cargo.toml @@ -2,7 +2,7 @@ lints.workspace = true [package] name = "gix-worktree" -version = "0.41.0" +version = "0.42.0" repository = "https://github.com/GitoxideLabs/gitoxide" license = "MIT OR Apache-2.0" description = "A crate of the gitoxide project for shared worktree related types and utilities." @@ -23,16 +23,16 @@ attributes = ["dep:gix-attributes", "dep:gix-validate"] serde = ["dep:serde", "bstr/serde", "gix-index/serde", "gix-hash/serde", "gix-object/serde", "gix-attributes?/serde", "gix-ignore/serde"] [dependencies] -gix-index = { version = "^0.40.1", path = "../gix-index" } -gix-fs = { version = "^0.15.0", path = "../gix-fs" } -gix-hash = { version = "^0.18.0", path = "../gix-hash" } -gix-object = { version = "^0.49.1", path = "../gix-object" } -gix-glob = { version = "^0.20.1", path = "../gix-glob" } -gix-path = { version = "^0.10.18", path = "../gix-path" } -gix-attributes = { version = "^0.26.1", path = "../gix-attributes", optional = true } +gix-index = { version = "^0.41.0", path = "../gix-index" } +gix-fs = { version = "^0.16.0", path = "../gix-fs" } +gix-hash = { version = "^0.19.0", path = "../gix-hash" } +gix-object = { version = "^0.50.0", path = "../gix-object" } +gix-glob = { version = "^0.21.0", path = "../gix-glob" } +gix-path = { version = "^0.10.19", path = "../gix-path" } +gix-attributes = { version = "^0.27.0", path = "../gix-attributes", optional = true } gix-validate = { version = "^0.10.0", path = "../gix-validate", optional = true } -gix-ignore = { version = "^0.15.0", path = "../gix-ignore" } -gix-features = { version = "^0.42.1", path = "../gix-features" } +gix-ignore = { version = "^0.16.0", path = "../gix-ignore" } +gix-features = { version = "^0.43.0", path = "../gix-features" } serde = { version = "1.0.114", optional = true, default-features = false, features = ["derive"] } bstr = { version = "1.12.0", default-features = false } diff --git a/gix/CHANGELOG.md b/gix/CHANGELOG.md index 1371d56b49a..c147fc85164 100644 --- a/gix/CHANGELOG.md +++ b/gix/CHANGELOG.md @@ -5,7 +5,9 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## Unreleased +## 0.73.0 (2025-07-15) + + ### New Features @@ -44,7 +46,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - - 51 commits contributed to the release over the course of 79 calendar days. + - 52 commits contributed to the release over the course of 79 calendar days. - 79 days passed between releases. - 13 commits were understood as [conventional](https://www.conventionalcommits.org). - 2 unique issues were worked on: [#1985](https://github.com/GitoxideLabs/gitoxide/issues/1985), [#2055](https://github.com/GitoxideLabs/gitoxide/issues/2055) @@ -66,6 +68,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 * **[#2055](https://github.com/GitoxideLabs/gitoxide/issues/2055)** - Don't panic if `remote::Connection::ref_map()` doesn't finish the handshake ([`427274b`](https://github.com/GitoxideLabs/gitoxide/commit/427274bdf64d30e3bcd330e849ea067e359588fe)) * **Uncategorized** + - Update changelogs prior to release ([`65037b5`](https://github.com/GitoxideLabs/gitoxide/commit/65037b56918b90ac07454a815b0ed136df2fca3b)) - Merge pull request #2061 from orthros/pseudo-refs ([`60c29a5`](https://github.com/GitoxideLabs/gitoxide/commit/60c29a59302bfc9d0be7aab5dd3ef05e4ee8e3fa)) - Refactor ([`43f92b5`](https://github.com/GitoxideLabs/gitoxide/commit/43f92b5285af6696cd21f0e94f3bec568aef8468)) - Add `repo.references().pseudo()` for traversing refs like `HEAD` and `FETCH_HEAD`. ([`2affbab`](https://github.com/GitoxideLabs/gitoxide/commit/2affbab7491d6b4667572d4d17db864c5b703c7a)) diff --git a/gix/Cargo.toml b/gix/Cargo.toml index 9413dd575a3..1150ddb3aba 100644 --- a/gix/Cargo.toml +++ b/gix/Cargo.toml @@ -5,7 +5,7 @@ name = "gix" repository = "https://github.com/GitoxideLabs/gitoxide" description = "Interact with git repositories just like git would" license = "MIT OR Apache-2.0" -version = "0.72.1" +version = "0.73.0" authors = ["Sebastian Thiel "] edition = "2021" include = ["src/**/*", "LICENSE-*"] @@ -307,67 +307,67 @@ cache-efficiency-debug = ["gix-features/cache-efficiency-debug"] [dependencies] gix-utils = { version = "^0.3.0", path = "../gix-utils" } -gix-fs = { version = "^0.15.0", path = "../gix-fs" } -gix-ref = { version = "^0.52.1", path = "../gix-ref" } -gix-discover = { version = "^0.40.1", path = "../gix-discover" } -gix-tempfile = { version = "^17.1.0", path = "../gix-tempfile", default-features = false } -gix-lock = { version = "^17.1.0", path = "../gix-lock" } +gix-fs = { version = "^0.16.0", path = "../gix-fs" } +gix-ref = { version = "^0.53.0", path = "../gix-ref" } +gix-discover = { version = "^0.41.0", path = "../gix-discover" } +gix-tempfile = { version = "^18.0.0", path = "../gix-tempfile", default-features = false } +gix-lock = { version = "^18.0.0", path = "../gix-lock" } gix-validate = { version = "^0.10.0", path = "../gix-validate" } -gix-sec = { version = "^0.11.0", path = "../gix-sec" } -gix-date = { version = "^0.10.2", path = "../gix-date" } -gix-refspec = { version = "^0.30.1", path = "../gix-refspec" } -gix-filter = { version = "^0.19.2", path = "../gix-filter", optional = true } -gix-dir = { version = "^0.14.1", path = "../gix-dir", optional = true } - -gix-config = { version = "^0.45.1", path = "../gix-config" } -gix-odb = { version = "^0.69.1", path = "../gix-odb" } -gix-hash = { version = "^0.18.0", path = "../gix-hash" } -gix-shallow = { version = "^0.4.0", path = "../gix-shallow" } -gix-object = { version = "^0.49.1", path = "../gix-object" } -gix-actor = { version = "^0.35.1", path = "../gix-actor" } -gix-pack = { version = "^0.59.1", path = "../gix-pack", default-features = false, features = [ +gix-sec = { version = "^0.12.0", path = "../gix-sec" } +gix-date = { version = "^0.10.3", path = "../gix-date" } +gix-refspec = { version = "^0.31.0", path = "../gix-refspec" } +gix-filter = { version = "^0.20.0", path = "../gix-filter", optional = true } +gix-dir = { version = "^0.15.0", path = "../gix-dir", optional = true } + +gix-config = { version = "^0.46.0", path = "../gix-config" } +gix-odb = { version = "^0.70.0", path = "../gix-odb" } +gix-hash = { version = "^0.19.0", path = "../gix-hash" } +gix-shallow = { version = "^0.5.0", path = "../gix-shallow" } +gix-object = { version = "^0.50.0", path = "../gix-object" } +gix-actor = { version = "^0.35.2", path = "../gix-actor" } +gix-pack = { version = "^0.60.0", path = "../gix-pack", default-features = false, features = [ "object-cache-dynamic", ] } -gix-revision = { version = "^0.34.1", path = "../gix-revision", default-features = false } -gix-revwalk = { version = "^0.20.1", path = "../gix-revwalk" } -gix-negotiate = { version = "^0.20.1", path = "../gix-negotiate", optional = true } - -gix-path = { version = "^0.10.18", path = "../gix-path" } -gix-url = { version = "^0.31.0", path = "../gix-url" } -gix-traverse = { version = "^0.46.2", path = "../gix-traverse" } -gix-diff = { version = "^0.52.1", path = "../gix-diff", default-features = false } -gix-merge = { version = "^0.5.1", path = "../gix-merge", default-features = false, optional = true } -gix-mailmap = { version = "^0.27.1", path = "../gix-mailmap", optional = true } -gix-features = { version = "^0.42.1", path = "../gix-features", features = [ +gix-revision = { version = "^0.35.0", path = "../gix-revision", default-features = false } +gix-revwalk = { version = "^0.21.0", path = "../gix-revwalk" } +gix-negotiate = { version = "^0.21.0", path = "../gix-negotiate", optional = true } + +gix-path = { version = "^0.10.19", path = "../gix-path" } +gix-url = { version = "^0.32.0", path = "../gix-url" } +gix-traverse = { version = "^0.47.0", path = "../gix-traverse" } +gix-diff = { version = "^0.53.0", path = "../gix-diff", default-features = false } +gix-merge = { version = "^0.6.0", path = "../gix-merge", default-features = false, optional = true } +gix-mailmap = { version = "^0.27.2", path = "../gix-mailmap", optional = true } +gix-features = { version = "^0.43.0", path = "../gix-features", features = [ "progress", "once_cell", ] } -gix-trace = { version = "^0.1.12", path = "../gix-trace" } - -gix-glob = { version = "^0.20.1", path = "../gix-glob" } -gix-credentials = { version = "^0.29.0", path = "../gix-credentials", optional = true } -gix-prompt = { version = "^0.11.0", path = "../gix-prompt", optional = true } -gix-index = { version = "^0.40.1", path = "../gix-index", optional = true } -gix-attributes = { version = "^0.26.1", path = "../gix-attributes", optional = true } -gix-ignore = { version = "^0.15.0", path = "../gix-ignore", optional = true } -gix-worktree = { version = "^0.41.0", path = "../gix-worktree", optional = true, default-features = false } -gix-worktree-state = { version = "^0.19.0", path = "../gix-worktree-state", optional = true } -gix-hashtable = { version = "^0.8.1", path = "../gix-hashtable" } -gix-commitgraph = { version = "^0.28.0", path = "../gix-commitgraph" } -gix-pathspec = { version = "^0.11.0", path = "../gix-pathspec", optional = true } -gix-submodule = { version = "^0.19.1", path = "../gix-submodule", optional = true } -gix-status = { version = "^0.19.1", path = "../gix-status", optional = true, features = [ +gix-trace = { version = "^0.1.13", path = "../gix-trace" } + +gix-glob = { version = "^0.21.0", path = "../gix-glob" } +gix-credentials = { version = "^0.30.0", path = "../gix-credentials", optional = true } +gix-prompt = { version = "^0.11.1", path = "../gix-prompt", optional = true } +gix-index = { version = "^0.41.0", path = "../gix-index", optional = true } +gix-attributes = { version = "^0.27.0", path = "../gix-attributes", optional = true } +gix-ignore = { version = "^0.16.0", path = "../gix-ignore", optional = true } +gix-worktree = { version = "^0.42.0", path = "../gix-worktree", optional = true, default-features = false } +gix-worktree-state = { version = "^0.20.0", path = "../gix-worktree-state", optional = true } +gix-hashtable = { version = "^0.9.0", path = "../gix-hashtable" } +gix-commitgraph = { version = "^0.29.0", path = "../gix-commitgraph" } +gix-pathspec = { version = "^0.12.0", path = "../gix-pathspec", optional = true } +gix-submodule = { version = "^0.20.0", path = "../gix-submodule", optional = true } +gix-status = { version = "^0.20.0", path = "../gix-status", optional = true, features = [ "worktree-rewrites", ] } -gix-command = { version = "^0.6.1", path = "../gix-command", optional = true } +gix-command = { version = "^0.6.2", path = "../gix-command", optional = true } -gix-worktree-stream = { version = "^0.21.2", path = "../gix-worktree-stream", optional = true } -gix-archive = { version = "^0.21.2", path = "../gix-archive", default-features = false, optional = true } -gix-blame = { version = "^0.2.1", path = "../gix-blame", optional = true } +gix-worktree-stream = { version = "^0.22.0", path = "../gix-worktree-stream", optional = true } +gix-archive = { version = "^0.22.0", path = "../gix-archive", default-features = false, optional = true } +gix-blame = { version = "^0.3.0", path = "../gix-blame", optional = true } # For communication with remotes -gix-protocol = { version = "^0.50.1", path = "../gix-protocol" } -gix-transport = { version = "^0.47.0", path = "../gix-transport", optional = true } +gix-protocol = { version = "^0.51.0", path = "../gix-protocol" } +gix-transport = { version = "^0.48.0", path = "../gix-transport", optional = true } # Just to get the progress-tree feature prodash = { version = "30.0.1", optional = true, features = ["progress-tree"] } diff --git a/tests/it/Cargo.toml b/tests/it/Cargo.toml index 25abc5edad7..dc8ac71bd0e 100644 --- a/tests/it/Cargo.toml +++ b/tests/it/Cargo.toml @@ -17,6 +17,6 @@ path = "src/main.rs" [dependencies] anyhow = "1.0.98" clap = { version = "4.5.40", features = ["derive"] } -gix = { version = "^0.72.1", path = "../../gix", default-features = false, features = ["attributes", "blame", "blob-diff", "revision"] } +gix = { version = "^0.73.0", path = "../../gix", default-features = false, features = ["attributes", "blame", "blob-diff", "revision"] } once_cell = "1.21.3" regex = { version = "1.11.1", default-features = false, features = ["std"] } diff --git a/tests/tools/Cargo.toml b/tests/tools/Cargo.toml index 083002b64d4..c591a8a6a74 100644 --- a/tests/tools/Cargo.toml +++ b/tests/tools/Cargo.toml @@ -3,7 +3,7 @@ lints.workspace = true [package] name = "gix-testtools" description = "Shared code for gitoxide crates to facilitate testing" -version = "0.16.1" +version = "0.17.0" authors = ["Sebastian Thiel "] edition = "2021" license = "MIT OR Apache-2.0" @@ -25,11 +25,11 @@ default = [] xz = ["dep:xz2"] [dependencies] -gix-lock = { version = "17.1.0", path = "../../gix-lock" } -gix-discover = { version = "0.40.1", path = "../../gix-discover" } -gix-worktree = { version = "0.41.0", path = "../../gix-worktree" } -gix-fs = { version = "0.15.0", path = "../../gix-fs" } -gix-tempfile = { version = "17.1.0", path = "../../gix-tempfile", default-features = false, features = ["signals"] } +gix-lock = { version = "^18.0.0", path = "../../gix-lock" } +gix-discover = { version = "^0.41.0", path = "../../gix-discover" } +gix-worktree = { version = "^0.42.0", path = "../../gix-worktree" } +gix-fs = { version = "^0.16.0", path = "../../gix-fs" } +gix-tempfile = { version = "^18.0.0", path = "../../gix-tempfile", default-features = false, features = ["signals"] } winnow = { version = "0.7.10", features = ["simd"] } fastrand = "2.0.0"