|
1 | | -use anyhow::Result; |
2 | | - |
3 | | -use crate::core; |
4 | | -use crate::review::triage::triage_diff; |
5 | | - |
6 | | -use super::super::comments::{filter_comments_for_diff, synthesize_analyzer_comments}; |
7 | | -use super::super::contracts::PreparedReviewJobs; |
8 | | -use super::super::file_context::assemble_file_context; |
9 | | -use super::super::services::PipelineServices; |
10 | | -use super::super::session::ReviewSession; |
11 | | -use super::jobs::build_file_review_jobs; |
12 | | -use super::progress::PreparationProgress; |
13 | | - |
14 | | -pub(in super::super) async fn prepare_file_review_jobs( |
15 | | - services: &PipelineServices, |
16 | | - session: &mut ReviewSession, |
17 | | -) -> Result<PreparedReviewJobs> { |
18 | | - let mut progress = PreparationProgress::new(); |
19 | | - let mut jobs = Vec::new(); |
20 | | - let mut next_job_order = 0usize; |
21 | | - let repo_path_str = services.repo_path_str(); |
22 | | - |
23 | | - let mut batched_pre_analysis = services |
24 | | - .plugin_manager |
25 | | - .run_pre_analyzers_for_review(&session.diffs, &repo_path_str) |
26 | | - .await?; |
27 | | - |
28 | | - for (diff_index, diff) in session.diffs.iter().enumerate() { |
29 | | - if skip_diff_if_needed(services, diff, &mut progress) { |
30 | | - continue; |
31 | | - } |
32 | | - |
33 | | - let pre_analysis = batched_pre_analysis |
34 | | - .remove(&diff.file_path) |
35 | | - .unwrap_or_default(); |
36 | | - let deterministic_comments = filter_comments_for_diff( |
37 | | - diff, |
38 | | - synthesize_analyzer_comments(pre_analysis.findings.clone())?, |
39 | | - ); |
40 | | - |
41 | | - let triage_result = triage_diff(diff); |
42 | | - if triage_result.should_skip() { |
43 | | - if deterministic_comments.is_empty() { |
44 | | - tracing::info!( |
45 | | - "Skipping {} (triage: {})", |
46 | | - diff.file_path.display(), |
47 | | - triage_result.reason() |
48 | | - ); |
49 | | - progress.skip_file(); |
50 | | - } else { |
51 | | - tracing::info!( |
52 | | - "Skipping expensive LLM review for {} (triage: {}), keeping {} analyzer finding(s)", |
53 | | - diff.file_path.display(), |
54 | | - triage_result.reason(), |
55 | | - deterministic_comments.len() |
56 | | - ); |
57 | | - progress.complete_with_comments(session, diff, deterministic_comments); |
58 | | - } |
59 | | - continue; |
60 | | - } |
61 | | - |
62 | | - progress.report_current_file(session, diff); |
63 | | - |
64 | | - let prepared_file = assemble_file_context( |
65 | | - services, |
66 | | - session, |
67 | | - diff, |
68 | | - pre_analysis.context_chunks, |
69 | | - deterministic_comments, |
70 | | - ) |
71 | | - .await?; |
72 | | - |
73 | | - session |
74 | | - .verification_context |
75 | | - .insert(diff.file_path.clone(), prepared_file.context_chunks.clone()); |
76 | | - |
77 | | - let file_jobs = build_file_review_jobs( |
78 | | - services, |
79 | | - session, |
80 | | - diff_index, |
81 | | - diff, |
82 | | - &prepared_file, |
83 | | - next_job_order, |
84 | | - )?; |
85 | | - next_job_order += file_jobs.len(); |
86 | | - jobs.extend(file_jobs); |
87 | | - } |
88 | | - |
89 | | - Ok(progress.into_prepared_review_jobs(jobs)) |
90 | | -} |
91 | | - |
92 | | -fn skip_diff_if_needed( |
93 | | - services: &PipelineServices, |
94 | | - diff: &core::UnifiedDiff, |
95 | | - progress: &mut PreparationProgress, |
96 | | -) -> bool { |
97 | | - let skip_message = if services.config.should_exclude(&diff.file_path) { |
98 | | - Some("Skipping excluded file") |
99 | | - } else if diff.is_deleted { |
100 | | - Some("Skipping deleted file") |
101 | | - } else if diff.is_binary || diff.hunks.is_empty() { |
102 | | - Some("Skipping non-text diff") |
103 | | - } else { |
104 | | - None |
105 | | - }; |
106 | | - |
107 | | - let Some(skip_message) = skip_message else { |
108 | | - return false; |
109 | | - }; |
110 | | - |
111 | | - tracing::info!("{}: {}", skip_message, diff.file_path.display()); |
112 | | - progress.skip_file(); |
113 | | - true |
114 | | -} |
| 1 | +#[path = "runner/analysis.rs"] |
| 2 | +mod analysis; |
| 3 | +#[path = "runner/diff.rs"] |
| 4 | +mod diff; |
| 5 | +#[path = "runner/run.rs"] |
| 6 | +mod run; |
| 7 | +#[path = "runner/skip.rs"] |
| 8 | +mod skip; |
| 9 | + |
| 10 | +pub(in super::super) use run::prepare_file_review_jobs; |
0 commit comments