cli: Simplify fatal error output

It didn't make sense to get eg. `Patch failed` when listing patches
failed. We change all fatal errors to simply "Error:", giving more
control over the individual commands.
This commit is contained in:
cloudhead 2023-09-01 12:03:31 +02:00
parent 27e2f47280
commit 4fb5f6c172
No known key found for this signature in database
10 changed files with 24 additions and 71 deletions

View File

@ -3,5 +3,5 @@ Trying to clone a repository that is not in our routing table returns an error:
``` (fail)
$ rad clone rad:zVNuptPuk5XauitpCWSNVCXGGfXW --scope trusted
✓ Tracking relationship established for rad:zVNuptPuk5XauitpCWSNVCXGGfXW with scope 'trusted'
Clone failed: no seeds found for rad:zVNuptPuk5XauitpCWSNVCXGGfXW
Error: no seeds found for rad:zVNuptPuk5XauitpCWSNVCXGGfXW
```

View File

@ -242,7 +242,7 @@ $ rad id commit 2bf3a85e209d10b11a65e7ed8a8085f6f18ac6bf --no-confirm
! Warning: Revision is out of date
! Warning: d96f425412c9f8ad5d9a9a05c9831d0728e2338d =/= 475cdfbc8662853dd132ec564e4f5eb0f152dd7f
* Consider using 'rad id rebase' to update the proposal to the latest identity
Id failed: the identity hashes do not match for revision 2bf3a85e209d10b11a65e7ed8a8085f6f18ac6bf (d96f425412c9f8ad5d9a9a05c9831d0728e2338d =/= 475cdfbc8662853dd132ec564e4f5eb0f152dd7f)
Error: the identity hashes do not match for revision 2bf3a85e209d10b11a65e7ed8a8085f6f18ac6bf (d96f425412c9f8ad5d9a9a05c9831d0728e2338d =/= 475cdfbc8662853dd132ec564e4f5eb0f152dd7f)
```
So, let's fix this by running a rebase on the proposal's revision:

View File

@ -3,5 +3,5 @@ it will fail:
``` (fail)
$ rad init
Initialization failed: a Git repository was not found at the current path
Error: a Git repository was not found at the current path
```

View File

@ -23,7 +23,7 @@ $ rad ls
``` ~bob (fail)
$ rad sync rad:z2ug5mwNKZB8KGpBDRTrWHAMbvHCu --fetch --seed z6MknSLrJoTcukLrE435hVNQT4JUhbvWLX4kUzqkEStBU8Vi --timeout 1
✗ Fetching rad:z2ug5mwNKZB8KGpBDRTrWHAMbvHCu from z6MknSL…StBU8Vi.. error: connection reset
Sync failed: repository fetch from 1 seed(s) failed
Error: repository fetch from 1 seed(s) failed
```
She allows Bob to view the repository. And when she syncs, one node (Bob) gets

View File

@ -2,9 +2,8 @@ The `rad inspect` command can be run without being authenticated with radicle:
``` (fail)
$ rad self
Self failed: Could not load radicle profile: no profile found at path [..]
Error: Could not load radicle profile: no profile found at path [..]
✗ Hint: To setup your radicle profile, run `rad auth`.
```
```

View File

@ -29,5 +29,5 @@ Attempting to remove a repository that doesn't exist gives us an error message:
``` (fail)
$ rad rm rad:z2Jk1mNqyX7AjT4K83jJW9vQoHn4f
Remove failed: repository rad:z2Jk1mNqyX7AjT4K83jJW9vQoHn4f was not found
Error: repository rad:z2Jk1mNqyX7AjT4K83jJW9vQoHn4f was not found
```

View File

@ -2,15 +2,15 @@ When you try to track, clone, or sync without your node running, it gives you an
``` ~alice (fail)
$ rad track rad:z3gqcJUoA1n9HaHKufZs5FCSGazv5 --no-fetch
Track failed: to track a repository, your node must be running. To start it, run `rad node start`
Error: to track a repository, your node must be running. To start it, run `rad node start`
```
``` ~bob (fail)
$ rad clone rad:z3gqcJUoA1n9HaHKufZs5FCSGazv5
Clone failed: to clone a repository, your node must be running. To start it, run `rad node start`
Error: to clone a repository, your node must be running. To start it, run `rad node start`
```
``` ~eve (fail)
$ rad sync --fetch rad:z3gqcJUoA1n9HaHKufZs5FCSGazv5 --seed z6MksmpU5b1dS7oaqF2bHXhQi1DWy2hB7Mh9CuN7y1DN6QSz
Sync failed: to sync a repository, your node must be running. To start it, run `rad node start`
Error: to sync a repository, your node must be running. To start it, run `rad node start`
```

View File

@ -23,7 +23,7 @@ $ rad sync --announce --timeout 1
✗ Syncing with 2 node(s)..
! Seed z6Mkt67GdsW7715MEfRuP4pSZxJRJh6kj6Y48WRqVv4N1tRk timed out..
! Seed z6Mkux1aUQD2voWWukVb5nNUR7thrHveQG4pDQua8nVhib7Z timed out..
Sync failed: all seeds timed out
Error: all seeds timed out
```
We can also use the `--fetch` option to only fetch objects:
@ -45,7 +45,7 @@ $ rad sync --fetch --announce --timeout 1
✗ Syncing with 2 node(s)..
! Seed z6Mkt67GdsW7715MEfRuP4pSZxJRJh6kj6Y48WRqVv4N1tRk timed out..
! Seed z6Mkux1aUQD2voWWukVb5nNUR7thrHveQG4pDQua8nVhib7Z timed out..
Sync failed: all seeds timed out
Error: all seeds timed out
```
It's also possible to use the `--seed` flag to only sync with a specific node:

View File

@ -100,7 +100,6 @@ fn run_other(exe: &str, args: &[OsString]) -> Result<(), Option<anyhow::Error>>
"assign" => {
term::run_command_args::<rad_assign::Options, _>(
rad_assign::HELP,
"Assign",
rad_assign::run,
args.to_vec(),
);
@ -108,7 +107,6 @@ fn run_other(exe: &str, args: &[OsString]) -> Result<(), Option<anyhow::Error>>
"auth" => {
term::run_command_args::<rad_auth::Options, _>(
rad_auth::HELP,
"Authentication",
rad_auth::run,
args.to_vec(),
);
@ -116,7 +114,6 @@ fn run_other(exe: &str, args: &[OsString]) -> Result<(), Option<anyhow::Error>>
"checkout" => {
term::run_command_args::<rad_checkout::Options, _>(
rad_checkout::HELP,
"Checkout",
rad_checkout::run,
args.to_vec(),
);
@ -124,7 +121,6 @@ fn run_other(exe: &str, args: &[OsString]) -> Result<(), Option<anyhow::Error>>
"clone" => {
term::run_command_args::<rad_clone::Options, _>(
rad_clone::HELP,
"Clone",
rad_clone::run,
args.to_vec(),
);
@ -132,7 +128,6 @@ fn run_other(exe: &str, args: &[OsString]) -> Result<(), Option<anyhow::Error>>
"cob" => {
term::run_command_args::<rad_cob::Options, _>(
rad_cob::HELP,
"Cob",
rad_cob::run,
args.to_vec(),
);
@ -140,7 +135,6 @@ fn run_other(exe: &str, args: &[OsString]) -> Result<(), Option<anyhow::Error>>
"comment" => {
term::run_command_args::<rad_comment::Options, _>(
rad_comment::HELP,
"Comment",
rad_comment::run,
args.to_vec(),
);
@ -148,7 +142,6 @@ fn run_other(exe: &str, args: &[OsString]) -> Result<(), Option<anyhow::Error>>
"delegate" => {
term::run_command_args::<rad_delegate::Options, _>(
rad_delegate::HELP,
"Delegate",
rad_delegate::run,
args.to_vec(),
);
@ -156,7 +149,6 @@ fn run_other(exe: &str, args: &[OsString]) -> Result<(), Option<anyhow::Error>>
"edit" => {
term::run_command_args::<rad_edit::Options, _>(
rad_edit::HELP,
"Edit",
rad_edit::run,
args.to_vec(),
);
@ -164,7 +156,6 @@ fn run_other(exe: &str, args: &[OsString]) -> Result<(), Option<anyhow::Error>>
"fork" => {
term::run_command_args::<rad_fork::Options, _>(
rad_fork::HELP,
"Fork",
rad_fork::run,
args.to_vec(),
);
@ -172,23 +163,16 @@ fn run_other(exe: &str, args: &[OsString]) -> Result<(), Option<anyhow::Error>>
"help" => {
term::run_command_args::<rad_help::Options, _>(
rad_help::HELP,
"Help",
rad_help::run,
args.to_vec(),
);
}
"id" => {
term::run_command_args::<rad_id::Options, _>(
rad_id::HELP,
"Id",
rad_id::run,
args.to_vec(),
);
term::run_command_args::<rad_id::Options, _>(rad_id::HELP, rad_id::run, args.to_vec());
}
"init" => {
term::run_command_args::<rad_init::Options, _>(
rad_init::HELP,
"Initialization",
rad_init::run,
args.to_vec(),
);
@ -196,7 +180,6 @@ fn run_other(exe: &str, args: &[OsString]) -> Result<(), Option<anyhow::Error>>
"inspect" => {
term::run_command_args::<rad_inspect::Options, _>(
rad_inspect::HELP,
"Inspect",
rad_inspect::run,
args.to_vec(),
);
@ -204,23 +187,16 @@ fn run_other(exe: &str, args: &[OsString]) -> Result<(), Option<anyhow::Error>>
"issue" => {
term::run_command_args::<rad_issue::Options, _>(
rad_issue::HELP,
"Issue",
rad_issue::run,
args.to_vec(),
);
}
"ls" => {
term::run_command_args::<rad_ls::Options, _>(
rad_ls::HELP,
"List",
rad_ls::run,
args.to_vec(),
);
term::run_command_args::<rad_ls::Options, _>(rad_ls::HELP, rad_ls::run, args.to_vec());
}
"node" => {
term::run_command_args::<rad_node::Options, _>(
rad_node::HELP,
"Node",
rad_node::run,
args.to_vec(),
);
@ -228,7 +204,6 @@ fn run_other(exe: &str, args: &[OsString]) -> Result<(), Option<anyhow::Error>>
"patch" => {
term::run_command_args::<rad_patch::Options, _>(
rad_patch::HELP,
"Patch",
rad_patch::run,
args.to_vec(),
);
@ -236,7 +211,6 @@ fn run_other(exe: &str, args: &[OsString]) -> Result<(), Option<anyhow::Error>>
"path" => {
term::run_command_args::<rad_path::Options, _>(
rad_path::HELP,
"Path",
rad_path::run,
args.to_vec(),
);
@ -244,23 +218,16 @@ fn run_other(exe: &str, args: &[OsString]) -> Result<(), Option<anyhow::Error>>
"review" => {
term::run_command_args::<rad_review::Options, _>(
rad_review::HELP,
"Review",
rad_review::run,
args.to_vec(),
);
}
"rm" => {
term::run_command_args::<rad_rm::Options, _>(
rad_rm::HELP,
"Remove",
rad_rm::run,
args.to_vec(),
);
term::run_command_args::<rad_rm::Options, _>(rad_rm::HELP, rad_rm::run, args.to_vec());
}
"self" => {
term::run_command_args::<rad_self::Options, _>(
rad_self::HELP,
"Self",
rad_self::run,
args.to_vec(),
);
@ -268,7 +235,6 @@ fn run_other(exe: &str, args: &[OsString]) -> Result<(), Option<anyhow::Error>>
"sync" => {
term::run_command_args::<rad_sync::Options, _>(
rad_sync::HELP,
"Sync",
rad_sync::run,
args.to_vec(),
);
@ -276,7 +242,6 @@ fn run_other(exe: &str, args: &[OsString]) -> Result<(), Option<anyhow::Error>>
"label" => {
term::run_command_args::<rad_label::Options, _>(
rad_label::HELP,
"Label",
rad_label::run,
args.to_vec(),
);
@ -284,7 +249,6 @@ fn run_other(exe: &str, args: &[OsString]) -> Result<(), Option<anyhow::Error>>
"track" => {
term::run_command_args::<rad_track::Options, _>(
rad_track::HELP,
"Track",
rad_track::run,
args.to_vec(),
);
@ -292,7 +256,6 @@ fn run_other(exe: &str, args: &[OsString]) -> Result<(), Option<anyhow::Error>>
"unassign" => {
term::run_command_args::<rad_unassign::Options, _>(
rad_unassign::HELP,
"Unassign",
rad_unassign::run,
args.to_vec(),
);
@ -300,7 +263,6 @@ fn run_other(exe: &str, args: &[OsString]) -> Result<(), Option<anyhow::Error>>
"unlabel" => {
term::run_command_args::<rad_unlabel::Options, _>(
rad_unlabel::HELP,
"Unlabel",
rad_unlabel::run,
args.to_vec(),
);
@ -308,20 +270,17 @@ fn run_other(exe: &str, args: &[OsString]) -> Result<(), Option<anyhow::Error>>
"untrack" => {
term::run_command_args::<rad_untrack::Options, _>(
rad_untrack::HELP,
"Untrack",
rad_untrack::run,
args.to_vec(),
);
}
"web" => term::run_command_args::<rad_web::Options, _>(
rad_web::HELP,
"Web",
rad_web::run,
args.to_vec(),
),
"remote" => term::run_command_args::<rad_remote::Options, _>(
rad_remote::HELP,
"Remote",
rad_remote::run,
args.to_vec(),
),

View File

@ -50,17 +50,17 @@ where
}
}
pub fn run_command<A, C>(help: Help, action: &str, cmd: C) -> !
pub fn run_command<A, C>(help: Help, cmd: C) -> !
where
A: Args,
C: Command<A, fn() -> anyhow::Result<Profile>>,
{
let args = std::env::args_os().skip(1).collect();
run_command_args(help, action, cmd, args)
run_command_args(help, cmd, args)
}
pub fn run_command_args<A, C>(help: Help, action: &str, cmd: C, args: Vec<OsString>) -> !
pub fn run_command_args<A, C>(help: Help, cmd: C, args: Vec<OsString>) -> !
where
A: Args,
C: Command<A, fn() -> anyhow::Result<Profile>>,
@ -107,7 +107,7 @@ where
match cmd.run(options, self::profile) {
Ok(()) => process::exit(0),
Err(err) => {
terminal::fail(&format!("{action} failed"), &err);
terminal::fail(help.name, &err);
process::exit(1);
}
}
@ -127,26 +127,21 @@ pub fn profile() -> Result<Profile, anyhow::Error> {
pub fn perror(name: &str, err: impl std::fmt::Display) {
eprintln!(
"{} {} rad {}: {err}",
Paint::red(ERROR_PREFIX),
"{ERROR_PREFIX} {} rad {}: {err}",
Paint::red("Error:"),
name,
);
}
pub fn fail(header: &str, error: &anyhow::Error) {
pub fn fail(_name: &str, error: &anyhow::Error) {
let err = error.to_string();
let err = err.trim_end();
let separator = if err.contains('\n') { ":\n" } else { ": " };
println!(
"{ERROR_PREFIX} {}{}{error}",
Paint::red(header).bold(),
Paint::red(separator),
);
for line in err.lines() {
println!("{ERROR_PREFIX} {} {line}", Paint::red("Error:"));
}
if let Some(Error::WithHint { hint, .. }) = error.downcast_ref::<Error>() {
println!("{} {}", ERROR_HINT_PREFIX, Paint::yellow(hint));
blank();
println!("{ERROR_HINT_PREFIX} {}", Paint::yellow(hint));
}
}