diff --git a/crates/binstalk/src/bins.rs b/crates/binstalk/src/bins.rs index 5fefc6c6..e6549627 100644 --- a/crates/binstalk/src/bins.rs +++ b/crates/binstalk/src/bins.rs @@ -1,6 +1,6 @@ use std::{ borrow::Cow, - fmt, fs, + fmt, path::{self, Component, Path, PathBuf}, }; @@ -183,7 +183,7 @@ impl BinFile { ); #[cfg(unix)] - fs::set_permissions( + std::fs::set_permissions( &self.source, std::os::unix::fs::PermissionsExt::from_mode(0o755), )?; diff --git a/crates/binstalk/src/fs.rs b/crates/binstalk/src/fs.rs index 8b4c63e5..abf5c959 100644 --- a/crates/binstalk/src/fs.rs +++ b/crates/binstalk/src/fs.rs @@ -63,13 +63,15 @@ pub fn atomic_install(src: &Path, dst: &Path) -> io::Result<()> { Ok(()) } -fn symlink_file, Q: AsRef>(original: P, link: Q) -> io::Result<()> { +fn symlink_file(original: &Path, link: &Path) -> io::Result<()> { #[cfg(target_family = "unix")] - let f = std::os::unix::fs::symlink; - #[cfg(target_family = "windows")] - let f = std::os::windows::fs::symlink_file; + std::os::unix::fs::symlink(original, link)?; - f(original, link) + // Symlinks on Windows are disabled in some editions, so creating one is unreliable. + #[cfg(target_family = "windows")] + std::os::windows::fs::symlink_file(original, link) + .or_else(|_| std::fs::copy(original, link).map(drop))?; + Ok(()) } /// Atomically install symlink "link" to a file "dst". diff --git a/crates/binstalk/src/helpers/signal.rs b/crates/binstalk/src/helpers/signal.rs index 3ad352b4..0520a258 100644 --- a/crates/binstalk/src/helpers/signal.rs +++ b/crates/binstalk/src/helpers/signal.rs @@ -1,4 +1,4 @@ -use std::{future::pending, io}; +use std::io; use super::tasks::AutoAbortJoinHandle; use crate::errors::BinstallError; @@ -73,7 +73,7 @@ mod unix { Ok(()) } else { // Use pending() here for the same reason as above. - pending().await + std::future::pending().await } }