From a8f9de7c83354aad3da2f5c1257569875eec1bf1 Mon Sep 17 00:00:00 2001 From: crschnick Date: Fri, 7 Jun 2024 18:11:52 +0000 Subject: [PATCH] Script rework --- .../base/script/PredefinedScriptGroup.java | 4 +- .../base/script/PredefinedScriptStore.java | 12 +++ .../ext/base/script/RunScriptAction.java | 99 +++++++++++++++++++ .../ext/base/script/SimpleScriptStore.java | 2 +- ext/base/src/main/java/module-info.java | 3 +- .../ext/base/resources/scripts/apt_update.sh | 1 + .../ext/base/resources/scripts/crlf_to_lf.sh | 8 ++ 7 files changed, 126 insertions(+), 3 deletions(-) create mode 100644 ext/base/src/main/java/io/xpipe/ext/base/script/RunScriptAction.java create mode 100644 ext/base/src/main/resources/io/xpipe/ext/base/resources/scripts/apt_update.sh create mode 100644 ext/base/src/main/resources/io/xpipe/ext/base/resources/scripts/crlf_to_lf.sh diff --git a/ext/base/src/main/java/io/xpipe/ext/base/script/PredefinedScriptGroup.java b/ext/base/src/main/java/io/xpipe/ext/base/script/PredefinedScriptGroup.java index dfc07e47..84d7c917 100644 --- a/ext/base/src/main/java/io/xpipe/ext/base/script/PredefinedScriptGroup.java +++ b/ext/base/src/main/java/io/xpipe/ext/base/script/PredefinedScriptGroup.java @@ -8,7 +8,9 @@ import lombok.Setter; @Getter public enum PredefinedScriptGroup { CLINK("Clink", null, false), - STARSHIP("Starship", "Sets up and enables the starship shell prompt", true); + STARSHIP("Starship", "Sets up and enables the starship shell prompt", true), + MANAGEMENT("Management", "Some commonly used management scripts", true), + FILES("Files", "Scripts for files", true); private final String name; private final String description; diff --git a/ext/base/src/main/java/io/xpipe/ext/base/script/PredefinedScriptStore.java b/ext/base/src/main/java/io/xpipe/ext/base/script/PredefinedScriptStore.java index 8e930207..8d8e043d 100644 --- a/ext/base/src/main/java/io/xpipe/ext/base/script/PredefinedScriptStore.java +++ b/ext/base/src/main/java/io/xpipe/ext/base/script/PredefinedScriptStore.java @@ -60,6 +60,18 @@ public enum PredefinedScriptStore { .minimumDialect(ShellDialects.POWERSHELL) .commands(file("starship_powershell.ps1")) .initScript(true) + .build()), + APT_UPDATE("Apt update", () -> SimpleScriptStore.builder() + .group(PredefinedScriptGroup.MANAGEMENT.getEntry()) + .minimumDialect(ShellDialects.SH) + .commands(file(("apt_update.sh"))) + .shellScript(true) + .build()), + REMOVE_CR("CRLF to LF", () -> SimpleScriptStore.builder() + .group(PredefinedScriptGroup.FILES.getEntry()) + .minimumDialect(ShellDialects.SH) + .commands(file(("crlf_to_lf.sh"))) + .fileScript(true) .build()); private final String name; diff --git a/ext/base/src/main/java/io/xpipe/ext/base/script/RunScriptAction.java b/ext/base/src/main/java/io/xpipe/ext/base/script/RunScriptAction.java new file mode 100644 index 00000000..5423652e --- /dev/null +++ b/ext/base/src/main/java/io/xpipe/ext/base/script/RunScriptAction.java @@ -0,0 +1,99 @@ +package io.xpipe.ext.base.script; + +import io.xpipe.app.browser.action.BranchAction; +import io.xpipe.app.browser.action.BrowserAction; +import io.xpipe.app.browser.action.LeafAction; +import io.xpipe.app.browser.file.BrowserEntry; +import io.xpipe.app.browser.fs.OpenFileSystemModel; +import io.xpipe.app.browser.session.BrowserSessionModel; +import io.xpipe.app.core.AppI18n; +import io.xpipe.app.storage.DataStorage; +import io.xpipe.app.util.ScriptHelper; +import io.xpipe.core.process.ShellControl; +import javafx.beans.property.SimpleStringProperty; +import javafx.beans.value.ObservableValue; +import javafx.scene.Node; +import org.kordamp.ikonli.javafx.FontIcon; + +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class RunScriptAction implements BrowserAction, BranchAction { + + @Override + public Node getIcon(OpenFileSystemModel model, List entries) { + return new FontIcon("mdi2l-linux"); + } + + @Override + public Category getCategory() { + return Category.OPEN; + } + + @Override + public boolean acceptsEmptySelection() { + return true; + } + + @Override + public ObservableValue getName(OpenFileSystemModel model, List entries) { + return AppI18n.observable("runScript"); + } + + @Override + public boolean isApplicable(OpenFileSystemModel model, List entries) { + var sc = model.getFileSystem().getShell().orElseThrow(); + return model.getBrowserModel() instanceof BrowserSessionModel + && !getInstances(sc).isEmpty(); + } + + private Map getInstances(ShellControl sc) { + var scripts = ScriptStore.flatten(ScriptStore.getDefaultEnabledScripts()); + var map = new LinkedHashMap(); + for (SimpleScriptStore script : scripts) { + if (script.assemble(sc) == null) { + continue; + } + + var entry = DataStorage.get().getStoreEntryIfPresent(script, true); + if (entry.isPresent()) { + map.put(entry.get().getName(), script); + } + } + return map; + } + + @Override + public List getBranchingActions(OpenFileSystemModel model, List entries) { + var sc = model.getFileSystem().getShell().orElseThrow(); + var scripts = getInstances(sc); + List actions = scripts.entrySet().stream() + .map(e -> { + return new LeafAction() { + @Override + public void execute(OpenFileSystemModel model, List entries) throws Exception { + var args = entries.stream().map(browserEntry -> browserEntry.getOptionallyQuotedFileName()).collect(Collectors.joining(" ")); + execute(model, args); + } + + private void execute(OpenFileSystemModel model, String args) throws Exception { + if (model.getBrowserModel() instanceof BrowserSessionModel bm) { + var content = e.getValue().assemble(sc); + var script = ScriptHelper.createExecScript(sc, content); + sc.executeSimpleCommand(sc.getShellDialect().runScriptCommand(sc, script.toString()) + " " + args); + } + } + + @Override + public ObservableValue getName(OpenFileSystemModel model, List entries) { + return new SimpleStringProperty(e.getKey()); + } + }; + }) + .map(leafAction -> (LeafAction) leafAction) + .toList(); + return actions; + } +} diff --git a/ext/base/src/main/java/io/xpipe/ext/base/script/SimpleScriptStore.java b/ext/base/src/main/java/io/xpipe/ext/base/script/SimpleScriptStore.java index 7ae71b07..bc21abd7 100644 --- a/ext/base/src/main/java/io/xpipe/ext/base/script/SimpleScriptStore.java +++ b/ext/base/src/main/java/io/xpipe/ext/base/script/SimpleScriptStore.java @@ -31,7 +31,7 @@ public class SimpleScriptStore extends ScriptStore implements ShellInitCommand.T private final boolean shellScript; private final boolean fileScript; - private String assemble(ShellControl shellControl) { + public String assemble(ShellControl shellControl) { var targetType = shellControl.getOriginalShellDialect(); if (minimumDialect.isCompatibleTo(targetType)) { var shebang = commands.startsWith("#"); diff --git a/ext/base/src/main/java/module-info.java b/ext/base/src/main/java/module-info.java index 1fddc0d7..07e7f31e 100644 --- a/ext/base/src/main/java/module-info.java +++ b/ext/base/src/main/java/module-info.java @@ -7,6 +7,7 @@ import io.xpipe.ext.base.browser.*; import io.xpipe.ext.base.desktop.DesktopApplicationStoreProvider; import io.xpipe.ext.base.desktop.DesktopCommandStoreProvider; import io.xpipe.ext.base.desktop.DesktopEnvironmentStoreProvider; +import io.xpipe.ext.base.script.RunScriptAction; import io.xpipe.ext.base.script.ScriptDataStorageProvider; import io.xpipe.ext.base.script.ScriptGroupStoreProvider; import io.xpipe.ext.base.script.SimpleScriptStoreProvider; @@ -35,7 +36,7 @@ open module io.xpipe.ext.base { requires org.kordamp.ikonli.javafx; requires atlantafx.base; - provides BrowserAction with + provides BrowserAction with RunScriptAction, FollowLinkAction, BackAction, ForwardAction, diff --git a/ext/base/src/main/resources/io/xpipe/ext/base/resources/scripts/apt_update.sh b/ext/base/src/main/resources/io/xpipe/ext/base/resources/scripts/apt_update.sh new file mode 100644 index 00000000..3e5dd771 --- /dev/null +++ b/ext/base/src/main/resources/io/xpipe/ext/base/resources/scripts/apt_update.sh @@ -0,0 +1 @@ +sudo apt update \ No newline at end of file diff --git a/ext/base/src/main/resources/io/xpipe/ext/base/resources/scripts/crlf_to_lf.sh b/ext/base/src/main/resources/io/xpipe/ext/base/resources/scripts/crlf_to_lf.sh new file mode 100644 index 00000000..f9500ac9 --- /dev/null +++ b/ext/base/src/main/resources/io/xpipe/ext/base/resources/scripts/crlf_to_lf.sh @@ -0,0 +1,8 @@ +for arg in "$@" +do + file="arg" + temp_file=$(mktemp) + awk '{ sub("\r$", ""); print }' "$file" "$temp_file" + cat "$temp_file" > "file" + rm "$temp_file" +done