use crate::git::git_interop::is_shallow_repository;
use crate::git::size_ops::{get_notes_size, get_repo_stats, NotesSizeInfo, RepoStats};
use anyhow::Result;
use git_perf_cli_types::SizeFormat;
use human_repr::HumanCount;
pub fn calculate_measurement_size(
detailed: bool,
format: SizeFormat,
disk_size: bool,
include_objects: bool,
) -> Result<()> {
let is_shallow = is_shallow_repository().unwrap_or(false);
let notes_info = get_notes_size(detailed, disk_size)?;
let repo_stats = if include_objects {
Some(get_repo_stats()?)
} else {
None
};
display_size_report(
¬es_info,
repo_stats.as_ref(),
format,
disk_size,
is_shallow,
)?;
Ok(())
}
fn display_size_report(
info: &NotesSizeInfo,
repo_stats: Option<&RepoStats>,
format: SizeFormat,
disk_size: bool,
is_shallow: bool,
) -> Result<()> {
let size_type = if disk_size {
"on-disk (compressed)"
} else {
"logical (uncompressed)"
};
println!("Live Measurement Size Report");
println!("============================");
println!();
if is_shallow {
println!("⚠️ Shallow clone detected - measurement counts may be incomplete (see FAQ)");
println!();
}
println!("Number of commits with measurements: {}", info.note_count);
println!(
"Total measurement data size ({}): {}",
size_type,
format_size(info.total_bytes, format)
);
if let Some(stats) = repo_stats {
println!();
println!("Repository Statistics (for context):");
println!("-------------------------------------");
println!(
" Loose objects: {} ({})",
stats.loose_objects,
format_size(stats.loose_size, format)
);
println!(
" Packed objects: {} ({})",
stats.packed_objects,
format_size(stats.pack_size, format)
);
println!(
" Total repository size: {}",
format_size(stats.loose_size + stats.pack_size, format)
);
}
if let Some(by_name) = &info.by_measurement {
println!();
println!("Breakdown by Measurement Name ({}):", size_type);
println!("------------------------------");
let mut sorted: Vec<_> = by_name.iter().collect();
sorted.sort_by(|a, b| b.1.total_bytes.cmp(&a.1.total_bytes));
for (name, size_info) in sorted {
println!(
" {} ({} occurrences): {}",
name,
size_info.count,
format_size(size_info.total_bytes, format)
);
}
}
Ok(())
}
fn format_size(bytes: u64, format: SizeFormat) -> String {
match format {
SizeFormat::Bytes => bytes.to_string(),
SizeFormat::Human => bytes.human_count_bytes().to_string(),
}
}