mirror of https://github.com/helix-editor/helix
Merge 83a3db9f60
into 362e97e927
commit
8f9088bbf9
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue