Skip to main content

codex_sync/history/
output.rs

1use 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}