cli: Add `rad patch checkout`
This commit allows to checkout a patch created
with `rad patch open` in a new branch
named `patch/{short_patch_id}`.
Signed-off-by: Vincenzo Palazzo <vincenzopalazzodev@gmail.com>
This commit is contained in:
parent
ff52ea7223
commit
b9ed0bc4cb
|
|
@ -117,3 +117,11 @@ z6MknSLrJoTcukLrE435hVNQT4JUhbvWLX4kUzqkEStBU8Vi/5
|
||||||
$ rad comment d4ef85f57a849bd845915d7a66a2192cd23811f6 --message 'I cannot wait to get back to the 90s!' --reply-to z6MknSLrJoTcukLrE435hVNQT4JUhbvWLX4kUzqkEStBU8Vi/5
|
$ rad comment d4ef85f57a849bd845915d7a66a2192cd23811f6 --message 'I cannot wait to get back to the 90s!' --reply-to z6MknSLrJoTcukLrE435hVNQT4JUhbvWLX4kUzqkEStBU8Vi/5
|
||||||
z6MknSLrJoTcukLrE435hVNQT4JUhbvWLX4kUzqkEStBU8Vi/6
|
z6MknSLrJoTcukLrE435hVNQT4JUhbvWLX4kUzqkEStBU8Vi/6
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Now, let's checkout the patch that we just created:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ rad patch checkout d4ef85f57a849bd845915d7a66a2192cd23811f6
|
||||||
|
ok Performing patch checkout...
|
||||||
|
ok Switched to branch patch/d4ef85f57a8
|
||||||
|
```
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,5 @@
|
||||||
|
#[path = "patch/checkout.rs"]
|
||||||
|
mod checkout;
|
||||||
#[path = "patch/common.rs"]
|
#[path = "patch/common.rs"]
|
||||||
mod common;
|
mod common;
|
||||||
#[path = "patch/create.rs"]
|
#[path = "patch/create.rs"]
|
||||||
|
|
@ -32,6 +34,7 @@ Usage
|
||||||
rad patch show <id>
|
rad patch show <id>
|
||||||
rad patch open [<option>...]
|
rad patch open [<option>...]
|
||||||
rad patch update <id> [<option>...]
|
rad patch update <id> [<option>...]
|
||||||
|
rad patch checkout <id>
|
||||||
|
|
||||||
Create/Update options
|
Create/Update options
|
||||||
|
|
||||||
|
|
@ -52,6 +55,7 @@ pub enum OperationName {
|
||||||
Open,
|
Open,
|
||||||
Show,
|
Show,
|
||||||
Update,
|
Update,
|
||||||
|
Checkout,
|
||||||
#[default]
|
#[default]
|
||||||
List,
|
List,
|
||||||
}
|
}
|
||||||
|
|
@ -68,6 +72,9 @@ pub enum Operation {
|
||||||
patch_id: Option<PatchId>,
|
patch_id: Option<PatchId>,
|
||||||
message: Message,
|
message: Message,
|
||||||
},
|
},
|
||||||
|
Checkout {
|
||||||
|
patch_id: PatchId,
|
||||||
|
},
|
||||||
List,
|
List,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -140,7 +147,7 @@ impl Args for Options {
|
||||||
"o" | "open" => op = Some(OperationName::Open),
|
"o" | "open" => op = Some(OperationName::Open),
|
||||||
"s" | "show" => op = Some(OperationName::Show),
|
"s" | "show" => op = Some(OperationName::Show),
|
||||||
"u" | "update" => op = Some(OperationName::Update),
|
"u" | "update" => op = Some(OperationName::Update),
|
||||||
|
"c" | "checkout" => op = Some(OperationName::Checkout),
|
||||||
unknown => anyhow::bail!("unknown operation '{}'", unknown),
|
unknown => anyhow::bail!("unknown operation '{}'", unknown),
|
||||||
},
|
},
|
||||||
Value(val) if op == Some(OperationName::Show) && patch_id.is_none() => {
|
Value(val) if op == Some(OperationName::Show) && patch_id.is_none() => {
|
||||||
|
|
@ -149,6 +156,9 @@ impl Args for Options {
|
||||||
Value(val) if op == Some(OperationName::Update) && patch_id.is_none() => {
|
Value(val) if op == Some(OperationName::Update) && patch_id.is_none() => {
|
||||||
patch_id = Some(term::cob::parse_patch_id(val)?);
|
patch_id = Some(term::cob::parse_patch_id(val)?);
|
||||||
}
|
}
|
||||||
|
Value(val) if op == Some(OperationName::Checkout) && patch_id.is_none() => {
|
||||||
|
patch_id = Some(term::cob::parse_patch_id(val)?);
|
||||||
|
}
|
||||||
_ => return Err(anyhow::anyhow!(arg.unexpected())),
|
_ => return Err(anyhow::anyhow!(arg.unexpected())),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -160,6 +170,9 @@ impl Args for Options {
|
||||||
patch_id: patch_id.ok_or_else(|| anyhow!("a patch id must be provided"))?,
|
patch_id: patch_id.ok_or_else(|| anyhow!("a patch id must be provided"))?,
|
||||||
},
|
},
|
||||||
OperationName::Update => Operation::Update { patch_id, message },
|
OperationName::Update => Operation::Update { patch_id, message },
|
||||||
|
OperationName::Checkout => Operation::Checkout {
|
||||||
|
patch_id: patch_id.ok_or_else(|| anyhow!("a patch id must be provided"))?,
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
Ok((
|
Ok((
|
||||||
|
|
@ -205,6 +218,9 @@ pub fn run(options: Options, ctx: impl term::Context) -> anyhow::Result<()> {
|
||||||
&options,
|
&options,
|
||||||
)?;
|
)?;
|
||||||
}
|
}
|
||||||
|
Operation::Checkout { ref patch_id } => {
|
||||||
|
checkout::run(&storage, &profile, &workdir, patch_id)?;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,40 @@
|
||||||
|
use crate::terminal as term;
|
||||||
|
use anyhow::anyhow;
|
||||||
|
use radicle::cob::patch::{self, PatchId};
|
||||||
|
use radicle::git::{self, RefString};
|
||||||
|
use radicle::profile::Profile;
|
||||||
|
use radicle::storage::git::Repository;
|
||||||
|
|
||||||
|
pub fn run(
|
||||||
|
storage: &Repository,
|
||||||
|
profile: &Profile,
|
||||||
|
git_workdir: &git::raw::Repository,
|
||||||
|
patch_id: &PatchId,
|
||||||
|
) -> anyhow::Result<()> {
|
||||||
|
let patches = patch::Patches::open(profile.public_key, storage)?;
|
||||||
|
let patch = patches
|
||||||
|
.get(patch_id)?
|
||||||
|
.ok_or_else(|| anyhow!("Patch `{patch_id}` not found"))?;
|
||||||
|
|
||||||
|
let spinner = term::spinner("Performing patch checkout...");
|
||||||
|
|
||||||
|
// Getting the patch obj!
|
||||||
|
let patch_head = *patch.head();
|
||||||
|
let commit = git_workdir.find_commit(patch_head.into())?;
|
||||||
|
|
||||||
|
let name = RefString::try_from(format!("patch/{}", term::format::cob(patch_id)))?;
|
||||||
|
let branch = git::refs::workdir::branch(&name);
|
||||||
|
// checkout the patch in a new branch!
|
||||||
|
git_workdir.branch(branch.as_str(), &commit, false)?;
|
||||||
|
// and then point the current `HEAD` inside the new branch.
|
||||||
|
git_workdir.set_head(branch.as_str())?;
|
||||||
|
spinner.finish();
|
||||||
|
|
||||||
|
// 3. Write to the UI Terminal
|
||||||
|
term::success!(
|
||||||
|
"Switched to branch {}",
|
||||||
|
term::format::highlight(name.as_str())
|
||||||
|
);
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue