diff --git a/crates/radicle-remote-helper/src/main.rs b/crates/radicle-remote-helper/src/main.rs index f26ab417..8bb7adca 100644 --- a/crates/radicle-remote-helper/src/main.rs +++ b/crates/radicle-remote-helper/src/main.rs @@ -7,6 +7,14 @@ //! Usage of standard streams: //! - Standard Error ([`eprintln`]) is used for communicating with the user. //! - Standard Output ([`println`]) is used for communicating with Git tooling. +//! +//! This process assumes that the environment variable `GIT_DIR` is set +//! appropriately (to the repository being pushed from or fetched to), as +//! mentioned in the documentation on Git remote helpers. +//! +//! For example, the following two mechanisms rely on `GIT_DIR` being set: +//! - [`git::raw::Repository::open_from_env`] to open the repository +//! - [`radicle::git::run`] (with [`None`] as first argument) to invoke `git` mod fetch; mod list; @@ -89,12 +97,6 @@ pub enum Error { /// I/O error. #[error("i/o error: {0}")] Io(#[from] io::Error), - /// The `GIT_DIR` env var is not set. - #[error("the `GIT_DIR` environment variable is not set")] - NoGitDir, - /// No parent of `GIT_DIR` was found. - #[error("expected parent of .git but found {path:?}")] - NoWorkingCopy { path: PathBuf }, /// Git error. #[error("git: {0}")] Git(#[from] git::raw::Error), @@ -185,13 +187,14 @@ pub fn run(profile: radicle::Profile) -> Result<(), Error> { } }; + // Assume the default remote if there was no remote. + let remote = remote.unwrap_or_else(|| (*radicle::rad::REMOTE_NAME).clone()); + let stored = profile.storage.repository_mut(url.repo)?; if stored.is_empty()? { return Err(Error::RepositoryNotFound(stored.path().to_path_buf())); } - // `GIT_DIR` is set by Git tooling, if we're in a working copy. - let working = env::var("GIT_DIR").map(PathBuf::from); // Whether we should output debug logs. let debug = radicle::profile::env::debug(); @@ -243,25 +246,23 @@ pub fn run(profile: radicle::Profile) -> Result<(), Error> { let oid = git::Oid::from_str(oid)?; let refstr = git::RefString::try_from(*refstr)?; - return fetch::run(vec![(oid, refstr)], stored, &stdin, opts.verbosity) - .map_err(Error::from); + return Ok(fetch::run( + vec![(oid, refstr)], + stored, + &stdin, + opts.verbosity, + )?); } ["push", refspec] => { - // We have to be in a working copy to push. - let working = working.map_err(|_| Error::NoGitDir)?; - - return push::run( + return Ok(push::run( vec![refspec.to_string()], - &working, - // N.b. assume the default remote if there was no remote - remote.unwrap_or((*radicle::rad::REMOTE_NAME).clone()), + remote, url, &stored, &profile, &stdin, opts, - ) - .map_err(Error::from); + )?); } ["list"] => { list::for_fetch(&url, &profile, &stored)?; diff --git a/crates/radicle-remote-helper/src/push.rs b/crates/radicle-remote-helper/src/push.rs index d5354929..dd40ddd7 100644 --- a/crates/radicle-remote-helper/src/push.rs +++ b/crates/radicle-remote-helper/src/push.rs @@ -5,7 +5,6 @@ mod error; use std::collections::HashMap; use std::io::IsTerminal; -use std::path::Path; use std::process::ExitStatus; use std::str::FromStr; use std::{assert_eq, io}; @@ -247,7 +246,6 @@ impl PushAction { /// Run a git push command. pub fn run( mut specs: Vec, - working: &Path, remote: git::RefString, url: Url, stored: &storage::git::Repository, @@ -292,7 +290,9 @@ pub fn run( let canonical_ref = git::refs::branch(project.default_branch()); let mut set_canonical_refs: Vec<(git::Qualified, git::canonical::Object)> = Vec::with_capacity(specs.len()); - let working = git::raw::Repository::open(working)?; + + // Rely on the environment variable `GIT_DIR`. + let working = git::raw::Repository::open_from_env()?; // For each refspec, push a ref or delete a ref. for spec in specs {