rad:z3gqcJUoA1n9HaHKufZs5FCSGazv5 heartwoodc3bfdb25e62c798208bdb38e4edbafd0abb88c6d
{
"request": "trigger",
"version": 1,
"event_type": "patch",
"repository": {
"id": "rad:z3gqcJUoA1n9HaHKufZs5FCSGazv5",
"name": "heartwood",
"description": "Radicle Heartwood Protocol & Stack",
"private": false,
"default_branch": "master",
"delegates": [
"did:key:z6MksFqXN3Yhqk8pTJdUGLwATkRfQvwZXPqR2qMEhbS9wzpT",
"did:key:z6MktaNvN1KVFMkSRAiN4qK5yvX1zuEEaseeX5sffhzPZRZW",
"did:key:z6MkireRatUThvd3qzfKht1S44wpm4FEWSSa4PRMTSQZ3voM",
"did:key:z6MkgFq6z5fkF2hioLLSNu1zP2qEL1aHXHZzGH1FLFGAnBGz",
"did:key:z6MkkPvBfjP4bQmco5Dm7UGsX2ruDBieEHi8n9DVJWX5sTEz"
]
},
"action": "Updated",
"patch": {
"id": "125cf15c7b6b29b221419633b5ad80bde0dbc963",
"author": {
"id": "did:key:z6MkkPvBfjP4bQmco5Dm7UGsX2ruDBieEHi8n9DVJWX5sTEz",
"alias": "lorenz"
},
"title": "Use `ssh-agent-lib` instead of `radicle-ssh` for SSH agent features",
"state": {
"status": "open",
"conflicts": []
},
"before": "8bac24d6ab961dec6308fdf64b31c41201e9e8d1",
"after": "c3bfdb25e62c798208bdb38e4edbafd0abb88c6d",
"commits": [
"c3bfdb25e62c798208bdb38e4edbafd0abb88c6d"
],
"target": "10a82958ca9e6702da0197674b73c1b3dbfe51f2",
"labels": [],
"assignees": [],
"revisions": [
{
"id": "125cf15c7b6b29b221419633b5ad80bde0dbc963",
"author": {
"id": "did:key:z6MkkPvBfjP4bQmco5Dm7UGsX2ruDBieEHi8n9DVJWX5sTEz",
"alias": "lorenz"
},
"description": "Note that this patch is a *work in progress* and also a testing ground\nfor me. I hope I won't break radicle as I try to submit it :)\n\nSigned-off-by: Wiktor Kwapisiewicz <wiktor@metacode.biz>",
"base": "ce99f7e7e45ac22104434c6094ac2fe410a8970d",
"oid": "9c2798c424a409410b30e7f9da0bfdac9a167fb9",
"timestamp": 1718195535
},
{
"id": "35f4305d35035abf3bc95a0a4008c105be989029",
"author": {
"id": "did:key:z6MkkPvBfjP4bQmco5Dm7UGsX2ruDBieEHi8n9DVJWX5sTEz",
"alias": "lorenz"
},
"description": "Rebase without the actual changes to `radicle` and `radicle-cli`. These remain to do.",
"base": "0736977170c53c41aecf6321ae66560534c9409a",
"oid": "2589873db7bd0b4c2bc09815fbe4e6acd967bcc4",
"timestamp": 1773845812
},
{
"id": "333605f224be11bfedf9f0c2dd0efee66cdc6125",
"author": {
"id": "did:key:z6MkkPvBfjP4bQmco5Dm7UGsX2ruDBieEHi8n9DVJWX5sTEz",
"alias": "lorenz"
},
"description": "Rebase, revise.",
"base": "9fd4f00c2301c0f6db684f6076c49592ae93277d",
"oid": "00a850401efb0d76a31fe2642f4842773af792c2",
"timestamp": 1773874309
},
{
"id": "a508319ca97d7b6589c9ea454bf03dbf19faea17",
"author": {
"id": "did:key:z6MkkPvBfjP4bQmco5Dm7UGsX2ruDBieEHi8n9DVJWX5sTEz",
"alias": "lorenz"
},
"description": "Rebase",
"base": "c237a3fe479050691001ad7487c6ec151dbb797b",
"oid": "540cf234b762d8bf89f4ec132551a052f4dbf35c",
"timestamp": 1773877499
},
{
"id": "2890e780f539da74d8021fc1e19ef910790a63dc",
"author": {
"id": "did:key:z6MkkPvBfjP4bQmco5Dm7UGsX2ruDBieEHi8n9DVJWX5sTEz",
"alias": "lorenz"
},
"description": "Rebase and fix test.",
"base": "8bac24d6ab961dec6308fdf64b31c41201e9e8d1",
"oid": "c3bfdb25e62c798208bdb38e4edbafd0abb88c6d",
"timestamp": 1774972084
}
]
}
}
{
"response": "triggered",
"run_id": {
"id": "9ef52bd4-0c89-447a-b8b2-84cc0e8402c0"
},
"info_url": "https://cci.rad.levitte.org//9ef52bd4-0c89-447a-b8b2-84cc0e8402c0.html"
}
Started at: 2026-03-31 17:51:19.933602+02:00
Commands:
$ rad clone rad:z3gqcJUoA1n9HaHKufZs5FCSGazv5 .
✓ Creating checkout in ./...
✓ Remote cloudhead@z6MksFqXN3Yhqk8pTJdUGLwATkRfQvwZXPqR2qMEhbS9wzpT added
✓ Remote-tracking branch cloudhead@z6MksFqXN3Yhqk8pTJdUGLwATkRfQvwZXPqR2qMEhbS9wzpT/master created for z6MksFqXN3Yhqk8pTJdUGLwATkRfQvwZXPqR2qMEhbS9wzpT
✓ Remote cloudhead@z6MktaNvN1KVFMkSRAiN4qK5yvX1zuEEaseeX5sffhzPZRZW added
✓ Remote-tracking branch cloudhead@z6MktaNvN1KVFMkSRAiN4qK5yvX1zuEEaseeX5sffhzPZRZW/master created for z6MktaNvN1KVFMkSRAiN4qK5yvX1zuEEaseeX5sffhzPZRZW
✓ Remote fintohaps@z6MkireRatUThvd3qzfKht1S44wpm4FEWSSa4PRMTSQZ3voM added
✓ Remote-tracking branch fintohaps@z6MkireRatUThvd3qzfKht1S44wpm4FEWSSa4PRMTSQZ3voM/master created for z6MkireRatUThvd3qzfKht1S44wpm4FEWSSa4PRMTSQZ3voM
✓ Remote erikli@z6MkgFq6z5fkF2hioLLSNu1zP2qEL1aHXHZzGH1FLFGAnBGz added
✓ Remote-tracking branch erikli@z6MkgFq6z5fkF2hioLLSNu1zP2qEL1aHXHZzGH1FLFGAnBGz/master created for z6MkgFq6z5fkF2hioLLSNu1zP2qEL1aHXHZzGH1FLFGAnBGz
✓ Remote lorenz@z6MkkPvBfjP4bQmco5Dm7UGsX2ruDBieEHi8n9DVJWX5sTEz added
✓ Remote-tracking branch lorenz@z6MkkPvBfjP4bQmco5Dm7UGsX2ruDBieEHi8n9DVJWX5sTEz/master created for z6MkkPvBfjP4bQmco5Dm7UGsX2ruDBieEHi8n9DVJWX5sTEz
✓ Repository successfully cloned under /opt/radcis/ci.rad.levitte.org/cci/state/9ef52bd4-0c89-447a-b8b2-84cc0e8402c0/w/
╭────────────────────────────────────╮
│ heartwood │
│ Radicle Heartwood Protocol & Stack │
│ 154 issues · 42 patches │
╰────────────────────────────────────╯
Run `cd ./.` to go to the repository directory.
Exit code: 0
$ rad patch checkout 125cf15c7b6b29b221419633b5ad80bde0dbc963
✓ Switched to branch patch/125cf15 at revision 125cf15
✓ Branch patch/125cf15 setup to track rad/patches/125cf15c7b6b29b221419633b5ad80bde0dbc963
Exit code: 0
$ git config advice.detachedHead false
Exit code: 0
$ git checkout c3bfdb25e62c798208bdb38e4edbafd0abb88c6d
HEAD is now at c3bfdb25 crypto: Use `ssh-agent-lib` for SSH Agent
Exit code: 0
$ rad patch show 125cf15c7b6b29b221419633b5ad80bde0dbc963 -p
╭───────────────────────────────────────────────────────────────────────────────╮
│ Title Use `ssh-agent-lib` instead of `radicle-ssh` for SSH agent features │
│ Patch 125cf15c7b6b29b221419633b5ad80bde0dbc963 │
│ Author z6Mkoth…rrZjCPc │
│ Head 9c2798c424a409410b30e7f9da0bfdac9a167fb9 │
│ Base ce99f7e7e45ac22104434c6094ac2fe410a8970d │
│ Branches patch/125cf15 │
│ Commits ahead 1, behind 948 │
│ Status open │
│ │
│ Note that this patch is a *work in progress* and also a testing ground │
│ for me. I hope I won't break radicle as I try to submit it :) │
│ │
│ Signed-off-by: Wiktor Kwapisiewicz <wiktor@metacode.biz> │
├───────────────────────────────────────────────────────────────────────────────┤
│ 9c2798c Use `ssh-agent-lib` instead of `radicle-ssh` for SSH agent features │
├───────────────────────────────────────────────────────────────────────────────┤
│ ● Revision 125cf15 @ 9c2798c by z6Mkoth…rrZjCPc 1 year ago │
│ ↑ Revision 35f4305 @ 2589873 by lorenz z6MkkPv…WX5sTEz 1 week ago │
│ ↑ Revision 333605f @ 00a8504 by lorenz z6MkkPv…WX5sTEz 1 week ago │
│ ↑ Revision a508319 @ 540cf23 by lorenz z6MkkPv…WX5sTEz 1 week ago │
│ ↑ Revision 2890e78 @ c3bfdb2 by lorenz z6MkkPv…WX5sTEz 3 minutes ago │
╰───────────────────────────────────────────────────────────────────────────────╯
commit 9c2798c424a409410b30e7f9da0bfdac9a167fb9
Author: Wiktor Kwapisiewicz <wiktor@metacode.biz>
Date: Wed Jun 12 14:12:24 2024 +0200
Use `ssh-agent-lib` instead of `radicle-ssh` for SSH agent features
Note that this patch is a *work in progress* and also a testing ground
for me. I hope I won't break radicle as I try to submit it :)
Signed-off-by: Wiktor Kwapisiewicz <wiktor@metacode.biz>
diff --git a/Cargo.lock b/Cargo.lock
index be29bfe24..26484c17a 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -113,47 +113,48 @@ dependencies = [
[[package]]
name = "anstream"
-version = "0.6.13"
+version = "0.6.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d96bd03f33fe50a863e394ee9718a706f988b9079b20c3784fb726e7678b62fb"
+checksum = "418c75fa768af9c03be99d17643f93f79bbba589895012a80e3452a19ddda15b"
dependencies = [
"anstyle",
"anstyle-parse",
"anstyle-query",
"anstyle-wincon",
"colorchoice",
+ "is_terminal_polyfill",
"utf8parse",
]
[[package]]
name = "anstyle"
-version = "1.0.6"
+version = "1.0.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8901269c6307e8d93993578286ac0edf7f195079ffff5ebdeea6a59ffb7e36bc"
+checksum = "038dfcf04a5feb68e9c60b21c9625a54c2c0616e79b72b0fd87075a056ae1d1b"
[[package]]
name = "anstyle-parse"
-version = "0.2.3"
+version = "0.2.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c75ac65da39e5fe5ab759307499ddad880d724eed2f6ce5b5e8a26f4f387928c"
+checksum = "c03a11a9034d92058ceb6ee011ce58af4a9bf61491aa7e1e59ecd24bd40d22d4"
dependencies = [
"utf8parse",
]
[[package]]
name = "anstyle-query"
-version = "1.0.2"
+version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e28923312444cdd728e4738b3f9c9cac739500909bb3d3c94b43551b16517648"
+checksum = "ad186efb764318d35165f1758e7dcef3b10628e26d41a44bc5550652e6804391"
dependencies = [
"windows-sys 0.52.0",
]
[[package]]
name = "anstyle-wincon"
-version = "3.0.2"
+version = "3.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1cd54b81ec8d6180e24654d0b371ad22fc3dd083b6ff8ba325b72e00c87660a7"
+checksum = "61a38449feb7068f52bb06c12759005cf459ee52bb4adc1d5a7c4322d716fb19"
dependencies = [
"anstyle",
"windows-sys 0.52.0",
@@ -161,9 +162,9 @@ dependencies = [
[[package]]
name = "anyhow"
-version = "1.0.82"
+version = "1.0.86"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f538837af36e6f6a9be0faa67f9a314f8119e4e4b5867c6ab40ed60360142519"
+checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da"
[[package]]
name = "arc-swap"
@@ -179,9 +180,9 @@ checksum = "d92bec98840b8f03a5ff5413de5293bfcd8bf96467cf5452609f939ec6f5de16"
[[package]]
name = "autocfg"
-version = "1.2.0"
+version = "1.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f1fdabc7756949593fe60f30ec81974b613357de856987752631dea1e3394c80"
+checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0"
[[package]]
name = "base-x"
@@ -322,9 +323,9 @@ dependencies = [
[[package]]
name = "cc"
-version = "1.0.95"
+version = "1.0.99"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d32a725bc159af97c3e629873bb9f88fb8cf8a4867175f76dc987815ea07c83b"
+checksum = "96c51067fd44124faa7f870b4b1c969379ad32b2ba805aa959430ceaa384f695"
dependencies = [
"jobserver",
"libc",
@@ -386,9 +387,9 @@ dependencies = [
[[package]]
name = "colorchoice"
-version = "1.0.0"
+version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7"
+checksum = "0b6a852b24ab71dffc585bcb46eaf7959d175cb865a7152e35b348d1b2960422"
[[package]]
name = "colored"
@@ -423,27 +424,27 @@ dependencies = [
[[package]]
name = "crc32fast"
-version = "1.4.0"
+version = "1.4.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b3855a8a784b474f333699ef2bbca9db2c4a1f6d9088a90a2d25b1eb53111eaa"
+checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3"
dependencies = [
"cfg-if",
]
[[package]]
name = "crossbeam-channel"
-version = "0.5.12"
+version = "0.5.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ab3db02a9c5b5121e1e42fbdb1aeb65f5e02624cc58c43f2884c6ccac0b82f95"
+checksum = "33480d6946193aa8033910124896ca395333cae7e2d1113d1fef6c3272217df2"
dependencies = [
"crossbeam-utils",
]
[[package]]
name = "crossbeam-utils"
-version = "0.8.19"
+version = "0.8.20"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345"
+checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80"
[[package]]
name = "crypto-bigint"
@@ -483,6 +484,33 @@ dependencies = [
"cipher",
]
+[[package]]
+name = "curve25519-dalek"
+version = "4.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0a677b8922c94e01bdbb12126b0bc852f00447528dee1782229af9c720c3f348"
+dependencies = [
+ "cfg-if",
+ "cpufeatures",
+ "curve25519-dalek-derive",
+ "digest",
+ "fiat-crypto",
+ "platforms",
+ "rustc_version",
+ "subtle",
+]
+
+[[package]]
+name = "curve25519-dalek-derive"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.66",
+]
+
[[package]]
name = "cypheraddr"
version = "0.4.0"
@@ -521,15 +549,15 @@ dependencies = [
[[package]]
name = "data-encoding"
-version = "2.5.0"
+version = "2.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7e962a19be5cfc3f3bf6dd8f61eb50107f356ad6270fbb3ed41476571db78be5"
+checksum = "e8566979429cf69b49a5c740c60791108e86440e8be149bbea4fe54d2c32d6e2"
[[package]]
name = "data-encoding-macro"
-version = "0.1.14"
+version = "0.1.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "20c01c06f5f429efdf2bae21eb67c28b3df3cf85b7dd2d8ef09c0838dac5d33e"
+checksum = "f1559b6cba622276d6d63706db152618eeb15b89b3e4041446b05876e352e639"
dependencies = [
"data-encoding",
"data-encoding-macro-internal",
@@ -537,9 +565,9 @@ dependencies = [
[[package]]
name = "data-encoding-macro-internal"
-version = "0.1.12"
+version = "0.1.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0047d07f2c89b17dd631c80450d69841a6b5d7fb17278cbc43d7e4cfcf2576f3"
+checksum = "332d754c0af53bc87c108fed664d121ecf59207ec4196041f04d6ab9002ad33f"
dependencies = [
"data-encoding",
"syn 1.0.109",
@@ -582,6 +610,17 @@ dependencies = [
"subtle",
]
+[[package]]
+name = "displaydoc"
+version = "0.2.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "487585f4d0c6655fe74905e2504d8ad6908e4db67f744eb140876906c2f3175d"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.66",
+]
+
[[package]]
name = "dyn-clone"
version = "1.0.17"
@@ -595,7 +634,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bdfd533a2fc01178c738c99412ae1f7e1ad2cb37c2e14bfd87e9d4618171c825"
dependencies = [
"ct-codecs",
- "ed25519",
+ "ed25519 1.5.3",
"getrandom",
]
@@ -622,11 +661,32 @@ dependencies = [
"signature 1.6.4",
]
+[[package]]
+name = "ed25519"
+version = "2.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "115531babc129696a58c64a4fef0a8bf9e9698629fb97e9e40767d235cfbcd53"
+dependencies = [
+ "signature 2.2.0",
+]
+
+[[package]]
+name = "ed25519-dalek"
+version = "2.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4a3daa8e81a3963a60642bcc1f90a670680bd4a77535faa384e9d1c79d620871"
+dependencies = [
+ "curve25519-dalek",
+ "ed25519 2.2.3",
+ "sha2",
+ "subtle",
+]
+
[[package]]
name = "either"
-version = "1.11.0"
+version = "1.12.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a47c1c47d2f5964e29c61246e81db715514cd532db6b5116a25ea3c03d6780a2"
+checksum = "3dca9240753cf90908d7e4aac30f630662b02aebaa1b58a3cadabdb23385b58b"
[[package]]
name = "elliptic-curve"
@@ -655,9 +715,9 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5"
[[package]]
name = "errno"
-version = "0.3.8"
+version = "0.3.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245"
+checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba"
dependencies = [
"libc",
"windows-sys 0.52.0",
@@ -665,9 +725,9 @@ dependencies = [
[[package]]
name = "escargot"
-version = "0.5.10"
+version = "0.5.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4f474c6844cbd04e783d0f25757583db4f491770ca618bedf2fb01815fc79939"
+checksum = "650eb5f6eeda986377996e9ed570cbc20cc16d30440696f82f129c863e4e3e83"
dependencies = [
"log",
"once_cell",
@@ -695,9 +755,9 @@ dependencies = [
[[package]]
name = "fastrand"
-version = "2.0.2"
+version = "2.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "658bd65b1cf4c852a3cc96f18a8ce7b5640f6b703f905c7d74532294c2a63984"
+checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a"
[[package]]
name = "ff"
@@ -709,6 +769,12 @@ dependencies = [
"subtle",
]
+[[package]]
+name = "fiat-crypto"
+version = "0.2.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d"
+
[[package]]
name = "filetime"
version = "0.2.23"
@@ -717,15 +783,15 @@ checksum = "1ee447700ac8aa0b2f2bd7bc4462ad686ba06baa6727ac149a2d6277f0d240fd"
dependencies = [
"cfg-if",
"libc",
- "redox_syscall",
+ "redox_syscall 0.4.1",
"windows-sys 0.52.0",
]
[[package]]
name = "flate2"
-version = "1.0.28"
+version = "1.0.30"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "46303f565772937ffe1d394a4fac6f411c6013172fadde9dcdb1e147a086940e"
+checksum = "5f54427cfd1c7829e2a139fcefea601bf088ebca651d2bf53ebc600eac295dae"
dependencies = [
"crc32fast",
"miniz_oxide",
@@ -762,9 +828,9 @@ dependencies = [
[[package]]
name = "getrandom"
-version = "0.2.14"
+version = "0.2.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "94b22e06ecb0110981051723910cbf0b5f5e09a2062dd7663334ee79a9d1286c"
+checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7"
dependencies = [
"cfg-if",
"libc",
@@ -829,16 +895,16 @@ dependencies = [
[[package]]
name = "gix-actor"
-version = "0.31.1"
+version = "0.31.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "45c3a3bde455ad2ee8ba8a195745241ce0b770a8a26faae59fcf409d01b28c46"
+checksum = "d69c59d392c7e6c94385b6fd6089d6df0fe945f32b4357687989f3aee253cd7f"
dependencies = [
"bstr",
"gix-date",
"gix-utils",
"itoa",
"thiserror",
- "winnow 0.6.8",
+ "winnow 0.6.13",
]
[[package]]
@@ -861,9 +927,9 @@ dependencies = [
[[package]]
name = "gix-command"
-version = "0.3.6"
+version = "0.3.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f90009020dc4b3de47beed28e1334706e0a330ddd17f5cfeb097df3b15a54b77"
+checksum = "6c22e086314095c43ffe5cdc5c0922d5439da4fd726f3b0438c56147c34dc225"
dependencies = [
"bstr",
"gix-path",
@@ -879,7 +945,7 @@ checksum = "f7b102311085da4af18823413b5176d7c500fb2272eaf391cfa8635d8bcb12c4"
dependencies = [
"bstr",
"gix-chunk",
- "gix-features 0.38.1",
+ "gix-features 0.38.2",
"gix-hash 0.14.2",
"memmap2",
"thiserror",
@@ -921,10 +987,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5c70146183bd3c7119329a3c7392d1aa0e0adbe48d727f4df31828fe6d8fdaa1"
dependencies = [
"bstr",
- "gix-command 0.3.6",
+ "gix-command 0.3.7",
"gix-config-value",
"gix-path",
- "gix-prompt 0.8.4",
+ "gix-prompt 0.8.5",
"gix-sec",
"gix-trace",
"gix-url 0.27.3",
@@ -933,9 +999,9 @@ dependencies = [
[[package]]
name = "gix-date"
-version = "0.8.5"
+version = "0.8.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "180b130a4a41870edfbd36ce4169c7090bca70e195da783dea088dd973daa59c"
+checksum = "367ee9093b0c2b04fd04c5c7c8b6a1082713534eab537597ae343663a518fa99"
dependencies = [
"bstr",
"itoa",
@@ -969,9 +1035,9 @@ dependencies = [
[[package]]
name = "gix-features"
-version = "0.38.1"
+version = "0.38.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "db4254037d20a247a0367aa79333750146a369719f0c6617fec4f5752cc62b37"
+checksum = "ac7045ac9fe5f9c727f38799d002a7ed3583cd777e3322a7c4b43e3cf437dc69"
dependencies = [
"crc32fast",
"flate2",
@@ -991,7 +1057,7 @@ version = "0.10.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e2184c40e7910529677831c8b481acf788ffd92427ed21fad65b6aa637e631b8"
dependencies = [
- "gix-features 0.38.1",
+ "gix-features 0.38.2",
"gix-utils",
]
@@ -1028,21 +1094,21 @@ dependencies = [
[[package]]
name = "gix-object"
-version = "0.42.1"
+version = "0.42.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3d4f8efae72030df1c4a81d02dbe2348e748d9b9a11e108ed6efbd846326e051"
+checksum = "1fe2dc4a41191c680c942e6ebd630c8107005983c4679214fdb1007dcf5ae1df"
dependencies = [
"bstr",
"gix-actor",
"gix-date",
- "gix-features 0.38.1",
+ "gix-features 0.38.2",
"gix-hash 0.14.2",
"gix-utils",
"gix-validate",
"itoa",
"smallvec",
"thiserror",
- "winnow 0.6.8",
+ "winnow 0.6.13",
]
[[package]]
@@ -1053,7 +1119,7 @@ checksum = "e8bbb43d2fefdc4701ffdf9224844d05b136ae1b9a73c2f90710c8dd27a93503"
dependencies = [
"arc-swap",
"gix-date",
- "gix-features 0.38.1",
+ "gix-features 0.38.2",
"gix-fs",
"gix-hash 0.14.2",
"gix-object",
@@ -1073,7 +1139,7 @@ checksum = "b58bad27c7677fa6b587aab3a1aca0b6c97373bd371a0a4290677c838c9bcaf1"
dependencies = [
"gix-chunk",
"gix-diff",
- "gix-features 0.38.1",
+ "gix-features 0.38.2",
"gix-hash 0.14.2",
"gix-hashtable",
"gix-object",
@@ -1137,11 +1203,11 @@ dependencies = [
[[package]]
name = "gix-prompt"
-version = "0.8.4"
+version = "0.8.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f5325eb17ce7b5e5d25dec5c2315d642a09d55b9888b3bf46b7d72e1621a55d8"
+checksum = "fddabbc7c51c241600ab3c4623b19fa53bde7c1a2f637f61043ed5fcadf000cc"
dependencies = [
- "gix-command 0.3.6",
+ "gix-command 0.3.7",
"gix-config-value",
"parking_lot",
"rustix",
@@ -1168,20 +1234,20 @@ dependencies = [
[[package]]
name = "gix-protocol"
-version = "0.45.0"
+version = "0.45.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "aed3bb6179835a3250403baa9d7022579e559fc45f2efc416d9de1a14b5acf11"
+checksum = "3c140d4c6d209048826bad78f021a01b612830f89da356efeb31afe8957f8bee"
dependencies = [
"bstr",
"gix-credentials 0.24.2",
"gix-date",
- "gix-features 0.38.1",
+ "gix-features 0.38.2",
"gix-hash 0.14.2",
- "gix-transport 0.42.0",
+ "gix-transport 0.42.1",
"gix-utils",
"maybe-async",
"thiserror",
- "winnow 0.6.8",
+ "winnow 0.6.13",
]
[[package]]
@@ -1197,9 +1263,9 @@ dependencies = [
[[package]]
name = "gix-revwalk"
-version = "0.13.0"
+version = "0.13.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e0a7d393ae814eeaae41a333c0ff684b243121cc61ccdc5bbe9897094588047d"
+checksum = "4181db9cfcd6d1d0fd258e91569dbb61f94cb788b441b5294dd7f1167a3e788f"
dependencies = [
"gix-commitgraph",
"gix-date",
@@ -1259,13 +1325,13 @@ dependencies = [
[[package]]
name = "gix-transport"
-version = "0.42.0"
+version = "0.42.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9d2f783b2fe86bf2a8cf1f3b8669d65b01ab4932f32cc0101d3893e1b16a3bd6"
+checksum = "eb0ffa5f869977f5b9566399154055902f05d7e85c787d5eacf551acdd0c4adf"
dependencies = [
"bstr",
- "gix-command 0.3.6",
- "gix-features 0.38.1",
+ "gix-command 0.3.7",
+ "gix-features 0.38.2",
"gix-packetline 0.17.5",
"gix-quote",
"gix-sec",
@@ -1275,9 +1341,9 @@ dependencies = [
[[package]]
name = "gix-traverse"
-version = "0.39.0"
+version = "0.39.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f4029ec209b0cc480d209da3837a42c63801dd8548f09c1f4502c60accb62aeb"
+checksum = "f20cb69b63eb3e4827939f42c05b7756e3488ef49c25c412a876691d568ee2a0"
dependencies = [
"bitflags 2.5.0",
"gix-commitgraph",
@@ -1311,7 +1377,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0db829ebdca6180fbe32be7aed393591df6db4a72dbbc0b8369162390954d1cf"
dependencies = [
"bstr",
- "gix-features 0.38.1",
+ "gix-features 0.38.2",
"gix-path",
"home",
"thiserror",
@@ -1330,9 +1396,9 @@ dependencies = [
[[package]]
name = "gix-validate"
-version = "0.8.4"
+version = "0.8.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e39fc6e06044985eac19dd34d474909e517307582e462b2eb4c8fa51b6241545"
+checksum = "82c27dd34a49b1addf193c92070bcbf3beaf6e10f16a78544de6372e146a0acf"
dependencies = [
"bstr",
"thiserror",
@@ -1351,9 +1417,9 @@ dependencies = [
[[package]]
name = "hashbrown"
-version = "0.14.3"
+version = "0.14.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604"
+checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1"
[[package]]
name = "hmac"
@@ -1396,14 +1462,134 @@ dependencies = [
"cc",
]
+[[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.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1f8ac670d7422d7f76b32e17a5db556510825b29ec9154f235977c9caba61036"
+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.66",
+]
+
[[package]]
name = "idna"
-version = "0.5.0"
+version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6"
+checksum = "4716a3a0933a1d01c2f72450e89596eb51dd34ef3c211ccd875acdf1f8fe47ed"
dependencies = [
- "unicode-bidi",
- "unicode-normalization",
+ "icu_normalizer",
+ "icu_properties",
+ "smallvec",
+ "utf8_iter",
]
[[package]]
@@ -1455,6 +1641,12 @@ dependencies = [
"popol",
]
+[[package]]
+name = "is_terminal_polyfill"
+version = "1.70.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f8478577c03552c21db0e2724ffb8986a5ce7af88107e6be5d2ee6e158c12800"
+
[[package]]
name = "itoa"
version = "1.0.11"
@@ -1535,14 +1727,14 @@ checksum = "3af92c55d7d839293953fcd0fda5ecfe93297cfde6ffbdec13b41d99c0ba6607"
dependencies = [
"bitflags 2.5.0",
"libc",
- "redox_syscall",
+ "redox_syscall 0.4.1",
]
[[package]]
name = "libz-sys"
-version = "1.1.16"
+version = "1.1.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5e143b5e666b2695d28f6bca6497720813f699c9602dd7f5cac91008b8ada7f9"
+checksum = "c15da26e5af7e25c90b37a2d75cdbf940cf4a55316de9d84c679c9b8bfabf82e"
dependencies = [
"cc",
"libc",
@@ -1552,9 +1744,15 @@ dependencies = [
[[package]]
name = "linux-raw-sys"
-version = "0.4.13"
+version = "0.4.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c"
+checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89"
+
+[[package]]
+name = "litemap"
+version = "0.7.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "643cb0b8d4fcc284004d5fd0d67ccf61dfffadb7f75e1e71bc420f4688a3a704"
[[package]]
name = "localtime"
@@ -1567,9 +1765,9 @@ dependencies = [
[[package]]
name = "lock_api"
-version = "0.4.11"
+version = "0.4.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45"
+checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17"
dependencies = [
"autocfg",
"scopeguard",
@@ -1589,7 +1787,7 @@ checksum = "5cf92c10c7e361d6b99666ec1c6f9805b0bea2c3bd8c78dc6fe98ac5bd78db11"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.60",
+ "syn 2.0.66",
]
[[package]]
@@ -1609,9 +1807,9 @@ dependencies = [
[[package]]
name = "miniz_oxide"
-version = "0.7.2"
+version = "0.7.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9d811f3e15f28568be3407c8e7fdb6514c1cda3cb30683f15b6a1a1dc4ea14a7"
+checksum = "87dfd01fe195c66b572b37921ad8803d010623c0aca821bea2302239d155cdae"
dependencies = [
"adler",
]
@@ -1716,9 +1914,9 @@ dependencies = [
[[package]]
name = "num-iter"
-version = "0.1.44"
+version = "0.1.45"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d869c01cc0c455284163fd0092f1f93835385ccab5a98a0dcc497b2f8bf055a9"
+checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf"
dependencies = [
"autocfg",
"num-integer",
@@ -1727,9 +1925,9 @@ dependencies = [
[[package]]
name = "num-traits"
-version = "0.2.18"
+version = "0.2.19"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "da0df0e5185db44f69b44f26786fe401b6c293d1907744beaa7fa62b2e5a517a"
+checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841"
dependencies = [
"autocfg",
"libm",
@@ -1802,9 +2000,9 @@ dependencies = [
[[package]]
name = "parking_lot"
-version = "0.12.1"
+version = "0.12.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f"
+checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27"
dependencies = [
"lock_api",
"parking_lot_core",
@@ -1812,15 +2010,15 @@ dependencies = [
[[package]]
name = "parking_lot_core"
-version = "0.9.9"
+version = "0.9.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e"
+checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8"
dependencies = [
"cfg-if",
"libc",
- "redox_syscall",
+ "redox_syscall 0.5.1",
"smallvec",
- "windows-targets 0.48.5",
+ "windows-targets 0.52.5",
]
[[package]]
@@ -1875,6 +2073,12 @@ version = "0.3.30"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec"
+[[package]]
+name = "platforms"
+version = "3.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "db23d408679286588f4d4644f965003d056e3dd5abcaaa938116871d7ce2fee7"
+
[[package]]
name = "poly1305"
version = "0.8.0"
@@ -1964,9 +2168,9 @@ dependencies = [
[[package]]
name = "proc-macro2"
-version = "1.0.81"
+version = "1.0.85"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3d1597b0c024618f09a9c3b8655b7e430397a36d23fdafec26d6965e9eec3eba"
+checksum = "22244ce15aa966053a896d1accb3a6e68469b97c7f33f284b99f0d576879fc23"
dependencies = [
"unicode-ident",
]
@@ -2036,7 +2240,6 @@ dependencies = [
"radicle-cob",
"radicle-crypto",
"radicle-git-ext",
- "radicle-ssh",
"serde",
"serde_json",
"siphasher 1.0.1",
@@ -2069,10 +2272,11 @@ dependencies = [
"serde",
"serde_json",
"shlex",
+ "ssh-agent-lib",
"tempfile",
"thiserror",
"timeago",
- "tree-sitter",
+ "tree-sitter 0.20.10",
"tree-sitter-bash",
"tree-sitter-c",
"tree-sitter-css",
@@ -2148,9 +2352,9 @@ dependencies = [
"qcheck",
"qcheck-macros",
"radicle-git-ext",
- "radicle-ssh",
"serde",
"sqlite",
+ "ssh-agent-lib",
"ssh-key",
"tempfile",
"thiserror",
@@ -2171,12 +2375,12 @@ dependencies = [
"bstr",
"either",
"gix-actor",
- "gix-features 0.38.1",
+ "gix-features 0.38.2",
"gix-hash 0.14.2",
"gix-odb",
"gix-pack",
- "gix-protocol 0.45.0",
- "gix-transport 0.42.0",
+ "gix-protocol 0.45.1",
+ "gix-transport 0.42.1",
"log",
"nonempty 0.9.0",
"radicle",
@@ -2257,16 +2461,6 @@ dependencies = [
"libc",
]
-[[package]]
-name = "radicle-ssh"
-version = "0.9.0"
-dependencies = [
- "byteorder",
- "log",
- "thiserror",
- "zeroize",
-]
-
[[package]]
name = "radicle-std-ext"
version = "0.1.0"
@@ -2355,6 +2549,15 @@ dependencies = [
"getrandom",
]
+[[package]]
+name = "raunch"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1a67226789ccd419c55f5c826e04f7d58690b0593364f61bc8ed6e7dbbab49c5"
+dependencies = [
+ "libc",
+]
+
[[package]]
name = "redox_syscall"
version = "0.4.1"
@@ -2364,6 +2567,15 @@ dependencies = [
"bitflags 1.3.2",
]
+[[package]]
+name = "redox_syscall"
+version = "0.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "469052894dcb553421e483e4209ee581a45100d31b4018de03e5a7ad86374a7e"
+dependencies = [
+ "bitflags 2.5.0",
+]
+
[[package]]
name = "redox_termios"
version = "0.1.3"
@@ -2372,9 +2584,9 @@ checksum = "20145670ba436b55d91fc92d25e71160fbfbdd57831631c8d7d36377a476f1cb"
[[package]]
name = "regex"
-version = "1.10.4"
+version = "1.10.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c117dbdfde9c8308975b6a18d71f3f385c89461f7b3fb054288ecf2a2058ba4c"
+checksum = "b91213439dad192326a0d7c6ee3955910425f441d7038e0d6933b0aec5c4517f"
dependencies = [
"aho-corasick",
"memchr",
@@ -2384,9 +2596,9 @@ dependencies = [
[[package]]
name = "regex-automata"
-version = "0.4.6"
+version = "0.4.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "86b83b8b9847f9bf95ef68afb0b8e6cdb80f498442f5179a29fad448fcc1eaea"
+checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df"
dependencies = [
"aho-corasick",
"memchr",
@@ -2395,9 +2607,9 @@ dependencies = [
[[package]]
name = "regex-syntax"
-version = "0.8.3"
+version = "0.8.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "adad44e29e4c806119491a7f06f03de4d1af22c3a680dd47f1e6e179439d1f56"
+checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b"
[[package]]
name = "rfc6979"
@@ -2430,6 +2642,15 @@ dependencies = [
"zeroize",
]
+[[package]]
+name = "rustc_version"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366"
+dependencies = [
+ "semver",
+]
+
[[package]]
name = "rustix"
version = "0.38.34"
@@ -2445,9 +2666,9 @@ dependencies = [
[[package]]
name = "ryu"
-version = "1.0.17"
+version = "1.0.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1"
+checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f"
[[package]]
name = "salsa20"
@@ -2498,31 +2719,46 @@ dependencies = [
"zeroize",
]
+[[package]]
+name = "secrecy"
+version = "0.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9bd1c54ea06cfd2f6b63219704de0b9b4f72dcc2b8fdef820be6cd799780e91e"
+dependencies = [
+ "zeroize",
+]
+
+[[package]]
+name = "semver"
+version = "1.0.23"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b"
+
[[package]]
name = "serde"
-version = "1.0.198"
+version = "1.0.203"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9846a40c979031340571da2545a4e5b7c4163bdae79b301d5f86d03979451fcc"
+checksum = "7253ab4de971e72fb7be983802300c30b5a7f0c2e56fab8abfc6a214307c0094"
dependencies = [
"serde_derive",
]
[[package]]
name = "serde_derive"
-version = "1.0.198"
+version = "1.0.203"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e88edab869b01783ba905e7d0153f9fc1a6505a96e4ad3018011eedb838566d9"
+checksum = "500cbc0ebeb6f46627f50f3f5811ccf6bf00643be300b4c3eabc0ef55dc5b5ba"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.60",
+ "syn 2.0.66",
]
[[package]]
name = "serde_json"
-version = "1.0.116"
+version = "1.0.117"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3e17db7126d17feb94eb3fad46bf1a96b034e8aacbc2e775fe81505f8b0b2813"
+checksum = "455182ea6142b14f93f4bc5320a2b31c1f266b66a4a5c858b013302a5d8cbfc3"
dependencies = [
"indexmap",
"itoa",
@@ -2530,6 +2766,15 @@ dependencies = [
"serde",
]
+[[package]]
+name = "service-binding"
+version = "3.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "25663b9d8b83193ef83183edb3fd01e5447adb3e5baa35466ff9a6cd2408d6e8"
+dependencies = [
+ "raunch",
+]
+
[[package]]
name = "sha1_smol"
version = "1.0.0"
@@ -2624,9 +2869,9 @@ dependencies = [
[[package]]
name = "snapbox-macros"
-version = "0.3.8"
+version = "0.3.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e1c4b838b05d15ab22754068cb73500b2f3b07bf09d310e15b27f88160f1de40"
+checksum = "b1f4c14672714436c09254801c934b203196a51182a5107fb76591c7cc56424d"
dependencies = [
"anstream",
]
@@ -2697,6 +2942,21 @@ dependencies = [
"sqlite3-src",
]
+[[package]]
+name = "ssh-agent-lib"
+version = "0.4.0"
+source = "git+https://github.com/wiktor-k/ssh-agent-lib?rev=refs/pull/81/head#d247e7edd91b80fa31feb19d18aa427d68c58b0c"
+dependencies = [
+ "byteorder",
+ "secrecy",
+ "service-binding",
+ "signature 2.2.0",
+ "ssh-encoding",
+ "ssh-key",
+ "subtle",
+ "thiserror",
+]
+
[[package]]
name = "ssh-cipher"
version = "0.2.0"
@@ -2732,6 +2992,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ca9b366a80cf18bb6406f4cf4d10aebfb46140a8c0c33f666a144c5c76ecbafc"
dependencies = [
"bcrypt-pbkdf",
+ "ed25519-dalek",
+ "num-bigint-dig",
"p256",
"p384",
"p521",
@@ -2746,6 +3008,12 @@ dependencies = [
"zeroize",
]
+[[package]]
+name = "stable_deref_trait"
+version = "1.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3"
+
[[package]]
name = "subtle"
version = "2.5.0"
@@ -2765,20 +3033,31 @@ dependencies = [
[[package]]
name = "syn"
-version = "2.0.60"
+version = "2.0.66"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "909518bc7b1c9b779f1bbf07f2929d35af9f0f37e47c6e9ef7f9dddc1e1821f3"
+checksum = "c42f3f41a2de00b01c0aaad383c5a45241efc8b2d1eda5661812fda5f3cdcff5"
dependencies = [
"proc-macro2",
"quote",
"unicode-ident",
]
+[[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.66",
+]
+
[[package]]
name = "tar"
-version = "0.4.40"
+version = "0.4.41"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b16afcea1f22891c49a00c751c7b63b2233284064f11a200fc624137c51e2ddb"
+checksum = "cb797dad5fb5b76fcf519e702f4a589483b5ef06567f160c392832c1f5e44909"
dependencies = [
"filetime",
"libc",
@@ -2823,22 +3102,22 @@ dependencies = [
[[package]]
name = "thiserror"
-version = "1.0.59"
+version = "1.0.61"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f0126ad08bff79f29fc3ae6a55cc72352056dfff61e3ff8bb7129476d44b23aa"
+checksum = "c546c80d6be4bc6a00c0f01730c08df82eaa7a7a61f11d656526506112cc1709"
dependencies = [
"thiserror-impl",
]
[[package]]
name = "thiserror-impl"
-version = "1.0.59"
+version = "1.0.61"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d1cd413b5d558b4c5bf3680e324a6fa5014e7b7c067a51e69dbdf47eb7148b66"
+checksum = "46c3384250002a6d5af4d114f2845d37b57521033f30d5c3f46c4d70e1197533"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.60",
+ "syn 2.0.66",
]
[[package]]
@@ -2880,6 +3159,16 @@ version = "0.4.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a1710e589de0a76aaf295cd47a6699f6405737dbfd3cf2b75c92d000b548d0e6"
+[[package]]
+name = "tinystr"
+version = "0.7.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f"
+dependencies = [
+ "displaydoc",
+ "zerovec",
+]
+
[[package]]
name = "tinyvec"
version = "1.6.0"
@@ -2905,6 +3194,16 @@ dependencies = [
"regex",
]
+[[package]]
+name = "tree-sitter"
+version = "0.22.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "df7cc499ceadd4dcdf7ec6d4cbc34ece92c3fa07821e287aedecd4416c516dca"
+dependencies = [
+ "cc",
+ "regex",
+]
+
[[package]]
name = "tree-sitter-bash"
version = "0.20.5"
@@ -2912,7 +3211,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "57da2032c37eb2ce29fd18df7d3b94355fec8d6d854d8f80934955df542b5906"
dependencies = [
"cc",
- "tree-sitter",
+ "tree-sitter 0.20.10",
]
[[package]]
@@ -2922,7 +3221,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4bbd5f3d8658c08581f8f2adac6c391c2e9fa00fe9246bf6c5f52213b9cc6b72"
dependencies = [
"cc",
- "tree-sitter",
+ "tree-sitter 0.20.10",
]
[[package]]
@@ -2932,7 +3231,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c3306ddefa1d2681adda2613d11974ffabfbeb215e23235da6c862f3493a04fd"
dependencies = [
"cc",
- "tree-sitter",
+ "tree-sitter 0.20.10",
]
[[package]]
@@ -2942,7 +3241,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1ad6d11f19441b961af2fda7f12f5d0dac325f6d6de83836a1d3750018cc5114"
dependencies = [
"cc",
- "tree-sitter",
+ "tree-sitter 0.20.10",
]
[[package]]
@@ -2953,17 +3252,17 @@ checksum = "042342584c5a7a0b833d9fc4e2bdab3f9868ddc6c4b339a1e01451c6720868bc"
dependencies = [
"regex",
"thiserror",
- "tree-sitter",
+ "tree-sitter 0.20.10",
]
[[package]]
name = "tree-sitter-html"
-version = "0.20.0"
+version = "0.20.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "017822b6bd42843c4bd67fabb834f61ce23254e866282dd93871350fd6b7fa1d"
+checksum = "95b3492b08a786bf5cc79feb0ef2ff3b115d5174364e0ddfd7860e0b9b088b53"
dependencies = [
"cc",
- "tree-sitter",
+ "tree-sitter 0.22.6",
]
[[package]]
@@ -2973,7 +3272,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5a9a38a9c679b55cc8d17350381ec08d69fa1a17a53fcf197f344516e485ed4d"
dependencies = [
"cc",
- "tree-sitter",
+ "tree-sitter 0.20.10",
]
[[package]]
@@ -2983,7 +3282,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3c20d3ef8d202430b644a307e6299d84bf8ed87fa1b796e4638f8805a595060c"
dependencies = [
"cc",
- "tree-sitter",
+ "tree-sitter 0.20.10",
]
[[package]]
@@ -2993,7 +3292,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e6c93b1b1fbd0d399db3445f51fd3058e43d0b4dcff62ddbdb46e66550978aa5"
dependencies = [
"cc",
- "tree-sitter",
+ "tree-sitter 0.20.10",
]
[[package]]
@@ -3003,7 +3302,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "44d50ef383469df8485f024c5fb01faced8cb90368192a7ba02605b43b2427fe"
dependencies = [
"cc",
- "tree-sitter",
+ "tree-sitter 0.20.10",
]
[[package]]
@@ -3013,7 +3312,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b0832309b0b2b6d33760ce5c0e818cb47e1d72b468516bfe4134408926fa7594"
dependencies = [
"cc",
- "tree-sitter",
+ "tree-sitter 0.20.10",
]
[[package]]
@@ -3023,7 +3322,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ca517f578a98b23d20780247cc2688407fa81effad5b627a5a364ec3339b53e8"
dependencies = [
"cc",
- "tree-sitter",
+ "tree-sitter 0.20.10",
]
[[package]]
@@ -3033,7 +3332,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c8bc1d2c24276a48ef097a71b56888ac9db63717e8f8d0b324668a27fd619670"
dependencies = [
"cc",
- "tree-sitter",
+ "tree-sitter 0.20.10",
]
[[package]]
@@ -3042,12 +3341,6 @@ version = "1.17.0"
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"
@@ -3080,9 +3373,9 @@ checksum = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202"
[[package]]
name = "unicode-width"
-version = "0.1.11"
+version = "0.1.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e51733f11c9c4f72aa0c160008246859e340b00807569a0da0e7a1079b27ba85"
+checksum = "0336d538f7abc86d282a4189614dfaa90810dfc2c6f6427eaf88e16311dd225d"
[[package]]
name = "universal-hash"
@@ -3096,20 +3389,32 @@ dependencies = [
[[package]]
name = "url"
-version = "2.5.0"
+version = "2.5.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633"
+checksum = "f7c25da092f0a868cdf09e8674cd3b7ef3a7d92a24253e663a2fb85e2496de56"
dependencies = [
"form_urlencoded",
"idna",
"percent-encoding",
]
+[[package]]
+name = "utf16_iter"
+version = "1.0.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246"
+
+[[package]]
+name = "utf8_iter"
+version = "1.0.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be"
+
[[package]]
name = "utf8parse"
-version = "0.2.1"
+version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a"
+checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821"
[[package]]
name = "vcpkg"
@@ -3160,7 +3465,7 @@ dependencies = [
"once_cell",
"proc-macro2",
"quote",
- "syn 2.0.60",
+ "syn 2.0.66",
"wasm-bindgen-shared",
]
@@ -3182,7 +3487,7 @@ checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.60",
+ "syn 2.0.66",
"wasm-bindgen-backend",
"wasm-bindgen-shared",
]
@@ -3195,9 +3500,9 @@ checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96"
[[package]]
name = "winapi-util"
-version = "0.1.7"
+version = "0.1.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "134306a13c5647ad6453e8deaec55d3a44d6021970129e6188735e74bf546697"
+checksum = "4d4cc384e1e73b93bafa6fb4f1df8c41695c8a91cf9c4c64358067d15a7b6c6b"
dependencies = [
"windows-sys 0.52.0",
]
@@ -3361,13 +3666,25 @@ dependencies = [
[[package]]
name = "winnow"
-version = "0.6.8"
+version = "0.6.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c3c52e9c97a68071b23e836c9380edae937f17b9c4667bd021973efc689f618d"
+checksum = "59b5e5f6c299a3c7890b876a2a587f3115162487e704907d9b6cd29473052ba1"
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"
@@ -3385,8 +3702,75 @@ version = "0.5.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "09041cd90cf85f7f8b2df60c646f853b7f535ce68f85244eb6731cf89fa498ec"
+[[package]]
+name = "yoke"
+version = "0.7.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6c5b1314b079b0930c31e3af543d8ee1757b1951ae1e1565ec704403a7240ca5"
+dependencies = [
+ "serde",
+ "stable_deref_trait",
+ "yoke-derive",
+ "zerofrom",
+]
+
+[[package]]
+name = "yoke-derive"
+version = "0.7.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "28cc31741b18cb6f1d5ff12f5b7523e3d6eb0852bbbad19d73905511d9849b95"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.66",
+ "synstructure",
+]
+
+[[package]]
+name = "zerofrom"
+version = "0.1.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "91ec111ce797d0e0784a1116d0ddcdbea84322cd79e5d5ad173daeba4f93ab55"
+dependencies = [
+ "zerofrom-derive",
+]
+
+[[package]]
+name = "zerofrom-derive"
+version = "0.1.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0ea7b4a3637ea8669cedf0f1fd5c286a17f3de97b8dd5a70a6c167a1730e63a5"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.66",
+ "synstructure",
+]
+
[[package]]
name = "zeroize"
-version = "1.7.0"
+version = "1.8.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde"
+
+[[package]]
+name = "zerovec"
+version = "0.10.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bb2cc8827d6c0994478a15c53f374f46fbd41bea663d809b14744bc42e6b109c"
+dependencies = [
+ "yoke",
+ "zerofrom",
+ "zerovec-derive",
+]
+
+[[package]]
+name = "zerovec-derive"
+version = "0.10.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d"
+checksum = "97cf56601ee5052b4417d90c8755c6683473c926039908196cf35d99f893ebe7"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.66",
+]
diff --git a/Cargo.toml b/Cargo.toml
index 42cef9bae..25cf9dcdd 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -11,7 +11,6 @@ members = [
"radicle-fetch",
"radicle-node",
"radicle-remote-helper",
- "radicle-ssh",
"radicle-tools",
"radicle-signals",
]
@@ -22,7 +21,6 @@ default-members = [
"radicle-crdt",
"radicle-crypto",
"radicle-node",
- "radicle-ssh",
"radicle-remote-helper",
"radicle-term",
"radicle-signals",
diff --git a/radicle-cli/Cargo.toml b/radicle-cli/Cargo.toml
index 9de7d03da..e537b6b18 100644
--- a/radicle-cli/Cargo.toml
+++ b/radicle-cli/Cargo.toml
@@ -45,6 +45,7 @@ tree-sitter-bash = { version = "0.20" }
tree-sitter-go = { version = "0.20.0" }
tree-sitter-md = { version = "0.1.5" }
zeroize = { version = "1.1" }
+ssh-agent-lib = { version = "0.4.0", git = "https://github.com/wiktor-k/ssh-agent-lib", rev = "refs/pull/81/head", default-features = false }
[dependencies.radicle]
version = "0.11.0"
diff --git a/radicle-cli/src/commands/auth.rs b/radicle-cli/src/commands/auth.rs
index fe13ac884..b780e5881 100644
--- a/radicle-cli/src/commands/auth.rs
+++ b/radicle-cli/src/commands/auth.rs
@@ -1,6 +1,6 @@
#![allow(clippy::or_fun_call)]
use std::ffi::OsString;
-use std::ops::Not as _;
+use std::ops::{Deref as _, Not as _};
use std::str::FromStr;
use anyhow::anyhow;
@@ -126,7 +126,7 @@ pub fn init(options: Options) -> anyhow::Result<()> {
spinner.warn();
}
}
- Err(e) if e.is_not_running() => {
+ Err(_) if ssh::agent::Agent::pid().is_none() => {
agent = false;
}
Err(e) => Err(e)?,
@@ -180,7 +180,16 @@ pub fn authenticate(options: Options, profile: &Profile) -> anyhow::Result<()> {
// register it; only if it is running.
match ssh::agent::Agent::connect() {
Ok(mut agent) => {
- if agent.request_identities()?.contains(&profile.public_key) {
+ let ids = agent.request_identities().unwrap();
+ let has_pubkey = ids.iter().any(|id| {
+ if let ssh_agent_lib::ssh_key::public::KeyData::Ed25519(key) = id.pubkey {
+ *key.as_ref() == **profile.public_key.deref()
+ } else {
+ false
+ }
+ });
+
+ if has_pubkey {
term::success!("Radicle key already in ssh-agent");
return Ok(());
}
@@ -197,7 +206,7 @@ pub fn authenticate(options: Options, profile: &Profile) -> anyhow::Result<()> {
return Ok(());
}
- Err(e) if e.is_not_running() => {}
+ Err(_) if ssh::agent::Agent::pid().is_none() => {}
Err(e) => Err(e)?,
};
diff --git a/radicle-cli/src/commands/self.rs b/radicle-cli/src/commands/self.rs
index aad6768a8..365f196f7 100644
--- a/radicle-cli/src/commands/self.rs
+++ b/radicle-cli/src/commands/self.rs
@@ -144,11 +144,15 @@ fn all(profile: &Profile) -> anyhow::Result<()> {
]);
let ssh_agent = match ssh::agent::Agent::connect() {
- Ok(c) => term::format::positive(format!(
+ Ok(_) => term::format::positive(format!(
"running ({})",
- c.pid().map(|p| p.to_string()).unwrap_or(String::from("?"))
+ ssh::agent::Agent::pid()
+ .map(|p| p.to_string())
+ .unwrap_or(String::from("?"))
)),
- Err(e) if e.is_not_running() => term::format::yellow(String::from("not running")),
+ Err(_) if ssh::agent::Agent::pid().is_none() => {
+ term::format::yellow(String::from("not running"))
+ }
Err(e) => term::format::negative(format!("error: {e}")),
};
table.push([
diff --git a/radicle-crypto/Cargo.toml b/radicle-crypto/Cargo.toml
index d14900e44..d0b9bc9cd 100644
--- a/radicle-crypto/Cargo.toml
+++ b/radicle-crypto/Cargo.toml
@@ -13,7 +13,7 @@ edition = "2021"
[features]
test = ["fastrand", "qcheck"]
-ssh = ["radicle-ssh", "ssh-key"]
+ssh = ["ssh-agent-lib", "ssh-key"]
[dependencies]
amplify = { version = "4.0.0" }
@@ -25,6 +25,7 @@ serde = { version = "1", features = ["derive"] }
sqlite = { version = "0.32.0", optional = true, features = ["bundled"] }
thiserror = { version = "1" }
zeroize = { version = "1.5.7" }
+ssh-agent-lib = { version = "0.4.0", git = "https://github.com/wiktor-k/ssh-agent-lib", rev = "refs/pull/81/head", default-features = false, optional = true }
[dependencies.radicle-git-ext]
version = "0.7.0"
@@ -42,12 +43,6 @@ version = "1"
default-features = false
optional = true
-[dependencies.radicle-ssh]
-path = "../radicle-ssh"
-version = "0"
-default-features = false
-optional = true
-
[dev-dependencies]
fastrand = { version = "2.0.0", default-features = false }
qcheck-macros = { version = "1", default-features = false }
diff --git a/radicle-crypto/src/ssh.rs b/radicle-crypto/src/ssh.rs
index 1f7e7e54d..9f7c5683a 100644
--- a/radicle-crypto/src/ssh.rs
+++ b/radicle-crypto/src/ssh.rs
@@ -5,13 +5,7 @@ use std::io;
use thiserror::Error;
-use radicle_ssh::encoding;
-use radicle_ssh::encoding::Encodable;
-use radicle_ssh::encoding::Encoding;
-use radicle_ssh::encoding::Reader;
-
use crate as crypto;
-use crate::PublicKey;
pub use keystore::{Keystore, Passphrase};
@@ -126,76 +120,25 @@ pub enum SignatureError {
#[error(transparent)]
Invalid(#[from] crypto::Error),
#[error(transparent)]
- Encoding(#[from] encoding::Error),
+ Encoding(#[from] ssh_agent_lib::proto::ProtoError),
#[error("unknown algorithm '{0}'")]
UnknownAlgorithm(String),
}
-impl Encodable for crypto::Signature {
- type Error = SignatureError;
-
- fn read(r: &mut encoding::Cursor) -> Result<Self, Self::Error> {
- let buf = r.read_string()?;
- let mut inner_strs = buf.reader(0);
-
- let sig_type = inner_strs.read_string()?;
- if sig_type != b"ssh-ed25519" {
- return Err(SignatureError::UnknownAlgorithm(
- String::from_utf8_lossy(sig_type).to_string(),
- ));
- }
- let sig = crypto::Signature::try_from(inner_strs.read_string()?)?;
-
- Ok(sig)
- }
-
- fn write<E: Encoding>(&self, buf: &mut E) {
- let mut inner_strs = Vec::new();
- inner_strs.extend_ssh_string(b"ssh-ed25519");
- inner_strs.extend_ssh_string(self.as_ref());
- buf.extend_ssh_string(&inner_strs);
- }
-}
-
#[derive(Debug, Error)]
pub enum PublicKeyError {
#[error(transparent)]
Invalid(#[from] crypto::Error),
#[error(transparent)]
- Encoding(#[from] encoding::Error),
+ Encoding(#[from] ssh_agent_lib::proto::ProtoError),
#[error("unknown algorithm '{0}'")]
UnknownAlgorithm(String),
}
-impl Encodable for PublicKey {
- type Error = PublicKeyError;
-
- fn read(r: &mut encoding::Cursor) -> Result<Self, Self::Error> {
- match r.read_string()? {
- b"ssh-ed25519" => {
- let s = r.read_string()?;
- let p = PublicKey::try_from(s)?;
-
- Ok(p)
- }
- v => Err(PublicKeyError::UnknownAlgorithm(
- String::from_utf8_lossy(v).to_string(),
- )),
- }
- }
-
- fn write<E: Encoding>(&self, w: &mut E) {
- let mut str_w: Vec<u8> = Vec::<u8>::new();
- str_w.extend_ssh_string(b"ssh-ed25519");
- str_w.extend_ssh_string(&self[..]);
- w.extend_ssh_string(&str_w)
- }
-}
-
#[derive(Debug, Error)]
pub enum SecretKeyError {
#[error(transparent)]
- Encoding(#[from] encoding::Error),
+ Encoding(#[from] ssh_agent_lib::proto::ProtoError),
#[error(transparent)]
Crypto(#[from] crypto::Error),
#[error(transparent)]
@@ -206,80 +149,13 @@ pub enum SecretKeyError {
Mismatch,
}
-impl Encodable for crypto::SecretKey {
- type Error = SecretKeyError;
-
- fn read(r: &mut encoding::Cursor) -> Result<Self, Self::Error> {
- match r.read_string()? {
- b"ssh-ed25519" => {
- let public = r.read_string()?;
- let pair = r.read_string()?;
- let _comment = r.read_string()?;
- let key = crypto::SecretKey::try_from(pair)?;
-
- if public != key.public_key().as_ref() {
- return Err(SecretKeyError::Mismatch);
- }
- Ok(key)
- }
- s => Err(SecretKeyError::UnknownAlgorithm(
- String::from_utf8_lossy(s).to_string(),
- )),
- }
- }
-
- fn write<E: Encoding>(&self, buf: &mut E) {
- let public = self.0.public_key();
-
- buf.extend_ssh_string(b"ssh-ed25519");
- buf.extend_ssh_string(public.as_ref());
- buf.extend_ssh_string(self.0.as_ref());
- buf.extend_ssh_string(b"radicle");
- }
-}
-
#[cfg(test)]
mod test {
- use std::sync::{Arc, Mutex};
-
- use qcheck_macros::quickcheck;
-
- use crate as crypto;
- use crate::{PublicKey, SecretKey};
- use radicle_ssh::agent::client::{AgentClient, ClientStream, Error};
- use radicle_ssh::encoding::*;
-
- #[derive(Clone, Default)]
- struct DummyStream {
- incoming: Arc<Mutex<Vec<u8>>>,
- }
-
- impl ClientStream for DummyStream {
- fn connect<P>(_path: P) -> Result<AgentClient<Self>, Error>
- where
- P: AsRef<std::path::Path> + Send,
- {
- panic!("This function should never be called!")
- }
-
- fn request(&mut self, buf: &[u8]) -> Result<Buffer, Error> {
- *self.incoming.lock().unwrap() = buf.to_vec();
-
- Ok(Buffer::default())
- }
- }
-
- #[quickcheck]
- fn prop_encode_decode_sk(input: [u8; 64]) {
- let mut buf = Buffer::default();
- let sk = crypto::SecretKey::from(input);
- sk.write(&mut buf);
-
- let mut cursor = buf.reader(0);
- let output = SecretKey::read(&mut cursor).unwrap();
-
- assert_eq!(sk, output);
- }
+ use crate::PublicKey;
+ use ssh_agent_lib::blocking::Client;
+ use ssh_agent_lib::proto::SignRequest;
+ use ssh_agent_lib::ssh_key::public::{Ed25519PublicKey, KeyData};
+ use std::ops::Deref;
#[test]
fn test_agent_encoding_remove() {
@@ -297,15 +173,15 @@ mod test {
37, 145, 51, 176, 174, 61, 136, 160, 107, 4, 95, 175, 144, // Key
];
- let stream = DummyStream::default();
- let mut agent = AgentClient::connect(stream.clone());
+ let mut client = Client::new(std::io::Cursor::new(vec![]));
- agent.remove_identity(&pk).unwrap();
+ client
+ .remove_identity(ssh_agent_lib::proto::RemoveIdentity {
+ pubkey: KeyData::Ed25519(Ed25519PublicKey(**pk.deref())),
+ })
+ .ok();
- assert_eq!(
- stream.incoming.lock().unwrap().as_slice(),
- expected.as_slice()
- );
+ assert_eq!(client.into_inner().into_inner(), expected.as_slice());
}
#[test]
@@ -327,15 +203,17 @@ mod test {
0, 0, 0, 0, // Signature flags
];
- let stream = DummyStream::default();
- let mut agent = AgentClient::connect(stream.clone());
+ let mut client = Client::new(std::io::Cursor::new(vec![]));
let data: Vec<u8> = vec![1, 2, 3, 4, 5, 6, 7, 8, 9];
- agent.sign(&pk, &data).ok();
+ client
+ .sign(SignRequest {
+ pubkey: KeyData::Ed25519(Ed25519PublicKey(**pk.deref())),
+ data: data.clone(),
+ flags: 0,
+ })
+ .ok();
- assert_eq!(
- stream.incoming.lock().unwrap().as_slice(),
- expected.as_slice()
- );
+ assert_eq!(client.into_inner().into_inner(), expected);
}
}
diff --git a/radicle-crypto/src/ssh/agent.rs b/radicle-crypto/src/ssh/agent.rs
index 6f3d9854c..b18778420 100644
--- a/radicle-crypto/src/ssh/agent.rs
+++ b/radicle-crypto/src/ssh/agent.rs
@@ -1,9 +1,9 @@
use std::ops::{Deref, DerefMut};
use std::sync::Mutex;
-pub use radicle_ssh::agent::client::AgentClient;
-pub use radicle_ssh::agent::client::Error;
-pub use radicle_ssh::{self as ssh, agent::client::ClientStream};
+use ssh_agent_lib::proto::Credential;
+pub use ssh_agent_lib::proto::ProtoError as Error;
+use ssh_key::public::KeyData;
use crate::{PublicKey, SecretKey, Signature, Signer, SignerError};
@@ -13,28 +13,50 @@ pub use std::net::TcpStream as Stream;
pub use std::os::unix::net::UnixStream as Stream;
pub struct Agent {
- client: AgentClient<Stream>,
+ client: ssh_agent_lib::blocking::Client<Stream>,
}
impl Agent {
/// Connect to a running SSH agent.
- pub fn connect() -> Result<Self, ssh::agent::client::Error> {
- Stream::connect_env().map(|client| Self { client })
+ pub fn connect() -> Result<Self, Error> {
+ Ok(Agent {
+ client: ssh_agent_lib::blocking::Client::new(Stream::connect(
+ std::env::var("SSH_AUTH_SOCK").unwrap(),
+ )?),
+ })
}
/// Register a key with the agent.
- pub fn register(&mut self, key: &SecretKey) -> Result<(), ssh::Error> {
- self.client.add_identity(key, &[])
+ pub fn register(&mut self, key: &SecretKey) -> Result<(), Error> {
+ self.client
+ .add_identity(ssh_agent_lib::proto::AddIdentity {
+ credential: Credential::Key {
+ privkey: ssh_key::private::KeypairData::Ed25519(
+ ssh_key::private::Ed25519Keypair::from_bytes(&*key.deref()).unwrap(),
+ ),
+ comment: "".into(),
+ },
+ })
+ .unwrap();
+
+ Ok(())
}
/// Get a signer from this agent, given the public key.
pub fn signer(self, key: PublicKey) -> AgentSigner {
AgentSigner::new(self, key)
}
+
+ pub fn pid() -> Option<u32> {
+ use std::str::FromStr;
+ std::env::var("SSH_AGENT_PID")
+ .ok()
+ .and_then(|v| u32::from_str(&v).ok())
+ }
}
impl Deref for Agent {
- type Target = AgentClient<Stream>;
+ type Target = ssh_agent_lib::blocking::Client<Stream>;
fn deref(&self) -> &Self::Target {
&self.client
@@ -61,9 +83,14 @@ impl AgentSigner {
}
pub fn is_ready(&self) -> Result<bool, Error> {
- let ids = self.agent.lock().unwrap().request_identities()?;
-
- Ok(ids.contains(&self.public))
+ let ids = self.agent.lock().unwrap().request_identities().unwrap();
+ Ok(ids.iter().any(|id| {
+ if let KeyData::Ed25519(key) = id.pubkey {
+ *key.as_ref() == **self.public.deref()
+ } else {
+ false
+ }
+ }))
}
/// Box this signer into a [`Signer`].
@@ -85,11 +112,14 @@ impl Signer for AgentSigner {
let sig = self
.agent
.lock()
- // We'll take our chances here; the worse that can happen is the agent returns an error.
.unwrap_or_else(|e| e.into_inner())
- .sign(&self.public, msg)
+ .sign(ssh_agent_lib::proto::SignRequest {
+ pubkey: KeyData::Ed25519(ssh_key::public::Ed25519PublicKey(**self.public.deref())),
+ data: msg.into(),
+ flags: 0,
+ })
.map_err(SignerError::new)?;
-
- Ok(Signature::from(sig))
+ let bytes: [u8; 64] = sig.as_bytes().try_into().unwrap();
+ Ok(Signature::from(bytes))
}
}
diff --git a/radicle-ssh/Cargo.toml b/radicle-ssh/Cargo.toml
deleted file mode 100644
index 50add46b7..000000000
--- a/radicle-ssh/Cargo.toml
+++ /dev/null
@@ -1,19 +0,0 @@
-[package]
-name = "radicle-ssh"
-description = "Radicle SSH library"
-homepage = "https://radicle.xyz"
-repository = "https://app.radicle.xyz/seeds/seed.radicle.xyz/rad:z3gqcJUoA1n9HaHKufZs5FCSGazv5"
-license = "Apache-2.0"
-version = "0.9.0"
-authors = [
- "Fintan Halpenny <fintan.halpenny@gmail.com>",
- "Pierre-Étienne Meunier <pe@pijul.org>",
- "cloudhead <cloudhead@radicle.xyz>"
-]
-edition = "2021"
-
-[dependencies]
-byteorder = "1.4"
-log = "0.4"
-thiserror = "1.0"
-zeroize = "1.5.7"
diff --git a/radicle-ssh/LICENSE b/radicle-ssh/LICENSE
deleted file mode 100644
index f433b1a53..000000000
--- a/radicle-ssh/LICENSE
+++ /dev/null
@@ -1,177 +0,0 @@
-
- Apache License
- Version 2.0, January 2004
- http://www.apache.org/licenses/
-
- TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
- 1. Definitions.
-
- "License" shall mean the terms and conditions for use, reproduction,
- and distribution as defined by Sections 1 through 9 of this document.
-
- "Licensor" shall mean the copyright owner or entity authorized by
- the copyright owner that is granting the License.
-
- "Legal Entity" shall mean the union of the acting entity and all
- other entities that control, are controlled by, or are under common
- control with that entity. For the purposes of this definition,
- "control" means (i) the power, direct or indirect, to cause the
- direction or management of such entity, whether by contract or
- otherwise, or (ii) ownership of fifty percent (50%) or more of the
- outstanding shares, or (iii) beneficial ownership of such entity.
-
- "You" (or "Your") shall mean an individual or Legal Entity
- exercising permissions granted by this License.
-
- "Source" form shall mean the preferred form for making modifications,
- including but not limited to software source code, documentation
- source, and configuration files.
-
- "Object" form shall mean any form resulting from mechanical
- transformation or translation of a Source form, including but
- not limited to compiled object code, generated documentation,
- and conversions to other media types.
-
- "Work" shall mean the work of authorship, whether in Source or
- Object form, made available under the License, as indicated by a
- copyright notice that is included in or attached to the work
- (an example is provided in the Appendix below).
-
- "Derivative Works" shall mean any work, whether in Source or Object
- form, that is based on (or derived from) the Work and for which the
- editorial revisions, annotations, elaborations, or other modifications
- represent, as a whole, an original work of authorship. For the purposes
- of this License, Derivative Works shall not include works that remain
- separable from, or merely link (or bind by name) to the interfaces of,
- the Work and Derivative Works thereof.
-
- "Contribution" shall mean any work of authorship, including
- the original version of the Work and any modifications or additions
- to that Work or Derivative Works thereof, that is intentionally
- submitted to Licensor for inclusion in the Work by the copyright owner
- or by an individual or Legal Entity authorized to submit on behalf of
- the copyright owner. For the purposes of this definition, "submitted"
- means any form of electronic, verbal, or written communication sent
- to the Licensor or its representatives, including but not limited to
- communication on electronic mailing lists, source code control systems,
- and issue tracking systems that are managed by, or on behalf of, the
- Licensor for the purpose of discussing and improving the Work, but
- excluding communication that is conspicuously marked or otherwise
- designated in writing by the copyright owner as "Not a Contribution."
-
- "Contributor" shall mean Licensor and any individual or Legal Entity
- on behalf of whom a Contribution has been received by Licensor and
- subsequently incorporated within the Work.
-
- 2. Grant of Copyright License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- copyright license to reproduce, prepare Derivative Works of,
- publicly display, publicly perform, sublicense, and distribute the
- Work and such Derivative Works in Source or Object form.
-
- 3. Grant of Patent License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- (except as stated in this section) patent license to make, have made,
- use, offer to sell, sell, import, and otherwise transfer the Work,
- where such license applies only to those patent claims licensable
- by such Contributor that are necessarily infringed by their
- Contribution(s) alone or by combination of their Contribution(s)
- with the Work to which such Contribution(s) was submitted. If You
- institute patent litigation against any entity (including a
- cross-claim or counterclaim in a lawsuit) alleging that the Work
- or a Contribution incorporated within the Work constitutes direct
- or contributory patent infringement, then any patent licenses
- granted to You under this License for that Work shall terminate
- as of the date such litigation is filed.
-
- 4. Redistribution. You may reproduce and distribute copies of the
- Work or Derivative Works thereof in any medium, with or without
- modifications, and in Source or Object form, provided that You
- meet the following conditions:
-
- (a) You must give any other recipients of the Work or
- Derivative Works a copy of this License; and
-
- (b) You must cause any modified files to carry prominent notices
- stating that You changed the files; and
-
- (c) You must retain, in the Source form of any Derivative Works
- that You distribute, all copyright, patent, trademark, and
- attribution notices from the Source form of the Work,
- excluding those notices that do not pertain to any part of
- the Derivative Works; and
-
- (d) If the Work includes a "NOTICE" text file as part of its
- distribution, then any Derivative Works that You distribute must
- include a readable copy of the attribution notices contained
- within such NOTICE file, excluding those notices that do not
- pertain to any part of the Derivative Works, in at least one
- of the following places: within a NOTICE text file distributed
- as part of the Derivative Works; within the Source form or
- documentation, if provided along with the Derivative Works; or,
- within a display generated by the Derivative Works, if and
- wherever such third-party notices normally appear. The contents
- of the NOTICE file are for informational purposes only and
- do not modify the License. You may add Your own attribution
- notices within Derivative Works that You distribute, alongside
- or as an addendum to the NOTICE text from the Work, provided
- that such additional attribution notices cannot be construed
- as modifying the License.
-
- You may add Your own copyright statement to Your modifications and
- may provide additional or different license terms and conditions
- for use, reproduction, or distribution of Your modifications, or
- for any such Derivative Works as a whole, provided Your use,
- reproduction, and distribution of the Work otherwise complies with
- the conditions stated in this License.
-
- 5. Submission of Contributions. Unless You explicitly state otherwise,
- any Contribution intentionally submitted for inclusion in the Work
- by You to the Licensor shall be under the terms and conditions of
- this License, without any additional terms or conditions.
- Notwithstanding the above, nothing herein shall supersede or modify
- the terms of any separate license agreement you may have executed
- with Licensor regarding such Contributions.
-
- 6. Trademarks. This License does not grant permission to use the trade
- names, trademarks, service marks, or product names of the Licensor,
- except as required for reasonable and customary use in describing the
- origin of the Work and reproducing the content of the NOTICE file.
-
- 7. Disclaimer of Warranty. Unless required by applicable law or
- agreed to in writing, Licensor provides the Work (and each
- Contributor provides its Contributions) on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- implied, including, without limitation, any warranties or conditions
- of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
- PARTICULAR PURPOSE. You are solely responsible for determining the
- appropriateness of using or redistributing the Work and assume any
- risks associated with Your exercise of permissions under this License.
-
- 8. Limitation of Liability. In no event and under no legal theory,
- whether in tort (including negligence), contract, or otherwise,
- unless required by applicable law (such as deliberate and grossly
- negligent acts) or agreed to in writing, shall any Contributor be
- liable to You for damages, including any direct, indirect, special,
- incidental, or consequential damages of any character arising as a
- result of this License or out of the use or inability to use the
- Work (including but not limited to damages for loss of goodwill,
- work stoppage, computer failure or malfunction, or any and all
- other commercial damages or losses), even if such Contributor
- has been advised of the possibility of such damages.
-
- 9. Accepting Warranty or Additional Liability. While redistributing
- the Work or Derivative Works thereof, You may choose to offer,
- and charge a fee for, acceptance of support, warranty, indemnity,
- or other liability obligations and/or rights consistent with this
- License. However, in accepting such obligations, You may act only
- on Your own behalf and on Your sole responsibility, not on behalf
- of any other Contributor, and only if You agree to indemnify,
- defend, and hold each Contributor harmless for any liability
- incurred by, or claims asserted against, such Contributor by reason
- of your accepting any such warranty or additional liability.
-
- END OF TERMS AND CONDITIONS
diff --git a/radicle-ssh/src/agent.rs b/radicle-ssh/src/agent.rs
deleted file mode 100644
index fd54bf856..000000000
--- a/radicle-ssh/src/agent.rs
+++ /dev/null
@@ -1,15 +0,0 @@
-/// Write clients for SSH agents.
-pub mod client;
-
-mod msg;
-
-/// Constraints on how keys can be used.
-#[derive(Debug, PartialEq, Eq)]
-pub enum Constraint {
- /// The key shall disappear from the agent's memory after that many seconds.
- KeyLifetime { seconds: u32 },
- /// Signatures need to be confirmed by the agent (for instance using a dialog).
- Confirm,
- /// Custom constraints
- Extensions { name: Vec<u8>, details: Vec<u8> },
-}
diff --git a/radicle-ssh/src/agent/client.rs b/radicle-ssh/src/agent/client.rs
deleted file mode 100644
index 881c16fc6..000000000
--- a/radicle-ssh/src/agent/client.rs
+++ /dev/null
@@ -1,423 +0,0 @@
-use std::fmt;
-use std::io::{Read, Write};
-use std::ops::DerefMut;
-use std::os::unix::net::UnixStream;
-use std::path::Path;
-use std::str::FromStr;
-
-use byteorder::{BigEndian, ByteOrder, WriteBytesExt};
-use log::*;
-use thiserror::Error;
-use zeroize::Zeroize as _;
-
-use crate::agent::msg;
-use crate::agent::Constraint;
-use crate::encoding::{self, Encodable};
-use crate::encoding::{Buffer, Encoding, Reader};
-
-/// An ed25519 Signature.
-pub type Signature = [u8; 64];
-
-#[derive(Debug, Error)]
-pub enum Error {
- /// Agent protocol error.
- #[error("Agent protocol error")]
- AgentProtocolError,
- #[error("Agent failure")]
- AgentFailure,
- #[error("Unable to connect to ssh-agent. The environment variable `SSH_AUTH_SOCK` was set, but it points to a nonexistent file or directory.")]
- BadAuthSock,
- #[error(transparent)]
- Encoding(#[from] encoding::Error),
- #[error("Environment variable `{0}` not found")]
- EnvVar(&'static str),
- #[error(transparent)]
- Io(#[from] std::io::Error),
- #[error(transparent)]
- Private(Box<dyn std::error::Error + Send + Sync + 'static>),
- #[error(transparent)]
- Public(Box<dyn std::error::Error + Send + Sync + 'static>),
- #[error(transparent)]
- Signature(Box<dyn std::error::Error + Send + Sync + 'static>),
-}
-
-impl Error {
- pub fn is_not_running(&self) -> bool {
- matches!(self, Self::EnvVar("SSH_AUTH_SOCK"))
- }
-}
-
-/// SSH agent client.
-pub struct AgentClient<S> {
- stream: S,
-}
-
-impl<S> AgentClient<S> {
- /// Connect to an SSH agent via the provided stream (on Unix, usually a Unix-domain socket).
- pub fn connect(stream: S) -> Self {
- AgentClient { stream }
- }
-
- /// Get the agent PID.
- pub fn pid(&self) -> Option<u32> {
- std::env::var("SSH_AGENT_PID")
- .ok()
- .and_then(|v| u32::from_str(&v).ok())
- }
-}
-
-pub trait ClientStream: Sized + Send + Sync {
- /// Send an agent request through the stream and read the response.
- fn request(&mut self, req: &[u8]) -> Result<Buffer, Error>;
-
- /// How to connect the streaming socket
- fn connect<P>(path: P) -> Result<AgentClient<Self>, Error>
- where
- P: AsRef<Path> + Send;
-
- fn connect_env() -> Result<AgentClient<Self>, Error> {
- let Ok(var) = std::env::var("SSH_AUTH_SOCK") else {
- return Err(Error::EnvVar("SSH_AUTH_SOCK"));
- };
- match Self::connect(var) {
- Err(Error::Io(io_err)) if io_err.kind() == std::io::ErrorKind::NotFound => {
- Err(Error::BadAuthSock)
- }
- other => other,
- }
- }
-}
-
-impl<S: ClientStream> AgentClient<S> {
- /// Send a key to the agent, with a (possibly empty) slice of constraints
- /// to apply when using the key to sign.
- pub fn add_identity<K>(&mut self, key: &K, constraints: &[Constraint]) -> Result<(), Error>
- where
- K: Encodable,
- K::Error: std::error::Error + Send + Sync + 'static,
- {
- let mut buf = Buffer::default();
-
- buf.resize(4, 0);
-
- if constraints.is_empty() {
- buf.push(msg::ADD_IDENTITY)
- } else {
- buf.push(msg::ADD_ID_CONSTRAINED)
- }
- key.write(&mut buf);
-
- if !constraints.is_empty() {
- for cons in constraints {
- match *cons {
- Constraint::KeyLifetime { seconds } => {
- buf.push(msg::CONSTRAIN_LIFETIME);
- buf.deref_mut().write_u32::<BigEndian>(seconds)?
- }
- Constraint::Confirm => buf.push(msg::CONSTRAIN_CONFIRM),
- Constraint::Extensions {
- ref name,
- ref details,
- } => {
- buf.push(msg::CONSTRAIN_EXTENSION);
- buf.extend_ssh_string(name);
- buf.extend_ssh_string(details);
- }
- }
- }
- }
- buf.write_len();
- self.stream.request(&buf)?;
-
- Ok(())
- }
-
- /// Add a smart card to the agent, with a (possibly empty) set of
- /// constraints to apply when signing.
- pub fn add_smartcard_key(
- &mut self,
- id: &str,
- pin: &[u8],
- constraints: &[Constraint],
- ) -> Result<(), Error> {
- let mut buf = Buffer::default();
-
- buf.resize(4, 0);
-
- if constraints.is_empty() {
- buf.push(msg::ADD_SMARTCARD_KEY)
- } else {
- buf.push(msg::ADD_SMARTCARD_KEY_CONSTRAINED)
- }
- buf.extend_ssh_string(id.as_bytes());
- buf.extend_ssh_string(pin);
-
- if !constraints.is_empty() {
- buf.deref_mut()
- .write_u32::<BigEndian>(constraints.len() as u32)?;
- for cons in constraints {
- match *cons {
- Constraint::KeyLifetime { seconds } => {
- buf.push(msg::CONSTRAIN_LIFETIME);
- buf.deref_mut().write_u32::<BigEndian>(seconds)?;
- }
- Constraint::Confirm => buf.push(msg::CONSTRAIN_CONFIRM),
- Constraint::Extensions {
- ref name,
- ref details,
- } => {
- buf.push(msg::CONSTRAIN_EXTENSION);
- buf.extend_ssh_string(name);
- buf.extend_ssh_string(details);
- }
- }
- }
- }
- buf.write_len();
- self.stream.request(&buf)?;
-
- Ok(())
- }
-
- /// Lock the agent, making it refuse to sign until unlocked.
- pub fn lock(&mut self, passphrase: &[u8]) -> Result<(), Error> {
- let mut buf = Buffer::default();
-
- buf.resize(4, 0);
- buf.push(msg::LOCK);
- buf.extend_ssh_string(passphrase);
- buf.write_len();
-
- self.stream.request(&buf)?;
-
- Ok(())
- }
-
- /// Unlock the agent, allowing it to sign again.
- pub fn unlock(&mut self, passphrase: &[u8]) -> Result<(), Error> {
- let mut buf = Buffer::default();
- buf.resize(4, 0);
- buf.push(msg::UNLOCK);
- buf.extend_ssh_string(passphrase);
- buf.write_len();
-
- self.stream.request(&buf)?;
-
- Ok(())
- }
-
- /// Ask the agent for a list of the currently registered secret
- /// keys.
- pub fn request_identities<K>(&mut self) -> Result<Vec<K>, Error>
- where
- K: Encodable,
- K::Error: std::error::Error + Send + Sync + 'static,
- {
- let mut buf = Buffer::default();
- buf.resize(4, 0);
- buf.push(msg::REQUEST_IDENTITIES);
- buf.write_len();
-
- let mut keys = Vec::new();
- let resp = self.stream.request(&buf)?;
-
- if resp[0] == msg::IDENTITIES_ANSWER {
- let mut r = resp.reader(1);
- let n = r.read_u32()?;
-
- for _ in 0..n {
- let key = r.read_string()?;
- let _ = r.read_string()?;
- let mut r = key.reader(0);
-
- if let Ok(pk) = K::read(&mut r) {
- keys.push(pk);
- }
- }
- }
-
- Ok(keys)
- }
-
- /// Ask the agent to sign the supplied piece of data.
- pub fn sign<K>(&mut self, public: &K, data: &[u8]) -> Result<Signature, Error>
- where
- K: Encodable + fmt::Debug,
- {
- let req = self.prepare_sign_request(public, data);
- let resp = self.stream.request(&req)?;
-
- if !resp.is_empty() && resp[0] == msg::SIGN_RESPONSE {
- self.read_signature(&resp)
- } else if !resp.is_empty() && resp[0] == msg::FAILURE {
- Err(Error::AgentFailure)
- } else {
- Err(Error::AgentProtocolError)
- }
- }
-
- fn prepare_sign_request<K>(&self, public: &K, data: &[u8]) -> Buffer
- where
- K: Encodable + fmt::Debug,
- {
- // byte SSH_AGENTC_SIGN_REQUEST
- // string key blob
- // string data
- // uint32 flags
-
- let mut pk = Buffer::default();
- public.write(&mut pk);
-
- let total = 1 + pk.len() + 4 + data.len() + 4;
-
- let mut buf = Buffer::default();
- buf.write_u32::<BigEndian>(total as u32)
- .expect("Writing to a vector never fails");
- buf.push(msg::SIGN_REQUEST);
- buf.extend_from_slice(&pk);
- buf.extend_ssh_string(data);
-
- // Signature flags should be zero for ed25519.
- buf.write_u32::<BigEndian>(0).unwrap();
- buf
- }
-
- fn read_signature(&self, sig: &[u8]) -> Result<Signature, Error> {
- let mut r = sig.reader(1);
- let mut resp = r.read_string()?.reader(0);
- let _t = resp.read_string()?;
- let sig = resp.read_string()?;
-
- let mut out = [0; 64];
- out.copy_from_slice(sig);
-
- Ok(out)
- }
-
- /// Ask the agent to remove a key from its memory.
- pub fn remove_identity<K>(&mut self, public: &K) -> Result<(), Error>
- where
- K: Encodable,
- {
- let mut pk: Buffer = Vec::new().into();
- public.write(&mut pk);
-
- let total = 1 + pk.len();
-
- let mut buf = Buffer::default();
- buf.write_u32::<BigEndian>(total as u32)?;
- buf.push(msg::REMOVE_IDENTITY);
- buf.extend_from_slice(&pk);
-
- self.stream.request(&buf)?;
-
- Ok(())
- }
-
- /// Ask the agent to remove a smartcard from its memory.
- pub fn remove_smartcard_key(&mut self, id: &str, pin: &[u8]) -> Result<(), Error> {
- let mut buf = Buffer::default();
- buf.resize(4, 0);
- buf.push(msg::REMOVE_SMARTCARD_KEY);
- buf.extend_ssh_string(id.as_bytes());
- buf.extend_ssh_string(pin);
- buf.write_len();
-
- self.stream.request(&buf)?;
-
- Ok(())
- }
-
- /// Ask the agent to forget all known keys.
- pub fn remove_all_identities(&mut self) -> Result<(), Error> {
- let mut buf = Buffer::default();
- buf.resize(4, 0);
- buf.push(msg::REMOVE_ALL_IDENTITIES);
- buf.write_len();
-
- self.stream.request(&buf)?;
-
- Ok(())
- }
-
- /// Send a custom message to the agent.
- pub fn extension(&mut self, typ: &[u8], ext: &[u8]) -> Result<(), Error> {
- let mut buf = Buffer::default();
-
- buf.resize(4, 0);
- buf.push(msg::EXTENSION);
- buf.extend_ssh_string(typ);
- buf.extend_ssh_string(ext);
- buf.write_len();
-
- self.stream.request(&buf)?;
-
- Ok(())
- }
-
- /// Ask the agent about supported extensions.
- pub fn query_extension(&mut self, typ: &[u8], mut ext: Buffer) -> Result<bool, Error> {
- let mut req = Buffer::default();
-
- req.resize(4, 0);
- req.push(msg::EXTENSION);
- req.extend_ssh_string(typ);
- req.write_len();
-
- let resp = self.stream.request(&req)?;
- let mut r = resp.reader(1);
- ext.extend(r.read_string()?);
-
- Ok(!resp.is_empty() && resp[0] == msg::SUCCESS)
- }
-}
-
-#[cfg(not(unix))]
-impl ClientStream for TcpStream {
- fn connect_uds<P>(_: P) -> Result<AgentClient<Self>, Error>
- where
- P: AsRef<Path> + Send,
- {
- Err(Error::AgentFailure)
- }
-
- fn read_response(&mut self, _: &mut Buffer) -> Result<(), Error> {
- Err(Error::AgentFailure)
- }
-
- fn connect_env() -> Result<AgentClient<Self>, Error> {
- Err(Error::AgentFailure)
- }
-}
-
-#[cfg(unix)]
-impl ClientStream for UnixStream {
- fn connect<P>(path: P) -> Result<AgentClient<Self>, Error>
- where
- P: AsRef<Path> + Send,
- {
- let stream = UnixStream::connect(path)?;
-
- Ok(AgentClient { stream })
- }
-
- fn request(&mut self, msg: &[u8]) -> Result<Buffer, Error> {
- let mut resp = Buffer::default();
-
- // Write the message
- self.write_all(msg)?;
- self.flush()?;
-
- // Read the length
- resp.resize(4, 0);
- self.read_exact(&mut resp)?;
-
- // Read the rest of the buffer
- let len = BigEndian::read_u32(&resp) as usize;
- resp.zeroize();
- resp.resize(len, 0);
- self.read_exact(&mut resp)?;
-
- Ok(resp)
- }
-}
diff --git a/radicle-ssh/src/agent/msg.rs b/radicle-ssh/src/agent/msg.rs
deleted file mode 100644
index d0786fd4f..000000000
--- a/radicle-ssh/src/agent/msg.rs
+++ /dev/null
@@ -1,23 +0,0 @@
-pub const FAILURE: u8 = 5;
-pub const SUCCESS: u8 = 6;
-pub const IDENTITIES_ANSWER: u8 = 12;
-pub const SIGN_RESPONSE: u8 = 14;
-#[allow(dead_code)]
-pub const EXTENSION_FAILURE: u8 = 28;
-
-pub const REQUEST_IDENTITIES: u8 = 11;
-pub const SIGN_REQUEST: u8 = 13;
-pub const ADD_IDENTITY: u8 = 17;
-pub const REMOVE_IDENTITY: u8 = 18;
-pub const REMOVE_ALL_IDENTITIES: u8 = 19;
-pub const ADD_ID_CONSTRAINED: u8 = 25;
-pub const ADD_SMARTCARD_KEY: u8 = 20;
-pub const REMOVE_SMARTCARD_KEY: u8 = 21;
-pub const LOCK: u8 = 22;
-pub const UNLOCK: u8 = 23;
-pub const ADD_SMARTCARD_KEY_CONSTRAINED: u8 = 26;
-pub const EXTENSION: u8 = 27;
-
-pub const CONSTRAIN_LIFETIME: u8 = 1;
-pub const CONSTRAIN_CONFIRM: u8 = 2;
-pub const CONSTRAIN_EXTENSION: u8 = 3;
diff --git a/radicle-ssh/src/encoding.rs b/radicle-ssh/src/encoding.rs
deleted file mode 100644
index 8342eefaa..000000000
--- a/radicle-ssh/src/encoding.rs
+++ /dev/null
@@ -1,248 +0,0 @@
-// Copyright 2016 Pierre-Étienne Meunier
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-//
-use std::ops::DerefMut;
-
-use byteorder::{BigEndian, ByteOrder, WriteBytesExt};
-use thiserror::Error;
-use zeroize::Zeroizing;
-
-/// General purpose writable byte buffer we use everywhere.
-pub type Buffer = Zeroizing<Vec<u8>>;
-
-#[derive(Debug, Error)]
-pub enum Error {
- /// Index out of bounds
- #[error("Index out of bounds")]
- IndexOutOfBounds,
-}
-
-pub trait Encodable: Sized {
- type Error: std::error::Error + Send + Sync + 'static;
-
- /// Read from the SSH format.
- fn read(reader: &mut Cursor) -> Result<Self, Self::Error>;
- /// Write to the SSH format.
- fn write<E: Encoding>(&self, buf: &mut E);
-}
-
-/// Encode in the SSH format.
-pub trait Encoding {
- /// Push an SSH-encoded string to `self`.
- fn extend_ssh_string(&mut self, s: &[u8]);
- /// Push an SSH-encoded blank string of length `s` to `self`.
- fn extend_ssh_string_blank(&mut self, s: usize) -> &mut [u8];
- /// Push an SSH-encoded multiple-precision integer.
- fn extend_ssh_mpint(&mut self, s: &[u8]);
- /// Push an SSH-encoded list.
- fn extend_list<'a, I: Iterator<Item = &'a [u8]>>(&mut self, list: I);
- /// Push an SSH-encoded unsigned 32-bit integer.
- fn extend_u32(&mut self, u: u32);
- /// Push an SSH-encoded empty list.
- fn write_empty_list(&mut self);
- /// Write the buffer length at the beginning of the buffer.
- fn write_len(&mut self);
-}
-
-/// Encoding length of the given mpint.
-pub fn mpint_len(s: &[u8]) -> usize {
- let mut i = 0;
- while i < s.len() && s[i] == 0 {
- i += 1
- }
- (if s[i] & 0x80 != 0 { 5 } else { 4 }) + s.len() - i
-}
-
-impl Encoding for Vec<u8> {
- fn extend_ssh_string(&mut self, s: &[u8]) {
- self.write_u32::<BigEndian>(s.len() as u32).unwrap();
- self.extend(s);
- }
-
- fn extend_ssh_string_blank(&mut self, len: usize) -> &mut [u8] {
- self.write_u32::<BigEndian>(len as u32).unwrap();
- let current = self.len();
- self.resize(current + len, 0u8);
-
- &mut self[current..]
- }
-
- fn extend_ssh_mpint(&mut self, s: &[u8]) {
- // Skip initial 0s.
- let mut i = 0;
- while i < s.len() && s[i] == 0 {
- i += 1
- }
- // If the first non-zero is >= 128, write its length (u32, BE), followed by 0.
- if s[i] & 0x80 != 0 {
- self.write_u32::<BigEndian>((s.len() - i + 1) as u32)
- .unwrap();
- self.push(0)
- } else {
- self.write_u32::<BigEndian>((s.len() - i) as u32).unwrap();
- }
- self.extend(&s[i..]);
- }
-
- fn extend_u32(&mut self, s: u32) {
- let mut buf = [0x0; 4];
- BigEndian::write_u32(&mut buf, s);
- self.extend(buf);
- }
-
- fn extend_list<'a, I: Iterator<Item = &'a [u8]>>(&mut self, list: I) {
- let len0 = self.len();
- self.extend([0, 0, 0, 0]);
-
- let mut first = true;
- for i in list {
- if !first {
- self.push(b',')
- } else {
- first = false;
- }
- self.extend(i)
- }
- let len = (self.len() - len0 - 4) as u32;
-
- BigEndian::write_u32(&mut self[len0..], len);
- }
-
- fn write_empty_list(&mut self) {
- self.extend([0, 0, 0, 0]);
- }
-
- fn write_len(&mut self) {
- let len = self.len() - 4;
- BigEndian::write_u32(&mut self[..], len as u32);
- }
-}
-
-impl Encoding for Buffer {
- fn extend_ssh_string(&mut self, s: &[u8]) {
- self.deref_mut().extend_ssh_string(s)
- }
-
- fn extend_ssh_string_blank(&mut self, len: usize) -> &mut [u8] {
- self.deref_mut().extend_ssh_string_blank(len)
- }
-
- fn extend_ssh_mpint(&mut self, s: &[u8]) {
- self.deref_mut().extend_ssh_mpint(s)
- }
-
- fn extend_list<'a, I: Iterator<Item = &'a [u8]>>(&mut self, list: I) {
- self.deref_mut().extend_list(list)
- }
-
- fn write_empty_list(&mut self) {
- self.deref_mut().write_empty_list()
- }
-
- fn extend_u32(&mut self, s: u32) {
- self.deref_mut().extend_u32(s);
- }
-
- fn write_len(&mut self) {
- self.deref_mut().write_len()
- }
-}
-
-/// A cursor-like trait to read SSH-encoded things.
-pub trait Reader {
- /// Create an SSH reader for `self`.
- fn reader(&self, starting_at: usize) -> Cursor;
-}
-
-impl Reader for Buffer {
- fn reader(&self, starting_at: usize) -> Cursor {
- Cursor {
- s: self,
- position: starting_at,
- }
- }
-}
-
-impl Reader for [u8] {
- fn reader(&self, starting_at: usize) -> Cursor {
- Cursor {
- s: self,
- position: starting_at,
- }
- }
-}
-
-/// A cursor-like type to read SSH-encoded values.
-#[derive(Debug)]
-pub struct Cursor<'a> {
- s: &'a [u8],
- #[doc(hidden)]
- pub position: usize,
-}
-
-impl<'a> Cursor<'a> {
- /// Read one string from this reader.
- pub fn read_string(&mut self) -> Result<&'a [u8], Error> {
- let len = self.read_u32()? as usize;
- if self.position + len <= self.s.len() {
- let result = &self.s[self.position..(self.position + len)];
- self.position += len;
- Ok(result)
- } else {
- Err(Error::IndexOutOfBounds)
- }
- }
-
- /// Read a `u32` from this reader.
- pub fn read_u32(&mut self) -> Result<u32, Error> {
- if self.position + 4 <= self.s.len() {
- let u = BigEndian::read_u32(&self.s[self.position..]);
- self.position += 4;
- Ok(u)
- } else {
- Err(Error::IndexOutOfBounds)
- }
- }
-
- /// Read one byte from this reader.
- pub fn read_byte(&mut self) -> Result<u8, Error> {
- if self.position < self.s.len() {
- let u = self.s[self.position];
- self.position += 1;
- Ok(u)
- } else {
- Err(Error::IndexOutOfBounds)
- }
- }
-
- pub fn read_bytes<const S: usize>(&mut self) -> Result<[u8; S], Error> {
- let mut buf = [0; S];
- for b in buf.iter_mut() {
- *b = self.read_byte()?;
- }
- Ok(buf)
- }
-
- /// Read one byte from this reader.
- pub fn read_mpint(&mut self) -> Result<&'a [u8], Error> {
- let len = self.read_u32()? as usize;
- if self.position + len <= self.s.len() {
- let result = &self.s[self.position..(self.position + len)];
- self.position += len;
- Ok(result)
- } else {
- Err(Error::IndexOutOfBounds)
- }
- }
-}
diff --git a/radicle-ssh/src/lib.rs b/radicle-ssh/src/lib.rs
deleted file mode 100644
index bd07d9008..000000000
--- a/radicle-ssh/src/lib.rs
+++ /dev/null
@@ -1,4 +0,0 @@
-pub mod agent;
-pub mod encoding;
-
-pub use agent::client::Error;
diff --git a/radicle/Cargo.toml b/radicle/Cargo.toml
index 946a0c130..15afad439 100644
--- a/radicle/Cargo.toml
+++ b/radicle/Cargo.toml
@@ -58,11 +58,6 @@ path = "../radicle-crypto"
version = "0"
features = ["radicle-git-ext", "ssh", "sqlite", "cyphernet"]
-[dependencies.radicle-ssh]
-path = "../radicle-ssh"
-version = "0"
-default-features = false
-
[dependencies.qcheck]
version = "1"
default-features = false
Exit code: 0
shell: 'export RUSTDOCFLAGS=''-D warnings'' cargo --version rustc --version cargo fmt --check cargo clippy --all-targets --workspace -- --deny warnings cargo build --all-targets --workspace cargo doc --workspace --no-deps --all-features cargo test --workspace --no-fail-fast '
Commands:
$ podman run --name 9ef52bd4-0c89-447a-b8b2-84cc0e8402c0 -v /opt/radcis/ci.rad.levitte.org/cci/state/9ef52bd4-0c89-447a-b8b2-84cc0e8402c0/s:/9ef52bd4-0c89-447a-b8b2-84cc0e8402c0/s:ro -v /opt/radcis/ci.rad.levitte.org/cci/state/9ef52bd4-0c89-447a-b8b2-84cc0e8402c0/w:/9ef52bd4-0c89-447a-b8b2-84cc0e8402c0/w -w /9ef52bd4-0c89-447a-b8b2-84cc0e8402c0/w -v /opt/radcis/ci.rad.levitte.org/.radicle:/${id}/.radicle:ro -e RAD_HOME=/${id}/.radicle rust:trixie bash /9ef52bd4-0c89-447a-b8b2-84cc0e8402c0/s/script.sh
+ export 'RUSTDOCFLAGS=-D warnings'
+ RUSTDOCFLAGS='-D warnings'
+ cargo --version
info: syncing channel updates for '1.90-x86_64-unknown-linux-gnu'
info: latest update on 2025-09-18, rust version 1.90.0 (1159e78c4 2025-09-14)
info: downloading component 'cargo'
info: downloading component 'clippy'
info: downloading component 'rust-docs'
info: downloading component 'rust-src'
info: downloading component 'rust-std'
info: downloading component 'rustc'
info: downloading component 'rustfmt'
info: installing component 'cargo'
info: installing component 'clippy'
info: installing component 'rust-docs'
info: installing component 'rust-src'
info: installing component 'rust-std'
info: installing component 'rustc'
info: installing component 'rustfmt'
cargo 1.90.0 (840b83a10 2025-07-30)
+ rustc --version
rustc 1.90.0 (1159e78c4 2025-09-14)
+ cargo fmt --check
+ cargo clippy --all-targets --workspace -- --deny warnings
Updating crates.io index
Downloading crates ...
Downloaded addr2line v0.25.1
Downloaded diff v0.1.13
Downloaded gix-fs v0.19.1
Downloaded fancy-regex v0.14.0
Downloaded gix-transport v0.54.0
Downloaded jiff v0.2.20
Downloaded keccak v0.1.6
Downloaded lazy_static v1.5.0
Downloaded idna v1.0.3
Downloaded is_terminal_polyfill v1.70.2
Downloaded gix-hash v0.22.1
Downloaded env_logger v0.11.8
Downloaded gix-negotiate v0.27.0
Downloaded iana-time-zone v0.1.60
Downloaded idna_adapter v1.2.0
Downloaded icu_provider v1.5.0
Downloaded indexmap v2.2.6
Downloaded litrs v0.4.1
Downloaded percent-encoding v2.3.1
Downloaded ecdsa v0.16.9
Downloaded multibase v0.9.1
Downloaded data-encoding-macro v0.1.14
Downloaded nu-ansi-term v0.50.3
Downloaded email_address v0.2.9
Downloaded parking_lot v0.12.5
Downloaded num-integer v0.1.46
Downloaded num-traits v0.2.19
Downloaded num-iter v0.1.45
Downloaded memmap2 v0.9.8
Downloaded once_cell v1.21.3
Downloaded proc-macro-error-attr2 v2.0.0
Downloaded derive_more-impl v2.0.1
Downloaded pin-project-lite v0.2.16
Downloaded scopeguard v1.2.0
Downloaded mio v1.0.4
Downloaded scrypt v0.11.0
Downloaded shell-words v1.1.0
Downloaded form_urlencoded v1.2.1
Downloaded signature v1.6.4
Downloaded referencing v0.30.0
Downloaded shlex v1.3.0
Downloaded rand_chacha v0.9.0
Downloaded polyval v0.6.2
Downloaded arc-swap v1.8.2
Downloaded sqlite v0.37.0
Downloaded sval v2.14.1
Downloaded sval_json v2.14.1
Downloaded test-log-macros v0.2.19
Downloaded sval_nested v2.14.1
Downloaded icu_locid_transform v1.5.0
Downloaded systemd-journal-logger v2.2.2
Downloaded socks5-client v0.4.1
Downloaded synstructure v0.13.1
Downloaded serde_derive_internals v0.29.1
Downloaded sval_dynamic v2.14.1
Downloaded thiserror v1.0.69
Downloaded tinyvec_macros v0.1.1
Downloaded sem_safe v0.2.0
Downloaded sval_serde v2.14.1
Downloaded p521 v0.13.3
Downloaded strsim v0.11.1
Downloaded sqlite3-sys v0.18.0
Downloaded structured-logger v1.0.4
Downloaded tree-sitter-html v0.23.2
Downloaded typeid v1.0.3
Downloaded thread_local v1.1.9
Downloaded snapbox v0.4.17
Downloaded indicatif v0.18.0
Downloaded unicode-display-width v0.3.0
Downloaded tinystr v0.7.6
Downloaded utf8parse v0.2.2
Downloaded toml_datetime v0.7.5+spec-1.1.0
Downloaded toml_writer v1.0.6+spec-1.1.0
Downloaded similar v2.5.0
Downloaded walkdir v2.5.0
Downloaded noise-framework v0.4.0
Downloaded tempfile v3.25.0
Downloaded zerofrom v0.1.6
Downloaded xattr v1.3.1
Downloaded paste v1.0.15
Downloaded p384 v0.13.0
Downloaded test-log v0.2.19
Downloaded zeroize v1.7.0
Downloaded tree-sitter-highlight v0.24.4
Downloaded schemars_derive v1.0.4
Downloaded yoke v0.7.5
Downloaded uuid-simd v0.8.0
Downloaded tar v0.4.40
Downloaded universal-hash v0.5.1
Downloaded write16 v1.0.0
Downloaded value-bag v1.11.1
Downloaded zerovec-derive v0.10.3
Downloaded zerofrom-derive v0.1.6
Downloaded yansi v0.5.1
Downloaded tracing-log v0.2.0
Downloaded url v2.5.4
Downloaded wait-timeout v0.2.1
Downloaded tree-sitter-toml-ng v0.6.0
Downloaded unicode-width v0.1.11
Downloaded itertools v0.14.0
Downloaded typenum v1.17.0
Downloaded regex v1.11.1
Downloaded portable-atomic v1.11.0
Downloaded zerovec v0.10.4
Downloaded proptest v1.9.0
Downloaded zerocopy v0.7.35
Downloaded syn v2.0.106
Downloaded tree-sitter-python v0.23.4
Downloaded bstr v1.12.0
Downloaded vcpkg v0.2.15
Downloaded sysinfo v0.37.2
Downloaded zlib-rs v0.6.0
Downloaded unicode-width v0.2.1
Downloaded tree-sitter-rust v0.23.2
Downloaded tree-sitter-md v0.3.2
Downloaded tree-sitter-c v0.23.2
Downloaded regex-syntax v0.8.5
Downloaded syn v1.0.109
Downloaded rustix v1.1.3
Downloaded rustix v0.38.34
Downloaded tracing v0.1.44
Downloaded regex-automata v0.4.9
Downloaded curve25519-dalek v4.1.3
Downloaded tree-sitter-ruby v0.23.1
Downloaded tree-sitter-bash v0.23.3
Downloaded linux-raw-sys v0.4.13
Downloaded bloomy v1.2.0
Downloaded winnow v0.7.14
Downloaded unicode-segmentation v1.11.0
Downloaded tree-sitter v0.24.4
Downloaded tracing-subscriber v0.3.22
Downloaded unicode-normalization v0.1.23
Downloaded serde_json v1.0.140
Downloaded libc v0.2.182
Downloaded schemars v1.0.4
Downloaded object v0.37.3
Downloaded radicle-surf v0.27.0
Downloaded ryu v1.0.17
Downloaded rsa v0.9.6
Downloaded jsonschema v0.30.0
Downloaded tree-sitter-typescript v0.23.2
Downloaded sha1-checked v0.10.0
Downloaded sha3 v0.10.8
Downloaded chrono v0.4.38
Downloaded tree-sitter-go v0.23.4
Downloaded tokio v1.47.1
Downloaded smallvec v1.15.1
Downloaded thiserror v2.0.18
Downloaded miniz_oxide v0.8.8
Downloaded clap_builder v4.5.44
Downloaded uuid v1.20.0
Downloaded aes v0.8.4
Downloaded crossterm v0.29.0
Downloaded aho-corasick v1.1.3
Downloaded tracing-core v0.1.36
Downloaded ssh-encoding v0.2.0
Downloaded ssh-agent-lib v0.5.2
Downloaded serde v1.0.228
Downloaded rustversion v1.0.20
Downloaded rand v0.9.2
Downloaded rand v0.8.5
Downloaded prodash v31.0.0
Downloaded parking_lot_core v0.9.12
Downloaded p256 v0.13.2
Downloaded vsimd v0.8.0
Downloaded yoke-derive v0.7.5
Downloaded writeable v0.5.5
Downloaded unicode-ident v1.0.12
Downloaded memchr v2.7.2
Downloaded aes-gcm v0.10.3
Downloaded version_check v0.9.4
Downloaded value-bag-sval2 v1.11.1
Downloaded value-bag-serde1 v1.11.1
Downloaded utf8_iter v1.0.4
Downloaded utf16_iter v1.0.5
Downloaded tree-sitter-css v0.23.1
Downloaded tinyvec v1.6.0
Downloaded socket2 v0.5.7
Downloaded rand_xorshift v0.4.0
Downloaded normalize-line-endings v0.3.0
Downloaded emojis v0.6.4
Downloaded signal-hook v0.3.18
Downloaded nonempty v0.9.0
Downloaded unit-prefix v0.5.1
Downloaded tree-sitter-language v0.1.2
Downloaded timeago v0.4.2
Downloaded heapless v0.8.0
Downloaded unarray v0.1.4
Downloaded thiserror-impl v1.0.69
Downloaded ssh-key v0.6.6
Downloaded serde_derive v1.0.228
Downloaded pretty_assertions v1.4.0
Downloaded num-rational v0.4.2
Downloaded litemap v0.7.5
Downloaded cyphernet v0.5.2
Downloaded libgit2-sys v0.18.3+1.9.2
Downloaded thiserror-impl v2.0.18
Downloaded sval_buffer v2.14.1
Downloaded spin v0.9.8
Downloaded crossbeam-channel v0.5.15
Downloaded tree-sitter-json v0.24.8
Downloaded toml v0.9.12+spec-1.1.0
Downloaded signals_receipts v0.2.0
Downloaded icu_properties_data v1.5.1
Downloaded crossterm v0.25.0
Downloaded icu_locid v1.5.0
Downloaded streaming-iterator v0.1.9
Downloaded sval_ref v2.14.1
Downloaded sval_fmt v2.14.1
Downloaded stable_deref_trait v1.2.0
Downloaded num-bigint v0.4.6
Downloaded der v0.7.9
Downloaded signal-hook-registry v1.4.5
Downloaded proc-macro2 v1.0.101
Downloaded inquire v0.7.5
Downloaded git2 v0.20.4
Downloaded subtle v2.5.0
Downloaded chacha20poly1305 v0.10.1
Downloaded linux-raw-sys v0.11.0
Downloaded gix-odb v0.75.0
Downloaded secrecy v0.10.3
Downloaded log v0.4.27
Downloaded backtrace v0.3.76
Downloaded cc v1.2.2
Downloaded ssh-cipher v0.2.0
Downloaded sec1 v0.7.3
Downloaded semver v1.0.27
Downloaded filetime v0.2.23
Downloaded snapbox-macros v0.3.8
Downloaded siphasher v0.3.11
Downloaded rand_core v0.6.4
Downloaded quote v1.0.41
Downloaded num-bigint-dig v0.8.4
Downloaded clap_complete v4.5.60
Downloaded signature v2.2.0
Downloaded signal-hook-mio v0.2.4
Downloaded sqlite3-src v0.7.0
Downloaded pkg-config v0.3.30
Downloaded gix-chunk v0.5.0
Downloaded gix-actor v0.39.0
Downloaded spki v0.7.3
Downloaded siphasher v1.0.1
Downloaded sharded-slab v0.1.7
Downloaded serde_fmt v1.0.3
Downloaded serde_core v1.0.228
Downloaded gix-lock v21.0.1
Downloaded gix-tempfile v21.0.1
Downloaded gix-revision v0.41.0
Downloaded elliptic-curve v0.13.8
Downloaded base64 v0.22.1
Downloaded base64 v0.21.7
Downloaded sha2 v0.10.8
Downloaded sha1 v0.10.6
Downloaded serde_spanned v1.0.4
Downloaded serde-untagged v0.1.7
Downloaded same-file v1.0.6
Downloaded rustc-demangle v0.1.26
Downloaded proc-macro-error2 v2.0.1
Downloaded poly1305 v0.8.0
Downloaded jobserver v0.1.31
Downloaded group v0.13.0
Downloaded primeorder v0.13.6
Downloaded pkcs8 v0.10.2
Downloaded lock_api v0.4.14
Downloaded gix-sec v0.13.1
Downloaded gix-path v0.11.1
Downloaded radicle-git-ext v0.12.0
Downloaded gix-trace v0.1.18
Downloaded rusty-fork v0.3.1
Downloaded phf v0.11.3
Downloaded fxhash v0.2.1
Downloaded ref-cast-impl v1.0.24
Downloaded ref-cast v1.0.24
Downloaded rand_core v0.9.3
Downloaded radicle-std-ext v0.2.0
Downloaded ppv-lite86 v0.2.17
Downloaded pkcs1 v0.7.5
Downloaded maybe-async v0.2.10
Downloaded hmac v0.12.1
Downloaded crypto-bigint v0.5.5
Downloaded gix-pack v0.65.0
Downloaded gix-glob v0.24.0
Downloaded salsa20 v0.10.2
Downloaded rustc_version v0.4.1
Downloaded rfc6979 v0.4.0
Downloaded rand_chacha v0.3.1
Downloaded quick-error v1.2.3
Downloaded qcheck-macros v1.0.0
Downloaded qcheck v1.0.0
Downloaded mio v0.8.11
Downloaded bytes v1.11.1
Downloaded amplify v4.6.0
Downloaded pem-rfc7468 v0.7.0
Downloaded outref v0.5.2
Downloaded matchers v0.2.0
Downloaded ed25519-dalek v2.2.0
Downloaded convert_case v0.7.1
Downloaded derive_more v2.0.1
Downloaded ahash v0.8.11
Downloaded phf_shared v0.11.3
Downloaded pbkdf2 v0.12.2
Downloaded opaque-debug v0.3.1
Downloaded num-cmp v0.1.0
Downloaded bitflags v1.3.2
Downloaded num-complex v0.4.6
Downloaded gix-config-value v0.17.1
Downloaded hashbrown v0.16.1
Downloaded console v0.16.0
Downloaded clap v4.5.44
Downloaded newline-converter v0.3.0
Downloaded ec25519 v0.1.0
Downloaded byteorder v1.5.0
Downloaded amplify_num v0.5.2
Downloaded lexopt v0.3.0
Downloaded ed25519 v1.5.3
Downloaded data-encoding v2.5.0
Downloaded crc32fast v1.5.0
Downloaded libz-sys v1.1.16
Downloaded bitflags v2.9.1
Downloaded num v0.4.3
Downloaded digest v0.10.7
Downloaded crossbeam-utils v0.8.19
Downloaded amplify_derive v4.0.0
Downloaded gix-object v0.56.0
Downloaded gix-commitgraph v0.33.0
Downloaded colored v2.1.0
Downloaded chacha20 v0.9.1
Downloaded blowfish v0.9.1
Downloaded bit-vec v0.8.0
Downloaded cipher v0.4.4
Downloaded cbc v0.1.2
Downloaded anstyle v1.0.13
Downloaded dyn-clone v1.0.17
Downloaded data-encoding-macro-internal v0.1.12
Downloaded curve25519-dalek-derive v0.1.1
Downloaded libm v0.2.8
Downloaded hashbrown v0.14.3
Downloaded document-features v0.2.11
Downloaded jiff-static v0.2.20
Downloaded icu_normalizer v1.5.0
Downloaded erased-serde v0.4.6
Downloaded clap_derive v4.5.41
Downloaded bytesize v2.0.1
Downloaded base32 v0.4.0
Downloaded ascii v1.1.0
Downloaded gix-command v0.7.1
Downloaded cyphergraphy v0.3.0
Downloaded cypheraddr v0.4.0
Downloaded borrow-or-share v0.2.2
Downloaded base-x v0.2.11
Downloaded anyhow v1.0.82
Downloaded icu_properties v1.5.1
Downloaded gix-url v0.35.1
Downloaded gix-protocol v0.57.0
Downloaded errno v0.3.13
Downloaded icu_provider_macros v1.5.0
Downloaded hash32 v0.3.1
Downloaded gix-traverse v0.52.0
Downloaded gix-date v0.13.0
Downloaded git-ref-format v0.6.0
Downloaded fluent-uri v0.3.2
Downloaded fastrand v2.3.0
Downloaded gix-utils v0.3.1
Downloaded gix-revwalk v0.27.0
Downloaded gix-error v0.0.0
Downloaded gix-date v0.14.0
Downloaded gix-credentials v0.36.0
Downloaded gix-actor v0.38.0
Downloaded adler2 v2.0.0
Downloaded gix-hashtable v0.12.0
Downloaded escargot v0.5.10
Downloaded equivalent v1.0.1
Downloaded either v1.11.0
Downloaded ed25519 v2.2.3
Downloaded const-oid v0.9.6
Downloaded clap_lex v0.7.5
Downloaded anstream v0.6.21
Downloaded displaydoc v0.2.5
Downloaded block-buffer v0.10.4
Downloaded ghash v0.5.1
Downloaded base64ct v1.6.0
Downloaded anstyle-parse v0.2.3
Downloaded amplify_syn v2.0.1
Downloaded aead v0.5.2
Downloaded env_filter v0.1.3
Downloaded dunce v1.0.5
Downloaded ctr v0.9.2
Downloaded ct-codecs v1.1.1
Downloaded crypto-common v0.1.6
Downloaded cpufeatures v0.2.12
Downloaded block-padding v0.3.3
Downloaded bcrypt-pbkdf v0.10.0
Downloaded gix-features v0.46.1
Downloaded fnv v1.0.7
Downloaded cfg-if v1.0.0
Downloaded icu_locid_transform_data v1.5.1
Downloaded icu_collections v1.5.0
Downloaded heck v0.5.0
Downloaded gix-validate v0.11.0
Downloaded gix-ref v0.59.0
Downloaded gix-packetline v0.21.1
Downloaded gix-object v0.55.0
Downloaded gix-commitgraph v0.32.0
Downloaded git-ref-format-macro v0.6.0
Downloaded git-ref-format-core v0.6.0
Downloaded gimli v0.32.3
Downloaded getrandom v0.3.3
Downloaded generic-array v0.14.7
Downloaded fraction v0.15.3
Downloaded flate2 v1.1.1
Downloaded ff v0.13.0
Downloaded fast-glob v0.3.3
Downloaded autocfg v1.2.0
Downloaded itoa v1.0.17
Downloaded inout v0.1.3
Downloaded icu_normalizer_data v1.5.1
Downloaded humantime v2.3.0
Downloaded human-panic v2.0.6
Downloaded gix-revwalk v0.26.0
Downloaded gix-refspec v0.37.0
Downloaded gix-quote v0.6.2
Downloaded gix-prompt v0.13.1
Downloaded gix-diff v0.58.0
Downloaded gix-chunk v0.6.0
Downloaded faster-hex v0.10.0
Downloaded colorchoice v1.0.0
Downloaded bytecount v0.6.8
Downloaded bit-set v0.8.0
Downloaded base16ct v0.2.0
Downloaded anstyle-query v1.0.2
Downloaded gix-shallow v0.8.1
Downloaded gix-error v0.1.0
Downloaded getrandom v0.2.15
Compiling libc v0.2.182
Compiling proc-macro2 v1.0.101
Compiling quote v1.0.41
Compiling unicode-ident v1.0.12
Checking cfg-if v1.0.0
Checking zeroize v1.7.0
Compiling version_check v0.9.4
Compiling typenum v1.17.0
Compiling generic-array v0.14.7
Checking memchr v2.7.2
Compiling syn v2.0.106
Checking getrandom v0.2.15
Checking rand_core v0.6.4
Compiling shlex v1.3.0
Checking subtle v2.5.0
Checking crypto-common v0.1.6
Checking regex-syntax v0.8.5
Checking aho-corasick v1.1.3
Compiling jobserver v0.1.31
Compiling cc v1.2.2
Checking smallvec v1.15.1
Checking const-oid v0.9.6
Compiling serde_core v1.0.228
Checking regex-automata v0.4.9
Checking block-buffer v0.10.4
Compiling serde v1.0.228
Checking digest v0.10.7
Checking cpufeatures v0.2.12
Compiling thiserror v2.0.18
Checking stable_deref_trait v1.2.0
Checking fastrand v2.3.0
Compiling parking_lot_core v0.9.12
Checking scopeguard v1.2.0
Checking lock_api v0.4.14
Checking byteorder v1.5.0
Checking parking_lot v0.12.5
Checking bstr v1.12.0
Checking tinyvec_macros v0.1.1
Checking bitflags v2.9.1
Checking tinyvec v1.6.0
Compiling crc32fast v1.5.0
Checking gix-trace v0.1.18
Checking gix-validate v0.11.0
Compiling typeid v1.0.3
Checking itoa v1.0.17
Checking same-file v1.0.6
Checking unicode-normalization v0.1.23
Checking walkdir v2.5.0
Compiling serde_derive v1.0.228
Compiling thiserror-impl v2.0.18
Checking prodash v31.0.0
Checking gix-utils v0.3.1
Checking zlib-rs v0.6.0
Compiling heapless v0.8.0
Checking hash32 v0.3.1
Compiling synstructure v0.13.1
Checking gix-path v0.11.1
Checking faster-hex v0.10.0
Checking gix-features v0.46.1
Compiling getrandom v0.3.3
Checking sha1 v0.10.6
Compiling zerofrom-derive v0.1.6
Checking sha1-checked v0.10.0
Compiling yoke-derive v0.7.5
Compiling rustix v1.1.3
Compiling pkg-config v0.3.30
Checking gix-hash v0.22.1
Checking zerofrom v0.1.6
Compiling zerovec-derive v0.10.3
Checking yoke v0.7.5
Checking block-padding v0.3.3
Compiling libm v0.2.8
Compiling autocfg v1.2.0
Checking linux-raw-sys v0.11.0
Checking erased-serde v0.4.6
Checking serde_fmt v1.0.3
Compiling num-traits v0.2.19
Checking inout v0.1.3
Checking value-bag-serde1 v1.11.1
Compiling displaydoc v0.2.5
Checking zerovec v0.10.4
Checking value-bag v1.11.1
Checking log v0.4.27
Checking sha2 v0.10.8
Checking once_cell v1.21.3
Checking cipher v0.4.4
Compiling syn v1.0.109
Checking tinystr v0.7.6
Compiling icu_locid_transform_data v1.5.1
Checking writeable v0.5.5
Checking litemap v0.7.5
Checking icu_locid v1.5.0
Compiling icu_provider_macros v1.5.0
Checking der v0.7.9
Compiling icu_properties_data v1.5.1
Checking percent-encoding v2.3.1
Checking icu_provider v1.5.0
Compiling icu_normalizer_data v1.5.1
Compiling thiserror v1.0.69
Checking icu_locid_transform v1.5.0
Checking icu_collections v1.5.0
Compiling thiserror-impl v1.0.69
Checking hashbrown v0.14.3
Checking equivalent v1.0.1
Checking ppv-lite86 v0.2.17
Compiling serde_json v1.0.140
Checking indexmap v2.2.6
Checking icu_properties v1.5.1
Checking num-integer v0.1.46
Checking hmac v0.12.1
Checking universal-hash v0.5.1
Checking utf8_iter v1.0.4
Checking ryu v1.0.17
Checking opaque-debug v0.3.1
Checking utf16_iter v1.0.5
Compiling vcpkg v0.2.15
Checking write16 v1.0.0
Compiling ref-cast v1.0.24
Checking tempfile v3.25.0
Checking spki v0.7.3
Compiling ref-cast-impl v1.0.24
Compiling libz-sys v1.1.16
Checking icu_normalizer v1.5.0
Checking signature v2.2.0
Checking ff v0.13.0
Checking spin v0.9.8
Checking base16ct v0.2.0
Checking group v0.13.0
Checking lazy_static v1.5.0
Checking idna_adapter v1.2.0
Checking sec1 v0.7.3
Checking rand_chacha v0.3.1
Checking crypto-bigint v0.5.5
Checking dyn-clone v1.0.17
Checking idna v1.0.3
Checking num-iter v0.1.45
Checking rand v0.8.5
Compiling amplify_syn v2.0.1
Compiling libgit2-sys v0.18.3+1.9.2
Checking aead v0.5.2
Compiling semver v1.0.27
Checking signature v1.6.4
Checking ed25519 v1.5.3
Compiling rustc_version v0.4.1
Compiling amplify_derive v4.0.0
Checking elliptic-curve v0.13.8
Checking poly1305 v0.8.0
Checking rfc6979 v0.4.0
Checking form_urlencoded v1.2.1
Checking chacha20 v0.9.1
Compiling serde_derive_internals v0.29.1
Checking ascii v1.1.0
Checking ct-codecs v1.1.1
Checking amplify_num v0.5.2
Compiling schemars_derive v1.0.4
Checking ec25519 v0.1.0
Checking url v2.5.4
Checking amplify v4.6.0
Checking ecdsa v0.16.9
Checking primeorder v0.13.6
Compiling curve25519-dalek v4.1.3
Checking git-ref-format-core v0.6.0
Checking polyval v0.6.2
Checking base64ct v1.6.0
Compiling num-bigint-dig v0.8.4
Checking ghash v0.5.1
Checking pem-rfc7468 v0.7.0
Checking schemars v1.0.4
Checking cyphergraphy v0.3.0
Checking pkcs8 v0.10.2
Checking pbkdf2 v0.12.2
Checking aes v0.8.4
Checking ctr v0.9.2
Compiling sqlite3-src v0.7.0
Compiling curve25519-dalek-derive v0.1.1
Checking keccak v0.1.6
Checking aes-gcm v0.10.3
Checking sha3 v0.10.8
Checking pkcs1 v0.7.5
Checking ssh-encoding v0.2.0
Checking ed25519 v2.2.3
Checking blowfish v0.9.1
Checking cbc v0.1.2
Checking base32 v0.4.0
Compiling data-encoding v2.5.0
Checking cypheraddr v0.4.0
Checking rsa v0.9.6
Compiling data-encoding-macro-internal v0.1.12
Checking ssh-cipher v0.2.0
Checking bcrypt-pbkdf v0.10.0
Checking ed25519-dalek v2.2.0
Checking p256 v0.13.2
Checking p521 v0.13.3
Checking p384 v0.13.0
Checking chacha20poly1305 v0.10.1
Checking qcheck v1.0.0
Checking jiff v0.2.20
Checking data-encoding-macro v0.1.14
Checking noise-framework v0.4.0
Checking ssh-key v0.6.6
Checking socks5-client v0.4.1
Checking secrecy v0.10.3
Compiling crossbeam-utils v0.8.19
Checking base-x v0.2.11
Checking multibase v0.9.1
Checking ssh-agent-lib v0.5.2
Checking cyphernet v0.5.2
Checking winnow v0.7.14
Checking crossbeam-channel v0.5.15
Checking hashbrown v0.16.1
Checking gix-hashtable v0.12.0
Checking nonempty v0.9.0
Checking siphasher v1.0.1
Checking anstyle-query v1.0.2
Checking radicle-git-metadata v0.2.0 (/9ef52bd4-0c89-447a-b8b2-84cc0e8402c0/w/crates/radicle-git-metadata)
Checking gix-error v0.1.0
Checking radicle-dag v0.10.0 (/9ef52bd4-0c89-447a-b8b2-84cc0e8402c0/w/crates/radicle-dag)
Checking memmap2 v0.9.8
Checking utf8parse v0.2.2
Checking radicle-git-ref-format v0.1.0 (/9ef52bd4-0c89-447a-b8b2-84cc0e8402c0/w/crates/radicle-git-ref-format)
Checking iana-time-zone v0.1.60
Checking anstyle-parse v0.2.3
Checking colorchoice v1.0.0
Checking anstyle v1.0.13
Checking base64 v0.21.7
Checking is_terminal_polyfill v1.70.2
Checking anstream v0.6.21
Checking chrono v0.4.38
Checking radicle-localtime v0.1.0 (/9ef52bd4-0c89-447a-b8b2-84cc0e8402c0/w/crates/radicle-localtime)
Checking colored v2.1.0
Checking serde-untagged v0.1.7
Checking bytesize v2.0.1
Checking gix-error v0.0.0
Checking fast-glob v0.3.3
Checking tree-sitter-language v0.1.2
Checking dunce v1.0.5
Checking gix-date v0.14.0
Checking gix-date v0.13.0
Checking gix-actor v0.39.0
Checking gix-fs v0.19.1
Checking gix-object v0.56.0
Checking gix-tempfile v21.0.1
Checking gix-actor v0.38.0
Checking gix-chunk v0.6.0
Checking mio v1.0.4
Checking gix-quote v0.6.2
Checking gix-commitgraph v0.33.0
Checking gix-object v0.55.0
Checking gix-chunk v0.5.0
Checking errno v0.3.13
Checking sem_safe v0.2.0
Checking either v1.11.0
Checking shell-words v1.1.0
Checking gix-command v0.7.1
Checking signals_receipts v0.2.0
Checking gix-commitgraph v0.32.0
Checking gix-revwalk v0.27.0
Compiling signal-hook v0.3.18
Compiling object v0.37.3
Compiling rustversion v1.0.20
Checking gix-revwalk v0.26.0
Checking gix-lock v21.0.1
Checking gix-url v0.35.1
Checking gix-config-value v0.17.1
Checking gix-sec v0.13.1
Checking signal-hook-registry v1.4.5
Checking gimli v0.32.3
Compiling rustix v0.38.34
Checking adler2 v2.0.0
Checking miniz_oxide v0.8.8
Checking gix-prompt v0.13.1
Checking gix-traverse v0.52.0
Checking addr2line v0.25.1
Checking gix-revision v0.41.0
Checking radicle-signals v0.11.0 (/9ef52bd4-0c89-447a-b8b2-84cc0e8402c0/w/crates/radicle-signals)
Checking gix-diff v0.58.0
Checking mio v0.8.11
Checking gix-glob v0.24.0
Checking gix-packetline v0.21.1
Compiling tree-sitter v0.24.4
Checking rustc-demangle v0.1.26
Compiling anyhow v1.0.82
Compiling linux-raw-sys v0.4.13
Compiling unicode-segmentation v1.11.0
Compiling convert_case v0.7.1
Checking backtrace v0.3.76
Checking gix-transport v0.54.0
Checking gix-refspec v0.37.0
Checking signal-hook-mio v0.2.4
Checking gix-pack v0.65.0
Checking arc-swap v1.8.2
Checking gix-credentials v0.36.0
Checking gix-shallow v0.8.1
Checking gix-ref v0.59.0
Checking gix-negotiate v0.27.0
Compiling maybe-async v0.2.10
Checking regex v1.11.1
Compiling proc-macro-error-attr2 v2.0.0
Compiling portable-atomic v1.11.0
Checking gix-protocol v0.57.0
Compiling proc-macro-error2 v2.0.1
Checking gix-odb v0.75.0
Compiling xattr v1.3.1
Compiling derive_more-impl v2.0.1
Compiling filetime v0.2.23
Checking uuid v1.20.0
Checking unicode-width v0.2.1
Checking bitflags v1.3.2
Checking bytes v1.11.1
Compiling litrs v0.4.1
Checking console v0.16.0
Compiling document-features v0.2.11
Checking crossterm v0.25.0
Checking derive_more v2.0.1
Compiling tar v0.4.40
Compiling flate2 v1.1.1
Compiling git-ref-format-macro v0.6.0
Checking newline-converter v0.3.0
Checking snapbox-macros v0.3.8
Checking salsa20 v0.10.2
Checking fxhash v0.2.1
Checking similar v2.5.0
Checking unicode-width v0.1.11
Checking clap_lex v0.7.5
Checking strsim v0.11.1
Checking streaming-iterator v0.1.9
Checking siphasher v0.3.11
Checking unit-prefix v0.5.1
Checking normalize-line-endings v0.3.0
Compiling heck v0.5.0
Checking snapbox v0.4.17
Compiling clap_derive v4.5.41
Checking indicatif v0.18.0
Checking bloomy v1.2.0
Checking clap_builder v4.5.44
Checking inquire v0.7.5
Checking scrypt v0.11.0
Checking sqlite3-sys v0.18.0
Compiling radicle-surf v0.27.0
Checking git-ref-format v0.6.0
Checking sqlite v0.37.0
Checking crossterm v0.29.0
Checking unicode-display-width v0.3.0
Checking radicle-crypto v0.16.0 (/9ef52bd4-0c89-447a-b8b2-84cc0e8402c0/w/crates/radicle-crypto)
Checking systemd-journal-logger v2.2.2
Checking serde_spanned v1.0.4
Checking toml_datetime v0.7.5+spec-1.1.0
Compiling tree-sitter-html v0.23.2
Compiling tree-sitter-bash v0.23.3
Compiling tree-sitter-rust v0.23.2
Compiling tree-sitter-css v0.23.1
Compiling tree-sitter-ruby v0.23.1
Compiling tree-sitter-md v0.3.2
Compiling tree-sitter-json v0.24.8
Compiling tree-sitter-typescript v0.23.2
Compiling tree-sitter-c v0.23.2
Compiling tree-sitter-python v0.23.4
Compiling tree-sitter-toml-ng v0.6.0
Compiling tree-sitter-go v0.23.4
Checking pin-project-lite v0.2.16
Checking radicle-std-ext v0.2.0
Checking toml_writer v1.0.6+spec-1.1.0
Checking tokio v1.47.1
Checking toml v0.9.12+spec-1.1.0
Checking clap v4.5.44
Checking sysinfo v0.37.2
Compiling radicle-node v0.19.0 (/9ef52bd4-0c89-447a-b8b2-84cc0e8402c0/w/crates/radicle-node)
Compiling radicle-cli v0.20.0 (/9ef52bd4-0c89-447a-b8b2-84cc0e8402c0/w/crates/radicle-cli)
Checking yansi v0.5.1
Checking diff v0.1.13
Checking pretty_assertions v1.4.0
Checking human-panic v2.0.6
Checking clap_complete v4.5.60
Checking structured-logger v1.0.4
Checking radicle-systemd v0.12.0 (/9ef52bd4-0c89-447a-b8b2-84cc0e8402c0/w/crates/radicle-systemd)
Checking tree-sitter-highlight v0.24.4
Checking itertools v0.14.0
Compiling qcheck-macros v1.0.0
Checking socket2 v0.5.7
Checking lexopt v0.3.0
Checking timeago v0.4.2
Compiling escargot v0.5.10
Checking humantime v2.3.0
Checking bit-vec v0.8.0
Checking bit-set v0.8.0
Checking num-bigint v0.4.6
Checking rand_core v0.9.3
Compiling ahash v0.8.11
Checking num-complex v0.4.6
Checking env_filter v0.1.3
Checking borrow-or-share v0.2.2
Checking zerocopy v0.7.35
Checking fluent-uri v0.3.2
Checking num-rational v0.4.2
Checking env_logger v0.11.8
Checking phf_shared v0.11.3
Checking num v0.4.3
Compiling test-log-macros v0.2.19
Checking wait-timeout v0.2.1
Checking outref v0.5.2
Checking quick-error v1.2.3
Compiling radicle-remote-helper v0.16.0 (/9ef52bd4-0c89-447a-b8b2-84cc0e8402c0/w/crates/radicle-remote-helper)
Checking vsimd v0.8.0
Checking fnv v1.0.7
Compiling paste v1.0.15
Checking rusty-fork v0.3.1
Checking test-log v0.2.19
Checking uuid-simd v0.8.0
Checking fraction v0.15.3
Checking phf v0.11.3
Checking referencing v0.30.0
Checking rand v0.9.2
Checking rand_xorshift v0.4.0
Checking rand_chacha v0.9.0
Checking fancy-regex v0.14.0
Checking email_address v0.2.9
Checking bytecount v0.6.8
Checking base64 v0.22.1
Checking num-cmp v0.1.0
Checking unarray v0.1.4
Checking proptest v1.9.0
Checking emojis v0.6.4
Checking jsonschema v0.30.0
Checking radicle-windows v0.1.0 (/9ef52bd4-0c89-447a-b8b2-84cc0e8402c0/w/crates/radicle-windows)
Checking git2 v0.20.4
Checking radicle-oid v0.1.0 (/9ef52bd4-0c89-447a-b8b2-84cc0e8402c0/w/crates/radicle-oid)
Checking radicle-git-ext v0.12.0
Checking radicle-term v0.17.0 (/9ef52bd4-0c89-447a-b8b2-84cc0e8402c0/w/crates/radicle-term)
Checking radicle-core v0.2.0 (/9ef52bd4-0c89-447a-b8b2-84cc0e8402c0/w/crates/radicle-core)
Checking radicle-cob v0.19.0 (/9ef52bd4-0c89-447a-b8b2-84cc0e8402c0/w/crates/radicle-cob)
Checking radicle v0.23.0 (/9ef52bd4-0c89-447a-b8b2-84cc0e8402c0/w/crates/radicle)
Checking radicle-fetch v0.19.0 (/9ef52bd4-0c89-447a-b8b2-84cc0e8402c0/w/crates/radicle-fetch)
Checking radicle-cli-test v0.13.0 (/9ef52bd4-0c89-447a-b8b2-84cc0e8402c0/w/crates/radicle-cli-test)
Checking radicle-schemars v0.7.0 (/9ef52bd4-0c89-447a-b8b2-84cc0e8402c0/w/crates/radicle-schemars)
Checking radicle-protocol v0.7.0 (/9ef52bd4-0c89-447a-b8b2-84cc0e8402c0/w/crates/radicle-protocol)
Finished `dev` profile [unoptimized + debuginfo] target(s) in 44.12s
+ cargo build --all-targets --workspace
Compiling libc v0.2.182
Compiling cfg-if v1.0.0
Compiling zeroize v1.7.0
Compiling typenum v1.17.0
Compiling memchr v2.7.2
Compiling subtle v2.5.0
Compiling shlex v1.3.0
Compiling regex-syntax v0.8.5
Compiling generic-array v0.14.7
Compiling getrandom v0.2.15
Compiling jobserver v0.1.31
Compiling rand_core v0.6.4
Compiling cc v1.2.2
Compiling crypto-common v0.1.6
Compiling aho-corasick v1.1.3
Compiling const-oid v0.9.6
Compiling smallvec v1.15.1
Compiling serde_core v1.0.228
Compiling regex-automata v0.4.9
Compiling block-buffer v0.10.4
Compiling serde v1.0.228
Compiling digest v0.10.7
Compiling cpufeatures v0.2.12
Compiling thiserror v2.0.18
Compiling fastrand v2.3.0
Compiling stable_deref_trait v1.2.0
Compiling scopeguard v1.2.0
Compiling lock_api v0.4.14
Compiling parking_lot_core v0.9.12
Compiling parking_lot v0.12.5
Compiling bitflags v2.9.1
Compiling byteorder v1.5.0
Compiling tinyvec_macros v0.1.1
Compiling tinyvec v1.6.0
Compiling gix-trace v0.1.18
Compiling crc32fast v1.5.0
Compiling itoa v1.0.17
Compiling typeid v1.0.3
Compiling erased-serde v0.4.6
Compiling serde_fmt v1.0.3
Compiling same-file v1.0.6
Compiling walkdir v2.5.0
Compiling bstr v1.12.0
Compiling unicode-normalization v0.1.23
Compiling value-bag-serde1 v1.11.1
Compiling prodash v31.0.0
Compiling gix-utils v0.3.1
Compiling gix-validate v0.11.0
Compiling zlib-rs v0.6.0
Compiling gix-path v0.11.1
Compiling value-bag v1.11.1
Compiling log v0.4.27
Compiling hash32 v0.3.1
Compiling heapless v0.8.0
Compiling sha1 v0.10.6
Compiling sha1-checked v0.10.0
Compiling faster-hex v0.10.0
Compiling zerofrom v0.1.6
Compiling getrandom v0.3.3
Compiling yoke v0.7.5
Compiling block-padding v0.3.3
Compiling linux-raw-sys v0.11.0
Compiling inout v0.1.3
Compiling zerovec v0.10.4
Compiling sha2 v0.10.8
Compiling once_cell v1.21.3
Compiling libm v0.2.8
Compiling rustix v1.1.3
Compiling cipher v0.4.4
Compiling tinystr v0.7.6
Compiling num-traits v0.2.19
Compiling litemap v0.7.5
Compiling gix-features v0.46.1
Compiling gix-hash v0.22.1
Compiling writeable v0.5.5
Compiling icu_locid v1.5.0
Compiling der v0.7.9
Compiling percent-encoding v2.3.1
Compiling icu_locid_transform_data v1.5.1
Compiling icu_properties_data v1.5.1
Compiling icu_collections v1.5.0
Compiling icu_provider v1.5.0
Compiling equivalent v1.0.1
Compiling hashbrown v0.14.3
Compiling icu_locid_transform v1.5.0
Compiling ppv-lite86 v0.2.17
Compiling indexmap v2.2.6
Compiling icu_normalizer_data v1.5.1
Compiling num-integer v0.1.46
Compiling icu_properties v1.5.1
Compiling hmac v0.12.1
Compiling universal-hash v0.5.1
Compiling ryu v1.0.17
Compiling utf8_iter v1.0.4
Compiling write16 v1.0.0
Compiling opaque-debug v0.3.1
Compiling utf16_iter v1.0.5
Compiling libz-sys v1.1.16
Compiling serde_json v1.0.140
Compiling thiserror v1.0.69
Compiling tempfile v3.25.0
Compiling spki v0.7.3
Compiling signature v2.2.0
Compiling ff v0.13.0
Compiling base16ct v0.2.0
Compiling spin v0.9.8
Compiling sec1 v0.7.3
Compiling lazy_static v1.5.0
Compiling ref-cast v1.0.24
Compiling group v0.13.0
Compiling rand_chacha v0.3.1
Compiling crypto-bigint v0.5.5
Compiling icu_normalizer v1.5.0
Compiling dyn-clone v1.0.17
Compiling rand v0.8.5
Compiling num-iter v0.1.45
Compiling libgit2-sys v0.18.3+1.9.2
Compiling idna_adapter v1.2.0
Compiling aead v0.5.2
Compiling idna v1.0.3
Compiling signature v1.6.4
Compiling ed25519 v1.5.3
Compiling elliptic-curve v0.13.8
Compiling poly1305 v0.8.0
Compiling rfc6979 v0.4.0
Compiling form_urlencoded v1.2.1
Compiling chacha20 v0.9.1
Compiling amplify_num v0.5.2
Compiling ct-codecs v1.1.1
Compiling ascii v1.1.0
Compiling ec25519 v0.1.0
Compiling url v2.5.4
Compiling ecdsa v0.16.9
Compiling amplify v4.6.0
Compiling primeorder v0.13.6
Compiling git-ref-format-core v0.6.0
Compiling polyval v0.6.2
Compiling base64ct v1.6.0
Compiling ghash v0.5.1
Compiling cyphergraphy v0.3.0
Compiling pem-rfc7468 v0.7.0
Compiling schemars v1.0.4
Compiling pkcs8 v0.10.2
Compiling pbkdf2 v0.12.2
Compiling aes v0.8.4
Compiling ctr v0.9.2
Compiling sqlite3-src v0.7.0
Compiling keccak v0.1.6
Compiling sha3 v0.10.8
Compiling aes-gcm v0.10.3
Compiling curve25519-dalek v4.1.3
Compiling pkcs1 v0.7.5
Compiling ssh-encoding v0.2.0
Compiling num-bigint-dig v0.8.4
Compiling ed25519 v2.2.3
Compiling cbc v0.1.2
Compiling blowfish v0.9.1
Compiling base32 v0.4.0
Compiling cypheraddr v0.4.0
Compiling rsa v0.9.6
Compiling bcrypt-pbkdf v0.10.0
Compiling ssh-cipher v0.2.0
Compiling ed25519-dalek v2.2.0
Compiling p256 v0.13.2
Compiling p521 v0.13.3
Compiling p384 v0.13.0
Compiling chacha20poly1305 v0.10.1
Compiling qcheck v1.0.0
Compiling data-encoding v2.5.0
Compiling jiff v0.2.20
Compiling data-encoding-macro v0.1.14
Compiling noise-framework v0.4.0
Compiling ssh-key v0.6.6
Compiling socks5-client v0.4.1
Compiling secrecy v0.10.3
Compiling base-x v0.2.11
Compiling multibase v0.9.1
Compiling ssh-agent-lib v0.5.2
Compiling cyphernet v0.5.2
Compiling crossbeam-utils v0.8.19
Compiling winnow v0.7.14
Compiling crossbeam-channel v0.5.15
Compiling hashbrown v0.16.1
Compiling nonempty v0.9.0
Compiling siphasher v1.0.1
Compiling anstyle-query v1.0.2
Compiling gix-error v0.1.0
Compiling gix-hashtable v0.12.0
Compiling radicle-dag v0.10.0 (/9ef52bd4-0c89-447a-b8b2-84cc0e8402c0/w/crates/radicle-dag)
Compiling radicle-git-metadata v0.2.0 (/9ef52bd4-0c89-447a-b8b2-84cc0e8402c0/w/crates/radicle-git-metadata)
Compiling memmap2 v0.9.8
Compiling utf8parse v0.2.2
Compiling anstyle-parse v0.2.3
Compiling radicle-git-ref-format v0.1.0 (/9ef52bd4-0c89-447a-b8b2-84cc0e8402c0/w/crates/radicle-git-ref-format)
Compiling colorchoice v1.0.0
Compiling iana-time-zone v0.1.60
Compiling is_terminal_polyfill v1.70.2
Compiling anstyle v1.0.13
Compiling base64 v0.21.7
Compiling anstream v0.6.21
Compiling chrono v0.4.38
Compiling radicle-localtime v0.1.0 (/9ef52bd4-0c89-447a-b8b2-84cc0e8402c0/w/crates/radicle-localtime)
Compiling colored v2.1.0
Compiling gix-error v0.0.0
Compiling serde-untagged v0.1.7
Compiling bytesize v2.0.1
Compiling dunce v1.0.5
Compiling tree-sitter-language v0.1.2
Compiling fast-glob v0.3.3
Compiling gix-date v0.14.0
Compiling adler2 v2.0.0
Compiling gix-actor v0.39.0
Compiling gix-date v0.13.0
Compiling gix-fs v0.19.1
Compiling gix-tempfile v21.0.1
Compiling gix-actor v0.38.0
Compiling gix-object v0.56.0
Compiling gix-chunk v0.6.0
Compiling mio v1.0.4
Compiling gix-quote v0.6.2
Compiling gix-commitgraph v0.33.0
Compiling gix-object v0.55.0
Compiling gix-chunk v0.5.0
Compiling sem_safe v0.2.0
Compiling errno v0.3.13
Compiling either v1.11.0
Compiling shell-words v1.1.0
Compiling unicode-segmentation v1.11.0
Compiling gix-command v0.7.1
Compiling signals_receipts v0.2.0
Compiling gix-commitgraph v0.32.0
Compiling gix-revwalk v0.27.0
Compiling gix-revwalk v0.26.0
Compiling gix-lock v21.0.1
Compiling gix-url v0.35.1
Compiling gix-config-value v0.17.1
Compiling gix-sec v0.13.1
Compiling signal-hook-registry v1.4.5
Compiling gimli v0.32.3
Compiling signal-hook v0.3.18
Compiling gix-prompt v0.13.1
Compiling gix-traverse v0.52.0
Compiling object v0.37.3
Compiling addr2line v0.25.1
Compiling gix-revision v0.41.0
Compiling radicle-signals v0.11.0 (/9ef52bd4-0c89-447a-b8b2-84cc0e8402c0/w/crates/radicle-signals)
Compiling gix-diff v0.58.0
Compiling miniz_oxide v0.8.8
Compiling gix-glob v0.24.0
Compiling gix-packetline v0.21.1
Compiling mio v0.8.11
Compiling tree-sitter v0.24.4
Compiling rustc-demangle v0.1.26
Compiling rustix v0.38.34
Compiling backtrace v0.3.76
Compiling sqlite3-sys v0.18.0
Compiling signal-hook-mio v0.2.4
Compiling sqlite v0.37.0
Compiling gix-transport v0.54.0
Compiling radicle-crypto v0.16.0 (/9ef52bd4-0c89-447a-b8b2-84cc0e8402c0/w/crates/radicle-crypto)
Compiling gix-refspec v0.37.0
Compiling gix-pack v0.65.0
Compiling arc-swap v1.8.2
Compiling gix-credentials v0.36.0
Compiling gix-ref v0.59.0
Compiling gix-shallow v0.8.1
Compiling gix-negotiate v0.27.0
Compiling convert_case v0.7.1
Compiling regex v1.11.1
Compiling gix-protocol v0.57.0
Compiling derive_more-impl v2.0.1
Compiling gix-odb v0.75.0
Compiling xattr v1.3.1
Compiling uuid v1.20.0
Compiling filetime v0.2.23
Compiling unicode-width v0.2.1
Compiling bytes v1.11.1
Compiling bitflags v1.3.2
Compiling crossterm v0.25.0
Compiling console v0.16.0
Compiling tar v0.4.40
Compiling git-ref-format-macro v0.6.0
Compiling flate2 v1.1.1
Compiling derive_more v2.0.1
Compiling portable-atomic v1.11.0
Compiling anyhow v1.0.82
Compiling newline-converter v0.3.0
Compiling snapbox-macros v0.3.8
Compiling salsa20 v0.10.2
Compiling fxhash v0.2.1
Compiling unicode-width v0.1.11
Compiling streaming-iterator v0.1.9
Compiling siphasher v0.3.11
Compiling unit-prefix v0.5.1
Compiling clap_lex v0.7.5
Compiling normalize-line-endings v0.3.0
Compiling similar v2.5.0
Compiling strsim v0.11.1
Compiling snapbox v0.4.17
Compiling clap_builder v4.5.44
Compiling indicatif v0.18.0
Compiling bloomy v1.2.0
Compiling inquire v0.7.5
Compiling radicle-surf v0.27.0
Compiling scrypt v0.11.0
Compiling crossterm v0.29.0
Compiling git-ref-format v0.6.0
Compiling unicode-display-width v0.3.0
Compiling systemd-journal-logger v2.2.2
Compiling serde_spanned v1.0.4
Compiling toml_datetime v0.7.5+spec-1.1.0
Compiling tree-sitter-html v0.23.2
Compiling tree-sitter-bash v0.23.3
Compiling tree-sitter-md v0.3.2
Compiling tree-sitter-css v0.23.1
Compiling tree-sitter-go v0.23.4
Compiling tree-sitter-json v0.24.8
Compiling tree-sitter-c v0.23.2
Compiling tree-sitter-toml-ng v0.6.0
Compiling tree-sitter-rust v0.23.2
Compiling tree-sitter-typescript v0.23.2
Compiling tree-sitter-python v0.23.4
Compiling tree-sitter-ruby v0.23.1
Compiling toml_writer v1.0.6+spec-1.1.0
Compiling pin-project-lite v0.2.16
Compiling radicle-std-ext v0.2.0
Compiling tokio v1.47.1
Compiling toml v0.9.12+spec-1.1.0
Compiling clap v4.5.44
Compiling sysinfo v0.37.2
Compiling yansi v0.5.1
Compiling diff v0.1.13
Compiling radicle-cli v0.20.0 (/9ef52bd4-0c89-447a-b8b2-84cc0e8402c0/w/crates/radicle-cli)
Compiling radicle-node v0.19.0 (/9ef52bd4-0c89-447a-b8b2-84cc0e8402c0/w/crates/radicle-node)
Compiling pretty_assertions v1.4.0
Compiling human-panic v2.0.6
Compiling clap_complete v4.5.60
Compiling structured-logger v1.0.4
Compiling radicle-systemd v0.12.0 (/9ef52bd4-0c89-447a-b8b2-84cc0e8402c0/w/crates/radicle-systemd)
Compiling tree-sitter-highlight v0.24.4
Compiling itertools v0.14.0
Compiling socket2 v0.5.7
Compiling humantime v2.3.0
Compiling lexopt v0.3.0
Compiling timeago v0.4.2
Compiling bit-vec v0.8.0
Compiling escargot v0.5.10
Compiling bit-set v0.8.0
Compiling num-bigint v0.4.6
Compiling rand_core v0.9.3
Compiling num-complex v0.4.6
Compiling env_filter v0.1.3
Compiling borrow-or-share v0.2.2
Compiling zerocopy v0.7.35
Compiling fluent-uri v0.3.2
Compiling num-rational v0.4.2
Compiling ahash v0.8.11
Compiling git2 v0.20.4
Compiling num v0.4.3
Compiling env_logger v0.11.8
Compiling phf_shared v0.11.3
Compiling wait-timeout v0.2.1
Compiling radicle-remote-helper v0.16.0 (/9ef52bd4-0c89-447a-b8b2-84cc0e8402c0/w/crates/radicle-remote-helper)
Compiling outref v0.5.2
Compiling quick-error v1.2.3
Compiling vsimd v0.8.0
Compiling fnv v1.0.7
Compiling rusty-fork v0.3.1
Compiling test-log v0.2.19
Compiling phf v0.11.3
Compiling fraction v0.15.3
Compiling uuid-simd v0.8.0
Compiling referencing v0.30.0
Compiling rand_xorshift v0.4.0
Compiling rand v0.9.2
Compiling rand_chacha v0.9.0
Compiling fancy-regex v0.14.0
Compiling email_address v0.2.9
Compiling num-cmp v0.1.0
Compiling unarray v0.1.4
Compiling base64 v0.22.1
Compiling bytecount v0.6.8
Compiling proptest v1.9.0
Compiling radicle-oid v0.1.0 (/9ef52bd4-0c89-447a-b8b2-84cc0e8402c0/w/crates/radicle-oid)
Compiling radicle-git-ext v0.12.0
Compiling radicle-cob v0.19.0 (/9ef52bd4-0c89-447a-b8b2-84cc0e8402c0/w/crates/radicle-cob)
Compiling radicle-core v0.2.0 (/9ef52bd4-0c89-447a-b8b2-84cc0e8402c0/w/crates/radicle-core)
Compiling radicle v0.23.0 (/9ef52bd4-0c89-447a-b8b2-84cc0e8402c0/w/crates/radicle)
Compiling radicle-term v0.17.0 (/9ef52bd4-0c89-447a-b8b2-84cc0e8402c0/w/crates/radicle-term)
Compiling jsonschema v0.30.0
Compiling emojis v0.6.4
Compiling radicle-windows v0.1.0 (/9ef52bd4-0c89-447a-b8b2-84cc0e8402c0/w/crates/radicle-windows)
Compiling radicle-fetch v0.19.0 (/9ef52bd4-0c89-447a-b8b2-84cc0e8402c0/w/crates/radicle-fetch)
Compiling radicle-protocol v0.7.0 (/9ef52bd4-0c89-447a-b8b2-84cc0e8402c0/w/crates/radicle-protocol)
Compiling radicle-cli-test v0.13.0 (/9ef52bd4-0c89-447a-b8b2-84cc0e8402c0/w/crates/radicle-cli-test)
Compiling radicle-schemars v0.7.0 (/9ef52bd4-0c89-447a-b8b2-84cc0e8402c0/w/crates/radicle-schemars)
Finished `dev` profile [unoptimized + debuginfo] target(s) in 58.93s
+ cargo doc --workspace --no-deps --all-features
Checking regex-automata v0.4.9
Compiling syn v1.0.109
Compiling num-traits v0.2.19
Checking idna v1.0.3
Checking url v2.5.4
Checking git2 v0.20.4
Checking num-integer v0.1.46
Checking num-iter v0.1.45
Checking num-bigint-dig v0.8.4
Compiling amplify_syn v2.0.1
Checking bstr v1.12.0
Compiling data-encoding-macro-internal v0.1.12
Checking gix-validate v0.11.0
Checking git-ref-format-core v0.6.0
Checking gix-path v0.11.1
Compiling amplify_derive v4.0.0
Checking rsa v0.9.6
Checking data-encoding-macro v0.1.14
Checking gix-features v0.46.1
Checking multibase v0.9.1
Checking radicle-git-ref-format v0.1.0 (/9ef52bd4-0c89-447a-b8b2-84cc0e8402c0/w/crates/radicle-git-ref-format)
Checking gix-hash v0.22.1
Checking gix-error v0.1.0
Checking ssh-key v0.6.6
Checking proptest v1.9.0
Checking gix-hashtable v0.12.0
Checking radicle-oid v0.1.0 (/9ef52bd4-0c89-447a-b8b2-84cc0e8402c0/w/crates/radicle-oid)
Checking gix-error v0.0.0
Checking radicle-git-metadata v0.2.0 (/9ef52bd4-0c89-447a-b8b2-84cc0e8402c0/w/crates/radicle-git-metadata)
Checking ssh-agent-lib v0.5.2
Checking radicle-dag v0.10.0 (/9ef52bd4-0c89-447a-b8b2-84cc0e8402c0/w/crates/radicle-dag)
Checking gix-date v0.14.0
Checking chrono v0.4.38
Checking radicle-localtime v0.1.0 (/9ef52bd4-0c89-447a-b8b2-84cc0e8402c0/w/crates/radicle-localtime)
Checking amplify v4.6.0
Checking gix-actor v0.39.0
Checking gix-date v0.13.0
Checking cyphergraphy v0.3.0
Checking gix-fs v0.19.1
Checking cypheraddr v0.4.0
Checking noise-framework v0.4.0
Checking gix-tempfile v21.0.1
Checking gix-actor v0.38.0
Checking socks5-client v0.4.1
Checking gix-object v0.56.0
Checking gix-chunk v0.6.0
Checking cyphernet v0.5.2
Checking gix-quote v0.6.2
Checking radicle-crypto v0.16.0 (/9ef52bd4-0c89-447a-b8b2-84cc0e8402c0/w/crates/radicle-crypto)
Checking gix-commitgraph v0.33.0
Checking gix-object v0.55.0
Checking gix-chunk v0.5.0
Checking gix-command v0.7.1
Checking radicle-cob v0.19.0 (/9ef52bd4-0c89-447a-b8b2-84cc0e8402c0/w/crates/radicle-cob)
Checking radicle-core v0.2.0 (/9ef52bd4-0c89-447a-b8b2-84cc0e8402c0/w/crates/radicle-core)
Checking gix-revwalk v0.27.0
Checking gix-commitgraph v0.32.0
Checking gix-lock v21.0.1
Checking gix-url v0.35.1
Checking radicle v0.23.0 (/9ef52bd4-0c89-447a-b8b2-84cc0e8402c0/w/crates/radicle)
Checking gix-revwalk v0.26.0
Checking gix-config-value v0.17.1
Checking gix-diff v0.58.0
Checking gix-traverse v0.52.0
Checking gix-revision v0.41.0
Checking gix-prompt v0.13.1
Checking radicle-signals v0.11.0 (/9ef52bd4-0c89-447a-b8b2-84cc0e8402c0/w/crates/radicle-signals)
Checking gix-glob v0.24.0
Checking gix-packetline v0.21.1
Checking regex v1.11.1
Checking gix-transport v0.54.0
Checking gix-refspec v0.37.0
Checking tree-sitter v0.24.4
Checking gix-pack v0.65.0
Checking gix-credentials v0.36.0
Checking git-ref-format v0.6.0
Checking gix-shallow v0.8.1
Checking gix-ref v0.59.0
Checking gix-negotiate v0.27.0
Checking radicle-git-ext v0.12.0
Checking uuid v1.20.0
Checking gix-protocol v0.57.0
Compiling radicle-cli v0.20.0 (/9ef52bd4-0c89-447a-b8b2-84cc0e8402c0/w/crates/radicle-cli)
Checking gix-odb v0.75.0
Checking human-panic v2.0.6
Checking radicle-surf v0.27.0
Checking tree-sitter-toml-ng v0.6.0
Checking radicle-term v0.17.0 (/9ef52bd4-0c89-447a-b8b2-84cc0e8402c0/w/crates/radicle-term)
Checking tree-sitter-highlight v0.24.4
Checking radicle-systemd v0.12.0 (/9ef52bd4-0c89-447a-b8b2-84cc0e8402c0/w/crates/radicle-systemd)
Documenting radicle-systemd v0.12.0 (/9ef52bd4-0c89-447a-b8b2-84cc0e8402c0/w/crates/radicle-systemd)
Documenting radicle-term v0.17.0 (/9ef52bd4-0c89-447a-b8b2-84cc0e8402c0/w/crates/radicle-term)
Documenting radicle v0.23.0 (/9ef52bd4-0c89-447a-b8b2-84cc0e8402c0/w/crates/radicle)
Documenting radicle-signals v0.11.0 (/9ef52bd4-0c89-447a-b8b2-84cc0e8402c0/w/crates/radicle-signals)
Documenting radicle-cob v0.19.0 (/9ef52bd4-0c89-447a-b8b2-84cc0e8402c0/w/crates/radicle-cob)
Documenting radicle-core v0.2.0 (/9ef52bd4-0c89-447a-b8b2-84cc0e8402c0/w/crates/radicle-core)
Documenting radicle-crypto v0.16.0 (/9ef52bd4-0c89-447a-b8b2-84cc0e8402c0/w/crates/radicle-crypto)
Documenting radicle-oid v0.1.0 (/9ef52bd4-0c89-447a-b8b2-84cc0e8402c0/w/crates/radicle-oid)
Documenting radicle-git-ref-format v0.1.0 (/9ef52bd4-0c89-447a-b8b2-84cc0e8402c0/w/crates/radicle-git-ref-format)
Documenting radicle-localtime v0.1.0 (/9ef52bd4-0c89-447a-b8b2-84cc0e8402c0/w/crates/radicle-localtime)
Documenting radicle-dag v0.10.0 (/9ef52bd4-0c89-447a-b8b2-84cc0e8402c0/w/crates/radicle-dag)
Documenting radicle-git-metadata v0.2.0 (/9ef52bd4-0c89-447a-b8b2-84cc0e8402c0/w/crates/radicle-git-metadata)
Documenting radicle-windows v0.1.0 (/9ef52bd4-0c89-447a-b8b2-84cc0e8402c0/w/crates/radicle-windows)
Checking radicle-fetch v0.19.0 (/9ef52bd4-0c89-447a-b8b2-84cc0e8402c0/w/crates/radicle-fetch)
Documenting radicle-cli v0.20.0 (/9ef52bd4-0c89-447a-b8b2-84cc0e8402c0/w/crates/radicle-cli)
Documenting radicle-cli-test v0.13.0 (/9ef52bd4-0c89-447a-b8b2-84cc0e8402c0/w/crates/radicle-cli-test)
Checking radicle-protocol v0.7.0 (/9ef52bd4-0c89-447a-b8b2-84cc0e8402c0/w/crates/radicle-protocol)
Documenting radicle-protocol v0.7.0 (/9ef52bd4-0c89-447a-b8b2-84cc0e8402c0/w/crates/radicle-protocol)
Documenting radicle-node v0.19.0 (/9ef52bd4-0c89-447a-b8b2-84cc0e8402c0/w/crates/radicle-node)
Documenting radicle-schemars v0.7.0 (/9ef52bd4-0c89-447a-b8b2-84cc0e8402c0/w/crates/radicle-schemars)
Documenting radicle-fetch v0.19.0 (/9ef52bd4-0c89-447a-b8b2-84cc0e8402c0/w/crates/radicle-fetch)
Documenting radicle-remote-helper v0.16.0 (/9ef52bd4-0c89-447a-b8b2-84cc0e8402c0/w/crates/radicle-remote-helper)
Finished `dev` profile [unoptimized + debuginfo] target(s) in 9.79s
Generated /9ef52bd4-0c89-447a-b8b2-84cc0e8402c0/w/target/doc/radicle/index.html and 20 other files
+ cargo test --workspace --no-fail-fast
Finished `test` profile [unoptimized + debuginfo] target(s) in 0.21s
Running unittests src/lib.rs (target/debug/deps/radicle-488a5fd3b76cee4f)
running 321 tests
test canonical::formatter::test::ascii_control_characters ... ok
test canonical::formatter::test::securesystemslib_asserts ... ok
test canonical::formatter::test::ordered_nested_object ... ok
test cob::cache::migrations::_2::tests::test_patch_json_deserialization ... ok
test cob::common::test::test_color ... ok
test cob::common::test::test_emojis ... ok
test cob::cache::tests::test_migrate_to ... ok
test cob::cache::tests::test_check_version ... ok
test cob::cache::migrations::_2::tests::test_migration_2 ... ok
test cob::common::test::test_title ... ok
test cob::identity::test::prop_json_eq_str ... ok
test cob::identity::test::test_identity_remove_delegate_concurrent ... ok
test cob::identity::test::test_identity_redact_revision ... ok
test cob::identity::test::test_identity_reject_concurrent ... ok
test cob::identity::test::test_identity_update_rejected ... ok
test cob::identity::test::test_identity_updates ... ok
test cob::issue::cache::tests::test_counts ... ok
test cob::issue::cache::tests::test_get ... ok
test cob::issue::cache::tests::test_is_empty ... ok
test cob::issue::cache::tests::test_list ... ok
test cob::issue::cache::tests::test_list_by_status ... ok
test cob::issue::cache::tests::test_remove ... ok
test cob::identity::test::test_valid_identity ... ok
test cob::identity::test::test_identity_updates_concurrent ... ok
test cob::issue::test::test_embeds ... ok
test cob::issue::test::test_embeds_edit ... ok
test cob::issue::test::test_invalid_actions ... ok
test cob::identity::test::test_identity_updates_concurrent_outdated ... ok
test cob::issue::test::test_invalid_cob ... ok
test cob::issue::test::test_invalid_tx ... ok
test cob::issue::test::test_invalid_tx_reference ... ok
test cob::issue::test::test_concurrency ... ok
test cob::issue::test::test_issue_all ... ok
test cob::issue::test::test_issue_comment ... ok
test cob::issue::test::test_issue_comment_redact ... ok
test cob::issue::test::test_issue_create_and_assign ... ok
test cob::issue::test::test_issue_create_and_get ... ok
test cob::issue::test::test_issue_create_and_change_state ... ok
test cob::issue::test::test_issue_create_and_unassign ... ok
test cob::issue::test::test_issue_create_and_reassign ... ok
test cob::issue::test::test_issue_edit ... ok
test cob::issue::test::test_issue_edit_description ... ok
test cob::issue::test::test_issue_multilines ... ok
test cob::issue::test::test_issue_label ... ok
test cob::issue::test::test_issue_state_serde ... ok
test cob::issue::test::test_ordering ... ok
test cob::patch::actions::test::test_review_edit ... ok
test cob::issue::test::test_issue_react ... ok
test cob::patch::cache::tests::test_get ... ok
test cob::patch::cache::tests::test_is_empty ... ok
test cob::patch::cache::tests::test_list ... ok
test cob::issue::test::test_issue_reply ... ok
test cob::patch::cache::tests::test_remove ... ok
test cob::patch::encoding::review::test::test_review_deserialize_summary_migration_null_summary ... ok
test cob::patch::encoding::review::test::test_review_deserialize_summary_migration_with_summary ... ok
test cob::patch::encoding::review::test::test_review_deserialize_summary_migration_without_summary ... ok
test cob::patch::encoding::review::test::test_review_deserialize_summary_v2 ... ok
test cob::patch::encoding::review::test::test_review_summary ... ok
test cob::patch::test::test_json ... ok
test cob::patch::test::test_json_serialization ... ok
test cob::patch::cache::tests::test_list_by_status ... ok
test cob::patch::test::test_patch_create_and_get ... ok
test cob::patch::test::test_patch_discussion ... ok
test cob::patch::test::test_patch_merge ... ok
test cob::patch::test::test_patch_redact ... ok
test cob::patch::test::test_patch_review ... ok
test cob::patch::cache::tests::test_counts ... ok
test cob::patch::test::test_patch_review_comment ... ok
test cob::patch::test::test_patch_review_duplicate ... ok
test cob::patch::test::test_patch_review_edit ... ok
test cob::patch::test::test_patch_review_edit_comment ... ok
test cob::patch::test::test_patch_review_remove_summary ... ok
test cob::patch::test::test_reactions_json_serialization ... ok
test cob::patch::test::test_revision_edit_redact ... ok
test cob::patch::test::test_patch_review_revision_redact ... ok
test cob::patch::test::test_revision_review_merge_redacted ... ok
test cob::patch::test::test_revision_reaction ... ok
test cob::stream::tests::test_all_from ... ok
test cob::stream::tests::test_all_from_until ... ok
test cob::stream::tests::test_all_until ... ok
test cob::stream::tests::test_regression_from_until ... ok
test cob::stream::tests::test_from_until ... ok
test cob::thread::tests::test_comment_edit_missing ... ok
test cob::thread::tests::test_comment_edit_redacted ... ok
test cob::thread::tests::test_comment_redact_missing ... ok
test cob::thread::tests::test_duplicate_comments ... ok
test cob::thread::tests::test_edit_comment ... ok
test cob::thread::tests::test_redact_comment ... ok
test cob::thread::tests::test_timeline ... ok
test git::canonical::quorum::test::merge_base_commutative ... ok
test git::canonical::quorum::test::test_merge_bases ... ok
test cob::patch::test::test_patch_update ... ok
test git::canonical::rules::tests::test_deserialization ... ok
test git::canonical::rules::tests::test_deserialize_extensions ... ok
test git::canonical::rules::tests::test_order ... ok
test git::canonical::rules::tests::test_roundtrip ... ok
test git::canonical::rules::tests::test_canonical ... ok
test git::canonical::rules::tests::test_rule_validate_success ... ok
test git::canonical::rules::tests::test_special_branches ... ok
test git::canonical::tests::test_commit_quorum_fork_of_a_fork ... ok
test git::canonical::tests::test_commit_quorum_forked_merge_commits ... ok
test git::canonical::tests::test_commit_quorum_groups ... ok
test git::canonical::tests::test_commit_quorum_linear ... ok
test git::canonical::tests::test_commit_quorum_merges ... ok
test git::canonical::tests::test_commit_quorum_single ... ok
test git::canonical::tests::test_commit_quorum_three_way_fork ... ok
test git::canonical::tests::test_commit_quorum_two_way_fork ... ok
test git::canonical::tests::test_quorum_different_types ... ok
test git::canonical::rules::tests::test_rule_validate_failures ... ok
test git::canonical::tests::test_tag_quorum ... ok
test git::test::test_version_from_str ... ok
test git::test::test_version_ord ... ok
test identity::did::test::test_did_encode_decode ... ok
test identity::did::test::test_did_vectors ... ok
test cob::patch::cache::tests::test_find_by_revision ... ok
test identity::doc::test::test_canonical_doc ... ok
test identity::doc::test::test_canonical_example ... ok
test identity::doc::test::test_duplicate_dids ... ok
test identity::doc::test::test_future_version_error ... ok
test identity::doc::test::test_is_valid_version ... ok
test git::canonical::tests::test_quorum_properties ... ok
test identity::doc::test::test_not_found ... ok
test identity::doc::test::test_parse_version ... ok
test identity::doc::test::test_visibility_json ... ok
test identity::doc::update::test::test_can_update_crefs ... ok
test identity::doc::update::test::test_cannot_include_default_branch_rule ... ok
test identity::doc::update::test::test_default_branch_rule_exists_after_verification ... ok
test identity::project::test::test_project_name ... ok
test node::address::store::test::test_alias ... ok
test node::address::store::test::test_disconnected ... ok
test node::address::store::test::test_disconnected_ban ... ok
test node::address::store::test::test_empty ... ok
test node::address::store::test::test_entries ... ok
test node::address::store::test::test_get_none ... ok
test node::address::store::test::test_insert_and_get ... ok
test node::address::store::test::test_insert_and_remove ... ok
test node::address::store::test::test_insert_and_update ... ok
test node::address::store::test::test_insert_duplicate ... ok
test node::address::store::test::test_node_aliases ... ok
test node::address::store::test::test_remove_nothing ... ok
test node::command::test::command_result ... ok
test node::config::test::deserialize_migrating_scope ... ok
test node::config::test::fetch_level_min ... ok
test node::config::test::partial ... ok
test node::config::test::regression_ipv6_address_brackets ... ok
test node::config::test::regression_ipv6_address_no_brackets ... ok
test node::config::test::serialize_migrating_scope ... ok
test node::db::config::test::database_config_valid_combinations ... ok
test node::db::config::test::invalid ... ok
test node::db::test::migration_8::all_ipv6_formatted_dns_addresses_are_retyped ... ok
test node::db::test::migration_8::dns_address_starting_with_bracket_but_missing_closing_bracket_colon_is_unaffected ... ok
test node::db::test::migration_8::dns_address_with_bracket_not_at_start_is_unaffected ... ok
test node::db::test::migration_8::ipv4_address_is_unaffected ... ok
test node::db::test::migration_8::ipv6_formatted_dns_address_is_deleted_when_correct_ipv6_row_already_exists ... ok
test node::db::test::migration_8::ipv6_formatted_dns_address_is_retyped_to_ipv6 ... ok
test node::db::test::migration_8::migration_applies_to_all_nodes ... ok
test node::db::test::migration_8::plain_dns_hostname_without_brackets_is_unaffected ... ok
test node::db::test::migration_8::retype_preserves_address_metadata ... ok
test identity::doc::test::test_max_delegates ... ok
test node::features::test::test_operations ... ok
test node::db::test::test_version ... ok
test node::notifications::store::test::test_branch_notifications ... ok
test node::notifications::store::test::test_clear ... ok
test node::notifications::store::test::test_cob_notifications ... ok
test node::notifications::store::test::test_counts_by_repo ... ok
test node::notifications::store::test::test_duplicate_notifications ... ok
test node::notifications::store::test::test_notification_status ... ok
test node::policy::store::test::test_follow_and_unfollow_node ... ok
test node::policy::store::test::test_node_policies ... ok
test node::policy::store::test::test_node_aliases ... ok
test node::policy::store::test::test_node_policy ... ok
test node::policy::store::test::test_repo_policies ... ok
test node::policy::store::test::test_repo_policy ... ok
test node::policy::store::test::test_seed_and_unseed_repo ... ok
test node::policy::store::test::test_update_scope ... ok
test node::policy::store::test::test_update_alias ... ok
test node::refs::store::test::test_count ... ok
test node::refs::store::test::test_set_and_delete ... ok
test node::refs::store::test::test_set_and_get ... ok
test node::routing::test::test_count ... ok
test node::routing::test::test_entries ... ok
test node::routing::test::test_insert_and_get ... ok
test node::routing::test::test_insert_and_get_resources ... ok
test node::routing::test::test_insert_and_remove ... ok
test node::routing::test::test_insert_duplicate ... ok
test node::routing::test::test_insert_existing_updated_time ... ok
test node::routing::test::test_len ... ok
test node::routing::test::test_remove_many ... ok
test node::routing::test::test_remove_redundant ... ok
test node::routing::test::test_update_existing_multi ... ok
test cob::thread::tests::prop_ordering ... ok
test node::sync::announce::test::all_synced_nodes_are_preferred_seeds ... ok
test node::sync::announce::test::announcer_adapts_target_to_reach ... ok
test node::sync::announce::test::announcer_preferred_seeds_or_replica_factor ... ok
test node::routing::test::test_prune ... ok
test node::sync::announce::test::announcer_reached_max_replication_target ... ok
test node::sync::announce::test::announcer_reached_min_replication_target ... ok
test node::sync::announce::test::announcer_reached_preferred_seeds ... ok
test node::sync::announce::test::announcer_synced_with_unknown_node ... ok
test node::sync::announce::test::announcer_with_replication_factor_zero_and_preferred_seeds ... ok
test node::sync::announce::test::construct_node_appears_in_multiple_input_sets ... ok
test node::sync::announce::test::announcer_timed_out ... ok
test node::sync::announce::test::cannot_construct_announcer ... ok
test node::sync::announce::test::construct_only_preferred_seeds_provided ... ok
test node::sync::announce::test::invariant_progress_should_match_state ... ok
test node::sync::announce::test::local_node_in_preferred_seeds ... ok
test node::sync::announce::test::local_node_in_multiple_sets ... ok
test node::sync::announce::test::local_node_in_synced_set ... ok
test node::sync::announce::test::local_node_in_unsynced_set ... ok
test node::sync::announce::test::local_node_only_in_all_sets_results_in_no_seeds_error ... ok
test node::sync::announce::test::synced_with_local_node_is_ignored ... ok
test node::sync::announce::test::synced_with_same_node_multiple_times ... ok
test node::sync::announce::test::preferred_seeds_already_synced ... ok
test node::sync::announce::test::timed_out_after_reaching_success ... ok
test node::sync::fetch::test::could_not_reach_target ... ok
test node::sync::fetch::test::all_nodes_are_candidates ... ok
test node::sync::fetch::test::ignores_duplicates_and_local_node ... ok
test node::sync::fetch::test::preferred_seeds_target_returned_over_replicas ... ok
test node::sync::fetch::test::reaches_target_of_max_replicas ... ok
test node::sync::fetch::test::all_nodes_are_fetchable ... ok
test node::sync::test::ensure_replicas_construction ... ok
test node::sync::test::replicas_constrain_to ... ok
test node::test::test_address ... ok
test node::test::test_alias ... ok
test node::test::test_command_result ... ok
test node::test::test_user_agent ... ok
test node::timestamp::tests::test_timestamp_max ... ok
test node::sync::fetch::test::reaches_target_of_replicas ... ok
test node::sync::fetch::test::reaches_target_of_preferred_seeds ... ok
test profile::test::canonicalize_home ... ok
test profile::test::test_config ... ok
test rad::tests::test_fork ... ok
test rad::tests::test_checkout ... ok
test rad::tests::test_init ... ok
test storage::git::tests::test_references_of ... ok
test storage::git::transport::local::url::test::test_url_parse ... ok
test storage::git::transport::local::url::test::test_url_to_string ... ok
test storage::git::transport::remote::url::test::test_url_parse ... ok
test storage::git::tests::test_sign_refs ... ok
test profile::config::test::schema ... ok
test storage::refs::sigrefs::read::test::commit_reader::identity_root_error ... ok
test storage::refs::sigrefs::read::test::commit_reader::missing_commit ... ok
test storage::refs::sigrefs::read::test::commit_reader::read_ok ... ok
test storage::refs::sigrefs::read::test::commit_reader::too_many_parents ... ok
test storage::refs::sigrefs::read::test::commit_reader::tree_error ... ok
test storage::refs::sigrefs::read::test::identity_root_reader::doc_blob_error ... ok
test storage::refs::sigrefs::read::test::identity_root_reader::missing_identity ... ok
test storage::refs::sigrefs::read::test::identity_root_reader::read_ok_none ... ok
test storage::refs::sigrefs::read::test::identity_root_reader::read_ok_some ... ok
test storage::refs::sigrefs::read::test::resolve_tip::find_reference_error ... ok
test storage::refs::sigrefs::read::test::resolve_tip::missing_sigrefs ... ok
test storage::refs::sigrefs::read::test::resolve_tip::resolve_tip_ok ... ok
test storage::refs::sigrefs::read::test::signed_refs_reader::detect_parent::root_without_parent ... ok
test storage::refs::sigrefs::read::test::signed_refs_reader::detect_parent::root_without_root ... ok
test storage::refs::sigrefs::read::test::signed_refs_reader::downgrade::parent ... ok
test storage::refs::sigrefs::read::test::signed_refs_reader::downgrade::restore ... ok
test storage::refs::sigrefs::read::test::signed_refs_reader::downgrade::root ... ok
test storage::refs::sigrefs::read::test::signed_refs_reader::downgrade::root_with_parent ... ok
test storage::refs::sigrefs::read::test::signed_refs_reader::head_commit_error ... ok
test storage::refs::sigrefs::read::test::signed_refs_reader::head_verify_mismatched_identity_error ... ok
test storage::refs::sigrefs::read::test::signed_refs_reader::head_verify_signature_error ... ok
test storage::refs::sigrefs::read::test::signed_refs_reader::invalid_parent ... ok
test storage::refs::sigrefs::read::test::signed_refs_reader::read_ok_no_parent ... ok
test storage::refs::sigrefs::read::test::signed_refs_reader::read_ok_parent ... ok
test storage::refs::sigrefs::read::test::signed_refs_reader::read_ok_root ... ok
test storage::refs::sigrefs::read::test::signed_refs_reader::replay::alternating ... ok
test storage::refs::sigrefs::read::test::signed_refs_reader::replay::chain ... ok
test storage::refs::sigrefs::read::test::signed_refs_reader::replay::multiple ... ok
test storage::refs::sigrefs::read::test::signed_refs_reader::replay::root_at_head ... ok
test storage::refs::sigrefs::read::test::signed_refs_reader::single_commit ... ok
test storage::refs::sigrefs::read::test::signed_refs_reader::two_commits ... ok
test storage::refs::sigrefs::read::test::signed_refs_reader::walk_commit_error ... ok
test storage::refs::sigrefs::read::test::signed_refs_reader::walk_verify_error ... ok
test storage::refs::sigrefs::read::test::tree_reader::missing_both ... ok
test storage::refs::sigrefs::read::test::tree_reader::missing_refs ... ok
test storage::refs::sigrefs::read::test::tree_reader::missing_signature ... ok
test storage::refs::sigrefs::read::test::tree_reader::parse_refs_error ... ok
test storage::refs::sigrefs::read::test::tree_reader::parse_signature_error ... ok
test storage::refs::sigrefs::read::test::tree_reader::read_ok ... ok
test storage::refs::sigrefs::read::test::tree_reader::read_refs_error ... ok
test storage::refs::sigrefs::read::test::tree_reader::read_signature_error ... ok
test storage::refs::sigrefs::write::test::commit_writer::tree_error ... ok
test storage::refs::sigrefs::write::test::commit_writer::write_commit_error ... ok
test storage::refs::sigrefs::write::test::commit_writer::write_empty_refs ... ok
test storage::refs::sigrefs::write::test::commit_writer::write_root_ok ... ok
test storage::refs::sigrefs::write::test::commit_writer::write_with_parent_ok ... ok
test storage::refs::sigrefs::write::test::head_reader::no_head ... ok
test storage::refs::sigrefs::write::test::head_reader::read_ok ... ok
test storage::refs::sigrefs::write::test::head_reader::reference_error ... ok
test storage::refs::sigrefs::write::test::head_reader::refs_blob_error ... ok
test storage::refs::sigrefs::write::test::head_reader::refs_blob_missing ... ok
test storage::refs::sigrefs::write::test::head_reader::refs_parse_error ... ok
test storage::refs::sigrefs::write::test::head_reader::signature_blob_error ... ok
test storage::refs::sigrefs::write::test::head_reader::signature_blob_missing ... ok
test storage::refs::sigrefs::write::test::head_reader::signature_parse_error ... ok
test storage::refs::sigrefs::write::test::signed_refs_writer::commit_error ... ok
test storage::refs::sigrefs::write::test::signed_refs_writer::head_error ... ok
test storage::refs::sigrefs::write::test::signed_refs_writer::never_write_rad_sigrefs ... ok
test storage::refs::sigrefs::write::test::signed_refs_writer::reference_error ... ok
test storage::refs::sigrefs::write::test::signed_refs_writer::unchanged ... ok
test storage::refs::sigrefs::write::test::signed_refs_writer::unchanged_force_writes_new_commit ... ok
test storage::refs::sigrefs::write::test::signed_refs_writer::write_empty_refs ... ok
test storage::refs::sigrefs::write::test::signed_refs_writer::write_root_ok ... ok
test storage::refs::sigrefs::write::test::signed_refs_writer::write_with_parent_ok ... ok
test storage::refs::sigrefs::write::test::tree_writer::sign_error ... ok
test storage::refs::sigrefs::write::test::tree_writer::write_ok ... ok
test storage::refs::sigrefs::write::test::tree_writer::write_tree_error ... ok
test storage::refs::tests::prop_canonical_roundtrip ... ok
test storage::refs::tests::test_rid_verification ... ok
test storage::tests::test_storage ... ok
test test::assert::test::assert_with_message ... ok
test test::assert::test::test_assert_no_move ... ok
test test::assert::test::test_assert_panic_0 - should panic ... ok
test test::assert::test::test_assert_panic_1 - should panic ... ok
test test::assert::test::test_assert_panic_2 - should panic ... ok
test test::assert::test::test_assert_succeed ... ok
test test::assert::test::test_panic_message ... ok
test version::test::test_version ... ok
test storage::refs::sigrefs::property::idempotent ... ok
test identity::doc::test::prop_encode_decode ... ok
test storage::refs::sigrefs::property::roundtrip ... ok
test result: ok. 321 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 3.48s
Running unittests src/lib.rs (target/debug/deps/radicle_cli-29d2e7f14b861f1a)
running 46 tests
test commands::block::args::test::should_not_parse ... ok
test commands::block::args::test::should_parse_rid ... ok
test commands::block::args::test::should_parse_nid ... ok
test commands::clone::args::test::should_parse_rid_non_urn ... ok
test commands::clone::args::test::should_parse_rid_urn ... ok
test commands::clone::args::test::should_parse_rid_url ... ok
test commands::cob::args::test::should_allow_log_json_format ... ok
test commands::cob::args::test::should_allow_show_json_format ... ok
test commands::cob::args::test::should_allow_log_pretty_format ... ok
test commands::cob::args::test::should_allow_update_json_format ... ok
test commands::fork::args::test::should_not_parse_rid_url ... ok
test commands::cob::args::test::should_not_allow_update_pretty_format ... ok
test commands::cob::args::test::should_not_allow_show_pretty_format ... ok
test commands::fork::args::test::should_parse_rid_non_urn ... ok
test commands::id::args::test::should_not_parse_into_payload - should panic ... ok
test commands::fork::args::test::should_parse_rid_urn ... ok
test commands::id::args::test::should_not_clobber_payload_args ... ok
test commands::id::args::test::should_parse_into_payload ... ok
test commands::id::args::test::should_not_parse_single_payloads ... ok
test commands::id::args::test::should_not_parse_single_payload ... ok
test commands::id::args::test::should_parse_multiple_payloads ... ok
test commands::init::args::test::should_not_parse_rid_url ... ok
test commands::init::args::test::should_parse_rid_non_urn ... ok
test commands::inspect::test::test_tree ... ok
test commands::patch::review::builder::tests::test_review_comments_basic ... ok
test commands::init::args::test::should_parse_rid_urn ... ok
test commands::patch::review::builder::tests::test_review_comments_before ... ok
test commands::patch::review::builder::tests::test_review_comments_multiline ... ok
test commands::patch::review::builder::tests::test_review_comments_split_hunk ... ok
test commands::publish::args::test::should_not_parse_rid_url ... ok
test commands::id::args::test::should_parse_single_payload ... ok
test commands::publish::args::test::should_parse_rid_non_urn ... ok
test commands::publish::args::test::should_parse_rid_urn ... ok
test commands::watch::args::test::should_parse_ref_str ... ok
test git::ddiff::tests::diff_encode_decode_ddiff_hunk ... ok
test git::pretty_diff::test::test_pretty ... ignored
test git::unified_diff::test::test_diff_content_encode_decode_content ... ok
test terminal::args::test::should_not_parse ... ok
test git::unified_diff::test::test_diff_encode_decode_diff ... ok
test terminal::args::test::should_parse_nid ... ok
test terminal::args::test::should_parse_rid ... ok
test terminal::format::test::test_bytes ... ok
test terminal::format::test::test_strip_comments ... ok
test terminal::patch::test::test_edit_display_message ... ok
test terminal::patch::test::test_create_display_message ... ok
test terminal::patch::test::test_update_display_message ... ok
test result: ok. 45 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 0.01s
Running unittests src/main.rs (target/debug/deps/rad-cdf83dc79e1a453e)
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Running tests/commands.rs (target/debug/deps/commands-38a43ceebed353ea)
running 115 tests
test commands::clone::rad_clone_bare ... ok
test commands::clone::rad_clone ... ok
test commands::checkout::rad_checkout ... ok
test commands::clone::rad_clone_all ... ok
test commands::clone::rad_clone_scope ... ok
test commands::clone::rad_clone_unknown ... ok
test commands::clone::rad_clone_directory ... ok
test commands::clone::rad_clone_partial_fail ... ok
test commands::clone::rad_clone_connect ... ok
test commands::cob::rad_cob_multiset ... ok
test commands::clone::test_clone_without_seeds ... ok
test commands::cob::rad_cob_log ... ok
test commands::cob::rad_cob_migrate ... ok
test commands::cob::rad_cob_operations ... ok
test commands::cob::rad_cob_show ... ok
test commands::cob::rad_cob_update_identity ... ok
test commands::cob::rad_cob_update ... ok
test commands::cob::test_cob_deletion ... ok
test commands::cob::test_cob_replication ... ok
test commands::git::git_push_amend ... ok
test commands::git::git_push_and_fetch ... ok
test commands::git::git_push_canonical_annotated_tags ... ok
test commands::git::git_push_canonical_lightweight_tags ... ok
test commands::git::git_push_force_with_lease ... ok
test commands::git::git_push_diverge ... ok
test commands::id::rad_id ... ok
test commands::id::rad_id_collaboration ... ignored, slow
test commands::git::git_push_converge ... ok
test commands::git::git_push_rollback ... ok
test commands::git::git_tag ... ok
test commands::id::rad_id_private ... ok
test commands::id::rad_id_threshold_soft_fork ... ok
test commands::id::rad_id_conflict ... ok
test commands::id::rad_id_threshold ... ok
test commands::id::rad_id_unknown_field ... ok
test commands::id::rad_id_update_delete_field ... ok
test commands::init::rad_init ... ignored, part of many other tests
test commands::id::rad_id_unauthorized_delegate ... ok
test commands::init::rad_init_detached_head ... ok
test commands::id::rad_id_multi_delegate ... ok
test commands::init::rad_init_bare ... ok
test commands::init::rad_init_no_git ... ok
test commands::init::rad_init_existing ... ok
test commands::init::rad_init_existing_bare ... ok
test commands::init::rad_init_no_seed ... ok
test commands::init::rad_init_private ... ok
test commands::init::rad_init_private_no_seed ... ok
test commands::inbox::rad_inbox ... ok
test commands::init::rad_init_private_clone ... ok
test commands::init::rad_init_private_clone_seed ... ok
test commands::init::rad_init_sync_not_connected ... ok
test commands::init::rad_init_private_seed ... ok
test commands::init::rad_init_sync_preferred ... ok
test commands::init::rad_init_with_existing_remote ... ok
test commands::init::rad_publish ... ok
test commands::issue::rad_issue ... ok
test commands::jj::rad_jj_bare ... ok
test commands::jj::rad_jj_colocated_patch ... ok
test commands::issue::rad_issue_list ... ok
test commands::node::rad_node_connect ... ok
test commands::node::rad_node_connect_without_address ... ok
test commands::patch::rad_merge_after_update ... ok
test commands::node::rad_node ... ok
test commands::patch::rad_merge_no_ff ... ok
test commands::patch::rad_merge_via_push ... ok
test commands::patch::rad_patch_ahead_behind ... ok
test commands::patch::rad_patch ... ok
test commands::patch::rad_patch_change_base ... ok
test commands::patch::rad_patch_checkout ... ok
test commands::patch::rad_patch_checkout_revision ... ok
test commands::init::rad_init_sync_timeout ... ok
test commands::init::rad_init_sync_and_clone ... ok
test commands::patch::rad_patch_detached_head ... ok
test commands::patch::rad_patch_checkout_force ... ok
test commands::patch::rad_patch_diff ... ok
test commands::patch::rad_patch_draft ... ok
test commands::patch::rad_patch_edit ... ok
test commands::patch::rad_patch_fetch_2 ... FAILED
test commands::patch::rad_patch_merge_draft ... ok
test commands::patch::rad_patch_fetch_1 ... ok
test commands::patch::rad_patch_revert_merge ... ok
test commands::patch::rad_patch_delete ... ok
test commands::patch::rad_patch_open_explore ... ok
test commands::patch::rad_patch_update ... ok
test commands::patch::rad_patch_via_push ... FAILED
test commands::policy::rad_block ... ok
test commands::policy::rad_seed_and_follow ... ok
test commands::patch::rad_review_by_hunk ... ok
test commands::policy::rad_seed_policy_allow_no_scope ... ok
test commands::policy::rad_seed_scope ... ok
test commands::policy::rad_unseed ... ok
test commands::policy::rad_seed_many ... ok
test commands::policy::rad_unseed_many ... ok
test commands::patch::rad_push_and_pull_patches ... ok
test commands::remote::rad_remote ... ok
test commands::sync::rad_sync_without_node ... ok
test commands::sync::rad_sync ... ok
test commands::utility::framework_home ... ok
test commands::utility::rad_auth ... ok
test commands::utility::rad_auth_errors ... ok
test commands::utility::rad_clean ... ok
test commands::patch::rad_patch_pull_update ... ok
test commands::utility::rad_config ... ok
test commands::utility::rad_diff ... ok
test commands::utility::rad_help ... ok
test commands::utility::rad_inspect ... ok
test commands::utility::rad_key_mismatch ... ok
test commands::utility::rad_self ... ok
test commands::utility::rad_warn_old_nodes ... ok
test commands::sync::rad_fetch ... ok
test commands::watch::rad_watch ... ok
test rad_remote ... ok
test commands::sync::test_replication_via_seed ... ok
test commands::workflow::rad_workflow ... ok
test commands::utility::rad_fork ... ok
failures:
---- commands::patch::rad_patch_fetch_2 stdout ----
1774972467 test: rad-init:6: `rad init --name heartwood --description Radicle Heartwood Protocol & Stack --no-confirm --public -v` @ /tmp/.tmpEnivPt/alice/work
1774972467 test: rad-init:28: `rad init` @ /tmp/.tmpEnivPt/alice/work
1774972467 test: rad-init:35: `rad ls` @ /tmp/.tmpEnivPt/alice/work
1774972467 test: rad-init:46: `rad node inventory` @ /tmp/.tmpEnivPt/alice/work
1774972467 test: rad-patch-fetch-2:6: `git checkout -b alice/1 -q` @ /tmp/.tmpEnivPt/alice/work
1774972467 test: rad-patch-fetch-2:7: `git commit --allow-empty -m Changes #1 -q` @ /tmp/.tmpEnivPt/alice/work
1774972467 test: rad-patch-fetch-2:8: `git push rad -o patch.message=Changes HEAD:refs/patches` @ /tmp/.tmpEnivPt/alice/work
1774972467 test: rad-patch-fetch-2:12: `git checkout master -q` @ /tmp/.tmpEnivPt/alice/work
1774972467 test: rad-patch-fetch-2:13: `git branch -D alice/1 -q` @ /tmp/.tmpEnivPt/alice/work
1774972467 test: rad-patch-fetch-2:14: `git update-ref -d refs/remotes/rad/alice/1` @ /tmp/.tmpEnivPt/alice/work
1774972467 test: rad-patch-fetch-2:15: `git update-ref -d refs/remotes/rad/patches/5e2dedcc5d515fcbc1cca483d3376609fe889bfb` @ /tmp/.tmpEnivPt/alice/work
1774972467 test: rad-patch-fetch-2:16: `git gc --prune=now` @ /tmp/.tmpEnivPt/alice/work
1774972467 test: rad-patch-fetch-2:17: `git branch -r` @ /tmp/.tmpEnivPt/alice/work
1774972467 test: rad-patch-fetch-2:22: `git pull` @ /tmp/.tmpEnivPt/alice/work
1774972467 test: rad-patch-fetch-2:24: `git branch -r` @ /tmp/.tmpEnivPt/alice/work
thread 'commands::patch::rad_patch_fetch_2' panicked at crates/radicle-cli-test/src/lib.rs:502:36:
--- Expected
++++ actual: stdout
1 - rad/HEAD -> rad/master
2 1 | rad/master
3 2 | rad/patches/5e2dedcc5d515fcbc1cca483d3376609fe889bfb
Exit status: 0
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
---- commands::patch::rad_patch_via_push stdout ----
1774972468 test: rad-init:6: `rad init --name heartwood --description Radicle Heartwood Protocol & Stack --no-confirm --public -v` @ /tmp/.tmpusaL7x/alice/work
1774972468 test: rad-init:28: `rad init` @ /tmp/.tmpusaL7x/alice/work
1774972468 test: rad-init:35: `rad ls` @ /tmp/.tmpusaL7x/alice/work
1774972468 test: rad-init:46: `rad node inventory` @ /tmp/.tmpusaL7x/alice/work
1774972468 test: rad-patch-via-push:7: `git checkout -b feature/1` @ /tmp/.tmpusaL7x/alice/work
1774972468 test: rad-patch-via-push:9: `git commit -a -m Add things -q --allow-empty` @ /tmp/.tmpusaL7x/alice/work
1774972468 test: rad-patch-via-push:10: `git push -o patch.message=Add things #1 -o patch.message=See commits for details. rad HEAD:refs/patches` @ /tmp/.tmpusaL7x/alice/work
1774972469 test: rad-patch-via-push:22: `rad patch show 6035d2f582afbe01ff23ea87528ae523d76875b6` @ /tmp/.tmpusaL7x/alice/work
1774972469 test: rad-patch-via-push:45: `git branch -vv` @ /tmp/.tmpusaL7x/alice/work
1774972469 test: rad-patch-via-push:53: `git status --short --branch` @ /tmp/.tmpusaL7x/alice/work
1774972469 test: rad-patch-via-push:55: `git fetch` @ /tmp/.tmpusaL7x/alice/work
1774972469 test: rad-patch-via-push:56: `git push` @ /tmp/.tmpusaL7x/alice/work
1774972469 test: rad-patch-via-push:62: `git show-ref` @ /tmp/.tmpusaL7x/alice/work
thread 'commands::patch::rad_patch_via_push' panicked at crates/radicle-cli-test/src/lib.rs:502:36:
--- Expected
++++ actual: stdout
1 1 | 42d894a83c9c356552a57af09ccdbd5587a99045 refs/heads/feature/1
2 2 | f2de534b5e81d7c6e2dcaf58c3dd91573c0a0354 refs/heads/master
3 - f2de534b5e81d7c6e2dcaf58c3dd91573c0a0354 refs/remotes/rad/HEAD
4 3 | f2de534b5e81d7c6e2dcaf58c3dd91573c0a0354 refs/remotes/rad/master
5 4 | 42d894a83c9c356552a57af09ccdbd5587a99045 refs/remotes/rad/patches/6035d2f582afbe01ff23ea87528ae523d76875b6
Exit status: 0
failures:
commands::patch::rad_patch_fetch_2
commands::patch::rad_patch_via_push
test result: FAILED. 111 passed; 2 failed; 2 ignored; 0 measured; 0 filtered out; finished in 72.74s
error: test failed, to rerun pass `-p radicle-cli --test commands`
Running unittests src/lib.rs (target/debug/deps/radicle_cli_test-e5b8c9c36f09cb81)
running 3 tests
test tests::test_parse ... ok
test tests::test_run ... ok
test tests::test_example_spaced_brackets ... ok
test result: ok. 3 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Running unittests src/lib.rs (target/debug/deps/radicle_cob-9169dc8d96b4ed28)
running 9 tests
test object::tests::test_serde ... ok
test tests::git::roundtrip ... ok
test tests::git::list_cobs ... ok
test tests::git::traverse_cobs ... ok
test type_name::test::invalid_typenames ... ok
test type_name::test::valid_typenames ... ok
test tests::invalid_parse_refstr ... ok
test tests::parse_refstr ... ok
test tests::git::update_cob ... ok
test result: ok. 9 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.01s
Running unittests src/lib.rs (target/debug/deps/radicle_core-b9ec6390f6b0d950)
running 4 tests
test repo::test::invalid ... ok
test repo::test::valid ... ok
test repo::test::assert_prop_roundtrip_parse ... ok
test repo::serde_impls::test::assert_prop_roundtrip_serde_json ... ok
test result: ok. 4 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Running unittests src/lib.rs (target/debug/deps/radicle_crypto-d7effc88f890eda1)
running 11 tests
test ssh::agent::test::test_agent_encoding_remove ... ok
test ssh::agent::test::test_agent_encoding_sign ... ok
test ssh::fmt::test::test_fingerprint ... ok
test ssh::fmt::test::test_key ... ok
test ssh::keystore::tests::test_init_no_passphrase ... ok
test tests::prop_encode_decode ... ok
test tests::test_e25519_dh ... ok
test tests::test_encode_decode ... ok
test tests::prop_key_equality ... ok
test ssh::keystore::tests::test_signer ... ok
test ssh::keystore::tests::test_init_passphrase ... ok
test result: ok. 11 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.82s
Running unittests src/lib.rs (target/debug/deps/radicle_dag-05f7457e7194a495)
running 20 tests
test tests::test_contains ... ok
test tests::test_cycle ... ok
test tests::test_dependencies ... ok
test tests::test_diamond ... ok
test tests::test_fold_diamond ... ok
test tests::test_fold_reject ... ok
test tests::test_fold_multiple_roots ... ok
test tests::test_fold_sorting_1 ... ok
test tests::test_fold_sorting_2 ... ok
test tests::test_get ... ok
test tests::test_len ... ok
test tests::test_complex ... ok
test tests::test_merge_1 ... ok
test tests::test_merge_2 ... ok
test tests::test_prune_1 ... ok
test tests::test_prune_2 ... ok
test tests::test_is_empty ... ok
test tests::test_remove ... ok
test tests::test_prune_by_sorting ... ok
test tests::test_siblings ... ok
test result: ok. 20 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Running unittests src/lib.rs (target/debug/deps/radicle_fetch-f3b46afb1703eccc)
running 1 test
test stage::test::valid_refspecs ... ok
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Running unittests src/lib.rs (target/debug/deps/radicle_git_metadata-f234fa7eabe06ba6)
running 24 tests
test commit::parse::test::error::invalid_author ... ok
test commit::parse::test::error::invalid_committer ... ok
test commit::parse::test::error::invalid_format_continuation_without_preceding_header ... ok
test commit::parse::test::error::invalid_parent ... ok
test commit::parse::test::error::missing_author ... ok
test commit::parse::test::error::invalid_tree ... ok
test commit::parse::test::error::missing_header_body_separator ... ok
test commit::parse::test::error::missing_committer ... ok
test commit::parse::test::success::commit_gpgsig_is_preserved_and_strip_removes_it ... ok
test commit::parse::test::error::missing_tree_empty_header ... ok
test commit::parse::test::error::missing_tree_wrong_first_line ... ok
test commit::parse::test::success::commit_with_extra_headers ... ok
test commit::parse::test::success::commit_with_multiline_gpgsig ... ok
test commit::parse::test::success::commit_last_paragraph_kept_in_message_when_not_all_trailers ... ok
test commit::parse::test::success::commit_with_trailers ... ok
test commit::parse::test::success::commit_with_single_parent ... ok
test commit::parse::test::success::merge_commit ... ok
test commit::parse::test::success::root_commit ... ok
test commit::parse::test::success::roundtrip ... ok
test commit::parse::test::unit::body_last_paragraph_not_trailers_stays_in_message ... ok
test commit::parse::test::unit::body_no_paragraph_separator_means_no_trailers ... ok
test commit::parse::test::unit::trailers_accepts_empty_input ... ok
test commit::parse::test::unit::trailers_rejects_invalid_token_chars ... ok
test commit::parse::test::unit::trailers_rejects_line_without_separator ... ok
test result: ok. 24 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Running unittests src/lib.rs (target/debug/deps/radicle_git_ref_format-09d2e35a065977f7)
running 9 tests
test test::component ... ok
test test::pattern ... ok
test test::component_invalid - should panic ... ok
test test::qualified ... ok
test test::qualified_invalid - should panic ... ok
test test::qualified_pattern_invalid - should panic ... ok
test test::refname ... ok
test test::refname_invalid - should panic ... ok
test test::qualified_pattern ... ok
test result: ok. 9 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Running unittests src/lib.rs (target/debug/deps/radicle_localtime-f75e94d3ba02c400)
running 1 test
test serde_impls::test::test_localtime ... ok
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Running unittests src/lib.rs (target/debug/deps/radicle_node-0af44eb9a75358b9)
running 79 tests
test control::tests::test_control_socket ... ok
test reactor::timer::tests::test_next ... ok
test reactor::timer::tests::test_wake ... ok
test reactor::timer::tests::test_wake_exact ... ok
test control::tests::test_seed_unseed ... ok
test fingerprint::tests::matching ... ok
test tests::e2e::fetch_does_not_contain_rad_sigrefs_parent ... ok
test tests::e2e::missing_default_branch ... ok
test tests::e2e::missing_delegate_default_branch ... ok
test tests::e2e::test_background_foreground_fetch ... ok
test tests::e2e::test_block_prevents_connection ... ok
test tests::e2e::test_block_active_connection ... ok
test tests::e2e::test_block_prevents_fetch ... ok
test tests::e2e::test_channel_reader_limit ... ok
test tests::e2e::test_catchup_on_refs_announcements ... ok
test tests::e2e::test_clone ... ok
test tests::e2e::test_dont_fetch_owned_refs ... ok
test tests::e2e::test_fetch_followed_remotes ... ok
test tests::e2e::test_connection_crossing ... ok
test tests::e2e::test_concurrent_fetches ... ok
test tests::e2e::test_fetch_preserve_owned_refs ... ok
test tests::e2e::test_fetch_up_to_date ... ok
test tests::e2e::test_fetch_unseeded ... ok
test tests::e2e::test_fetch_emits_canonical_ref_update ... ok
test tests::e2e::test_inventory_sync_basic ... ok
test tests::e2e::test_large_fetch ... ok
test tests::e2e::test_migrated_clone ... ok
test tests::e2e::test_missing_remote ... ok
test tests::e2e::test_multiple_offline_inits ... ok
test tests::e2e::test_non_fastforward_identity_doc ... ok
test tests::e2e::test_non_fastforward_sigrefs ... ok
test tests::e2e::test_outdated_delegate_sigrefs ... ok
test tests::e2e::test_outdated_sigrefs ... ok
test tests::e2e::test_replication ... ok
test tests::e2e::test_inventory_sync_bridge ... ok
test tests::e2e::test_replication_invalid ... ok
test tests::e2e::test_inventory_sync_ring ... ok
test tests::e2e::test_inventory_sync_star ... ok
test tests::e2e::test_replication_ref_in_sigrefs ... ok
test tests::test_announcement_rebroadcast ... ok
test tests::test_announcement_rebroadcast_duplicates ... ok
test tests::test_announcement_rebroadcast_timestamp_filtered ... ok
test tests::test_announcement_relay ... ok
test tests::test_connection_kept_alive ... ok
test tests::test_disconnecting_unresponsive_peer ... ok
test tests::test_fetch_missing_inventory_on_gossip ... ok
test tests::test_fetch_missing_inventory_on_schedule ... ok
test tests::test_inbound_connection ... ok
test tests::test_inventory_decode ... ok
test tests::test_init_and_seed ... ok
test tests::test_inventory_relay ... ok
test tests::test_inventory_relay_bad_timestamp ... ok
test tests::test_inventory_sync ... ok
test tests::test_maintain_connections ... ok
test tests::test_maintain_connections_failed_attempt ... ok
test tests::test_maintain_connections_transient ... ok
test tests::test_outbound_connection ... ok
test tests::test_inventory_pruning ... ok
test tests::test_persistent_peer_connect ... ok
test tests::test_persistent_peer_reconnect_success ... ok
test tests::test_persistent_peer_reconnect_attempt ... ok
test tests::test_ping_response ... ok
test tests::test_queued_fetch_from_ann_same_rid ... ok
test tests::test_queued_fetch_from_command_same_rid ... ok
test tests::test_queued_fetch_max_capacity ... ok
test tests::test_redundant_connect ... ok
test tests::test_refs_announcement_fetch_trusted_no_inventory ... ok
test tests::test_refs_announcement_followed ... ok
test tests::test_refs_announcement_no_subscribe ... ok
test tests::test_refs_announcement_offline ... ok
test tests::prop_inventory_exchange_dense ... ok
test tests::test_announcement_message_amplification ... ok
test tests::test_seed_repo_subscribe ... ok
test tests::test_refs_announcement_relay_private ... ok
test wire::test::test_inventory_ann_with_extension ... ok
test wire::test::test_pong_message_with_extension ... ok
test tests::test_refs_synced_event ... ok
test tests::test_seeding ... ok
test tests::test_refs_announcement_relay_public ... ok
test result: ok. 79 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 15.27s
Running unittests src/main.rs (target/debug/deps/radicle_node-c7de8126c25178cd)
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Running unittests src/lib.rs (target/debug/deps/radicle_oid-483c1126cdd7f3e6)
running 10 tests
test fmt::test::fixture ... ok
test git2::test::zero ... ok
test fmt::test::zero ... ok
test fmt::test::git2 ... ok
test fmt::test::gix ... ok
test gix::test::zero ... ok
test str::test::fixture ... ok
test str::test::zero ... ok
test str::test::git2_roundtrip ... ok
test str::test::gix_roundrip ... ok
test result: ok. 10 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Running unittests src/lib.rs (target/debug/deps/radicle_protocol-2309826416d125d6)
running 99 tests
test deserializer::test::test_decode_next ... ok
test deserializer::test::test_unparsed ... ok
test deserializer::test::prop_decode_next ... ok
test fetcher::service::tests::test_fetch_coalescing_different_refs ... ok
test fetcher::test::queue::properties::capacity::bounded ... ok
test fetcher::test::queue::properties::capacity::rejection ... ok
test fetcher::test::queue::properties::dequeue::empty_queue_returns_none ... ok
test fetcher::test::queue::properties::dequeue::enables_reenqueue ... ok
test fetcher::test::queue::properties::dequeue::drained_queue_returns_none ... ok
test fetcher::test::queue::properties::capacity::capacity_reached_returns_same_item ... ok
test fetcher::test::queue::properties::capacity::restored_after_dequeue ... ok
test fetcher::test::queue::properties::fifo::interleaved_operations ... ok
test fetcher::test::queue::properties::fifo::ordering ... ok
test fetcher::test::queue::properties::equality::reflexive ... ok
test fetcher::test::queue::properties::merge::different_rid_accepted ... ok
test fetcher::test::queue::properties::equality::symmetric ... ok
test fetcher::test::queue::properties::merge::combines_refs ... ok
test fetcher::test::queue::properties::merge::longer_timeout_preserved ... ok
test fetcher::test::queue::properties::merge::empty_refs_fetches_all ... ok
test fetcher::test::queue::properties::equality::transitive ... ok
test fetcher::test::queue::unit::capacity_takes_precedence_over_merge_for_new_items ... ok
test fetcher::test::queue::unit::empty_refs_items_can_be_equal ... ok
test fetcher::test::queue::unit::max_timeout_accepted ... ok
test fetcher::test::queue::unit::merge_preserves_position_in_queue ... ok
test fetcher::test::queue::unit::zero_timeout_accepted ... ok
test fetcher::test::state::command::cancel::cancellation_is_isolated ... ok
test fetcher::test::state::command::cancel::non_existent_returns_unexpected ... ok
test fetcher::test::state::command::cancel::ongoing_and_queued ... ok
test fetcher::test::state::command::cancel::single_ongoing ... ok
test fetcher::test::state::command::fetch::fetch_after_previous_completed ... ok
test fetcher::test::state::command::fetch::fetch_at_capacity_enqueues ... ok
test fetcher::test::state::command::fetch::fetch_different_repo_same_node_within_capacity ... ok
test fetcher::test::state::command::fetch::fetch_duplicate_returns_already_fetching ... ok
test fetcher::test::state::command::fetch::fetch_queue_merge_empty_refs_fetches_all ... ok
test fetcher::test::state::command::fetch::fetch_queue_merge_takes_longer_timeout ... ok
test fetcher::test::state::command::fetch::fetch_queue_merges_already_queued ... ok
test fetcher::test::state::command::fetch::fetch_queue_rejected_capacity_reached ... ok
test fetcher::test::state::command::fetch::fetch_same_repo_different_nodes_queues_second ... ok
test fetcher::test::state::command::fetch::fetch_same_repo_different_refs_enqueues ... ok
test fetcher::test::state::command::fetch::fetch_start_first_fetch_for_node ... ok
test fetcher::test::state::command::fetched::complete_one_of_multiple ... ok
test fetcher::test::state::command::fetched::complete_single_ongoing ... ok
test fetcher::test::state::command::fetched::complete_then_dequeue_fifo ... ok
test fetcher::test::state::command::fetched::non_existent_returns_not_found ... ok
test fetcher::test::state::concurrent::fetched_then_cancel ... ok
test fetcher::test::state::concurrent::interleaved_operations ... ok
test fetcher::test::queue::properties::merge::succeed_when_at_capacity ... ok
test fetcher::test::queue::properties::merge::does_not_increase_queue_length ... ok
test fetcher::test::state::config::min_queue_size ... ok
test fetcher::test::state::dequeue::empty_queue_returns_none ... ok
test fetcher::test::queue::properties::merge::same_rid_merges_anywhere_in_queue ... ok
test fetcher::test::state::dequeue::maintains_fifo_order ... ok
test fetcher::test::state::dequeue::cannot_dequeue_while_node_at_capacity ... ok
test fetcher::test::state::invariant::queue_integrity_after_merge ... ok
test service::filter::test::compatible ... ok
test service::filter::test::test_parameters ... ok
test fetcher::test::state::multinode::independent_queues ... ok
test service::gossip::store::test::test_announced ... ok
test service::filter::test::test_sizes ... ok
test service::limiter::test::test_limiter_different_rates ... ok
test service::limiter::test::test_limiter_multi ... ok
test service::limiter::test::test_limiter_refill ... ok
test service::message::tests::test_inventory_limit ... ok
test fetcher::test::state::config::high_concurrency ... ok
test service::message::tests::test_ref_remote_limit ... ok
test wire::frame::test::test_encode_git_large ... ok
test wire::frame::test::test_stream_id ... ok
test fetcher::test::state::multinode::high_count ... ok
test wire::message::tests::prop_roundtrip_address ... ok
test service::message::tests::prop_refs_announcement_signing ... ok
test wire::message::tests::prop_zero_bytes_encode_decode ... ok
test wire::message::tests::test_inv_ann_max_size ... ok
test wire::message::tests::test_node_ann_max_size ... ok
test wire::message::tests::test_ping_encode_size_overflow - should panic ... ok
test wire::message::tests::test_pingpong_encode_max_size ... ok
test wire::message::tests::test_pong_encode_size_overflow - should panic ... ok
test wire::message::tests::prop_roundtrip_message ... ok
test wire::tests::prop_oid ... ok
test wire::tests::prop_roundtrip_filter ... ok
test wire::tests::prop_roundtrip_publickey ... ok
test wire::tests::prop_roundtrip_refs ... ok
test wire::tests::prop_roundtrip_repoid ... ok
test wire::tests::prop_roundtrip_tuple ... ok
test wire::tests::prop_roundtrip_u16 ... ok
test wire::tests::prop_roundtrip_u32 ... ok
test wire::tests::prop_roundtrip_u64 ... ok
test wire::tests::prop_roundtrip_vec ... ok
test wire::tests::prop_signature ... ok
test wire::tests::prop_string ... ok
test wire::tests::test_alias ... ok
test wire::tests::test_bounded_vec_limit ... ok
test wire::tests::test_filter_invalid ... ok
test wire::tests::test_string ... ok
test wire::varint::test::prop_roundtrip_varint ... ok
test wire::varint::test::test_encode_overflow - should panic ... ok
test wire::varint::test::test_encoding ... ok
test wire::message::tests::test_refs_ann_max_size ... ok
test wire::message::tests::prop_message_decoder ... ok
test service::message::tests::test_node_announcement_validate ... ok
test result: ok. 99 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 1.62s
Running unittests src/main.rs (target/debug/deps/git_remote_rad-0fae76af6e2ef1d7)
running 12 tests
test protocol::tests::test_capabilities ... ok
test protocol::tests::test_empty ... ok
test protocol::tests::test_fetch ... ok
test protocol::tests::test_invalid ... ok
test protocol::tests::test_list ... ok
test protocol::tests::test_option ... ok
test protocol::tests::test_fetch_whitespace ... ok
test protocol::tests::test_push_delete ... ok
test protocol::tests::test_list_for_push ... ok
test protocol::tests::test_push ... ok
test protocol::tests::test_option_whitespace_preservation ... ok
test protocol::tests::test_push_force ... ok
test result: ok. 12 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Running unittests src/main.rs (target/debug/deps/radicle_schemars-022a9ec83433c35d)
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Running unittests src/lib.rs (target/debug/deps/radicle_signals-1a2ca7fd33a640da)
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Running unittests src/lib.rs (target/debug/deps/radicle_systemd-e2cf2d080022d36d)
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
running 21 tests
test ansi::tests::colors_disabled ... ok
test cell::test::test_width ... ok
test element::test::test_spaced ... ok
test element::test::test_truncate ... ok
test ansi::tests::wrapping ... ok
test ansi::tests::colors_enabled ... ok
test element::test::test_width ... ok
test table::test::test_table ... ok
test table::test::test_table_border ... ok
test table::test::test_table_border_maximized ... ok
test table::test::test_table_truncate ... ok
test table::test::test_table_unicode ... ok
test table::test::test_table_border_truncated ... ok
test table::test::test_table_unicode_truncate ... ok
test table::test::test_truncate ... ok
test textarea::test::test_wrapping_code_block ... ok
test textarea::test::test_wrapping ... ok
test textarea::test::test_wrapping_fenced_block ... ok
test vstack::test::test_vstack ... ok
test vstack::test::test_vstack_maximize ... ok
test textarea::test::test_wrapping_paragraphs ... ok
test result: ok. 21 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Running unittests src/lib.rs (target/debug/deps/radicle_term-0b9f55c733b570cc)
Running unittests src/lib.rs (target/debug/deps/radicle_windows-2c067555aa9e0165)
Doc-tests radicle
running 1 test
test crates/radicle/src/cob/patch/encoding/review.rs - cob::patch::encoding::review::Review (line 23) ... ignored
test result: ok. 0 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 0.00s
Doc-tests radicle_cli
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Doc-tests radicle_cli_test
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Doc-tests radicle_cob
running 1 test
test crates/radicle-cob/src/backend/stable.rs - backend::stable::with_advanced_timestamp (line 56) ... ignored
test result: ok. 0 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 0.00s
Doc-tests radicle_core
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Doc-tests radicle_crypto
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Doc-tests radicle_dag
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Doc-tests radicle_fetch
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Doc-tests radicle_git_metadata
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Doc-tests radicle_git_ref_format
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Doc-tests radicle_localtime
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Doc-tests radicle_node
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Doc-tests radicle_oid
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Doc-tests radicle_protocol
running 6 tests
test crates/radicle-protocol/src/bounded.rs - bounded::BoundedVec<T,N>::push (line 122) ... ok
test crates/radicle-protocol/src/bounded.rs - bounded::BoundedVec<T,N>::max (line 96) ... ok
test crates/radicle-protocol/src/bounded.rs - bounded::BoundedVec<T,N>::collect_from (line 30) ... ok
test crates/radicle-protocol/src/bounded.rs - bounded::BoundedVec<T,N>::with_capacity (line 66) ... ok
test crates/radicle-protocol/src/bounded.rs - bounded::BoundedVec<T,N>::unbound (line 149) ... ok
test crates/radicle-protocol/src/bounded.rs - bounded::BoundedVec<T,N>::truncate (line 50) ... ok
test result: ok. 6 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Doc-tests radicle_signals
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Doc-tests radicle_systemd
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Doc-tests radicle_term
running 1 test
test crates/radicle-term/src/table.rs - table (line 4) ... ok
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Doc-tests radicle_windows
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
error: 1 target failed:
`-p radicle-cli --test commands`
Exit code: 101
{
"response": "finished",
"result": "failure"
}