krabodyan 2025-06-16 23:33:36 +07:00 committed by GitHub
commit 8f9088bbf9
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
1 changed files with 19 additions and 17 deletions

View File

@ -991,7 +991,7 @@ impl Document {
// TODO: display a prompt asking the user if the directories should be created // TODO: display a prompt asking the user if the directories should be created
if !parent.exists() { if !parent.exists() {
if force { if force {
std::fs::DirBuilder::new().recursive(true).create(parent)?; fs::DirBuilder::new().recursive(true).create(parent).await?;
} else { } else {
bail!("can't save file, parent directory does not exist (use :w! to create it)"); bail!("can't save file, parent directory does not exist (use :w! to create it)");
} }
@ -1008,7 +1008,7 @@ impl Document {
} }
} }
} }
let write_path = tokio::fs::read_link(&path) let write_path = fs::read_link(&path)
.await .await
.ok() .ok()
.and_then(|p| { .and_then(|p| {
@ -1062,7 +1062,7 @@ impl Document {
}; };
let write_result: anyhow::Result<_> = async { let write_result: anyhow::Result<_> = async {
let mut dst = tokio::fs::File::create(&write_path).await?; let mut dst = fs::File::create(&write_path).await?;
to_writer(&mut dst, encoding_with_bom_info, &text).await?; to_writer(&mut dst, encoding_with_bom_info, &text).await?;
dst.sync_all().await?; dst.sync_all().await?;
Ok(()) Ok(())
@ -1079,30 +1079,32 @@ impl Document {
let mut delete = true; let mut delete = true;
if write_result.is_err() { if write_result.is_err() {
// Restore backup // Restore backup
let _ = tokio::fs::copy(&backup, &write_path).await.map_err(|e| { if let Err(e) = fs::copy(&backup, &write_path).await {
delete = false; delete = false;
log::error!("Failed to restore backup on write failure: {e}") log::error!("Failed to restore backup on write failure: {e}");
}); }
} }
if delete { if delete {
// Delete backup // Delete backup
let _ = tokio::fs::remove_file(backup) if let Err(e) = fs::remove_file(backup).await {
.await log::error!("Failed to remove backup file on write: {e}");
.map_err(|e| log::error!("Failed to remove backup file on write: {e}")); }
} }
} else if write_result.is_err() { } else if write_result.is_err() {
// restore backup // restore backup
let _ = tokio::fs::rename(&backup, &write_path) if let Err(e) = fs::rename(&backup, &write_path).await {
.await log::error!("Failed to restore backup on write failure: {e}");
.map_err(|e| log::error!("Failed to restore backup on write failure: {e}")); }
} else { } else {
// copy metadata and delete backup // copy metadata and delete backup
let _ = tokio::task::spawn_blocking(move || { _ = tokio::task::spawn_blocking(move || {
let _ = copy_metadata(&backup, &write_path) if let Err(e) = copy_metadata(&backup, &write_path) {
.map_err(|e| log::error!("Failed to copy metadata on write: {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}")); if let Err(e) = std::fs::remove_file(backup) {
log::error!("Failed to remove backup file on write: {e}");
}
}) })
.await; .await;
} }