This commit is contained in:
maan2003 2025-08-25 12:19:43 -04:00 committed by GitHub
commit 6b157c520f
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
7 changed files with 50 additions and 12 deletions

View file

@ -174,7 +174,17 @@ impl Tool for GrepTool {
let mut matches_found = 0; let mut matches_found = 0;
let mut has_more_matches = false; let mut has_more_matches = false;
'outer: while let Some(SearchResult::Buffer { buffer, ranges }) = results.next().await { let mut any_file_matched_pattern = false;
'outer: while let Some(result) = results.next().await {
let (buffer, ranges) = match result {
SearchResult::Buffer { buffer, ranges } => {
(buffer,ranges)
}
SearchResult::Finished { any_file_matched_pattern: matched, .. } => {
any_file_matched_pattern = matched;
break 'outer;
}
};
if ranges.is_empty() { if ranges.is_empty() {
continue; continue;
} }
@ -293,7 +303,10 @@ impl Tool for GrepTool {
} }
} }
if matches_found == 0 { if !any_file_matched_pattern && input.include_pattern.is_some() {
assert_eq!(matches_found, 0, "no matches must be found if any file didn't match");
Ok("No files found matching the include pattern".to_string().into())
} else if matches_found == 0 {
Ok("No matches found".to_string().into()) Ok("No matches found".to_string().into())
} else if has_more_matches { } else if has_more_matches {
Ok(format!( Ok(format!(

View file

@ -5188,10 +5188,15 @@ async fn test_project_search(
SearchResult::Buffer { buffer, ranges } => { SearchResult::Buffer { buffer, ranges } => {
results.entry(buffer).or_insert(ranges); results.entry(buffer).or_insert(ranges);
} }
SearchResult::LimitReached => { SearchResult::Finished {
panic!( limit_reached,
any_file_matched_pattern,
} => {
assert!(
!limit_reached,
"Unexpectedly reached search limit in tests. If you do want to assert limit-reached, change this panic call." "Unexpectedly reached search limit in tests. If you do want to assert limit-reached, change this panic call."
) );
assert!(any_file_matched_pattern);
} }
}; };
} }

View file

@ -3826,6 +3826,7 @@ impl Project {
let mut range_count = 0; let mut range_count = 0;
let mut buffer_count = 0; let mut buffer_count = 0;
let mut limit_reached = false; let mut limit_reached = false;
let mut any_file_matched_pattern = false;
let query = Arc::new(query); let query = Arc::new(query);
let chunks = matching_buffers_rx.ready_chunks(64); let chunks = matching_buffers_rx.ready_chunks(64);
@ -3835,6 +3836,9 @@ impl Project {
// ranges in the buffer matched by the query. // ranges in the buffer matched by the query.
let mut chunks = pin!(chunks); let mut chunks = pin!(chunks);
'outer: while let Some(matching_buffer_chunk) = chunks.next().await { 'outer: while let Some(matching_buffer_chunk) = chunks.next().await {
if !matching_buffer_chunk.is_empty() {
any_file_matched_pattern = true;
}
let mut chunk_results = Vec::with_capacity(matching_buffer_chunk.len()); let mut chunk_results = Vec::with_capacity(matching_buffer_chunk.len());
for buffer in matching_buffer_chunk { for buffer in matching_buffer_chunk {
let query = query.clone(); let query = query.clone();
@ -3871,9 +3875,12 @@ impl Project {
} }
} }
if limit_reached { result_tx
result_tx.send(SearchResult::LimitReached).await?; .send(SearchResult::Finished {
} limit_reached,
any_file_matched_pattern,
})
.await?;
anyhow::Ok(()) anyhow::Ok(())
}) })

View file

@ -9104,7 +9104,7 @@ async fn search(
SearchResult::Buffer { buffer, ranges } => { SearchResult::Buffer { buffer, ranges } => {
results.entry(buffer).or_insert(ranges); results.entry(buffer).or_insert(ranges);
} }
SearchResult::LimitReached => {} SearchResult::Finished { .. } => {}
} }
} }
Ok(results Ok(results

View file

@ -21,7 +21,10 @@ pub enum SearchResult {
buffer: Entity<Buffer>, buffer: Entity<Buffer>,
ranges: Vec<Range<Anchor>>, ranges: Vec<Range<Anchor>>,
}, },
LimitReached, Finished {
limit_reached: bool,
any_file_matched_pattern: bool,
},
} }
#[derive(Clone, Copy, PartialEq)] #[derive(Clone, Copy, PartialEq)]

View file

@ -222,6 +222,13 @@ async fn test_remote_project_search(cx: &mut TestAppContext, server_cx: &mut Tes
) )
}); });
let SearchResult::Finished {
limit_reached: false,
any_file_matched_pattern: true,
} = receiver.recv().await.unwrap()
else {
panic!("invalid finisher");
};
assert!(receiver.recv().await.is_err()); assert!(receiver.recv().await.is_err());
buffer buffer
} }

View file

@ -330,8 +330,11 @@ impl ProjectSearch {
project::search::SearchResult::Buffer { buffer, ranges } => { project::search::SearchResult::Buffer { buffer, ranges } => {
buffers_with_ranges.push((buffer, ranges)); buffers_with_ranges.push((buffer, ranges));
} }
project::search::SearchResult::LimitReached => { project::search::SearchResult::Finished {
limit_reached = true; limit_reached: reached,
..
} => {
limit_reached = reached;
} }
} }
} }