From f2d345e7b10c0d5551d8f72895beb04840aeb93e Mon Sep 17 00:00:00 2001 From: 21pages Date: Tue, 7 Nov 2023 10:16:01 +0800 Subject: [PATCH] fix missing log when removed directory names have same prefix Signed-off-by: 21pages --- flutter/lib/models/cm_file_model.dart | 13 ++++++++++--- src/server/connection.rs | 12 +++++++++--- 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/flutter/lib/models/cm_file_model.dart b/flutter/lib/models/cm_file_model.dart index ebb0d6f7f..ce9b711a2 100644 --- a/flutter/lib/models/cm_file_model.dart +++ b/flutter/lib/models/cm_file_model.dart @@ -123,14 +123,21 @@ class CmFileModel { } int removeUnreadCount = 0; if (data.dir) { + bool isChild(String parent, String child) { + if (child.startsWith(parent) && child.length > parent.length) { + final suffix = child.substring(parent.length); + return suffix.startsWith('/') || suffix.startsWith('\\'); + } + return false; + } + removeUnreadCount = jobTable .where((e) => e.action == CmFileAction.remove && - e.fileName.startsWith(data.path)) + isChild(data.path, e.fileName)) .length; jobTable.removeWhere((e) => - e.action == CmFileAction.remove && - e.fileName.startsWith(data.path)); + e.action == CmFileAction.remove && isChild(data.path, e.fileName)); } jobTable.add(CmFileLog() ..id = data.id diff --git a/src/server/connection.rs b/src/server/connection.rs index 842359b51..2b0829035 100644 --- a/src/server/connection.rs +++ b/src/server/connection.rs @@ -49,6 +49,7 @@ use sha2::{Digest, Sha256}; use std::sync::atomic::Ordering; use std::{ num::NonZeroI64, + path::PathBuf, sync::{atomic::AtomicI64, mpsc as std_mpsc}, }; #[cfg(not(any(target_os = "android", target_os = "ios")))] @@ -2953,12 +2954,17 @@ impl FileRemoveLogControl { fn on_remove_dir(&mut self, d: FileRemoveDir) -> Option { self.instant = Instant::now(); - self.removed_files.retain(|f| !f.path.starts_with(&d.path)); - self.removed_dirs.retain(|x| !x.path.starts_with(&d.path)); + let direct_child = |parent: &str, child: &str| { + PathBuf::from(child).parent().map(|x| x.to_path_buf()) == Some(PathBuf::from(parent)) + }; + self.removed_files + .retain(|f| !direct_child(&f.path, &d.path)); + self.removed_dirs + .retain(|x| !direct_child(&d.path, &x.path)); if !self .removed_dirs .iter() - .any(|x| d.path.starts_with(&x.path)) + .any(|x| direct_child(&x.path, &d.path)) { self.removed_dirs.push(d.clone()); }