diff --git a/Cargo.lock b/Cargo.lock index 845860f6..70861865 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -656,6 +656,7 @@ dependencies = [ "color-eyre", "colored", "derive_more", + "dunce", "env_logger", "inquire", "interactive-clap", @@ -1312,6 +1313,12 @@ version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10" +[[package]] +name = "dunce" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56ce8c6da7551ec6c462cbaf3bfbc75131ebbfa1c944aeaa9dab51ca1c5f0c3b" + [[package]] name = "dyn-clone" version = "1.0.14" diff --git a/cargo-near/Cargo.toml b/cargo-near/Cargo.toml index 74774bfa..b26c3307 100644 --- a/cargo-near/Cargo.toml +++ b/cargo-near/Cargo.toml @@ -42,3 +42,4 @@ interactive-clap-derive = "0.2.5" near-cli-rs = { version = "0.5.2" } derive_more = "0.99.9" shell-words = "1.0.0" +dunce = "1" \ No newline at end of file diff --git a/cargo-near/src/util/mod.rs b/cargo-near/src/util/mod.rs index 7478bcd0..5c9ec441 100644 --- a/cargo-near/src/util/mod.rs +++ b/cargo-near/src/util/mod.rs @@ -55,7 +55,7 @@ where cmd.envs(env); if let Some(path) = working_dir { - let path = path.as_ref(); + let path = force_canonicalize_dir(path.as_ref())?; log::debug!("Setting cargo working dir to '{}'", path); cmd.current_dir(path); } @@ -241,8 +241,14 @@ pub(crate) fn compile_project( /// Create the directory if it doesn't exist, and return the absolute path to it. pub(crate) fn force_canonicalize_dir(dir: &Utf8Path) -> color_eyre::eyre::Result { fs::create_dir_all(dir).wrap_err_with(|| format!("failed to create directory `{}`", dir))?; - dir.canonicalize_utf8() - .wrap_err_with(|| format!("failed to access output directory `{}`", dir)) + // use canonicalize from `dunce` create instead of default one from std because it's compatible with Windows UNC paths + // and don't break cargo compilation on Windows + // https://github.com/rust-lang/rust/issues/42869 + Utf8PathBuf::from_path_buf( + dunce::canonicalize(dir) + .wrap_err_with(|| format!("failed to canonicalize path: {} ", dir))?, + ) + .map_err(|err| color_eyre::eyre::eyre!("failed to convert path {}", err.to_string_lossy())) } /// Copy a file to a destination.