Radish alpha
h
rad:z3gqcJUoA1n9HaHKufZs5FCSGazv5
Radicle Heartwood Protocol & Stack
Radicle
Git
fetch: integrate the latest `gix-protocol` into `radicle-fetch`
Merged did:key:z6Mksvd5...geZL opened 1 year ago

It makes only minimal changes, but overall allows to remove a lot of previously duplicated code.

5 files changed +651 -526 96637aca 72913b8c
modified Cargo.lock
@@ -3,10 +3,10 @@
version = 3

[[package]]
-
name = "adler"
-
version = "1.0.2"
+
name = "adler2"
+
version = "2.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe"
+
checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627"

[[package]]
name = "aead"
@@ -547,15 +547,6 @@ dependencies = [
]

[[package]]
-
name = "deranged"
-
version = "0.3.11"
-
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4"
-
dependencies = [
-
 "powerfmt",
-
]
-

-
[[package]]
name = "diff"
version = "0.1.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -574,6 +565,17 @@ dependencies = [
]

[[package]]
+
name = "displaydoc"
+
version = "0.2.5"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0"
+
dependencies = [
+
 "proc-macro2",
+
 "quote",
+
 "syn 2.0.89",
+
]
+

+
[[package]]
name = "dyn-clone"
version = "1.0.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -671,6 +673,9 @@ name = "faster-hex"
version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a2a2b11eda1d40935b26cf18f6833c526845ae8c41e58d09af6adeb6f0269183"
+
dependencies = [
+
 "serde",
+
]

[[package]]
name = "fastrand"
@@ -702,9 +707,9 @@ dependencies = [

[[package]]
name = "flate2"
-
version = "1.0.28"
+
version = "1.0.35"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "46303f565772937ffe1d394a4fac6f411c6013172fadde9dcdb1e147a086940e"
+
checksum = "c936bfdafb507ebbf50b8074c54fa31c5be9a1e7e5f467dd659697041407d07c"
dependencies = [
 "crc32fast",
 "miniz_oxide",
@@ -778,7 +783,7 @@ checksum = "ebb6549ddc63ba5722acb98c823b0eccb7f8b979407bd2a8fd616f581ae50982"
dependencies = [
 "bstr",
 "serde",
-
 "thiserror",
+
 "thiserror 1.0.69",
]

[[package]]
@@ -808,32 +813,32 @@ dependencies = [

[[package]]
name = "gix-actor"
-
version = "0.31.5"
+
version = "0.33.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "a0e454357e34b833cc3a00b6efbbd3dd4d18b24b9fb0c023876ec2645e8aa3f2"
+
checksum = "32b24171f514cef7bb4dfb72a0b06dacf609b33ba8ad2489d4c4559a03b7afb3"
dependencies = [
 "bstr",
 "gix-date",
 "gix-utils",
 "itoa",
-
 "thiserror",
+
 "thiserror 2.0.7",
 "winnow",
]

[[package]]
name = "gix-chunk"
-
version = "0.4.8"
+
version = "0.4.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "45c8751169961ba7640b513c3b24af61aa962c967aaf04116734975cd5af0c52"
+
checksum = "c6ffbeb3a5c0b8b84c3fe4133a6f8c82fa962f4caefe8d0762eced025d3eb4f7"
dependencies = [
-
 "thiserror",
+
 "thiserror 2.0.7",
]

[[package]]
name = "gix-command"
-
version = "0.3.6"
+
version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "f90009020dc4b3de47beed28e1334706e0a330ddd17f5cfeb097df3b15a54b77"
+
checksum = "9405c0a56e17f8365a46870cd2c7db71323ecc8bda04b50cb746ea37bd091e90"
dependencies = [
 "bstr",
 "gix-path",
@@ -843,36 +848,36 @@ dependencies = [

[[package]]
name = "gix-commitgraph"
-
version = "0.24.3"
+
version = "0.25.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "133b06f67f565836ec0c473e2116a60fb74f80b6435e21d88013ac0e3c60fc78"
+
checksum = "a8da6591a7868fb2b6dabddea6b09988b0b05e0213f938dbaa11a03dd7a48d85"
dependencies = [
 "bstr",
 "gix-chunk",
 "gix-features",
 "gix-hash",
 "memmap2",
-
 "thiserror",
+
 "thiserror 2.0.7",
]

[[package]]
name = "gix-config-value"
-
version = "0.14.6"
+
version = "0.14.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "fbd06203b1a9b33a78c88252a625031b094d9e1b647260070c25b09910c0a804"
+
checksum = "49aaeef5d98390a3bcf9dbc6440b520b793d1bf3ed99317dc407b02be995b28e"
dependencies = [
 "bitflags 2.5.0",
 "bstr",
 "gix-path",
 "libc",
-
 "thiserror",
+
 "thiserror 2.0.7",
]

[[package]]
name = "gix-credentials"
-
version = "0.24.2"
+
version = "0.26.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "5c70146183bd3c7119329a3c7392d1aa0e0adbe48d727f4df31828fe6d8fdaa1"
+
checksum = "82a50c56b785c29a151ab4ccf74a83fe4e21d2feda0d30549504b4baed353e0a"
dependencies = [
 "bstr",
 "gix-command",
@@ -882,38 +887,38 @@ dependencies = [
 "gix-sec",
 "gix-trace",
 "gix-url",
-
 "thiserror",
+
 "thiserror 2.0.7",
]

[[package]]
name = "gix-date"
-
version = "0.8.7"
+
version = "0.9.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "9eed6931f21491ee0aeb922751bd7ec97b4b2fe8fbfedcb678e2a2dce5f3b8c0"
+
checksum = "c57c477b645ee248b173bb1176b52dd528872f12c50375801a58aaf5ae91113f"
dependencies = [
 "bstr",
 "itoa",
-
 "thiserror",
-
 "time",
+
 "jiff",
+
 "thiserror 2.0.7",
]

[[package]]
name = "gix-diff"
-
version = "0.44.1"
+
version = "0.49.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "1996d5c8a305b59709467d80617c9fde48d9d75fd1f4179ea970912630886c9d"
+
checksum = "a8e92566eccbca205a0a0f96ffb0327c061e85bc5c95abbcddfe177498aa04f6"
dependencies = [
 "bstr",
 "gix-hash",
 "gix-object",
-
 "thiserror",
+
 "thiserror 2.0.7",
]

[[package]]
name = "gix-features"
-
version = "0.38.2"
+
version = "0.39.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "ac7045ac9fe5f9c727f38799d002a7ed3583cd777e3322a7c4b43e3cf437dc69"
+
checksum = "7d85d673f2e022a340dba4713bed77ef2cf4cd737d2f3e0f159d45e0935fd81f"
dependencies = [
 "crc32fast",
 "flate2",
@@ -923,15 +928,15 @@ dependencies = [
 "libc",
 "prodash",
 "sha1_smol",
-
 "thiserror",
+
 "thiserror 2.0.7",
 "walkdir",
]

[[package]]
name = "gix-fs"
-
version = "0.11.2"
+
version = "0.12.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "6adf99c27cdf17b1c4d77680c917e0d94d8783d4e1c73d3be0d1d63107163d7a"
+
checksum = "3b3d4fac505a621f97e5ce2c69fdc425742af00c0920363ca4074f0eb48b1db9"
dependencies = [
 "fastrand",
 "gix-features",
@@ -940,19 +945,19 @@ dependencies = [

[[package]]
name = "gix-hash"
-
version = "0.14.2"
+
version = "0.15.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "f93d7df7366121b5018f947a04d37f034717e113dcf9ccd85c34b58e57a74d5e"
+
checksum = "0b5eccc17194ed0e67d49285e4853307e4147e95407f91c1c3e4a13ba9f4e4ce"
dependencies = [
 "faster-hex",
-
 "thiserror",
+
 "thiserror 2.0.7",
]

[[package]]
name = "gix-hashtable"
-
version = "0.5.2"
+
version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "7ddf80e16f3c19ac06ce415a38b8591993d3f73aede049cb561becb5b3a8e242"
+
checksum = "0ef65b256631078ef733bc5530c4e6b1c2e7d5c2830b75d4e9034ab3997d18fe"
dependencies = [
 "gix-hash",
 "hashbrown",
@@ -960,49 +965,79 @@ dependencies = [
]

[[package]]
+
name = "gix-lock"
+
version = "15.0.1"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "1cd3ab68a452db63d9f3ebdacb10f30dba1fa0d31ac64f4203d395ed1102d940"
+
dependencies = [
+
 "gix-tempfile",
+
 "gix-utils",
+
 "thiserror 2.0.7",
+
]
+

+
[[package]]
+
name = "gix-negotiate"
+
version = "0.17.0"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "d27f830a16405386e9c83b9d5be8261fe32bbd6b3caf15bd1b284c6b2b7ef1a8"
+
dependencies = [
+
 "bitflags 2.5.0",
+
 "gix-commitgraph",
+
 "gix-date",
+
 "gix-hash",
+
 "gix-object",
+
 "gix-revwalk",
+
 "smallvec",
+
 "thiserror 2.0.7",
+
]
+

+
[[package]]
name = "gix-object"
-
version = "0.42.3"
+
version = "0.46.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "25da2f46b4e7c2fa7b413ce4dffb87f69eaf89c2057e386491f4c55cadbfe386"
+
checksum = "e42d58010183ef033f31088479b4eb92b44fe341b35b62d39eb8b185573d77ea"
dependencies = [
 "bstr",
 "gix-actor",
 "gix-date",
 "gix-features",
 "gix-hash",
+
 "gix-hashtable",
+
 "gix-path",
 "gix-utils",
 "gix-validate",
 "itoa",
 "smallvec",
-
 "thiserror",
+
 "thiserror 2.0.7",
 "winnow",
]

[[package]]
name = "gix-odb"
-
version = "0.61.1"
+
version = "0.66.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "20d384fe541d93d8a3bb7d5d5ef210780d6df4f50c4e684ccba32665a5e3bc9b"
+
checksum = "cb780eceb3372ee204469478de02eaa34f6ba98247df0186337e0333de97d0ae"
dependencies = [
 "arc-swap",
 "gix-date",
 "gix-features",
 "gix-fs",
 "gix-hash",
+
 "gix-hashtable",
 "gix-object",
 "gix-pack",
 "gix-path",
 "gix-quote",
 "parking_lot",
 "tempfile",
-
 "thiserror",
+
 "thiserror 2.0.7",
]

[[package]]
name = "gix-pack"
-
version = "0.51.1"
+
version = "0.56.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "3e0594491fffe55df94ba1c111a6566b7f56b3f8d2e1efc750e77d572f5f5229"
+
checksum = "4158928929be29cae7ab97afc8e820a932071a7f39d8ba388eed2380c12c566c"
dependencies = [
 "gix-chunk",
 "gix-diff",
@@ -1016,81 +1051,139 @@ dependencies = [
 "memmap2",
 "parking_lot",
 "smallvec",
-
 "thiserror",
+
 "thiserror 2.0.7",
]

[[package]]
name = "gix-packetline"
-
version = "0.17.5"
+
version = "0.18.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "b70486beda0903b6d5b65dfa6e40585098cdf4e6365ca2dff4f74c387354a515"
+
checksum = "911aeea8b2dabeed2f775af9906152a1f0109787074daf9e64224e3892dde453"
dependencies = [
 "bstr",
 "faster-hex",
 "gix-trace",
-
 "thiserror",
+
 "thiserror 2.0.7",
]

[[package]]
name = "gix-path"
-
version = "0.10.9"
+
version = "0.10.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "8d23d5bbda31344d8abc8de7c075b3cf26e5873feba7c4a15d916bce67382bd9"
+
checksum = "afc292ef1a51e340aeb0e720800338c805975724c1dfbd243185452efd8645b7"
dependencies = [
 "bstr",
 "gix-trace",
 "home",
 "once_cell",
-
 "thiserror",
+
 "thiserror 2.0.7",
]

[[package]]
name = "gix-prompt"
-
version = "0.8.4"
+
version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "f5325eb17ce7b5e5d25dec5c2315d642a09d55b9888b3bf46b7d72e1621a55d8"
+
checksum = "82433a19aa44688e3bde05c692870eda50b5db053df53ed5ae6d8ea594a6babd"
dependencies = [
 "gix-command",
 "gix-config-value",
 "parking_lot",
 "rustix",
-
 "thiserror",
+
 "thiserror 2.0.7",
]

[[package]]
name = "gix-protocol"
-
version = "0.45.0"
+
version = "0.47.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "aed3bb6179835a3250403baa9d7022579e559fc45f2efc416d9de1a14b5acf11"
+
checksum = "c84642e8b6fed7035ce9cc449593019c55b0ec1af7a5dce1ab8a0636eaaeb067"
dependencies = [
 "bstr",
 "gix-credentials",
 "gix-date",
 "gix-features",
 "gix-hash",
+
 "gix-lock",
+
 "gix-negotiate",
+
 "gix-object",
+
 "gix-ref",
+
 "gix-refspec",
+
 "gix-revwalk",
+
 "gix-shallow",
+
 "gix-trace",
 "gix-transport",
 "gix-utils",
 "maybe-async",
-
 "thiserror",
+
 "thiserror 2.0.7",
 "winnow",
]

[[package]]
name = "gix-quote"
-
version = "0.4.12"
+
version = "0.4.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "cbff4f9b9ea3fa7a25a70ee62f545143abef624ac6aa5884344e70c8b0a1d9ff"
+
checksum = "64a1e282216ec2ab2816cd57e6ed88f8009e634aec47562883c05ac8a7009a63"
dependencies = [
 "bstr",
 "gix-utils",
-
 "thiserror",
+
 "thiserror 2.0.7",
+
]
+

+
[[package]]
+
name = "gix-ref"
+
version = "0.49.1"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "a91b61776c839d0f1b7114901179afb0947aa7f4d30793ca1c56d335dfef485f"
+
dependencies = [
+
 "gix-actor",
+
 "gix-features",
+
 "gix-fs",
+
 "gix-hash",
+
 "gix-lock",
+
 "gix-object",
+
 "gix-path",
+
 "gix-tempfile",
+
 "gix-utils",
+
 "gix-validate",
+
 "memmap2",
+
 "thiserror 2.0.7",
+
 "winnow",
+
]
+

+
[[package]]
+
name = "gix-refspec"
+
version = "0.27.0"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "00c056bb747868c7eb0aeb352c9f9181ab8ca3d0a2550f16470803500c6c413d"
+
dependencies = [
+
 "bstr",
+
 "gix-hash",
+
 "gix-revision",
+
 "gix-validate",
+
 "smallvec",
+
 "thiserror 2.0.7",
+
]
+

+
[[package]]
+
name = "gix-revision"
+
version = "0.31.1"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "61e1ddc474405a68d2ce8485705dd72fe6ce959f2f5fe718601ead5da2c8f9e7"
+
dependencies = [
+
 "bstr",
+
 "gix-commitgraph",
+
 "gix-date",
+
 "gix-hash",
+
 "gix-object",
+
 "gix-revwalk",
+
 "thiserror 2.0.7",
]

[[package]]
name = "gix-revwalk"
-
version = "0.13.2"
+
version = "0.17.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "1b030ccaab71af141f537e0225f19b9e74f25fefdba0372246b844491cab43e0"
+
checksum = "510026fc32f456f8f067d8f37c34088b97a36b2229d88a6a5023ef179fcb109d"
dependencies = [
 "gix-commitgraph",
 "gix-date",
@@ -1098,14 +1191,14 @@ dependencies = [
 "gix-hashtable",
 "gix-object",
 "smallvec",
-
 "thiserror",
+
 "thiserror 2.0.7",
]

[[package]]
name = "gix-sec"
-
version = "0.10.6"
+
version = "0.10.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "fddc27984a643b20dd03e97790555804f98cf07404e0e552c0ad8133266a79a1"
+
checksum = "a8b876ef997a955397809a2ec398d6a45b7a55b4918f2446344330f778d14fd6"
dependencies = [
 "bitflags 2.5.0",
 "gix-path",
@@ -1114,10 +1207,22 @@ dependencies = [
]

[[package]]
+
name = "gix-shallow"
+
version = "0.1.0"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "88d2673242e87492cb6ff671f0c01f689061ca306c4020f137197f3abc84ce01"
+
dependencies = [
+
 "bstr",
+
 "gix-hash",
+
 "gix-lock",
+
 "thiserror 2.0.7",
+
]
+

+
[[package]]
name = "gix-tempfile"
-
version = "14.0.1"
+
version = "15.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "006acf5a613e0b5cf095d8e4b3f48c12a60d9062aa2b2dd105afaf8344a5600c"
+
checksum = "2feb86ef094cc77a4a9a5afbfe5de626897351bbbd0de3cb9314baf3049adb82"
dependencies = [
 "gix-fs",
 "libc",
@@ -1128,15 +1233,15 @@ dependencies = [

[[package]]
name = "gix-trace"
-
version = "0.1.9"
+
version = "0.1.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "f924267408915fddcd558e3f37295cc7d6a3e50f8bd8b606cee0808c3915157e"
+
checksum = "04bdde120c29f1fc23a24d3e115aeeea3d60d8e65bab92cc5f9d90d9302eb952"

[[package]]
name = "gix-transport"
-
version = "0.42.0"
+
version = "0.44.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "9d2f783b2fe86bf2a8cf1f3b8669d65b01ab4932f32cc0101d3893e1b16a3bd6"
+
checksum = "dd04d91e507a8713cfa2318d5a85d75b36e53a40379cc7eb7634ce400ecacbaf"
dependencies = [
 "bstr",
 "gix-command",
@@ -1145,14 +1250,14 @@ dependencies = [
 "gix-quote",
 "gix-sec",
 "gix-url",
-
 "thiserror",
+
 "thiserror 2.0.7",
]

[[package]]
name = "gix-traverse"
-
version = "0.39.2"
+
version = "0.43.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "e499a18c511e71cf4a20413b743b9f5bcf64b3d9e81e9c3c6cd399eae55a8840"
+
checksum = "6ed47d648619e23e93f971d2bba0d10c1100e54ef95d2981d609907a8cabac89"
dependencies = [
 "bitflags 2.5.0",
 "gix-commitgraph",
@@ -1162,28 +1267,28 @@ dependencies = [
 "gix-object",
 "gix-revwalk",
 "smallvec",
-
 "thiserror",
+
 "thiserror 2.0.7",
]

[[package]]
name = "gix-url"
-
version = "0.27.3"
+
version = "0.28.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "0db829ebdca6180fbe32be7aed393591df6db4a72dbbc0b8369162390954d1cf"
+
checksum = "d096fb733ba6bd3f5403dba8bd72bdd8809fe2b347b57844040b8f49c93492d9"
dependencies = [
 "bstr",
 "gix-features",
 "gix-path",
-
 "home",
-
 "thiserror",
+
 "percent-encoding",
+
 "thiserror 2.0.7",
 "url",
]

[[package]]
name = "gix-utils"
-
version = "0.1.12"
+
version = "0.1.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "35192df7fd0fa112263bad8021e2df7167df4cc2a6e6d15892e1e55621d3d4dc"
+
checksum = "ba427e3e9599508ed98a6ddf8ed05493db114564e338e41f6a996d2e4790335f"
dependencies = [
 "fastrand",
 "unicode-normalization",
@@ -1191,12 +1296,12 @@ dependencies = [

[[package]]
name = "gix-validate"
-
version = "0.8.5"
+
version = "0.9.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "82c27dd34a49b1addf193c92070bcbf3beaf6e10f16a78544de6372e146a0acf"
+
checksum = "cd520d09f9f585b34b32aba1d0b36ada89ab7fefb54a8ca3fe37fc482a750937"
dependencies = [
 "bstr",
-
 "thiserror",
+
 "thiserror 2.0.7",
]

[[package]]
@@ -1258,13 +1363,142 @@ dependencies = [
]

[[package]]
+
name = "icu_collections"
+
version = "1.5.0"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526"
+
dependencies = [
+
 "displaydoc",
+
 "yoke",
+
 "zerofrom",
+
 "zerovec",
+
]
+

+
[[package]]
+
name = "icu_locid"
+
version = "1.5.0"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637"
+
dependencies = [
+
 "displaydoc",
+
 "litemap",
+
 "tinystr",
+
 "writeable",
+
 "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.0"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e"
+

+
[[package]]
+
name = "icu_normalizer"
+
version = "1.5.0"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f"
+
dependencies = [
+
 "displaydoc",
+
 "icu_collections",
+
 "icu_normalizer_data",
+
 "icu_properties",
+
 "icu_provider",
+
 "smallvec",
+
 "utf16_iter",
+
 "utf8_iter",
+
 "write16",
+
 "zerovec",
+
]
+

+
[[package]]
+
name = "icu_normalizer_data"
+
version = "1.5.0"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516"
+

+
[[package]]
+
name = "icu_properties"
+
version = "1.5.1"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5"
+
dependencies = [
+
 "displaydoc",
+
 "icu_collections",
+
 "icu_locid_transform",
+
 "icu_properties_data",
+
 "icu_provider",
+
 "tinystr",
+
 "zerovec",
+
]
+

+
[[package]]
+
name = "icu_properties_data"
+
version = "1.5.0"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569"
+

+
[[package]]
+
name = "icu_provider"
+
version = "1.5.0"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9"
+
dependencies = [
+
 "displaydoc",
+
 "icu_locid",
+
 "icu_provider_macros",
+
 "stable_deref_trait",
+
 "tinystr",
+
 "writeable",
+
 "yoke",
+
 "zerofrom",
+
 "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.89",
+
]
+

+
[[package]]
name = "idna"
-
version = "0.5.0"
+
version = "1.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6"
+
checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e"
dependencies = [
-
 "unicode-bidi",
-
 "unicode-normalization",
+
 "idna_adapter",
+
 "smallvec",
+
 "utf8_iter",
+
]
+

+
[[package]]
+
name = "idna_adapter"
+
version = "1.2.0"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71"
+
dependencies = [
+
 "icu_normalizer",
+
 "icu_properties",
]

[[package]]
@@ -1323,6 +1557,31 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b"

[[package]]
+
name = "jiff"
+
version = "0.1.15"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "db69f08d4fb10524cacdb074c10b296299d71274ddbc830a8ee65666867002e9"
+
dependencies = [
+
 "jiff-tzdb-platform",
+
 "windows-sys 0.52.0",
+
]
+

+
[[package]]
+
name = "jiff-tzdb"
+
version = "0.1.1"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "91335e575850c5c4c673b9bd467b0e025f164ca59d0564f69d0c2ee0ffad4653"
+

+
[[package]]
+
name = "jiff-tzdb-platform"
+
version = "0.1.1"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "9835f0060a626fe59f160437bc725491a6af23133ea906500027d1bd2f8f4329"
+
dependencies = [
+
 "jiff-tzdb",
+
]
+

+
[[package]]
name = "jobserver"
version = "0.1.31"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1418,6 +1677,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c"

[[package]]
+
name = "litemap"
+
version = "0.7.4"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "4ee93343901ab17bd981295f2cf0026d4ad018c7c31ba84549a4ddbb47a45104"
+

+
[[package]]
name = "localtime"
version = "1.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1470,11 +1735,11 @@ dependencies = [

[[package]]
name = "miniz_oxide"
-
version = "0.7.2"
+
version = "0.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "9d811f3e15f28568be3407c8e7fdb6514c1cda3cb30683f15b6a1a1dc4ea14a7"
+
checksum = "a2ef2593ffb6958c941575cee70c8e257438749971869c4ae5acf6f91a168a61"
dependencies = [
-
 "adler",
+
 "adler2",
]

[[package]]
@@ -1561,12 +1826,6 @@ dependencies = [
]

[[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"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1597,15 +1856,6 @@ dependencies = [
]

[[package]]
-
name = "num_threads"
-
version = "0.1.7"
-
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "5c7398b9c8b70908f6371f47ed36737907c87c52af34c268fed0bf0ceb92ead9"
-
dependencies = [
-
 "libc",
-
]
-

-
[[package]]
name = "numtoa"
version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1769,12 +2019,6 @@ dependencies = [
]

[[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.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1834,9 +2078,13 @@ dependencies = [

[[package]]
name = "prodash"
-
version = "28.0.0"
+
version = "29.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "744a264d26b88a6a7e37cbad97953fa233b94d585236310bcbc88474b4092d79"
+
checksum = "a266d8d6020c61a437be704c5e618037588e1985c7dbb7bf8d265db84cffe325"
+
dependencies = [
+
 "log",
+
 "parking_lot",
+
]

[[package]]
name = "qcheck"
@@ -1897,7 +2145,7 @@ dependencies = [
 "siphasher 1.0.1",
 "sqlite",
 "tempfile",
-
 "thiserror",
+
 "thiserror 1.0.69",
 "unicode-normalization",
]

@@ -1925,7 +2173,7 @@ dependencies = [
 "serde_json",
 "shlex",
 "tempfile",
-
 "thiserror",
+
 "thiserror 1.0.69",
 "timeago",
 "tree-sitter",
 "tree-sitter-bash",
@@ -1954,7 +2202,7 @@ dependencies = [
 "radicle",
 "shlex",
 "snapbox",
-
 "thiserror",
+
 "thiserror 1.0.69",
]

[[package]]
@@ -1974,7 +2222,7 @@ dependencies = [
 "serde",
 "serde_json",
 "tempfile",
-
 "thiserror",
+
 "thiserror 1.0.69",
]

[[package]]
@@ -1988,7 +2236,7 @@ dependencies = [
 "radicle-crypto",
 "serde",
 "tempfile",
-
 "thiserror",
+
 "thiserror 1.0.69",
]

[[package]]
@@ -2008,7 +2256,7 @@ dependencies = [
 "sqlite",
 "ssh-key",
 "tempfile",
-
 "thiserror",
+
 "thiserror 1.0.69",
 "zeroize",
]

@@ -2025,7 +2273,6 @@ version = "0.10.0"
dependencies = [
 "bstr",
 "either",
-
 "gix-actor",
 "gix-features",
 "gix-hash",
 "gix-odb",
@@ -2036,7 +2283,7 @@ dependencies = [
 "nonempty 0.9.0",
 "radicle",
 "radicle-git-ext",
-
 "thiserror",
+
 "thiserror 1.0.69",
]

[[package]]
@@ -2050,7 +2297,7 @@ dependencies = [
 "percent-encoding",
 "radicle-std-ext",
 "serde",
-
 "thiserror",
+
 "thiserror 1.0.69",
]

[[package]]
@@ -2089,7 +2336,7 @@ dependencies = [
 "socket2",
 "sqlite",
 "tempfile",
-
 "thiserror",
+
 "thiserror 1.0.69",
]

[[package]]
@@ -2101,7 +2348,7 @@ dependencies = [
 "radicle-cli",
 "radicle-crypto",
 "radicle-git-ext",
-
 "thiserror",
+
 "thiserror 1.0.69",
]

[[package]]
@@ -2118,7 +2365,7 @@ version = "0.9.0"
dependencies = [
 "byteorder",
 "log",
-
 "thiserror",
+
 "thiserror 1.0.69",
 "zeroize",
]

@@ -2143,7 +2390,7 @@ dependencies = [
 "radicle-git-ext",
 "radicle-std-ext",
 "tar",
-
 "thiserror",
+
 "thiserror 1.0.69",
 "url",
]

@@ -2167,7 +2414,7 @@ dependencies = [
 "shlex",
 "tempfile",
 "termion 3.0.0",
-
 "thiserror",
+
 "thiserror 1.0.69",
 "unicode-display-width",
 "unicode-segmentation",
 "zeroize",
@@ -2606,6 +2853,12 @@ dependencies = [
]

[[package]]
+
name = "stable_deref_trait"
+
version = "1.2.0"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3"
+

+
[[package]]
name = "streaming-iterator"
version = "0.1.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -2640,6 +2893,17 @@ dependencies = [
]

[[package]]
+
name = "synstructure"
+
version = "0.13.1"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971"
+
dependencies = [
+
 "proc-macro2",
+
 "quote",
+
 "syn 2.0.89",
+
]
+

+
[[package]]
name = "tar"
version = "0.4.40"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -2692,7 +2956,16 @@ version = "1.0.69"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52"
dependencies = [
-
 "thiserror-impl",
+
 "thiserror-impl 1.0.69",
+
]
+

+
[[package]]
+
name = "thiserror"
+
version = "2.0.7"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "93605438cbd668185516ab499d589afb7ee1859ea3d5fc8f6b0755e1c7443767"
+
dependencies = [
+
 "thiserror-impl 2.0.7",
]

[[package]]
@@ -2707,45 +2980,33 @@ dependencies = [
]

[[package]]
-
name = "time"
-
version = "0.3.36"
+
name = "thiserror-impl"
+
version = "2.0.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885"
+
checksum = "e1d8749b4531af2117677a5fcd12b1348a3fe2b81e36e61ffeac5c4aa3273e36"
dependencies = [
-
 "deranged",
-
 "itoa",
-
 "libc",
-
 "num-conv",
-
 "num_threads",
-
 "powerfmt",
-
 "serde",
-
 "time-core",
-
 "time-macros",
+
 "proc-macro2",
+
 "quote",
+
 "syn 2.0.89",
]

[[package]]
-
name = "time-core"
-
version = "0.1.2"
+
name = "timeago"
+
version = "0.4.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3"
+
checksum = "a1710e589de0a76aaf295cd47a6699f6405737dbfd3cf2b75c92d000b548d0e6"

[[package]]
-
name = "time-macros"
-
version = "0.2.18"
+
name = "tinystr"
+
version = "0.7.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf"
+
checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f"
dependencies = [
-
 "num-conv",
-
 "time-core",
+
 "displaydoc",
+
 "zerovec",
]

[[package]]
-
name = "timeago"
-
version = "0.4.2"
-
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "a1710e589de0a76aaf295cd47a6699f6405737dbfd3cf2b75c92d000b548d0e6"
-

-
[[package]]
name = "tinyvec"
version = "1.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -2822,7 +3083,7 @@ dependencies = [
 "lazy_static",
 "regex",
 "streaming-iterator",
-
 "thiserror",
+
 "thiserror 1.0.69",
 "tree-sitter",
]

@@ -2919,12 +3180,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825"

[[package]]
-
name = "unicode-bidi"
-
version = "0.3.15"
-
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75"
-

-
[[package]]
name = "unicode-display-width"
version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -2972,9 +3227,9 @@ dependencies = [

[[package]]
name = "url"
-
version = "2.5.0"
+
version = "2.5.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633"
+
checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60"
dependencies = [
 "form_urlencoded",
 "idna",
@@ -2982,6 +3237,18 @@ dependencies = [
]

[[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"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be"
+

+
[[package]]
name = "utf8parse"
version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -3228,14 +3495,26 @@ checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0"

[[package]]
name = "winnow"
-
version = "0.6.8"
+
version = "0.6.20"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "c3c52e9c97a68071b23e836c9380edae937f17b9c4667bd021973efc689f618d"
+
checksum = "36c1fec1a2bb5866f07c25f68c26e565c4c200aebb96d7e55710c19d3e8ac49b"
dependencies = [
 "memchr",
]

[[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"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51"
+

+
[[package]]
name = "xattr"
version = "1.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -3253,7 +3532,74 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "09041cd90cf85f7f8b2df60c646f853b7f535ce68f85244eb6731cf89fa498ec"

[[package]]
+
name = "yoke"
+
version = "0.7.5"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40"
+
dependencies = [
+
 "serde",
+
 "stable_deref_trait",
+
 "yoke-derive",
+
 "zerofrom",
+
]
+

+
[[package]]
+
name = "yoke-derive"
+
version = "0.7.5"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154"
+
dependencies = [
+
 "proc-macro2",
+
 "quote",
+
 "syn 2.0.89",
+
 "synstructure",
+
]
+

+
[[package]]
+
name = "zerofrom"
+
version = "0.1.5"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "cff3ee08c995dee1859d998dea82f7374f2826091dd9cd47def953cae446cd2e"
+
dependencies = [
+
 "zerofrom-derive",
+
]
+

+
[[package]]
+
name = "zerofrom-derive"
+
version = "0.1.5"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808"
+
dependencies = [
+
 "proc-macro2",
+
 "quote",
+
 "syn 2.0.89",
+
 "synstructure",
+
]
+

+
[[package]]
name = "zeroize"
version = "1.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d"
+

+
[[package]]
+
name = "zerovec"
+
version = "0.10.4"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079"
+
dependencies = [
+
 "yoke",
+
 "zerofrom",
+
 "zerovec-derive",
+
]
+

+
[[package]]
+
name = "zerovec-derive"
+
version = "0.10.3"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6"
+
dependencies = [
+
 "proc-macro2",
+
 "quote",
+
 "syn 2.0.89",
+
]
modified radicle-fetch/Cargo.toml
@@ -10,13 +10,13 @@ edition = "2021"
[dependencies]
bstr = { version = "1.3" }
either = { version = "1.9.0" }
-
gix-actor = { version = "0.31.1" }
-
gix-features = { version = "0.38.1", features = ["progress"] }
-
gix-hash = { version = "0.14.2" }
-
gix-odb = { version = "0.61.0" }
-
gix-pack = { version = "0.51.0" }
-
gix-protocol = { version = "0.45", features = ["blocking-client"] }
-
gix-transport = { version = "0.42", features = ["blocking-client"] }
+
#gix-actor = { version = "0.31.1" }
+
gix-features = { version = "0.39.1", features = ["progress"] }
+
gix-hash = { version = "0.15.1" }
+
gix-odb = { version = "0.66.0" }
+
gix-pack = { version = "0.56.0" }
+
gix-protocol = { version = "0.47.0", features = ["blocking-client"] }
+
gix-transport = { version = "0.44.0", features = ["blocking-client"] }
log = { version = "0.4.17", features = ["std"] }
nonempty = { version = "0.9.0" }
radicle-git-ext = { version = "0.8.0", features = ["bstr"] }
modified radicle-fetch/src/transport.rs
@@ -10,9 +10,7 @@ use std::sync::Arc;
use bstr::BString;
use gix_features::progress::prodash::progress;
use gix_protocol::handshake;
-
use gix_protocol::FetchConnection;
use gix_transport::client;
-
use gix_transport::client::TransportWithoutIO as _;
use gix_transport::Protocol;
use gix_transport::Service;
use radicle::git::Oid;
@@ -85,7 +83,7 @@ where
        log::trace!(target: "fetch", "Performing handshake for {}", self.repo);
        let (read, write) = self.stream.open().map_err(io_other)?;
        gix_protocol::fetch::handshake(
-
            &mut Connection::new(read, write, FetchConnection::AllowReuse, self.repo.clone()),
+
            &mut Connection::new(read, write, self.repo.clone()),
            |_| Ok(None),
            vec![],
            &mut progress::Discard,
@@ -105,11 +103,10 @@ where
        ls_refs::run(
            ls_refs::Config {
                prefixes,
-
                extra_params: vec![],
                repo: self.repo.clone(),
            },
            handshake,
-
            Connection::new(read, write, FetchConnection::AllowReuse, self.repo.clone()),
+
            Connection::new(read, write, self.repo.clone()),
            &mut progress::Discard,
        )
        .map_err(io_other)
@@ -137,7 +134,7 @@ where
                    interrupt,
                },
                handshake,
-
                Connection::new(read, write, FetchConnection::AllowReuse, self.repo.clone()),
+
                Connection::new(read, write, self.repo.clone()),
                &mut progress::Discard,
            )
            .map_err(io_other)?
@@ -184,7 +181,6 @@ where

pub(crate) struct Connection<R, W> {
    inner: client::git::Connection<R, W>,
-
    mode: FetchConnection,
}

impl<R, W> Connection<R, W>
@@ -192,7 +188,7 @@ where
    R: io::Read,
    W: io::Write,
{
-
    pub fn new(read: R, write: W, mode: FetchConnection, repo: BString) -> Self {
+
    pub fn new(read: R, write: W, repo: BString) -> Self {
        Self {
            inner: client::git::Connection::new(
                read,
@@ -203,7 +199,6 @@ where
                client::git::ConnectMode::Daemon,
                false,
            ),
-
            mode,
        }
    }
}
@@ -256,20 +251,6 @@ where
    }
}

-
fn indicate_end_of_interaction<R, W>(transport: &mut Connection<R, W>) -> Result<(), client::Error>
-
where
-
    R: io::Read,
-
    W: io::Write,
-
{
-
    // An empty request marks the (early) end of the interaction. Only relevant in stateful transports though.
-
    if transport.connection_persists_across_multiple_requests() {
-
        transport
-
            .request(client::WriteMode::Binary, client::MessageKind::Flush, false)?
-
            .into_read()?;
-
    }
-
    Ok(())
-
}
-

fn io_other(err: impl std::error::Error + Send + Sync + 'static) -> io::Error {
    io::Error::new(io::ErrorKind::Other, err)
}
modified radicle-fetch/src/transport/fetch.rs
@@ -1,27 +1,19 @@
-
use std::borrow::Cow;
use std::io;
-
use std::io::BufRead;
use std::path::PathBuf;
use std::sync::{atomic::AtomicBool, Arc};

-
use gix_features::progress::NestedProgress;
+
use gix_features::progress::{DynNestedProgress, NestedProgress};
use gix_pack as pack;
use gix_protocol::fetch;
-
use gix_protocol::fetch::{Delegate, DelegateBlocking};
+
use gix_protocol::fetch::negotiate::one_round::State;
use gix_protocol::handshake;
use gix_protocol::handshake::Ref;
-
use gix_protocol::ls_refs;
-
use gix_protocol::FetchConnection;
-
use gix_transport::bstr::BString;
-
use gix_transport::client;
-
use gix_transport::client::{ExtendedBufRead, MessageKind};
-
use gix_transport::Protocol;

-
use crate::git::packfile;
+
use crate::git::{oid, packfile};

-
use super::{agent_name, indicate_end_of_interaction, Connection, WantsHaves};
+
use super::{agent_name, Connection, WantsHaves};

-
pub type Error = gix_protocol::fetch::Error;
+
pub type Error = fetch::Error;

pub mod error {
    use std::io;
@@ -50,15 +42,11 @@ pub struct PackWriter {
impl PackWriter {
    /// Write the packfile read from `pack` to the `objects/pack`
    /// directory.
-
    pub fn write_pack<P>(
+
    pub fn write_pack(
        &self,
-
        mut pack: impl BufRead,
-
        mut progress: P,
-
    ) -> Result<pack::bundle::write::Outcome, error::PackWriter>
-
    where
-
        P: NestedProgress,
-
        P::SubProgress: 'static,
-
    {
+
        pack: &mut dyn std::io::BufRead,
+
        progress: &mut dyn DynNestedProgress,
+
    ) -> Result<pack::bundle::write::Outcome, error::PackWriter> {
        let options = pack::bundle::write::Options {
            // N.b. use all cores. Can make configurable if needed
            // later.
@@ -80,9 +68,9 @@ impl PackWriter {
        )?);
        let thickener = thickener.to_handle_arc();
        Ok(pack::Bundle::write_to_directory(
-
            &mut pack,
+
            pack,
            Some(&self.git_dir.join("objects").join("pack")),
-
            &mut progress,
+
            progress,
            &self.interrupt,
            Some(thickener),
            options,
@@ -92,10 +80,8 @@ impl PackWriter {

/// The fetch [`Delegate`] that negotiates the fetch with the
/// server-side.
-
pub struct Fetch {
+
pub struct Negotiate {
    wants_haves: WantsHaves,
-
    pack_writer: PackWriter,
-
    out: FetchOut,
}

/// The result of running a fetch via [`run`].
@@ -105,77 +91,50 @@ pub struct FetchOut {
    pub keepfile: Option<packfile::Keepfile>,
}

-
// FIXME: the delegate pattern will be removed in the near future and
-
// we should look at the fetch code being used in gix to see how we
-
// can migrate to the proper form of fetching.
-
impl<'a> Delegate for &'a mut Fetch {
-
    fn receive_pack(
+
impl fetch::Negotiate for Negotiate {
+
    fn mark_complete_and_common_ref(
        &mut self,
-
        input: impl io::BufRead,
-
        progress: impl NestedProgress + 'static,
-
        _refs: &[handshake::Ref],
-
        previous_response: &fetch::Response,
-
    ) -> io::Result<()> {
-
        self.out
-
            .refs
-
            .extend(previous_response.wanted_refs().iter().map(
-
                |fetch::response::WantedRef { id, path }| Ref::Direct {
-
                    full_ref_name: path.clone(),
-
                    object: *id,
-
                },
-
            ));
-
        let pack = self
-
            .pack_writer
-
            .write_pack(input, progress)
-
            .map_err(|err| io::Error::new(io::ErrorKind::Other, err))?;
-
        self.out.keepfile = pack.keep_path.as_ref().and_then(packfile::Keepfile::new);
-
        self.out.pack = Some(pack);
-
        Ok(())
+
    ) -> Result<fetch::negotiate::Action, fetch::negotiate::Error> {
+
        Ok(fetch::negotiate::Action::MustNegotiate {
+
            remote_ref_target_known: vec![],
+
        })
    }
-
}

-
impl<'a> DelegateBlocking for &'a mut Fetch {
-
    fn negotiate(
+
    fn add_wants(
        &mut self,
-
        _refs: &[handshake::Ref],
        arguments: &mut fetch::Arguments,
-
        _previous_response: Option<&fetch::Response>,
-
    ) -> io::Result<fetch::Action> {
-
        use crate::git::oid;
-

+
        _remote_ref_target_known: &[bool],
+
    ) -> bool {
+
        let mut has_want = false;
        for oid in &self.wants_haves.wants {
            arguments.want(oid::to_object_id(*oid));
+
            has_want = true;
        }
+
        has_want
+
    }

+
    /// We don't actually negotiate, just provides all our haves and wants, while telling the
+
    /// server to make the best of it and just send a pack.
+
    /// Real Git negotiation can be done with calls to [`fetch::negotiate::one_round()`], but that
+
    /// requires a [`fetch::RefMap`] which can be instantiated with refspecs.
+
    fn one_round(
+
        &mut self,
+
        _state: &mut State,
+
        arguments: &mut fetch::Arguments,
+
        _previous_response: Option<&fetch::Response>,
+
    ) -> Result<(fetch::negotiate::Round, bool), fetch::negotiate::Error> {
        for oid in &self.wants_haves.haves {
            arguments.have(oid::to_object_id(*oid));
        }

-
        // N.b. sends `done` packet
-
        Ok(fetch::Action::Cancel)
-
    }
-

-
    fn prepare_ls_refs(
-
        &mut self,
-
        _server: &client::Capabilities,
-
        _arguments: &mut Vec<BString>,
-
        _features: &mut Vec<(&str, Option<Cow<'_, str>>)>,
-
    ) -> io::Result<ls_refs::Action> {
-
        // N.b. we performed ls-refs before the fetch already.
-
        Ok(ls_refs::Action::Skip)
-
    }
-

-
    fn prepare_fetch(
-
        &mut self,
-
        _version: Protocol,
-
        _server: &client::Capabilities,
-
        _features: &mut Vec<(&str, Option<Cow<'_, str>>)>,
-
        _refs: &[handshake::Ref],
-
    ) -> io::Result<fetch::Action> {
-
        if self.wants_haves.wants.is_empty() {
-
            return Err(io::Error::new(io::ErrorKind::InvalidData, "empty fetch"));
-
        }
-
        Ok(fetch::Action::Continue)
+
        let round = fetch::negotiate::Round {
+
            haves_sent: self.wants_haves.haves.len(),
+
            in_vain: 0,
+
            haves_to_send: 0,
+
            previous_response_had_at_least_one_in_common: false,
+
        };
+
        let is_done = true;
+
        Ok((round, is_done))
    }
}

@@ -200,115 +159,59 @@ where
{
    log::trace!(target: "fetch", "Performing fetch");

-
    let mut delegate = Fetch {
-
        wants_haves,
-
        pack_writer,
-
        out: FetchOut {
-
            refs: Vec::new(),
-
            pack: None,
-
            keepfile: None,
-
        },
-
    };
-

-
    let handshake::Outcome {
-
        server_protocol_version: protocol,
-
        refs: _refs,
-
        capabilities,
-
    } = handshake;
-
    let agent = agent_name()?;
-
    let fetch = gix_protocol::Command::Fetch;
-

-
    let mut features = fetch.default_features(*protocol, capabilities);
-
    match (&mut delegate).prepare_fetch(*protocol, capabilities, &mut features, &[]) {
-
        Ok(fetch::Action::Continue) => {
-
            // FIXME: this is a private function in gitoxide
-
            // fetch.validate_argument_prefixes_or_panic(protocol, &capabilities, &[], &features)
-
        }
-
        // N.b. we always return Action::Continue
-
        Ok(fetch::Action::Cancel) => unreachable!(),
-
        Err(err) => {
-
            indicate_end_of_interaction(&mut conn)?;
-
            return Err(err.into());
-
        }
-
    }
-

-
    gix_protocol::fetch::Response::check_required_features(*protocol, &features)?;
-
    let sideband_all = features.iter().any(|(n, _)| *n == "sideband-all");
-
    features.push(("agent", Some(Cow::Owned(agent))));
-
    let mut args = fetch::Arguments::new(*protocol, features, false);
-

-
    let mut previous_response = None::<fetch::Response>;
-
    let mut round = 1;
-
    'negotiation: loop {
-
        progress.step();
-
        progress.set_name(format!("negotiate (round {round})"));
-
        round += 1;
-
        let action = (&mut delegate).negotiate(&[], &mut args, previous_response.as_ref())?;
-
        let mut reader = args.send(&mut conn, action == fetch::Action::Cancel)?;
-
        if sideband_all {
-
            setup_remote_progress(progress, &mut reader);
-
        }
-
        let response = fetch::Response::from_line_reader(*protocol, &mut reader, true, false)?;
-
        previous_response = if response.has_pack() {
-
            progress.step();
-
            if !sideband_all {
-
                setup_remote_progress(progress, &mut reader);
-
            }
-
            let timer = std::time::Instant::now();
-
            // TODO: remove delegate in favor of functional style to fix progress-hack,
-
            //       needed as it needs `'static`. As the top-level seems to pass `Discard`,
-
            //       there should be no repercussions right now.
-
            (&mut delegate).receive_pack(
-
                &mut reader,
-
                progress.add_child("receiving pack"),
-
                &[],
-
                &response,
-
            )?;
-
            log::trace!(target: "fetch", "Received pack ({}ms)", timer.elapsed().as_millis());
-
            assert_eq!(
-
                reader.stopped_at(),
-
                None,
-
                "packs are read without 'overshooting', hence it never encountered EOF"
-
            );
-
            // Consume anything that might still be left on the wire - this is 'EOF' most of the time,
-
            // but some tests have 'garbage' here as well.
-
            std::io::copy(&mut reader, &mut std::io::sink())?;
-
            assert_eq!(
-
                reader.stopped_at(),
-
                Some(MessageKind::Flush),
-
                "the flush packet was now consumed"
-
            );
-
            break 'negotiation;
-
        } else {
-
            match action {
-
                fetch::Action::Cancel => break 'negotiation,
-
                fetch::Action::Continue => Some(response),
-
            }
-
        }
-
    }
-
    if matches!(protocol, Protocol::V2)
-
        && matches!(conn.mode, FetchConnection::TerminateOnSuccessfulCompletion)
-
    {
-
        log::trace!(target: "fetch", "Indicating end of interaction");
-
        indicate_end_of_interaction(&mut conn)?;
+
    if wants_haves.wants.is_empty() {
+
        return Err(Error::ReadRemainingBytes(io::Error::new(
+
            io::ErrorKind::InvalidData,
+
            "empty fetch",
+
        )));
    }
-

-
    log::trace!(target: "fetch", "fetched refs: {:?}", delegate.out.refs);
-
    Ok(delegate.out)
-
}
-

-
fn setup_remote_progress<'a, P>(
-
    progress: &mut P,
-
    reader: &mut Box<dyn gix_transport::client::ExtendedBufRead<'a> + Unpin + 'a>,
-
) where
-
    P: NestedProgress,
-
    P::SubProgress: 'static,
-
{
-
    reader.set_progress_handler(Some(Box::new({
-
        let mut remote_progress = progress.add_child("remote");
-
        move |is_err: bool, data: &[u8]| {
-
            gix_protocol::RemoteProgress::translate_to_progress(is_err, data, &mut remote_progress);
-
            gix_transport::packetline::read::ProgressAction::Continue
-
        }
-
    }) as gix_transport::client::HandleProgress<'a>));
+
    let mut out = FetchOut {
+
        refs: Vec::new(),
+
        pack: None,
+
        keepfile: None,
+
    };
+
    let mut negotiate = Negotiate { wants_haves };
+
    let agent = agent_name().map_err(Error::ReadRemainingBytes)?;
+

+
    let mut pack_out = None;
+
    let mut handshake = handshake.clone();
+
    let fetch_out = gix_protocol::fetch(
+
        &mut negotiate,
+
        |read_pack, progress, _should_interrupt| -> Result<_, error::PackWriter> {
+
            let res = pack_writer.write_pack(read_pack, progress)?;
+
            pack_out = Some(res);
+
            Ok(true)
+
        },
+
        progress,
+
        &pack_writer.interrupt,
+
        fetch::Context {
+
            handshake: &mut handshake,
+
            transport: &mut conn,
+
            user_agent: ("agent", Some(agent.into())),
+
            trace_packetlines: false,
+
        },
+
        fetch::Options {
+
            shallow_file: "no shallow file required as we reject shallow remotes (and we aren't shallow ourselves)".into(),
+
            reject_shallow_remote: true,
+
            shallow: &fetch::Shallow::NoChange,
+
            tags: fetch::Tags::None,
+
        },
+
    )?.expect("we always get a pack");
+

+
    out.refs
+
        .extend(fetch_out.last_response.wanted_refs().iter().map(
+
            |fetch::response::WantedRef { id, path }| Ref::Direct {
+
                full_ref_name: path.clone(),
+
                object: *id,
+
            },
+
        ));
+
    let pack_out = pack_out.expect("we always get a pack");
+
    out.keepfile = pack_out
+
        .keep_path
+
        .as_ref()
+
        .and_then(packfile::Keepfile::new);
+
    out.pack = Some(pack_out);
+

+
    log::trace!(target: "fetch", "fetched refs: {:?}", out.refs);
+
    Ok(out)
}
modified radicle-fetch/src/transport/ls_refs.rs
@@ -1,16 +1,13 @@
use std::borrow::Cow;
-
use std::io::{self, BufRead};
+
use std::io;

-
use bstr::ByteSlice;
use gix_features::progress::Progress;
-
use gix_protocol::fetch::{self, Delegate, DelegateBlocking};
use gix_protocol::handshake::{self, Ref};
+
use gix_protocol::ls_refs;
use gix_protocol::transport::Protocol;
-
use gix_protocol::{ls_refs, Command};
use gix_transport::bstr::{BString, ByteVec};
-
use gix_transport::client::{self, TransportV2Ext};

-
use super::{agent_name, indicate_end_of_interaction, Connection};
+
use super::{agent_name, Connection};

/// Configuration for running an ls-refs process.
///
@@ -19,84 +16,10 @@ pub struct Config {
    /// The repository name, i.e. `/<rid>`.
    #[allow(dead_code)]
    pub repo: BString,
-
    /// Extra parameters to pass to the ls-refs process.
-
    pub extra_params: Vec<(String, Option<String>)>,
    /// Ref prefixes for filtering the output of the ls-refs process.
    pub prefixes: Vec<BString>,
}

-
/// The Gitoxide delegate for running the ls-refs process.
-
struct LsRefs {
-
    /// Configuration for the ls-refs process.
-
    config: Config,
-
    /// The resulting references returned by the ls-refs process.
-
    refs: Vec<Ref>,
-
}
-

-
impl LsRefs {
-
    fn new(config: Config) -> Self {
-
        Self {
-
            config,
-
            refs: Vec::new(),
-
        }
-
    }
-
}
-

-
// FIXME: the delegate pattern will be removed in the near future and
-
// we should look at the fetch code being used in gix to see how we
-
// can migrate to the proper form of fetching.
-
impl DelegateBlocking for LsRefs {
-
    fn handshake_extra_parameters(&self) -> Vec<(String, Option<String>)> {
-
        self.config.extra_params.clone()
-
    }
-

-
    fn prepare_ls_refs(
-
        &mut self,
-
        _caps: &client::Capabilities,
-
        args: &mut Vec<BString>,
-
        _: &mut Vec<(&str, Option<Cow<'_, str>>)>,
-
    ) -> io::Result<ls_refs::Action> {
-
        for prefix in &self.config.prefixes {
-
            let mut arg = BString::from("ref-prefix ");
-
            arg.push_str(prefix);
-
            args.push(arg)
-
        }
-
        Ok(ls_refs::Action::Continue)
-
    }
-

-
    fn prepare_fetch(
-
        &mut self,
-
        _: Protocol,
-
        _: &client::Capabilities,
-
        _: &mut Vec<(&str, Option<Cow<'_, str>>)>,
-
        refs: &[Ref],
-
    ) -> io::Result<fetch::Action> {
-
        self.refs.extend_from_slice(refs);
-
        Ok(fetch::Action::Cancel)
-
    }
-

-
    fn negotiate(
-
        &mut self,
-
        _: &[Ref],
-
        _: &mut fetch::Arguments,
-
        _: Option<&fetch::Response>,
-
    ) -> io::Result<fetch::Action> {
-
        unreachable!("`negotiate` called even though no `fetch` command was sent")
-
    }
-
}
-

-
impl Delegate for LsRefs {
-
    fn receive_pack(
-
        &mut self,
-
        _: impl BufRead,
-
        _: impl Progress,
-
        _: &[Ref],
-
        _: &fetch::Response,
-
    ) -> io::Result<()> {
-
        unreachable!("`receive_pack` called even though no `fetch` command was sent")
-
    }
-
}
-

/// Run the ls-refs process using the provided `config`.
///
/// It is expected that the `handshake` was run outside of this
@@ -116,7 +39,6 @@ where
    W: io::Write,
{
    log::trace!(target: "fetch", "Performing ls-refs: {:?}", config.prefixes);
-
    let mut delegate = LsRefs::new(config);
    let handshake::Outcome {
        server_protocol_version: protocol,
        capabilities,
@@ -130,48 +52,21 @@ where
        )));
    }

-
    let ls = Command::LsRefs;
-
    let mut features = ls.default_features(Protocol::V2, capabilities);
-
    // N.b. copied from gitoxide
-
    let mut args = vec![
-
        b"symrefs".as_bstr().to_owned(),
-
        b"peel".as_bstr().to_owned(),
-
    ];
-
    if capabilities
-
        .capability("ls-refs")
-
        .and_then(|cap| cap.supports("unborn"))
-
        .unwrap_or_default()
-
    {
-
        args.push("unborn".into());
-
    }
-
    let refs = match delegate.prepare_ls_refs(capabilities, &mut args, &mut features) {
-
        Ok(ls_refs::Action::Skip) => Vec::new(),
-
        Ok(ls_refs::Action::Continue) => {
-
            // FIXME: this is a private function
-
            // ls.validate_argument_prefixes_or_panic(Protocol::V2, capabilities, &args, &features);
-

-
            let agent = agent_name()?;
-
            features.push(("agent", Some(Cow::Owned(agent))));
-

-
            progress.step();
-
            progress.set_name("list refs".into());
-
            let mut remote_refs = conn.invoke(
-
                ls.as_str(),
-
                features.clone().into_iter(),
-
                if args.is_empty() {
-
                    None
-
                } else {
-
                    Some(args.into_iter())
-
                },
-
                false,
-
            )?;
-
            handshake::refs::from_v2_refs(&mut remote_refs)?
-
        }
-
        Err(err) => {
-
            indicate_end_of_interaction(&mut conn)?;
-
            return Err(err.into());
-
        }
-
    };
+
    let refs = gix_protocol::ls_refs(
+
        &mut conn,
+
        capabilities,
+
        |_caps, args, features| {
+
            for prefix in &config.prefixes {
+
                let mut arg = BString::from("ref-prefix ");
+
                arg.push_str(prefix);
+
                args.push(arg)
+
            }
+
            features.push(("agent", Some(Cow::Owned(agent_name()?))));
+
            Ok(gix_protocol::ls_refs::Action::Continue)
+
        },
+
        progress,
+
        false, /* trace packetlines */
+
    )?;

    Ok(refs)
}