diff --git a/src/rustup-utils/src/errors.rs b/src/rustup-utils/src/errors.rs index fc21f9c8e4..10995bf028 100644 --- a/src/rustup-utils/src/errors.rs +++ b/src/rustup-utils/src/errors.rs @@ -157,6 +157,9 @@ error_chain! { description("failed to set permissions") display("failed to set permissions for '{}'", path.display()) } + GettingCwd { + description("couldn't get current working directory") + } CargoHome { description("couldn't find value of CARGO_HOME") } diff --git a/src/rustup-utils/src/utils.rs b/src/rustup-utils/src/utils.rs index b96cfe3d2d..c56c011f04 100644 --- a/src/rustup-utils/src/utils.rs +++ b/src/rustup-utils/src/utils.rs @@ -520,8 +520,15 @@ pub fn cargo_home() -> Result { None }; - let cwd = env::current_dir().chain_err(|| ErrorKind::CargoHome)?; - let cargo_home = env_var.clone().map(|home| cwd.join(home)); + let cargo_home = if env_var.is_some() { + let cwd = try!(env::current_dir().chain_err(|| ErrorKind::GettingCwd)); + env_var.clone().map(|home| { + cwd.join(home) + }) + } else { + None + }; + let user_home = home_dir().map(|p| p.join(".cargo")); cargo_home.or(user_home).ok_or(ErrorKind::CargoHome.into()) } @@ -716,9 +723,17 @@ pub fn rustup_home_in_user_dir() -> Result { pub fn rustup_home() -> Result { let use_rustup_dir = do_rustup_home_upgrade(); + let rustup_home_env = env::var_os("RUSTUP_HOME"); + + let rustup_home = if rustup_home_env.is_some() { + let cwd = try!(env::current_dir().chain_err(|| ErrorKind::GettingCwd)); + rustup_home_env.clone().map(|home| { + cwd.join(home) + }) + } else { + None + }; - let cwd = env::current_dir().chain_err(|| ErrorKind::RustupHome)?; - let rustup_home = env::var_os("RUSTUP_HOME").map(|home| cwd.join(home)); let user_home = if use_rustup_dir { dot_dir(".rustup") } else { @@ -822,6 +837,18 @@ fn rename(name: &'static str, src: &Path, dest: &Path) -> Result<()> { mod tests { use super::*; + #[test] + fn test_cargo_home() { + // CARGO_HOME unset, we'll get the default ending in /.cargo + let cargo_home1 = cargo_home(); + let ch = format!("{}", cargo_home1.unwrap().display()); + assert!(ch.contains("/.cargo")); + + env::set_var("CARGO_HOME", "/test"); + let cargo_home2 = cargo_home(); + assert_eq!("/test", format!("{}", cargo_home2.unwrap().display())); + } + #[test] fn test_toochain_sort() { let expected = vec![