mirror of
https://github.com/xpipe-io/xpipe.git
synced 2024-09-02 02:31:21 +12:00
New release
This commit is contained in:
parent
72867b9a53
commit
8478992798
25 changed files with 91 additions and 41 deletions
11
LICENSE.md
Normal file
11
LICENSE.md
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
The following modules are licensed under the MIT license:
|
||||||
|
- api
|
||||||
|
- beacon
|
||||||
|
- core
|
||||||
|
- extension
|
||||||
|
|
||||||
|
Everything else is licensed under GPL3.
|
||||||
|
As a special exception to GPL3 license, Christopher Schnick (the
|
||||||
|
author of X-Pipe) is granted permanent and irrevocable
|
||||||
|
permission to use this code for any purpose, and to modify,
|
||||||
|
distribute and sublicense it under any terms of his/her choosing.
|
|
@ -160,3 +160,12 @@ You are also able to properly debug the built production application through two
|
||||||
Note that when any unit test is run using a debugger, the X-Pipe daemon process that is started will also attempt
|
Note that when any unit test is run using a debugger, the X-Pipe daemon process that is started will also attempt
|
||||||
to connect to that debugger through [AttachMe](https://plugins.jetbrains.com/plugin/13263-attachme) as well.
|
to connect to that debugger through [AttachMe](https://plugins.jetbrains.com/plugin/13263-attachme) as well.
|
||||||
|
|
||||||
|
### Development FAQ
|
||||||
|
|
||||||
|
##### Why are there no GitHub actions workflows or other continuous integration pipelines set up for this repository?
|
||||||
|
|
||||||
|
There are several test workflows run in a private environment as they use private test connections
|
||||||
|
such as remote server connections and database connections.
|
||||||
|
Other private workflows are responsible for packaging, signing, and distributing the releases.
|
||||||
|
So you can assume that the code is tested!
|
||||||
|
|
||||||
|
|
|
@ -47,8 +47,8 @@ dependencies {
|
||||||
implementation group: 'org.kordamp.ikonli', name: 'ikonli-materialdesign2-pack', version: "12.2.0"
|
implementation group: 'org.kordamp.ikonli', name: 'ikonli-materialdesign2-pack', version: "12.2.0"
|
||||||
implementation group: 'org.kordamp.ikonli', name: 'ikonli-javafx', version: "12.2.0"
|
implementation group: 'org.kordamp.ikonli', name: 'ikonli-javafx', version: "12.2.0"
|
||||||
implementation group: 'org.kordamp.ikonli', name: 'ikonli-material-pack', version: "12.2.0"
|
implementation group: 'org.kordamp.ikonli', name: 'ikonli-material-pack', version: "12.2.0"
|
||||||
implementation name: 'preferencesfx-core-lazy-11.11.0'
|
implementation group: 'com.dlsc.preferencesfx', name: 'preferencesfx-core', version: '11.15.0'
|
||||||
implementation name: 'formsfx-core-lazy-11.5.0'
|
implementation group: 'com.dlsc.formsfx', name: 'formsfx-core', version: '11.6.0'
|
||||||
implementation group: 'org.slf4j', name: 'slf4j-api', version: '2.0.0'
|
implementation group: 'org.slf4j', name: 'slf4j-api', version: '2.0.0'
|
||||||
implementation 'io.xpipe:modulefs:0.1.4'
|
implementation 'io.xpipe:modulefs:0.1.4'
|
||||||
implementation 'com.jfoenix:jfoenix:9.0.10'
|
implementation 'com.jfoenix:jfoenix:9.0.10'
|
||||||
|
|
|
@ -4,7 +4,7 @@ import io.xpipe.app.comp.about.AboutTabComp;
|
||||||
import io.xpipe.app.comp.base.SideMenuBarComp;
|
import io.xpipe.app.comp.base.SideMenuBarComp;
|
||||||
import io.xpipe.app.comp.storage.collection.SourceCollectionLayoutComp;
|
import io.xpipe.app.comp.storage.collection.SourceCollectionLayoutComp;
|
||||||
import io.xpipe.app.comp.storage.store.StoreLayoutComp;
|
import io.xpipe.app.comp.storage.store.StoreLayoutComp;
|
||||||
import io.xpipe.app.core.AppActionDetector;
|
import io.xpipe.app.core.AppActionLinkDetector;
|
||||||
import io.xpipe.app.core.AppCache;
|
import io.xpipe.app.core.AppCache;
|
||||||
import io.xpipe.app.core.AppFont;
|
import io.xpipe.app.core.AppFont;
|
||||||
import io.xpipe.app.core.AppProperties;
|
import io.xpipe.app.core.AppProperties;
|
||||||
|
@ -36,7 +36,7 @@ public class AppLayoutComp extends Comp<CompStructure<BorderPane>> {
|
||||||
selected = new SimpleObjectProperty<>(entries.get(0));
|
selected = new SimpleObjectProperty<>(entries.get(0));
|
||||||
|
|
||||||
shortcut(new KeyCodeCombination(KeyCode.V, KeyCombination.SHORTCUT_DOWN), structure -> {
|
shortcut(new KeyCodeCombination(KeyCode.V, KeyCombination.SHORTCUT_DOWN), structure -> {
|
||||||
AppActionDetector.detectOnPaste();
|
AppActionLinkDetector.detectOnPaste();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -66,7 +66,7 @@ public class App extends Application {
|
||||||
var content = new AppLayoutComp();
|
var content = new AppLayoutComp();
|
||||||
content.apply(struc -> {
|
content.apply(struc -> {
|
||||||
struc.get().addEventFilter(MouseEvent.MOUSE_CLICKED, event -> {
|
struc.get().addEventFilter(MouseEvent.MOUSE_CLICKED, event -> {
|
||||||
AppActionDetector.detectOnFocus();
|
AppActionLinkDetector.detectOnFocus();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
var title = String.format("X-Pipe Desktop (%s)", AppProperties.get().getVersion());
|
var title = String.format("X-Pipe Desktop (%s)", AppProperties.get().getVersion());
|
||||||
|
|
|
@ -8,7 +8,7 @@ import javafx.scene.input.DataFormat;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
public class AppActionDetector {
|
public class AppActionLinkDetector {
|
||||||
|
|
||||||
private static String lastDetectedAction;
|
private static String lastDetectedAction;
|
||||||
|
|
||||||
|
@ -34,6 +34,10 @@ public class AppActionDetector {
|
||||||
LauncherInput.handle(List.of(content));
|
LauncherInput.handle(List.of(content));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void setLastDetectedAction(String s) {
|
||||||
|
lastDetectedAction = s;
|
||||||
|
}
|
||||||
|
|
||||||
public static void detectOnFocus() {
|
public static void detectOnFocus() {
|
||||||
var content = getClipboardAction();
|
var content = getClipboardAction();
|
||||||
if (content == null) {
|
if (content == null) {
|
|
@ -83,7 +83,8 @@ public class ErrorHandlerComp extends SimpleComp {
|
||||||
if (desc == null) {
|
if (desc == null) {
|
||||||
desc = I18n.get("errorNoDetail");
|
desc = I18n.get("errorNoDetail");
|
||||||
}
|
}
|
||||||
var top = JfxHelper.createNamedEntry(I18n.get(headerId), desc, graphic);
|
var limitedDescription = desc.substring(0, Math.min(1000, desc.length()));
|
||||||
|
var top = JfxHelper.createNamedEntry(I18n.get(headerId), limitedDescription, graphic);
|
||||||
|
|
||||||
var content = new VBox(top, new Separator(Orientation.HORIZONTAL));
|
var content = new VBox(top, new Separator(Orientation.HORIZONTAL));
|
||||||
if (event.isReportable()) {
|
if (event.isReportable()) {
|
||||||
|
|
|
@ -112,8 +112,6 @@ public class AppPrefs {
|
||||||
private final BooleanField automaticallyUpdateField = BooleanField.ofBooleanType(automaticallyUpdate)
|
private final BooleanField automaticallyUpdateField = BooleanField.ofBooleanType(automaticallyUpdate)
|
||||||
.editable(AppDistributionType.get().supportsUpdate())
|
.editable(AppDistributionType.get().supportsUpdate())
|
||||||
.render(() -> new ToggleControl());
|
.render(() -> new ToggleControl());
|
||||||
private final BooleanProperty sendAnonymousErrorReports = typed(new SimpleBooleanProperty(true), Boolean.class);
|
|
||||||
private final BooleanProperty sendUsageStatistics = typed(new SimpleBooleanProperty(true), Boolean.class);
|
|
||||||
private final BooleanProperty updateToPrereleases = typed(new SimpleBooleanProperty(true), Boolean.class);
|
private final BooleanProperty updateToPrereleases = typed(new SimpleBooleanProperty(true), Boolean.class);
|
||||||
private final BooleanProperty confirmDeletions = typed(new SimpleBooleanProperty(true), Boolean.class);
|
private final BooleanProperty confirmDeletions = typed(new SimpleBooleanProperty(true), Boolean.class);
|
||||||
|
|
||||||
|
@ -282,14 +280,6 @@ public class AppPrefs {
|
||||||
// Developer mode
|
// Developer mode
|
||||||
// ==============
|
// ==============
|
||||||
|
|
||||||
public ReadOnlyBooleanProperty sendAnonymousErrorReports() {
|
|
||||||
return sendAnonymousErrorReports;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ReadOnlyBooleanProperty sendUsageStatistics() {
|
|
||||||
return sendUsageStatistics;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ReadOnlyBooleanProperty updateToPrereleases() {
|
public ReadOnlyBooleanProperty updateToPrereleases() {
|
||||||
return updateToPrereleases;
|
return updateToPrereleases;
|
||||||
}
|
}
|
||||||
|
@ -386,8 +376,6 @@ public class AppPrefs {
|
||||||
externalStartupBehaviour),
|
externalStartupBehaviour),
|
||||||
Setting.of("closeBehaviour", closeBehaviourControl, closeBehaviour),
|
Setting.of("closeBehaviour", closeBehaviourControl, closeBehaviour),
|
||||||
Setting.of("automaticallyUpdate", automaticallyUpdateField, automaticallyUpdate),
|
Setting.of("automaticallyUpdate", automaticallyUpdateField, automaticallyUpdate),
|
||||||
Setting.of("sendAnonymousErrorReports", sendAnonymousErrorReports),
|
|
||||||
Setting.of("sendUsageStatistics", sendUsageStatistics),
|
|
||||||
Setting.of("storageDirectory", storageDirectoryControl, internalStorageDirectory),
|
Setting.of("storageDirectory", storageDirectoryControl, internalStorageDirectory),
|
||||||
Setting.of("logLevel", logLevelField, internalLogLevel))),
|
Setting.of("logLevel", logLevelField, internalLogLevel))),
|
||||||
Category.of(
|
Category.of(
|
||||||
|
|
|
@ -21,7 +21,7 @@ public class ProxyManagerProviderImpl extends ProxyManagerProvider {
|
||||||
alert.setAlertType(Alert.AlertType.CONFIRMATION);
|
alert.setAlertType(Alert.AlertType.CONFIRMATION);
|
||||||
alert.setTitle(I18n.get("connectorInstallationTitle"));
|
alert.setTitle(I18n.get("connectorInstallationTitle"));
|
||||||
alert.setHeaderText(I18n.get("connectorInstallationHeader"));
|
alert.setHeaderText(I18n.get("connectorInstallationHeader"));
|
||||||
alert.setContentText(I18n.get("connectorInstallationContent"));
|
alert.getDialogPane().setContent(AppWindowHelper.alertContentText(I18n.get("connectorInstallationContent")));
|
||||||
})
|
})
|
||||||
.filter(buttonType -> buttonType.getButtonData().isDefaultButton())
|
.filter(buttonType -> buttonType.getButtonData().isDefaultButton())
|
||||||
.isPresent();
|
.isPresent();
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
connectorInstallationTitle=X-Pipe Connector
|
connectorInstallationTitle=X-Pipe Connector
|
||||||
connectorInstallationHeader=Would you like to install the X-Pipe connector on that host?
|
connectorInstallationHeader=Would you like to install the X-Pipe connector on that host?
|
||||||
connectorInstallationContent=Some operations require the X-Pipe connector to be installed on the host.\nNote that this operation may take some time.
|
connectorInstallationContent=Some operations require the X-Pipe connector to be installed on the host. Note that this operation may take some time.
|
||||||
errorOccured=An error occured
|
errorOccured=An error occured
|
||||||
terminalErrorOccured=A terminal error occured
|
terminalErrorOccured=A terminal error occured
|
||||||
errorTypeOccured=An exception of type $TYPE$ was thrown
|
errorTypeOccured=An exception of type $TYPE$ was thrown
|
||||||
|
|
7
beacon/LICENSE.md
Normal file
7
beacon/LICENSE.md
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
Copyright 2022 Christopher Schnick
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
@ -261,6 +261,8 @@ graalvmNative {
|
||||||
'-Dpicocli.converters.excludes=java.time.*,java.sql.*'
|
'-Dpicocli.converters.excludes=java.time.*,java.sql.*'
|
||||||
)
|
)
|
||||||
buildArgs.addAll(
|
buildArgs.addAll(
|
||||||
|
'--static',
|
||||||
|
'--libc=musl',
|
||||||
// '--debug-attach=8000',
|
// '--debug-attach=8000',
|
||||||
'--enable-https',
|
'--enable-https',
|
||||||
'--install-exit-handlers',
|
'--install-exit-handlers',
|
||||||
|
|
7
core/LICENSE.md
Normal file
7
core/LICENSE.md
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
Copyright 2022 Christopher Schnick
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
@ -7,6 +7,8 @@ import java.util.function.Consumer;
|
||||||
|
|
||||||
public interface CommandProcessControl extends ProcessControl {
|
public interface CommandProcessControl extends ProcessControl {
|
||||||
|
|
||||||
|
public CommandProcessControl doesNotObeyReturnValueConvention();
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public CommandProcessControl sensitive();
|
public CommandProcessControl sensitive();
|
||||||
CommandProcessControl complex();
|
CommandProcessControl complex();
|
||||||
|
|
2
dist/version
vendored
2
dist/version
vendored
|
@ -1 +1 @@
|
||||||
0.4.21
|
0.4.22
|
|
@ -1,15 +1,16 @@
|
||||||
package io.xpipe.ext.base.actions;
|
package io.xpipe.ext.base.actions;
|
||||||
|
|
||||||
|
import io.xpipe.app.core.AppActionLinkDetector;
|
||||||
import io.xpipe.core.store.DataStore;
|
import io.xpipe.core.store.DataStore;
|
||||||
import io.xpipe.core.util.SecretValue;
|
import io.xpipe.core.util.SecretValue;
|
||||||
import io.xpipe.extension.DataStoreActionProvider;
|
import io.xpipe.extension.DataStoreActionProvider;
|
||||||
import io.xpipe.extension.DataStoreProviders;
|
import io.xpipe.extension.DataStoreProviders;
|
||||||
import io.xpipe.extension.I18n;
|
import io.xpipe.extension.I18n;
|
||||||
import javafx.beans.value.ObservableValue;
|
import javafx.beans.value.ObservableValue;
|
||||||
import javafx.scene.input.Clipboard;
|
|
||||||
import javafx.scene.input.DataFormat;
|
|
||||||
|
|
||||||
import java.util.Map;
|
import java.awt.*;
|
||||||
|
import java.awt.datatransfer.Clipboard;
|
||||||
|
import java.awt.datatransfer.StringSelection;
|
||||||
|
|
||||||
public class ShareStoreAction implements DataStoreActionProvider<DataStore> {
|
public class ShareStoreAction implements DataStoreActionProvider<DataStore> {
|
||||||
|
|
||||||
|
@ -45,6 +46,9 @@ public class ShareStoreAction implements DataStoreActionProvider<DataStore> {
|
||||||
@Override
|
@Override
|
||||||
public void execute(DataStore store) throws Exception {
|
public void execute(DataStore store) throws Exception {
|
||||||
var string = create(store);
|
var string = create(store);
|
||||||
Clipboard.getSystemClipboard().setContent(Map.of(DataFormat.PLAIN_TEXT, string, DataFormat.URL, string));
|
var selection = new StringSelection(string);
|
||||||
|
Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
|
||||||
|
AppActionLinkDetector.setLastDetectedAction(string);
|
||||||
|
clipboard.setContents(selection, selection);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -34,6 +34,12 @@ public class SaveSourceTarget implements DataSourceTarget {
|
||||||
var storageGroup = new SimpleObjectProperty<DataSourceCollection>();
|
var storageGroup = new SimpleObjectProperty<DataSourceCollection>();
|
||||||
var dataSourceEntry = new SimpleObjectProperty<DataSourceEntry>();
|
var dataSourceEntry = new SimpleObjectProperty<DataSourceEntry>();
|
||||||
SimpleChangeListener.apply(id, val -> {
|
SimpleChangeListener.apply(id, val -> {
|
||||||
|
if (val == null) {
|
||||||
|
storageGroup.set(null);
|
||||||
|
dataSourceEntry.set(null);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
storageGroup.set(
|
storageGroup.set(
|
||||||
SourceCollectionViewState.get().getSelectedGroup() != null
|
SourceCollectionViewState.get().getSelectedGroup() != null
|
||||||
? SourceCollectionViewState.get().getSelectedGroup().getCollection()
|
? SourceCollectionViewState.get().getSelectedGroup().getCollection()
|
||||||
|
|
|
@ -9,19 +9,12 @@ import io.xpipe.extension.DataStoreActionProvider;
|
||||||
import io.xpipe.extension.DataStoreProvider;
|
import io.xpipe.extension.DataStoreProvider;
|
||||||
import io.xpipe.extension.DataSourceTarget;
|
import io.xpipe.extension.DataSourceTarget;
|
||||||
|
|
||||||
module io.xpipe.ext.base {
|
open module io.xpipe.ext.base {
|
||||||
exports io.xpipe.ext.base;
|
exports io.xpipe.ext.base;
|
||||||
|
|
||||||
opens io.xpipe.ext.base;
|
|
||||||
|
|
||||||
exports io.xpipe.ext.base.apps;
|
exports io.xpipe.ext.base.apps;
|
||||||
|
|
||||||
opens io.xpipe.ext.base.apps;
|
|
||||||
|
|
||||||
exports io.xpipe.ext.base.actions;
|
exports io.xpipe.ext.base.actions;
|
||||||
|
|
||||||
opens io.xpipe.ext.base.actions;
|
requires java.desktop;
|
||||||
|
|
||||||
requires io.xpipe.core;
|
requires io.xpipe.core;
|
||||||
requires io.xpipe.extension;
|
requires io.xpipe.extension;
|
||||||
requires com.fasterxml.jackson.databind;
|
requires com.fasterxml.jackson.databind;
|
||||||
|
|
|
@ -27,8 +27,8 @@ dependencies {
|
||||||
testImplementation project(':app')
|
testImplementation project(':app')
|
||||||
testImplementation 'org.apache.commons:commons-lang3:3.12.0'
|
testImplementation 'org.apache.commons:commons-lang3:3.12.0'
|
||||||
implementation 'org.apache.commons:commons-exec:1.3'
|
implementation 'org.apache.commons:commons-exec:1.3'
|
||||||
compileOnly name: 'preferencesfx-core-lazy-11.11.0'
|
compileOnly group: 'com.dlsc.preferencesfx', name: 'preferencesfx-core', version: '11.15.0'
|
||||||
compileOnly name: 'formsfx-core-lazy-11.5.0'
|
compileOnly group: 'com.dlsc.formsfx', name: 'formsfx-core', version: '11.6.0'
|
||||||
}
|
}
|
||||||
|
|
||||||
List<String> jvmDevArgs = [
|
List<String> jvmDevArgs = [
|
||||||
|
|
|
@ -58,6 +58,7 @@ public class CommandProcessControlImpl extends ProcessControlImpl implements Com
|
||||||
private String timedOutError;
|
private String timedOutError;
|
||||||
private Integer exitTimeout;
|
private Integer exitTimeout;
|
||||||
private boolean complex;
|
private boolean complex;
|
||||||
|
private boolean obeysReturnValueConvention = true;
|
||||||
|
|
||||||
public CommandProcessControlImpl(
|
public CommandProcessControlImpl(
|
||||||
ShellProcessControl parent,
|
ShellProcessControl parent,
|
||||||
|
@ -68,6 +69,12 @@ public class CommandProcessControlImpl extends ProcessControlImpl implements Com
|
||||||
this.terminalCommand = terminalCommand;
|
this.terminalCommand = terminalCommand;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public CommandProcessControl doesNotObeyReturnValueConvention() {
|
||||||
|
this.obeysReturnValueConvention = false;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public CommandProcessControl sensitive() {
|
public CommandProcessControl sensitive() {
|
||||||
this.sensitive = true;
|
this.sensitive = true;
|
||||||
|
@ -413,7 +420,8 @@ public class CommandProcessControlImpl extends ProcessControlImpl implements Com
|
||||||
}
|
}
|
||||||
|
|
||||||
var exitCode = getExitCode();
|
var exitCode = getExitCode();
|
||||||
if (exitCode == 0 && !(read.get().isEmpty() && !readError.get().isEmpty())) {
|
var success = (obeysReturnValueConvention && exitCode == 0) || (!obeysReturnValueConvention && !(read.get().isEmpty() && !readError.get().isEmpty()));
|
||||||
|
if (success) {
|
||||||
return read.get().trim();
|
return read.get().trim();
|
||||||
} else {
|
} else {
|
||||||
throw new ProcessOutputException(
|
throw new ProcessOutputException(
|
||||||
|
@ -446,7 +454,8 @@ public class CommandProcessControlImpl extends ProcessControlImpl implements Com
|
||||||
}
|
}
|
||||||
|
|
||||||
var exitCode = getExitCode();
|
var exitCode = getExitCode();
|
||||||
if (exitCode != 0 || (read.get().isEmpty() && !readError.get().isEmpty())) {
|
var success = (obeysReturnValueConvention && exitCode == 0) || (!obeysReturnValueConvention && !(read.get().isEmpty() && !readError.get().isEmpty()));
|
||||||
|
if (!success) {
|
||||||
throw new ProcessOutputException(
|
throw new ProcessOutputException(
|
||||||
"Command returned with " + exitCode + ": " + readError.get().trim());
|
"Command returned with " + exitCode + ": " + readError.get().trim());
|
||||||
}
|
}
|
||||||
|
|
7
extension/LICENSE.md
Normal file
7
extension/LICENSE.md
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
Copyright 2022 Christopher Schnick
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
@ -35,8 +35,8 @@ dependencies {
|
||||||
compileOnly 'com.jfoenix:jfoenix:9.0.10'
|
compileOnly 'com.jfoenix:jfoenix:9.0.10'
|
||||||
compileOnly 'org.controlsfx:controlsfx:11.1.2'
|
compileOnly 'org.controlsfx:controlsfx:11.1.2'
|
||||||
compileOnly 'org.apache.commons:commons-lang3:3.12.0'
|
compileOnly 'org.apache.commons:commons-lang3:3.12.0'
|
||||||
compileOnly name: 'preferencesfx-core-lazy-11.11.0'
|
compileOnly group: 'com.dlsc.preferencesfx', name: 'preferencesfx-core', version: '11.15.0'
|
||||||
compileOnly name: 'formsfx-core-lazy-11.5.0'
|
compileOnly group: 'com.dlsc.formsfx', name: 'formsfx-core', version: '11.6.0'
|
||||||
}
|
}
|
||||||
|
|
||||||
task dist(type: Copy) {
|
task dist(type: Copy) {
|
||||||
|
|
Binary file not shown.
Binary file not shown.
Loading…
Reference in a new issue