pub mod git;
pub mod ignore;
use anyhow::bail;
fn validate_patterns_for_library(
patterns: &[String],
validation_level: PatternValidationLevel,
) -> anyhow::Result<()> {
if validation_level == PatternValidationLevel::None {
return Ok(());
}
let issues = ignore::validate_ignore_patterns(patterns);
let has_errors = issues.iter().any(|i| i.severity == PatternSeverity::Error);
let has_warnings = issues
.iter()
.any(|i| i.severity == PatternSeverity::Warning);
if has_errors || (validation_level == PatternValidationLevel::Strict && has_warnings) {
let error_messages: Vec<String> = issues
.iter()
.filter(|issue| {
issue.severity == PatternSeverity::Error
|| (validation_level == PatternValidationLevel::Strict
&& issue.severity == PatternSeverity::Warning)
})
.map(|issue| format!("{}: {}", issue.pattern, issue.message))
.collect();
bail!("Pattern validation failed: {}", error_messages.join("; "));
}
Ok(())
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum PatternSeverity {
Info,
Warning,
Error,
}
#[derive(Debug, Clone)]
pub struct PatternIssue {
pub pattern: String,
pub severity: PatternSeverity,
pub message: String,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum PatternValidationLevel {
None,
Warn,
Strict,
}
pub fn add_patterns_to_gitignore(
patterns: &[String],
validation_level: PatternValidationLevel,
) -> anyhow::Result<Vec<String>> {
validate_patterns_for_library(patterns, validation_level)?;
let gitignore_path = git::get_gitignore_path()?;
ignore::add_patterns_to_ignore_file(
&gitignore_path,
patterns,
true,
PatternValidationLevel::None,
)
}
pub fn add_patterns_to_exclude(
patterns: &[String],
validation_level: PatternValidationLevel,
) -> anyhow::Result<Vec<String>> {
validate_patterns_for_library(patterns, validation_level)?;
let exclude_path = git::get_exclude_file_path()?;
ignore::ensure_info_exclude_exists(&exclude_path)?;
ignore::add_patterns_to_ignore_file(&exclude_path, patterns, true, PatternValidationLevel::None)
}
pub fn add_patterns_to_global(
patterns: &[String],
validation_level: PatternValidationLevel,
) -> anyhow::Result<Vec<String>> {
validate_patterns_for_library(patterns, validation_level)?;
let global_path = git::get_global_gitignore_path()
.ok_or_else(|| anyhow::anyhow!("No global gitignore file configured"))?;
ignore::add_patterns_to_ignore_file(&global_path, patterns, true, PatternValidationLevel::None)
}