Rebase fixes

This commit is contained in:
crschnick 2024-01-22 06:54:54 +00:00
parent 5ae35ecfe9
commit e9587c24d6
14 changed files with 50 additions and 158 deletions

View file

@ -2,7 +2,7 @@ package io.xpipe.app.browser;
import io.xpipe.app.issue.ErrorEvent; import io.xpipe.app.issue.ErrorEvent;
import io.xpipe.app.util.ThreadHelper; import io.xpipe.app.util.ThreadHelper;
import io.xpipe.core.process.ShellDialects; import io.xpipe.core.process.ProcessControlProvider;
import io.xpipe.core.store.FileSystem; import io.xpipe.core.store.FileSystem;
import io.xpipe.core.util.FailableRunnable; import io.xpipe.core.util.FailableRunnable;
import javafx.beans.property.Property; import javafx.beans.property.Property;
@ -32,7 +32,7 @@ public class BrowserClipboard {
public String toClipboardString() { public String toClipboardString() {
return entries.stream().map(fileEntry -> "\"" + fileEntry.getPath() + "\"").collect( return entries.stream().map(fileEntry -> "\"" + fileEntry.getPath() + "\"").collect(
Collectors.joining(ShellDialects.getPlatformDefault().getNewLine().getNewLineString())); Collectors.joining(ProcessControlProvider.get().getEffectiveLocalDialect().getNewLine().getNewLineString()));
} }
} }

View file

@ -2,8 +2,8 @@ package io.xpipe.app.core.check;
import io.xpipe.app.issue.ErrorEvent; import io.xpipe.app.issue.ErrorEvent;
import io.xpipe.app.util.LocalShell; import io.xpipe.app.util.LocalShell;
import io.xpipe.core.process.ProcessControlProvider;
import io.xpipe.core.process.ProcessOutputException; import io.xpipe.core.process.ProcessOutputException;
import io.xpipe.core.process.ShellDialects;
import java.util.Optional; import java.util.Optional;
@ -24,7 +24,7 @@ public class AppShellCheck {
- The operating system is not supported - The operating system is not supported
You can reach out to us if you want to properly diagnose the cause individually and hopefully fix it. You can reach out to us if you want to properly diagnose the cause individually and hopefully fix it.
""".formatted(ShellDialects.getPlatformDefault().getDisplayName(), err.get()); """.formatted(ProcessControlProvider.get().getEffectiveLocalDialect().getDisplayName(), err.get());
ErrorEvent.fromMessage(msg).handle(); ErrorEvent.fromMessage(msg).handle();
} }
} }

View file

@ -5,7 +5,6 @@ import io.xpipe.app.issue.ErrorEvent;
import io.xpipe.app.util.LocalShell; import io.xpipe.app.util.LocalShell;
import io.xpipe.core.process.OsType; import io.xpipe.core.process.OsType;
import io.xpipe.core.process.ShellControl; import io.xpipe.core.process.ShellControl;
import io.xpipe.core.process.ShellDialects;
import java.nio.file.Files; import java.nio.file.Files;
import java.nio.file.Path; import java.nio.file.Path;
@ -119,7 +118,7 @@ public abstract class ExternalApplicationType implements PrefsChoiceValue {
protected Optional<Path> determineFromPath() { protected Optional<Path> determineFromPath() {
// Try to locate if it is in the Path // Try to locate if it is in the Path
try (var cc = LocalShell.getShell() try (var cc = LocalShell.getShell()
.command(ShellDialects.getPlatformDefault().getWhichCommand(executable)) .command(var1 -> var1.getShellDialect().getWhichCommand(executable))
.start()) { .start()) {
var out = cc.readStdoutDiscardErr(); var out = cc.readStdoutDiscardErr();
var exit = cc.getExitCode(); var exit = cc.getExitCode();

View file

@ -7,6 +7,7 @@ import io.xpipe.app.util.*;
import io.xpipe.core.process.CommandBuilder; import io.xpipe.core.process.CommandBuilder;
import io.xpipe.core.process.OsType; import io.xpipe.core.process.OsType;
import io.xpipe.core.process.ShellControl; import io.xpipe.core.process.ShellControl;
import io.xpipe.core.process.ShellDialects;
import io.xpipe.core.store.FileNames; import io.xpipe.core.store.FileNames;
import io.xpipe.core.store.LocalStore; import io.xpipe.core.store.LocalStore;
import lombok.Getter; import lombok.Getter;
@ -134,11 +135,14 @@ public interface ExternalTerminalType extends PrefsChoiceValue {
// backslash of a filepath to escape the closing quote in the title argument // backslash of a filepath to escape the closing quote in the title argument
// So just remove that slash // So just remove that slash
var fixedName = FileNames.removeTrailingSlash(configuration.getTitle()); var fixedName = FileNames.removeTrailingSlash(configuration.getTitle());
var toExec = !ShellDialects.isPowershell(LocalShell.getShell()) ?
CommandBuilder.of().addFile(configuration.getScriptFile()) :
CommandBuilder.of().add("powershell", "-ExecutionPolicy", "Bypass", "-File").addQuoted(configuration.getScriptFile());
LocalShell.getShell() LocalShell.getShell()
.executeSimpleCommand(CommandBuilder.of() .executeSimpleCommand(CommandBuilder.of()
.add("wt", "-w", "1", "nt", "--title") .add("wt", "-w", "1", "nt", "--title")
.addQuoted(fixedName) .addQuoted(fixedName)
.addFile(configuration.getScriptFile())); .addSub(toExec));
} }
@Override @Override

View file

@ -10,7 +10,6 @@ import io.xpipe.app.fxcomps.impl.TextFieldComp;
import io.xpipe.app.util.TerminalHelper; import io.xpipe.app.util.TerminalHelper;
import io.xpipe.app.util.ThreadHelper; import io.xpipe.app.util.ThreadHelper;
import io.xpipe.core.process.CommandControl; import io.xpipe.core.process.CommandControl;
import io.xpipe.core.process.ShellDialects;
import io.xpipe.core.store.LocalStore; import io.xpipe.core.store.LocalStore;
import javafx.beans.property.SimpleStringProperty; import javafx.beans.property.SimpleStringProperty;
import javafx.geometry.Insets; import javafx.geometry.Insets;
@ -41,10 +40,9 @@ public class PasswordCategory extends AppPrefsCategory {
"Password test", "Password test",
new LocalStore() new LocalStore()
.control() .control()
.command(cmd .command(sc -> cmd
+ "\n" + "\n"
+ ShellDialects.getPlatformDefault() + sc.getShellDialect().getEchoCommand("Is this your password?", false))
.getEchoCommand("Is this your password?", false))
.terminalExitMode(CommandControl.TerminalExitMode.KEEP_OPEN)); .terminalExitMode(CommandControl.TerminalExitMode.KEEP_OPEN));
}); });
}; };

View file

@ -6,10 +6,7 @@ import com.fasterxml.jackson.annotation.JsonTypeName;
import io.xpipe.app.core.AppProperties; import io.xpipe.app.core.AppProperties;
import io.xpipe.app.util.ScriptHelper; import io.xpipe.app.util.ScriptHelper;
import io.xpipe.app.util.TerminalHelper; import io.xpipe.app.util.TerminalHelper;
import io.xpipe.core.process.CommandControl; import io.xpipe.core.process.*;
import io.xpipe.core.process.OsType;
import io.xpipe.core.process.ShellControl;
import io.xpipe.core.process.ShellDialects;
import io.xpipe.core.store.FileNames; import io.xpipe.core.store.FileNames;
import io.xpipe.core.store.LocalStore; import io.xpipe.core.store.LocalStore;
import io.xpipe.core.util.XPipeInstallation; import io.xpipe.core.util.XPipeInstallation;
@ -18,7 +15,6 @@ import lombok.Getter;
import java.io.InputStream; import java.io.InputStream;
import java.nio.file.Files; import java.nio.file.Files;
import java.nio.file.Path; import java.nio.file.Path;
import java.util.ArrayList;
public class AppInstaller { public class AppInstaller {
@ -125,19 +121,19 @@ public class AppInstaller {
var exec = XPipeInstallation.getInstallationExecutable( var exec = XPipeInstallation.getInstallationExecutable(
shellControl, XPipeInstallation.getDefaultInstallationBasePath(shellControl)); shellControl, XPipeInstallation.getDefaultInstallationBasePath(shellControl));
var logsDir = FileNames.join(XPipeInstallation.getDataDir(shellControl), "logs"); var logsDir = FileNames.join(XPipeInstallation.getDataDir(shellControl), "logs");
var cmd = new ArrayList<>(java.util.List.of( var cmd = CommandBuilder.of().add(
"start", "start",
"/wait", "/wait",
"msiexec", "msiexec",
"/i", "/i").addFile(
file, file).add(
"/l*", "/l*").addFile(
FileNames.join(logsDir, "installer_" + FileNames.getFileName(file) + ".log"), FileNames.join(logsDir, "installer_" + FileNames.getFileName(file) + ".log")).add(
"/qb", "/qb",
"&", "&").addFile(
exec exec
// "/qf" // "/qf"
)); );
try (CommandControl c = shellControl.command(cmd).start()) { try (CommandControl c = shellControl.command(cmd).start()) {
c.discardOrThrow(); c.discardOrThrow();
} }

View file

@ -35,7 +35,7 @@ public class XPipeInstanceHelper {
public static boolean isSupported(ShellStore host) { public static boolean isSupported(ShellStore host) {
try (var pc = host.control().start(); try (var pc = host.control().start();
var cmd = pc.command(List.of("xpipe"))) { var cmd = pc.command("xpipe")) {
cmd.discardOrThrow(); cmd.discardOrThrow();
return true; return true;
} catch (Exception e) { } catch (Exception e) {

View file

@ -1,107 +0,0 @@
package io.xpipe.app.util;
import javafx.animation.Animation;
import javafx.animation.KeyFrame;
import javafx.animation.Timeline;
import javafx.event.EventHandler;
import javafx.geometry.Bounds;
import javafx.geometry.Orientation;
import javafx.scene.Node;
import javafx.scene.control.ListView;
import javafx.scene.control.ScrollBar;
import javafx.scene.control.TableView;
import javafx.scene.input.MouseEvent;
import javafx.scene.input.ScrollEvent;
import javafx.util.Duration;
import java.util.function.Function;
public class SmoothScroll {
private static ScrollBar getScrollbarComponent(Node no, Orientation orientation) {
Node n = no.lookup(".scroll-bar");
if (n instanceof final ScrollBar bar) {
if (bar.getOrientation().equals(orientation)) {
return bar;
}
}
return null;
}
public static void smoothScrollingListView(Node n, double speed) {
smoothScrollingListView(n, speed, Orientation.VERTICAL, bounds -> bounds.getHeight());
}
public static void smoothHScrollingListView(ListView<?> listView, double speed) {
smoothScrollingListView(listView, speed, Orientation.HORIZONTAL, bounds -> bounds.getHeight());
}
private static void smoothScrollingListView(
Node n, double speed, Orientation orientation, Function<Bounds, Double> sizeFunc) {
((TableView<?>) n).skinProperty().addListener((observable, oldValue, newValue) -> {
if (newValue != null) {
ScrollBar scrollBar = getScrollbarComponent(n, orientation);
if (scrollBar == null) {
return;
}
scrollBar.setUnitIncrement(1);
final double[] frictions = {
0.99, 0.1, 0.05, 0.04, 0.03, 0.02, 0.01, 0.04, 0.01, 0.008, 0.008, 0.008, 0.008, 0.0006, 0.0005,
0.00003, 0.00001
};
final double[] pushes = {speed};
final double[] derivatives = new double[frictions.length];
final double[] lastVPos = {0};
Timeline timeline = new Timeline();
final EventHandler<MouseEvent> dragHandler = event -> timeline.stop();
final EventHandler<ScrollEvent> scrollHandler = event -> {
scrollBar.valueProperty().set(lastVPos[0]);
if (event.getEventType() == ScrollEvent.SCROLL) {
double direction = event.getDeltaY() > 0 ? -1 : 1;
for (int i = 0; i < pushes.length; i++) {
derivatives[i] += direction * pushes[i];
}
if (timeline.getStatus() == Animation.Status.STOPPED) {
timeline.play();
}
}
event.consume();
};
if (scrollBar.getParent() != null) {
scrollBar.getParent().addEventHandler(MouseEvent.DRAG_DETECTED, dragHandler);
scrollBar.getParent().addEventHandler(ScrollEvent.ANY, scrollHandler);
}
scrollBar.parentProperty().addListener((o, oldVal, newVal) -> {
if (oldVal != null) {
oldVal.removeEventHandler(MouseEvent.DRAG_DETECTED, dragHandler);
oldVal.removeEventHandler(ScrollEvent.ANY, scrollHandler);
}
if (newVal != null) {
newVal.addEventHandler(MouseEvent.DRAG_DETECTED, dragHandler);
newVal.addEventHandler(ScrollEvent.ANY, scrollHandler);
}
});
timeline.getKeyFrames().add(new KeyFrame(Duration.millis(3), (event) -> {
for (int i = 0; i < derivatives.length; i++) {
derivatives[i] *= frictions[i];
}
for (int i = 1; i < derivatives.length; i++) {
derivatives[i] += derivatives[i - 1];
}
double dy = derivatives[derivatives.length - 1];
double size = sizeFunc.apply(scrollBar.getLayoutBounds());
scrollBar.valueProperty().set(Math.min(Math.max(scrollBar.getValue() + dy / size, 0), 1));
lastVPos[0] = scrollBar.getValue();
if (Math.abs(dy) < 1) {
if (Math.abs(dy) < 0.001) {
timeline.stop();
}
}
}));
timeline.setCycleCount(Animation.INDEFINITE);
}
});
}
}

View file

@ -33,4 +33,8 @@ public abstract class ProcessControlProvider {
public abstract ShellControl createLocalProcessControl(boolean stoppable); public abstract ShellControl createLocalProcessControl(boolean stoppable);
public abstract Object createStorageHandler(); public abstract Object createStorageHandler();
public abstract ShellDialect getEffectiveLocalDialect();
public abstract ShellDialect getFallbackDialect();
} }

View file

@ -236,10 +236,6 @@ public interface ShellControl extends ProcessControl {
}); });
} }
default CommandControl command(List<String> command) {
return command(shellProcessControl -> ShellDialect.flatten(command));
}
default CommandControl command(CommandBuilder builder) { default CommandControl command(CommandBuilder builder) {
return command(shellProcessControl -> builder.buildString(shellProcessControl)); return command(shellProcessControl -> builder.buildString(shellProcessControl));
} }

View file

@ -10,24 +10,11 @@ import java.io.IOException;
import java.nio.charset.Charset; import java.nio.charset.Charset;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.Stream; import java.util.stream.Stream;
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "type") @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "type")
public interface ShellDialect { public interface ShellDialect {
static String flatten(List<String> command) {
return command.stream()
.map(s -> s.contains(" ")
&& !(s.startsWith("\"") && s.endsWith("\""))
&& !(s.startsWith("'") && s.endsWith("'"))
? "\"" + s + "\""
: s)
.collect(Collectors.joining(" "));
}
String getExecutableName();
default boolean isSupportedShell() { default boolean isSupportedShell() {
return true; return true;
} }
@ -44,6 +31,8 @@ public interface ShellDialect {
return this; return this;
} }
String getExecutableName();
String getCatchAllVariable(); String getCatchAllVariable();
String queryVersion(ShellControl shellControl) throws Exception; String queryVersion(ShellControl shellControl) throws Exception;

View file

@ -4,6 +4,7 @@ import io.xpipe.core.util.ModuleLayerLoader;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Optional;
import java.util.ServiceLoader; import java.util.ServiceLoader;
public class ShellDialects { public class ShellDialects {
@ -71,15 +72,19 @@ public class ShellDialects {
.filter(shellType -> shellType.getId().equals(name)) .filter(shellType -> shellType.getId().equals(name))
.findFirst() .findFirst()
.orElseThrow(); .orElseThrow();
}
public static boolean isPowershell(ShellControl sc) {
return sc.getShellDialect().equals(POWERSHELL) || sc.getShellDialect().equals(POWERSHELL_CORE);
} }
public static ShellDialect getPlatformDefault() { public static ShellDialect byName(String name) {
if (OsType.getLocal().equals(OsType.WINDOWS)) { return byNameIfPresent(name).orElseThrow();
return CMD; }
} else if (OsType.getLocal().equals(OsType.LINUX)) {
return BASH; public static Optional<ShellDialect> byNameIfPresent(String name) {
} else { return ALL.stream()
return ZSH; .filter(shellType -> shellType.getId().equals(name))
} .findFirst();
} }
} }

View file

@ -1,10 +1,19 @@
package io.xpipe.core.process; package io.xpipe.core.process;
import lombok.AllArgsConstructor;
import lombok.Value; import lombok.Value;
@Value @Value
@AllArgsConstructor
public class ShellProperties { public class ShellProperties {
public ShellProperties(ShellDialect dialect, boolean ansiEscapes) {
this.dialect = dialect;
this.ansiEscapes = ansiEscapes;
this.supported = true;
}
ShellDialect dialect; ShellDialect dialect;
boolean ansiEscapes; boolean ansiEscapes;
boolean supported;
} }

View file

@ -10,7 +10,6 @@ import java.nio.charset.StandardCharsets;
import java.nio.file.Files; import java.nio.file.Files;
import java.nio.file.InvalidPathException; import java.nio.file.InvalidPathException;
import java.nio.file.Path; import java.nio.file.Path;
import java.util.List;
import java.util.Optional; import java.util.Optional;
public class XPipeInstallation { public class XPipeInstallation {
@ -212,7 +211,7 @@ public class XPipeInstallation {
} }
public static String queryInstallationVersion(ShellControl p, String exec) throws Exception { public static String queryInstallationVersion(ShellControl p, String exec) throws Exception {
try (CommandControl c = p.command(List.of(exec, "version")).start()) { try (CommandControl c = p.command(CommandBuilder.of().addFile(exec).add("version")).start()) {
return c.readStdoutOrThrow(); return c.readStdoutOrThrow();
} catch (ProcessOutputException ex) { } catch (ProcessOutputException ex) {
return "?"; return "?";