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 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() {
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())
} else if has_more_matches {
Ok(format!(

View file

@ -5188,10 +5188,15 @@ async fn test_project_search(
SearchResult::Buffer { buffer, ranges } => {
results.entry(buffer).or_insert(ranges);
}
SearchResult::LimitReached => {
panic!(
SearchResult::Finished {
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."
)
);
assert!(any_file_matched_pattern);
}
};
}

View file

@ -3826,6 +3826,7 @@ impl Project {
let mut range_count = 0;
let mut buffer_count = 0;
let mut limit_reached = false;
let mut any_file_matched_pattern = false;
let query = Arc::new(query);
let chunks = matching_buffers_rx.ready_chunks(64);
@ -3835,6 +3836,9 @@ impl Project {
// ranges in the buffer matched by the query.
let mut chunks = pin!(chunks);
'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());
for buffer in matching_buffer_chunk {
let query = query.clone();
@ -3871,9 +3875,12 @@ impl Project {
}
}
if limit_reached {
result_tx.send(SearchResult::LimitReached).await?;
}
result_tx
.send(SearchResult::Finished {
limit_reached,
any_file_matched_pattern,
})
.await?;
anyhow::Ok(())
})

View file

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

View file

@ -21,7 +21,10 @@ pub enum SearchResult {
buffer: Entity<Buffer>,
ranges: Vec<Range<Anchor>>,
},
LimitReached,
Finished {
limit_reached: bool,
any_file_matched_pattern: bool,
},
}
#[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());
buffer
}

View file

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