Compare commits

...

5 Commits

6 changed files with 84 additions and 23 deletions

View File

@@ -50,7 +50,8 @@ task copyJar(type: Copy) {
build.dependsOn copyJar build.dependsOn copyJar
githubRelease { if (project.hasProperty("github.token")) {
githubRelease {
// IntelliJ u ok? // IntelliJ u ok?
//noinspection GroovyAssignabilityCheck //noinspection GroovyAssignabilityCheck
owner "comp500" owner "comp500"
@@ -63,8 +64,9 @@ githubRelease {
//noinspection GroovyAssignabilityCheck //noinspection GroovyAssignabilityCheck
draft true draft true
//noinspection GroovyAssignabilityCheck //noinspection GroovyAssignabilityCheck
token getProperty("github.token") token findProperty("github.token") ?: ""
releaseAssets = [jar.destinationDirectory.file("packwiz-installer.jar").get()] releaseAssets = [jar.destinationDirectory.file("packwiz-installer.jar").get()]
} }
tasks.githubRelease.dependsOn(build) tasks.githubRelease.dependsOn(build)
}

View File

@@ -97,6 +97,7 @@ class DownloadTask implements IOptionDetails, IExceptionDetails {
} }
} }
cachedFile.isOptional = isOptional(); cachedFile.isOptional = isOptional();
cachedFile.onlyOtherSide = !correctSide();
} }
} }
} }
@@ -123,7 +124,7 @@ class DownloadTask implements IOptionDetails, IExceptionDetails {
// Don't update files marked with preserve if they already exist on disk // Don't update files marked with preserve if they already exist on disk
if (metadata.preserve) { if (metadata.preserve) {
if (Files.exists(destPath)) { if (destPath.toFile().exists()) {
return; return;
} }
} }

View File

@@ -35,6 +35,7 @@ public class UpdateManager {
private boolean cancelled; private boolean cancelled;
private boolean cancelledStartGame = false; private boolean cancelledStartGame = false;
private InputStateHandler stateHandler; private InputStateHandler stateHandler;
private boolean errorsOccurred = false;
public static class Options { public static class Options {
SpaceSafeURI downloadURI = null; SpaceSafeURI downloadURI = null;
@@ -152,11 +153,15 @@ public class UpdateManager {
List<SpaceSafeURI> invalidatedUris = new ArrayList<>(); List<SpaceSafeURI> invalidatedUris = new ArrayList<>();
if (manifest.cachedFiles != null) { if (manifest.cachedFiles != null) {
for (Map.Entry<SpaceSafeURI, ManifestFile.File> entry : manifest.cachedFiles.entrySet()) { for (Map.Entry<SpaceSafeURI, ManifestFile.File> entry : manifest.cachedFiles.entrySet()) {
// ignore onlyOtherSide files
if (entry.getValue().onlyOtherSide) {
continue;
}
boolean invalid = false; boolean invalid = false;
// if isn't optional, or is optional but optionValue == true // if isn't optional, or is optional but optionValue == true
if (!entry.getValue().isOptional || entry.getValue().optionValue) { if (!entry.getValue().isOptional || entry.getValue().optionValue) {
if (entry.getValue().cachedLocation != null) { if (entry.getValue().cachedLocation != null) {
if (!Files.exists(Paths.get(opts.packFolder, entry.getValue().cachedLocation))) { if (!Paths.get(opts.packFolder, entry.getValue().cachedLocation).toFile().exists()) {
invalid = true; invalid = true;
} }
} else { } else {
@@ -199,7 +204,14 @@ public class UpdateManager {
// TODO: update MMC params, java args etc // TODO: update MMC params, java args etc
// If there were errors, don't write the manifest/index hashes, to ensure they are rechecked later
if (errorsOccurred) {
manifest.indexFileHash = null;
manifest.packFileHash = null;
} else {
manifest.packFileHash = packFileSource.getHash(); manifest.packFileHash = packFileSource.getHash();
}
manifest.cachedSide = opts.side; manifest.cachedSide = opts.side;
try (Writer writer = new FileWriter(Paths.get(opts.packFolder, opts.manifestFile).toString())) { try (Writer writer = new FileWriter(Paths.get(opts.packFolder, opts.manifestFile).toString())) {
gson.toJson(manifest, writer); gson.toJson(manifest, writer);
@@ -333,6 +345,7 @@ public class UpdateManager {
List<IExceptionDetails> failedTasks = tasks.stream().filter(t -> t.getException() != null).collect(Collectors.toList()); List<IExceptionDetails> failedTasks = tasks.stream().filter(t -> t.getException() != null).collect(Collectors.toList());
if (!failedTasks.isEmpty()) { if (!failedTasks.isEmpty()) {
errorsOccurred = true;
IExceptionDetails.ExceptionListResult exceptionListResult; IExceptionDetails.ExceptionListResult exceptionListResult;
try { try {
exceptionListResult = ui.showExceptions(failedTasks, tasks.size(), true).get(); exceptionListResult = ui.showExceptions(failedTasks, tasks.size(), true).get();
@@ -429,8 +442,12 @@ public class UpdateManager {
} }
} }
// Shut down the thread pool when the update is done
threadPool.shutdown();
List<IExceptionDetails> failedTasks2ElectricBoogaloo = nonFailedFirstTasks.stream().filter(t -> t.getException() != null).collect(Collectors.toList()); List<IExceptionDetails> failedTasks2ElectricBoogaloo = nonFailedFirstTasks.stream().filter(t -> t.getException() != null).collect(Collectors.toList());
if (failedTasks2ElectricBoogaloo.size() > 0) { if (!failedTasks2ElectricBoogaloo.isEmpty()) {
errorsOccurred = true;
IExceptionDetails.ExceptionListResult exceptionListResult; IExceptionDetails.ExceptionListResult exceptionListResult;
try { try {
exceptionListResult = ui.showExceptions(failedTasks2ElectricBoogaloo, tasks.size(), false).get(); exceptionListResult = ui.showExceptions(failedTasks2ElectricBoogaloo, tasks.size(), false).get();

View File

@@ -0,0 +1,29 @@
package link.infra.packwiz.installer.metadata;
import com.google.gson.TypeAdapter;
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonToken;
import com.google.gson.stream.JsonWriter;
import java.io.IOException;
public class EfficientBooleanAdapter extends TypeAdapter<Boolean> {
@Override
public void write(JsonWriter out, Boolean value) throws IOException {
if (value == null || !value) {
out.nullValue();
return;
}
out.value(true);
}
@Override
public Boolean read(JsonReader in) throws IOException {
if (in.peek() == JsonToken.NULL) {
in.nextNull();
return false;
}
return in.nextBoolean();
}
}

View File

@@ -1,5 +1,6 @@
package link.infra.packwiz.installer.metadata; package link.infra.packwiz.installer.metadata;
import com.google.gson.annotations.JsonAdapter;
import link.infra.packwiz.installer.UpdateManager; import link.infra.packwiz.installer.UpdateManager;
import link.infra.packwiz.installer.metadata.hash.Hash; import link.infra.packwiz.installer.metadata.hash.Hash;
@@ -19,9 +20,13 @@ public class ManifestFile {
public Hash linkedFileHash = null; public Hash linkedFileHash = null;
public String cachedLocation = null; public String cachedLocation = null;
@JsonAdapter(EfficientBooleanAdapter.class)
public boolean isOptional = false; public boolean isOptional = false;
public boolean optionValue = true; public boolean optionValue = true;
@JsonAdapter(EfficientBooleanAdapter.class)
public boolean onlyOtherSide = false;
// When an error occurs, the state needs to be reverted. To do this, I have a crude revert system. // When an error occurs, the state needs to be reverted. To do this, I have a crude revert system.
public void backup() { public void backup() {
revert = new File(); revert = new File();
@@ -30,6 +35,7 @@ public class ManifestFile {
revert.cachedLocation = cachedLocation; revert.cachedLocation = cachedLocation;
revert.isOptional = isOptional; revert.isOptional = isOptional;
revert.optionValue = optionValue; revert.optionValue = optionValue;
revert.onlyOtherSide = onlyOtherSide;
} }
public File getRevert() { public File getRevert() {

View File

@@ -35,8 +35,14 @@ public class CLIHandler implements IUserInterface {
} }
@Override @Override
public Future<Boolean> showOptions(List<IOptionDetails> option) { public Future<Boolean> showOptions(List<IOptionDetails> options) {
throw new RuntimeException("Optional mods not implemented for CLI! Make sure your optional mods are only on the client side!"); for (IOptionDetails opt : options) {
opt.setOptionValue(true);
System.out.println("Warning: accepting option " + opt.getName() + " as option choosing is not implemented in the CLI");
}
CompletableFuture<Boolean> future = new CompletableFuture<>();
future.complete(false); // Can't be cancelled!
return future;
} }
@Override @Override