mirror of
https://github.com/xpipe-io/xpipe.git
synced 2024-11-25 00:50:31 +00:00
Fix IDE complaints
This commit is contained in:
parent
3647d71b12
commit
fa9374c68d
81 changed files with 134 additions and 279 deletions
|
@ -14,7 +14,7 @@ import java.util.stream.Collectors;
|
|||
|
||||
public class BrowserAlerts {
|
||||
|
||||
public static enum FileConflictChoice {
|
||||
public enum FileConflictChoice {
|
||||
CANCEL,
|
||||
SKIP,
|
||||
SKIP_ALL,
|
||||
|
|
|
@ -109,7 +109,6 @@ final class BrowserBookmarkComp extends SimpleComp {
|
|||
@Override
|
||||
public void run() {
|
||||
if (activeTask != this) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Platform.runLater(() -> model.openExistingFileSystemIfPresent(store.asNeeded()));
|
||||
|
|
|
@ -66,7 +66,7 @@ public class BrowserBreadcrumbBar extends SimpleComp {
|
|||
var elements = FileNames.splitHierarchy(val);
|
||||
var modifiedElements = new ArrayList<>(elements);
|
||||
if (val.startsWith("/")) {
|
||||
modifiedElements.add(0, "/");
|
||||
modifiedElements.addFirst("/");
|
||||
}
|
||||
Breadcrumbs.BreadCrumbItem<String> items =
|
||||
Breadcrumbs.buildTreeModel(modifiedElements.toArray(String[]::new));
|
||||
|
|
|
@ -45,7 +45,7 @@ public class BrowserClipboard {
|
|||
.addFlavorListener(e -> ThreadHelper.runFailableAsync(new FailableRunnable<>() {
|
||||
@Override
|
||||
@SuppressWarnings("unchecked")
|
||||
public void run() throws Throwable {
|
||||
public void run() {
|
||||
Clipboard clipboard = (Clipboard) e.getSource();
|
||||
try {
|
||||
if (!clipboard.isDataFlavorAvailable(DataFlavor.javaFileListFlavor)) {
|
||||
|
|
|
@ -171,7 +171,7 @@ final class BrowserFileListComp extends SimpleComp {
|
|||
.mapToInt(entry -> table.getItems().indexOf(entry))
|
||||
.toArray();
|
||||
table.getSelectionModel()
|
||||
.selectIndices(table.getItems().indexOf(c.getList().get(0)), indices);
|
||||
.selectIndices(table.getItems().indexOf(c.getList().getFirst()), indices);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
@ -428,11 +428,8 @@ final class BrowserFileListComp extends SimpleComp {
|
|||
|
||||
private final StringProperty img = new SimpleStringProperty();
|
||||
private final StringProperty text = new SimpleStringProperty();
|
||||
private final Node imageView = new PrettySvgComp(img, 24, 24)
|
||||
.createRegion();
|
||||
private final StackPane textField =
|
||||
new LazyTextFieldComp(text).createStructure().get();
|
||||
private final HBox graphic;
|
||||
|
||||
private final BooleanProperty updating = new SimpleBooleanProperty();
|
||||
|
||||
|
@ -463,7 +460,8 @@ final class BrowserFileListComp extends SimpleComp {
|
|||
};
|
||||
text.addListener(listener);
|
||||
|
||||
graphic = new HBox(imageView, textField);
|
||||
Node imageView = new PrettySvgComp(img, 24, 24).createRegion();
|
||||
HBox graphic = new HBox(imageView, textField);
|
||||
graphic.setSpacing(10);
|
||||
graphic.setAlignment(Pos.CENTER_LEFT);
|
||||
HBox.setHgrow(textField, Priority.ALWAYS);
|
||||
|
|
|
@ -98,7 +98,7 @@ public class BrowserFileListCompEntry {
|
|||
return false;
|
||||
}
|
||||
|
||||
if (!Objects.equals(model.getFileSystemModel().getFileSystem(), cb.getEntries().get(0).getFileSystem())) {
|
||||
if (!Objects.equals(model.getFileSystemModel().getFileSystem(), cb.getEntries().getFirst().getFileSystem())) {
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
|
@ -9,7 +9,7 @@ import java.util.UUID;
|
|||
|
||||
public interface BrowserSavedState {
|
||||
|
||||
public void add(Entry entry);
|
||||
void add(Entry entry);
|
||||
|
||||
void save();
|
||||
|
||||
|
@ -18,7 +18,7 @@ public interface BrowserSavedState {
|
|||
@Value
|
||||
@Jacksonized
|
||||
@Builder
|
||||
public static class Entry {
|
||||
class Entry {
|
||||
|
||||
UUID uuid;
|
||||
String path;
|
||||
|
|
|
@ -103,8 +103,12 @@ public class BrowserTransferComp extends SimpleComp {
|
|||
struc.get().setOnDragDropped(event -> {
|
||||
// Accept drops from inside the app window
|
||||
if (event.getGestureSource() != null) {
|
||||
var files = BrowserClipboard.retrieveDrag(event.getDragboard())
|
||||
.getEntries();
|
||||
var drag = BrowserClipboard.retrieveDrag(event.getDragboard());
|
||||
if (drag == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
var files = drag.getEntries();
|
||||
model.drop(model.getBrowserModel().getSelected().getValue(), files);
|
||||
event.setDropCompleted(true);
|
||||
event.consume();
|
||||
|
|
|
@ -160,7 +160,7 @@ public class FileSystemHelper {
|
|||
}
|
||||
})
|
||||
.toList();
|
||||
dropFilesInto(entry, entries, false, p -> progress.accept(p));
|
||||
dropFilesInto(entry, entries, false, progress);
|
||||
}
|
||||
|
||||
public static void delete(List<FileSystem.FileEntry> files) {
|
||||
|
|
|
@ -161,10 +161,10 @@ public class OpenFileSystemSavedState {
|
|||
|
||||
var o = new RecentEntry(with, Instant.now());
|
||||
if (recentDirectories.size() < STORED) {
|
||||
recentDirectories.add(0, o);
|
||||
recentDirectories.addFirst(o);
|
||||
} else {
|
||||
recentDirectories.remove(recentDirectories.size() - 1);
|
||||
recentDirectories.add(0, o);
|
||||
recentDirectories.removeLast();
|
||||
recentDirectories.addFirst(o);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -47,7 +47,7 @@ public class StandaloneFileBrowser {
|
|||
.apply(struc -> AppFont.normal(struc.get()));
|
||||
var window = AppWindowHelper.sideWindow(AppI18n.get("openFileTitle"), stage -> comp, false, null);
|
||||
model.setOnFinish(fileStores -> {
|
||||
file.accept(fileStores.size() > 0 ? fileStores.get(0) : null);
|
||||
file.accept(fileStores.size() > 0 ? fileStores.getFirst() : null);
|
||||
window.close();
|
||||
});
|
||||
window.show();
|
||||
|
@ -63,7 +63,7 @@ public class StandaloneFileBrowser {
|
|||
.apply(struc -> AppFont.normal(struc.get()));
|
||||
var window = AppWindowHelper.sideWindow(AppI18n.get("saveFileTitle"), stage -> comp, true, null);
|
||||
model.setOnFinish(fileStores -> {
|
||||
file.setValue(fileStores.size() > 0 ? fileStores.get(0) : null);
|
||||
file.setValue(fileStores.size() > 0 ? fileStores.getFirst() : null);
|
||||
window.close();
|
||||
});
|
||||
window.show();
|
||||
|
|
|
@ -39,7 +39,7 @@ public interface BrowserAction {
|
|||
.orElseThrow();
|
||||
}
|
||||
|
||||
default void init(OpenFileSystemModel model) throws Exception {}
|
||||
default void init(OpenFileSystemModel model) {}
|
||||
|
||||
default String getProFeatureId() {
|
||||
return null;
|
||||
|
|
|
@ -7,7 +7,7 @@ import java.util.List;
|
|||
public class BrowserActionFormatter {
|
||||
|
||||
public static String filesArgument(List<BrowserEntry> entries) {
|
||||
return entries.size() == 1 ? entries.get(0).getOptionallyQuotedFileName() : "(" + entries.size() + ")";
|
||||
return entries.size() == 1 ? entries.getFirst().getOptionallyQuotedFileName() : "(" + entries.size() + ")";
|
||||
}
|
||||
|
||||
public static String centerEllipsis(String input, int length) {
|
||||
|
|
|
@ -45,7 +45,7 @@ public class IntegratedTextAreaComp extends SimpleComp {
|
|||
c.getChildren().addAll(textArea, pane);
|
||||
return c;
|
||||
}),
|
||||
paths -> value.setValue(Files.readString(paths.get(0))));
|
||||
paths -> value.setValue(Files.readString(paths.getFirst())));
|
||||
return fileDrop.createRegion();
|
||||
}
|
||||
|
||||
|
|
|
@ -152,7 +152,7 @@ public class SideMenuBarComp extends Comp<CompStructure<VBox>> {
|
|||
filler.setMaxHeight(3000);
|
||||
vbox.getChildren().add(filler);
|
||||
VBox.setVgrow(filler, Priority.ALWAYS);
|
||||
filler.prefWidthProperty().bind(((Region) vbox.getChildren().get(0)).widthProperty());
|
||||
filler.prefWidthProperty().bind(((Region) vbox.getChildren().getFirst()).widthProperty());
|
||||
|
||||
vbox.getStyleClass().add("sidebar-comp");
|
||||
return new SimpleCompStructure<>(vbox);
|
||||
|
|
|
@ -36,13 +36,13 @@ public class SideSplitPaneComp extends Comp<SideSplitPaneComp.Structure> {
|
|||
}
|
||||
|
||||
if (!setInitial.get() && initialWidth != null) {
|
||||
r.getDividers().get(0).setPosition(initialWidth / newValue.doubleValue());
|
||||
r.getDividers().getFirst().setPosition(initialWidth / newValue.doubleValue());
|
||||
setInitial.set(true);
|
||||
}
|
||||
});
|
||||
|
||||
SplitPane.setResizableWithParent(sidebar, false);
|
||||
r.getDividers().get(0).positionProperty().addListener((observable, oldValue, newValue) -> {
|
||||
r.getDividers().getFirst().positionProperty().addListener((observable, oldValue, newValue) -> {
|
||||
if (r.getWidth() <= 0) {
|
||||
return;
|
||||
}
|
||||
|
@ -52,7 +52,7 @@ public class SideSplitPaneComp extends Comp<SideSplitPaneComp.Structure> {
|
|||
}
|
||||
});
|
||||
r.getStyleClass().add("side-split-pane-comp");
|
||||
return new Structure(sidebar, c, r, r.getDividers().get(0));
|
||||
return new Structure(sidebar, c, r, r.getDividers().getFirst());
|
||||
}
|
||||
|
||||
public SideSplitPaneComp withInitialWidth(double val) {
|
||||
|
|
|
@ -217,11 +217,11 @@ public abstract class StoreEntryComp extends SimpleComp {
|
|||
var settingsButton = createSettingsButton();
|
||||
list.add(settingsButton);
|
||||
if (list.size() > 1) {
|
||||
list.get(0).styleClass(Styles.LEFT_PILL);
|
||||
list.getFirst().styleClass(Styles.LEFT_PILL);
|
||||
for (int i = 1; i < list.size() - 1; i++) {
|
||||
list.get(i).styleClass(Styles.CENTER_PILL);
|
||||
}
|
||||
list.get(list.size() - 1).styleClass(Styles.RIGHT_PILL);
|
||||
list.getLast().styleClass(Styles.RIGHT_PILL);
|
||||
}
|
||||
list.forEach(comp -> {
|
||||
comp.apply(struc -> struc.get().getStyleClass().remove(Styles.FLAT));
|
||||
|
|
|
@ -116,16 +116,12 @@ public class AppExtensionManager {
|
|||
leafModuleLayers.add(extension.getModule().getLayer());
|
||||
}
|
||||
|
||||
if (leafModuleLayers.size() > 0) {
|
||||
var scl = ClassLoader.getSystemClassLoader();
|
||||
var cfs = leafModuleLayers.stream().map(ModuleLayer::configuration).toList();
|
||||
var finder = ModuleFinder.ofSystem();
|
||||
var cf = Configuration.resolve(finder, cfs, finder, List.of());
|
||||
extendedLayer = ModuleLayer.defineModulesWithOneLoader(cf, leafModuleLayers, scl)
|
||||
.layer();
|
||||
} else {
|
||||
extendedLayer = baseLayer;
|
||||
}
|
||||
}
|
||||
|
||||
private Optional<Extension> findAndParseExtension(String name, ModuleLayer parent) {
|
||||
|
|
|
@ -69,7 +69,7 @@ public class AppLayoutModel {
|
|||
}
|
||||
|
||||
public void selectBrowser() {
|
||||
selected.setValue(entries.get(0));
|
||||
selected.setValue(entries.getFirst());
|
||||
}
|
||||
|
||||
public void selectSettings() {
|
||||
|
|
|
@ -317,7 +317,7 @@ public class AppLogs {
|
|||
normalizedName = name;
|
||||
}
|
||||
|
||||
return loggers.computeIfAbsent(normalizedName, Slf4jLogger::new);
|
||||
return loggers.computeIfAbsent(normalizedName, s -> new Slf4jLogger());
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -347,12 +347,6 @@ public class AppLogs {
|
|||
|
||||
public static final class Slf4jLogger extends AbstractLogger {
|
||||
|
||||
private final String name;
|
||||
|
||||
public Slf4jLogger(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String getFullyQualifiedCallerName() {
|
||||
return "logger";
|
||||
|
|
|
@ -14,7 +14,6 @@ public class AppTrayIcon {
|
|||
|
||||
private final SystemTray tray;
|
||||
private final TrayIcon trayIcon;
|
||||
private final PopupMenu popupMenu = new PopupMenu();
|
||||
|
||||
public AppTrayIcon() {
|
||||
ensureSystemTraySupported();
|
||||
|
@ -28,6 +27,7 @@ public class AppTrayIcon {
|
|||
};
|
||||
var url = AppResources.getResourceURL(AppResources.XPIPE_MODULE, image).orElseThrow();
|
||||
|
||||
PopupMenu popupMenu = new PopupMenu();
|
||||
this.trayIcon = new TrayIcon(loadImageFromURL(url), App.getApp().getStage().getTitle(), popupMenu);
|
||||
this.trayIcon.setToolTip("XPipe");
|
||||
this.trayIcon.setImageAutoSize(true);
|
||||
|
|
|
@ -262,7 +262,6 @@ public class AppWindowHelper {
|
|||
if (event.getCode().equals(KeyCode.W) && event.isShortcutDown()) {
|
||||
stage.close();
|
||||
event.consume();
|
||||
return;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
|
|
@ -18,7 +18,7 @@ import java.util.Optional;
|
|||
public class AppAvCheck {
|
||||
|
||||
@Getter
|
||||
public static enum AvType {
|
||||
public enum AvType {
|
||||
|
||||
BITDEFENDER("Bitdefender") {
|
||||
@Override
|
||||
|
|
|
@ -10,7 +10,7 @@ public class TerminalLaunchExchangeImpl extends TerminalLaunchExchange
|
|||
implements MessageExchangeImpl<TerminalLaunchExchange.Request, TerminalLaunchExchange.Response> {
|
||||
|
||||
@Override
|
||||
public Response handleRequest(BeaconHandler handler, Request msg) throws ServerException, ClientException {
|
||||
public Response handleRequest(BeaconHandler handler, Request msg) throws ClientException {
|
||||
var r = TerminalLauncherManager.performLaunch(msg.getRequest());
|
||||
return Response.builder().targetFile(r).build();
|
||||
}
|
||||
|
|
|
@ -90,9 +90,7 @@ public class StoreAddExchangeImpl extends StoreAddExchange
|
|||
try {
|
||||
} catch (Exception ignored) {
|
||||
}
|
||||
if (d != null) {
|
||||
d = d.indent(2);
|
||||
}
|
||||
return "Successfully created data store " + name.get() + ":\n" + d;
|
||||
});
|
||||
|
||||
|
|
|
@ -89,7 +89,7 @@ public interface ActionProvider {
|
|||
|
||||
default Action createAction(URI uri) throws Exception {
|
||||
var args = new ArrayList<>(Arrays.asList(uri.getPath().substring(1).split("/")));
|
||||
args.add(0, uri.getHost());
|
||||
args.addFirst(uri.getHost());
|
||||
return createAction(args);
|
||||
}
|
||||
|
||||
|
|
|
@ -119,14 +119,14 @@ public interface DataStoreProvider {
|
|||
return null;
|
||||
}
|
||||
|
||||
default boolean init() throws Exception {
|
||||
default boolean init() {
|
||||
return true;
|
||||
}
|
||||
|
||||
default void postInit(){
|
||||
}
|
||||
|
||||
default void storageInit() throws Exception {}
|
||||
default void storageInit() {}
|
||||
|
||||
default boolean isShareableFromLocalMachine() {
|
||||
return false;
|
||||
|
@ -186,7 +186,7 @@ public interface DataStoreProvider {
|
|||
List<String> getPossibleNames();
|
||||
|
||||
default String getId() {
|
||||
return getPossibleNames().get(0);
|
||||
return getPossibleNames().getFirst();
|
||||
}
|
||||
|
||||
List<Class<?>> getStoreClasses();
|
||||
|
|
|
@ -62,7 +62,7 @@ public class DataStoreProviders {
|
|||
String.join("_", split),
|
||||
String.join("-", split),
|
||||
split.stream()
|
||||
.map(s -> s.equals(split.get(0)) ? s : s.substring(0, 1).toUpperCase() + s.substring(1))
|
||||
.map(s -> s.equals(split.getFirst()) ? s : s.substring(0, 1).toUpperCase() + s.substring(1))
|
||||
.collect(Collectors.joining()));
|
||||
}
|
||||
|
||||
|
|
|
@ -6,12 +6,10 @@ import io.xpipe.app.issue.TrackEvent;
|
|||
import io.xpipe.core.process.ProcessControlProvider;
|
||||
import io.xpipe.core.util.JacksonMapper;
|
||||
import io.xpipe.core.util.ModuleLayerLoader;
|
||||
import io.xpipe.core.util.ProxyFunction;
|
||||
|
||||
public class XPipeServiceProviders {
|
||||
|
||||
public static void load(ModuleLayer layer) {
|
||||
// TODO
|
||||
var hasDaemon = true;
|
||||
ModuleLayerLoader.loadAll(layer, hasDaemon, true, t -> {
|
||||
ErrorEvent.fromThrowable(t).handle();
|
||||
|
@ -33,10 +31,6 @@ public class XPipeServiceProviders {
|
|||
ErrorEvent.fromThrowable(t).handle();
|
||||
});
|
||||
|
||||
if (hasDaemon) {
|
||||
ProxyFunction.init(layer);
|
||||
}
|
||||
|
||||
TrackEvent.info("Finished loading extension providers");
|
||||
}
|
||||
}
|
||||
|
|
|
@ -101,7 +101,7 @@ public record CodeSnippet(List<CodeSnippet.Line> lines) {
|
|||
return this;
|
||||
}
|
||||
|
||||
var first = s.lines.get(0);
|
||||
var first = s.lines.getFirst();
|
||||
var line = new ArrayList<>(currentLine);
|
||||
line.addAll(first.elements);
|
||||
lines.add(new Line(new ArrayList<>(line)));
|
||||
|
|
|
@ -95,9 +95,9 @@ public class PrettyImageComp extends SimpleComp {
|
|||
image.set(fixed);
|
||||
|
||||
if (val == null) {
|
||||
stack.getChildren().get(0).setVisible(false);
|
||||
stack.getChildren().getFirst().setVisible(false);
|
||||
} else {
|
||||
stack.getChildren().get(0).setVisible(true);
|
||||
stack.getChildren().getFirst().setVisible(true);
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
@ -16,7 +16,7 @@ import java.util.Objects;
|
|||
public class SecretFieldComp extends Comp<CompStructure<TextField>> {
|
||||
|
||||
public static SecretFieldComp ofString(Property<String> s) {
|
||||
var prop = new SimpleObjectProperty<InPlaceSecretValue>(s.getValue() != null ? InPlaceSecretValue.of(s.getValue()) : null);
|
||||
var prop = new SimpleObjectProperty<>(s.getValue() != null ? InPlaceSecretValue.of(s.getValue()) : null);
|
||||
prop.addListener((observable, oldValue, newValue) -> {
|
||||
s.setValue(newValue != null ? new String(newValue.getSecret()) : null);
|
||||
});
|
||||
|
|
|
@ -56,12 +56,12 @@ public class ToggleGroupComp<T> extends Comp<CompStructure<HBox>> {
|
|||
}
|
||||
|
||||
if (box.getChildren().size() > 0) {
|
||||
box.getChildren().get(0).getStyleClass().add(Styles.LEFT_PILL);
|
||||
box.getChildren().getFirst().getStyleClass().add(Styles.LEFT_PILL);
|
||||
for (int i = 1; i < box.getChildren().size() - 1; i++) {
|
||||
box.getChildren().get(i).getStyleClass().add(Styles.CENTER_PILL);
|
||||
}
|
||||
box.getChildren()
|
||||
.get(box.getChildren().size() - 1)
|
||||
.getLast()
|
||||
.getStyleClass()
|
||||
.add(Styles.RIGHT_PILL);
|
||||
}
|
||||
|
|
|
@ -21,7 +21,12 @@ public class AttachmentHelper {
|
|||
|
||||
private static void compressDirectoryToZipfile(Path rootDir, Path sourceDir, ZipOutputStream out)
|
||||
throws IOException {
|
||||
for (File file : sourceDir.toFile().listFiles()) {
|
||||
var files = sourceDir.toFile().listFiles();
|
||||
if (files == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
for (File file : files) {
|
||||
if (file.isDirectory()) {
|
||||
compressDirectoryToZipfile(rootDir, sourceDir.resolve(file.getName()), out);
|
||||
} else {
|
||||
|
|
|
@ -106,7 +106,7 @@ public class ErrorHandlerComp extends SimpleComp {
|
|||
Platform.runLater(() -> {
|
||||
if (!showing.get()) {
|
||||
showing.set(true);
|
||||
Stage window = null;
|
||||
Stage window;
|
||||
try {
|
||||
window = AppWindowHelper.sideWindow(AppI18n.get("errorHandler"), w -> {
|
||||
return setUpComp(event, w, finishLatch);
|
||||
|
|
|
@ -402,13 +402,13 @@ public class AppPrefs {
|
|||
|
||||
@SuppressWarnings("unchecked")
|
||||
private <T> T map(T o, String name, Class<?> clazz) {
|
||||
mapping.add(new Mapping<T>(name, (Property<T>) o, (Class<T>) clazz));
|
||||
mapping.add(new Mapping<>(name, (Property<T>) o, (Class<T>) clazz));
|
||||
return o;
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
private <T> T mapVaultSpecific(T o, String name, Class<?> clazz) {
|
||||
mapping.add(new Mapping<T>(name, (Property<T>) o, (Class<T>) clazz, true));
|
||||
mapping.add(new Mapping<>(name, (Property<T>) o, (Class<T>) clazz, true));
|
||||
return o;
|
||||
}
|
||||
|
||||
|
@ -485,7 +485,7 @@ public class AppPrefs {
|
|||
|
||||
@Override
|
||||
public <T> void addSetting(String id, Class<T> c, Property<T> property, Comp<?> comp) {
|
||||
var m = new Mapping<T>(id, property, c);
|
||||
var m = new Mapping<>(id, property, c);
|
||||
customEntries.put(m,comp);
|
||||
mapping.add(m);
|
||||
}
|
||||
|
|
|
@ -27,7 +27,7 @@ public interface ExternalTerminalType extends PrefsChoiceValue {
|
|||
|
||||
@Override
|
||||
protected CommandBuilder toCommand(LaunchConfiguration configuration) {
|
||||
if (configuration.getScriptDialect().equals(CMD)) {
|
||||
if (configuration.getScriptDialect().equals(ShellDialects.CMD)) {
|
||||
return CommandBuilder.of()
|
||||
.add("/c")
|
||||
.add(configuration.getScriptFile());
|
||||
|
|
|
@ -25,7 +25,6 @@ public class DataStateProviderImpl extends DataStateProvider {
|
|||
}
|
||||
|
||||
@Override
|
||||
@SuppressWarnings("unchecked")
|
||||
public <T extends DataStoreState> T getState(DataStore store, Supplier<T> def) {
|
||||
if (DataStorage.get() == null) {
|
||||
return def.get();
|
||||
|
|
|
@ -417,7 +417,7 @@ public abstract class DataStorage {
|
|||
.toList();
|
||||
|
||||
toDelete.forEach(entry -> entry.finalizeEntry());
|
||||
this.storeEntriesSet.removeAll(toDelete);
|
||||
toDelete.forEach(this.storeEntriesSet::remove);
|
||||
this.listeners.forEach(l -> l.onStoreRemove(toDelete.toArray(DataStoreEntry[]::new)));
|
||||
refreshValidities(false);
|
||||
saveAsync();
|
||||
|
@ -571,7 +571,7 @@ public abstract class DataStorage {
|
|||
|
||||
public boolean isRootEntry(DataStoreEntry entry) {
|
||||
var noParent = DataStorage.get().getDefaultDisplayParent(entry).isEmpty();
|
||||
var diffParentCategory = DataStorage.get()
|
||||
boolean diffParentCategory = DataStorage.get()
|
||||
.getDefaultDisplayParent(entry)
|
||||
.map(p -> !p.getCategoryUuid().equals(entry.getCategoryUuid()))
|
||||
.orElse(false);
|
||||
|
@ -695,7 +695,7 @@ public abstract class DataStorage {
|
|||
break;
|
||||
}
|
||||
|
||||
es.add(0, current);
|
||||
es.addFirst(current);
|
||||
}
|
||||
|
||||
return es;
|
||||
|
@ -709,7 +709,7 @@ public abstract class DataStorage {
|
|||
}
|
||||
|
||||
public Optional<DataStoreEntry> getStoreEntryIfPresent(@NonNull DataStoreId id) {
|
||||
var current = getStoreEntryIfPresent(id.getNames().get(0));
|
||||
var current = getStoreEntryIfPresent(id.getNames().getFirst());
|
||||
if (current.isPresent()) {
|
||||
for (int i = 1; i < id.getNames().size(); i++) {
|
||||
var children = getStoreChildren(current.get());
|
||||
|
|
|
@ -40,10 +40,6 @@ public class StandardStorage extends DataStorage {
|
|||
return vaultKey;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onReset() {
|
||||
}
|
||||
|
||||
private void deleteLeftovers() {
|
||||
var storesDir = getStoresDir();
|
||||
var categoriesDir = getCategoriesDir();
|
||||
|
@ -190,7 +186,7 @@ public class StandardStorage extends DataStorage {
|
|||
c.ifPresent(storeCategories::add);
|
||||
} catch (IOException ex) {
|
||||
// IO exceptions are not expected
|
||||
exception.set(new IOException("Unable to load data from " + path.toString() + ". Is it corrupted?", ex));
|
||||
exception.set(new IOException("Unable to load data from " + path + ". Is it corrupted?", ex));
|
||||
directoriesToKeep.add(path);
|
||||
} catch (Exception ex) {
|
||||
// Data corruption and schema changes are expected
|
||||
|
@ -229,7 +225,7 @@ public class StandardStorage extends DataStorage {
|
|||
storeEntries.put(entry.get(), entry.get());
|
||||
} catch (IOException ex) {
|
||||
// IO exceptions are not expected
|
||||
exception.set(new IOException("Unable to load data from " + path.toString() + ". Is it corrupted?", ex));
|
||||
exception.set(new IOException("Unable to load data from " + path + ". Is it corrupted?", ex));
|
||||
directoriesToKeep.add(path);
|
||||
} catch (Exception ex) {
|
||||
// Data corruption and schema changes are expected
|
||||
|
|
|
@ -65,7 +65,7 @@ public class JfxHelper {
|
|||
}
|
||||
|
||||
var size = 40;
|
||||
var graphic = PrettyImageHelper.ofFixedSquare(image, (int) size).createRegion();
|
||||
var graphic = PrettyImageHelper.ofFixedSquare(image, size).createRegion();
|
||||
|
||||
var hbox = new HBox(graphic, text);
|
||||
hbox.setAlignment(Pos.CENTER_LEFT);
|
||||
|
|
|
@ -12,5 +12,5 @@ public interface LicensedFeature {
|
|||
|
||||
boolean isPreviewSupported();
|
||||
|
||||
public void throwIfUnsupported() throws LicenseRequiredException;
|
||||
void throwIfUnsupported() throws LicenseRequiredException;
|
||||
}
|
||||
|
|
|
@ -12,12 +12,12 @@ public class LocalShell {
|
|||
private static ShellControl local;
|
||||
private static ShellControl localPowershell;
|
||||
|
||||
public static void init() throws Exception {
|
||||
public static void init() {
|
||||
local = ProcessControlProvider.get().createLocalProcessControl(false).start();
|
||||
localCache = new ShellControlCache(local);
|
||||
}
|
||||
|
||||
public static ShellControl getLocalPowershell() throws Exception {
|
||||
public static ShellControl getLocalPowershell() {
|
||||
if (localPowershell == null) {
|
||||
localPowershell = ProcessControlProvider.get().createLocalProcessControl(true)
|
||||
.subShell(ShellDialects.POWERSHELL)
|
||||
|
|
|
@ -51,7 +51,7 @@ public class NamedCharacter {
|
|||
.findFirst()
|
||||
.orElse(null);
|
||||
if (byChar != null) {
|
||||
return byChar.getNames().get(0);
|
||||
return byChar.getNames().getFirst();
|
||||
}
|
||||
|
||||
return value.toString();
|
||||
|
|
|
@ -169,7 +169,7 @@ public class OptionsBuilder {
|
|||
|
||||
public OptionsBuilder nonNull() {
|
||||
var e = lastNameReference;
|
||||
var p = props.get(props.size() - 1);
|
||||
var p = props.getLast();
|
||||
return check(Validator.nonNull(ownValidator, e, p));
|
||||
}
|
||||
|
||||
|
@ -180,19 +180,19 @@ public class OptionsBuilder {
|
|||
|
||||
public OptionsBuilder nonEmpty() {
|
||||
var e = lastNameReference;
|
||||
var p = props.get(props.size() - 1);
|
||||
var p = props.getLast();
|
||||
return check(Validator.nonEmpty(ownValidator, e, (ReadOnlyListProperty<?>) p));
|
||||
}
|
||||
|
||||
public OptionsBuilder validate() {
|
||||
var e = lastNameReference;
|
||||
var p = props.get(props.size() - 1);
|
||||
var p = props.getLast();
|
||||
return check(Validator.nonNull(ownValidator, e, p));
|
||||
}
|
||||
|
||||
public OptionsBuilder nonNull(Validator v) {
|
||||
var e = lastNameReference;
|
||||
var p = props.get(props.size() - 1);
|
||||
var p = props.getLast();
|
||||
return check(Validator.nonNull(v, e, p));
|
||||
}
|
||||
|
||||
|
|
|
@ -23,12 +23,12 @@ public class ProxyManagerProviderImpl extends ProxyManagerProvider {
|
|||
}
|
||||
|
||||
@Override
|
||||
public Optional<String> checkCompatibility(ShellControl s) throws Exception {
|
||||
public Optional<String> checkCompatibility(ShellControl s) {
|
||||
return Optional.empty();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean setup(ShellControl s) throws Exception {
|
||||
public boolean setup(ShellControl s) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -71,7 +71,7 @@ public class ScanAlert {
|
|||
private final Function<DataStoreEntry, List<ScanProvider.ScanOperation>> applicable;
|
||||
private final Stage window;
|
||||
private final ObjectProperty<DataStoreEntryRef<ShellStore>> entry;
|
||||
private final ListProperty<ScanProvider.ScanOperation> selected = new SimpleListProperty<ScanProvider.ScanOperation>(FXCollections.observableArrayList());
|
||||
private final ListProperty<ScanProvider.ScanOperation> selected = new SimpleListProperty<>(FXCollections.observableArrayList());
|
||||
private final BooleanProperty busy = new SimpleBooleanProperty();
|
||||
|
||||
private Dialog(Stage window, DataStoreEntryRef<ShellStore> entry, Function<DataStoreEntry, List<ScanProvider.ScanOperation>> applicable) {
|
||||
|
@ -151,9 +151,7 @@ public class ScanAlert {
|
|||
}
|
||||
|
||||
selected.setAll(a.stream().filter(scanOperation -> scanOperation.isDefaultSelected() && !scanOperation.isDisabled()).toList());
|
||||
var r = new ListSelectorComp<ScanProvider.ScanOperation>(a,
|
||||
scanOperation -> AppI18n.get(scanOperation.getNameKey()),
|
||||
selected,scanOperation -> scanOperation.isDisabled(),
|
||||
var r = new ListSelectorComp<>(a, scanOperation -> AppI18n.get(scanOperation.getNameKey()), selected, scanOperation -> scanOperation.isDisabled(),
|
||||
a.size() > 3).createRegion();
|
||||
stackPane.getChildren().add(r);
|
||||
});
|
||||
|
|
|
@ -86,7 +86,7 @@ public class TerminalLauncherManager {
|
|||
return ((ResultSuccess) e.getResult()).getTargetScript();
|
||||
}
|
||||
|
||||
public static interface Result {}
|
||||
public interface Result {}
|
||||
|
||||
@Value
|
||||
public static class Entry {
|
||||
|
|
|
@ -16,7 +16,7 @@ import java.nio.file.Path;
|
|||
|
||||
public interface Validator {
|
||||
|
||||
public static Check absolutePath(Validator v, ObservableValue<Path> s) {
|
||||
static Check absolutePath(Validator v, ObservableValue<Path> s) {
|
||||
return v.createCheck().dependsOn("val", s).withMethod(c -> {
|
||||
if (c.get("val") == null || !((Path) c.get("val")).isAbsolute()) {
|
||||
c.error(AppI18n.get("app.notAnAbsolutePath"));
|
||||
|
@ -24,7 +24,7 @@ public interface Validator {
|
|||
});
|
||||
}
|
||||
|
||||
public static Check directory(Validator v, ObservableValue<Path> s) {
|
||||
static Check directory(Validator v, ObservableValue<Path> s) {
|
||||
return v.createCheck().dependsOn("val", s).withMethod(c -> {
|
||||
if (c.get("val") instanceof Path p && (!Files.exists(p) || !Files.isDirectory(p))) {
|
||||
c.error(AppI18n.get("app.notADirectory"));
|
||||
|
@ -107,8 +107,6 @@ public interface Validator {
|
|||
/**
|
||||
* Create a string property that depends on the validation result.
|
||||
* Each error message will be displayed on a separate line prefixed with a bullet.
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
StringBinding createStringBinding();
|
||||
|
||||
|
@ -117,7 +115,6 @@ public interface Validator {
|
|||
*
|
||||
* @param prefix The string to prefix each validation message with
|
||||
* @param separator The string to separate consecutive validation messages with
|
||||
* @return
|
||||
*/
|
||||
StringBinding createStringBinding(String prefix, String separator);
|
||||
}
|
||||
|
|
|
@ -92,9 +92,9 @@ project.ext {
|
|||
]
|
||||
useBundledJavaFx = fullVersion && !(platformName == 'linux' && arch == 'arm64')
|
||||
announce = System.getenv('SKIP_ANNOUNCEMENT') == null || !Boolean.parseBoolean(System.getenv('SKIP_ANNOUNCEMENT'))
|
||||
changelogFile = file("$projectDir/changelogs/${rootProject.versionString}.md").exists() ?
|
||||
file("$projectDir/changelogs/${rootProject.versionString}.md") :
|
||||
file("$projectDir/changelogs/${rootProject.canonicalVersionString}.md")
|
||||
changelogFile = file("$rootDir/dist/changelogs/${versionString}.md").exists() ?
|
||||
file("$rootDir/dist/changelogs/${versionString}.md") :
|
||||
file("$rootDir/dist/changelogs/${canonicalVersionString}.md")
|
||||
}
|
||||
|
||||
if (org.gradle.internal.os.OperatingSystem.current() == org.gradle.internal.os.OperatingSystem.LINUX) {
|
||||
|
|
|
@ -76,8 +76,7 @@ public abstract class Charsetter {
|
|||
}
|
||||
|
||||
public abstract Result read(
|
||||
FailableSupplier<InputStream> in, FailableConsumer<InputStreamReader, Exception> con)
|
||||
throws Exception;
|
||||
FailableSupplier<InputStream> in, FailableConsumer<InputStreamReader, Exception> con);
|
||||
|
||||
public Result detect(StreamDataStore store) throws Exception {
|
||||
Result result = new Result(null, null);
|
||||
|
|
|
@ -22,7 +22,7 @@ public enum NewLine {
|
|||
|
||||
public static NewLine platform() {
|
||||
return Arrays.stream(values())
|
||||
.filter(n -> n.getNewLineString().equals(System.getProperty("line.separator")))
|
||||
.filter(n -> n.getNewLineString().equals(System.lineSeparator()))
|
||||
.findFirst()
|
||||
.orElseThrow();
|
||||
}
|
||||
|
|
|
@ -169,7 +169,7 @@ public class StreamCharset {
|
|||
}
|
||||
|
||||
public String toString() {
|
||||
return getNames().get(0);
|
||||
return getNames().getFirst();
|
||||
}
|
||||
|
||||
public boolean hasByteOrderMark() {
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
package io.xpipe.core.dialog;
|
||||
|
||||
import io.xpipe.core.charsetter.Charsetter;
|
||||
import io.xpipe.core.util.FailableConsumer;
|
||||
import io.xpipe.core.util.FailableSupplier;
|
||||
import io.xpipe.core.util.SecretValue;
|
||||
|
@ -24,7 +23,7 @@ import java.util.function.Supplier;
|
|||
* The evaluation function can be set with {@link #evaluateTo(Supplier)}.
|
||||
* Alternatively, a dialogue can also copy the evaluation function of another dialogue with {@link #evaluateTo(Dialog)}.
|
||||
* An evaluation result can also be mapped to another type with {@link #map(Function)}.
|
||||
* It is also possible to listen for the completion of this dialogue with {@link #onCompletion(Charsetter.FailableConsumer)} )}.
|
||||
* It is also possible to listen for the completion of this dialogue with {@link #onCompletion(FailableConsumer)}.
|
||||
*/
|
||||
public abstract class Dialog {
|
||||
|
||||
|
@ -76,7 +75,6 @@ public abstract class Dialog {
|
|||
* @param description the shown question description
|
||||
* @param toString a function that maps the objects to a string
|
||||
* @param required signals whether choices required or can be left empty
|
||||
* @param quiet
|
||||
* @param def the element which is selected by default
|
||||
* @param vals the range of possible elements
|
||||
*/
|
||||
|
|
|
@ -154,7 +154,7 @@ public class CommandBuilder {
|
|||
}
|
||||
|
||||
public CommandBuilder prepend(Element e) {
|
||||
elements.add(0, e);
|
||||
elements.addFirst(e);
|
||||
return this;
|
||||
}
|
||||
|
||||
|
|
|
@ -6,7 +6,7 @@ import lombok.Getter;
|
|||
public interface ScriptSnippet {
|
||||
|
||||
@Getter
|
||||
public static enum ExecutionType {
|
||||
enum ExecutionType {
|
||||
@JsonProperty("dumbOnly")
|
||||
DUMB_ONLY("dumbOnly"),
|
||||
@JsonProperty("terminalOnly")
|
||||
|
|
|
@ -160,12 +160,12 @@ public interface ShellControl extends ProcessControl {
|
|||
var o = new ShellOpenFunction() {
|
||||
|
||||
@Override
|
||||
public CommandBuilder prepareWithoutInitCommand() throws Exception {
|
||||
public CommandBuilder prepareWithoutInitCommand() {
|
||||
return CommandBuilder.of().add(sc -> type.getLoginOpenCommand(sc));
|
||||
}
|
||||
|
||||
@Override
|
||||
public CommandBuilder prepareWithInitCommand(@NonNull String command) throws Exception {
|
||||
public CommandBuilder prepareWithInitCommand(@NonNull String command) {
|
||||
return CommandBuilder.ofString(command);
|
||||
}
|
||||
};
|
||||
|
@ -178,12 +178,12 @@ public interface ShellControl extends ProcessControl {
|
|||
var o = new ShellOpenFunction() {
|
||||
|
||||
@Override
|
||||
public CommandBuilder prepareWithoutInitCommand() throws Exception {
|
||||
public CommandBuilder prepareWithoutInitCommand() {
|
||||
return CommandBuilder.of().add(sc -> sc.getShellDialect().getLoginOpenCommand(sc));
|
||||
}
|
||||
|
||||
@Override
|
||||
public CommandBuilder prepareWithInitCommand(@NonNull String command) throws Exception {
|
||||
public CommandBuilder prepareWithInitCommand(@NonNull String command) {
|
||||
return CommandBuilder.ofString(command);
|
||||
}
|
||||
};
|
||||
|
|
|
@ -5,7 +5,7 @@ import java.util.UUID;
|
|||
|
||||
public interface ShellDialectAskpass {
|
||||
|
||||
String prepareStderrPassthroughContent(ShellControl sc, UUID requestId, String prefix) throws Exception;
|
||||
String prepareStderrPassthroughContent(ShellControl sc, UUID requestId, String prefix);
|
||||
|
||||
String prepareFixedContent(ShellControl sc, String fileName, List<String> s) throws Exception;
|
||||
|
||||
|
|
|
@ -52,12 +52,12 @@ public interface ShellDumbMode {
|
|||
}
|
||||
|
||||
@Override
|
||||
public void prepareDumbInit(ShellControl shellControl) throws Exception {
|
||||
public void prepareDumbInit(ShellControl shellControl) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void prepareDumbExit(ShellControl shellControl) throws IOException {
|
||||
public void prepareDumbExit(ShellControl shellControl) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
|
|
|
@ -7,12 +7,12 @@ public interface ShellOpenFunction {
|
|||
static ShellOpenFunction of(String b) {
|
||||
return new ShellOpenFunction() {
|
||||
@Override
|
||||
public CommandBuilder prepareWithoutInitCommand() throws Exception {
|
||||
public CommandBuilder prepareWithoutInitCommand() {
|
||||
return CommandBuilder.of().add(b);
|
||||
}
|
||||
|
||||
@Override
|
||||
public CommandBuilder prepareWithInitCommand(@NonNull String command) throws Exception {
|
||||
public CommandBuilder prepareWithInitCommand(@NonNull String command) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
};
|
||||
|
@ -21,12 +21,12 @@ public interface ShellOpenFunction {
|
|||
static ShellOpenFunction of(CommandBuilder b) {
|
||||
return new ShellOpenFunction() {
|
||||
@Override
|
||||
public CommandBuilder prepareWithoutInitCommand() throws Exception {
|
||||
public CommandBuilder prepareWithoutInitCommand() {
|
||||
return b;
|
||||
}
|
||||
|
||||
@Override
|
||||
public CommandBuilder prepareWithInitCommand(@NonNull String command) throws Exception {
|
||||
public CommandBuilder prepareWithInitCommand(@NonNull String command) {
|
||||
return CommandBuilder.ofString(command);
|
||||
}
|
||||
};
|
||||
|
|
|
@ -59,7 +59,7 @@ public class ConnectionFileSystem implements FileSystem {
|
|||
}
|
||||
|
||||
@Override
|
||||
public FileSystem open() throws Exception {
|
||||
public FileSystem open() {
|
||||
shellControl.start();
|
||||
return this;
|
||||
}
|
||||
|
|
|
@ -55,7 +55,7 @@ public class FileNames {
|
|||
return "";
|
||||
}
|
||||
|
||||
return components.get(components.size() - 1);
|
||||
return components.getLast();
|
||||
}
|
||||
|
||||
public static List<String> splitHierarchy(String file) {
|
||||
|
|
|
@ -100,7 +100,7 @@ public interface FileSystem extends Closeable, AutoCloseable {
|
|||
|
||||
Optional<ShellControl> getShell();
|
||||
|
||||
FileSystem open() throws Exception;
|
||||
FileSystem open();
|
||||
|
||||
InputStream openInput(String file) throws Exception;
|
||||
|
||||
|
|
|
@ -15,7 +15,7 @@ public interface ShellStore extends DataStore, LaunchableStore, FileSystemStore,
|
|||
}
|
||||
|
||||
@Override
|
||||
default ProcessControl prepareLaunchCommand() throws Exception {
|
||||
default ProcessControl prepareLaunchCommand() {
|
||||
return control();
|
||||
}
|
||||
|
||||
|
|
|
@ -17,7 +17,7 @@ public interface StreamDataStore extends DataStore {
|
|||
* Checks whether this store can be opened.
|
||||
* This can be not the case for example if the underlying store does not exist.
|
||||
*/
|
||||
default boolean canOpen() throws Exception {
|
||||
default boolean canOpen() {
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -35,7 +35,7 @@ public interface StreamDataStore extends DataStore {
|
|||
/**
|
||||
* Opens an input stream that can be used to read its data.
|
||||
*/
|
||||
default InputStream openInput() throws Exception {
|
||||
default InputStream openInput() {
|
||||
throw new UnsupportedOperationException("Can't open store input");
|
||||
}
|
||||
|
||||
|
@ -54,7 +54,7 @@ public interface StreamDataStore extends DataStore {
|
|||
/**
|
||||
* Opens an output stream that can be used to write data.
|
||||
*/
|
||||
default OutputStream openOutput() throws Exception {
|
||||
default OutputStream openOutput() {
|
||||
throw new UnsupportedOperationException("Can't open store output");
|
||||
}
|
||||
}
|
||||
|
|
|
@ -19,7 +19,7 @@ public abstract class ProxyManagerProvider {
|
|||
return INSTANCE;
|
||||
}
|
||||
|
||||
public abstract Optional<String> checkCompatibility(ShellControl pc) throws Exception;
|
||||
public abstract Optional<String> checkCompatibility(ShellControl pc);
|
||||
|
||||
public abstract boolean setup(ShellControl pc) throws Exception;
|
||||
public abstract boolean setup(ShellControl pc);
|
||||
}
|
||||
|
|
47
dist/changelogs/1.7.12_augmented.md
vendored
47
dist/changelogs/1.7.12_augmented.md
vendored
|
@ -1,47 +0,0 @@
|
|||
## New professional features
|
||||
|
||||
- Add ability to open files and directories in VSCode SSH remote environment in file browser
|
||||
- Added support for fully offline licenses. You can obtain them via email request
|
||||
in case you're running it on a system without internet connectivity or restricted proxy settings
|
||||
|
||||
## Changes
|
||||
|
||||
- Make current default shell also show up in shell environments to prevent confusion about missing bash environment
|
||||
- Improve error messages when an additional password was requested by the connection
|
||||
when none was provided instead of just showing permission denied
|
||||
- Make SSH connection starting from a WSL environment use the native Windows key helper for FIDO2 keys
|
||||
- Rework insights button for connection creation across the board
|
||||
|
||||
## Additions
|
||||
|
||||
- Add warning message if git vault URL was an HTTP URL and you are trying to use an SSH identity
|
||||
- Add ability to clone existing connections to make the process of adding similar connections easier
|
||||
- Add ability to debug local background shell in developer options
|
||||
- Add notice when a professional feature is available in preview mode
|
||||
- Add some more OS logos
|
||||
- Add check to verify whether font loading with fontconfig works on Linux on startup
|
||||
- Add more extensive note on first startup for potential issues when Malwarebytes, McAfee, or Bitdefender are installed
|
||||
|
||||
## Fixes
|
||||
|
||||
- Fix application not starting on Asahi Linux due to executable page size issue
|
||||
- Fix file existence check for SSH key files reporting wrong results on Windows in directory links/junctions
|
||||
- Fix k8s integration not working when user did not have permission to list nodes
|
||||
- Fix rare error when switching to tray operation mode on Linux
|
||||
- Fix connection state not being preserved when being added the first time
|
||||
- Fix application failing to start up if OS reported invalid screen size bounds
|
||||
- Fix VMware VM not being able to be parsed if configuration file did not specify an encoding or name
|
||||
- Fix startup failing when installation was located on a ramdisk
|
||||
- Fix some miscellaneous cache data being stored in the user home directory
|
||||
- Fix error handling when jump host chain formed a loop
|
||||
- Fix PowerShell remote sessions being blocked by execution policy
|
||||
- Fix race condition when locking user data directory
|
||||
- Fix some CLI commands not starting daemon correctly if it is not already running
|
||||
- Fix text field when showing askpass window not being focused automatically
|
||||
- Fix combobox selections not working well with keyboard-only workflows
|
||||
- Fix many possible small NullPointerExceptions
|
||||
|
||||
## Preview pro features
|
||||
|
||||
For anyone interested in giving any new professional features a try without having to commit to buying a full license,
|
||||
there is now a special preview mode available: Simply enter the license key `D18D1C9F-D3CB-49CA-A909-FF385DECD948` and get full access to newly released professional features for two weeks after their initial release date. In fact, you can try it out right now to get access to the new vscode file browser integration.
|
38
dist/changelogs/1.7.15_augmented.md
vendored
38
dist/changelogs/1.7.15_augmented.md
vendored
|
@ -1,38 +0,0 @@
|
|||
## Changes
|
||||
|
||||
- Add support to create customized SSH connections using arbitrary options.
|
||||
This can be done using the SSH config format but without having to create an actual file.
|
||||
- Unify all SSH connection types to support the same functionality.
|
||||
I.e. they all now support host key and identity file fixes plus can be used with SSH tunnels.
|
||||
- Make it possible to specify any identity to be used for SSH config connections
|
||||
- Properly detect when an active connection has unexpectedly reset during a file browser session.
|
||||
It will now be automatically restarted when any action is performed and fails.
|
||||
- Rework connection creation menu layout to give a better overview
|
||||
- Make the connection timeout value in the settings properly apply to ssh connections as well.
|
||||
This should help with SSH connections that take a long time to connect.
|
||||
- Include pre-rasterized images for various sizes to reduce the render load at runtime
|
||||
- Implement various performance improvements
|
||||
- Rework some UI elements to better work with keyboard navigation and screen readers
|
||||
- Add unsupported shell notice when restricted bash is detected
|
||||
- The daemon now properly reports any startup failure causes when started from the CLI via `xpipe open`
|
||||
- Regularly clean logs directory to free up older log files
|
||||
- Improve file browser handling in smaller window sizes
|
||||
- Add support for WezTerm and Windows Terminal Preview
|
||||
|
||||
## Fixes
|
||||
|
||||
- Fix application windows on Linux not initializing with the correct size
|
||||
- Fix connections to pfSense systems not working (This time properly)
|
||||
- Fix NullPointerException when a Linux system did not provide any release name
|
||||
- Fix startup errors when operating system reported invalid window sizes
|
||||
- Fix various Exceptions caused by race conditions
|
||||
|
||||
## Error reporter
|
||||
|
||||
It seems like the current built-in error reporter service is broken right now, so I might not receive your written user feedback from it.
|
||||
If you want to report any issues, please use another way until that is fixed.
|
||||
|
||||
## Future updates
|
||||
|
||||
The next upcoming update will probably be 1.8 with many new features and changes across the board.
|
||||
The first test versions will be announced on Discord and Slack if you are interested.
|
34
dist/changelogs/1.7.16_augmented.md
vendored
34
dist/changelogs/1.7.16_augmented.md
vendored
|
@ -1,34 +0,0 @@
|
|||
## SSH Timeouts and connection time
|
||||
|
||||
Over time, there have always been a few complaints about SSH connection timeout errors and slow SSH connection startup. These especially popped up in the latest release even though no obvious code was changed.
|
||||
|
||||
As it turns out, increasing the value for `ConnectTimeout` in SSH does not actually only change the timeout after which an error is thrown, it is also used by some servers as a guideline for their response time. E.g. if you specify a 10s timeout, some servers will always take 10s to respond. This is of course not mentioned in any of the spec but is more of an implementation choice.
|
||||
|
||||
In the latest release this caused more errors as the timeout was set higher. It should also have affected many SSH connections basically since the release of XPipe. I don't know how many people have been affected by this, it heavily depends on which ssh server and configuration your server runs. It happens for example on my proxmox instances and AWS EC2 instances. If your connections now start up much faster than before, then you were probably affected by it.
|
||||
|
||||
This release should fix all of these issues simply by not specifying a connect timeout at all. Great work there.
|
||||
|
||||
If you are using `ConnectTimeout` in your SSH configs, just remove it as it makes everything slower without having the effect of a timeout.
|
||||
|
||||
I would like to exchange a few words with whoever thought: *A newly connected SSH client specified a 10s connect timeout? That means our SSH server can sit around idle for 9 seconds. That is a great idea.*
|
||||
|
||||
## Fixes
|
||||
|
||||
- Fix annoying log directory errors that occurred on first startup
|
||||
- Fix SSH connections failing on Windows systems where the username contained non-ASCII characters due to an OpenSSH client bug by working around it
|
||||
- Fix SSH connection failing when another RemoteCommand was set in a config file
|
||||
- Fix child connection validity not updating when parent is changed from invalid to valid
|
||||
- Fix some applications launched on Windows, e.g. some terminals and editors, starting in minimized mode
|
||||
- Fix SSH config importer not handling file wildcards correctly when they also contained a file extension
|
||||
- Fix actions that shut down XPipe, e.g. automatic updates and debug mode, not correctly executing if it exited too fast
|
||||
- Fix error about nonexistent logs directory on first startup
|
||||
- Fix possible NullPointers when checking whether current SSH session has died
|
||||
|
||||
## Error reporter
|
||||
|
||||
It seems like the current built-in error reporter service is broken right now, so I might not receive your written user feedback from it.
|
||||
If you want to report any issues, please use another way until that is fixed.
|
||||
|
||||
## Previous changes in 1.7.15
|
||||
|
||||
- [1.7.15 changelog](https://github.com/xpipe-io/xpipe/releases/tag/1.7.15)
|
|
@ -22,7 +22,7 @@ public class RefreshStoreAction implements ActionProvider {
|
|||
}
|
||||
|
||||
@Override
|
||||
public void execute() throws Exception {
|
||||
public void execute() {
|
||||
DataStorage.get().refreshChildren(store);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -42,7 +42,7 @@ public class CopyPathAction implements BrowserAction, BranchAction {
|
|||
if (entries.size() == 1) {
|
||||
return " "
|
||||
+ BrowserActionFormatter.centerEllipsis(
|
||||
entries.get(0).getRawFileEntry().getPath(), 50);
|
||||
entries.getFirst().getRawFileEntry().getPath(), 50);
|
||||
}
|
||||
|
||||
return "Absolute Paths";
|
||||
|
@ -67,7 +67,7 @@ public class CopyPathAction implements BrowserAction, BranchAction {
|
|||
if (entries.size() == 1) {
|
||||
return " "
|
||||
+ BrowserActionFormatter.centerEllipsis(
|
||||
entries.get(0).getRawFileEntry().getPath(), 50);
|
||||
entries.getFirst().getRawFileEntry().getPath(), 50);
|
||||
}
|
||||
|
||||
return "Absolute Link Paths";
|
||||
|
@ -99,7 +99,7 @@ public class CopyPathAction implements BrowserAction, BranchAction {
|
|||
if (entries.size() == 1) {
|
||||
return "\""
|
||||
+ BrowserActionFormatter.centerEllipsis(
|
||||
entries.get(0).getRawFileEntry().getPath(), 50)
|
||||
entries.getFirst().getRawFileEntry().getPath(), 50)
|
||||
+ "\"";
|
||||
}
|
||||
|
||||
|
@ -127,7 +127,7 @@ public class CopyPathAction implements BrowserAction, BranchAction {
|
|||
if (entries.size() == 1) {
|
||||
return " "
|
||||
+ BrowserActionFormatter.centerEllipsis(
|
||||
FileNames.getFileName(entries.get(0)
|
||||
FileNames.getFileName(entries.getFirst()
|
||||
.getRawFileEntry()
|
||||
.getPath()),
|
||||
50);
|
||||
|
@ -157,7 +157,7 @@ public class CopyPathAction implements BrowserAction, BranchAction {
|
|||
if (entries.size() == 1) {
|
||||
return " "
|
||||
+ BrowserActionFormatter.centerEllipsis(
|
||||
FileNames.getFileName(entries.get(0)
|
||||
FileNames.getFileName(entries.getFirst()
|
||||
.getRawFileEntry()
|
||||
.getPath()),
|
||||
50);
|
||||
|
@ -199,7 +199,7 @@ public class CopyPathAction implements BrowserAction, BranchAction {
|
|||
if (entries.size() == 1) {
|
||||
return "\""
|
||||
+ BrowserActionFormatter.centerEllipsis(
|
||||
FileNames.getFileName(entries.get(0)
|
||||
FileNames.getFileName(entries.getFirst()
|
||||
.getRawFileEntry()
|
||||
.getPath()),
|
||||
50)
|
||||
|
|
|
@ -19,7 +19,7 @@ public class FollowLinkAction implements LeafAction {
|
|||
|
||||
@Override
|
||||
public void execute(OpenFileSystemModel model, List<BrowserEntry> entries) {
|
||||
var target = FileNames.getParent(entries.get(0).getRawFileEntry().resolved().getPath());
|
||||
var target = FileNames.getParent(entries.getFirst().getRawFileEntry().resolved().getPath());
|
||||
model.cdAsync(target);
|
||||
}
|
||||
|
||||
|
|
|
@ -37,7 +37,7 @@ public class NewItemAction implements BrowserAction, BranchAction {
|
|||
@Override
|
||||
public boolean isApplicable(OpenFileSystemModel model, List<BrowserEntry> entries) {
|
||||
return entries.size() == 1
|
||||
&& entries.get(0)
|
||||
&& entries.getFirst()
|
||||
.getRawFileEntry()
|
||||
.getPath()
|
||||
.equals(model.getCurrentPath().get());
|
||||
|
|
|
@ -16,7 +16,7 @@ public class OpenDirectoryAction implements LeafAction {
|
|||
|
||||
@Override
|
||||
public void execute(OpenFileSystemModel model, List<BrowserEntry> entries) {
|
||||
model.cdAsync(entries.get(0).getRawFileEntry().getPath());
|
||||
model.cdAsync(entries.getFirst().getRawFileEntry().getPath());
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -16,7 +16,7 @@ public class OpenDirectoryInNewTabAction implements LeafAction {
|
|||
model.getBrowserModel()
|
||||
.openFileSystemAsync(
|
||||
model.getEntry(),
|
||||
m -> entries.get(0).getRawFileEntry().getPath(),
|
||||
m -> entries.getFirst().getRawFileEntry().getPath(),
|
||||
null);
|
||||
}
|
||||
|
||||
|
|
|
@ -17,7 +17,7 @@ import java.util.List;
|
|||
public class OpenFileWithAction implements LeafAction {
|
||||
|
||||
@Override
|
||||
public void execute(OpenFileSystemModel model, List<BrowserEntry> entries) throws Exception {
|
||||
public void execute(OpenFileSystemModel model, List<BrowserEntry> entries) {
|
||||
var e = entries.getFirst();
|
||||
FileOpener.openWithAnyApplication(e.getRawFileEntry());
|
||||
}
|
||||
|
|
|
@ -20,7 +20,7 @@ public class OpenTerminalAction implements LeafAction {
|
|||
}
|
||||
|
||||
@Override
|
||||
public void execute(OpenFileSystemModel model, List<BrowserEntry> entries) throws Exception {
|
||||
public void execute(OpenFileSystemModel model, List<BrowserEntry> entries) {
|
||||
if (entries.size() == 0) {
|
||||
model.openTerminalAsync(model.getCurrentDirectory() != null ? model.getCurrentDirectory().getPath() : null);
|
||||
return;
|
||||
|
|
|
@ -22,8 +22,8 @@ public class PasteAction implements LeafAction {
|
|||
return;
|
||||
}
|
||||
|
||||
var target = entries.size() == 1 && entries.get(0).getRawFileEntry().getKind() == FileKind.DIRECTORY
|
||||
? entries.get(0).getRawFileEntry()
|
||||
var target = entries.size() == 1 && entries.getFirst().getRawFileEntry().getKind() == FileKind.DIRECTORY
|
||||
? entries.getFirst().getRawFileEntry()
|
||||
: model.getCurrentDirectory();
|
||||
var files = clipboard.getEntries();
|
||||
if (files.size() == 0) {
|
||||
|
|
|
@ -16,7 +16,7 @@ public class RenameAction implements LeafAction {
|
|||
|
||||
@Override
|
||||
public void execute(OpenFileSystemModel model, List<BrowserEntry> entries) {
|
||||
model.getFileList().getEditing().setValue(entries.get(0));
|
||||
model.getFileList().getEditing().setValue(entries.getFirst());
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -36,7 +36,7 @@ public class RenameAction implements LeafAction {
|
|||
|
||||
@Override
|
||||
public boolean isApplicable(OpenFileSystemModel model, List<BrowserEntry> entries) {
|
||||
return entries.size() == 1 && entries.get(0).getRawFileEntry().getKind() != FileKind.LINK;
|
||||
return entries.size() == 1 && entries.getFirst().getRawFileEntry().getKind() != FileKind.LINK;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -57,7 +57,7 @@ public abstract class ScriptStore extends JacksonizedValue implements DataStore,
|
|||
}
|
||||
}
|
||||
|
||||
private static void passInitScripts(ShellControl pc, List<SimpleScriptStore> scriptStores) throws Exception {
|
||||
private static void passInitScripts(ShellControl pc, List<SimpleScriptStore> scriptStores) {
|
||||
scriptStores.forEach(simpleScriptStore -> {
|
||||
if (pc.getInitCommands().contains(simpleScriptStore)) {
|
||||
return;
|
||||
|
|
|
@ -241,7 +241,7 @@ public class SimpleScriptStoreProvider implements DataStoreProvider {
|
|||
}
|
||||
|
||||
@Override
|
||||
public void storageInit() throws Exception {
|
||||
public void storageInit() {
|
||||
DataStorage.get()
|
||||
.addStoreEntryIfNotPresent(DataStoreEntry.createNew(
|
||||
UUID.fromString("a9945ad2-db61-4304-97d7-5dc4330691a7"),
|
||||
|
|
Loading…
Reference in a new issue