From 5442e6699d322ecb1b35d9448b0d305f71333276 Mon Sep 17 00:00:00 2001 From: cloudhead Date: Wed, 27 Sep 2023 13:20:48 +0200 Subject: [PATCH] cli: Split rev and oid parsing functions * `args::rev` now parses things like `master`, `HEAD`, `3f25ea5`. * `args::oid` is for parsing full or short oids, like `3f25ea5`. Both return a `Rev`, since short oids can't be properly represented with the `git2::Oid` type. --- radicle-cli/src/commands/issue.rs | 4 ++-- radicle-cli/src/commands/patch.rs | 8 ++++---- radicle-cli/src/terminal/args.rs | 7 ++++++- 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/radicle-cli/src/commands/issue.rs b/radicle-cli/src/commands/issue.rs index 3f25ea54..ed188880 100644 --- a/radicle-cli/src/commands/issue.rs +++ b/radicle-cli/src/commands/issue.rs @@ -229,7 +229,7 @@ impl Args for Options { } Long("reply-to") if op == Some(OperationName::Comment) => { let val = parser.value()?; - let rev = term::args::rev(&val)?; + let rev = term::args::oid(&val)?; reply_to = Some(rev); } @@ -252,7 +252,7 @@ impl Args for Options { unknown => anyhow::bail!("unknown operation '{}'", unknown), }, Value(val) if op.is_some() => { - let val = term::args::rev(&val)?; + let val = term::args::oid(&val)?; id = Some(val); } _ => { diff --git a/radicle-cli/src/commands/patch.rs b/radicle-cli/src/commands/patch.rs index 349ee41d..d060913e 100644 --- a/radicle-cli/src/commands/patch.rs +++ b/radicle-cli/src/commands/patch.rs @@ -238,7 +238,7 @@ impl Args for Options { // Update options. Long("revision") if op == Some(OperationName::Update) => { let val = parser.value()?; - let rev = term::args::rev(&val)?; + let rev = term::args::oid(&val)?; revision_id = Some(rev); } @@ -246,7 +246,7 @@ impl Args for Options { // Comment options. Long("reply-to") if op == Some(OperationName::Comment) => { let val = parser.value()?; - let rev = term::args::rev(&val)?; + let rev = term::args::oid(&val)?; reply_to = Some(rev); } @@ -297,8 +297,8 @@ impl Args for Options { unknown => anyhow::bail!("unknown operation '{}'", unknown), }, Value(val) if op == Some(OperationName::Redact) => { - let val = string(&val); - revision_id = Some(Rev::from(val)); + let rev = term::args::oid(&val)?; + revision_id = Some(rev); } Value(val) if patch_id.is_none() diff --git a/radicle-cli/src/terminal/args.rs b/radicle-cli/src/terminal/args.rs index 6df34c20..221d53e1 100644 --- a/radicle-cli/src/terminal/args.rs +++ b/radicle-cli/src/terminal/args.rs @@ -150,8 +150,13 @@ pub fn string(val: &OsString) -> String { } pub fn rev(val: &OsString) -> anyhow::Result { + let s = val.to_str().ok_or(anyhow!("invalid git rev {val:?}"))?; + Ok(Rev::from(s.to_owned())) +} + +pub fn oid(val: &OsString) -> anyhow::Result { let s = string(val); - let _ = radicle::git::Oid::from_str(&s).map_err(|_| anyhow!("invalid git rev '{s}'"))?; + let _ = radicle::git::Oid::from_str(&s).map_err(|_| anyhow!("invalid git oid '{s}'"))?; Ok(Rev::from(s)) }