From bc842437faa921401e69330e9e3e2a33466c08a6 Mon Sep 17 00:00:00 2001 From: huanghongxun Date: Thu, 23 Apr 2020 12:28:11 +0800 Subject: [PATCH] fix: breaking versions that inherit from a version being renamed --- .../jackhuang/hmcl/game/HMCLModpackInstallTask.java | 2 +- .../ui/download/UpdateInstallerWizardProvider.java | 2 +- .../jackhuang/hmcl/ui/versions/InstallerListPage.java | 4 ++-- .../jackhuang/hmcl/download/DefaultGameBuilder.java | 2 +- .../jackhuang/hmcl/download/game/GameInstallTask.java | 2 +- .../org/jackhuang/hmcl/game/DefaultGameRepository.java | 10 +++++++++- .../hmcl/mod/multimc/MultiMCModpackInstallTask.java | 2 +- 7 files changed, 16 insertions(+), 8 deletions(-) diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/game/HMCLModpackInstallTask.java b/HMCL/src/main/java/org/jackhuang/hmcl/game/HMCLModpackInstallTask.java index 3d7e2167b..38e6217b5 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/game/HMCLModpackInstallTask.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/game/HMCLModpackInstallTask.java @@ -104,7 +104,7 @@ public final class HMCLModpackInstallTask extends Task { libraryTask = libraryTask.thenComposeAsync(version -> dependency.installLibraryAsync(modpack.getGameVersion(), version, mark.getLibraryId(), mark.getLibraryVersion())); } - dependencies.add(libraryTask.thenComposeAsync(repository::save)); + dependencies.add(libraryTask.thenComposeAsync(repository::saveAsync)); } @Override diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/UpdateInstallerWizardProvider.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/UpdateInstallerWizardProvider.java index d77c18466..c019777a8 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/UpdateInstallerWizardProvider.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/UpdateInstallerWizardProvider.java @@ -96,7 +96,7 @@ public final class UpdateInstallerWizardProvider implements WizardProvider { } } - return ret.thenComposeAsync(profile.getRepository()::save).thenComposeAsync(profile.getRepository().refreshVersionsAsync()).withStagesHint(stages); + return ret.thenComposeAsync(profile.getRepository()::saveAsync).thenComposeAsync(profile.getRepository().refreshVersionsAsync()).withStagesHint(stages); } @Override diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/InstallerListPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/InstallerListPage.java index 336f3c912..c2976bb73 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/InstallerListPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/InstallerListPage.java @@ -76,7 +76,7 @@ public class InstallerListPage extends ListPageBase { }).thenAcceptAsync(analyzer -> { Function> removeAction = libraryId -> x -> { profile.getDependency().removeLibraryAsync(version, libraryId) - .thenComposeAsync(profile.getRepository()::save) + .thenComposeAsync(profile.getRepository()::saveAsync) .withComposeAsync(profile.getRepository().refreshVersionsAsync()) .withRunAsync(Schedulers.javafx(), () -> loadVersion(this.profile, this.versionId)) .start(); @@ -122,7 +122,7 @@ public class InstallerListPage extends ListPageBase { private void doInstallOffline(File file) { Task task = profile.getDependency().installLibraryAsync(version, file.toPath()) - .thenComposeAsync(profile.getRepository()::save) + .thenComposeAsync(profile.getRepository()::saveAsync) .thenComposeAsync(profile.getRepository().refreshVersionsAsync()); task.setName(i18n("install.installer.install_offline")); TaskExecutor executor = task.executor(new TaskListener() { diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/DefaultGameBuilder.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/DefaultGameBuilder.java index 09c8bafed..1f80d44b1 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/DefaultGameBuilder.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/DefaultGameBuilder.java @@ -60,7 +60,7 @@ public class DefaultGameBuilder extends GameBuilder { stages.add(String.format("hmcl.install.%s:%s", remoteVersion.getLibraryId(), remoteVersion.getSelfVersion())); } - return libraryTask.thenComposeAsync(dependencyManager.getGameRepository()::save).whenComplete(exception -> { + return libraryTask.thenComposeAsync(dependencyManager.getGameRepository()::saveAsync).whenComplete(exception -> { if (exception != null) dependencyManager.getGameRepository().removeVersionFromDisk(name); }).withStagesHint(stages); diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/game/GameInstallTask.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/game/GameInstallTask.java index 4a6631998..0806a2a30 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/game/GameInstallTask.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/game/GameInstallTask.java @@ -77,7 +77,7 @@ public class GameInstallTask extends Task { ).withStage("hmcl.install.assets").withRunAsync(() -> { // ignore failure }) - ).thenComposeAsync(gameRepository.save(version))); + ).thenComposeAsync(gameRepository.saveAsync(version))); } } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/game/DefaultGameRepository.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/game/DefaultGameRepository.java index 730cb0347..1824a688d 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/game/DefaultGameRepository.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/game/DefaultGameRepository.java @@ -180,6 +180,14 @@ public class DefaultGameRepository implements GameRepository { if (fromVersion.getId().equals(fromVersion.getJar())) fromVersion = fromVersion.setJar(null); FileUtils.writeText(toJson.toFile(), JsonUtils.GSON.toJson(fromVersion.setId(to))); + + // fix inheritsFrom of versions that inherits from version [from]. + for (Version version : getVersions()) { + if (from.equals(version.getInheritsFrom())) { + File json = getVersionJson(version.getId()).getAbsoluteFile(); + FileUtils.writeText(json, JsonUtils.GSON.toJson(version.setInheritsFrom(to))); + } + } return true; } catch (IOException | JsonParseException | VersionNotFoundException | InvalidPathException e) { LOG.log(Level.WARNING, "Unable to rename version " + from + " to " + to, e); @@ -408,7 +416,7 @@ public class DefaultGameRepository implements GameRepository { return assetsDir; } - public Task save(Version version) { + public Task saveAsync(Version version) { if (version.isResolvedPreservingPatches()) { return new VersionJsonSaveTask(this, MaintainTask.maintainPreservingPatches(this, version)); } else { diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/multimc/MultiMCModpackInstallTask.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/multimc/MultiMCModpackInstallTask.java index ea8249d31..58f9e3325 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/multimc/MultiMCModpackInstallTask.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/multimc/MultiMCModpackInstallTask.java @@ -180,7 +180,7 @@ public final class MultiMCModpackInstallTask extends Task { FileUtils.copyDirectory(jarmods, repository.getVersionRoot(name).toPath().resolve("jarmods")); } - dependencies.add(repository.save(version)); + dependencies.add(repository.saveAsync(version)); } @Override