diff --git a/Cargo.lock b/Cargo.lock index a70d3b0a4ac..45cc1614a69 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -890,6 +890,20 @@ dependencies = [ "syn 2.0.101", ] +[[package]] +name = "dashmap" +version = "6.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5041cc499144891f3790297212f32a74fb938e5136a14943f338ef9e0ae276cf" +dependencies = [ + "cfg-if", + "crossbeam-utils", + "hashbrown 0.14.5", + "lock_api", + "once_cell", + "parking_lot_core", +] + [[package]] name = "dbus" version = "0.9.7" @@ -1256,8 +1270,7 @@ dependencies = [ [[package]] name = "gix" version = "0.72.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01237e8d3d78581f71642be8b0c2ae8c0b2b5c251c9c5d9ebbea3c1ea280dce8" +source = "git+https://github.com/GitoxideLabs/gitoxide?branch=improvements#a5c3ce64faa21e1af37b899ee4fe57a0d61cc253" dependencies = [ "gix-actor", "gix-attributes", @@ -1292,6 +1305,7 @@ dependencies = [ "gix-revwalk", "gix-sec", "gix-shallow", + "gix-status", "gix-submodule", "gix-tempfile", "gix-trace", @@ -1310,8 +1324,7 @@ dependencies = [ [[package]] name = "gix-actor" version = "0.35.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b300e6e4f31f3f6bd2de5e2b0caab192ced00dc0fcd0f7cc56e28c575c8e1ff" +source = "git+https://github.com/GitoxideLabs/gitoxide?branch=improvements#a5c3ce64faa21e1af37b899ee4fe57a0d61cc253" dependencies = [ "bstr", "gix-date", @@ -1324,8 +1337,7 @@ dependencies = [ [[package]] name = "gix-attributes" version = "0.26.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f50d813d5c2ce9463ba0c29eea90060df08e38ad8f34b8a192259f8bce5c078" +source = "git+https://github.com/GitoxideLabs/gitoxide?branch=improvements#a5c3ce64faa21e1af37b899ee4fe57a0d61cc253" dependencies = [ "bstr", "gix-glob", @@ -1341,8 +1353,7 @@ dependencies = [ [[package]] name = "gix-bitmap" version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1db9765c69502650da68f0804e3dc2b5f8ccc6a2d104ca6c85bc40700d37540" +source = "git+https://github.com/GitoxideLabs/gitoxide?branch=improvements#a5c3ce64faa21e1af37b899ee4fe57a0d61cc253" dependencies = [ "thiserror 2.0.12", ] @@ -1350,8 +1361,7 @@ dependencies = [ [[package]] name = "gix-chunk" version = "0.4.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b1f1d8764958699dc764e3f727cef280ff4d1bd92c107bbf8acd85b30c1bd6f" +source = "git+https://github.com/GitoxideLabs/gitoxide?branch=improvements#a5c3ce64faa21e1af37b899ee4fe57a0d61cc253" dependencies = [ "thiserror 2.0.12", ] @@ -1359,8 +1369,7 @@ dependencies = [ [[package]] name = "gix-command" version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d05dd813ef6bb798570308aa7f1245cefa350ec9f30dc53308335eb22b9d0f8b" +source = "git+https://github.com/GitoxideLabs/gitoxide?branch=improvements#a5c3ce64faa21e1af37b899ee4fe57a0d61cc253" dependencies = [ "bstr", "gix-path", @@ -1372,8 +1381,7 @@ dependencies = [ [[package]] name = "gix-commitgraph" version = "0.28.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e05050fd6caa6c731fe3bd7f9485b3b520be062d3d139cb2626e052d6c127951" +source = "git+https://github.com/GitoxideLabs/gitoxide?branch=improvements#a5c3ce64faa21e1af37b899ee4fe57a0d61cc253" dependencies = [ "bstr", "gix-chunk", @@ -1385,8 +1393,7 @@ dependencies = [ [[package]] name = "gix-config" version = "0.45.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48f3c8f357ae049bfb77493c2ec9010f58cfc924ae485e1116c3718fc0f0d881" +source = "git+https://github.com/GitoxideLabs/gitoxide?branch=improvements#a5c3ce64faa21e1af37b899ee4fe57a0d61cc253" dependencies = [ "bstr", "gix-config-value", @@ -1406,8 +1413,7 @@ dependencies = [ [[package]] name = "gix-config-value" version = "0.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "439d62e241dae2dffd55bfeeabe551275cf9d9f084c5ebc6b48bad49d03285b7" +source = "git+https://github.com/GitoxideLabs/gitoxide?branch=improvements#a5c3ce64faa21e1af37b899ee4fe57a0d61cc253" dependencies = [ "bitflags", "bstr", @@ -1419,12 +1425,12 @@ dependencies = [ [[package]] name = "gix-credentials" version = "0.29.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce1c7307e36026b6088e5b12014ffe6d4f509c911ee453e22a7be4003a159c9b" +source = "git+https://github.com/GitoxideLabs/gitoxide?branch=improvements#a5c3ce64faa21e1af37b899ee4fe57a0d61cc253" dependencies = [ "bstr", "gix-command", "gix-config-value", + "gix-date", "gix-path", "gix-prompt", "gix-sec", @@ -1436,8 +1442,7 @@ dependencies = [ [[package]] name = "gix-date" version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "139d1d52b21741e3f0c72b0fc65e1ff34d4eaceb100ef529d182725d2e09b8cb" +source = "git+https://github.com/GitoxideLabs/gitoxide?branch=improvements#a5c3ce64faa21e1af37b899ee4fe57a0d61cc253" dependencies = [ "bstr", "itoa 1.0.15", @@ -1449,20 +1454,30 @@ dependencies = [ [[package]] name = "gix-diff" version = "0.52.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e9b43e95fe352da82a969f0c84ff860c2de3e724d93f6681fedbcd6c917f252" +source = "git+https://github.com/GitoxideLabs/gitoxide?branch=improvements#a5c3ce64faa21e1af37b899ee4fe57a0d61cc253" dependencies = [ "bstr", + "gix-attributes", + "gix-command", + "gix-filter", + "gix-fs", "gix-hash", + "gix-index", "gix-object", + "gix-path", + "gix-pathspec", + "gix-tempfile", + "gix-trace", + "gix-traverse", + "gix-worktree", + "imara-diff", "thiserror 2.0.12", ] [[package]] name = "gix-dir" version = "0.14.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01e6e2dc5b8917142d0ffe272209d1671e45b771e433f90186bc71c016792e87" +source = "git+https://github.com/GitoxideLabs/gitoxide?branch=improvements#a5c3ce64faa21e1af37b899ee4fe57a0d61cc253" dependencies = [ "bstr", "gix-discover", @@ -1481,8 +1496,7 @@ dependencies = [ [[package]] name = "gix-discover" version = "0.40.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dccfe3e25b4ea46083916c56db3ba9d1e6ef6dce54da485f0463f9fc0fe1837c" +source = "git+https://github.com/GitoxideLabs/gitoxide?branch=improvements#a5c3ce64faa21e1af37b899ee4fe57a0d61cc253" dependencies = [ "bstr", "dunce", @@ -1497,8 +1511,7 @@ dependencies = [ [[package]] name = "gix-features" version = "0.42.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56f4399af6ec4fd9db84dd4cf9656c5c785ab492ab40a7c27ea92b4241923fed" +source = "git+https://github.com/GitoxideLabs/gitoxide?branch=improvements#a5c3ce64faa21e1af37b899ee4fe57a0d61cc253" dependencies = [ "bytes", "crc32fast", @@ -1518,8 +1531,7 @@ dependencies = [ [[package]] name = "gix-filter" version = "0.19.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ecf004912949bbcf308d71aac4458321748ecb59f4d046830d25214208c471f1" +source = "git+https://github.com/GitoxideLabs/gitoxide?branch=improvements#a5c3ce64faa21e1af37b899ee4fe57a0d61cc253" dependencies = [ "bstr", "encoding_rs", @@ -1539,8 +1551,7 @@ dependencies = [ [[package]] name = "gix-fs" version = "0.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67a0637149b4ef24d3ea55f81f77231401c8463fae6da27331c987957eb597c7" +source = "git+https://github.com/GitoxideLabs/gitoxide?branch=improvements#a5c3ce64faa21e1af37b899ee4fe57a0d61cc253" dependencies = [ "bstr", "fastrand", @@ -1553,8 +1564,7 @@ dependencies = [ [[package]] name = "gix-glob" version = "0.20.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90181472925b587f6079698f79065ff64786e6d6c14089517a1972bca99fb6e9" +source = "git+https://github.com/GitoxideLabs/gitoxide?branch=improvements#a5c3ce64faa21e1af37b899ee4fe57a0d61cc253" dependencies = [ "bitflags", "bstr", @@ -1565,8 +1575,7 @@ dependencies = [ [[package]] name = "gix-hash" version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d4900562c662852a6b42e2ef03442eccebf24f047d8eab4f23bc12ef0d785d8" +source = "git+https://github.com/GitoxideLabs/gitoxide?branch=improvements#a5c3ce64faa21e1af37b899ee4fe57a0d61cc253" dependencies = [ "faster-hex", "gix-features", @@ -1577,8 +1586,7 @@ dependencies = [ [[package]] name = "gix-hashtable" version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5b5cb3c308b4144f2612ff64e32130e641279fcf1a84d8d40dad843b4f64904" +source = "git+https://github.com/GitoxideLabs/gitoxide?branch=improvements#a5c3ce64faa21e1af37b899ee4fe57a0d61cc253" dependencies = [ "gix-hash", "hashbrown 0.14.5", @@ -1588,8 +1596,7 @@ dependencies = [ [[package]] name = "gix-ignore" version = "0.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae358c3c96660b10abc7da63c06788dfded603e717edbd19e38c6477911b71c8" +source = "git+https://github.com/GitoxideLabs/gitoxide?branch=improvements#a5c3ce64faa21e1af37b899ee4fe57a0d61cc253" dependencies = [ "bstr", "gix-glob", @@ -1601,8 +1608,7 @@ dependencies = [ [[package]] name = "gix-index" version = "0.40.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b38e919efd59cb8275d23ad2394b2ab9d002007b27620e145d866d546403b665" +source = "git+https://github.com/GitoxideLabs/gitoxide?branch=improvements#a5c3ce64faa21e1af37b899ee4fe57a0d61cc253" dependencies = [ "bitflags", "bstr", @@ -1629,8 +1635,7 @@ dependencies = [ [[package]] name = "gix-lock" version = "17.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "570f8b034659f256366dc90f1a24924902f20acccd6a15be96d44d1269e7a796" +source = "git+https://github.com/GitoxideLabs/gitoxide?branch=improvements#a5c3ce64faa21e1af37b899ee4fe57a0d61cc253" dependencies = [ "gix-tempfile", "gix-utils", @@ -1640,8 +1645,7 @@ dependencies = [ [[package]] name = "gix-negotiate" version = "0.20.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e1ea901acc4d5b44553132a29e8697210cb0e739b2d9752d713072e9391e3c9" +source = "git+https://github.com/GitoxideLabs/gitoxide?branch=improvements#a5c3ce64faa21e1af37b899ee4fe57a0d61cc253" dependencies = [ "bitflags", "gix-commitgraph", @@ -1656,8 +1660,7 @@ dependencies = [ [[package]] name = "gix-object" version = "0.49.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d957ca3640c555d48bb27f8278c67169fa1380ed94f6452c5590742524c40fbb" +source = "git+https://github.com/GitoxideLabs/gitoxide?branch=improvements#a5c3ce64faa21e1af37b899ee4fe57a0d61cc253" dependencies = [ "bstr", "gix-actor", @@ -1677,8 +1680,7 @@ dependencies = [ [[package]] name = "gix-odb" version = "0.69.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "868f703905fdbcfc1bd750942f82419903ecb7039f5288adb5206d6de405e0c9" +source = "git+https://github.com/GitoxideLabs/gitoxide?branch=improvements#a5c3ce64faa21e1af37b899ee4fe57a0d61cc253" dependencies = [ "arc-swap", "gix-date", @@ -1698,8 +1700,7 @@ dependencies = [ [[package]] name = "gix-pack" version = "0.59.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d49c55d69c8449f2a0a5a77eb9cbacfebb6b0e2f1215f0fc23a4cb60528a450" +source = "git+https://github.com/GitoxideLabs/gitoxide?branch=improvements#a5c3ce64faa21e1af37b899ee4fe57a0d61cc253" dependencies = [ "clru", "gix-chunk", @@ -1718,8 +1719,7 @@ dependencies = [ [[package]] name = "gix-packetline" version = "0.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ddc034bc67c848e4ef7596ab5528cd8fd439d310858dbe1ce8b324f25deb91c" +source = "git+https://github.com/GitoxideLabs/gitoxide?branch=improvements#a5c3ce64faa21e1af37b899ee4fe57a0d61cc253" dependencies = [ "bstr", "faster-hex", @@ -1730,8 +1730,7 @@ dependencies = [ [[package]] name = "gix-packetline-blocking" version = "0.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c44880f028ba46d6cf37a66d27a300310c6b51b8ed0e44918f93df061168e2f3" +source = "git+https://github.com/GitoxideLabs/gitoxide?branch=improvements#a5c3ce64faa21e1af37b899ee4fe57a0d61cc253" dependencies = [ "bstr", "faster-hex", @@ -1742,8 +1741,7 @@ dependencies = [ [[package]] name = "gix-path" version = "0.10.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "567f65fec4ef10dfab97ae71f26a27fd4d7fe7b8e3f90c8a58551c41ff3fb65b" +source = "git+https://github.com/GitoxideLabs/gitoxide?branch=improvements#a5c3ce64faa21e1af37b899ee4fe57a0d61cc253" dependencies = [ "bstr", "gix-trace", @@ -1756,8 +1754,7 @@ dependencies = [ [[package]] name = "gix-pathspec" version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce061c50e5f8f7c830cacb3da3e999ae935e283ce8522249f0ce2256d110979d" +source = "git+https://github.com/GitoxideLabs/gitoxide?branch=improvements#a5c3ce64faa21e1af37b899ee4fe57a0d61cc253" dependencies = [ "bitflags", "bstr", @@ -1771,8 +1768,7 @@ dependencies = [ [[package]] name = "gix-prompt" version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d024a3fe3993bbc17733396d2cefb169c7a9d14b5b71dafb7f96e3962b7c3128" +source = "git+https://github.com/GitoxideLabs/gitoxide?branch=improvements#a5c3ce64faa21e1af37b899ee4fe57a0d61cc253" dependencies = [ "gix-command", "gix-config-value", @@ -1784,8 +1780,7 @@ dependencies = [ [[package]] name = "gix-protocol" version = "0.50.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5c17d78bb0414f8d60b5f952196dc2e47ec320dca885de9128ecdb4a0e38401" +source = "git+https://github.com/GitoxideLabs/gitoxide?branch=improvements#a5c3ce64faa21e1af37b899ee4fe57a0d61cc253" dependencies = [ "bstr", "gix-credentials", @@ -1810,8 +1805,7 @@ dependencies = [ [[package]] name = "gix-quote" version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a375a75b4d663e8bafe3bf4940a18a23755644c13582fa326e99f8f987d83fd" +source = "git+https://github.com/GitoxideLabs/gitoxide?branch=improvements#a5c3ce64faa21e1af37b899ee4fe57a0d61cc253" dependencies = [ "bstr", "gix-utils", @@ -1821,8 +1815,7 @@ dependencies = [ [[package]] name = "gix-ref" version = "0.52.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1b7985657029684d759f656b09abc3e2c73085596d5cdb494428823970a7762" +source = "git+https://github.com/GitoxideLabs/gitoxide?branch=improvements#a5c3ce64faa21e1af37b899ee4fe57a0d61cc253" dependencies = [ "gix-actor", "gix-features", @@ -1842,8 +1835,7 @@ dependencies = [ [[package]] name = "gix-refspec" version = "0.30.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "445ed14e3db78e8e79980085e3723df94e1c8163b3ae5bc8ed6a8fe6cf983b42" +source = "git+https://github.com/GitoxideLabs/gitoxide?branch=improvements#a5c3ce64faa21e1af37b899ee4fe57a0d61cc253" dependencies = [ "bstr", "gix-hash", @@ -1856,8 +1848,7 @@ dependencies = [ [[package]] name = "gix-revision" version = "0.34.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78d0b8e5cbd1c329e25383e088cb8f17439414021a643b30afa5146b71e3c65d" +source = "git+https://github.com/GitoxideLabs/gitoxide?branch=improvements#a5c3ce64faa21e1af37b899ee4fe57a0d61cc253" dependencies = [ "bitflags", "bstr", @@ -1874,8 +1865,7 @@ dependencies = [ [[package]] name = "gix-revwalk" version = "0.20.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bc756b73225bf005ddeb871d1ca7b3c33e2417d0d53e56effa5a36765b52b28" +source = "git+https://github.com/GitoxideLabs/gitoxide?branch=improvements#a5c3ce64faa21e1af37b899ee4fe57a0d61cc253" dependencies = [ "gix-commitgraph", "gix-date", @@ -1889,8 +1879,7 @@ dependencies = [ [[package]] name = "gix-sec" version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0dabbc78c759ecc006b970339394951b2c8e1e38a37b072c105b80b84c308fd" +source = "git+https://github.com/GitoxideLabs/gitoxide?branch=improvements#a5c3ce64faa21e1af37b899ee4fe57a0d61cc253" dependencies = [ "bitflags", "gix-path", @@ -1901,8 +1890,7 @@ dependencies = [ [[package]] name = "gix-shallow" version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b9a6f6e34d6ede08f522d89e5c7990b4f60524b8ae6ebf8e850963828119ad4" +source = "git+https://github.com/GitoxideLabs/gitoxide?branch=improvements#a5c3ce64faa21e1af37b899ee4fe57a0d61cc253" dependencies = [ "bstr", "gix-hash", @@ -1910,11 +1898,32 @@ dependencies = [ "thiserror 2.0.12", ] +[[package]] +name = "gix-status" +version = "0.19.1" +source = "git+https://github.com/GitoxideLabs/gitoxide?branch=improvements#376ed0cb602e4df457b0b6c87fe16af027bdff48" +dependencies = [ + "bstr", + "filetime", + "gix-diff", + "gix-dir", + "gix-features", + "gix-filter", + "gix-fs", + "gix-hash", + "gix-index", + "gix-object", + "gix-path", + "gix-pathspec", + "gix-worktree", + "portable-atomic", + "thiserror 2.0.12", +] + [[package]] name = "gix-submodule" version = "0.19.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f51472f05a450cc61bc91ed2f62fb06e31e2bbb31c420bc4be8793f26c8b0c1" +source = "git+https://github.com/GitoxideLabs/gitoxide?branch=improvements#a5c3ce64faa21e1af37b899ee4fe57a0d61cc253" dependencies = [ "bstr", "gix-config", @@ -1928,9 +1937,9 @@ dependencies = [ [[package]] name = "gix-tempfile" version = "17.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c750e8c008453a2dba67a2b0d928b7716e05da31173a3f5e351d5457ad4470aa" +source = "git+https://github.com/GitoxideLabs/gitoxide?branch=improvements#a5c3ce64faa21e1af37b899ee4fe57a0d61cc253" dependencies = [ + "dashmap", "gix-fs", "libc", "once_cell", @@ -1941,14 +1950,12 @@ dependencies = [ [[package]] name = "gix-trace" version = "0.1.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c396a2036920c69695f760a65e7f2677267ccf483f25046977d87e4cb2665f7" +source = "git+https://github.com/GitoxideLabs/gitoxide?branch=improvements#a5c3ce64faa21e1af37b899ee4fe57a0d61cc253" [[package]] name = "gix-transport" version = "0.47.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edfe22ba26d4b65c17879f12b9882eafe65d3c8611c933b272fce2c10f546f59" +source = "git+https://github.com/GitoxideLabs/gitoxide?branch=improvements#a5c3ce64faa21e1af37b899ee4fe57a0d61cc253" dependencies = [ "base64", "bstr", @@ -1966,8 +1973,7 @@ dependencies = [ [[package]] name = "gix-traverse" version = "0.46.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8648172f85aca3d6e919c06504b7ac26baef54e04c55eb0100fa588c102cc33" +source = "git+https://github.com/GitoxideLabs/gitoxide?branch=improvements#a5c3ce64faa21e1af37b899ee4fe57a0d61cc253" dependencies = [ "bitflags", "gix-commitgraph", @@ -1983,8 +1989,7 @@ dependencies = [ [[package]] name = "gix-url" version = "0.31.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42a1ad0b04a5718b5cb233e6888e52a9b627846296161d81dcc5eb9203ec84b8" +source = "git+https://github.com/GitoxideLabs/gitoxide?branch=improvements#a5c3ce64faa21e1af37b899ee4fe57a0d61cc253" dependencies = [ "bstr", "gix-features", @@ -1997,8 +2002,7 @@ dependencies = [ [[package]] name = "gix-utils" version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5351af2b172caf41a3728eb4455326d84e0d70fe26fc4de74ab0bd37df4191c5" +source = "git+https://github.com/GitoxideLabs/gitoxide?branch=improvements#a5c3ce64faa21e1af37b899ee4fe57a0d61cc253" dependencies = [ "bstr", "fastrand", @@ -2008,8 +2012,7 @@ dependencies = [ [[package]] name = "gix-validate" version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77b9e00cacde5b51388d28ed746c493b18a6add1f19b5e01d686b3b9ece66d4d" +source = "git+https://github.com/GitoxideLabs/gitoxide?branch=improvements#a5c3ce64faa21e1af37b899ee4fe57a0d61cc253" dependencies = [ "bstr", "thiserror 2.0.12", @@ -2018,8 +2021,7 @@ dependencies = [ [[package]] name = "gix-worktree" version = "0.41.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54f1916f8d928268300c977d773dd70a8746b646873b77add0a34876a8c847e9" +source = "git+https://github.com/GitoxideLabs/gitoxide?branch=improvements#a5c3ce64faa21e1af37b899ee4fe57a0d61cc253" dependencies = [ "bstr", "gix-attributes", @@ -2345,6 +2347,15 @@ dependencies = [ "version_check", ] +[[package]] +name = "imara-diff" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17d34b7d42178945f775e84bc4c36dde7c1c6cdfea656d3354d009056f2bb3d2" +dependencies = [ + "hashbrown 0.15.3", +] + [[package]] name = "indexmap" version = "2.9.0" @@ -3791,9 +3802,9 @@ dependencies = [ [[package]] name = "socket2" -version = "0.5.10" +version = "0.5.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678" +checksum = "4f5fd57c80058a56cf5c777ab8a126398ece8e442983605d280a44ce79d0edef" dependencies = [ "libc", "windows-sys 0.52.0", @@ -4473,7 +4484,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/Cargo.toml b/Cargo.toml index 76850b80967..96269bd63b7 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -49,7 +49,7 @@ flate2 = { version = "1.1.1", default-features = false, features = ["zlib-rs"] } git2 = "0.20.0" git2-curl = "0.21.0" # When updating this, also see if `gix-transport` further down needs updating or some auth-related tests will fail. -gix = { version = "0.72.0", default-features = false, features = ["blocking-http-transport-curl", "progress-tree", "parallel", "dirwalk"] } +gix = { git = "https://github.com/GitoxideLabs/gitoxide", branch = "improvements", version = "0.72.1", default-features = false, features = ["blocking-http-transport-curl", "progress-tree", "parallel", "dirwalk", "status"] } glob = "0.3.2" handlebars = { version = "6.3.1", features = ["dir_source"] } hex = "0.4.3" @@ -256,7 +256,7 @@ cargo-test-support.workspace = true gix = { workspace = true, features = ["revision"] } # When building Cargo for tests, a safety-measure in `gix` needs to be disabled # to allow sending credentials over HTTP connections. -gix-transport = { version = "0.47.0", features = ["http-client-insecure-credentials"] } +gix-transport = { git = "https://github.com/GitoxideLabs/gitoxide", branch = "improvements", features = ["http-client-insecure-credentials"] } same-file.workspace = true snapbox.workspace = true diff --git a/src/cargo/ops/cargo_package/mod.rs b/src/cargo/ops/cargo_package/mod.rs index fe750adb9f7..1bb647fc26d 100644 --- a/src/cargo/ops/cargo_package/mod.rs +++ b/src/cargo/ops/cargo_package/mod.rs @@ -450,7 +450,11 @@ fn prepare_archive( let src_files = src.list_files(pkg)?; // Check (git) repository state, getting the current commit hash. - let vcs_info = vcs::check_repo_state(pkg, &src_files, ws, &opts)?; + let vcs_info = if ws.gctx().cli_unstable().gitoxide.is_some() { + vcs::gix::check_repo_state(pkg, &src_files, ws, &opts) + } else { + vcs::check_repo_state(pkg, &src_files, ws, &opts) + }?; build_ar_list(ws, pkg, src_files, vcs_info, opts.include_lockfile) } diff --git a/src/cargo/ops/cargo_package/vcs/gix.rs b/src/cargo/ops/cargo_package/vcs/gix.rs new file mode 100644 index 00000000000..1c302141b0c --- /dev/null +++ b/src/cargo/ops/cargo_package/vcs/gix.rs @@ -0,0 +1,404 @@ +use crate::core::{Package, Workspace}; +use crate::ops::cargo_package::vcs::{GitVcsInfo, VcsInfo}; +use crate::ops::PackageOpts; +use crate::sources::PathEntry; +use crate::{CargoResult, GlobalContext}; +use anyhow::Context; +use cargo_util::paths; +use gix::bstr::ByteSlice; +use gix::dir::walk::EmissionMode; +use gix::index::entry::Mode; +use gix::status::tree_index::TrackRenames; +use gix::worktree::stack::state::ignore::Source; +use std::collections::HashSet; +use std::path::{Path, PathBuf}; +use tracing::debug; + +/// Checks if the package source is in a *git* DVCS repository. +/// +/// If *git*, and the source is *dirty* (e.g., has uncommitted changes), +/// and `--allow-dirty` has not been passed, +/// then `bail!` with an informative message. +/// Otherwise, return the sha1 hash of the current *HEAD* commit, +/// or `None` if no repo is found. +#[tracing::instrument(skip_all)] +pub fn check_repo_state( + p: &Package, + src_files: &[PathEntry], + ws: &Workspace<'_>, + opts: &PackageOpts<'_>, +) -> CargoResult> { + let gctx = ws.gctx(); + let Ok(repo) = gix::discover(p.root()) else { + gctx.shell().verbose(|shell| { + shell.warn(format_args!( + "no (git) VCS found for `{}`", + p.root().display() + )) + })?; + // No Git repo found. Have to assume it is clean. + return Ok(None); + }; + + let Some(workdir) = repo.workdir() else { + debug!( + "no (git) workdir found for repo at `{}`", + repo.path().display() + ); + // No git workdir. Have to assume it is clean. + return Ok(None); + }; + + debug!("found a git repo at `{}`", workdir.display()); + let path = p.manifest_path(); + + let manifest_exists = path.exists(); + let path = paths::strip_prefix_canonical(path, workdir).unwrap_or_else(|_| path.to_path_buf()); + let rela_path = + gix::path::to_unix_separators_on_windows(gix::path::os_str_into_bstr(path.as_os_str())?); + if !manifest_exists { + gctx.shell().verbose(|shell| { + shell.warn(format_args!( + "Cargo.toml not found at `{}` in workdir `{}`", + path.display(), + workdir.display() + )) + })?; + // TODO: Either remove this whole block, or have a test. + // It's hard to have no Cargo.toml here? + // No `Cargo.toml` found. This package may be irrelevant. + // Have to assume it is clean. + return Ok(None); + }; + + let manifest_is_ignored = { + let index = repo.index_or_empty()?; + let mut excludes = + repo.excludes(&index, None, Source::WorktreeThenIdMappingIfNotSkipped)?; + excludes + .at_entry(rela_path.as_bstr(), Some(Mode::FILE))? + .is_excluded() + }; + if manifest_is_ignored { + gctx.shell().verbose(|shell| { + shell.warn(format_args!( + "found (git) Cargo.toml ignored at `{}` in workdir `{}`", + path.display(), + workdir.display() + )) + })?; + // An ignored `Cargo.toml` found. This package may be irrelevant. + // Have to assume it is clean. + return Ok(None); + } + + warn_symlink_checked_out_as_plain_text_file(gctx, src_files, &repo)?; + + debug!( + "found (git) Cargo.toml at `{}` in workdir `{}`", + path.display(), + workdir.display(), + ); + let Some(git) = git(ws, p, src_files, &repo, &opts)? else { + // If the git repo lacks essential field like `sha1`, and since this field exists from the beginning, + // then don't generate the corresponding file in order to maintain consistency with past behavior. + return Ok(None); + }; + + let path_in_vcs = path + .parent() + .and_then(|p| p.to_str()) + .unwrap_or("") + .replace("\\", "/"); + + Ok(Some(VcsInfo { git, path_in_vcs })) +} + +/// Warns if any symlinks were checked out as plain text files. +/// +/// Git config [`core.symlinks`] defaults to true when unset. +/// In git-for-windows (and git as well), +/// the config should be set to false explicitly when the repo was created, +/// if symlink support wasn't detected [^1]. +/// +/// We assume the config was always set at creation time and never changed. +/// So, if it is true, we don't bother users with any warning. +/// +/// [^1]: +/// +/// [`core.symlinks`]: https://git-scm.com/docs/git-config#Documentation/git-config.txt-coresymlinks +fn warn_symlink_checked_out_as_plain_text_file( + gctx: &GlobalContext, + src_files: &[PathEntry], + repo: &gix::Repository, +) -> CargoResult<()> { + if repo + .config_snapshot() + .boolean(&gix::config::tree::Core::SYMLINKS) + .unwrap_or(true) + { + return Ok(()); + } + + if src_files.iter().any(|f| f.maybe_plain_text_symlink()) { + let mut shell = gctx.shell(); + shell.warn(format_args!( + "found symbolic links that may be checked out as regular files for git repo at `{}/`\n\ + This might cause the `.crate` file to include incorrect or incomplete files", + repo.workdir().unwrap().display(), + ))?; + let extra_note = if cfg!(windows) { + "\nAnd on Windows, enable the Developer Mode to support symlinks" + } else { + "" + }; + shell.note(format_args!( + "to avoid this, set the Git config `core.symlinks` to `true`{extra_note}", + ))?; + } + + Ok(()) +} + +/// The real git status check starts from here. +fn git( + ws: &Workspace<'_>, + pkg: &Package, + src_files: &[PathEntry], + repo: &gix::Repository, + opts: &PackageOpts<'_>, +) -> CargoResult> { + // This is a collection of any dirty or untracked files. This covers: + // - new/modified/deleted/renamed/type change (index or worktree) + // - untracked files (which are "new" worktree files) + // - ignored (in case the user has an `include` directive that + // conflicts with .gitignore). + let mut dirty_files = Vec::new(); + let workdir = repo.workdir().unwrap(); + let mut dirty_files_outside_of_package_root = collect_statuses( + repo, + workdir, + relative_package_root(repo, pkg.root()).as_deref(), + &mut dirty_files, + )?; + + // Include each submodule so that the error message can provide + // specifically *which* files in a submodule are modified. + status_submodules( + repo, + &mut dirty_files, + &mut dirty_files_outside_of_package_root, + )?; + + // Find the intersection of dirty in git, and the src_files that would + // be packaged. This is a lazy n^2 check, but seems fine with + // thousands of files. + let cwd = ws.gctx().cwd(); + let mut dirty_src_files: Vec<_> = src_files + .iter() + .filter(|src_file| { + if let Some(canon_src_file) = src_file.is_symlink_or_under_symlink().then(|| { + gix::path::realpath_opts( + &src_file, + ws.gctx().cwd(), + gix::path::realpath::MAX_SYMLINKS, + ) + .unwrap_or_else(|_| src_file.to_path_buf()) + }) { + dirty_files + .iter() + .any(|path| canon_src_file.starts_with(path)) + } else { + dirty_files.iter().any(|path| src_file.starts_with(path)) + } + }) + .map(|p| p.as_ref()) + .chain( + dirty_files_outside_pkg_root(ws, pkg, &dirty_files_outside_of_package_root, src_files)? + .iter(), + ) + .map(|path| { + pathdiff::diff_paths(path, cwd) + .as_ref() + .unwrap_or(path) + .display() + .to_string() + }) + .collect(); + let dirty = !dirty_src_files.is_empty(); + if !dirty || opts.allow_dirty { + // Must check whether the repo has no commit firstly; otherwise `revparse_single` would fail on bare commit repo. + // Due to lacking the `sha1` field, it's better not record the `GitVcsInfo` for consistency. + let maybe_head_id = repo.head()?.try_peel_to_id_in_place()?; + Ok(maybe_head_id.map(|id| GitVcsInfo { + sha1: id.to_string(), + dirty, + })) + } else { + dirty_src_files.sort_unstable(); + anyhow::bail!( + "{} files in the working directory contain changes that were \ + not yet committed into git:\n\n{}\n\n\ + to proceed despite this and include the uncommitted changes, pass the `--allow-dirty` flag", + dirty_src_files.len(), + dirty_src_files.join("\n") + ) + } +} + +/// Helper to collect dirty statuses for a single repo. +/// `relative_package_root` is `Some` if the root is a sub-directory of the workdir. +/// Returns the dirty files outside `relative_package_root`. +#[must_use] +fn collect_statuses( + repo: &gix::Repository, + workdir: &Path, + relative_package_root: Option<&Path>, + dirty_files: &mut Vec, +) -> CargoResult> { + let statuses = repo + .status(gix::progress::Discard)? + .dirwalk_options(|opts| { + opts.emit_untracked(gix::dir::walk::EmissionMode::Matching) + // Also pick up ignored files or whole directories + // to specifically catch overzealously ignored source files. + // Later we will match these dirs by prefix, which is why collapsing + // them is desirable here. + .emit_ignored(Some(EmissionMode::CollapseDirectory)) + .emit_tracked(false) + .recurse_repositories(false) + .symlinks_to_directories_are_ignored_like_directories(true) + .emit_empty_directories(false) + }) + .tree_index_track_renames(TrackRenames::Disabled) + .index_worktree_submodules(None) + .into_iter(None /* pathspec patterns */) + .with_context(|| { + format!( + "failed to begin git status for repo {}", + repo.path().display() + ) + })?; + + let mut dirty_files_outside_of_package_root = Vec::new(); + for status in statuses { + let status = status.with_context(|| { + format!( + "failed to retrieve git status from repo {}", + repo.path().display() + ) + })?; + + let rel_path = gix::path::from_bstr(status.location()); + let path = workdir.join(&rel_path); + if relative_package_root.is_some_and(|pkg_root| !rel_path.starts_with(pkg_root)) { + dirty_files_outside_of_package_root.push(path); + continue; + } + + // It is OK to include Cargo.lock even if it is ignored. + if path.ends_with("Cargo.lock") + && matches!( + &status, + gix::status::Item::IndexWorktree( + gix::status::index_worktree::Item::DirectoryContents { entry, .. } + ) if matches!(entry.status, gix::dir::entry::Status::Ignored(_)) + ) + { + continue; + } + + dirty_files.push(path); + } + Ok(dirty_files_outside_of_package_root) +} + +/// Helper to collect dirty statuses while recursing into submodules. +fn status_submodules( + repo: &gix::Repository, + dirty_files: &mut Vec, + dirty_files_outside_of_package_root: &mut Vec, +) -> CargoResult<()> { + let Some(submodules) = repo.submodules()? else { + return Ok(()); + }; + for submodule in submodules { + // Ignore submodules that don't open, they are probably not initialized. + // If its files are required, then the verification step should fail. + if let Some(sub_repo) = submodule.open()? { + let Some(workdir) = sub_repo.workdir() else { + continue; + }; + status_submodules(&sub_repo, dirty_files, dirty_files_outside_of_package_root)?; + dirty_files_outside_of_package_root.extend(collect_statuses( + &sub_repo, + workdir, + None, + dirty_files, + )?); + } + } + Ok(()) +} + +/// Make `pkg_root` relative to the `repo` workdir. +fn relative_package_root(repo: &gix::Repository, pkg_root: &Path) -> Option { + let workdir = repo.workdir().unwrap(); + let rela_root = pkg_root.strip_prefix(workdir).unwrap_or(Path::new("")); + if rela_root.as_os_str().is_empty() { + None + } else { + rela_root.to_owned().into() + } +} + +/// Checks whether "included" source files outside package root have been modified. +/// +/// This currently looks at +/// +/// * `package.readme` and `package.license-file` pointing to paths outside package root +/// * symlinks targets reside outside package root +/// * Any change in the root workspace manifest, regardless of what has changed. +/// +/// This is required because those paths may link to a file outside the +/// current package root, but still under the git workdir, affecting the +/// final packaged `.crate` file. +fn dirty_files_outside_pkg_root( + ws: &Workspace<'_>, + pkg: &Package, + dirty_files_outside_of_package_root: &[PathBuf], + src_files: &[PathEntry], +) -> CargoResult> { + let pkg_root = pkg.root(); + let meta = pkg.manifest().metadata(); + let metadata_paths: Vec<_> = [&meta.license_file, &meta.readme] + .into_iter() + .filter_map(|p| p.as_deref()) + .map(|path| paths::normalize_path(&pkg_root.join(path))) + .collect(); + + let dirty_files = src_files + .iter() + .filter(|p| p.is_symlink_or_under_symlink()) + .map(|p| p.as_ref().as_path()) + .chain(metadata_paths.iter().map(AsRef::as_ref)) + .chain([ws.root_manifest()]) + // If inside package root. Don't bother checking git status. + .filter(|p| paths::strip_prefix_canonical(p, pkg_root).is_err()) + // Handle files outside package root but under git workdir, + .filter_map(|src_file| { + let canon_src_path = gix::path::realpath_opts( + src_file, + ws.gctx().cwd(), + gix::path::realpath::MAX_SYMLINKS, + ) + .unwrap_or_else(|_| src_file.to_owned()); + + dirty_files_outside_of_package_root + .iter() + .any(|p| canon_src_path.starts_with(p)) + .then_some(canon_src_path) + }) + .collect(); + Ok(dirty_files) +} diff --git a/src/cargo/ops/cargo_package/vcs.rs b/src/cargo/ops/cargo_package/vcs/mod.rs similarity index 99% rename from src/cargo/ops/cargo_package/vcs.rs rename to src/cargo/ops/cargo_package/vcs/mod.rs index 5f29a44d9fe..0db35cc4ac2 100644 --- a/src/cargo/ops/cargo_package/vcs.rs +++ b/src/cargo/ops/cargo_package/vcs/mod.rs @@ -17,6 +17,8 @@ use crate::GlobalContext; use super::PackageOpts; +pub(super) mod gix; + /// Represents the VCS information when packaging. #[derive(Serialize)] pub struct VcsInfo { @@ -29,7 +31,7 @@ pub struct VcsInfo { #[derive(Serialize)] pub struct GitVcsInfo { sha1: String, - /// Indicate whether or not the Git worktree is dirty. + /// Indicate whether the Git worktree is dirty. #[serde(skip_serializing_if = "std::ops::Not::not")] dirty: bool, } diff --git a/tests/testsuite/git.rs b/tests/testsuite/git.rs index 8d00ecf1851..3a8e75267ba 100644 --- a/tests/testsuite/git.rs +++ b/tests/testsuite/git.rs @@ -3161,7 +3161,20 @@ fn dirty_submodule() { git_project .cargo("package --no-verify") .with_status(101) - .with_stderr_data(str![[r#" + .with_stderr_data(if cargo_uses_gitoxide() { + str![[r#" +[WARNING] manifest has no description, license, license-file, documentation, homepage or repository. +See https://doc.rust-lang.org/cargo/reference/manifest.html#package-metadata for more info. +[ERROR] 2 files in the working directory contain changes that were not yet committed into git: + +.gitmodules +src/lib.rs + +to proceed despite this and include the uncommitted changes, pass the `--allow-dirty` flag + +"#]] + } else { + str![[r#" [WARNING] manifest has no description, license, license-file, documentation, homepage or repository. See https://doc.rust-lang.org/cargo/reference/manifest.html#package-metadata for more info. [ERROR] 1 files in the working directory contain changes that were not yet committed into git: @@ -3170,7 +3183,8 @@ See https://doc.rust-lang.org/cargo/reference/manifest.html#package-metadata for to proceed despite this and include the uncommitted changes, pass the `--allow-dirty` flag -"#]]) +"#]] + }) .run(); git::commit(&repo); @@ -3207,7 +3221,20 @@ to proceed despite this and include the uncommitted changes, pass the `--allow-d git_project .cargo("package --no-verify") .with_status(101) - .with_stderr_data(str![[r#" + .with_stderr_data(if cargo_uses_gitoxide() { + str![[r#" +[WARNING] manifest has no description, license, license-file, documentation, homepage or repository. +See https://doc.rust-lang.org/cargo/reference/manifest.html#package-metadata for more info. +[ERROR] 2 files in the working directory contain changes that were not yet committed into git: + +src/.gitmodules +src/bar/mod.rs + +to proceed despite this and include the uncommitted changes, pass the `--allow-dirty` flag + +"#]] + } else { + str![[r#" [WARNING] manifest has no description, license, license-file, documentation, homepage or repository. See https://doc.rust-lang.org/cargo/reference/manifest.html#package-metadata for more info. [ERROR] 1 files in the working directory contain changes that were not yet committed into git: @@ -3216,7 +3243,8 @@ src/.gitmodules to proceed despite this and include the uncommitted changes, pass the `--allow-dirty` flag -"#]]) +"#]] + }) .run(); // Commit the submodule addition. diff --git a/tests/testsuite/package.rs b/tests/testsuite/package.rs index e519fa18bcf..ce8a5a89a22 100644 --- a/tests/testsuite/package.rs +++ b/tests/testsuite/package.rs @@ -3,6 +3,7 @@ use std::fs::{self, read_to_string, File}; use std::path::Path; +use cargo_test_support::git::cargo_uses_gitoxide; use cargo_test_support::prelude::*; use cargo_test_support::publish::validate_crate_contents; use cargo_test_support::registry::{self, Package}; @@ -1340,7 +1341,7 @@ fn dirty_file_outside_pkg_root_considered_dirty() { git::commit(&repo); // Changing files outside pkg root under situations below should be treated - // as dirty. `cargo package` is expected to fail on VCS stastus check. + // as dirty. `cargo package` is expected to fail on VCS status check. // // * Changes in files outside package root that source files symlink to p.change_file("README.md", "after"); @@ -1348,7 +1349,7 @@ fn dirty_file_outside_pkg_root_considered_dirty() { p.change_file("original-dir/file", "after"); // * Changes in files outside pkg root that `license-file`/`readme` point to p.change_file("LICENSE", "after"); - // * When workspace root manifest has changned, + // * When workspace root manifest has changed, // no matter whether workspace inheritance is involved. p.change_file( "Cargo.toml", @@ -1360,7 +1361,7 @@ fn dirty_file_outside_pkg_root_considered_dirty() { edition = "2021" "#, ); - // Changes in files outside git workdir won't affect vcs status check + // Changes in files outside git workdir won't affect VCS status check p.change_file( &main_outside_pkg_root, r#"fn main() { eprintln!("after"); }"#, @@ -1463,16 +1464,32 @@ fn dirty_file_outside_pkg_root_inside_submodule() { p.symlink("submodule/file.txt", "isengard/src/file.txt"); git::add(&repo); git::commit(&repo); - // This dirtyness should be detected in the future. + // This dirtiness should be detected in the future. p.change_file("submodule/file.txt", "changed"); - p.cargo("package --workspace --no-verify") - .with_stderr_data(str![[r#" + let mut execs = p.cargo("package --workspace --no-verify"); + if cargo_uses_gitoxide() { + execs + .with_status(101) + .with_stderr_data(str![[r#" +[ERROR] 1 files in the working directory contain changes that were not yet committed into git: + +isengard/src/file.txt + +to proceed despite this and include the uncommitted changes, pass the `--allow-dirty` flag + +"#]]) + .run(); + } else { + // In `git2` this isn't currently implemented, but it could be. + execs + .with_stderr_data(str![[r#" [PACKAGING] isengard v0.0.0 ([ROOT]/foo/isengard) [PACKAGED] 6 files, [FILE_SIZE]B ([FILE_SIZE]B compressed) "#]]) - .run(); + .run(); + } } #[cargo_test] diff --git a/triagebot.toml b/triagebot.toml index 8dcef7b27d7..aebbaab5e67 100644 --- a/triagebot.toml +++ b/triagebot.toml @@ -150,7 +150,7 @@ trigger_files = ["src/cargo/util/flock.rs", "src/cargo/util/important_paths.rs"] trigger_files = ["src/cargo/core/compiler/future_incompat.rs"] [autolabel."A-git"] -trigger_files = ["src/cargo/sources/git/", "src/cargo/ops/cargo_package/vcs.rs"] +trigger_files = ["src/cargo/sources/git/", "src/cargo/ops/cargo_package/vcs/mod.rs", "src/cargo/ops/cargo_package/vcs/gix.rs"] [autolabel."A-home"] trigger_files = ["crates/home/"]