Editor::flush_writes returns an error

pull/1/head
Skyler Hawthorne 2 years ago
parent 52ba550098
commit e645804b0a

@ -977,7 +977,10 @@ impl Application {
errs.push(err); errs.push(err);
}; };
self.editor.flush_writes().await; if let Err(err) = self.editor.flush_writes().await {
log::error!("Error writing: {}", err);
errs.push(err);
}
if self.editor.close_language_servers(None).await.is_err() { if self.editor.close_language_servers(None).await.is_err() {
log::error!("Timed out waiting for language servers to shutdown"); log::error!("Timed out waiting for language servers to shutdown");

@ -75,17 +75,16 @@ fn open(cx: &mut compositor::Context, args: &[Cow<str>], event: PromptEvent) ->
} }
fn buffer_close_by_ids_impl( fn buffer_close_by_ids_impl(
editor: &mut Editor, cx: &mut compositor::Context,
doc_ids: &[DocumentId], doc_ids: &[DocumentId],
force: bool, force: bool,
) -> anyhow::Result<()> { ) -> anyhow::Result<()> {
// TODO: deduplicate with ctx.block_try_flush_writes cx.block_try_flush_writes()?;
tokio::task::block_in_place(|| helix_lsp::block_on(editor.flush_writes()));
let (modified_ids, modified_names): (Vec<_>, Vec<_>) = doc_ids let (modified_ids, modified_names): (Vec<_>, Vec<_>) = doc_ids
.iter() .iter()
.filter_map(|&doc_id| { .filter_map(|&doc_id| {
if let Err(CloseError::BufferModified(name)) = editor.close_document(doc_id, force) { if let Err(CloseError::BufferModified(name)) = cx.editor.close_document(doc_id, force) {
Some((doc_id, name)) Some((doc_id, name))
} else { } else {
None None
@ -94,11 +93,11 @@ fn buffer_close_by_ids_impl(
.unzip(); .unzip();
if let Some(first) = modified_ids.first() { if let Some(first) = modified_ids.first() {
let current = doc!(editor); let current = doc!(cx.editor);
// If the current document is unmodified, and there are modified // If the current document is unmodified, and there are modified
// documents, switch focus to the first modified doc. // documents, switch focus to the first modified doc.
if !modified_ids.contains(&current.id()) { if !modified_ids.contains(&current.id()) {
editor.switch(*first, Action::Replace); cx.editor.switch(*first, Action::Replace);
} }
bail!( bail!(
"{} unsaved buffer(s) remaining: {:?}", "{} unsaved buffer(s) remaining: {:?}",
@ -157,7 +156,7 @@ fn buffer_close(
} }
let document_ids = buffer_gather_paths_impl(cx.editor, args); let document_ids = buffer_gather_paths_impl(cx.editor, args);
buffer_close_by_ids_impl(cx.editor, &document_ids, false) buffer_close_by_ids_impl(cx, &document_ids, false)
} }
fn force_buffer_close( fn force_buffer_close(
@ -170,7 +169,7 @@ fn force_buffer_close(
} }
let document_ids = buffer_gather_paths_impl(cx.editor, args); let document_ids = buffer_gather_paths_impl(cx.editor, args);
buffer_close_by_ids_impl(cx.editor, &document_ids, true) buffer_close_by_ids_impl(cx, &document_ids, true)
} }
fn buffer_gather_others_impl(editor: &mut Editor) -> Vec<DocumentId> { fn buffer_gather_others_impl(editor: &mut Editor) -> Vec<DocumentId> {
@ -192,7 +191,7 @@ fn buffer_close_others(
} }
let document_ids = buffer_gather_others_impl(cx.editor); let document_ids = buffer_gather_others_impl(cx.editor);
buffer_close_by_ids_impl(cx.editor, &document_ids, false) buffer_close_by_ids_impl(cx, &document_ids, false)
} }
fn force_buffer_close_others( fn force_buffer_close_others(
@ -205,7 +204,7 @@ fn force_buffer_close_others(
} }
let document_ids = buffer_gather_others_impl(cx.editor); let document_ids = buffer_gather_others_impl(cx.editor);
buffer_close_by_ids_impl(cx.editor, &document_ids, true) buffer_close_by_ids_impl(cx, &document_ids, true)
} }
fn buffer_gather_all_impl(editor: &mut Editor) -> Vec<DocumentId> { fn buffer_gather_all_impl(editor: &mut Editor) -> Vec<DocumentId> {
@ -222,7 +221,7 @@ fn buffer_close_all(
} }
let document_ids = buffer_gather_all_impl(cx.editor); let document_ids = buffer_gather_all_impl(cx.editor);
buffer_close_by_ids_impl(cx.editor, &document_ids, false) buffer_close_by_ids_impl(cx, &document_ids, false)
} }
fn force_buffer_close_all( fn force_buffer_close_all(
@ -235,7 +234,7 @@ fn force_buffer_close_all(
} }
let document_ids = buffer_gather_all_impl(cx.editor); let document_ids = buffer_gather_all_impl(cx.editor);
buffer_close_by_ids_impl(cx.editor, &document_ids, true) buffer_close_by_ids_impl(cx, &document_ids, true)
} }
fn buffer_next( fn buffer_next(

@ -32,9 +32,7 @@ impl<'a> Context<'a> {
/// operations for all documents. /// operations for all documents.
pub fn block_try_flush_writes(&mut self) -> anyhow::Result<()> { pub fn block_try_flush_writes(&mut self) -> anyhow::Result<()> {
tokio::task::block_in_place(|| helix_lsp::block_on(self.jobs.finish(self.editor, None)))?; tokio::task::block_in_place(|| helix_lsp::block_on(self.jobs.finish(self.editor, None)))?;
tokio::task::block_in_place(|| helix_lsp::block_on(self.editor.flush_writes()))?;
tokio::task::block_in_place(|| helix_lsp::block_on(self.editor.flush_writes()));
Ok(()) Ok(())
} }
} }

@ -29,7 +29,7 @@ use tokio::{
time::{sleep, Duration, Instant, Sleep}, time::{sleep, Duration, Instant, Sleep},
}; };
use anyhow::{anyhow, Error}; use anyhow::{anyhow, bail, Error};
pub use helix_core::diagnostic::Severity; pub use helix_core::diagnostic::Severity;
pub use helix_core::register::Registers; pub use helix_core::register::Registers;
@ -1355,22 +1355,24 @@ impl Editor {
} }
} }
pub async fn flush_writes(&mut self) { pub async fn flush_writes(&mut self) -> anyhow::Result<()> {
while self.write_count > 0 { while self.write_count > 0 {
if let Some(save_event) = self.save_queue.next().await { if let Some(save_event) = self.save_queue.next().await {
match &save_event { self.write_count -= 1;
Ok(event) => {
let doc = doc_mut!(self, &event.doc_id); let save_event = match save_event {
doc.set_last_saved_revision(event.revision); Ok(event) => event,
}
Err(err) => { Err(err) => {
log::error!("error saving document: {}", err); self.set_error(err.to_string());
bail!(err);
} }
}; };
// TODO: if is_err: break?
self.write_count -= 1; let doc = doc_mut!(self, &save_event.doc_id);
doc.set_last_saved_revision(save_event.revision);
} }
} }
Ok(())
} }
} }

Loading…
Cancel
Save