v0.4.3: dashboard count fixes, mtime preservation, nav bound fix

This commit is contained in:
2026-06-09 21:21:43 +02:00
parent 5e31c94421
commit 057aeffd41
8 changed files with 37 additions and 24 deletions
+4 -3
View File
@@ -139,9 +139,10 @@ fn exe_dir() -> PathBuf {
/// any backup/restore operation.
fn refresh_stats(tui_state: &mut tui::AppState, save_folder: Option<&Path>) {
tui_state.save_path = save_folder.map(|p| p.display().to_string());
let (live, bak, ini) = ops::folder_stats(save_folder);
tui_state.live_save_count = live;
tui_state.backup_count = bak;
let (_live, _bak, ini) = ops::folder_stats(save_folder);
// "Saves" = .bak recovery files (the restore points in the save folder)
tui_state.live_save_count = _bak;
tui_state.backup_count = ops::list_full_backups().len();
tui_state.has_ini_backup = ini;
tui_state.context_path = Some(crate::config::get_backup_root().display().to_string());
}
+14 -1
View File
@@ -138,6 +138,15 @@ fn create_tar_gz(
.with_context(|| format!("failed to set path '{name}' in tar header"))?;
header.set_size(data.len() as u64);
header.set_mode(0o644); // owner read/write, group/other read
// Preserve the source file's mtime so the extracted file keeps its
// original date. Without this, the mtime defaults to epoch (1970).
if let Ok(src_meta) = fs::metadata(&src_path) {
if let Ok(mtime) = src_meta.modified() {
if let Ok(dur) = mtime.duration_since(std::time::UNIX_EPOCH) {
header.set_mtime(dur.as_secs());
}
}
}
header.set_cksum();
tar_builder
.append(&header, &data[..])
@@ -358,8 +367,12 @@ pub fn list_bak_files_with_meta(save_folder: &Path) -> Vec<BakFileSummary> {
let filename = entry.file_name().to_string_lossy().to_string();
let meta = fs::metadata(&path).ok();
let size = meta.as_ref().map(|m| m.len()).unwrap_or(0);
let mtime = meta.as_ref().and_then(|m| m.modified().ok()).and_then(|t| {
let mtime = meta.as_ref().and_then(|m| {
// Try modified time first; fall back to creation time (Windows)
let t = m.modified().or_else(|_| m.created()).ok()?;
let secs = t.duration_since(std::time::UNIX_EPOCH).ok()?.as_secs();
// Reject epoch (Jan 1 1970) — indicates filesystem couldn't provide a real time
if secs == 0 { return None; }
Local
.timestamp_opt(secs as i64, 0)
.single()