From beb4ccd01fb165293743fb4613e6db05b925ca97 Mon Sep 17 00:00:00 2001 From: crschnick Date: Tue, 7 Mar 2023 14:17:54 +0000 Subject: [PATCH] Update fixes --- .../comp/storage/store/StoreEntryWrapper.java | 18 +++- .../io/xpipe/app/update/AppDownloads.java | 99 ++++++++++++------- .../io/xpipe/app/update/AppInstaller.java | 28 ++++-- .../java/io/xpipe/app/update/AppUpdater.java | 12 ++- .../app/update/UpdateAvailableAlert.java | 6 +- .../app/util/ProxyManagerProviderImpl.java | 4 +- .../java/io/xpipe/core/util/Deobfuscator.java | 1 - 7 files changed, 110 insertions(+), 58 deletions(-) diff --git a/app/src/main/java/io/xpipe/app/comp/storage/store/StoreEntryWrapper.java b/app/src/main/java/io/xpipe/app/comp/storage/store/StoreEntryWrapper.java index c0574171a..915e49891 100644 --- a/app/src/main/java/io/xpipe/app/comp/storage/store/StoreEntryWrapper.java +++ b/app/src/main/java/io/xpipe/app/comp/storage/store/StoreEntryWrapper.java @@ -129,16 +129,26 @@ public class StoreEntryWrapper implements StorageFilter.Filterable { var defaultProvider = ActionProvider.ALL.stream() .filter(e -> e.getDefaultDataStoreCallSite() != null - && e.getDefaultDataStoreCallSite().isApplicable(entry.getStore().asNeeded())) - .findFirst().map(ActionProvider::getDefaultDataStoreCallSite).orElse(null); + && e.getDefaultDataStoreCallSite() + .getApplicableClass() + .isAssignableFrom(entry.getStore().getClass()) + && e.getDefaultDataStoreCallSite() + .isApplicable(entry.getStore().asNeeded())) + .findFirst() + .map(ActionProvider::getDefaultDataStoreCallSite) + .orElse(null); this.defaultActionProvider.setValue(defaultProvider); try { actionProviders .get(dataStoreActionProvider) .set(dataStoreActionProvider - .getDataStoreCallSite() - .isApplicable(entry.getStore().asNeeded())); + .getDataStoreCallSite() + .getApplicableClass() + .isAssignableFrom(entry.getStore().getClass()) + && dataStoreActionProvider + .getDataStoreCallSite() + .isApplicable(entry.getStore().asNeeded())); } catch (Exception ex) { ErrorEvent.fromThrowable(ex).handle(); actionProviders.get(dataStoreActionProvider).set(false); diff --git a/app/src/main/java/io/xpipe/app/update/AppDownloads.java b/app/src/main/java/io/xpipe/app/update/AppDownloads.java index fc25e3e2b..d671da56b 100644 --- a/app/src/main/java/io/xpipe/app/update/AppDownloads.java +++ b/app/src/main/java/io/xpipe/app/update/AppDownloads.java @@ -36,50 +36,73 @@ public class AppDownloads { return repository; } - public static Path downloadInstaller(AppInstaller.InstallerAssetType iAsset, String version) throws Exception { - var release = AppDownloads.getRelease(version); - var asset = release.orElseThrow().listAssets().toList().stream() - .filter(ghAsset -> iAsset.isCorrectAsset(ghAsset.getName())) - .findAny(); - - var url = new URL(asset.get().getBrowserDownloadUrl()); - var bytes = HttpHelper.executeGet(url, aFloat -> {}); - var downloadFile = - FileUtils.getTempDirectory().toPath().resolve(asset.get().getName()); - Files.write(downloadFile, bytes); - - TrackEvent.withInfo("installation", "Downloaded asset") - .tag("version", version) - .tag("url", url) - .tag("size", FileUtils.byteCountToDisplaySize(bytes.length)) - .tag("target", downloadFile) - .handle(); - - return downloadFile; - } - - public static Optional downloadChangelog(String version) throws Exception { - var release = AppDownloads.getRelease(version); - var asset = release.orElseThrow().listAssets().toList().stream() - .filter(ghAsset -> ghAsset.getName().equals("changelog.md")) - .findAny(); - - if (asset.isEmpty()) { + public static Optional downloadInstaller( + AppInstaller.InstallerAssetType iAsset, String version, boolean omitErrors) { + var release = AppDownloads.getRelease(version, omitErrors); + if (release.isEmpty()) { return Optional.empty(); } - var url = new URL(asset.get().getBrowserDownloadUrl()); - var bytes = HttpHelper.executeGet(url, aFloat -> {}); - return Optional.of(new String(bytes, StandardCharsets.UTF_8)); + try { + var asset = release.orElseThrow().listAssets().toList().stream() + .filter(ghAsset -> iAsset.isCorrectAsset(ghAsset.getName())) + .findAny(); + if (asset.isEmpty()) { + ErrorEvent.fromMessage("No matching asset found for " + iAsset.getExtension()); + return Optional.empty(); + } + + var url = new URL(asset.get().getBrowserDownloadUrl()); + var bytes = HttpHelper.executeGet(url, aFloat -> {}); + var downloadFile = + FileUtils.getTempDirectory().toPath().resolve(asset.get().getName()); + Files.write(downloadFile, bytes); + + TrackEvent.withInfo("installation", "Downloaded asset") + .tag("version", version) + .tag("url", url) + .tag("size", FileUtils.byteCountToDisplaySize(bytes.length)) + .tag("target", downloadFile) + .handle(); + + return Optional.of(downloadFile); + } catch (Throwable t) { + ErrorEvent.fromThrowable(t).omitted(omitErrors).handle(); + return Optional.empty(); + } } - public static String getLatestVersion() { - return getLatestSuitableRelease() + public static Optional downloadChangelog(String version, boolean omitErrors) { + var release = AppDownloads.getRelease(version, omitErrors); + if (release.isEmpty()) { + return Optional.empty(); + } + + try { + var asset = release.get().listAssets().toList().stream() + .filter(ghAsset -> ghAsset.getName().equals("changelog.md")) + .findAny(); + + if (asset.isEmpty()) { + return Optional.empty(); + } + + var url = new URL(asset.get().getBrowserDownloadUrl()); + var bytes = HttpHelper.executeGet(url, aFloat -> {}); + return Optional.of(new String(bytes, StandardCharsets.UTF_8)); + } catch (Throwable t) { + ErrorEvent.fromThrowable(t).omitted(omitErrors).handle(); + return Optional.empty(); + } + } + + public static String getLatestVersion(boolean omitErrors) { + return getLatestSuitableRelease(omitErrors) .map(ghRelease -> ghRelease.getTagName()) .orElse("?"); } - public static Optional getLatestSuitableRelease() { + public static Optional getLatestSuitableRelease(boolean omitErrors) { try { var repo = getRepository(); @@ -90,17 +113,17 @@ public class AppDownloads { return Optional.ofNullable(repo.getLatestRelease()); } catch (IOException e) { - ErrorEvent.fromThrowable(e).omit().handle(); + ErrorEvent.fromThrowable("Unable to fetch latest release information", e).omitted(omitErrors).handle(); return Optional.empty(); } } - public static Optional getRelease(String version) { + public static Optional getRelease(String version, boolean omitErrors) { try { var repo = getRepository(); return Optional.ofNullable(repo.getReleaseByTagName(version)); } catch (IOException e) { - ErrorEvent.fromThrowable(e).omit().handle(); + ErrorEvent.fromThrowable(e).omitted(omitErrors).handle(); return Optional.empty(); } } diff --git a/app/src/main/java/io/xpipe/app/update/AppInstaller.java b/app/src/main/java/io/xpipe/app/update/AppInstaller.java index 632119052..94d15b31b 100644 --- a/app/src/main/java/io/xpipe/app/update/AppInstaller.java +++ b/app/src/main/java/io/xpipe/app/update/AppInstaller.java @@ -24,8 +24,12 @@ public class AppInstaller { public static void installOnRemoteMachine(ShellControl s, String version) throws Exception { var asset = getSuitablePlatformAsset(s); - var file = AppDownloads.downloadInstaller(asset, version); - installFile(s, asset, file); + var file = AppDownloads.downloadInstaller(asset, version, false); + if (file.isEmpty()) { + return; + } + + installFile(s, asset, file.get()); } public static void installFileLocal(InstallerAssetType asset, Path localFile) throws Exception { @@ -196,12 +200,20 @@ public class AppInstaller { @Override public void installLocal(String file) throws Exception { - var command = String.format(""" - set -x - DEBIAN_FRONTEND=noninteractive sudo apt-get remove -qy xpipe - DEBIAN_FRONTEND=noninteractive sudo apt-get install -qy "%s" - xpipe open - """, file); + var command = String.format( + """ + #!/bin/bash + + exec || read -rsp "Update failed ..." -n 1 key + + function exec { + set -x + DEBIAN_FRONTEND=noninteractive sudo apt-get remove -qy xpipe || return 1 + DEBIAN_FRONTEND=noninteractive sudo apt-get install -qy "%s" || return 1 + xpipe open || return 1 + } + """, + file); TerminalHelper.open("X-Pipe Updater", command); } } diff --git a/app/src/main/java/io/xpipe/app/update/AppUpdater.java b/app/src/main/java/io/xpipe/app/update/AppUpdater.java index 02f57a25c..3e0a2f084 100644 --- a/app/src/main/java/io/xpipe/app/update/AppUpdater.java +++ b/app/src/main/java/io/xpipe/app/update/AppUpdater.java @@ -168,13 +168,17 @@ public class AppUpdater { event("Performing update download ..."); try { var downloadFile = AppDownloads.downloadInstaller( - lastUpdateCheckResult.getValue().getAssetType(), lastUpdateCheckResult.getValue().version); - var changelogString = AppDownloads.downloadChangelog(lastUpdateCheckResult.getValue().version); + lastUpdateCheckResult.getValue().getAssetType(), lastUpdateCheckResult.getValue().version, false); + if (downloadFile.isEmpty()) { + return; + } + + var changelogString = AppDownloads.downloadChangelog(lastUpdateCheckResult.getValue().version, false); var changelog = changelogString.orElse(null); var rel = new DownloadedUpdate( AppProperties.get().getVersion(), lastUpdateCheckResult.getValue().version, - downloadFile, + downloadFile.get(), changelog, lastUpdateCheckResult.getValue().getAssetType()); downloadedUpdate.setValue(rel); @@ -249,7 +253,7 @@ public class AppUpdater { } try (var ignored = new BusyProperty(busy)) { - var rel = AppDownloads.getLatestSuitableRelease(); + var rel = AppDownloads.getLatestSuitableRelease(!forceCheck); event("Determined latest suitable release " + rel.map(GHRelease::getName).orElse(null)); lastUpdateCheckResult.setValue(null); diff --git a/app/src/main/java/io/xpipe/app/update/UpdateAvailableAlert.java b/app/src/main/java/io/xpipe/app/update/UpdateAvailableAlert.java index 4e3789d4c..a095ca53c 100644 --- a/app/src/main/java/io/xpipe/app/update/UpdateAvailableAlert.java +++ b/app/src/main/java/io/xpipe/app/update/UpdateAvailableAlert.java @@ -7,7 +7,11 @@ import javafx.scene.control.Alert; public class UpdateAvailableAlert { public static void showIfNeeded() { - if (!AppUpdater.get().isDownloadedUpdateStillLatest()) { + if (AppUpdater.get().getDownloadedUpdate().getValue() == null) { + return; + } + + if (AppUpdater.get().getDownloadedUpdate().getValue() != null && !AppUpdater.get().isDownloadedUpdateStillLatest()) { AppUpdater.get().getDownloadedUpdate().setValue(null); return; } diff --git a/app/src/main/java/io/xpipe/app/util/ProxyManagerProviderImpl.java b/app/src/main/java/io/xpipe/app/util/ProxyManagerProviderImpl.java index 573d8344c..4e73acabc 100644 --- a/app/src/main/java/io/xpipe/app/util/ProxyManagerProviderImpl.java +++ b/app/src/main/java/io/xpipe/app/util/ProxyManagerProviderImpl.java @@ -32,7 +32,7 @@ public class ProxyManagerProviderImpl extends ProxyManagerProvider { @Override public Optional checkCompatibility(ShellControl s) throws Exception { - var version = ModuleHelper.isImage() ? AppProperties.get().getVersion() : AppDownloads.getLatestVersion(); + var version = ModuleHelper.isImage() ? AppProperties.get().getVersion() : AppDownloads.getLatestVersion(true); if (AppPrefs.get().developerDisableConnectorInstallationVersionCheck().get()) { return Optional.of(AppI18n.get("versionCheckOverride")); @@ -59,7 +59,7 @@ public class ProxyManagerProviderImpl extends ProxyManagerProvider { if (message.isPresent()) { if (showAlert()) { var version = - ModuleHelper.isImage() ? AppProperties.get().getVersion() : AppDownloads.getLatestVersion(); + ModuleHelper.isImage() ? AppProperties.get().getVersion() : AppDownloads.getLatestVersion(true); AppInstaller.installOnRemoteMachine(s, version); return true; } diff --git a/core/src/main/java/io/xpipe/core/util/Deobfuscator.java b/core/src/main/java/io/xpipe/core/util/Deobfuscator.java index a41fa153f..a3d7bdb44 100644 --- a/core/src/main/java/io/xpipe/core/util/Deobfuscator.java +++ b/core/src/main/java/io/xpipe/core/util/Deobfuscator.java @@ -81,7 +81,6 @@ public class Deobfuscator { } } catch (Exception ex) { System.err.println("Deobfuscation failed"); - ex.printStackTrace(); return stackTrace; }