fix(daemon): 区分当前下载与历史失败状态

This commit is contained in:
2026-07-15 23:22:30 +08:00
parent 5b31112e91
commit 169822abaf
5 changed files with 82 additions and 20 deletions
+12 -8
View File
@@ -2020,6 +2020,7 @@ fn prepare_in_progress_version_state(
completed_unix_seconds: None,
},
);
remove_matching_version_failures(&mut state.failed_versions, &record);
state.in_progress_version = Some(record.clone());
state.updated_unix_seconds = now;
write_version_state(path, &state)?;
@@ -2049,7 +2050,7 @@ fn complete_version_state(
..record
});
if let Some(current) = state.current_completed_version.as_ref() {
remove_completed_version_failures(&mut state.failed_versions, current);
remove_matching_version_failures(&mut state.failed_versions, current);
}
state.in_progress_version = None;
state.updated_unix_seconds = unix_seconds_now();
@@ -2132,9 +2133,10 @@ fn upsert_failed_version(
error: &str,
failed_unix_seconds: u64,
) {
if let Some(index) = failed_versions.iter().position(|failed| {
failed_version_matches(&failed.version, &record) && failed.error == error
}) {
if let Some(index) = failed_versions
.iter()
.position(|failed| failed_version_matches(&failed.version, &record))
{
failed_versions.remove(index);
}
failed_versions.push(OfficialFailedVersionRecord {
@@ -2144,11 +2146,11 @@ fn upsert_failed_version(
});
}
fn remove_completed_version_failures(
fn remove_matching_version_failures(
failed_versions: &mut Vec<OfficialFailedVersionRecord>,
completed: &OfficialVersionRecord,
version: &OfficialVersionRecord,
) {
failed_versions.retain(|failed| !failed_version_matches(&failed.version, completed));
failed_versions.retain(|failed| !failed_version_matches(&failed.version, version));
}
fn failed_version_matches(left: &OfficialVersionRecord, right: &OfficialVersionRecord) -> bool {
@@ -2844,7 +2846,9 @@ mod tests {
.unwrap();
fail_version_state(&path, failed, "download 404").unwrap();
let state = read_version_state(&path).unwrap().unwrap();
assert_eq!(state.failed_versions.len(), 2);
assert_eq!(state.failed_versions.len(), 1);
assert_eq!(state.failed_versions[0].version.id, "broken-3");
assert_eq!(state.failed_versions[0].error, "download 404");
let staging = temp.path().join(".staging/fixed");
let fixed = prepare_in_progress_version_state(