Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'helix-view/src/document.rs')
| -rw-r--r-- | helix-view/src/document.rs | 14 |
1 files changed, 8 insertions, 6 deletions
diff --git a/helix-view/src/document.rs b/helix-view/src/document.rs index f26ba8b9..d44b4240 100644 --- a/helix-view/src/document.rs +++ b/helix-view/src/document.rs @@ -893,15 +893,18 @@ impl Document { } } } + let write_path = tokio::fs::read_link(&path) + .await + .unwrap_or_else(|_| path.clone()); - if readonly(&path) { + if readonly(&write_path) { bail!(std::io::Error::new( std::io::ErrorKind::PermissionDenied, "Path is read only" )); } let backup = if path.exists() { - let path_ = path.clone(); + let path_ = write_path.clone(); // hacks: we use tempfile to handle the complex task of creating // non clobbered temporary path for us we don't want // the whole automatically delete path on drop thing @@ -925,7 +928,7 @@ impl Document { }; let write_result: anyhow::Result<_> = async { - let mut dst = tokio::fs::File::create(&path).await?; + let mut dst = tokio::fs::File::create(&write_path).await?; to_writer(&mut dst, encoding_with_bom_info, &text).await?; Ok(()) } @@ -934,14 +937,13 @@ impl Document { if let Some(backup) = backup { if write_result.is_err() { // restore backup - let _ = tokio::fs::rename(&backup, &path) + let _ = tokio::fs::rename(&backup, &write_path) .await .map_err(|e| log::error!("Failed to restore backup on write failure: {e}")); } else { // copy metadata and delete backup - let path_ = path.clone(); let _ = tokio::task::spawn_blocking(move || { - let _ = copy_metadata(&backup, &path_) + let _ = copy_metadata(&backup, &write_path) .map_err(|e| log::error!("Failed to copy metadata on write: {e}")); let _ = std::fs::remove_file(backup) .map_err(|e| log::error!("Failed to remove backup file on write: {e}")); |