From 907ac09e341b941e53a9a550ee9345130ca932a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=89=E5=92=B2=E9=9B=85=20=C2=B7=20Misaki=20Masa?= Date: Sat, 31 Aug 2024 11:57:39 +0800 Subject: [PATCH] fix: continuous fetcher was not scheduled consecutively (#1575) --- Cargo.lock | 8 ++++---- Cargo.toml | 2 +- yazi-config/Cargo.toml | 2 +- yazi-config/src/plugin/plugin.rs | 6 ++++++ yazi-core/src/tasks/preload.rs | 3 ++- yazi-scheduler/src/prework/prework.rs | 8 ++++---- 6 files changed, 18 insertions(+), 11 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 6734c411..1133672b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1138,9 +1138,9 @@ checksum = "44feda355f4159a7c757171a77de25daf6411e217b4cabd03bd6650690468126" [[package]] name = "indexmap" -version = "2.4.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93ead53efc7ea8ed3cfb0c79fc8023fbb782a5432b52830b6518941cebe6505c" +checksum = "68b900aa2f7301e21c36462b170ee99994de34dff39a4a6a528e80e7376d07e5" dependencies = [ "equivalent", "hashbrown", @@ -2516,9 +2516,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.39.3" +version = "1.40.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9babc99b9923bfa4804bd74722ff02c0381021eafa4db9949217e3be8e84fff5" +checksum = "e2b070231665d27ad9ec9b8df639893f46727666c6767db40317fbe920a5d998" dependencies = [ "backtrace", "bytes", diff --git a/Cargo.toml b/Cargo.toml index 4758cddf..9ce805b7 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -30,7 +30,7 @@ scopeguard = "1.2.0" serde = { version = "1.0.209", features = [ "derive" ] } serde_json = "1.0.127" shell-words = "1.1.0" -tokio = { version = "1.39.3", features = [ "full" ] } +tokio = { version = "1.40.0", features = [ "full" ] } tokio-stream = "0.1.15" tokio-util = "0.7.11" tracing = { version = "0.1.40", features = [ "max_level_debug", "release_max_level_warn" ] } diff --git a/yazi-config/Cargo.toml b/yazi-config/Cargo.toml index eefcfa5f..4cad47dd 100644 --- a/yazi-config/Cargo.toml +++ b/yazi-config/Cargo.toml @@ -17,7 +17,7 @@ arc-swap = { workspace = true } bitflags = { workspace = true } crossterm = { workspace = true } globset = { workspace = true } -indexmap = { version = "2.4.0", features = [ "serde" ] } +indexmap = { version = "2.5.0", features = [ "serde" ] } ratatui = { workspace = true } regex = { workspace = true } serde = { workspace = true } diff --git a/yazi-config/src/plugin/plugin.rs b/yazi-config/src/plugin/plugin.rs index 59c89e99..1129ddbe 100644 --- a/yazi-config/src/plugin/plugin.rs +++ b/yazi-config/src/plugin/plugin.rs @@ -29,6 +29,11 @@ impl Plugin { }) } + #[inline] + pub fn fetchers_mask(&self) -> u32 { + self.fetchers.iter().fold(0, |n, f| if f.mime.is_some() { n } else { n | 1 << f.idx as u32 }) + } + pub fn preloaders<'a>( &'a self, path: &'a Path, @@ -48,6 +53,7 @@ impl Plugin { self.previewers.iter().find(|&p| p.matches(path, mime)) } } + impl FromStr for Plugin { type Err = toml::de::Error; diff --git a/yazi-core/src/tasks/preload.rs b/yazi-core/src/tasks/preload.rs index d7d020c5..ef0388d7 100644 --- a/yazi-core/src/tasks/preload.rs +++ b/yazi-core/src/tasks/preload.rs @@ -53,10 +53,11 @@ impl Tasks { } pub fn prework_affected(&self, affected: &[File], mimetype: &HashMap) { + let mask = PLUGIN.fetchers_mask(); { let mut loaded = self.scheduler.prework.loaded.lock(); for f in affected { - loaded.remove(&f.url); + loaded.get_mut(&f.url).map(|n| *n &= mask); } } diff --git a/yazi-scheduler/src/prework/prework.rs b/yazi-scheduler/src/prework/prework.rs index ae0dc3c6..78c785cd 100644 --- a/yazi-scheduler/src/prework/prework.rs +++ b/yazi-scheduler/src/prework/prework.rs @@ -52,10 +52,10 @@ impl Prework { urls.iter().map(ToString::to_string).collect::>().join("\n") ); } - if code >> 1 & 1 != 0 { + if code & 2 != 0 { let mut loaded = self.loaded.lock(); for url in urls { - loaded.get_mut(&url).map(|x| *x ^= 1 << task.plugin.id); + loaded.get_mut(&url).map(|x| *x &= !(1 << task.plugin.id)); } } self.prog.send(TaskProg::Adv(task.id, 1, 0))?; @@ -75,9 +75,9 @@ impl Prework { if code & 1 == 0 { error!("Returned {code} when running preloader `{}` with `{url}`", task.plugin.name); } - if code >> 1 & 1 != 0 { + if code & 2 != 0 { let mut loaded = self.loaded.lock(); - loaded.get_mut(&url).map(|x| *x ^= 1 << task.plugin.id); + loaded.get_mut(&url).map(|x| *x &= !(1 << task.plugin.id)); } self.prog.send(TaskProg::Adv(task.id, 1, 0))?; }