diff --git a/src/main/java/org/quetoo/installer/Console.java b/src/main/java/org/quetoo/installer/Console.java index 0b2883f..f904e8c 100644 --- a/src/main/java/org/quetoo/installer/Console.java +++ b/src/main/java/org/quetoo/installer/Console.java @@ -88,8 +88,8 @@ private void onSync(final File file) { * @param throwable The error. */ private void onError(final Throwable throwable) { + System.err.println("Error: " + throwable.getMessage()); throwable.printStackTrace(System.err); - System.exit(1); } /** diff --git a/src/main/java/org/quetoo/installer/Main.java b/src/main/java/org/quetoo/installer/Main.java index e9dadad..33b88b7 100644 --- a/src/main/java/org/quetoo/installer/Main.java +++ b/src/main/java/org/quetoo/installer/Main.java @@ -1,10 +1,13 @@ package org.quetoo.installer; +import io.reactivex.exceptions.UndeliverableException; +import io.reactivex.plugins.RxJavaPlugins; import org.apache.commons.cli.*; import org.apache.commons.io.FileUtils; import org.apache.commons.lang3.SystemUtils; import java.io.IOException; +import java.net.SocketException; import java.nio.file.Files; import java.util.Properties; @@ -24,6 +27,19 @@ public class Main { */ public static void main(String[] args) { + RxJavaPlugins.setErrorHandler(e -> { + if (e instanceof UndeliverableException) { + e = e.getCause(); + } + if (e instanceof InterruptedException + || e instanceof IOException + || e instanceof SocketException) { + return; + } + Thread.currentThread().getUncaughtExceptionHandler() + .uncaughtException(Thread.currentThread(), e); + }); + final var build = Option.builder("b") .longOpt("build") .hasArg() diff --git a/src/main/java/org/quetoo/installer/Manager.java b/src/main/java/org/quetoo/installer/Manager.java index 2914180..8c32431 100644 --- a/src/main/java/org/quetoo/installer/Manager.java +++ b/src/main/java/org/quetoo/installer/Manager.java @@ -70,7 +70,7 @@ public Observable delta(final Observable indices) { * @return An Observable yielding the synchronized files. */ public Observable sync(final Observable deltas) { - return deltas.flatMap(delta -> delta.getIndex().getSync().sync(delta)) + return deltas.concatMap(delta -> delta.getIndex().getSync().sync(delta)) .doOnNext(file -> { if (file.getParentFile().equals(config.getBin())) { file.setExecutable(true); diff --git a/src/main/java/org/quetoo/installer/aws/S3Sync.java b/src/main/java/org/quetoo/installer/aws/S3Sync.java index 328591d..0c81565 100644 --- a/src/main/java/org/quetoo/installer/aws/S3Sync.java +++ b/src/main/java/org/quetoo/installer/aws/S3Sync.java @@ -65,7 +65,7 @@ private T executeHttpRequest(final String path, final Map pa .append("https://") .append(bucketName) .append(".s3.amazonaws.com/") - .append(path.replace("+", "%2B")); + .append(path.replace("+", "%2B").replace(" ", "%20")); if (!params.isEmpty()) { url.append("?"); @@ -73,7 +73,7 @@ private T executeHttpRequest(final String path, final Map pa if (url.charAt(url.length() - 1) != '?') { url.append("&"); } - url.append(k).append("=").append(v.replace("+", "%2B")); + url.append(k).append("=").append(v.replace("+", "%2B").replace(" ", "%20")); }); } @@ -200,7 +200,11 @@ public Observable sync(final Delta delta) { return Observable.fromIterable(delta) .map(asset -> (S3Object) asset) .flatMap(obj -> Observable.fromCallable(() -> sync(obj)) - .subscribeOn(Schedulers.io()), 8); + .subscribeOn(Schedulers.io()) + .onErrorResumeNext(e -> { + System.err.println("Failed to sync " + obj.getKey() + ": " + e.getMessage()); + return Observable.empty(); + }), 8); } @Override