From 29e8b2f679a58c3e9df4e5cd6aaa421da3619bbc Mon Sep 17 00:00:00 2001 From: FX192 <120828496+FX192@users.noreply.github.com> Date: Wed, 28 Oct 2026 01:10:47 +0300 Subject: [PATCH] Never delete the install record while replacing it and clean the staging folder if marking fails --- .../java/com/droiddeck/launcher/stores/StoreGameSidecar.kt | 2 +- .../java/com/droiddeck/launcher/stores/StoreInstalls.kt | 7 ++++++- .../com/droiddeck/launcher/stores/itch/ItchInstaller.kt | 7 ++++++- 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/droiddeck/launcher/stores/StoreGameSidecar.kt b/app/src/main/java/com/droiddeck/launcher/stores/StoreGameSidecar.kt index aa42aa75e..e4d828372 100644 --- a/app/src/main/java/com/droiddeck/launcher/stores/StoreGameSidecar.kt +++ b/app/src/main/java/com/droiddeck/launcher/stores/StoreGameSidecar.kt @@ -63,7 +63,7 @@ class StoreGameSidecar( val file = File(folder, FILE_NAME) val tmp = File(folder, "$FILE_NAME.tmp") tmp.writeText(toJson().toString(2)) - if (!tmp.renameTo(file)) { file.delete(); tmp.renameTo(file) } + if (!tmp.renameTo(file)) java.nio.file.Files.move(tmp.toPath(), file.toPath(), java.nio.file.StandardCopyOption.REPLACE_EXISTING) } companion object { diff --git a/app/src/main/java/com/droiddeck/launcher/stores/StoreInstalls.kt b/app/src/main/java/com/droiddeck/launcher/stores/StoreInstalls.kt index 9b73f8cc8..2f4df83f2 100644 --- a/app/src/main/java/com/droiddeck/launcher/stores/StoreInstalls.kt +++ b/app/src/main/java/com/droiddeck/launcher/stores/StoreInstalls.kt @@ -30,7 +30,12 @@ object StoreInstalls { it.write(before.copy(state = StoreGameSidecar.STATE_UPDATING, installVersion = "").toJson().toString(2).toByteArray(Charsets.UTF_8)) it.fd.sync() } - Files.move(stage.toPath(), StoreGameSidecar.file(folder).toPath(), StandardCopyOption.ATOMIC_MOVE, StandardCopyOption.REPLACE_EXISTING) + val record = StoreGameSidecar.file(folder).toPath() + try { + Files.move(stage.toPath(), record, StandardCopyOption.ATOMIC_MOVE, StandardCopyOption.REPLACE_EXISTING) + } catch (e: java.nio.file.AtomicMoveNotSupportedException) { + Files.move(stage.toPath(), record, StandardCopyOption.REPLACE_EXISTING) + } } finally { stage.delete() } diff --git a/app/src/main/java/com/droiddeck/launcher/stores/itch/ItchInstaller.kt b/app/src/main/java/com/droiddeck/launcher/stores/itch/ItchInstaller.kt index daa0a8f75..5da0f7708 100644 --- a/app/src/main/java/com/droiddeck/launcher/stores/itch/ItchInstaller.kt +++ b/app/src/main/java/com/droiddeck/launcher/stores/itch/ItchInstaller.kt @@ -192,7 +192,12 @@ internal class ItchInstaller( ItchStaging.delete(work) return null } - StoreInstalls.markUpdating(folder) + try { + StoreInstalls.markUpdating(folder) + } catch (t: Throwable) { + ItchStaging.delete(work) + throw t + } ItchStaging.merge(work, folder) ItchStaging.delete(work) }