From 358524347f3979516c7197fbf453cef1df72357f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=89=E5=92=B2=E9=9B=85=20misaki=20masa?= Date: Sat, 17 May 2025 14:25:08 +0800 Subject: [PATCH] fix: always try to create state directory before draining DDS data (#2769) --- yazi-dds/src/state.rs | 1 + yazi-fm/src/app/commands/quit.rs | 29 +++++++++++++++-------------- 2 files changed, 16 insertions(+), 14 deletions(-) diff --git a/yazi-dds/src/state.rs b/yazi-dds/src/state.rs index 13799f8f..dcf23ac7 100644 --- a/yazi-dds/src/state.rs +++ b/yazi-dds/src/state.rs @@ -56,6 +56,7 @@ impl State { return Ok(()); } + fs::create_dir_all(&BOOT.state_dir).await?; let mut buf = BufWriter::new( OpenOptions::new() .write(true) diff --git a/yazi-fm/src/app/commands/quit.rs b/yazi-fm/src/app/commands/quit.rs index 72a9f4ec..27c871bd 100644 --- a/yazi-fm/src/app/commands/quit.rs +++ b/yazi-fm/src/app/commands/quit.rs @@ -1,5 +1,6 @@ use std::ffi::OsString; +use tokio::fs; use yazi_boot::ARGS; use yazi_shared::event::EventQuit; @@ -9,29 +10,29 @@ impl App { pub(crate) fn quit(&mut self, opt: EventQuit) -> ! { self.cx.tasks.shutdown(); self.cx.mgr.shutdown(); - futures::executor::block_on(yazi_dds::shutdown()); - futures::executor::block_on(yazi_dds::STATE.drain()).ok(); - if !opt.no_cwd_file { - self.cwd_to_file(); - } - if let Some(selected) = opt.selected { - self.selected_to_file(selected); - } + futures::executor::block_on(async { + _ = futures::join!( + yazi_dds::shutdown(), + yazi_dds::STATE.drain(), + self.cwd_to_file(opt.no_cwd_file), + self.selected_to_file(opt.selected) + ); + }); Term::goodbye(|| opt.code); } - fn cwd_to_file(&self) { - if let Some(p) = &ARGS.cwd_file { + async fn cwd_to_file(&self, no: bool) { + if let Some(p) = ARGS.cwd_file.as_ref().filter(|_| !no) { let cwd = self.cx.mgr.cwd().as_os_str(); - std::fs::write(p, cwd.as_encoded_bytes()).ok(); + fs::write(p, cwd.as_encoded_bytes()).await.ok(); } } - fn selected_to_file(&self, selected: OsString) { - if let Some(p) = &ARGS.chooser_file { - std::fs::write(p, selected.as_encoded_bytes()).ok(); + async fn selected_to_file(&self, selected: Option) { + if let (Some(s), Some(p)) = (selected, &ARGS.chooser_file) { + fs::write(p, s.as_encoded_bytes()).await.ok(); } } }