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) => {
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);
}
_ => {

View File

@ -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()

View File

@ -150,8 +150,13 @@ pub fn string(val: &OsString) -> String {
}
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 _ = 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))
}