diff --git a/crates/radicle-remote-helper/src/main.rs b/crates/radicle-remote-helper/src/main.rs index b4ae2e49..2d3a62a8 100644 --- a/crates/radicle-remote-helper/src/main.rs +++ b/crates/radicle-remote-helper/src/main.rs @@ -33,7 +33,6 @@ use radicle::storage::{ReadRepository, WriteStorage}; use radicle::version::Version; use radicle::{cob, profile}; use radicle::{git, storage, Profile}; -use radicle_cli::git::Rev; use radicle_cli::terminal as cli; pub const VERSION: Version = Version { @@ -78,7 +77,10 @@ fn main() { pub enum Error { /// Failed to parse `base`. #[error("failed to parse base revision: {0}")] - Base(Box), + Base(#[source] git::raw::Error), + /// Base is not a commit. + #[error("base must be of type 'commit' but it is of type '{actual_type}'")] + BaseNotCommit { actual_type: String }, /// Remote repository not found (or empty). #[error("remote repository `{0}` not found")] RepositoryNotFound(PathBuf), @@ -162,7 +164,7 @@ pub struct Options { /// Open patch in draft mode. draft: bool, /// Patch base to use, when opening or updating a patch. - base: Option, + base: Option, /// Patch message. message: cli::patch::Message, verbosity: Verbosity, @@ -299,8 +301,19 @@ fn push_option(args: &[&str], opts: &mut Options) -> Result<(), Error> { opts.message.append(val); } "patch.base" => { - let base = cli::args::rev(&val.into()).map_err(|e| Error::Base(e.into()))?; - opts.base = Some(base); + let repo = git::raw::Repository::open_from_env().map_err(Error::Base)?; + let commit = repo + .revparse_single(val) + .map_err(Error::Base)? + .into_commit() + .map_err(|object| Error::BaseNotCommit { + actual_type: object + .kind() + .map(|kind| kind.to_string()) + .unwrap_or_else(|| "".to_string()), + })?; + + opts.base = Some(git::Oid::from(commit.id())); } other => { return Err(Error::UnsupportedPushOption(other.to_owned())); diff --git a/crates/radicle-remote-helper/src/push.rs b/crates/radicle-remote-helper/src/push.rs index b069a342..b329238b 100644 --- a/crates/radicle-remote-helper/src/push.rs +++ b/crates/radicle-remote-helper/src/push.rs @@ -506,7 +506,7 @@ where let (_, target) = stored.canonical_head()?; let base = if let Some(base) = opts.base { - base.resolve(working)? + base } else { stored.merge_base(&target, &head)? }; @@ -638,7 +638,7 @@ where let (_, target) = stored.canonical_head()?; let head: git::Oid = commit; let base = if let Some(base) = opts.base { - base.resolve(working)? + base } else { stored.merge_base(&target, &head)? };