diff --git a/crates/uv-fs/src/locked_file.rs b/crates/uv-fs/src/locked_file.rs index 1098beedb9..63350e05ab 100644 --- a/crates/uv-fs/src/locked_file.rs +++ b/crates/uv-fs/src/locked_file.rs @@ -9,6 +9,8 @@ use thiserror::Error; use tracing::{debug, error, info, trace, warn}; use uv_static::EnvVars; +#[cfg(windows)] +use windows::Win32::Foundation::ERROR_LOCK_VIOLATION; use crate::{Simplified, is_known_already_locked_error}; @@ -422,13 +424,24 @@ impl LockedFile { #[cfg(feature = "tokio")] impl Drop for LockedFile { fn drop(&mut self) { - if let Err(err) = self.unlock() { - error!( - "Failed to unlock resource at `{}`; program may be stuck: {err}", - self.0.path().display() - ); - } else { - trace!("Released lock at `{}`", self.0.path().display()); + match self.unlock() { + Ok(()) => { + trace!("Released lock at `{}`", self.0.path().display()); + } + // See + #[cfg(windows)] + Err(err) + if uv_windows::is_wine() + && err.raw_os_error() == Some(ERROR_LOCK_VIOLATION.0 as i32) => + { + trace!("Released lock at `{}`", self.0.path().display()); + } + Err(err) => { + error!( + "Failed to unlock resource at `{}`; program may be stuck: {err}", + self.0.path().display() + ); + } } } }