diff --git a/src/librustpkg/package_source.rs b/src/librustpkg/package_source.rs index dc76c18ac28c..b5ded6f3fafa 100644 --- a/src/librustpkg/package_source.rs +++ b/src/librustpkg/package_source.rs @@ -18,7 +18,7 @@ use context::*; use crate::Crate; use messages::*; use source_control::{git_clone, git_clone_general}; -use path_util::{find_dir_using_rust_path_hack, default_workspace}; +use path_util::{find_dir_using_rust_path_hack, default_workspace, make_dir_rwx_recursive}; use util::compile_crate; use workspace::is_workspace; use workcache_support; @@ -197,12 +197,14 @@ impl PkgSrc { url, clone_target.to_str(), pkgid.version.to_str()); if git_clone_general(url, &clone_target, &pkgid.version) { - // since the operation succeeded, move clone_target to local - if !os::rename_file(&clone_target, local) { - None + // Since the operation succeeded, move clone_target to local. + // First, create all ancestor directories. + if make_dir_rwx_recursive(&local.pop()) + && os::rename_file(&clone_target, local) { + Some(local.clone()) } else { - Some(local.clone()) + None } } else { diff --git a/src/librustpkg/path_util.rs b/src/librustpkg/path_util.rs index 75e0d59084ce..f8ac7ca11a59 100644 --- a/src/librustpkg/path_util.rs +++ b/src/librustpkg/path_util.rs @@ -43,6 +43,8 @@ pub static U_RWX: i32 = (S_IRUSR | S_IWUSR | S_IXUSR) as i32; /// succeeded. pub fn make_dir_rwx(p: &Path) -> bool { os::make_dir(p, U_RWX) } +pub fn make_dir_rwx_recursive(p: &Path) -> bool { os::mkdir_recursive(p, U_RWX) } + // n.b. The next three functions ignore the package version right // now. Should fix that.