diff --git a/composeApp/src/jvmMain/kotlin/com/rukira/wowbackup/backup/BackupHistory.kt b/composeApp/src/jvmMain/kotlin/com/rukira/wowbackup/backup/BackupHistory.kt index a06ceff..e140a2d 100644 --- a/composeApp/src/jvmMain/kotlin/com/rukira/wowbackup/backup/BackupHistory.kt +++ b/composeApp/src/jvmMain/kotlin/com/rukira/wowbackup/backup/BackupHistory.kt @@ -36,6 +36,17 @@ object BackupHistory { return entries.sortedByDescending { it.timestamp } } + /** + * Returns the file count for a backup entry without computing its full size. + */ + fun fileCount(entry: BackupEntry): Int { + return if (entry.isCompressed) { + java.util.zip.ZipFile(entry.path).use { it.size() } + } else { + entry.path.walkTopDown().count { it.isFile } + } + } + /** * Deletes old backups that exceed the given max count. */ diff --git a/composeApp/src/jvmMain/kotlin/com/rukira/wowbackup/backup/BackupScheduler.kt b/composeApp/src/jvmMain/kotlin/com/rukira/wowbackup/backup/BackupScheduler.kt index e4999ee..f8f7e85 100644 --- a/composeApp/src/jvmMain/kotlin/com/rukira/wowbackup/backup/BackupScheduler.kt +++ b/composeApp/src/jvmMain/kotlin/com/rukira/wowbackup/backup/BackupScheduler.kt @@ -64,6 +64,27 @@ object BackupScheduler { return@collect } + // On first config emission, restore last backup info from disk + if (_state.value.lastBackupTime == null && config.backupPath != null) { + val backups = BackupHistory.listBackups(File(config.backupPath)) + if (backups.isNotEmpty()) { + val latest = backups.first() + val fileCount = BackupHistory.fileCount(latest) + _state.update { + it.copy( + lastBackupTime = latest.timestamp, + lastBackupResult = BackupResult.Success( + backupPath = latest.path, + fileCount = fileCount, + sizeBytes = latest.sizeBytes, + durationMs = 0, + ), + ) + } + logger.info { "Restored last backup info from disk: ${latest.path.name} ($fileCount files)" } + } + } + val tz = TimeZone.currentSystemDefault() val targetTime = config.backupTimeOfDay logger.info { "Scheduling daily backup at $targetTime ($tz)" }