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.rs14
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}"));