Radish alpha
h
rad:z3gqcJUoA1n9HaHKufZs5FCSGazv5
Radicle Heartwood Protocol & Stack
Radicle
Git
remote-helper: Parse base revision early
Merged lorenz opened 7 months ago

Translation of the string passed as the value for push-option base happens delayed.

Change this by parsing as soon as the value is written.

This also decreases the dependency fingerprint on radicle-cli.

2 files changed +20 -7 ef279618 43246fe6
modified 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<dyn std::error::Error>),
+
    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<Rev>,
+
    base: Option<git::Oid>,
    /// 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(|| "<unknown type encountered>".to_string()),
+
                        })?;
+

+
                    opts.base = Some(git::Oid::from(commit.id()));
                }
                other => {
                    return Err(Error::UnsupportedPushOption(other.to_owned()));
modified 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)?
    };