codex_sync/history/
output.rs1use super::{DoctorReport, Report};
2use std::collections::BTreeMap;
3
4pub fn print_report(report: &Report) {
5 println!("当前 provider:{}", report.current_provider);
6 println!(
7 "当前 model:{}",
8 report.current_model.as_deref().unwrap_or("(未配置)")
9 );
10 println!("数据库线程:{}", report.total_threads);
11 print_counts("数据库 provider 分布", &report.database_counts);
12 if !report.model_counts.is_empty() {
13 print_counts("数据库 model 分布", &report.model_counts);
14 }
15 print_counts("会话文件 provider 分布", &report.rollout_counts);
16 if !report.rollout_model_counts.is_empty() {
17 print_counts("会话文件 model 分布", &report.rollout_model_counts);
18 }
19 println!(
20 "待归并:{} 条数据库记录,{} / {} 个会话文件,{} 条重复 session_meta,缺少 {} 条侧栏索引,残留 {} 条侧栏索引,缺失 {} 个会话文件",
21 report.database_rows_to_change,
22 report.rollout_files_to_change,
23 report.rollout_files,
24 report.duplicate_session_meta_lines,
25 report.missing_session_index_entries,
26 report.stale_session_index_entries,
27 report.missing_rollout_files
28 );
29}
30
31pub fn print_doctor_report(report: &DoctorReport) {
32 println!(
33 "数据库完整性:{}",
34 if report.database_integrity_ok {
35 "正常"
36 } else {
37 "异常"
38 }
39 );
40 if !report.database_integrity_ok {
41 for message in &report.database_integrity_messages {
42 println!(" {message}");
43 }
44 }
45 println!(
46 "线程:数据库 {},应显示于侧栏 {};会话文件 {}",
47 report.total_threads, report.sidebar_threads, report.rollout_files
48 );
49 println!(
50 "会话异常:非法 JSONL {},缺少 session_meta {},重复 session_meta {},孤立文件 {},缺失文件 {}",
51 report.invalid_rollout_files,
52 report.missing_session_meta_files,
53 report.duplicate_session_meta_lines,
54 report.orphan_rollout_files,
55 report.missing_rollout_files
56 );
57 println!(
58 "索引异常:非法行 {},重复 ID {},缺少 {},残留 {}",
59 report.invalid_session_index_lines,
60 report.duplicate_session_index_ids,
61 report.missing_session_index_entries,
62 report.stale_session_index_entries
63 );
64 println!(
65 "诊断结论:{}",
66 if report.clean {
67 "干净"
68 } else {
69 "需要处理"
70 }
71 );
72 if report.repaired_session_index {
73 println!("已原子修复侧栏索引");
74 }
75 if report.restored_rollout_files != 0 {
76 println!("已原子恢复 rollout:{}", report.restored_rollout_files);
77 }
78 if report.deduplicated_session_meta_files != 0 {
79 println!(
80 "已原子去重 session_meta 文件:{}",
81 report.deduplicated_session_meta_files
82 );
83 }
84 if let Some(backup) = &report.backup {
85 println!("修改前数据备份:{}", backup.display());
86 }
87}
88
89fn print_counts(label: &str, counts: &BTreeMap<String, usize>) {
90 println!("{label}:");
91 for (name, count) in counts {
92 println!(" {name}: {count}");
93 }
94}