Improve NPE handling for browser actions

This commit is contained in:
crschnick
2026-04-06 03:52:41 +00:00
parent 06a0c2531f
commit d0e9529b6f
11 changed files with 24 additions and 12 deletions
@@ -20,7 +20,7 @@ public class ComputeDirectorySizesActionProvider implements BrowserActionProvide
@Override
public boolean isApplicable(BrowserFileSystemTabModel model, List<BrowserEntry> entries) {
return model.getFileSystem().supportsDirectorySizes();
return model.getCurrentDirectory() != null && model.getFileSystem().supportsDirectorySizes();
}
@Jacksonized
@@ -286,7 +286,7 @@ public final class BrowserFileSystemTabModel extends BrowserStoreSessionTab<File
return new FileEntry(fileSystem, currentPath.get(), null, null, null, FileKind.DIRECTORY);
}
public FilePath getTargetDirectory(BrowserEntry fallbackFile) {
public FilePath getTargetDirectoryPath(BrowserEntry fallbackFile) {
if (getCurrentDirectory() != null) {
return getCurrentDirectory().getPath();
}
@@ -294,6 +294,14 @@ public final class BrowserFileSystemTabModel extends BrowserStoreSessionTab<File
return fallbackFile.getRawFileEntry().getPath().getParent();
}
public FileEntry getTargetDirectory(BrowserEntry fallbackFile) {
if (getCurrentDirectory() != null) {
return getCurrentDirectory();
}
return FileEntry.ofDirectory(getFileSystem(), fallbackFile.getRawFileEntry().getPath().getParent());
}
public void cdAsync(FilePath path) {
cdAsync(path != null ? path.toString() : null);
}
@@ -19,7 +19,7 @@ public class CopyMenuProvider implements BrowserMenuLeafProvider {
@Override
public void execute(BrowserFileSystemTabModel model, List<BrowserEntry> entries) {
BrowserClipboard.startCopy(model.getCurrentDirectory(), entries);
BrowserClipboard.startCopy(model.getTargetDirectory(entries.getFirst()), entries);
}
@Override
@@ -55,7 +55,7 @@ public class JavapMenuProvider
.add("javap", "-c", "-p")
.addFile(entry.getRawFileEntry().getPath());
var out = sc.command(command)
.withWorkingDirectory(model.getTargetDirectory(entries.getFirst()))
.withWorkingDirectory(model.getTargetDirectoryPath(entries.getFirst()))
.readStdoutOrThrow();
FileOpener.openReadOnlyString(out);
}
@@ -30,7 +30,7 @@ public class OpenTerminalInDirectoryMenuProvider implements BrowserMenuLeafProvi
? List.of(model.getCurrentDirectory().getPath())
: Collections.singletonList((FilePath) null);
for (var dir : dirs) {
var name = model.getFileSystem().supportsTerminalWorkingDirectory() && dir != null ? dir.toString() : null;
var name = model.getFileSystem().supportsTerminalWorkingDirectory() ? dir.toString() : null;
model.openTerminalAsync(
name,
model.getFileSystem().supportsTerminalWorkingDirectory() ? dir : null,
@@ -29,6 +29,10 @@ public class PasteMenuProvider implements BrowserMenuLeafProvider {
var target = entries.size() == 1 && entries.getFirst().getRawFileEntry().getKind() == FileKind.DIRECTORY
? entries.getFirst().getRawFileEntry()
: model.getCurrentDirectory();
if (target == null) {
return;
}
var files = clipboard.getEntries();
if (files.size() == 0) {
return;
@@ -192,7 +192,7 @@ public class CompressMenuProvider implements BrowserMenuBranchProvider {
protected void create(String fileName, BrowserFileSystemTabModel model, List<BrowserEntry> entries) {
var builder = io.xpipe.app.browser.menu.impl.compress.ZipActionProvider.Action.builder();
builder.initEntries(model, entries);
builder.target(model.getTargetDirectory(entries.getFirst()).join(fileName));
builder.target(model.getTargetDirectoryPath(entries.getFirst()).join(fileName));
builder.directoryContentOnly(directory);
builder.build().executeAsync();
}
@@ -216,7 +216,7 @@ public class CompressMenuProvider implements BrowserMenuBranchProvider {
protected void create(String fileName, BrowserFileSystemTabModel model, List<BrowserEntry> entries) {
var builder = TarActionProvider.Action.builder();
builder.initEntries(model, entries);
builder.target(model.getTargetDirectory(entries.getFirst()).join(fileName));
builder.target(model.getTargetDirectoryPath(entries.getFirst()).join(fileName));
builder.directoryContentOnly(directory);
builder.gz(gz);
builder.build().executeAsync();
@@ -33,7 +33,7 @@ public class TarActionProvider implements BrowserActionProvider {
var sc = model.getFileSystem().getShell().orElseThrow();
var args = "c" + (gz ? "z" : "") + "f";
var tar = CommandBuilder.of().add("tar", args).addFile(target);
var base = model.getTargetDirectory(getEntries().getFirst());
var base = model.getTargetDirectoryPath(getEntries().getFirst());
if (directoryContentOnly) {
var dir = getEntries().getFirst().getRawFileEntry().getPath();
@@ -40,7 +40,7 @@ public class UntarActionProvider implements BrowserActionProvider {
.withWorkingDirectory(
toDirectory
? target
: model.getTargetDirectory(getEntries().getFirst()))
: model.getTargetDirectoryPath(getEntries().getFirst()))
.execute();
}
model.refreshSync();
@@ -50,7 +50,7 @@ public class UnzipActionProvider implements BrowserActionProvider {
.addFile(getTarget(entry.getRawFileEntry().getPath()));
}
try (var cc = sc.command(command)
.withWorkingDirectory(model.getTargetDirectory(getEntries().getFirst()))
.withWorkingDirectory(model.getTargetDirectoryPath(getEntries().getFirst()))
.start()) {
cc.discardOrThrow();
}
@@ -73,7 +73,7 @@ public class UnzipActionProvider implements BrowserActionProvider {
}
command.add("-Path").addFile(entry.getRawFileEntry().getPath());
sc.command(command)
.withWorkingDirectory(model.getTargetDirectory(getEntries().getFirst()))
.withWorkingDirectory(model.getTargetDirectoryPath(getEntries().getFirst()))
.execute();
}
}
@@ -34,7 +34,7 @@ public class ZipActionProvider implements BrowserActionProvider {
try {
var sc = model.getFileSystem().getShell().orElseThrow();
if (sc.getOsType() == OsType.WINDOWS) {
var base = model.getTargetDirectory(getEntries().getFirst());
var base = model.getTargetDirectoryPath(getEntries().getFirst());
var command = CommandBuilder.of()
.add("Compress-Archive", "-Force", "-DestinationPath")
.addFile(target)