From c41737364c4a702b57a295bbbccd7385e12984d3 Mon Sep 17 00:00:00 2001 From: huanghongxun Date: Sun, 13 Jan 2019 17:10:23 +0800 Subject: [PATCH] Prevent from potential conflict that a MultiMC modpack has ".minecraft" and "minecraft" at the same time --- .../hmcl/mod/MultiMCModpackInstallTask.java | 27 ++++++++++++------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/MultiMCModpackInstallTask.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/MultiMCModpackInstallTask.java index 98312139f..0d42177b6 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/MultiMCModpackInstallTask.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/MultiMCModpackInstallTask.java @@ -63,7 +63,6 @@ public final class MultiMCModpackInstallTask extends Task { this.name = name; this.repository = dependencyManager.getGameRepository(); - File run = repository.getRunDirectory(name); File json = repository.getModpackConfiguration(name); if (repository.hasVersion(name) && !json.exists()) throw new IllegalArgumentException("Version " + name + " already exists."); @@ -89,6 +88,17 @@ public final class MultiMCModpackInstallTask extends Task { if (event.isFailed()) repository.removeVersionFromDisk(name); }); + } + + @Override + public List getDependencies() { + return dependencies; + } + + @Override + public void preExecute() throws Exception { + File run = repository.getRunDirectory(name); + File json = repository.getModpackConfiguration(name); ModpackConfiguration config = null; try { @@ -102,15 +112,14 @@ public final class MultiMCModpackInstallTask extends Task { } catch (JsonParseException | IOException ignore) { } - dependents.add(new ModpackInstallTask<>(zipFile, run, modpack.getEncoding(), "/" + manifest.getName() + "/minecraft", any -> true, config)); - dependents.add(new ModpackInstallTask<>(zipFile, run, modpack.getEncoding(), "/" + manifest.getName() + "/.minecraft", any -> true, config)); + try (FileSystem fs = CompressingUtils.readonly(zipFile.toPath()).setEncoding(modpack.getEncoding()).build()) { + if (Files.exists(fs.getPath("/" + manifest.getName() + "/.minecraft"))) + dependents.add(new ModpackInstallTask<>(zipFile, run, modpack.getEncoding(), "/" + manifest.getName() + "/.minecraft", any -> true, config)); + else if (Files.exists(fs.getPath("/" + manifest.getName() + "/minecraft"))) + dependents.add(new ModpackInstallTask<>(zipFile, run, modpack.getEncoding(), "/" + manifest.getName() + "/minecraft", any -> true, config)); + } } - - @Override - public List getDependencies() { - return dependencies; - } - + @Override public List getDependents() { return dependents;