From 1f6e9ecf51c3d7940815c32666ce67dd2f7ab569 Mon Sep 17 00:00:00 2001 From: Azalea Colburn Date: Fri, 14 Mar 2025 20:59:39 -0700 Subject: [PATCH 1/4] File paths are transformed into parent directory paths --- src/cmd/query.rs | 18 +++++++++++++++++- src/db/stream.rs | 6 +++--- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/src/cmd/query.rs b/src/cmd/query.rs index 362d80a..2609254 100644 --- a/src/cmd/query.rs +++ b/src/cmd/query.rs @@ -78,7 +78,7 @@ impl Query { fn get_stream<'a>(&self, db: &'a mut Database, now: Epoch) -> Result> { let mut options = StreamOptions::new(now) - .with_keywords(self.keywords.iter().map(|s| s.as_str())) + .with_keywords(self.transfomed_keywords()) .with_exclude(config::exclude_dirs()?); if !self.all { let resolve_symlinks = config::resolve_symlinks(); @@ -117,4 +117,20 @@ impl Query { } .spawn() } + + /// ## Returns + /// `self.keywords` with file paths transformed into their parent directory paths and directory paths unchanged + /// + /// ## Warning + /// Clones self.keywords + fn transfomed_keywords(&self) -> impl Iterator + use<'_> { + self.keywords.iter().map(|keyword| { + if !std::path::Path::new(keyword).is_dir() { + let dirs: Vec<&str> = keyword.split("/").collect(); + dirs.split_last().unwrap().1.join("/").to_string() + } else { + keyword.to_string() + } + }) + } } diff --git a/src/db/stream.rs b/src/db/stream.rs index 4af7d7a..8d99e9f 100644 --- a/src/db/stream.rs +++ b/src/db/stream.rs @@ -48,16 +48,16 @@ impl<'a> Stream<'a> { } fn filter_by_keywords(&self, path: &str) -> bool { - let (keywords_last, keywords) = match self.options.keywords.split_last() { + let (last_keyword, keywords) = match self.options.keywords.split_last() { Some(split) => split, None => return true, }; let path = util::to_lowercase(path); let mut path = path.as_str(); - match path.rfind(keywords_last) { + match path.rfind(last_keyword) { Some(idx) => { - if path[idx + keywords_last.len()..].contains(path::is_separator) { + if path[idx + last_keyword.len()..].contains(path::is_separator) { return false; } path = &path[..idx]; From c946f804141a388c99b884885e0248ac955182a6 Mon Sep 17 00:00:00 2001 From: Azalea Colburn Date: Fri, 14 Mar 2025 21:17:00 -0700 Subject: [PATCH 2/4] Fix check for is_file, rather than !is_dir --- src/cmd/query.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cmd/query.rs b/src/cmd/query.rs index 2609254..1087a24 100644 --- a/src/cmd/query.rs +++ b/src/cmd/query.rs @@ -125,7 +125,7 @@ impl Query { /// Clones self.keywords fn transfomed_keywords(&self) -> impl Iterator + use<'_> { self.keywords.iter().map(|keyword| { - if !std::path::Path::new(keyword).is_dir() { + if std::path::Path::new(keyword).is_file() { let dirs: Vec<&str> = keyword.split("/").collect(); dirs.split_last().unwrap().1.join("/").to_string() } else { From 57520a15a37c710642d295c95d7b27c66bbd3d23 Mon Sep 17 00:00:00 2001 From: Azalea Colburn Date: Fri, 14 Mar 2025 21:25:19 -0700 Subject: [PATCH 3/4] fix: formatting --- src/cmd/query.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/cmd/query.rs b/src/cmd/query.rs index 1087a24..e086e09 100644 --- a/src/cmd/query.rs +++ b/src/cmd/query.rs @@ -119,7 +119,8 @@ impl Query { } /// ## Returns - /// `self.keywords` with file paths transformed into their parent directory paths and directory paths unchanged + /// `self.keywords` with file paths transformed into their parent directory + /// paths and directory paths unchanged /// /// ## Warning /// Clones self.keywords From 12591563823a5ccc59f0fd180d165b0e5e046528 Mon Sep 17 00:00:00 2001 From: Azalea Colburn Date: Sun, 16 Mar 2025 00:47:53 -0700 Subject: [PATCH 4/4] fix: remove IO on transformed_keywords --- src/cmd/query.rs | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/src/cmd/query.rs b/src/cmd/query.rs index e086e09..95c8a88 100644 --- a/src/cmd/query.rs +++ b/src/cmd/query.rs @@ -78,7 +78,7 @@ impl Query { fn get_stream<'a>(&self, db: &'a mut Database, now: Epoch) -> Result> { let mut options = StreamOptions::new(now) - .with_keywords(self.transfomed_keywords()) + .with_keywords(self.transformed_keywords()) .with_exclude(config::exclude_dirs()?); if !self.all { let resolve_symlinks = config::resolve_symlinks(); @@ -119,19 +119,21 @@ impl Query { } /// ## Returns - /// `self.keywords` with file paths transformed into their parent directory - /// paths and directory paths unchanged + /// `self.keywords` with file paths transformed into + /// their parent directory paths, directory paths unchanged /// - /// ## Warning - /// Clones self.keywords - fn transfomed_keywords(&self) -> impl Iterator + use<'_> { + /// ## Notes + /// - Heap allocates an iterator of Strings with length of self.keywords + /// - Only uses sans-IO Path methods + fn transformed_keywords(&self) -> impl Iterator + use<'_> { self.keywords.iter().map(|keyword| { - if std::path::Path::new(keyword).is_file() { - let dirs: Vec<&str> = keyword.split("/").collect(); - dirs.split_last().unwrap().1.join("/").to_string() - } else { - keyword.to_string() + let path = std::path::Path::new(keyword); + match path.parent() { + None => keyword, + Some(path) if path.to_str() == Some("") => keyword, + Some(path) => path.to_str().unwrap(), } + .to_string() }) } }