From 435c157eb9a93416fc5c4b1cb85eec2dee37469d Mon Sep 17 00:00:00 2001 From: crschnick Date: Sun, 2 Jun 2024 08:38:15 +0000 Subject: [PATCH] Fixes --- .../app/comp/store/StoreCreationComp.java | 4 + .../xpipe/app/comp/store/StoreEntryComp.java | 2 +- .../xpipe/app/comp/store/StoreViewState.java | 18 +++- .../xpipe/app/prefs/ExternalEditorType.java | 8 +- .../app/terminal/ExternalTerminalType.java | 41 ++----- .../xpipe/app/terminal/WezTerminalType.java | 101 +++++++++++++----- .../java/io/xpipe/app/util/FileOpener.java | 11 +- dist/changelogs/9.4_incremental.md | 11 +- gradle/gradle_scripts/vernacular-1.16.jar | Bin 101276 -> 101280 bytes gradle/wrapper/gradle-wrapper.properties | 2 +- version | 2 +- 11 files changed, 126 insertions(+), 74 deletions(-) diff --git a/app/src/main/java/io/xpipe/app/comp/store/StoreCreationComp.java b/app/src/main/java/io/xpipe/app/comp/store/StoreCreationComp.java index 7220f5e8..a9588494 100644 --- a/app/src/main/java/io/xpipe/app/comp/store/StoreCreationComp.java +++ b/app/src/main/java/io/xpipe/app/comp/store/StoreCreationComp.java @@ -286,6 +286,10 @@ public class StoreCreationComp extends DialogComp { if (ex instanceof ValidationException) { ErrorEvent.expected(ex); skippable.set(false); + } else if (ex instanceof StackOverflowError) { + // Cycles in connection graphs can fail hard but are expected + ErrorEvent.expected(ex); + skippable.set(false); } else { skippable.set(true); } diff --git a/app/src/main/java/io/xpipe/app/comp/store/StoreEntryComp.java b/app/src/main/java/io/xpipe/app/comp/store/StoreEntryComp.java index 9859cd03..c8a7ef8a 100644 --- a/app/src/main/java/io/xpipe/app/comp/store/StoreEntryComp.java +++ b/app/src/main/java/io/xpipe/app/comp/store/StoreEntryComp.java @@ -390,7 +390,7 @@ public abstract class StoreEntryComp extends SimpleComp { wrapper.moveTo(storeCategoryWrapper.getCategory()); event.consume(); }); - if (storeCategoryWrapper.getParent() == null) { + if (storeCategoryWrapper.getParent() == null || storeCategoryWrapper.equals(wrapper.getCategory().getValue())) { m.setDisable(true); } diff --git a/app/src/main/java/io/xpipe/app/comp/store/StoreViewState.java b/app/src/main/java/io/xpipe/app/comp/store/StoreViewState.java index 24339c5d..199c185d 100644 --- a/app/src/main/java/io/xpipe/app/comp/store/StoreViewState.java +++ b/app/src/main/java/io/xpipe/app/comp/store/StoreViewState.java @@ -246,11 +246,9 @@ public class StoreViewState { public int compare(StoreCategoryWrapper o1, StoreCategoryWrapper o2) { var o1Root = o1.getRoot(); var o2Root = o2.getRoot(); - if (o1Root.equals(getAllConnectionsCategory()) && !o1Root.equals(o2Root)) { return -1; } - if (o2Root.equals(getAllConnectionsCategory()) && !o1Root.equals(o2Root)) { return 1; } @@ -267,6 +265,22 @@ public class StoreViewState { return 1; } + if (o1.getDepth() > o2.getDepth()) { + if (o1.getParent() == o2) { + return 1; + } + + return compare(o1.getParent(), o2); + } + + if (o1.getDepth() < o2.getDepth()) { + if (o2.getParent() == o1) { + return -1; + } + + return compare(o1, o2.getParent()); + } + var parent = compare(o1.getParent(), o2.getParent()); if (parent != 0) { return parent; diff --git a/app/src/main/java/io/xpipe/app/prefs/ExternalEditorType.java b/app/src/main/java/io/xpipe/app/prefs/ExternalEditorType.java index dce1a563..d044ea8c 100644 --- a/app/src/main/java/io/xpipe/app/prefs/ExternalEditorType.java +++ b/app/src/main/java/io/xpipe/app/prefs/ExternalEditorType.java @@ -194,10 +194,10 @@ public interface ExternalEditorType extends PrefsChoiceValue { @Override public void launch(Path file) throws Exception { - ExternalApplicationHelper.startAsync(CommandBuilder.of() - .add("open", "-a") - .addQuoted(applicationName) - .addFile(file.toString())); + try (var sc = LocalShell.getShell().start()) { + sc.executeSimpleCommand(CommandBuilder.of() + .add("open", "-a").addQuoted(applicationName).addFile(file.toString())); + } } } diff --git a/app/src/main/java/io/xpipe/app/terminal/ExternalTerminalType.java b/app/src/main/java/io/xpipe/app/terminal/ExternalTerminalType.java index 5fa67647..580cfdac 100644 --- a/app/src/main/java/io/xpipe/app/terminal/ExternalTerminalType.java +++ b/app/src/main/java/io/xpipe/app/terminal/ExternalTerminalType.java @@ -514,17 +514,11 @@ public interface ExternalTerminalType extends PrefsChoiceValue { @Override public void launch(LaunchConfiguration configuration) throws Exception { - try (ShellControl pc = LocalShell.getShell()) { - var suffix = "\"" + configuration.getScriptFile().toString().replaceAll("\"", "\\\\\"") + "\""; - pc.osascriptCommand(String.format( - """ - activate application "Terminal" - delay 1 - tell app "Terminal" to do script %s - """, - suffix)) - .execute(); - } + LocalShell.getShell() + .executeSimpleCommand(CommandBuilder.of() + .add("open", "-a") + .addQuoted("Terminal.app") + .addFile(configuration.getScriptFile())); } }; ExternalTerminalType ITERM2 = new MacOsType("app.iterm2", "iTerm") { @@ -550,26 +544,11 @@ public interface ExternalTerminalType extends PrefsChoiceValue { @Override public void launch(LaunchConfiguration configuration) throws Exception { - try (ShellControl pc = LocalShell.getShell()) { - pc.osascriptCommand(String.format( - """ - if application "iTerm" is not running then - launch application "iTerm" - delay 1 - tell application "iTerm" - tell current tab of current window - close - end tell - end tell - end if - tell application "iTerm" - activate - create window with default profile command "%s" - end tell - """, - configuration.getScriptFile().toString().replaceAll("\"", "\\\\\""))) - .execute(); - } + LocalShell.getShell() + .executeSimpleCommand(CommandBuilder.of() + .add("open", "-a") + .addQuoted("iTerm.app") + .addFile(configuration.getScriptFile())); } }; ExternalTerminalType WARP = new MacOsType("app.warp", "Warp") { diff --git a/app/src/main/java/io/xpipe/app/terminal/WezTerminalType.java b/app/src/main/java/io/xpipe/app/terminal/WezTerminalType.java index 8bf48d1a..f63d33be 100644 --- a/app/src/main/java/io/xpipe/app/terminal/WezTerminalType.java +++ b/app/src/main/java/io/xpipe/app/terminal/WezTerminalType.java @@ -1,9 +1,14 @@ package io.xpipe.app.terminal; +import io.xpipe.app.issue.ErrorEvent; import io.xpipe.app.prefs.ExternalApplicationHelper; +import io.xpipe.app.prefs.ExternalApplicationType; import io.xpipe.app.util.LocalShell; +import io.xpipe.app.util.ThreadHelper; import io.xpipe.app.util.WindowsRegistry; import io.xpipe.core.process.CommandBuilder; +import io.xpipe.core.process.OsType; +import io.xpipe.core.process.ShellControl; import java.nio.file.Path; import java.util.Optional; @@ -26,7 +31,7 @@ public interface WezTerminalType extends ExternalTerminalType { @Override default boolean isRecommended() { - return false; + return OsType.getLocal() != OsType.WINDOWS; } @Override @@ -51,25 +56,62 @@ public interface WezTerminalType extends ExternalTerminalType { @Override protected Optional determineInstallation() { - Optional launcherDir; - launcherDir = WindowsRegistry.local().readValue( - WindowsRegistry.HKEY_LOCAL_MACHINE, - "Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\{BCF6F0DA-5B9A-408D-8562-F680AE6E1EAF}_is1", - "InstallLocation") - .map(p -> p + "\\wezterm-gui.exe"); - return launcherDir.map(Path::of); + try { + var foundKey = WindowsRegistry.local().findKeyForEqualValueMatchRecursive(WindowsRegistry.HKEY_LOCAL_MACHINE, + "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall", "http://wezfurlong.org/wezterm"); + if (foundKey.isPresent()) { + var installKey = WindowsRegistry.local().readValue( + foundKey.get().getHkey(), + foundKey.get().getKey(), + "InstallLocation"); + if (installKey.isPresent()) { + return installKey.map(p -> p + "\\wezterm-gui.exe").map(Path::of); + } + } + } catch (Exception ex) { + ErrorEvent.fromThrowable(ex).omit().handle(); + } + + try (ShellControl pc = LocalShell.getShell()) { + if (pc.executeSimpleBooleanCommand(pc.getShellDialect().getWhichCommand("wezterm-gui"))) { + return Optional.of(Path.of("wezterm-gui")); + } + } catch (Exception e) { + ErrorEvent.fromThrowable(e).omit().handle(); + } + + return Optional.empty(); } } - class Linux extends SimplePathType implements WezTerminalType { + class Linux extends ExternalApplicationType implements WezTerminalType { public Linux() { - super("app.wezterm", "wezterm-gui", true); + super("app.wezterm"); + } + + public boolean isAvailable() { + try (ShellControl pc = LocalShell.getShell()) { + return pc.executeSimpleBooleanCommand(pc.getShellDialect().getWhichCommand("wezterm")) && + pc.executeSimpleBooleanCommand(pc.getShellDialect().getWhichCommand("wezterm-gui")); + } catch (Exception e) { + ErrorEvent.fromThrowable(e).omit().handle(); + return false; + } } @Override - protected CommandBuilder toCommand(LaunchConfiguration configuration) { - return CommandBuilder.of().add("start").addFile(configuration.getScriptFile()); + public void launch(LaunchConfiguration configuration) throws Exception { + var spawn = LocalShell.getShell().command(CommandBuilder.of().addFile("wezterm") + .add("cli", "spawn") + .addFile(configuration.getScriptFile())) + .executeAndCheck(); + if (!spawn) { + ExternalApplicationHelper.startAsync(CommandBuilder.of() + .addFile("wezterm-gui") + .add("start") + .addFile(configuration.getScriptFile())); + } } } @@ -81,20 +123,27 @@ public interface WezTerminalType extends ExternalTerminalType { @Override public void launch(LaunchConfiguration configuration) throws Exception { - var path = LocalShell.getShell() - .command(String.format( - "mdfind -name '%s' -onlyin /Applications -onlyin ~/Applications -onlyin /System/Applications 2>/dev/null", - applicationName)) - .readStdoutOrThrow(); - var c = CommandBuilder.of() - .addFile(Path.of(path) - .resolve("Contents") - .resolve("MacOS") - .resolve("wezterm-gui") - .toString()) - .add("start") - .add(configuration.getDialectLaunchCommand()); - ExternalApplicationHelper.startAsync(c); + try (var sc = LocalShell.getShell()) { + var path = sc.command( + String.format("mdfind -name '%s' -onlyin /Applications -onlyin ~/Applications -onlyin /System/Applications 2>/dev/null", + applicationName)).readStdoutOrThrow(); + var spawn = sc.command(CommandBuilder.of().addFile(Path.of(path) + .resolve("Contents") + .resolve("MacOS") + .resolve("wezterm").toString()) + .add("cli", "spawn", "--pane-id", "0") + .addFile(configuration.getScriptFile())) + .executeAndCheck(); + if (!spawn) { + ExternalApplicationHelper.startAsync(CommandBuilder.of() + .addFile(Path.of(path) + .resolve("Contents") + .resolve("MacOS") + .resolve("wezterm-gui").toString()) + .add("start") + .addFile(configuration.getScriptFile())); + } + } } } } diff --git a/app/src/main/java/io/xpipe/app/util/FileOpener.java b/app/src/main/java/io/xpipe/app/util/FileOpener.java index 62390236..bd742a62 100644 --- a/app/src/main/java/io/xpipe/app/util/FileOpener.java +++ b/app/src/main/java/io/xpipe/app/util/FileOpener.java @@ -28,10 +28,9 @@ public class FileOpener { try { editor.launch(Path.of(localFile).toRealPath()); } catch (Exception e) { - ErrorEvent.fromThrowable(e) - .description("Unable to launch editor " + ErrorEvent.fromThrowable("Unable to launch editor " + editor.toTranslatedString().getValue() - + ".\nMaybe try to use a different editor in the settings.") + + ".\nMaybe try to use a different editor in the settings.", e) .expected() .handle(); } @@ -52,8 +51,7 @@ public class FileOpener { } } } catch (Exception e) { - ErrorEvent.fromThrowable(e) - .description("Unable to open file " + localFile) + ErrorEvent.fromThrowable("Unable to open file " + localFile, e) .handle(); } } @@ -68,8 +66,7 @@ public class FileOpener { pc.executeSimpleCommand("open \"" + localFile + "\""); } } catch (Exception e) { - ErrorEvent.fromThrowable(e) - .description("Unable to open file " + localFile) + ErrorEvent.fromThrowable("Unable to open file " + localFile, e) .handle(); } } diff --git a/dist/changelogs/9.4_incremental.md b/dist/changelogs/9.4_incremental.md index 33f87304..cc1a9e9d 100644 --- a/dist/changelogs/9.4_incremental.md +++ b/dist/changelogs/9.4_incremental.md @@ -8,7 +8,7 @@ The file transfer mechanism when editing files had some flaws, which under rare The entire transfer implementation has been rewritten to iron out these issues and increase reliability. Other file browser actions have also been made more reliable. -There seems to be another separate issue with a PowerShell bug when connecting to a Windows system, causing file uploads of more than around 1MB to stall. For now, xpipe can fall back to pwsh if it is installed to work around this issue. +There seems to be another separate issue with a PowerShell bug when connecting to a Windows system, causing file uploads to be slow. For now, xpipe can fall back to pwsh if it is installed to work around this issue. ## Git vault improvements @@ -17,6 +17,13 @@ The conflict resolution has been improved - In case of a merge conflict, overwriting local changes will now preserve all connections that are not added to the git vault, including local connections - You now have the option to force push changes when a conflict occurs while XPipe is saving while running, not requiring a restart anymore +## Terminal improvements + +The terminal integration got reworked for some terminals: +- iTerm can now launch tabs instead of individual windows. There were also a few issues fixed that prevented it from launching sometimes +- WezTerm now supports tabs on Linux and macOS. The Windows installation detection has been improved to detect all installed versions +- Terminal.app will now launch faster + ## Other - You can now add simple RDP connections without a file @@ -29,6 +36,8 @@ The conflict resolution has been improved - Fix possibility of selecting own children connections as hosts, causing a stack overflow. Please don't try to create cycles in your connection graphs - Fix vault secrets not correctly updating unless restarted when changing vault passphrase - Fix connection launcher desktop shortcuts and URLs not properly executing if xpipe is not running +- Fix move to ... menu sometimes not ordering categories correctly - Fix SSH command failing on macOS with homebrew openssh package installed - Fix SSH connections not opening the correct shell environment on Windows systems when username contained spaces due to an OpenSSH bug - Fix newly added connections not having the correct order +- Fix error messages of external editor programs not being shown when they failed to start diff --git a/gradle/gradle_scripts/vernacular-1.16.jar b/gradle/gradle_scripts/vernacular-1.16.jar index 062d3b270b4f227b4998849ea7d8c2abf2cf031f..261aaa8fb4cdb4e45a33ea9258abe3ddd944b739 100644 GIT binary patch delta 4470 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 RK(nEw3@A#LMIob%{{!Tp9F+h7 delta 4573 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 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 510f28ae..6f7a6eb3 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.8-rc-1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.8-all.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/version b/version index 745b6b93..0359f243 100644 --- a/version +++ b/version @@ -1 +1 @@ -9.4-4 +9.4