#![cfg_attr(coverage_nightly, coverage(off))]
use crate::models::churn::{ChurnSummary, CodeChurnAnalysis, FileChurnMetrics};
use crate::models::error::TemplateError;
use crate::services::git_analysis::GitAnalysisService;
use chrono::{DateTime, Utc};
use dashmap::DashMap;
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
use std::path::{Path, PathBuf};
use std::sync::Arc;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ChurnCacheEntry {
pub metrics: FileChurnMetrics,
pub last_modified: DateTime<Utc>,
pub git_commit_hash: String,
}
pub struct IncrementalChurnAnalyzer {
cache: Arc<DashMap<PathBuf, ChurnCacheEntry>>,
project_root: PathBuf,
}
impl IncrementalChurnAnalyzer {
#[must_use]
pub fn new(project_root: PathBuf) -> Self {
Self {
cache: Arc::new(DashMap::new()),
project_root,
}
}
pub fn clear_cache(&self) {
self.cache.clear();
}
#[must_use]
pub fn cache_stats(&self) -> (usize, usize) {
let cache_size = self.cache.len();
let cache_memory = cache_size * std::mem::size_of::<(PathBuf, ChurnCacheEntry)>();
(cache_size, cache_memory)
}
}
include!("incremental_churn_analysis.rs");
include!("incremental_churn_compute.rs");
include!("incremental_churn_statistics.rs");
include!("incremental_churn_tests.rs");