diff --git a/radicle-cli/examples/rad-inspect-noauth.md b/radicle-cli/examples/rad-inspect-noauth.md index 1192d532..327a1cb4 100644 --- a/radicle-cli/examples/rad-inspect-noauth.md +++ b/radicle-cli/examples/rad-inspect-noauth.md @@ -3,7 +3,7 @@ The `rad inspect` command can be run without being authenticated with radicle: ``` $ rad self ✗ Self failed: Could not load radicle profile -✗ To setup your radicle profile, run `rad auth`. +✗ Hint: To setup your radicle profile, run `rad auth`. ``` diff --git a/radicle-cli/examples/rad-patch.md b/radicle-cli/examples/rad-patch.md index cf4d8412..260acb04 100644 --- a/radicle-cli/examples/rad-patch.md +++ b/radicle-cli/examples/rad-patch.md @@ -82,10 +82,9 @@ $ git commit --message "Add README, just for the fun" 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 README.md $ rad patch update --message "Add README, just for the fun" 191a14e520f2eeff7c0e3ee0a5523c5217eecb89 -191a14e R0 (3e674d1) -> R1 (27857ec) +Updating 3e674d1 -> 27857ec 1 commit(s) ahead, 0 commit(s) behind - -✓ Patch 191a14e updated to 56a5efc062b34a97a162a3a4d4468ce3e7ba1c84 +✓ Patch updated to revision 56a5efc062b34a97a162a3a4d4468ce3e7ba1c84 ``` And let's leave a quick comment for our team: @@ -119,7 +118,7 @@ $ rad patch │ Define power requirements 191a14e R1 27857ec (flux-capacitor-power, patch/191a14e) ahead 2, behind 0 │ ├──────────────────────────────────────────────────────────────────────────────────────────────────────┤ │ ● opened by did:key:z6MknSLrJoTcukLrE435hVNQT4JUhbvWLX4kUzqkEStBU8Vi (you) 3 months ago │ -│ ↑ updated to 191a14e520f2eeff7c0e3ee0a5523c5217eecb89 (3e674d1) 3 months ago │ +│ ↑ updated to 56a5efc062b34a97a162a3a4d4468ce3e7ba1c84 (27857ec) 3 months ago │ │ ✓ accepted by z6MknSLrJoTcukLrE435hVNQT4JUhbvWLX4kUzqkEStBU8Vi (you) 3 months ago │ ╰──────────────────────────────────────────────────────────────────────────────────────────────────────╯ ``` diff --git a/radicle-cli/examples/workflow/4-patching-contributor.md b/radicle-cli/examples/workflow/4-patching-contributor.md index c93261a0..2ba404c1 100644 --- a/radicle-cli/examples/workflow/4-patching-contributor.md +++ b/radicle-cli/examples/workflow/4-patching-contributor.md @@ -80,10 +80,9 @@ $ git commit --message "Add README, just for the fun" 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 README.md $ rad patch update --message "Add README, just for the fun" a07ef7743a32a2e902672ea3526d1db6ee08108a -a07ef77 R0 (3e674d1) -> R1 (27857ec) +Updating 3e674d1 -> 27857ec 1 commit(s) ahead, 0 commit(s) behind - -✓ Patch a07ef77 updated to 4f15eb5c994edd0bb6be29cb4801aa74308cc628 +✓ Patch updated to revision 4f15eb5c994edd0bb6be29cb4801aa74308cc628 ``` And let's leave a quick comment for our team: diff --git a/radicle-cli/examples/workflow/5-patching-maintainer.md b/radicle-cli/examples/workflow/5-patching-maintainer.md index b1c8ec33..581179be 100644 --- a/radicle-cli/examples/workflow/5-patching-maintainer.md +++ b/radicle-cli/examples/workflow/5-patching-maintainer.md @@ -31,7 +31,7 @@ $ rad patch │ Define power requirements a07ef77 R1 27857ec ahead 2, behind 0 │ ├───────────────────────────────────────────────────────────────────────────────────┤ │ ● opened by did:key:z6Mkt67GdsW7715MEfRuP4pSZxJRJh6kj6Y48WRqVv4N1tRk 3 months ago │ -│ ↑ updated to a07ef7743a32a2e902672ea3526d1db6ee08108a (3e674d1) 3 months ago │ +│ ↑ updated to 4f15eb5c994edd0bb6be29cb4801aa74308cc628 (27857ec) 3 months ago │ ╰───────────────────────────────────────────────────────────────────────────────────╯ ``` @@ -49,10 +49,9 @@ $ git commit --fixup HEAD~ 1 file changed, 0 insertions(+), 0 deletions(-) rename REQUIREMENTS => REQUIREMENTS.md (100%) $ rad patch update --message "Define power requirements" --message "See details." a07ef7743a32a2e902672ea3526d1db6ee08108a -a07ef77 R1 (27857ec) -> R2 (f6484e0) +Updating 27857ec -> f6484e0 1 commit(s) ahead, 0 commit(s) behind - -✓ Patch a07ef77 updated to 737dc47d9eba730c5db8a8e33c41c7955f9093de +✓ Patch updated to revision 737dc47d9eba730c5db8a8e33c41c7955f9093de ``` Great, all fixed up, lets merge the code. @@ -61,7 +60,7 @@ Great, all fixed up, lets merge the code. $ git checkout master Your branch is up to date with 'rad/master'. $ rad merge 737dc47d9eba730c5db8a8e33c41c7955f9093de -Merging a07ef77 R2 (f6484e0) by did:key:z6Mkt67GdsW7715MEfRuP4pSZxJRJh6kj6Y48WRqVv4N1tRk into master (f2de534) via fast-forward... +Merging a07ef77 R2 (f6484e0) by z6Mkt67…v4N1tRk into master (f2de534) via fast-forward... Running `git merge --ff-only f6484e0f43e48a8983b9b39bf9bd4cd889f1d520`... Updating f2de534..f6484e0 Fast-forward @@ -82,8 +81,8 @@ $ rad patch │ Define power requirements a07ef77 R2 f6484e0 (flux-capacitor-power, master) ahead 3, behind 0 │ ├───────────────────────────────────────────────────────────────────────────────────────────────┤ │ ● opened by did:key:z6Mkt67GdsW7715MEfRuP4pSZxJRJh6kj6Y48WRqVv4N1tRk 3 months ago │ -│ ↑ updated to a07ef7743a32a2e902672ea3526d1db6ee08108a (3e674d1) 3 months ago │ │ ↑ updated to 4f15eb5c994edd0bb6be29cb4801aa74308cc628 (27857ec) 3 months ago │ +│ ↑ updated to 737dc47d9eba730c5db8a8e33c41c7955f9093de (f6484e0) 3 months ago │ │ ✓ merged by did:key:z6MknSLrJoTcukLrE435hVNQT4JUhbvWLX4kUzqkEStBU8Vi (you) 3 months ago │ ╰───────────────────────────────────────────────────────────────────────────────────────────────╯ ``` diff --git a/radicle-cli/src/commands/merge.rs b/radicle-cli/src/commands/merge.rs index af90ff26..ef7fa429 100644 --- a/radicle-cli/src/commands/merge.rs +++ b/radicle-cli/src/commands/merge.rs @@ -241,7 +241,7 @@ pub fn run(options: Options, ctx: impl term::Context) -> anyhow::Result<()> { term::format::tertiary(term::format::cob(&patch_id)), term::format::dim(format!("R{revision_ix}")), term::format::parens(term::format::secondary(term::format::oid(revision.head()))), - term::format::tertiary(patch.author().id), + term::format::tertiary(term::format::node(&patch.author().id)), term::format::highlight(branch), term::format::parens(term::format::secondary(term::format::oid(head_oid))), merge_style_pretty diff --git a/radicle-cli/src/commands/patch/list.rs b/radicle-cli/src/commands/patch/list.rs index 025ff5c5..01757f75 100644 --- a/radicle-cli/src/commands/patch/list.rs +++ b/radicle-cli/src/commands/patch/list.rs @@ -75,7 +75,7 @@ fn print( &patch.timestamp(), ))); - let (latest, revision) = patch + let (_, revision) = patch .latest() .ok_or_else(|| anyhow!("patch is malformed: no revisions found"))?; let mut widget = term::VStack::default() @@ -101,7 +101,7 @@ fn print( let mut timeline = Vec::new(); for (revision_id, revision) in patch.revisions() { // Don't show an "update" line for the first revision. - if revision_id != latest { + if **revision_id != **patch_id { timeline.push(( revision.timestamp(), term::Line::spaced( diff --git a/radicle-cli/src/commands/patch/update.rs b/radicle-cli/src/commands/patch/update.rs index 277d11d4..29cf972b 100644 --- a/radicle-cli/src/commands/patch/update.rs +++ b/radicle-cli/src/commands/patch/update.rs @@ -28,13 +28,11 @@ fn select_patch( find_unmerged_with_base(*head_oid, *target_oid, base_oid, patches, workdir, whoami)?; let Some((id, _, _)) = result.pop() else { - term::blank(); - anyhow::bail!("No patches found to update, please open a new patch or specify the patch id manually"); + anyhow::bail!("No patches found to update, please specify a patch id"); }; if !result.is_empty() { - term::blank(); - anyhow::bail!("More than one patch available to update, please specify an id with `rad patch --update `"); + anyhow::bail!("More than one patch available to update, please specify a patch id"); } term::blank(); @@ -43,24 +41,15 @@ fn select_patch( fn show_update_commit_info( workdir: &git::raw::Repository, - patch_id: &patch::PatchId, - patch: &patch::Patch, current_revision: &patch::Revision, head_branch: &git::raw::Branch, ) -> anyhow::Result<()> { - // TODO(cloudhead): Handle error. - let current_version = patch.version(); let head_oid = branch_oid(head_branch)?; term::info!( - "{} {} {} -> {} {}", - term::format::tertiary(term::format::cob(patch_id)), - term::format::dim(format!("R{current_version}")), - term::format::parens(term::format::secondary(term::format::oid( - current_revision.head() - ))), - term::format::dim(format!("R{}", current_version + 1)), - term::format::parens(term::format::secondary(term::format::oid(head_oid))), + "Updating {} -> {}", + term::format::secondary(term::format::oid(current_revision.head())), + term::format::secondary(term::format::oid(head_oid)), ); // Difference between the two revisions. @@ -70,7 +59,7 @@ fn show_update_commit_info( Ok(()) } -/// Run patch creation. +/// Run patch update. pub fn run( storage: &Repository, profile: &Profile, @@ -102,7 +91,7 @@ pub fn run( return Ok(()); } - show_update_commit_info(workdir, &patch_id, &patch, current_revision, &head_branch)?; + show_update_commit_info(workdir, current_revision, &head_branch)?; let head_oid = branch_oid(&head_branch)?; let base_oid = workdir.merge_base(*target_oid, *head_oid)?; @@ -110,10 +99,8 @@ pub fn run( let signer = term::signer(profile)?; let revision = patch.update(message, base_oid, *head_oid, &signer)?; - term::blank(); term::success!( - "Patch {} updated to {}", - term::format::highlight(term::format::cob(&patch_id)), + "Patch updated to revision {}", term::format::tertiary(revision), ); diff --git a/radicle-cob/src/history/entry.rs b/radicle-cob/src/history/entry.rs index 6e4ddeb6..f1679065 100644 --- a/radicle-cob/src/history/entry.rs +++ b/radicle-cob/src/history/entry.rs @@ -3,6 +3,7 @@ // This file is part of radicle-link, distributed under the GPLv3 with Radicle // Linking Exception. For full terms see the included LICENSE file. use std::fmt; +use std::ops::Deref; use std::str::FromStr; use git_ext::Oid; @@ -67,6 +68,14 @@ impl From<&EntryId> for object::ObjectId { } } +impl Deref for EntryId { + type Target = Oid; + + fn deref(&self) -> &Self::Target { + &self.0 + } +} + /// One entry in the dependency graph for a change #[derive(Clone, Debug, PartialEq, Eq, Hash)] pub struct Entry { diff --git a/radicle-cob/src/object.rs b/radicle-cob/src/object.rs index 1dbf467c..d0d6b7ed 100644 --- a/radicle-cob/src/object.rs +++ b/radicle-cob/src/object.rs @@ -3,7 +3,7 @@ // This file is part of radicle-link, distributed under the GPLv3 with Radicle // Linking Exception. For full terms see the included LICENSE file. -use std::{convert::TryFrom as _, fmt, str::FromStr}; +use std::{convert::TryFrom as _, fmt, ops::Deref, str::FromStr}; use git_ext::Oid; use git_ref_format::{Component, RefString}; @@ -62,6 +62,14 @@ impl From<&git2::Oid> for ObjectId { } } +impl Deref for ObjectId { + type Target = Oid; + + fn deref(&self) -> &Self::Target { + &self.0 + } +} + impl fmt::Display for ObjectId { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { write!(f, "{}", self.0) diff --git a/radicle-term/src/io.rs b/radicle-term/src/io.rs index 1e107279..2dd4b982 100644 --- a/radicle-term/src/io.rs +++ b/radicle-term/src/io.rs @@ -15,7 +15,7 @@ use crate::{style, Paint}; pub use inquire::Select; pub const ERROR_PREFIX: Paint<&str> = Paint::red("✗"); -pub const ERROR_HINT_PREFIX: Paint<&str> = Paint::yellow("✗"); +pub const ERROR_HINT_PREFIX: Paint<&str> = Paint::yellow("✗ Hint:"); pub const WARNING_PREFIX: Paint<&str> = Paint::yellow("!"); pub const TAB: &str = " "; diff --git a/radicle/src/storage.rs b/radicle/src/storage.rs index 817aa4c5..44da6b2d 100644 --- a/radicle/src/storage.rs +++ b/radicle/src/storage.rs @@ -58,7 +58,7 @@ pub enum Error { #[error("git: {0}")] Git(#[from] git2::Error), #[error("invalid repository identifier {0:?}")] - Id(std::ffi::OsString), + InvalidId(std::ffi::OsString), #[error("i/o: {0}")] Io(#[from] io::Error), } diff --git a/radicle/src/storage/git.rs b/radicle/src/storage/git.rs index a379442d..66d5a3f9 100644 --- a/radicle/src/storage/git.rs +++ b/radicle/src/storage/git.rs @@ -156,7 +156,8 @@ impl Storage { if path.file_name().to_string_lossy().starts_with('.') { continue; } - let rid = Id::try_from(path.file_name()).map_err(|_| Error::Id(path.file_name()))?; + let rid = + Id::try_from(path.file_name()).map_err(|_| Error::InvalidId(path.file_name()))?; let repo = self.repository(rid)?; // For performance reasons, we don't do a full repository check here.