rad:z3gqcJUoA1n9HaHKufZs5FCSGazv5 heartwood4eba4145b3c5079dafd19349ce5dfd3fbd53c862
{
"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:z6MkireRatUThvd3qzfKht1S44wpm4FEWSSa4PRMTSQZ3voM",
"did:key:z6MkkPvBfjP4bQmco5Dm7UGsX2ruDBieEHi8n9DVJWX5sTEz"
]
},
"action": "Created",
"patch": {
"id": "655219409faeafc46a27a1ffe619d62858165ed0",
"author": {
"id": "did:key:z6MkireRatUThvd3qzfKht1S44wpm4FEWSSa4PRMTSQZ3voM",
"alias": null
},
"title": "cli: test rad patch delete",
"state": {
"status": "merged",
"conflicts": []
},
"before": "a48081f2717f069d456ec09f31d9e639b232dbed",
"after": "4eba4145b3c5079dafd19349ce5dfd3fbd53c862",
"commits": [
"4eba4145b3c5079dafd19349ce5dfd3fbd53c862",
"572822752704e7873327e242cc26912a50725226",
"8c06456f008776048bf53d4ae3f21cb3ca2ad9d2",
"5e397dac4c3de47cc98b94a4527832c3146d7411"
],
"target": "3fc92f83fe089263c470b328414d923227cf0e4a",
"labels": [],
"assignees": [],
"revisions": [
{
"id": "655219409faeafc46a27a1ffe619d62858165ed0",
"author": {
"id": "did:key:z6MkireRatUThvd3qzfKht1S44wpm4FEWSSa4PRMTSQZ3voM",
"alias": null
},
"description": "No tests for `rad patch delete` existed.\n\nAdd a test where two peers interact on a patch and one decides to\ndelete the patch. It ensures that the patch is still visible to the\npeer that did not delete the patch.",
"base": "a48081f2717f069d456ec09f31d9e639b232dbed",
"oid": "e266cf27c238f6ed6f23daaadf42826e3d9e2787",
"timestamp": 1709290585
},
{
"id": "60f7f2993190d46c0b9f4c5eea5b22e5e480fa31",
"author": {
"id": "did:key:z6MkireRatUThvd3qzfKht1S44wpm4FEWSSa4PRMTSQZ3voM",
"alias": null
},
"description": "Changes:\n- Do not delete COBs in cache after a fetch\n- Finalise the rad_patch_delete test",
"base": "a48081f2717f069d456ec09f31d9e639b232dbed",
"oid": "bb1de3e3fedbdcc80a2cd8378e9c7dd62de0cb3d",
"timestamp": 1709292916
},
{
"id": "84c673801e82e37bda76a44102c823f657b63bd4",
"author": {
"id": "did:key:z6MkireRatUThvd3qzfKht1S44wpm4FEWSSa4PRMTSQZ3voM",
"alias": null
},
"description": "Changes:\n- Update `--reply-to` description",
"base": "a48081f2717f069d456ec09f31d9e639b232dbed",
"oid": "4eba4145b3c5079dafd19349ce5dfd3fbd53c862",
"timestamp": 1709907587
},
{
"id": "88133a3e76505ec8b0c0b2876452d1cf5dd854b9",
"author": {
"id": "did:key:z6MkireRatUThvd3qzfKht1S44wpm4FEWSSa4PRMTSQZ3voM",
"alias": null
},
"description": "Rebase.",
"base": "00102beb298296b793e164f2455fa7d4cd4b70d2",
"oid": "3bba7d16340a546b9ba34739bdea96ae4b4bf041",
"timestamp": 1709937804
}
]
}
}
{
"response": "triggered",
"run_id": {
"id": "c06b5018-80d8-4dc7-96c9-345dc71d922b"
},
"info_url": "https://cci.rad.levitte.org//c06b5018-80d8-4dc7-96c9-345dc71d922b.html"
}
Started at: 2026-09-07 22:24:47.534620+02:00
Commands:
$ rad clone rad:z3gqcJUoA1n9HaHKufZs5FCSGazv5 .
✓ Creating checkout in ./...
✓ Remote cloudhead@z6MksFqXN3Yhqk8pTJdUGLwATkRfQvwZXPqR2qMEhbS9wzpT added
✓ Remote-tracking branch cloudhead@z6MksFqXN3Yhqk8pTJdUGLwATkRfQvwZXPqR2qMEhbS9wzpT/master created for z6MksFqXN3Yhqk8pTJdUGLwATkRfQvwZXPqR2qMEhbS9wzpT
✓ Remote fintohaps@z6MkireRatUThvd3qzfKht1S44wpm4FEWSSa4PRMTSQZ3voM added
✓ Remote-tracking branch fintohaps@z6MkireRatUThvd3qzfKht1S44wpm4FEWSSa4PRMTSQZ3voM/master created for z6MkireRatUThvd3qzfKht1S44wpm4FEWSSa4PRMTSQZ3voM
✓ 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/c06b5018-80d8-4dc7-96c9-345dc71d922b/w/
╭────────────────────────────────────╮
│ heartwood │
│ Radicle Heartwood Protocol & Stack │
│ 189 issues · 38 patches │
╰────────────────────────────────────╯
Run `cd ./.` to go to the repository directory.
Exit code: 0
$ rad patch checkout 655219409faeafc46a27a1ffe619d62858165ed0
✓ Switched to branch patch/6552194 at revision 84c6738
✓ Branch patch/6552194 setup to track rad/patches/655219409faeafc46a27a1ffe619d62858165ed0
Exit code: 0
$ git config advice.detachedHead false
Exit code: 0
$ git checkout 4eba4145b3c5079dafd19349ce5dfd3fbd53c862
HEAD is now at 4eba4145 cli: test rad patch delete
Exit code: 0
$ rad patch show 655219409faeafc46a27a1ffe619d62858165ed0 -p
╭────────────────────────────────────────────────────────────────────────────────╮
│ Title cli: test rad patch delete │
│ Patch 655219409faeafc46a27a1ffe619d62858165ed0 │
│ Author fintohaps z6Mkire…SQZ3voM │
│ Head 4eba4145b3c5079dafd19349ce5dfd3fbd53c862 │
│ Base a48081f2717f069d456ec09f31d9e639b232dbed │
│ Target master │
│ Branches patch/6552194 │
│ Commits ahead 4, behind 1584 │
│ Status merged │
│ │
│ No tests for `rad patch delete` existed. │
│ │
│ Add a test where two peers interact on a patch and one decides to │
│ delete the patch. It ensures that the patch is still visible to the │
│ peer that did not delete the patch. │
├────────────────────────────────────────────────────────────────────────────────┤
│ 4eba414 cli: test rad patch delete │
│ 5728227 node: do not delete cob in cache after fetch │
│ 8c06456 cli: add replies to patch show output │
│ 5e397da cli: document --reply-to option │
├────────────────────────────────────────────────────────────────────────────────┤
│ ● Revision 6552194 @ a48081f..e266cf2 by fintohaps z6Mkire…SQZ3voM 2 years ago │
│ ↑ Revision 60f7f29 @ a48081f..bb1de3e by fintohaps z6Mkire…SQZ3voM 2 years ago │
│ ↑ Revision 84c6738 @ a48081f..4eba414 by fintohaps z6Mkire…SQZ3voM 2 years ago │
│ ↑ Revision 88133a3 @ 00102be..3bba7d1 by cloudhead z6MksFq…bS9wzpT 2 years ago │
│ └─ ✓ merged by cloudhead z6MksFq…bS9wzpT │
╰────────────────────────────────────────────────────────────────────────────────╯
commit 4eba4145b3c5079dafd19349ce5dfd3fbd53c862
Author: Fintan Halpenny <fintan.halpenny@gmail.com>
Date: Fri Mar 1 10:53:12 2024 +0000
cli: test rad patch delete
No tests for `rad patch delete` existed.
Add a test where two peers interact on a patch and one decides to
delete the patch. It ensures that the patch is still visible to the
peer that did not delete the patch.
Signed-off-by: Fintan Halpenny <fintan.halpenny@gmail.com>
X-Clacks-Overhead: GNU Terry Pratchett
diff --git a/radicle-cli/examples/rad-patch-delete.md b/radicle-cli/examples/rad-patch-delete.md
new file mode 100644
index 000000000..d58562167
--- /dev/null
+++ b/radicle-cli/examples/rad-patch-delete.md
@@ -0,0 +1,123 @@
+``` ~alice
+$ git checkout -b prepare-license
+$ touch LICENSE
+$ git add LICENSE
+$ git commit -m "Introduce license"
+[prepare-license 717c900] Introduce license
+ 1 file changed, 0 insertions(+), 0 deletions(-)
+ create mode 100644 LICENSE
+```
+
+``` ~alice (stderr)
+$ git push rad -o patch.draft -o patch.message="Define LICENSE for project" HEAD:refs/patches
+✓ Patch 6c61ef1716ad8a5c11e04dd7a3fec51e01fba70b drafted
+✓ Synced with 1 node(s)
+To rad://z42hL2jL4XNk6K8oHQaSWfMgCL7ji/z6MknSLrJoTcukLrE435hVNQT4JUhbvWLX4kUzqkEStBU8Vi
+ * [new reference] HEAD -> refs/patches
+```
+
+``` ~bob
+$ cd heartwood
+$ rad sync -f
+✓ Fetching rad:z42hL2jL4XNk6K8oHQaSWfMgCL7ji from z6MknSL…StBU8Vi..
+✓ Fetched repository from 1 seed(s)
+$ rad patch comment 6c61ef1 -m "I think we should use MIT"
+╭───────────────────────────╮
+│ bob (you) now 833db19 │
+│ I think we should use MIT │
+╰───────────────────────────╯
+✓ Synced with 1 node(s)
+```
+
+``` ~alice
+$ rad patch show 6c61ef1 -v
+╭────────────────────────────────────────────────────╮
+│ Title Define LICENSE for project │
+│ Patch 6c61ef1716ad8a5c11e04dd7a3fec51e01fba70b │
+│ Author alice (you) │
+│ Head 717c900ec17735639587325e0fd9fe09991c9edd │
+│ Base f2de534b5e81d7c6e2dcaf58c3dd91573c0a0354 │
+│ Branches prepare-license │
+│ Commits ahead 1, behind 0 │
+│ Status draft │
+├────────────────────────────────────────────────────┤
+│ 717c900 Introduce license │
+├────────────────────────────────────────────────────┤
+│ ● opened by alice (you) (717c900) now │
+├────────────────────────────────────────────────────┤
+│ bob z6Mkt67…v4N1tRk now 833db19 │
+│ I think we should use MIT │
+╰────────────────────────────────────────────────────╯
+$ rad patch comment 6c61ef1 --reply-to 833db19 -m "Thanks, I'll add it!"
+╭─────────────────────────╮
+│ alice (you) now 1803a38 │
+│ Thanks, I'll add it! │
+╰─────────────────────────╯
+✓ Synced with 1 node(s)
+```
+
+``` ~alice
+$ touch MIT
+$ ln MIT LICENSE -f
+$ git add MIT
+$ git commit -am "Add MIT License"
+[prepare-license 1cc8cd9] Add MIT License
+ 1 file changed, 0 insertions(+), 0 deletions(-)
+ create mode 100644 MIT
+```
+
+``` ~alice (stderr)
+$ git push -f
+✓ Patch 6c61ef1 updated to revision 93915b9afa94a9dc4f52f12cdf077d4613ea3eb3
+✓ Synced with 1 node(s)
+To rad://z42hL2jL4XNk6K8oHQaSWfMgCL7ji/z6MknSLrJoTcukLrE435hVNQT4JUhbvWLX4kUzqkEStBU8Vi
+ 717c900..1cc8cd9 prepare-license -> patches/6c61ef1716ad8a5c11e04dd7a3fec51e01fba70b
+```
+
+``` ~bob
+$ rad patch review 6c61ef1 --accept -m "LGTM!"
+✓ Patch 6c61ef1 accepted
+✓ Synced with 1 node(s)
+$ rad patch show 6c61ef1 -v
+╭─────────────────────────────────────────────────────────────────────╮
+│ Title Define LICENSE for project │
+│ Patch 6c61ef1716ad8a5c11e04dd7a3fec51e01fba70b │
+│ Author alice z6MknSL…StBU8Vi │
+│ Head 1cc8cd9de8ccc44b4fe3876f2dbd2cd1cf9ddc0e │
+│ Base f2de534b5e81d7c6e2dcaf58c3dd91573c0a0354 │
+│ Commits ahead 2, behind 0 │
+│ Status draft │
+├─────────────────────────────────────────────────────────────────────┤
+│ 1cc8cd9 Add MIT License │
+│ 717c900 Introduce license │
+├─────────────────────────────────────────────────────────────────────┤
+│ ● opened by alice z6MknSL…StBU8Vi (717c900) now │
+│ ↑ updated to 93915b9afa94a9dc4f52f12cdf077d4613ea3eb3 (1cc8cd9) now │
+│ └─ ✓ accepted by bob (you) now │
+╰─────────────────────────────────────────────────────────────────────╯
+```
+
+``` ~bob
+$ rad patch delete 6c61ef1
+✓ Synced with 1 node(s)
+```
+
+``` ~alice
+$ rad patch show 6c61ef1 -v
+╭─────────────────────────────────────────────────────────────────────╮
+│ Title Define LICENSE for project │
+│ Patch 6c61ef1716ad8a5c11e04dd7a3fec51e01fba70b │
+│ Author alice (you) │
+│ Head 1cc8cd9de8ccc44b4fe3876f2dbd2cd1cf9ddc0e │
+│ Base f2de534b5e81d7c6e2dcaf58c3dd91573c0a0354 │
+│ Branches prepare-license │
+│ Commits ahead 2, behind 0 │
+│ Status draft │
+├─────────────────────────────────────────────────────────────────────┤
+│ 1cc8cd9 Add MIT License │
+│ 717c900 Introduce license │
+├─────────────────────────────────────────────────────────────────────┤
+│ ● opened by alice (you) (717c900) now │
+│ ↑ updated to 93915b9afa94a9dc4f52f12cdf077d4613ea3eb3 (1cc8cd9) now │
+╰─────────────────────────────────────────────────────────────────────╯
+```
diff --git a/radicle-cli/tests/commands.rs b/radicle-cli/tests/commands.rs
index e882ec98a..dd0af8085 100644
--- a/radicle-cli/tests/commands.rs
+++ b/radicle-cli/tests/commands.rs
@@ -897,6 +897,55 @@ fn rad_review_by_hunk() {
.unwrap();
}
+#[test]
+fn rad_patch_delete() {
+ let mut environment = Environment::new();
+ let alice = environment.node(Config::test(Alias::new("alice")));
+ let bob = environment.node(Config::test(Alias::new("bob")));
+ let working = environment.tmp().join("working");
+ let acme = RepoId::from_str("z42hL2jL4XNk6K8oHQaSWfMgCL7ji").unwrap();
+
+ // Setup a test repository.
+ fixtures::repository(working.join("alice"));
+
+ test(
+ "examples/rad-init.md",
+ working.join("alice"),
+ Some(&alice.home),
+ [],
+ )
+ .unwrap();
+
+ let mut alice = alice.spawn();
+ let mut bob = bob.spawn();
+
+ bob.handle.seed(acme, Scope::All).unwrap();
+ alice.connect(&bob).converge([&bob]);
+
+ test(
+ "examples/rad-clone.md",
+ working.join("bob"),
+ Some(&bob.home),
+ [],
+ )
+ .unwrap();
+
+ formula(&environment.tmp(), "examples/rad-patch-delete.md")
+ .unwrap()
+ .home(
+ "alice",
+ working.join("alice"),
+ [("RAD_HOME", alice.home.path().display())],
+ )
+ .home(
+ "bob",
+ working.join("bob"),
+ [("RAD_HOME", bob.home.path().display())],
+ )
+ .run()
+ .unwrap();
+}
+
#[test]
fn rad_clean() {
let mut environment = Environment::new();
commit 572822752704e7873327e242cc26912a50725226
Author: Fintan Halpenny <fintan.halpenny@gmail.com>
Date: Fri Mar 1 11:23:08 2024 +0000
node: do not delete cob in cache after fetch
If a peer deletes a COB, it does not mean that the COB should be
deleted. This was incorrectly assumed in the `radicle-node` fetch
code.
To fix this, when a `RefUpdate::Deleted` is seen after a fetch, the
cache is updated with the new state of the COB.
Signed-off-by: Fintan Halpenny <fintan.halpenny@gmail.com>
X-Clacks-Overhead: GNU Terry Pratchett
diff --git a/radicle-node/src/worker/fetch.rs b/radicle-node/src/worker/fetch.rs
index 08ad795e8..eef99370f 100644
--- a/radicle-node/src/worker/fetch.rs
+++ b/radicle-node/src/worker/fetch.rs
@@ -217,64 +217,35 @@ where
let patches = cob::patch::Patches::open(storage)?;
for update in refs {
match update {
- RefUpdate::Updated { name, .. } | RefUpdate::Created { name, .. } => {
- match name.to_namespaced() {
- Some(name) => {
- let Some(identifier) = cob::TypedId::from_namespaced(&name)? else {
- continue;
- };
- if identifier.is_issue() {
- if let Some(issue) = issues.get(&identifier.id)? {
- cache
- .update(rid, &identifier.id, &issue)
- .map(|_| ())
- .map_err(|e| error::Cache::Update {
- id: identifier.id,
- type_name: identifier.type_name,
- err: e.into(),
- })?;
- }
- } else if identifier.is_patch() {
- if let Some(patch) = patches.get(&identifier.id)? {
- cache
- .update(rid, &identifier.id, &patch)
- .map(|_| ())
- .map_err(|e| error::Cache::Update {
- id: identifier.id,
- type_name: identifier.type_name,
- err: e.into(),
- })?;
- }
- }
- }
- None => continue,
- }
- }
- RefUpdate::Deleted { name, .. } => match name.to_namespaced() {
+ RefUpdate::Updated { name, .. }
+ | RefUpdate::Created { name, .. }
+ | RefUpdate::Deleted { name, .. } => match name.to_namespaced() {
Some(name) => {
let Some(identifier) = cob::TypedId::from_namespaced(&name)? else {
continue;
};
if identifier.is_issue() {
- cob::cache::Remove::<cob::issue::Issue>::remove(cache, &identifier.id)
- .map(|_| ())
- .map_err(|e| error::Cache::Remove {
- id: identifier.id,
- type_name: identifier.type_name,
- err: e.into(),
- })?;
+ if let Some(issue) = issues.get(&identifier.id)? {
+ cache
+ .update(rid, &identifier.id, &issue)
+ .map(|_| ())
+ .map_err(|e| error::Cache::Update {
+ id: identifier.id,
+ type_name: identifier.type_name,
+ err: e.into(),
+ })?;
+ }
} else if identifier.is_patch() {
- cob::cache::Remove::<cob::patch::Patch>::remove(cache, &identifier.id)
- .map(|_| ())
- .map_err(
- |e: <C as cob::cache::Remove<cob::patch::Patch>>::RemoveError| {
- error::Cache::Remove {
- id: identifier.id,
- type_name: identifier.type_name,
- err: e.into(),
- }
- },
- )?;
+ if let Some(patch) = patches.get(&identifier.id)? {
+ cache
+ .update(rid, &identifier.id, &patch)
+ .map(|_| ())
+ .map_err(|e| error::Cache::Update {
+ id: identifier.id,
+ type_name: identifier.type_name,
+ err: e.into(),
+ })?;
+ }
}
}
None => continue,
commit 8c06456f008776048bf53d4ae3f21cb3ca2ad9d2
Author: Fintan Halpenny <fintan.halpenny@gmail.com>
Date: Fri Mar 1 10:51:13 2024 +0000
cli: add replies to patch show output
If any replies to patches were made, it was not possible to see them
in the output of `rad patch show`.
Add the replies to show output, but only if the `--verbose` flag is
set.
Signed-off-by: Fintan Halpenny <fintan.halpenny@gmail.com>
X-Clacks-Overhead: GNU Terry Pratchett
diff --git a/radicle-cli/src/terminal/patch.rs b/radicle-cli/src/terminal/patch.rs
index 2ee4f1a54..e84cea991 100644
--- a/radicle-cli/src/terminal/patch.rs
+++ b/radicle-cli/src/terminal/patch.rs
@@ -435,6 +435,16 @@ pub fn show(
for line in timeline::timeline(profile, patch) {
widget.push(line);
}
+
+ if verbose {
+ for (id, comment) in revision.replies() {
+ let hstack = term::comment::header(id, comment, profile);
+
+ widget = widget.divider();
+ widget.push(hstack);
+ widget.push(term::textarea(comment.body()).wrap(60));
+ }
+ }
widget.print();
Ok(())
diff --git a/radicle/src/cob/patch.rs b/radicle/src/cob/patch.rs
index c33d91226..3cf6b1a07 100644
--- a/radicle/src/cob/patch.rs
+++ b/radicle/src/cob/patch.rs
@@ -1420,6 +1420,11 @@ impl Revision {
&self.discussion
}
+ /// Iterate over all top-level replies.
+ pub fn replies(&self) -> impl Iterator<Item = (&CommentId, &thread::Comment<CodeLocation>)> {
+ self.discussion.comments()
+ }
+
/// Reviews of this revision's changes (one per actor).
pub fn reviews(&self) -> impl DoubleEndedIterator<Item = (&PublicKey, &Review)> {
self.reviews
commit 5e397dac4c3de47cc98b94a4527832c3146d7411
Author: Fintan Halpenny <fintan.halpenny@gmail.com>
Date: Fri Mar 1 10:49:35 2024 +0000
cli: document --reply-to option
The option to reply to a comment was undocumented in the `rad patch
comment` command.
Add the option to the "Comment options" section of the help message.
Signed-off-by: Fintan Halpenny <fintan.halpenny@gmail.com>
X-Clacks-Overhead: GNU Terry Pratchett
diff --git a/radicle-cli/src/commands/patch.rs b/radicle-cli/src/commands/patch.rs
index 1cc22c93a..f75710c9b 100644
--- a/radicle-cli/src/commands/patch.rs
+++ b/radicle-cli/src/commands/patch.rs
@@ -84,6 +84,7 @@ Diff options
Comment options
-m, --message <string> Provide a comment message via the command-line
+ --reply-to <comment> The comment to reply to
Edit options
Exit code: 0
shell: 'cargo --version rustc --version cargo fmt --check cargo clippy --all-targets --workspace -- --deny clippy::all cargo build --all-targets --workspace cargo doc --workspace cargo test --workspace --no-fail-fast '
Commands:
$ podman run --name c06b5018-80d8-4dc7-96c9-345dc71d922b -v /opt/radcis/ci.rad.levitte.org/cci/state/c06b5018-80d8-4dc7-96c9-345dc71d922b/s:/c06b5018-80d8-4dc7-96c9-345dc71d922b/s:ro -v /opt/radcis/ci.rad.levitte.org/cci/state/c06b5018-80d8-4dc7-96c9-345dc71d922b/w:/c06b5018-80d8-4dc7-96c9-345dc71d922b/w -w /c06b5018-80d8-4dc7-96c9-345dc71d922b/w -v /opt/radcis/ci.rad.levitte.org/.radicle:/${id}/.radicle:ro -e RAD_HOME=/${id}/.radicle rust:trixie bash /c06b5018-80d8-4dc7-96c9-345dc71d922b/s/script.sh
+ cargo --version
info: syncing channel updates for '1.74-x86_64-unknown-linux-gnu'
info: latest update on 2023-12-07, rust version 1.74.1 (a28077b28 2023-12-04)
info: downloading component 'cargo'
info: downloading component 'rust-std'
info: downloading component 'rustc'
info: installing component 'cargo'
info: installing component 'rust-std'
info: installing component 'rustc'
cargo 1.74.1 (ecb9851af 2023-10-18)
+ rustc --version
rustc 1.74.1 (a28077b28 2023-12-04)
+ cargo fmt --check
error: 'cargo-fmt' is not installed for the toolchain '1.74-x86_64-unknown-linux-gnu'.
To install, run `rustup component add --toolchain 1.74-x86_64-unknown-linux-gnu rustfmt`
Exit code: 1
{
"response": "finished",
"result": "failure"
}