Skip to content

Commit ca84460

Browse files
brynaryclaude
andcommitted
refactor(coverage): rename JavaSrcDirFinder to SrcDirFinder and add CLI options
- Rename `java_src_dirs` to `src_search_dirs` in Settings - Rename `JavaSrcDirFinder` to `SrcDirFinder` (and rename file) - Update user-facing output from "Discovered Java source directories" to "Source search directories" - Add `--add-src-dir` CLI option to manually specify source directories (takes precedence over auto-discovered) - Add `--remove-src-dir` CLI option to exclude directories from the search list - Add warning when a file is found in multiple source directories 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
1 parent aa57cff commit ca84460

8 files changed

Lines changed: 155 additions & 114 deletions

File tree

qlty-cli/src/commands/coverage/publish.rs

Lines changed: 35 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ use qlty_coverage::print::{print_report_as_json, print_report_as_text};
1414
use qlty_coverage::publish::{Plan, Planner, Processor, Reader, Report, Settings, Upload};
1515
use qlty_coverage::token::load_auth_token;
1616
use qlty_coverage::validate::{ValidationStatus, Validator};
17-
use qlty_coverage::{ExclusionStrategy, JavaSrcDirFinder};
17+
use qlty_coverage::{ExclusionStrategy, SrcDirFinder};
1818
use std::io::Write as _;
1919
use std::path::PathBuf;
2020
use std::time::Instant;
@@ -41,6 +41,15 @@ pub struct Publish {
4141
/// and use them to resolve file paths in coverage reports.
4242
pub discover_java_src_dirs: bool,
4343

44+
#[arg(long = "add-src-dir", hide = true)]
45+
/// Add a source directory to search for files. Can be specified multiple times.
46+
/// These directories take precedence over auto-discovered directories.
47+
pub add_src_dirs: Vec<PathBuf>,
48+
49+
#[arg(long = "remove-src-dir", hide = true)]
50+
/// Remove a source directory from the search list. Can be specified multiple times.
51+
pub remove_src_dirs: Vec<PathBuf>,
52+
4453
#[arg(long, hide = true)]
4554
pub output_dir: Option<PathBuf>,
4655

@@ -256,24 +265,39 @@ impl Publish {
256265

257266
let root = std::env::current_dir()?;
258267
let config = load_config();
259-
let java_src_dirs = if self.discover_java_src_dirs {
268+
269+
let mut src_search_dirs = self.add_src_dirs.clone();
270+
if self.discover_java_src_dirs {
260271
let exclusion_strategy = if config.exclude_patterns.is_empty() {
261272
ExclusionStrategy::DefaultHeuristics
262273
} else {
263274
ExclusionStrategy::UserDefined(config.exclude_patterns)
264275
};
265-
let finder = JavaSrcDirFinder::new(root.clone(), exclusion_strategy);
266-
finder.find()?
267-
} else {
268-
Vec::new()
269-
};
276+
let finder = SrcDirFinder::new(root.clone(), exclusion_strategy);
277+
src_search_dirs.extend(finder.find()?);
278+
}
279+
280+
for dir_to_remove in &self.remove_src_dirs {
281+
if let Some(pos) = src_search_dirs.iter().position(|d| d == dir_to_remove) {
282+
src_search_dirs.remove(pos);
283+
} else {
284+
tracing::warn!(
285+
"Directory '{}' not found in source search directories",
286+
dir_to_remove.display()
287+
);
288+
eprintln!(
289+
"WARNING: Directory '{}' not found in source search directories",
290+
dir_to_remove.display()
291+
);
292+
}
293+
}
270294

271295
Ok(Settings {
272296
add_prefix,
273297
dry_run: self.dry_run,
274298
discover_java_src_dirs: self.discover_java_src_dirs,
275299
root,
276-
java_src_dirs,
300+
src_search_dirs,
277301
incomplete,
278302
name: self.name.clone(),
279303
output_dir: self.output_dir.clone(),
@@ -320,13 +344,10 @@ impl Publish {
320344
return;
321345
}
322346

323-
if settings.discover_java_src_dirs
324-
&& !settings.java_src_dirs.is_empty()
325-
&& std::env::var("JACOCO_SOURCE_PATH").is_ok()
326-
{
327-
eprintln!("WARNING: Both --discover-java-src-dirs and JACOCO_SOURCE_PATH are set.");
347+
if !settings.src_search_dirs.is_empty() && std::env::var("JACOCO_SOURCE_PATH").is_ok() {
348+
eprintln!("WARNING: Both source search directories and JACOCO_SOURCE_PATH are set.");
328349
eprintln!("JACOCO_SOURCE_PATH applies during JaCoCo parsing.");
329-
eprintln!("--discover-java-src-dirs applies to all formats during processing.\n");
350+
eprintln!("Source search directories (--add-src-dir/--discover-java-src-dirs) apply to all formats during processing.\n");
330351
}
331352
}
332353

qlty-cli/src/commands/coverage/utils.rs

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -108,15 +108,16 @@ pub fn print_settings(settings: &Settings) {
108108

109109
eprintln!();
110110

111-
// Print discovered Java src dirs as a sub-section if --discover-java-src-dirs is enabled
112-
if settings.discover_java_src_dirs {
113-
eprintln!(" discover-java-src-dirs: true");
111+
if settings.discover_java_src_dirs || !settings.src_search_dirs.is_empty() {
112+
if settings.discover_java_src_dirs {
113+
eprintln!(" discover-java-src-dirs: true");
114+
}
114115
eprintln!();
115-
eprintln!(" Discovered Java source directories:");
116-
if settings.java_src_dirs.is_empty() {
116+
eprintln!(" Source search directories:");
117+
if settings.src_search_dirs.is_empty() {
117118
eprintln!(" (none found)");
118119
} else {
119-
for dir in &settings.java_src_dirs {
120+
for dir in &settings.src_search_dirs {
120121
eprintln!(" {}", dir.display());
121122
}
122123
}

qlty-cli/tests/cmd/coverage/discover_java_src_dirs.stderr

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ https://qlty.sh/d/coverage
1212

1313
discover-java-src-dirs: true
1414

15-
Discovered Java source directories:
15+
Source search directories:
1616
src/main/java
1717

1818
METADATA

qlty-coverage/src/lib.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,17 @@ mod env;
33
pub mod export;
44
pub mod formats;
55
pub mod git;
6-
mod java_src_dir_finder;
76
pub mod parser;
87
pub mod print;
98
pub mod publish;
9+
mod src_dir_finder;
1010
pub mod token;
1111
pub mod transform;
1212
mod transformer;
1313
mod utils;
1414
pub mod validate;
1515

16-
pub use java_src_dir_finder::{ExclusionStrategy, JavaSrcDirFinder};
16+
pub use src_dir_finder::{ExclusionStrategy, SrcDirFinder};
1717

1818
#[macro_use]
1919
mod macros;

qlty-coverage/src/publish/planner.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -115,10 +115,10 @@ impl Planner {
115115

116116
// Add PrependSrcDir transformer if Java src dirs were discovered
117117
// This runs after path normalization so it receives clean relative paths
118-
if !self.settings.java_src_dirs.is_empty() {
118+
if !self.settings.src_search_dirs.is_empty() {
119119
transformers.push(Box::new(PrependSrcDir::new(
120120
self.settings.root.clone(),
121-
self.settings.java_src_dirs.clone(),
121+
self.settings.src_search_dirs.clone(),
122122
)));
123123
}
124124

qlty-coverage/src/publish/settings.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ pub struct Settings {
99
pub dry_run: bool,
1010
pub discover_java_src_dirs: bool,
1111
pub root: PathBuf,
12-
pub java_src_dirs: Vec<PathBuf>,
12+
pub src_search_dirs: Vec<PathBuf>,
1313
pub incomplete: bool,
1414
pub name: Option<String>,
1515
pub output_dir: Option<PathBuf>,

0 commit comments

Comments
 (0)