Radish alpha
r
rad:z4D5UCArafTzTQpDZNQRuqswh3ury
Radicle desktop app
Radicle
Git
Update heartwood dependencies
Merged lorenz opened 1 month ago

The main change in this patch is to pull the dependencies in the heartwood workspace up to more recent versions, such as radicle from 0.16.1 to 0.22. Since radicle does not depend on localtime anymore, but on radicle_localtime, this dependency is changed.

Also, radicle-job and radicle-surf are updated.

Further, since radicle now more aggressively hides git2, dependency on git2 was added to re-gain access to the symbols that are no longer re-exported by radicle.

The commit that updates dependencies obviously introduces breakage, so the series of commits up to the head of the patch do not actually build. However, I opted to keep them separate for posterity. This way, it will be easier to understand what changed during this update and why.

The patch also contains an update of Nix files as well, but they are minor, and directly related to the update.

Since some dependencies cannot be built by Rust 1.94, the rust-toolchain.toml file was also updated to indicate the new suggested version.

29 files changed +566 -233 33b5cd35 cf40e86a
modified Cargo.lock
@@ -160,12 +160,6 @@ dependencies = [
]

[[package]]
-
name = "android-tzdata"
-
version = "0.1.1"
-
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0"
-

-
[[package]]
name = "android_log-sys"
version = "0.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -830,15 +824,14 @@ dependencies = [

[[package]]
name = "chrono"
-
version = "0.4.41"
+
version = "0.4.44"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "c469d952047f47f91b68d1cba3f10d63c11d73e4636f24f08daf0278abf01c4d"
+
checksum = "c673075a2e0e5f4a1dde27ce9dee1ea4558c7ffe648f576438a20ca1d2acc4b0"
dependencies = [
-
 "android-tzdata",
 "iana-time-zone",
 "num-traits",
 "serde",
-
 "windows-link",
+
 "windows-link 0.2.1",
]

[[package]]
@@ -1197,6 +1190,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5c297a1c74b71ae29df00c3e22dd9534821d60eb9af5a0192823fa2acea70c2a"

[[package]]
+
name = "defer-heavy"
+
version = "0.1.0"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "5053691e3e6c0e5979cfb55503b7eb4b06531897b5c15b0f617110096b05a0e1"
+

+
[[package]]
name = "deno_ast"
version = "0.38.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1646,6 +1645,12 @@ dependencies = [
]

[[package]]
+
name = "fast-glob"
+
version = "0.3.3"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "3afcf4effa2c44390b9912544582d5af29e10dc4c816c5dbebf748e1c7416faa"
+

+
[[package]]
name = "fastrand"
version = "2.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -2084,9 +2089,9 @@ dependencies = [

[[package]]
name = "git-ref-format"
-
version = "0.3.1"
+
version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "7428e0d6e549a9a613d6f019b839a0f5142c331295b79e119ca8f4faac145da1"
+
checksum = "ed6913a77cee9e231cab93577c9a5eea84a1344ab39294d91dc075b3c24499d0"
dependencies = [
 "git-ref-format-core",
 "git-ref-format-macro",
@@ -2094,9 +2099,9 @@ dependencies = [

[[package]]
name = "git-ref-format-core"
-
version = "0.3.1"
+
version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "bbaeb9672a55e9e32cb6d3ef781e7526b25ab97d499fae71615649340b143424"
+
checksum = "1955ef3abddd586f24c834d28f959d610157ab5cb71f2200911932a0018d0364"
dependencies = [
 "serde",
 "thiserror 1.0.69",
@@ -2104,21 +2109,21 @@ dependencies = [

[[package]]
name = "git-ref-format-macro"
-
version = "0.3.1"
+
version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "3b6ca5353accc201f6324dff744ba4660099546d4daf187ba868f07562e36ca4"
+
checksum = "4e730f09c82961c28f5465b83da0aa5c2716156ce57da33a1fa51bbd560aa5f7"
dependencies = [
 "git-ref-format-core",
-
 "proc-macro-error",
+
 "proc-macro-error2",
 "quote",
 "syn 2.0.101",
]

[[package]]
name = "git2"
-
version = "0.19.0"
+
version = "0.20.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "b903b73e45dc0c6c596f2d37eccece7c1c8bb6e4407b001096387c63d0d93724"
+
checksum = "7b88256088d75a56f8ecfa070513a775dd9107f6530ef14919dac831af9cfe2b"
dependencies = [
 "bitflags 2.9.0",
 "libc",
@@ -2432,7 +2437,7 @@ dependencies = [
 "js-sys",
 "log",
 "wasm-bindgen",
-
 "windows-core",
+
 "windows-core 0.61.0",
]

[[package]]
@@ -2849,9 +2854,9 @@ checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa"

[[package]]
name = "libgit2-sys"
-
version = "0.17.0+1.8.1"
+
version = "0.18.3+1.9.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "10472326a8a6477c3c20a64547b0059e4b0d086869eee31e6d7da728a8eb7224"
+
checksum = "c9b3acc4b91781bb0b3386669d325163746af5f6e4f73e6d2d630e09a35f3487"
dependencies = [
 "cc",
 "libc",
@@ -2917,15 +2922,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956"

[[package]]
-
name = "localtime"
-
version = "1.3.1"
-
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "016a009e0bb8ba6e3229fb74bf11a8fe6ef24542cc6ef35ef38863ac13f96d87"
-
dependencies = [
-
 "serde",
-
]
-

-
[[package]]
name = "lock_api"
version = "0.4.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -3965,6 +3961,28 @@ dependencies = [
]

[[package]]
+
name = "proc-macro-error-attr2"
+
version = "2.0.0"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "96de42df36bb9bba5542fe9f1a054b8cc87e172759a1868aa05c1f3acc89dfc5"
+
dependencies = [
+
 "proc-macro2",
+
 "quote",
+
]
+

+
[[package]]
+
name = "proc-macro-error2"
+
version = "2.0.1"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "11ec05c52be0a07b08061f7dd003e7d7092e0472bc731b4af7bb1ef876109802"
+
dependencies = [
+
 "proc-macro-error-attr2",
+
 "proc-macro2",
+
 "quote",
+
 "syn 2.0.101",
+
]
+

+
[[package]]
name = "proc-macro-hack"
version = "0.5.20+deprecated"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -4052,26 +4070,32 @@ checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5"

[[package]]
name = "radicle"
-
version = "0.16.1"
+
version = "0.22.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "d5fe953b25a8f5c24baf1019f746912e7453746d617a1af04cb347904d241005"
+
checksum = "31fcfcac7b87b1a3677dccae9979046b949fb529d3061214c55b82d643c3b39a"
dependencies = [
 "amplify",
 "base64 0.21.7",
 "bytesize",
 "crossbeam-channel",
 "cyphernet",
+
 "dunce",
+
 "fast-glob",
 "fastrand",
 "git2",
+
 "indexmap 2.9.0",
 "libc",
-
 "localtime",
 "log",
 "multibase",
 "nonempty 0.9.0",
 "qcheck",
 "radicle-cob",
+
 "radicle-core",
 "radicle-crypto",
-
 "radicle-git-ext",
+
 "radicle-git-metadata 0.2.0",
+
 "radicle-git-ref-format",
+
 "radicle-localtime",
+
 "radicle-oid",
 "radicle-ssh",
 "serde",
 "serde-untagged",
@@ -4079,49 +4103,68 @@ dependencies = [
 "siphasher 1.0.1",
 "sqlite",
 "tempfile",
-
 "thiserror 1.0.69",
+
 "thiserror 2.0.12",
+
 "uds_windows",
 "unicode-normalization",
]

[[package]]
name = "radicle-cob"
-
version = "0.14.0"
+
version = "0.19.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "6e9c90efa7a3febd01d33ed2e72cb12296c971ce03efa243d11c01520fcc1be8"
+
checksum = "cd49b584b0a61cba52cfd8ec873bb5f3cbc50763d020a4c333aeffa95a5c839e"
dependencies = [
 "fastrand",
+
 "git-ref-format-core",
 "git2",
 "log",
 "nonempty 0.9.0",
-
 "once_cell",
 "radicle-crypto",
 "radicle-dag",
-
 "radicle-git-ext",
+
 "radicle-git-metadata 0.1.0",
+
 "radicle-oid",
 "serde",
 "serde_json",
 "signature 2.2.0",
-
 "thiserror 1.0.69",
+
 "thiserror 2.0.12",
+
]
+

+
[[package]]
+
name = "radicle-core"
+
version = "0.2.0"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "617b55b262b946470a355052a6d72c7f8efc724b8d8068021234cda74df7dd30"
+
dependencies = [
+
 "git2",
+
 "multibase",
+
 "qcheck",
+
 "radicle-crypto",
+
 "radicle-oid",
+
 "schemars 1.2.1",
+
 "serde",
+
 "sqlite",
+
 "thiserror 2.0.12",
]

[[package]]
name = "radicle-crypto"
-
version = "0.12.0"
+
version = "0.16.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "d16d9e1403a6c3073dce14f3ed893f430bb67d7af6a07cc7fe4b81907025ba22"
+
checksum = "f77cf406d3e448de958e3a821bb09612bb2f97ac1dbb2ee314b59264cde8281d"
dependencies = [
 "amplify",
 "cyphernet",
 "ec25519",
 "fastrand",
+
 "git-ref-format-core",
 "multibase",
 "qcheck",
-
 "radicle-git-ext",
 "radicle-ssh",
 "serde",
 "signature 2.2.0",
 "sqlite",
 "ssh-key",
-
 "thiserror 1.0.69",
+
 "thiserror 2.0.12",
 "zeroize",
]

@@ -4136,9 +4179,9 @@ dependencies = [

[[package]]
name = "radicle-git-ext"
-
version = "0.8.1"
+
version = "0.12.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "4b78c26e67d1712ad5a0c602ae3b236609461372ac04e200bda359fe4a1c6650"
+
checksum = "db68f47aaf6b8352a733da684f7e24f89aeb03131598628f147ff1bcc633670d"
dependencies = [
 "git-ref-format",
 "git2",
@@ -4149,11 +4192,39 @@ dependencies = [
]

[[package]]
-
name = "radicle-job"
+
name = "radicle-git-metadata"
+
version = "0.1.0"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "522d7fa07dfe61981b5d96e9aeb2b7fb2f4a8d5804638e928eaedb33e423eccb"
+
dependencies = [
+
 "thiserror 2.0.12",
+
]
+

+
[[package]]
+
name = "radicle-git-metadata"
version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "70b2de1bb748a1b587f759137058c4ae917753652b5fb4ae3baee991a7b31a68"
+
checksum = "db7817cae00f00f0e9a804b08e32d7846e97ae66fff8114d5a0d8c848de80ad5"
dependencies = [
+
 "thiserror 2.0.12",
+
]
+

+
[[package]]
+
name = "radicle-git-ref-format"
+
version = "0.1.0"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "7fe7a4a8137c193d15d05a6d1eb9ef79649b52e1f659161df69ebc385bbed55c"
+
dependencies = [
+
 "git-ref-format-core",
+
]
+

+
[[package]]
+
name = "radicle-job"
+
version = "0.5.2"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "16629f31639215409091e4e1099af070db245e773c76680b234c275b329efe42"
+
dependencies = [
+
 "chrono",
 "clap",
 "indexmap 2.9.0",
 "nonempty 0.11.0",
@@ -4168,28 +4239,46 @@ dependencies = [
]

[[package]]
+
name = "radicle-localtime"
+
version = "0.1.0"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "c5c36714fd32dc9421f8ed3edf0d1c1a4aa3b5210fddf8eaef40ea90c88fdddd"
+
dependencies = [
+
 "serde",
+
]
+

+
[[package]]
+
name = "radicle-oid"
+
version = "0.1.0"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "d95c486f589d4f5ef7bd8fce56419854d90cc63a8bbcebe021e0a4f4cca75ac9"
+
dependencies = [
+
 "git2",
+
 "serde",
+
]
+

+
[[package]]
name = "radicle-ssh"
-
version = "0.9.0"
+
version = "0.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "fbee758010fb64482be4b18591fbeb3cbc15b16450d143edf4edb5484c7366c6"
+
checksum = "216e9e1259d8c857cdb38b2f832fb117e8e26478f110b9a2690bca20b87ec9c5"
dependencies = [
-
 "byteorder",
-
 "log",
 "thiserror 1.0.69",
+
 "winpipe",
 "zeroize",
]

[[package]]
name = "radicle-std-ext"
-
version = "0.1.1"
+
version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "5310e7a04506b6ce92dc9c47b26bd24c1c680937a3dcd13cd20847f89dbda32a"
+
checksum = "fb935931bdd2a2966f3b584f3031d9d54ec0713ddbc563a0193d54e62a88ec73"

[[package]]
name = "radicle-surf"
-
version = "0.22.1"
+
version = "0.27.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "0bf6aff57520e8e7200bf7826ddc5ccf8d4612dd880497a4f256c3d272eeb805"
+
checksum = "e2c6a29eac2e55a6d0632c8faeb3cbe91afb1e07be60d157a27fdadb8cc4c508"
dependencies = [
 "anyhow",
 "base64 0.21.7",
@@ -4212,10 +4301,10 @@ dependencies = [
 "anyhow",
 "base64 0.22.1",
 "either",
+
 "git2",
 "infer",
 "log",
 "radicle",
-
 "radicle-job",
 "radicle-surf",
 "radicle-types",
 "serde",
@@ -4241,12 +4330,13 @@ dependencies = [
 "anyhow",
 "axum",
 "base64 0.22.1",
+
 "git2",
 "infer",
-
 "localtime",
 "log",
 "mime-infer",
 "radicle",
 "radicle-job",
+
 "radicle-localtime",
 "radicle-surf",
 "serde",
 "serde_json",
@@ -4422,6 +4512,26 @@ dependencies = [
]

[[package]]
+
name = "ref-cast"
+
version = "1.0.25"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "f354300ae66f76f1c85c5f84693f0ce81d747e2c3f21a45fef496d89c960bf7d"
+
dependencies = [
+
 "ref-cast-impl",
+
]
+

+
[[package]]
+
name = "ref-cast-impl"
+
version = "1.0.25"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da"
+
dependencies = [
+
 "proc-macro2",
+
 "quote",
+
 "syn 2.0.101",
+
]
+

+
[[package]]
name = "regex"
version = "1.11.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -4674,7 +4784,7 @@ checksum = "3fbf2ae1b8bc8e02df939598064d22402220cd5bbcca1c76f7d6a310974d5615"
dependencies = [
 "dyn-clone",
 "indexmap 1.9.3",
-
 "schemars_derive",
+
 "schemars_derive 0.8.22",
 "serde",
 "serde_json",
 "url",
@@ -4682,6 +4792,19 @@ dependencies = [
]

[[package]]
+
name = "schemars"
+
version = "1.2.1"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "a2b42f36aa1cd011945615b92222f6bf73c599a102a300334cd7f8dbeec726cc"
+
dependencies = [
+
 "dyn-clone",
+
 "ref-cast",
+
 "schemars_derive 1.2.1",
+
 "serde",
+
 "serde_json",
+
]
+

+
[[package]]
name = "schemars_derive"
version = "0.8.22"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -4694,6 +4817,18 @@ dependencies = [
]

[[package]]
+
name = "schemars_derive"
+
version = "1.2.1"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "7d115b50f4aaeea07e79c1912f645c7513d81715d0420f8bc77a18c6260b307f"
+
dependencies = [
+
 "proc-macro2",
+
 "quote",
+
 "serde_derive_internals",
+
 "syn 2.0.101",
+
]
+

+
[[package]]
name = "scoped-tls"
version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -5111,19 +5246,18 @@ dependencies = [

[[package]]
name = "sqlite"
-
version = "0.32.0"
+
version = "0.37.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "03801c10193857d6a4a71ec46cee198a15cbc659622aabe1db0d0bdbefbcf8e6"
+
checksum = "f66e9c01a11936154f3910dbba732c01f8b591543bc4d6672bddee79fd9c4783"
dependencies = [
-
 "libc",
 "sqlite3-sys",
]

[[package]]
name = "sqlite3-src"
-
version = "0.5.1"
+
version = "0.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "bfc95a51a1ee38839599371685b9d4a926abb51791f0bc3bf8c3bb7867e6e454"
+
checksum = "e5b6d3c860886b0a33e69e421796a5f4a27f23597a182c2450f6d7ace5103120"
dependencies = [
 "cc",
 "pkg-config",
@@ -5131,11 +5265,10 @@ dependencies = [

[[package]]
name = "sqlite3-sys"
-
version = "0.15.2"
+
version = "0.18.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "f2752c669433e40ebb08fde824146f50d9628aa0b66a3b7fc6be34db82a8063b"
+
checksum = "a7781d97adc13a1d5081127a9ee29afad8427f3757bd984daf814d8265267039"
dependencies = [
-
 "libc",
 "sqlite3-src",
]

@@ -5424,6 +5557,12 @@ dependencies = [
]

[[package]]
+
name = "sync-ptr"
+
version = "0.1.4"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "2b115b4cc742d11625f50e0e48ab15baf6fa548c2ec33a8d4113711886316a4f"
+

+
[[package]]
name = "sync_wrapper"
version = "1.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -5489,8 +5628,8 @@ dependencies = [
 "tao-macros",
 "unicode-segmentation",
 "url",
-
 "windows",
-
 "windows-core",
+
 "windows 0.61.1",
+
 "windows-core 0.61.0",
 "windows-version",
 "x11-dl",
]
@@ -5578,7 +5717,7 @@ dependencies = [
 "webkit2gtk",
 "webview2-com",
 "window-vibrancy",
-
 "windows",
+
 "windows 0.61.1",
]

[[package]]
@@ -5593,7 +5732,7 @@ dependencies = [
 "glob",
 "heck 0.5.0",
 "json-patch",
-
 "schemars",
+
 "schemars 0.8.22",
 "semver",
 "serde",
 "serde_json",
@@ -5654,7 +5793,7 @@ dependencies = [
 "anyhow",
 "glob",
 "plist",
-
 "schemars",
+
 "schemars 0.8.22",
 "serde",
 "serde_json",
 "tauri-utils",
@@ -5705,7 +5844,7 @@ dependencies = [
 "dunce",
 "glob",
 "percent-encoding",
-
 "schemars",
+
 "schemars 0.8.22",
 "serde",
 "serde_json",
 "serde_repr",
@@ -5751,7 +5890,7 @@ dependencies = [
 "open",
 "os_pipe",
 "regex",
-
 "schemars",
+
 "schemars 0.8.22",
 "serde",
 "serde_json",
 "shared_child",
@@ -5795,7 +5934,7 @@ dependencies = [
 "tauri-utils",
 "thiserror 2.0.12",
 "url",
-
 "windows",
+
 "windows 0.61.1",
]

[[package]]
@@ -5821,7 +5960,7 @@ dependencies = [
 "url",
 "webkit2gtk",
 "webview2-com",
-
 "windows",
+
 "windows 0.61.1",
 "wry",
]

@@ -5850,7 +5989,7 @@ dependencies = [
 "proc-macro2",
 "quote",
 "regex",
-
 "schemars",
+
 "schemars 0.8.22",
 "semver",
 "serde",
 "serde-untagged",
@@ -6996,10 +7135,10 @@ checksum = "b542b5cfbd9618c46c2784e4d41ba218c336ac70d44c55e47b251033e7d85601"
dependencies = [
 "webview2-com-macros",
 "webview2-com-sys",
-
 "windows",
-
 "windows-core",
-
 "windows-implement",
-
 "windows-interface",
+
 "windows 0.61.1",
+
 "windows-core 0.61.0",
+
 "windows-implement 0.60.0",
+
 "windows-interface 0.59.1",
]

[[package]]
@@ -7020,8 +7159,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8ae2d11c4a686e4409659d7891791254cf9286d3cfe0eef54df1523533d22295"
dependencies = [
 "thiserror 2.0.12",
-
 "windows",
-
 "windows-core",
+
 "windows 0.61.1",
+
 "windows-core 0.61.0",
]

[[package]]
@@ -7078,14 +7217,24 @@ dependencies = [

[[package]]
name = "windows"
+
version = "0.58.0"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "dd04d41d93c4992d421894c18c8b43496aa748dd4c081bac0dc93eb0489272b6"
+
dependencies = [
+
 "windows-core 0.58.0",
+
 "windows-targets 0.52.6",
+
]
+

+
[[package]]
+
name = "windows"
version = "0.61.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c5ee8f3d025738cb02bad7868bbb5f8a6327501e870bf51f1b455b0a2454a419"
dependencies = [
 "windows-collections",
-
 "windows-core",
+
 "windows-core 0.61.0",
 "windows-future",
-
 "windows-link",
+
 "windows-link 0.1.1",
 "windows-numerics",
]

@@ -7095,7 +7244,20 @@ version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3beeceb5e5cfd9eb1d76b381630e82c4241ccd0d27f1a39ed41b2760b255c5e8"
dependencies = [
-
 "windows-core",
+
 "windows-core 0.61.0",
+
]
+

+
[[package]]
+
name = "windows-core"
+
version = "0.58.0"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "6ba6d44ec8c2591c134257ce647b7ea6b20335bf6379a27dac5f1641fcf59f99"
+
dependencies = [
+
 "windows-implement 0.58.0",
+
 "windows-interface 0.58.0",
+
 "windows-result 0.2.0",
+
 "windows-strings 0.1.0",
+
 "windows-targets 0.52.6",
]

[[package]]
@@ -7104,10 +7266,10 @@ version = "0.61.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4763c1de310c86d75a878046489e2e5ba02c649d185f21c67d4cf8a56d098980"
dependencies = [
-
 "windows-implement",
-
 "windows-interface",
-
 "windows-link",
-
 "windows-result",
+
 "windows-implement 0.60.0",
+
 "windows-interface 0.59.1",
+
 "windows-link 0.1.1",
+
 "windows-result 0.3.2",
 "windows-strings 0.4.0",
]

@@ -7117,8 +7279,19 @@ version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7a1d6bbefcb7b60acd19828e1bc965da6fcf18a7e39490c5f8be71e54a19ba32"
dependencies = [
-
 "windows-core",
-
 "windows-link",
+
 "windows-core 0.61.0",
+
 "windows-link 0.1.1",
+
]
+

+
[[package]]
+
name = "windows-implement"
+
version = "0.58.0"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "2bbd5b46c938e506ecbce286b6628a02171d56153ba733b6c741fc627ec9579b"
+
dependencies = [
+
 "proc-macro2",
+
 "quote",
+
 "syn 2.0.101",
]

[[package]]
@@ -7134,6 +7307,17 @@ dependencies = [

[[package]]
name = "windows-interface"
+
version = "0.58.0"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "053c4c462dc91d3b1504c6fe5a726dd15e216ba718e84a0e46a88fbe5ded3515"
+
dependencies = [
+
 "proc-macro2",
+
 "quote",
+
 "syn 2.0.101",
+
]
+

+
[[package]]
+
name = "windows-interface"
version = "0.59.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8"
@@ -7150,13 +7334,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "76840935b766e1b0a05c0066835fb9ec80071d4c09a16f6bd5f7e655e3c14c38"

[[package]]
+
name = "windows-link"
+
version = "0.2.1"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5"
+

+
[[package]]
name = "windows-numerics"
version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9150af68066c4c5c07ddc0ce30421554771e528bde427614c61038bc2c92c2b1"
dependencies = [
-
 "windows-core",
-
 "windows-link",
+
 "windows-core 0.61.0",
+
 "windows-link 0.1.1",
]

[[package]]
@@ -7165,18 +7355,37 @@ version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4286ad90ddb45071efd1a66dfa43eb02dd0dfbae1545ad6cc3c51cf34d7e8ba3"
dependencies = [
-
 "windows-result",
+
 "windows-result 0.3.2",
 "windows-strings 0.3.1",
 "windows-targets 0.53.0",
]

[[package]]
name = "windows-result"
+
version = "0.2.0"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e"
+
dependencies = [
+
 "windows-targets 0.52.6",
+
]
+

+
[[package]]
+
name = "windows-result"
version = "0.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c64fd11a4fd95df68efcfee5f44a294fe71b8bc6a91993e2791938abcc712252"
dependencies = [
-
 "windows-link",
+
 "windows-link 0.1.1",
+
]
+

+
[[package]]
+
name = "windows-strings"
+
version = "0.1.0"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10"
+
dependencies = [
+
 "windows-result 0.2.0",
+
 "windows-targets 0.52.6",
]

[[package]]
@@ -7185,7 +7394,7 @@ version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "87fa48cc5d406560701792be122a10132491cff9d0aeb23583cc2dcafc847319"
dependencies = [
-
 "windows-link",
+
 "windows-link 0.1.1",
]

[[package]]
@@ -7194,7 +7403,7 @@ version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7a2ba9642430ee452d5a7aa78d72907ebe8cfda358e8cb7918a2050581322f97"
dependencies = [
-
 "windows-link",
+
 "windows-link 0.1.1",
]

[[package]]
@@ -7301,7 +7510,7 @@ version = "0.1.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e04a5c6627e310a23ad2358483286c7df260c964eb2d003d8efd6d0f4e79265c"
dependencies = [
-
 "windows-link",
+
 "windows-link 0.1.1",
]

[[package]]
@@ -7503,6 +7712,19 @@ dependencies = [
]

[[package]]
+
name = "winpipe"
+
version = "0.1.1"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "1ccf671d62d1bd0c913d9059e69bb4a6b51f7a4c899ab83c62d921e35f206053"
+
dependencies = [
+
 "defer-heavy",
+
 "log",
+
 "rand 0.8.5",
+
 "sync-ptr",
+
 "windows 0.58.0",
+
]
+

+
[[package]]
name = "winreg"
version = "0.52.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -7584,8 +7806,8 @@ dependencies = [
 "webkit2gtk",
 "webkit2gtk-sys",
 "webview2-com",
-
 "windows",
-
 "windows-core",
+
 "windows 0.61.1",
+
 "windows-core 0.61.0",
 "windows-version",
 "x11-dl",
]
modified crates/radicle-tauri/Cargo.toml
@@ -18,12 +18,12 @@ tauri-build = { version = "2.2.0", features = ["isolation"] }
anyhow = { version = "1.0.90" }
base64 = { version = "0.22.1" }
either = { version = "1.15" }
+
git2 = { version = "0.20.4", default-features = false, features = ["vendored-libgit2"] }
infer = { version = "0.19.0" }
log = { version = "0.4.22" }
-
radicle = { version = "0.16.1" }
-
radicle-job = { version = "0.2.0" }
+
radicle = { version = "0.22" }
radicle-types = { version = "0.1.0", path = "../radicle-types" }
-
radicle-surf = { version = "0.22.1", features = ["serde"] }
+
radicle-surf = { version = "0.27.0", features = ["serde"] }
serde = { version = "1.0.0", features = ["derive"] }
serde_json = { version = "1.0.0" }
tauri = { version = "2.5.0", features = ["isolation"] }
modified crates/radicle-tauri/src/commands/repo.rs
@@ -98,9 +98,9 @@ pub(crate) async fn create_repo(
    let profile = &ctx.profile;
    let storage = &profile.storage;
    let signer = ctx.profile.signer()?;
-
    let config = radicle::git::raw::Config::open_default()?;
+
    let config = git2::Config::open_default()?;
    // SAFETY: "master" is always a valid RefString
-
    let default_branch = git::RefString::try_from(
+
    let default_branch = git::fmt::RefString::try_from(
        config
            .get_string("init.defaultBranch")
            .unwrap_or("master".to_owned()),
modified crates/radicle-types/Cargo.toml
@@ -10,16 +10,17 @@ doctest = false
anyhow = { version = "1.0.90" }
axum = { version = "0.8.1", default-features = false, features = ["json"] }
base64 = { version = "0.22.1" }
-
localtime = { version = "1.3.1" }
+
git2 = { version = "0.20.4", default-features = false, features = ["vendored-libgit2"] }
log = { version = "0.4.22" }
infer = { version = "0.19.0" }
mime-infer = { version = "3.0.0" }
-
radicle = { version = "0.16.1" }
-
radicle-job = { version = "0.2.0" }
-
radicle-surf = { version = "0.22.1", features = ["serde"] }
+
radicle = { version = "0.22" }
+
radicle-job = { version = "0.5.2" }
+
radicle-localtime = { version = "0.1.0", features = ["serde"] }
+
radicle-surf = { version = "0.27.0", features = ["serde"] }
serde = { version = "1.0.0", features = ["derive"] }
serde_json = { version = "1.0.0" }
-
sqlite = { version = "0.32.0", features = ["bundled"] }
+
sqlite = { version = "0.37.0", features = ["bundled"] }
ssh-key = { version = "0.6.3" }
tauri = { version = "2.5.0", features = ["isolation"] }
tauri-plugin-clipboard-manager = { version = "2.2.2" }
@@ -52,4 +53,4 @@ ts-rs = { version = "10.1.0", features = [
url = { version = "2.5.4", features = ["serde"] }

[dev-dependencies]
-
radicle = { version = "0.16.1", features = ["test"] }
+
radicle = { version = "0.22", features = ["test"] }
modified crates/radicle-types/src/cobs/issue.rs
@@ -230,7 +230,9 @@ impl FromRadicleAction<radicle::issue::Action> for Action {
            radicle::issue::Action::Lifecycle { state } => Self::Lifecycle {
                state: state.into(),
            },
-
            radicle::issue::Action::Edit { title } => Self::Edit { title },
+
            radicle::issue::Action::Edit { title } => Self::Edit {
+
                title: title.to_string(),
+
            },
        }
    }
}
modified crates/radicle-types/src/cobs/repo.rs
@@ -1,4 +1,4 @@
-
use localtime::LocalTime;
+
use radicle_localtime::LocalTime;

#[derive(Debug, PartialEq, Eq, Clone, serde::Serialize, serde::Deserialize, ts_rs::TS)]
#[serde(tag = "status")]
@@ -42,7 +42,6 @@ impl From<radicle::node::SyncStatus> for SyncStatus {
pub struct SyncedAt {
    #[ts(as = "String")]
    pub oid: radicle::git::Oid,
-
    #[serde(with = "radicle::serde_ext::localtime::time")]
    #[ts(type = "number")]
    pub timestamp: LocalTime,
}
modified crates/radicle-types/src/cobs/stream/iter.rs
@@ -7,8 +7,8 @@ use serde_json as json;

use radicle::cob::change::Storage;
use radicle::cob::{Manifest, Op, TypeName};
-
use radicle::git::raw as git2;
-
use radicle::git::{Oid, PatternString};
+
use radicle::git;
+
use radicle::git::Oid;
use radicle::profile::Aliases;
use radicle::storage::git::Repository;

@@ -30,7 +30,7 @@ pub(super) struct Walk {
#[derive(Clone, Debug)]
pub enum Until {
    Tip(Oid),
-
    Glob(PatternString),
+
    Glob(git::fmt::refspec::PatternString),
}

impl From<Oid> for Until {
@@ -39,8 +39,8 @@ impl From<Oid> for Until {
    }
}

-
impl From<PatternString> for Until {
-
    fn from(glob: PatternString) -> Self {
+
impl From<git::fmt::refspec::PatternString> for Until {
+
    fn from(glob: git::fmt::refspec::PatternString) -> Self {
        Self::Glob(glob)
    }
}
@@ -86,14 +86,14 @@ impl Walk {
    }

    /// Get the iterator for the walk.
-
    pub(super) fn iter(self, repo: &Repository) -> Result<WalkIter<'_>, git2::Error> {
+
    pub(super) fn iter(self, repo: &Repository) -> Result<WalkIter<'_>, git::raw::Error> {
        let mut walk = repo.backend.revwalk()?;
        // N.b. ensure that we start from the `self.from` commit.
        walk.set_sorting(git2::Sort::TOPOLOGICAL.union(git2::Sort::REVERSE))?;
        match self.until {
            Until::Tip(tip) => walk.push_range(&format!("{}..{}", self.from, tip))?,
            Until::Glob(glob) => {
-
                walk.push(*self.from)?;
+
                walk.push(git2::Oid::from(self.from))?;
                walk.push_glob(glob.as_str())?
            }
        }
@@ -107,13 +107,13 @@ impl Walk {
}

impl<'a> Iterator for WalkIter<'a> {
-
    type Item = Result<git2::Commit<'a>, git2::Error>;
+
    type Item = Result<git::raw::Commit<'a>, git::raw::Error>;

    fn next(&mut self) -> Option<Self::Item> {
        // N.b. ensure that we start using the `from` commit and use the revwalk
        // after that.
        if let Some(from) = self.from.take() {
-
            return Some(self.repo.backend.find_commit(*from));
+
            return Some(self.repo.backend.find_commit(git2::Oid::from(from)));
        }
        let oid = self.inner.next()?;
        Some(oid.and_then(|oid| self.repo.backend.find_commit(oid)))
@@ -154,7 +154,7 @@ impl<'a, A> ActionsIter<'a, A> {
    fn matches_manifest(&self, tree: &git2::Tree) -> Result<bool, error::Actions> {
        let entry = match tree.get_path(Path::new("manifest")) {
            Ok(entry) => entry,
-
            Err(err) if matches!(err.code(), git2::ErrorCode::NotFound) => return Ok(false),
+
            Err(err) if matches!(err.code(), git::raw::ErrorCode::NotFound) => return Ok(false),
            Err(err) => {
                return Err(error::Actions::ManifestPath {
                    oid: tree.id().into(),
@@ -298,14 +298,14 @@ where
/// The entry is only an action if it is a blob and its name is numerical.
fn from_tree_entry<A>(
    repo: &Repository,
-
    entry: git2::TreeEntry,
+
    entry: git2::TreeEntry<'_>,
    op: Op<Vec<u8>>,
    author: Author,
) -> Option<Result<ActionWithAuthor<A>, error::TreeAction>>
where
    A: for<'de> Deserialize<'de>,
{
-
    let as_action = |entry: git2::TreeEntry| -> Result<ActionWithAuthor<A>, error::TreeAction> {
+
    let as_action = |entry: git2::TreeEntry<'_>| -> Result<ActionWithAuthor<A>, error::TreeAction> {
        let object = entry
            .to_object(&repo.backend)
            .map_err(|err| error::TreeAction::InvalidEntry { err })?;
@@ -322,14 +322,14 @@ where
    // An entry is only considered an action if it:
    //   a) Is a blob
    //   b) Its name is numeric, e.g. 1, 2, 3, etc.
-
    let is_action =
-
        entry.filemode() == i32::from(git2::FileMode::Blob) && name.chars().all(|c| c.is_numeric());
+
    let is_action = entry.filemode() == i32::from(git::raw::FileMode::Blob)
+
        && name.chars().all(|c| c.is_numeric());
    is_action.then(|| as_action(entry))
}

/// Helper to deserialize an action from a blob's contents.
fn action<A>(
-
    blob: &git2::Blob,
+
    blob: &git2::Blob<'_>,
    op: Op<Vec<u8>>,
    author: Author,
) -> Result<ActionWithAuthor<A>, error::Action>
modified crates/radicle-types/src/diff.rs
@@ -152,7 +152,7 @@ pub struct DiffFile {
impl From<surf::diff::DiffFile> for DiffFile {
    fn from(value: surf::diff::DiffFile) -> Self {
        Self {
-
            oid: value.oid,
+
            oid: crate::oid::from_surf(value.oid),
            mode: value.mode.into(),
        }
    }
modified crates/radicle-types/src/domain/inbox/models/notification.rs
@@ -26,7 +26,7 @@ pub enum SetStatusNotifications {
#[serde(rename = "camelCase")]
pub struct NotificationRow {
    pub row_id: node::notifications::NotificationId,
-
    pub timestamp: localtime::LocalTime,
+
    pub timestamp: radicle_localtime::LocalTime,
    /// Node Id that provided us with this notification.
    pub remote: storage::RemoteId,
    pub old: Option<git::Oid>,
@@ -34,7 +34,7 @@ pub struct NotificationRow {
    pub repo: Option<identity::RepoId>,
}

-
pub type RepoGroup = Vec<(git::Qualified<'static>, Vec<NotificationRow>)>;
+
pub type RepoGroup = Vec<(git::fmt::Qualified<'static>, Vec<NotificationRow>)>;
pub type RepoGroupByItem = Vec<Vec<NotificationItem>>;

pub type CountByRepo = (identity::RepoId, usize);
@@ -134,7 +134,7 @@ pub struct Issue {
    pub update: RefUpdate,
    pub title: String,
    #[ts(type = "number")]
-
    pub timestamp: localtime::LocalTime,
+
    pub timestamp: radicle_localtime::LocalTime,
    pub status: cobs::issue::State,
    pub actions: Vec<ActionWithAuthor<cobs::issue::Action>>,
    #[ts(as = "String")]
@@ -164,7 +164,7 @@ pub struct Patch {
    pub id: cob::ObjectId,
    pub update: RefUpdate,
    #[ts(type = "number")]
-
    pub timestamp: localtime::LocalTime,
+
    pub timestamp: radicle_localtime::LocalTime,
    pub title: String,
    pub status: models::patch::State,
    pub actions: Vec<ActionWithAuthor<models::patch::Action>>,
@@ -190,7 +190,7 @@ pub enum NotificationKind {
    /// Unknown reference.
    Unknown {
        #[ts(as = "String")]
-
        refname: git::Qualified<'static>,
+
        refname: git::fmt::Qualified<'static>,
    },
}

@@ -260,7 +260,7 @@ impl From<TypedId> for cob::TypedId {
pub enum RefUpdate {
    Updated {
        #[ts(as = "String")]
-
        name: git::RefString,
+
        name: git::fmt::RefString,
        #[ts(as = "String")]
        old: git::Oid,
        #[ts(as = "String")]
@@ -268,19 +268,19 @@ pub enum RefUpdate {
    },
    Created {
        #[ts(as = "String")]
-
        name: git::RefString,
+
        name: git::fmt::RefString,
        #[ts(as = "String")]
        oid: git::Oid,
    },
    Deleted {
        #[ts(as = "String")]
-
        name: git::RefString,
+
        name: git::fmt::RefString,
        #[ts(as = "String")]
        oid: git::Oid,
    },
    Skipped {
        #[ts(as = "String")]
-
        name: git::RefString,
+
        name: git::fmt::RefString,
        #[ts(as = "String")]
        oid: git::Oid,
    },
@@ -308,8 +308,8 @@ impl From<RefUpdate> for storage::RefUpdate {
    }
}

-
impl From<(git::RefString, Option<git::Oid>, Option<git::Oid>)> for RefUpdate {
-
    fn from((name, new, old): (git::RefString, Option<git::Oid>, Option<git::Oid>)) -> Self {
+
impl From<(git::fmt::RefString, Option<git::Oid>, Option<git::Oid>)> for RefUpdate {
+
    fn from((name, new, old): (git::fmt::RefString, Option<git::Oid>, Option<git::Oid>)) -> Self {
        match (new, old) {
            (None, Some(b)) => RefUpdate::Deleted { name, oid: b },
            (Some(a), None) => RefUpdate::Created { name, oid: a },
modified crates/radicle-types/src/domain/patch/models/patch.rs
@@ -578,7 +578,10 @@ impl FromRadicleAction<radicle::patch::Action> for Action {
                    .map(|a| Author::new(a, aliases))
                    .collect::<BTreeSet<_>>(),
            },
-
            radicle::patch::Action::Edit { title, target } => Self::Edit { title, target },
+
            radicle::patch::Action::Edit { title, target } => Self::Edit {
+
                title: title.to_string(),
+
                target,
+
            },
            radicle::patch::Action::Label { labels } => Self::Label { labels },
            radicle::patch::Action::Lifecycle { state } => Self::Lifecycle { state },
            radicle::patch::Action::Merge { revision, commit } => Self::Merge { revision, commit },
modified crates/radicle-types/src/error.rs
@@ -11,6 +11,10 @@ pub enum Error {
    #[error(transparent)]
    ProfileError(#[from] radicle::profile::Error),

+
    /// Profile signer error.
+
    #[error(transparent)]
+
    Signer(#[from] radicle::profile::SignerError),
+

    /// Radicle error.
    #[error("radicle is not installed")]
    RadicleNotInstalled,
@@ -128,10 +132,6 @@ pub enum Error {
    #[error(transparent)]
    Storage(#[from] radicle::storage::Error),

-
    /// Radicle Git error.
-
    #[error(transparent)]
-
    Git(#[from] radicle::git::Error),
-

    /// Surf error.
    #[error(transparent)]
    Surf(#[from] radicle_surf::Error),
@@ -152,6 +152,10 @@ pub enum Error {
    #[error(transparent)]
    Issue(#[from] radicle::issue::Error),

+
    /// Invalid title.
+
    #[error(transparent)]
+
    Title(#[from] radicle::cob::TitleError),
+

    /// Node error.
    #[error(transparent)]
    Node(#[from] radicle::node::Error),
modified crates/radicle-types/src/lib.rs
@@ -11,6 +11,7 @@ pub mod config;
pub mod diff;
pub mod domain;
pub mod error;
+
pub mod oid;
pub mod outbound;
pub mod repo;
pub mod source;
added crates/radicle-types/src/oid.rs
@@ -0,0 +1,7 @@
+
pub(crate) fn from_surf(oid: radicle_surf::Oid) -> radicle::git::Oid {
+
    radicle::git::Oid::from(radicle::git::raw::Oid::from(oid))
+
}
+

+
pub(crate) fn into_surf(oid: radicle::git::Oid) -> radicle_surf::Oid {
+
    radicle_surf::Oid::from(radicle::git::raw::Oid::from(oid))
+
}
modified crates/radicle-types/src/repo.rs
@@ -172,12 +172,16 @@ pub struct Commit {
impl From<surf::Commit> for Commit {
    fn from(value: surf::Commit) -> Self {
        Self {
-
            id: value.id,
+
            id: crate::oid::from_surf(value.id),
            author: value.author,
            committer: value.committer,
            message: value.message,
            summary: value.summary,
-
            parents: value.parents,
+
            parents: value
+
                .parents
+
                .into_iter()
+
                .map(crate::oid::from_surf)
+
                .collect(),
        }
    }
}
modified crates/radicle-types/src/source/blob.rs
@@ -35,7 +35,7 @@ impl<T: AsRef<[u8]>> From<surf::blob::Blob<T>> for Blob {
        let mime_type = infer::get(blob.content()).map(|i| i.mime_type().to_string());

        Blob {
-
            id: blob.object_id(),
+
            id: crate::oid::from_surf(blob.object_id()),
            binary: blob.is_binary(),
            commit: blob.commit().clone().into(),
            content,
modified crates/radicle-types/src/source/commit.rs
@@ -23,12 +23,16 @@ pub struct Commit {
impl From<surf::Commit> for Commit {
    fn from(commit: surf::Commit) -> Self {
        Commit {
-
            id: commit.id,
+
            id: crate::oid::from_surf(commit.id),
            author: commit.author,
            committer: commit.committer,
            message: commit.message.to_string(),
            summary: commit.summary.to_string(),
-
            parents: commit.parents.into_iter().collect::<Vec<_>>(),
+
            parents: commit
+
                .parents
+
                .into_iter()
+
                .map(crate::oid::from_surf)
+
                .collect::<Vec<_>>(),
        }
    }
}
modified crates/radicle-types/src/source/tree.rs
@@ -21,7 +21,7 @@ pub struct Tree {
impl Tree {
    pub fn from_surf(tree: surf::tree::Tree, path: &std::path::Path) -> Self {
        Tree {
-
            id: tree.object_id(),
+
            id: crate::oid::from_surf(tree.object_id()),
            path: path.to_path_buf(),
            entries: tree
                .entries()
@@ -76,9 +76,9 @@ impl Entry {
impl Entry {
    pub fn object_id(&self) -> Oid {
        match self.kind {
-
            surf::tree::EntryKind::Blob(id) => id,
-
            surf::tree::EntryKind::Tree(id) => id,
-
            surf::tree::EntryKind::Submodule { id, .. } => id,
+
            surf::tree::EntryKind::Blob(id) => crate::oid::from_surf(id),
+
            surf::tree::EntryKind::Tree(id) => crate::oid::from_surf(id),
+
            surf::tree::EntryKind::Submodule { id, .. } => crate::oid::from_surf(id),
        }
    }
}
modified crates/radicle-types/src/syntax.rs
@@ -531,7 +531,7 @@ pub trait Repo {

impl Repo for git::raw::Repository {
    fn blob(&self, oid: git::Oid) -> Result<Blob, git::raw::Error> {
-
        let blob = self.find_blob(*oid)?;
+
        let blob = self.find_blob(oid.into())?;

        if blob.is_binary() {
            Ok(Blob::Binary)
@@ -721,8 +721,8 @@ impl ToPretty for surf::diff::Moved {
    type Context = ();

    fn pretty<R: Repo>(&self, hi: &mut Highlighter, _: &Self::Context, repo: &R) -> Self::Output {
-
        let old = Some((self.old_path.as_path(), self.old.oid));
-
        let new = Some((self.new_path.as_path(), self.new.oid));
+
        let old = Some((self.old_path.as_path(), crate::oid::from_surf(self.old.oid)));
+
        let new = Some((self.new_path.as_path(), crate::oid::from_surf(self.new.oid)));
        let blobs = Blobs::from_paths(old, new, repo);

        types::diff::Moved {
@@ -741,7 +741,7 @@ impl ToPretty for surf::diff::Added {

    fn pretty<R: Repo>(&self, hi: &mut Highlighter, _: &Self::Context, repo: &R) -> Self::Output {
        let old = None;
-
        let new = Some((self.path.as_path(), self.new.oid));
+
        let new = Some((self.path.as_path(), crate::oid::from_surf(self.new.oid)));
        let blobs = Blobs::from_paths(old, new, repo);

        types::diff::Added {
@@ -757,7 +757,7 @@ impl ToPretty for surf::diff::Deleted {
    type Context = ();

    fn pretty<R: Repo>(&self, hi: &mut Highlighter, _: &Self::Context, repo: &R) -> Self::Output {
-
        let old = Some((self.path.as_path(), self.old.oid));
+
        let old = Some((self.path.as_path(), crate::oid::from_surf(self.old.oid)));
        let new = None;
        let blobs = Blobs::from_paths(old, new, repo);

@@ -774,8 +774,8 @@ impl ToPretty for surf::diff::Modified {
    type Context = ();

    fn pretty<R: Repo>(&self, hi: &mut Highlighter, _: &Self::Context, repo: &R) -> Self::Output {
-
        let old = Some((self.path.as_path(), self.old.oid));
-
        let new = Some((self.path.as_path(), self.new.oid));
+
        let old = Some((self.path.as_path(), crate::oid::from_surf(self.old.oid)));
+
        let new = Some((self.path.as_path(), crate::oid::from_surf(self.new.oid)));
        let blobs = Blobs::from_paths(old, new, repo);

        types::diff::Modified {
@@ -792,8 +792,8 @@ impl ToPretty for surf::diff::Copied {
    type Context = ();

    fn pretty<R: Repo>(&self, hi: &mut Highlighter, _: &Self::Context, repo: &R) -> Self::Output {
-
        let old = Some((self.old_path.as_path(), self.old.oid));
-
        let new = Some((self.new_path.as_path(), self.new.oid));
+
        let old = Some((self.old_path.as_path(), crate::oid::from_surf(self.old.oid)));
+
        let new = Some((self.new_path.as_path(), crate::oid::from_surf(self.new.oid)));
        let blobs = Blobs::from_paths(old, new, repo);

        types::diff::Copied {
modified crates/radicle-types/src/test.rs
@@ -13,10 +13,11 @@ pub const TIMESTAMP: u64 = 1671125284;
/// Create a new profile.
pub fn profile(home: &Path, seed: [u8; 32]) -> radicle::Profile {
    let home = Home::new(home).unwrap();
+
    let alias = node::Alias::new("seed");
+
    let config = profile::Config::new(alias.clone());
    let keystore = Keystore::new(&home.keys());

    let keypair = KeyPair::from_seed(Seed::from(seed));
-
    let alias = node::Alias::new("seed");
    let storage = Storage::open(
        home.storage(),
        radicle::git::UserInfo {
@@ -29,7 +30,7 @@ pub fn profile(home: &Path, seed: [u8; 32]) -> radicle::Profile {
    let mut db = home.policies_mut().unwrap();
    db.follow(&keypair.pk.into(), Some(&alias)).unwrap();

-
    let node_db = home.database_mut().unwrap();
+
    let node_db = home.database_mut(config.node.database.clone()).unwrap();
    node_db
        .init(
            &keypair.pk.into(),
@@ -53,6 +54,6 @@ pub fn profile(home: &Path, seed: [u8; 32]) -> radicle::Profile {
        storage,
        keystore,
        public_key: keypair.pk.into(),
-
        config: profile::Config::new(alias),
+
        config,
    }
}
modified crates/radicle-types/src/traits/issue.rs
@@ -1,5 +1,6 @@
use std::collections::BTreeSet;

+
use radicle::cob::Title;
use radicle::issue::cache::Issues as _;
use radicle::node::Handle;
use radicle::storage::ReadStorage;
@@ -106,8 +107,9 @@ pub trait IssuesMut: Profile {
        let signer = profile.signer()?;
        let aliases = profile.aliases();
        let mut issues = profile.issues_mut(&repo)?;
+
        let title = Title::try_from(new.title)?;
        let issue = issues.create(
-
            new.title,
+
            title,
            new.description,
            &new.labels,
            &new.assignees,
@@ -116,7 +118,7 @@ pub trait IssuesMut: Profile {
        )?;

        if opts.announce() {
-
            if let Err(e) = node.announce_refs(rid) {
+
            if let Err(e) = node.announce_refs_for(rid, [profile.public_key]) {
                log::error!("Not able to announce changes: {}", e)
            }
        }
@@ -183,12 +185,12 @@ pub trait IssuesMut: Profile {
                )?;
            }
            cobs::issue::Action::Edit { title } => {
-
                issue.edit(title, &signer)?;
+
                issue.edit(Title::try_from(title)?, &signer)?;
            }
        }

        if opts.announce() {
-
            if let Err(e) = node.announce_refs(rid) {
+
            if let Err(e) = node.announce_refs_for(rid, [profile.public_key]) {
                log::error!("Not able to announce changes: {}", e)
            }
        }
modified crates/radicle-types/src/traits/patch.rs
@@ -1,5 +1,6 @@
use std::collections::BTreeSet;

+
use radicle::cob::Title;
use radicle::node::device::BoxedSigner;
use radicle::node::Handle;
use radicle::patch::cache::Patches as _;
@@ -140,7 +141,7 @@ pub trait PatchesMut: Profile {
                patch.unresolve_review_comment(review, comment, &signer)?;
            }
            models::patch::Action::Edit { title, target } => {
-
                patch.edit::<BoxedSigner, String>(title, target, &signer)?;
+
                patch.edit::<BoxedSigner, String>(Title::try_from(title)?, target, &signer)?;
            }
            models::patch::Action::ReviewEdit {
                review,
@@ -292,7 +293,7 @@ pub trait PatchesMut: Profile {
        }

        if opts.announce() {
-
            if let Err(e) = node.announce_refs(rid) {
+
            if let Err(e) = node.announce_refs_for(rid, [profile.public_key]) {
                log::error!("Not able to announce changes: {}", e)
            }
        }
modified crates/radicle-types/src/traits/repo.rs
@@ -1,4 +1,5 @@
use base64::Engine;
+
use radicle::git::Oid;
use radicle_surf as surf;
use serde::{Deserialize, Serialize};

@@ -40,7 +41,7 @@ pub trait Repo: Profile {
        let mut entries = Vec::new();

        for RepositoryInfo { rid, doc, refs, .. } in repos {
-
            if refs.is_none() && show == Show::Contributor {
+
            if refs.is_ok() && show == Show::Contributor {
                continue;
            }

@@ -123,7 +124,7 @@ pub trait Repo: Profile {
                delegate += 1;
            }

-
            if refs.is_some() {
+
            if refs.is_ok() {
                contributor += 1;
            }
        }
@@ -158,13 +159,14 @@ pub trait Repo: Profile {
            "Readme.md",
        ];

-
        let oid = sha.map_or_else(|| repo.head(), Ok)?;
+
        let oid = sha.map_or_else(|| repo.head().map(|oid| Oid::from(*oid)), Ok)?;
+

        for path in paths
            .iter()
            .map(ToString::to_string)
            .chain(paths.iter().map(|p| p.to_lowercase()))
        {
-
            if let Ok(blob) = repo.blob(oid, &path) {
+
            if let Ok(blob) = repo.blob(crate::oid::into_surf(oid), &path) {
                if blob.size() > MAX_BLOB_SIZE {
                    return Err(Error::FileTooLarge(blob.size()));
                }
@@ -238,8 +240,8 @@ pub trait Repo: Profile {
            &profile.storage,
            &rid,
        ))?;
-
        let base = repo.commit(base)?;
-
        let commit = repo.commit(head)?;
+
        let base = repo.commit(crate::oid::into_surf(base))?;
+
        let commit = repo.commit(crate::oid::into_surf(head))?;
        let diff = repo.diff(base.id, commit.id)?;
        let stats = diff.stats();

@@ -309,8 +311,8 @@ pub trait Repo: Profile {
        let highlight = options.highlight.unwrap_or(true);
        let profile = self.profile();
        let repo = profile.storage.repository(rid)?.backend;
-
        let base = repo.find_commit(*options.base)?;
-
        let head = repo.find_commit(*options.head)?;
+
        let base = repo.find_commit(options.base.into())?;
+
        let head = repo.find_commit(options.head.into())?;

        let mut opts = git::raw::DiffOptions::new();
        opts.patience(true).minimal(true).context_lines(unified);
@@ -385,6 +387,7 @@ pub trait Repo: Profile {
        let policies = profile.policies()?;
        let entries = policies
            .seed_policies()?
+
            .filter_map(Result::ok)
            .filter(|policy| !storage.contains(&policy.rid).unwrap_or(false))
            .map(|policy| policy.rid)
            .collect::<Vec<_>>();
modified crates/radicle-types/src/traits/thread.rs
@@ -1,6 +1,5 @@
use std::fs;

-
use localtime::LocalTime;

use radicle::cob;
use radicle::git;
@@ -119,7 +118,7 @@ pub trait Thread: Profile {
        )?;

        if opts.announce() {
-
            if let Err(e) = node.announce_refs(rid) {
+
            if let Err(e) = node.announce_refs_for(rid, [profile.public_key]) {
                log::error!("Not able to announce changes: {}", e)
            }
        }
@@ -132,7 +131,7 @@ pub trait Thread: Profile {
                id.into(),
                None,
                new.embeds.into_iter().map(Into::into).collect::<Vec<_>>(),
-
                LocalTime::now().into(),
+
                cob::Timestamp::from_secs(radicle_localtime::LocalTime::now().as_secs()),
            ),
            aliases,
        ))
@@ -162,7 +161,7 @@ pub trait Thread: Profile {
        )?;

        if opts.announce() {
-
            if let Err(e) = node.announce_refs(rid) {
+
            if let Err(e) = node.announce_refs_for(rid, [profile.public_key]) {
                log::error!("Not able to announce changes: {}", e)
            }
        }
@@ -175,7 +174,7 @@ pub trait Thread: Profile {
                new.reply_to,
                new.location.map(|l| l.into()),
                new.embeds.into_iter().map(Into::into).collect::<Vec<_>>(),
-
                LocalTime::now().into(),
+
                cob::Timestamp::from_secs(radicle_localtime::LocalTime::now().as_secs()),
            ),
            aliases,
        ))
modified crates/test-http-api/Cargo.toml
@@ -13,8 +13,8 @@ anyhow = { version = "1.0.90" }
axum = { version = "0.8.1", default-features = false, features = ["json", "query", "tokio", "http1"] }
hyper = { version = "1.6", default-features = false }
lexopt = { version = "0.3.0" }
-
radicle = { version = "0.16.1" }
-
radicle-surf = { version = "0.22.1", default-features = false, features = ["serde"] }
+
radicle = { version = "0.22" }
+
radicle-surf = { version = "0.27.0", default-features = false, features = ["serde"] }
radicle-types = { path = "../radicle-types" }
serde = { version = "1.0.0", features = ["derive"] }
serde_json = { version = "1.0.0", features = ["preserve_order"] }
modified flake.lock
@@ -3,11 +3,11 @@
    "advisory-db": {
      "flake": false,
      "locked": {
-
        "lastModified": 1722017365,
-
        "narHash": "sha256-9wYR5NZIgI+qzMDlJrUzevR31fvFQRgfjlYp50Xp3Ts=",
+
        "lastModified": 1771365779,
+
        "narHash": "sha256-KaMQHARfo0nykDbE2pNW8GGCm5k8kIiqZ0IQI0RRYWE=",
        "owner": "rustsec",
        "repo": "advisory-db",
-
        "rev": "9d024c07ee8c18609b43436bc865abf46636e250",
+
        "rev": "532daba438136696af8764d4d69ea83ed8694da9",
        "type": "github"
      },
      "original": {
@@ -17,18 +17,12 @@
      }
    },
    "crane": {
-
      "inputs": {
-
        "nixpkgs": [
-
          "heartwood",
-
          "nixpkgs"
-
        ]
-
      },
      "locked": {
-
        "lastModified": 1722907532,
-
        "narHash": "sha256-i/j/dMZPR7uJoQPFTa6UCahLu8kMtozYuR83lIKMERM=",
+
        "lastModified": 1771121070,
+
        "narHash": "sha256-aIlv7FRXF9q70DNJPI237dEDAznSKaXmL5lfK/Id/bI=",
        "owner": "ipetkov",
        "repo": "crane",
-
        "rev": "d0c8f4ed8571c533b31c1d68e4ebc534b790cc5c",
+
        "rev": "a2812c19f1ed2e5ed5ce2ef7109798b575c180e1",
        "type": "github"
      },
      "original": {
@@ -37,6 +31,22 @@
        "type": "github"
      }
    },
+
    "flake-compat": {
+
      "flake": false,
+
      "locked": {
+
        "lastModified": 1767039857,
+
        "narHash": "sha256-vNpUSpF5Nuw8xvDLj2KCwwksIbjua2LZCqhV1LNRDns=",
+
        "owner": "NixOS",
+
        "repo": "flake-compat",
+
        "rev": "5edf11c44bc78a0d334f6334cdaf7d60d732daab",
+
        "type": "github"
+
      },
+
      "original": {
+
        "owner": "NixOS",
+
        "repo": "flake-compat",
+
        "type": "github"
+
      }
+
    },
    "flake-utils": {
      "inputs": {
        "systems": "systems"
@@ -60,11 +70,11 @@
        "systems": "systems_2"
      },
      "locked": {
-
        "lastModified": 1710146030,
-
        "narHash": "sha256-SZ5L6eA7HJ/nmkzGG7/ISclqe6oZdOZTNoesiInkXPQ=",
+
        "lastModified": 1731533236,
+
        "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=",
        "owner": "numtide",
        "repo": "flake-utils",
-
        "rev": "b1d9ab70662946ef0850d488da1c9019f3a9752a",
+
        "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b",
        "type": "github"
      },
      "original": {
@@ -73,57 +83,124 @@
        "type": "github"
      }
    },
+
    "git-hooks": {
+
      "inputs": {
+
        "flake-compat": "flake-compat",
+
        "gitignore": "gitignore",
+
        "nixpkgs": [
+
          "heartwood",
+
          "nixpkgs"
+
        ]
+
      },
+
      "locked": {
+
        "lastModified": 1770726378,
+
        "narHash": "sha256-kck+vIbGOaM/dHea7aTBxdFYpeUl/jHOy5W3eyRvVx8=",
+
        "owner": "cachix",
+
        "repo": "git-hooks.nix",
+
        "rev": "5eaaedde414f6eb1aea8b8525c466dc37bba95ae",
+
        "type": "github"
+
      },
+
      "original": {
+
        "owner": "cachix",
+
        "repo": "git-hooks.nix",
+
        "type": "github"
+
      }
+
    },
+
    "gitignore": {
+
      "inputs": {
+
        "nixpkgs": [
+
          "heartwood",
+
          "git-hooks",
+
          "nixpkgs"
+
        ]
+
      },
+
      "locked": {
+
        "lastModified": 1709087332,
+
        "narHash": "sha256-HG2cCnktfHsKV0s4XW83gU3F57gaTljL9KNSuG6bnQs=",
+
        "owner": "hercules-ci",
+
        "repo": "gitignore.nix",
+
        "rev": "637db329424fd7e46cf4185293b9cc8c88c95394",
+
        "type": "github"
+
      },
+
      "original": {
+
        "owner": "hercules-ci",
+
        "repo": "gitignore.nix",
+
        "type": "github"
+
      }
+
    },
    "heartwood": {
      "inputs": {
        "advisory-db": "advisory-db",
        "crane": "crane",
        "flake-utils": "flake-utils_2",
-
        "nixpkgs": "nixpkgs",
+
        "git-hooks": "git-hooks",
+
        "nixpkgs": [
+
          "heartwood",
+
          "nixpkgs-stable"
+
        ],
+
        "nixpkgs-stable": "nixpkgs-stable",
+
        "nixpkgs-unstable": "nixpkgs-unstable",
        "rust-overlay": "rust-overlay"
      },
      "locked": {
-
        "lastModified": 1732803596,
-
        "narHash": "sha256-M4oz9tWjI/eqV4Gz1b512MEmvsZ5u3R9y6P9VeeH9CA=",
-
        "ref": "refs/namespaces/z6MksFqXN3Yhqk8pTJdUGLwATkRfQvwZXPqR2qMEhbS9wzpT/refs/tags/v1.1.0",
-
        "rev": "60d503e77115232f88537e30367714212c49085b",
-
        "revCount": 2147,
+
        "lastModified": 1773954471,
+
        "narHash": "sha256-l9yDJ+RStcxv9MGdWJraVsyBguq93O+kL8SsTvtkFaM=",
+
        "ref": "refs/tags/releases/1.7.1",
+
        "rev": "d9915d275fd07d20db08cf7d3488f8650e66b88a",
+
        "revCount": 2899,
        "type": "git",
-
        "url": "https://seed.radicle.xyz/z3gqcJUoA1n9HaHKufZs5FCSGazv5.git"
+
        "url": "https://seed.radicle.xyz/z3gqcJUoA1n9HaHKufZs5FCSGazv5"
      },
      "original": {
-
        "ref": "refs/namespaces/z6MksFqXN3Yhqk8pTJdUGLwATkRfQvwZXPqR2qMEhbS9wzpT/refs/tags/v1.1.0",
+
        "ref": "refs/tags/releases/1.7.1",
        "type": "git",
-
        "url": "https://seed.radicle.xyz/z3gqcJUoA1n9HaHKufZs5FCSGazv5.git"
+
        "url": "https://seed.radicle.xyz/z3gqcJUoA1n9HaHKufZs5FCSGazv5"
      }
    },
    "nixpkgs": {
      "locked": {
-
        "lastModified": 1722940684,
-
        "narHash": "sha256-X8JnSq0ruRWsU4PdYuxV+8W4W66F1lnCcxIZZMWzo4E=",
+
        "lastModified": 1751274312,
+
        "narHash": "sha256-/bVBlRpECLVzjV19t5KMdMFWSwKLtb5RyXdjz3LJT+g=",
        "owner": "NixOS",
        "repo": "nixpkgs",
-
        "rev": "a3103d68517c6ad262ea27c96fc4a38ad81be7a0",
+
        "rev": "50ab793786d9de88ee30ec4e4c24fb4236fc2674",
        "type": "github"
      },
      "original": {
        "owner": "NixOS",
-
        "ref": "release-24.05",
+
        "ref": "nixos-24.11",
        "repo": "nixpkgs",
        "type": "github"
      }
    },
-
    "nixpkgs_2": {
+
    "nixpkgs-stable": {
      "locked": {
-
        "lastModified": 1747209494,
-
        "narHash": "sha256-fLise+ys+bpyjuUUkbwqo5W/UyIELvRz9lPBPoB0fbM=",
+
        "lastModified": 1771371298,
+
        "narHash": "sha256-AudCpsjP7MfL1mAusLjyyiOz+SF+JujxWzoSAhjk+Og=",
        "owner": "NixOS",
        "repo": "nixpkgs",
-
        "rev": "5d736263df906c5da72ab0f372427814de2f52f8",
+
        "rev": "bf117123cd658283c5b5c587e59091168323ad61",
        "type": "github"
      },
      "original": {
        "owner": "NixOS",
-
        "ref": "nixos-24.11",
+
        "ref": "release-25.11",
+
        "repo": "nixpkgs",
+
        "type": "github"
+
      }
+
    },
+
    "nixpkgs-unstable": {
+
      "locked": {
+
        "lastModified": 1771371298,
+
        "narHash": "sha256-AudCpsjP7MfL1mAusLjyyiOz+SF+JujxWzoSAhjk+Og=",
+
        "owner": "NixOS",
+
        "repo": "nixpkgs",
+
        "rev": "bf117123cd658283c5b5c587e59091168323ad61",
+
        "type": "github"
+
      },
+
      "original": {
+
        "owner": "NixOS",
+
        "ref": "release-25.11",
        "repo": "nixpkgs",
        "type": "github"
      }
@@ -132,7 +209,7 @@
      "inputs": {
        "flake-utils": "flake-utils",
        "heartwood": "heartwood",
-
        "nixpkgs": "nixpkgs_2",
+
        "nixpkgs": "nixpkgs",
        "rust-overlay": "rust-overlay_2"
      }
    },
@@ -144,11 +221,11 @@
        ]
      },
      "locked": {
-
        "lastModified": 1722910815,
-
        "narHash": "sha256-v6Vk/xlABhw2QzOa6xh3Jx/IvmlbKbOazFM+bDFQlWU=",
+
        "lastModified": 1771384185,
+
        "narHash": "sha256-KvmjUeA7uODwzbcQoN/B8DCZIbhT/Q/uErF1BBMcYnw=",
        "owner": "oxalica",
        "repo": "rust-overlay",
-
        "rev": "7df2ac544c203d21b63aac23bfaec7f9b919a733",
+
        "rev": "23dd7fa91602a68bd04847ac41bc10af1e6e2fd2",
        "type": "github"
      },
      "original": {
@@ -164,11 +241,11 @@
        ]
      },
      "locked": {
-
        "lastModified": 1747190175,
-
        "narHash": "sha256-s33mQ2s5L/2nyllhRTywgECNZyCqyF4MJeM3vG/GaRo=",
+
        "lastModified": 1774062094,
+
        "narHash": "sha256-ba3c+hS7KzEiwtZRGHagIAYdcmdY3rCSWVCyn64rx7s=",
        "owner": "oxalica",
        "repo": "rust-overlay",
-
        "rev": "58160be7abad81f6f8cb53120d5b88c16e01c06d",
+
        "rev": "c807e83cc2e32adc35f51138b3bdef722c0812ab",
        "type": "github"
      },
      "original": {
modified flake.nix
@@ -8,7 +8,7 @@
      inputs.nixpkgs.follows = "nixpkgs";
    };
    heartwood = {
-
      url = "git+https://seed.radicle.xyz/z3gqcJUoA1n9HaHKufZs5FCSGazv5.git?ref=refs/namespaces/z6MksFqXN3Yhqk8pTJdUGLwATkRfQvwZXPqR2qMEhbS9wzpT/refs/tags/v1.1.0";
+
      url = "git+https://seed.radicle.xyz/z3gqcJUoA1n9HaHKufZs5FCSGazv5?ref=refs/tags/releases/1.7.1";
    };
  };

modified nix/radicle-desktop.nix
@@ -22,7 +22,7 @@
  GIT_HEAD ? null,
}:
let
-
  rTc = rust-bin.fromRustupToolchainFile ./../rust-toolchain;
+
  rTc = rust-bin.fromRustupToolchainFile ./../rust-toolchain.toml;
  rustPlatform = makeRustPlatform {
    cargo = rTc;
    rustc = rTc;
deleted rust-toolchain
@@ -1 +0,0 @@
-
1.84.1
added rust-toolchain.toml
@@ -0,0 +1,4 @@
+
[toolchain]
+
channel = "1.90"
+
profile = "default"
+
components = [ "rust-src" ]