diff --git a/src/helpers.rs b/src/helpers.rs index 26031bc8..52d26f0d 100644 --- a/src/helpers.rs +++ b/src/helpers.rs @@ -1,3 +1,4 @@ +use std::env; use std::fmt::Debug; use std::fs; use std::io; @@ -44,10 +45,34 @@ mod crate_name; pub use crate_name::CrateName; pub fn cargo_home() -> Result<&'static Path, io::Error> { + fn cargo_home_inner() -> Result { + if let Some(p) = env::var_os("CARGO_HOME") { + let p = PathBuf::from(p); + debug!("using CARGO_HOME ({})", p.display()); + return Ok(p); + } + + // Standard $HOME/.cargo/bin + if let Some(mut d) = dirs::home_dir() { + d.push(".cargo"); + + if d.exists() { + debug!("using $HOME/.cargo: {}", d.display()); + + return Ok(d); + } + } + + Err(io::Error::new( + io::ErrorKind::NotFound, + "Failed to detect cargo home", + )) + } + static CARGO_HOME: OnceCell = OnceCell::new(); CARGO_HOME - .get_or_try_init(home::cargo_home) + .get_or_try_init(cargo_home_inner) .map(ops::Deref::deref) }