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.
This commit is contained in:
cloudhead 2023-09-27 13:20:48 +02:00
parent 90fe50c152
commit 5442e6699d
No known key found for this signature in database
3 changed files with 12 additions and 7 deletions

View File

@ -229,7 +229,7 @@ impl Args for Options {
} }
Long("reply-to") if op == Some(OperationName::Comment) => { Long("reply-to") if op == Some(OperationName::Comment) => {
let val = parser.value()?; let val = parser.value()?;
let rev = term::args::rev(&val)?; let rev = term::args::oid(&val)?;
reply_to = Some(rev); reply_to = Some(rev);
} }
@ -252,7 +252,7 @@ impl Args for Options {
unknown => anyhow::bail!("unknown operation '{}'", unknown), unknown => anyhow::bail!("unknown operation '{}'", unknown),
}, },
Value(val) if op.is_some() => { Value(val) if op.is_some() => {
let val = term::args::rev(&val)?; let val = term::args::oid(&val)?;
id = Some(val); id = Some(val);
} }
_ => { _ => {

View File

@ -238,7 +238,7 @@ impl Args for Options {
// Update options. // Update options.
Long("revision") if op == Some(OperationName::Update) => { Long("revision") if op == Some(OperationName::Update) => {
let val = parser.value()?; let val = parser.value()?;
let rev = term::args::rev(&val)?; let rev = term::args::oid(&val)?;
revision_id = Some(rev); revision_id = Some(rev);
} }
@ -246,7 +246,7 @@ impl Args for Options {
// Comment options. // Comment options.
Long("reply-to") if op == Some(OperationName::Comment) => { Long("reply-to") if op == Some(OperationName::Comment) => {
let val = parser.value()?; let val = parser.value()?;
let rev = term::args::rev(&val)?; let rev = term::args::oid(&val)?;
reply_to = Some(rev); reply_to = Some(rev);
} }
@ -297,8 +297,8 @@ impl Args for Options {
unknown => anyhow::bail!("unknown operation '{}'", unknown), unknown => anyhow::bail!("unknown operation '{}'", unknown),
}, },
Value(val) if op == Some(OperationName::Redact) => { Value(val) if op == Some(OperationName::Redact) => {
let val = string(&val); let rev = term::args::oid(&val)?;
revision_id = Some(Rev::from(val)); revision_id = Some(rev);
} }
Value(val) Value(val)
if patch_id.is_none() if patch_id.is_none()

View File

@ -150,8 +150,13 @@ pub fn string(val: &OsString) -> String {
} }
pub fn rev(val: &OsString) -> anyhow::Result<Rev> { pub fn rev(val: &OsString) -> anyhow::Result<Rev> {
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<Rev> {
let s = string(val); 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)) Ok(Rev::from(s))
} }