From a2d981aff966d08b9994e1ddab7f9cd1e545c325 Mon Sep 17 00:00:00 2001 From: Abhay Date: Sun, 19 Apr 2026 22:37:29 +0530 Subject: [PATCH 1/2] fix: normalize path separators for keyword matching on Windows --- src/db/stream.rs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/db/stream.rs b/src/db/stream.rs index 24c84e0..ac76b44 100644 --- a/src/db/stream.rs +++ b/src/db/stream.rs @@ -83,7 +83,10 @@ impl<'a> Stream<'a> { None => return true, }; - let path = util::to_lowercase(path); + let mut path = util::to_lowercase(path); + if cfg!(windows) { + path = path.replace('\\', "/"); + } let mut path = path.as_str(); match path.rfind(keywords_last) { Some(idx) => { @@ -202,6 +205,9 @@ mod tests { #[case(&["foo", "o", "bar"], "/foo/bar", false)] #[case(&["/foo/", "/bar"], "/foo/bar", false)] #[case(&["/foo/", "/bar"], "/foo/baz/bar", true)] + // Forward slash matching on Windows-style paths + #[case(&["bar/meow"], r"~\foo\bar\meow", true)] + #[case(&["bar", "meow"], r"~\foo\bar\meow", true)] fn query(#[case] keywords: &[&str], #[case] path: &str, #[case] is_match: bool) { let db = &mut Database::new(PathBuf::new(), Vec::new(), |_| Vec::new(), false); let options = StreamOptions::new(0).with_keywords(keywords.iter()); From 14bba8f264b762401906bd877b48967797d1dcfe Mon Sep 17 00:00:00 2001 From: Abhay Date: Mon, 20 Apr 2026 22:31:06 +0530 Subject: [PATCH 2/2] fix: move Windows-only test cases to cfg-gated test function --- src/db/stream.rs | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/db/stream.rs b/src/db/stream.rs index ac76b44..87cde06 100644 --- a/src/db/stream.rs +++ b/src/db/stream.rs @@ -205,13 +205,22 @@ mod tests { #[case(&["foo", "o", "bar"], "/foo/bar", false)] #[case(&["/foo/", "/bar"], "/foo/bar", false)] #[case(&["/foo/", "/bar"], "/foo/baz/bar", true)] - // Forward slash matching on Windows-style paths - #[case(&["bar/meow"], r"~\foo\bar\meow", true)] - #[case(&["bar", "meow"], r"~\foo\bar\meow", true)] fn query(#[case] keywords: &[&str], #[case] path: &str, #[case] is_match: bool) { let db = &mut Database::new(PathBuf::new(), Vec::new(), |_| Vec::new(), false); let options = StreamOptions::new(0).with_keywords(keywords.iter()); let stream = Stream::new(db, options); assert_eq!(is_match, stream.filter_by_keywords(path)); } + + // Forward slash matching on Windows-style paths + #[cfg(windows)] + #[rstest] + #[case(&["bar/meow"], r"~\foo\bar\meow", true)] + #[case(&["bar", "meow"], r"~\foo\bar\meow", true)] + fn query_windows(#[case] keywords: &[&str], #[case] path: &str, #[case] is_match: bool) { + let db = &mut Database::new(PathBuf::new(), Vec::new(), |_| Vec::new(), false); + let options = StreamOptions::new(0).with_keywords(keywords.iter()); + let stream = Stream::new(db, options); + assert_eq!(is_match, stream.filter_by_keywords(path)); + } }