rad:z3gqcJUoA1n9HaHKufZs5FCSGazv5 heartwoodf3c7e3c18db676038f6c297fea996063c8af91b7
{
"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": "568b1c986400509964ecfe3dd9713f3705790389",
"author": {
"id": "did:key:z6MkkfM3tPXNPrPevKr3uSiQtHPuwnNhu2yUVjgd2jXVsVz5",
"alias": "sebastinez"
},
"title": "cli: Add `rad patch archive --undo`",
"state": {
"status": "merged",
"conflicts": []
},
"before": "15efae2a7427f2c152e273c2fc7ee8f3a7b30758",
"after": "f3c7e3c18db676038f6c297fea996063c8af91b7",
"commits": [
"f3c7e3c18db676038f6c297fea996063c8af91b7"
],
"target": "7e1cb406bb935c3de008d2171e8961f57b4336ea",
"labels": [],
"assignees": [],
"revisions": [
{
"id": "568b1c986400509964ecfe3dd9713f3705790389",
"author": {
"id": "did:key:z6MkkfM3tPXNPrPevKr3uSiQtHPuwnNhu2yUVjgd2jXVsVz5",
"alias": "sebastinez"
},
"description": "Allows archived patches to be reverted to open state.",
"base": "15efae2a7427f2c152e273c2fc7ee8f3a7b30758",
"oid": "4a896a6c00f3a21840aa5fc8f42a3870fa0ce9d8",
"timestamp": 1710507058
},
{
"id": "671a24f6699128546f98865272fcc00c9a4534de",
"author": {
"id": "did:key:z6MkkfM3tPXNPrPevKr3uSiQtHPuwnNhu2yUVjgd2jXVsVz5",
"alias": "sebastinez"
},
"description": "Some fixes and add new unarchive fn",
"base": "15efae2a7427f2c152e273c2fc7ee8f3a7b30758",
"oid": "7f663175a15d18e9da7629e6ac345f9834a36dda",
"timestamp": 1710508273
},
{
"id": "dd2dc0fdb503994241c574c4775d9ac6f2c717bc",
"author": {
"id": "did:key:z6MkkfM3tPXNPrPevKr3uSiQtHPuwnNhu2yUVjgd2jXVsVz5",
"alias": "sebastinez"
},
"description": "Fix Archive options help",
"base": "15efae2a7427f2c152e273c2fc7ee8f3a7b30758",
"oid": "9c98625f3fbe09204f92a4f8d97c0385c8cc1908",
"timestamp": 1710508835
},
{
"id": "eb442f4ac76320c8163d352f7698c6f55a368698",
"author": {
"id": "did:key:z6MkkfM3tPXNPrPevKr3uSiQtHPuwnNhu2yUVjgd2jXVsVz5",
"alias": "sebastinez"
},
"description": "Enforce some 80-col width",
"base": "15efae2a7427f2c152e273c2fc7ee8f3a7b30758",
"oid": "f3c7e3c18db676038f6c297fea996063c8af91b7",
"timestamp": 1710509087
},
{
"id": "73a74e3de25e8d3e59c5b4c73dfc84fd34f9a383",
"author": {
"id": "did:key:z6MkkfM3tPXNPrPevKr3uSiQtHPuwnNhu2yUVjgd2jXVsVz5",
"alias": "sebastinez"
},
"description": "Rebase.",
"base": "ea31040ec6202d748d4465998213f91b213cdf71",
"oid": "0581c017ae1fa7cd3d553c855c439d40e12357e9",
"timestamp": 1711049749
}
]
}
}
{
"response": "triggered",
"run_id": {
"id": "b56c4f6f-dc2e-46af-bd98-c11d7858f6a4"
},
"info_url": "https://cci.rad.levitte.org//b56c4f6f-dc2e-46af-bd98-c11d7858f6a4.html"
}
Started at: 2026-09-08 21:54:11.992853+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/b56c4f6f-dc2e-46af-bd98-c11d7858f6a4/w/
╭────────────────────────────────────╮
│ heartwood │
│ Radicle Heartwood Protocol & Stack │
│ 189 issues · 39 patches │
╰────────────────────────────────────╯
Run `cd ./.` to go to the repository directory.
Exit code: 0
$ rad patch checkout 568b1c986400509964ecfe3dd9713f3705790389
✓ Switched to branch patch/568b1c9 at revision eb442f4
✓ Branch patch/568b1c9 setup to track rad/patches/568b1c986400509964ecfe3dd9713f3705790389
Exit code: 0
$ git config advice.detachedHead false
Exit code: 0
$ git checkout f3c7e3c18db676038f6c297fea996063c8af91b7
HEAD is now at f3c7e3c1 cli: Add `rad patch archive --undo`
Exit code: 0
$ rad patch show 568b1c986400509964ecfe3dd9713f3705790389 -p
╭─────────────────────────────────────────────────────────────────────────────────╮
│ Title cli: Add `rad patch archive --undo` │
│ Patch 568b1c986400509964ecfe3dd9713f3705790389 │
│ Author sebastinez z6MkkfM…jXVsVz5 │
│ Head f3c7e3c18db676038f6c297fea996063c8af91b7 │
│ Base 15efae2a7427f2c152e273c2fc7ee8f3a7b30758 │
│ Target master │
│ Branches patch/568b1c9 │
│ Commits ahead 1, behind 1529 │
│ Status merged │
│ │
│ Allows archived patches to be reverted to open state. │
├─────────────────────────────────────────────────────────────────────────────────┤
│ f3c7e3c cli: Add `rad patch archive --undo` │
├─────────────────────────────────────────────────────────────────────────────────┤
│ ● Revision 568b1c9 @ 15efae2..4a896a6 by sebastinez z6MkkfM…jXVsVz5 2 years ago │
│ ↑ Revision 671a24f @ 15efae2..7f66317 by sebastinez z6MkkfM…jXVsVz5 2 years ago │
│ ↑ Revision dd2dc0f @ 15efae2..9c98625 by sebastinez z6MkkfM…jXVsVz5 2 years ago │
│ └─ ✓ accepted by fintohaps z6Mkire…SQZ3voM 2 years ago │
│ ↑ Revision eb442f4 @ 15efae2..f3c7e3c by sebastinez z6MkkfM…jXVsVz5 2 years ago │
│ ↑ Revision 73a74e3 @ ea31040..0581c01 by cloudhead z6MksFq…bS9wzpT 2 years ago │
│ └─ ✓ merged by cloudhead z6MksFq…bS9wzpT │
╰─────────────────────────────────────────────────────────────────────────────────╯
commit f3c7e3c18db676038f6c297fea996063c8af91b7
Author: Sebastian Martinez <me@sebastinez.dev>
Date: Fri Mar 15 13:50:28 2024 +0100
cli: Add `rad patch archive --undo`
Allows archived patches to be reverted to open state.
diff --git a/radicle-cli/src/commands/patch.rs b/radicle-cli/src/commands/patch.rs
index f75710c9bd..e8e4fd8ef5 100644
--- a/radicle-cli/src/commands/patch.rs
+++ b/radicle-cli/src/commands/patch.rs
@@ -57,7 +57,7 @@ Usage
rad patch list [--all|--merged|--open|--archived|--draft|--authored] [--author <did>]... [<option>...]
rad patch show <patch-id> [<option>...]
rad patch diff <patch-id> [<option>...]
- rad patch archive <patch-id> [<option>...]
+ rad patch archive <patch-id> [--undo] [<option>...]
rad patch update <patch-id> [<option>...]
rad patch checkout <patch-id> [<option>...]
rad patch review <patch-id> [--accept | --reject] [-m [<string>]] [-d | --delete] [<option>...]
@@ -109,6 +109,10 @@ Assign options
-d, --delete <did> Delete an assignee from the patch (may be specified multiple times).
Note: --add will take precedence over --delete
+Archive options
+
+ --undo Unarchive a patch
+
Label options
-a, --add <label> Add a label to the patch (may be specified multiple times).
@@ -204,6 +208,7 @@ pub enum Operation {
},
Archive {
patch_id: Rev,
+ undo: bool,
},
Ready {
patch_id: Rev,
@@ -347,6 +352,11 @@ impl Args for Options {
undo = true;
}
+ // Archive options.
+ Long("undo") if op == Some(OperationName::Archive) => {
+ undo = true;
+ }
+
// Update options.
Short('b') | Long("base") if op == Some(OperationName::Update) => {
let val = parser.value()?;
@@ -591,6 +601,7 @@ impl Args for Options {
},
OperationName::Archive => Operation::Archive {
patch_id: patch_id.ok_or_else(|| anyhow!("a patch id must be provided"))?,
+ undo,
},
OperationName::Checkout => Operation::Checkout {
patch_id: patch_id.ok_or_else(|| anyhow!("a patch must be provided"))?,
@@ -726,9 +737,9 @@ pub fn run(options: Options, ctx: impl term::Context) -> anyhow::Result<()> {
&workdir,
)?;
}
- Operation::Archive { ref patch_id } => {
+ Operation::Archive { ref patch_id, undo } => {
let patch_id = patch_id.resolve::<PatchId>(&repository.backend)?;
- archive::run(&patch_id, &profile, &repository)?;
+ archive::run(&patch_id, undo, &profile, &repository)?;
}
Operation::Ready { ref patch_id, undo } => {
let patch_id = patch_id.resolve::<PatchId>(&repository.backend)?;
diff --git a/radicle-cli/src/commands/patch/archive.rs b/radicle-cli/src/commands/patch/archive.rs
index eacb507010..170038e82f 100644
--- a/radicle-cli/src/commands/patch/archive.rs
+++ b/radicle-cli/src/commands/patch/archive.rs
@@ -3,13 +3,23 @@ use super::*;
use radicle::prelude::*;
use radicle::storage::git::Repository;
-pub fn run(patch_id: &PatchId, profile: &Profile, repository: &Repository) -> anyhow::Result<()> {
+pub fn run(
+ patch_id: &PatchId,
+ undo: bool,
+ profile: &Profile,
+ repository: &Repository,
+) -> anyhow::Result<()> {
let signer = term::signer(profile)?;
let mut patches = profile.patches_mut(repository)?;
let Ok(mut patch) = patches.get_mut(patch_id) else {
anyhow::bail!("Patch `{patch_id}` not found");
};
- patch.archive(&signer)?;
+
+ if undo {
+ patch.unarchive(&signer)?;
+ } else {
+ patch.archive(&signer)?;
+ }
Ok(())
}
diff --git a/radicle/src/cob/patch.rs b/radicle/src/cob/patch.rs
index 3cf6b1a075..30fec82031 100644
--- a/radicle/src/cob/patch.rs
+++ b/radicle/src/cob/patch.rs
@@ -2242,11 +2242,25 @@ where
}
/// Archive a patch.
- pub fn archive<G: Signer>(&mut self, signer: &G) -> Result<EntryId, Error> {
- self.lifecycle(Lifecycle::Archived, signer)
+ pub fn archive<G: Signer>(&mut self, signer: &G) -> Result<bool, Error> {
+ self.lifecycle(Lifecycle::Archived, signer)?;
+
+ Ok(true)
+ }
+
+ /// Mark an archived patch as ready to be reviewed again.
+ /// Returns `false` if the patch was not archived.
+ pub fn unarchive<G: Signer>(&mut self, signer: &G) -> Result<bool, Error> {
+ if !self.is_archived() {
+ return Ok(false);
+ }
+ self.lifecycle(Lifecycle::Open, signer)?;
+
+ Ok(true)
}
- /// Mark a patch as ready to be reviewed. Returns `false` if the patch was not a draft.
+ /// Mark a patch as ready to be reviewed.
+ /// Returns `false` if the patch was not a draft.
pub fn ready<G: Signer>(&mut self, signer: &G) -> Result<bool, Error> {
if !self.is_draft() {
return Ok(false);
@@ -2256,7 +2270,8 @@ where
Ok(true)
}
- /// Mark an open patch as a draft. Returns `false` if the patch was not open and free of merges.
+ /// Mark an open patch as a draft.
+ /// Returns `false` if the patch was not open and free of merges.
pub fn unready<G: Signer>(&mut self, signer: &G) -> Result<bool, Error> {
if !matches!(self.state(), State::Open { conflicts } if conflicts.is_empty()) {
return Ok(false);
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 b56c4f6f-dc2e-46af-bd98-c11d7858f6a4 -v /opt/radcis/ci.rad.levitte.org/cci/state/b56c4f6f-dc2e-46af-bd98-c11d7858f6a4/s:/b56c4f6f-dc2e-46af-bd98-c11d7858f6a4/s:ro -v /opt/radcis/ci.rad.levitte.org/cci/state/b56c4f6f-dc2e-46af-bd98-c11d7858f6a4/w:/b56c4f6f-dc2e-46af-bd98-c11d7858f6a4/w -w /b56c4f6f-dc2e-46af-bd98-c11d7858f6a4/w -v /opt/radcis/ci.rad.levitte.org/.radicle:/${id}/.radicle:ro -e RAD_HOME=/${id}/.radicle rust:trixie bash /b56c4f6f-dc2e-46af-bd98-c11d7858f6a4/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"
}