Bump to JDK25

This commit is contained in:
crschnick
2025-09-04 18:38:45 +00:00
parent b2b11b3436
commit a748894a2c
32 changed files with 90 additions and 62 deletions

View File

@@ -7,6 +7,7 @@ import io.xpipe.app.comp.base.ButtonComp;
import io.xpipe.app.comp.base.InputGroupComp;
import io.xpipe.app.comp.base.TextFieldComp;
import io.xpipe.app.core.AppI18n;
import io.xpipe.app.core.AppInstallation;
import io.xpipe.app.update.AppDistributionType;
import io.xpipe.app.util.*;
@@ -60,6 +61,7 @@ public class ActionShortcutComp extends SimpleComp {
field.grow(true, false);
field.apply(struc -> struc.get().setEditable(false));
var group = new InputGroupComp(List.of(field, copyButton));
group.setHeightReference(copyButton);
return group;
}
@@ -74,7 +76,8 @@ public class ActionShortcutComp extends SimpleComp {
});
var copyButton = new ButtonComp(null, new FontIcon("mdi2f-file-move-outline"), () -> {
ThreadHelper.runFailableAsync(() -> {
var file = DesktopShortcuts.createCliOpen(url.getValue(), name.getValue());
var exec = AppInstallation.ofCurrent().getCliExecutablePath().toString();
var file = DesktopShortcuts.create(exec, "open \"" + url.getValue() + "\"", name.getValue());
DesktopHelper.browseFileInDirectory(file);
});
})
@@ -83,6 +86,7 @@ public class ActionShortcutComp extends SimpleComp {
var field = new TextFieldComp(name);
field.grow(true, false);
var group = new InputGroupComp(List.of(field, copyButton));
group.setHeightReference(copyButton);
return group;
}
@@ -103,6 +107,7 @@ public class ActionShortcutComp extends SimpleComp {
field.grow(true, false);
field.apply(struc -> struc.get().setEditable(false));
var group = new InputGroupComp(List.of(field, copyButton));
group.setHeightReference(copyButton);
return group;
}

View File

@@ -1,6 +1,7 @@
package io.xpipe.app.browser.menu.impl;
import io.xpipe.app.action.AbstractAction;
import io.xpipe.app.browser.action.BrowserActionProvider;
import io.xpipe.app.browser.action.impl.DeleteActionProvider;
import io.xpipe.app.browser.file.BrowserEntry;
import io.xpipe.app.browser.file.BrowserFileSystemTabModel;
@@ -20,17 +21,8 @@ import java.util.List;
public class DeleteMenuProvider implements BrowserMenuLeafProvider {
@Override
public AbstractAction createAction(BrowserFileSystemTabModel model, List<BrowserEntry> entries) {
var link = entries.stream()
.anyMatch(browserEntry -> browserEntry.getRawFileEntry().getKind() == FileKind.LINK);
var files = entries.stream()
.map(browserEntry -> !link
? browserEntry.getRawFileEntry().resolved().getPath()
: browserEntry.getRawFileEntry().getPath())
.toList();
var builder = DeleteActionProvider.Action.builder();
builder.initFiles(model, files);
return builder.build();
public Class<? extends BrowserActionProvider> getDelegateActionProvider() {
return DeleteActionProvider.class;
}
@Override
@@ -58,8 +50,8 @@ public class DeleteMenuProvider implements BrowserMenuLeafProvider {
return AppI18n.observable(
"deleteFile",
entries.stream()
.anyMatch(browserEntry ->
browserEntry.getRawFileEntry().getKind() == FileKind.LINK)
.anyMatch(browserEntry ->
browserEntry.getRawFileEntry().getKind() == FileKind.LINK)
? "link"
: "");
}

View File

@@ -4,9 +4,12 @@ import io.xpipe.app.comp.Comp;
import io.xpipe.app.comp.CompStructure;
import io.xpipe.app.comp.SimpleCompStructure;
import io.xpipe.app.core.AppFontSizes;
import javafx.geometry.Pos;
import atlantafx.base.layout.InputGroup;
import javafx.scene.layout.Region;
import lombok.Setter;
import java.util.List;
@@ -14,6 +17,9 @@ public class InputGroupComp extends Comp<CompStructure<InputGroup>> {
private final List<Comp<?>> entries;
@Setter
private Comp<?> heightReference;
public InputGroupComp(List<Comp<?>> comps) {
entries = List.copyOf(comps);
}
@@ -30,6 +36,28 @@ public class InputGroupComp extends Comp<CompStructure<InputGroup>> {
b.getChildren().add(entry.createRegion());
}
b.setAlignment(Pos.CENTER);
if (heightReference != null && entries.contains(heightReference)) {
var refIndex = entries.indexOf(heightReference);
var ref = b.getChildren().get(refIndex);
if (ref instanceof Region refR) {
for (int i = 0; i < entries.size(); i++) {
if (i == refIndex) {
continue;
}
var entry = b.getChildren().get(i);
if (!(entry instanceof Region entryR)) {
continue;
}
entryR.minHeightProperty().bind(refR.heightProperty());
entryR.maxHeightProperty().bind(refR.heightProperty());
entryR.prefHeightProperty().bind(refR.heightProperty());
}
}
}
return new SimpleCompStructure<>(b);
}
}

View File

@@ -1,6 +1,6 @@
package io.xpipe.app.core;
import io.xpipe.app.core.check.AppUserDirectoryCheck;
import io.xpipe.app.core.check.AppDirectoryPermissionsCheck;
import io.xpipe.app.issue.ErrorEventFactory;
import io.xpipe.app.issue.TrackEvent;
import io.xpipe.core.XPipeDaemonMode;
@@ -153,7 +153,7 @@ public class AppProperties {
.orElse("info");
// We require the user dir from here
AppUserDirectoryCheck.check(dataDir);
AppDirectoryPermissionsCheck.checkDirectory(dataDir);
AppCache.setBasePath(dataDir.resolve("cache"));
dataBinDir = dataDir.resolve("cache", "bin");
UUID id = AppCache.getNonNull("uuid", UUID.class, () -> null);

View File

@@ -64,6 +64,8 @@ public abstract class AppSystemInfo {
public abstract Path getDesktop();
public abstract Path getTemp();
public static final class Windows extends AppSystemInfo {
private Path userHome;
@@ -281,6 +283,11 @@ public abstract class AppSystemInfo {
var fallback = getUserHome().resolve("Desktop");
return (desktop = fallback);
}
@Override
public Path getTemp() {
return Path.of(System.getProperty("java.io.tmpdir"));
}
}
public static class MacOs extends AppSystemInfo {
@@ -299,5 +306,10 @@ public abstract class AppSystemInfo {
public Path getDesktop() {
return getUserHome().resolve("Desktop");
}
@Override
public Path getTemp() {
return Path.of(System.getProperty("java.io.tmpdir"));
}
}
}

View File

@@ -2,29 +2,33 @@ package io.xpipe.app.core.check;
import io.xpipe.app.issue.ErrorEventFactory;
import io.xpipe.core.OsType;
import org.apache.commons.io.FileUtils;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
public class AppUserDirectoryCheck {
public class AppDirectoryPermissionsCheck {
public static void check(Path dataDirectory) {
public static void checkDirectory(Path dataDirectory) {
try {
FileUtils.forceMkdir(dataDirectory.toFile());
var testDirectory = dataDirectory.resolve("permissions_check");
FileUtils.forceMkdir(testDirectory.toFile());
if (!Files.exists(testDirectory)) {
throw new IOException("Directory creation in user home directory failed silently");
throw new IOException("Directory creation in " + dataDirectory + " failed silently");
}
Files.delete(testDirectory);
// if (true) throw new IOException();
} catch (IOException e) {
var message = "Unable to access directory " + dataDirectory + ".";
if (OsType.getLocal() == OsType.WINDOWS) {
message += " Please make sure that you have the appropriate permissions and no Antivirus program is blocking the access. "
+ "In case you use cloud storage, verify that your cloud storage is working and you are logged in.";
}
ErrorEventFactory.fromThrowable(
"Unable to access directory " + dataDirectory
+ ". Please make sure that you have the appropriate permissions and no Antivirus program is blocking the access. "
+ "In case you use cloud storage, verify that your cloud storage is working and you are logged in.",
message,
e)
.term()
.expected()

View File

@@ -9,7 +9,7 @@ import java.nio.file.Files;
import java.nio.file.InvalidPathException;
import java.nio.file.Path;
public class AppTempCheck {
public class AppWindowsTempCheck {
private static void checkTemp(String tmpdir) {
Path dir = null;

View File

@@ -61,12 +61,12 @@ public class BaseMode extends OperationMode {
AppWindowTitle.init();
AppPathCorruptCheck.check();
AppHomebrewCoreutilsCheck.check();
WindowsRegistry.init();
AppAvCheck.check();
AppJavaOptionsCheck.check();
AppSid.init();
AppBeaconServer.init();
AppLayoutModel.init();
WindowsRegistry.init();
if (OperationMode.getStartupMode() == XPipeDaemonMode.GUI) {
AppPtbDialog.showIfNeeded();

View File

@@ -4,7 +4,8 @@ import io.xpipe.app.beacon.AppBeaconServer;
import io.xpipe.app.browser.BrowserFullSessionModel;
import io.xpipe.app.core.*;
import io.xpipe.app.core.check.AppDebugModeCheck;
import io.xpipe.app.core.check.AppTempCheck;
import io.xpipe.app.core.check.AppDirectoryPermissionsCheck;
import io.xpipe.app.core.check.AppWindowsTempCheck;
import io.xpipe.app.core.window.AppMainWindow;
import io.xpipe.app.issue.*;
import io.xpipe.app.prefs.AppPrefs;
@@ -113,7 +114,8 @@ public abstract class OperationMode {
AppProperties.init(args);
NodeCallback.init();
AppLogs.init();
AppTempCheck.check();
AppWindowsTempCheck.check();
AppDirectoryPermissionsCheck.checkDirectory(AppSystemInfo.ofCurrent().getTemp());
AppDebugModeCheck.printIfNeeded();
AppProperties.get().logArguments();
AppDistributionType.init();

View File

@@ -8,10 +8,12 @@ import io.xpipe.app.core.window.AppDialog;
import io.xpipe.app.icon.SystemIconManager;
import io.xpipe.app.icon.SystemIconSource;
import io.xpipe.app.issue.ErrorEventFactory;
import io.xpipe.app.process.OsFileSystem;
import io.xpipe.app.storage.DataStorage;
import io.xpipe.app.util.*;
import io.xpipe.core.FilePath;
import io.xpipe.core.OsType;
import javafx.beans.binding.Bindings;
import javafx.beans.property.SimpleBooleanProperty;
import javafx.beans.property.SimpleObjectProperty;
@@ -101,7 +103,8 @@ public class IconsCategory extends AppPrefsCategory {
if (path != null) {
var name = FilenameUtils.getBaseName(path);
if (!name.isBlank()) {
id = name;
// Windows has the most strict file name rules
id = OsFileSystem.of(OsType.WINDOWS).makeFileSystemCompatible(name);
}
}
} catch (Exception ignored) {}

View File

@@ -58,7 +58,6 @@ public class BitwardenPasswordManager implements PasswordManager {
var sc = getOrStartShell();
var command = sc.command(CommandBuilder.of().add("bw", "get", "item", "xpipe-test", "--nointeraction"));
var r = command.readStdoutAndStderr();
// Check for data file as bw seemingly breaks if it doesn't exist yet
if (r[1].contains("You are not logged in")) {
var script = ShellScript.lines(
moveAppDir()

View File

@@ -123,11 +123,6 @@ public class DesktopShortcuts {
return base;
}
public static Path createCliOpen(String action, String name) throws Exception {
var exec = AppInstallation.ofCurrent().getCliExecutablePath().toString();
return create(exec, "open " + action, name);
}
public static Path create(String executable, String args, String name) throws Exception {
var compat = OsFileSystem.ofLocal().makeFileSystemCompatible(name);
if (OsType.getLocal() == OsType.WINDOWS) {

View File

@@ -1,12 +1,12 @@
- Show warning when invalid SSH gateway chain is configured
- Fix tunnel session restart not applying any changes made to connection config
- Reshow any existing configuration dialog if possible for connection when editing it
- Improve error handling on Windows when registry library handling load fails
- Automatically open connection configuration dialog when cloning a connection
- Fix desktop shortcuts for workspaces and actions not working on Linux and macOS
- Fix computed directory file size being off by a factor of 1024 on Linux
- Fix license check for entries limited in amount, e.g. Proxmox, potentially disabling all entries and not only one
- Fix custom git icon sources not persisting after restart
- Derive custom git icon source directory name from repository URL
- Fix window possibly entering invalid state on Windows and not showing anymore
- Fix docker integration not elevating with sudo if context config required root permissions
- Fix desktop shortcuts for workspaces and more not working on Linux and macOS
- Fix window possibly entering invalid state on Windows and not showing anymore
- Fix tunnel session restart not applying any changes made to connection config
- Show warning when invalid SSH gateway chain is configured
- Reshow any existing configuration dialog if possible for connection when editing it
- Improve error handling on Windows when registry library load fails
- Automatically open connection configuration dialog when cloning a connection
- Derive custom git icon source directory name from repository URL

View File

@@ -6,8 +6,10 @@ import io.xpipe.app.comp.SimpleCompStructure;
import io.xpipe.app.comp.base.*;
import io.xpipe.app.core.AppFontSizes;
import io.xpipe.app.core.AppI18n;
import io.xpipe.app.core.AppProperties;
import io.xpipe.app.ext.DataStoreCreationCategory;
import io.xpipe.app.hub.comp.*;
import io.xpipe.app.prefs.AppPrefs;
import io.xpipe.app.storage.DataStorage;
import io.xpipe.app.storage.DataStoreEntry;
import io.xpipe.app.storage.DataStoreEntryRef;
@@ -62,12 +64,15 @@ public class IdentitySelectComp extends Comp<CompStructure<HBox>> {
}
private void addNamedIdentity() {
var pwMan = DataStorage.get().getStoreEntries().stream()
var hasPwMan = AppPrefs.get().passwordManager().getValue() != null;
var pwManIdentity = DataStorage.get().getStoreEntries().stream()
.map(entry -> entry.getStore() instanceof PasswordManagerIdentityStore p ? p : null)
.filter(s -> s != null)
.findFirst();
if (pwMan.isPresent()) {
var perUser = pwMan.get().isPerUser();
var hasPassword = password.getValue() != null && !(password.getValue() instanceof SecretRetrievalStrategy.None);
var hasSshIdentity = identityStrategy.getValue() != null && !(identityStrategy.getValue() instanceof NoneStrategy);
if (hasPwMan && pwManIdentity.isPresent() && !hasPassword && !hasSshIdentity) {
var perUser = pwManIdentity.get().isPerUser();
var id = PasswordManagerIdentityStore.builder()
.key(inPlaceUser.getValue())
.perUser(perUser)

View File

@@ -661,7 +661,6 @@ fileNames=Filnavne
linkFileNames=Link til filnavne
fileNamesQuoted=Filnavne (citeret)
deleteFile=Slet $FILE$
deleteLink=Slet link
editWithEditor=Rediger med $EDITOR$
followLink=Følg link
goForward=Gå fremad

View File

@@ -667,7 +667,6 @@ fileNames=Dateinamen
linkFileNames=Link Dateinamen
fileNamesQuoted=Dateinamen (in Anführungszeichen)
deleteFile=Löschen $FILE$
deleteLink=Link löschen
editWithEditor=Bearbeiten mit $EDITOR$
followLink=Link folgen
goForward=Vorwärts gehen

View File

@@ -679,7 +679,6 @@ fileNames=File names
linkFileNames=Link file names
fileNamesQuoted=File names (Quoted)
deleteFile=Delete $FILE$
deleteLink=Delete link
editWithEditor=Edit with $EDITOR$
followLink=Follow link
goForward=Go forward

View File

@@ -645,7 +645,6 @@ fileNames=Nombres de archivo
linkFileNames=Enlazar nombres de archivos
fileNamesQuoted=Nombres de archivo (entre comillas)
deleteFile=Borrar $FILE$
deleteLink=Borrar enlace
editWithEditor=Edita con $EDITOR$
followLink=Seguir enlace
goForward=Avanzar

View File

@@ -666,7 +666,6 @@ fileNames=Noms de fichiers
linkFileNames=Noms de fichiers de liens
fileNamesQuoted=Noms de fichiers (cités)
deleteFile=Supprimer $FILE$
deleteLink=Supprimer le lien
editWithEditor=Éditer avec $EDITOR$
followLink=Suivre le lien
goForward=Va de l'avant

View File

@@ -645,7 +645,6 @@ fileNames=Nama file
linkFileNames=Menautkan nama file
fileNamesQuoted=Nama file (Kutipan)
deleteFile=Menghapus $FILE$
deleteLink=Menghapus tautan
editWithEditor=Mengedit dengan $EDITOR$
followLink=Ikuti tautan
goForward=Maju

View File

@@ -645,7 +645,6 @@ fileNames=Nomi di file
linkFileNames=Nomi di file di collegamento
fileNamesQuoted=Nomi di file (citati)
deleteFile=Eliminare $FILE$
deleteLink=Elimina il link
editWithEditor=Modifica con $EDITOR$
followLink=Segui il link
goForward=Vai avanti

View File

@@ -645,7 +645,6 @@ fileNames=ファイル名
linkFileNames=リンクファイル名
fileNamesQuoted=ファイル名(引用)
deleteFile=削除する$FILE$
deleteLink=リンクを削除する
editWithEditor=で編集する。$EDITOR$
followLink=リンクをたどる
goForward=進む

View File

@@ -645,7 +645,6 @@ fileNames=파일 이름
linkFileNames=링크 파일 이름
fileNamesQuoted=파일 이름(따옴표로 묶음)
deleteFile=삭제 $FILE$
deleteLink=링크 삭제
editWithEditor=다음으로 편집 $EDITOR$
followLink=팔로우 링크
goForward=앞으로

View File

@@ -645,7 +645,6 @@ fileNames=Bestandsnamen
linkFileNames=Bestandsnamen koppelen
fileNamesQuoted=Bestandsnamen (Geciteerd)
deleteFile=Verwijderen $FILE$
deleteLink=Link verwijderen
editWithEditor=Bewerken met $EDITOR$
followLink=Link volgen
goForward=Doorgaan

View File

@@ -645,7 +645,6 @@ fileNames=Nazwy plików
linkFileNames=Połącz nazwy plików
fileNamesQuoted=Nazwy plików (cytowane)
deleteFile=Usuń $FILE$
deleteLink=Usuń łącze
editWithEditor=Edytuj za pomocą $EDITOR$
followLink=Podążaj za linkiem
goForward=Idź do przodu

View File

@@ -645,7 +645,6 @@ fileNames=Nomes de ficheiros
linkFileNames=Liga nomes de ficheiros
fileNamesQuoted=Nomes de ficheiros (Citado)
deleteFile=Elimina $FILE$
deleteLink=Eliminar ligação
editWithEditor=Edita com $EDITOR$
followLink=Segue a ligação
goForward=Avança

View File

@@ -707,7 +707,6 @@ fileNames=Имена файлов
linkFileNames=Имена файлов ссылок
fileNamesQuoted=Имена файлов (в кавычках)
deleteFile=Удалить $FILE$
deleteLink=Удалить ссылку
editWithEditor=Редактируй с $EDITOR$
followLink=Перейдите по ссылке
#custom

View File

@@ -645,7 +645,6 @@ fileNames=Filnamn
linkFileNames=Namn på länkfiler
fileNamesQuoted=Filnamn (citerad)
deleteFile=Ta bort $FILE$
deleteLink=Ta bort länk
editWithEditor=Redigera med $EDITOR$
followLink=Följ länk
goForward=Gå framåt

View File

@@ -645,7 +645,6 @@ fileNames=Dosya adları
linkFileNames=Dosya adlarını bağlama
fileNamesQuoted=Dosya adları (Alıntı)
deleteFile=Silme $FILE$
deleteLink=Bağlantıyı sil
editWithEditor=İle düzenleyin $EDITOR$
followLink=Bağlantıyı takip edin
goForward=İleri git

View File

@@ -645,7 +645,6 @@ fileNames=Tên tệp
linkFileNames=Tên tệp liên kết
fileNamesQuoted=Tên tệp (Được trích dẫn)
deleteFile=Xóa $FILE$
deleteLink=Xóa liên kết
editWithEditor=Chỉnh sửa với $EDITOR$
followLink=Theo liên kết
goForward=Tiếp tục

View File

@@ -943,7 +943,6 @@ linkFileNames=链接文件名
fileNamesQuoted=文件名(引用)
#custom
deleteFile=删除 $FILE$
deleteLink=删除链接
#custom
editWithEditor=使用 $EDITOR$ 编辑
#custom

View File

@@ -1 +1 @@
18.4-3
18.4