Add cross-platform IDEA launch commands
This commit is contained in:
@@ -337,15 +337,10 @@ public class GitReviewService {
|
|||||||
|
|
||||||
private boolean startIdea(String ideaCommand, List<String> args, LogSink logs) {
|
private boolean startIdea(String ideaCommand, List<String> args, LogSink logs) {
|
||||||
List<String> configured = splitCommandLine(ideaCommand);
|
List<String> configured = splitCommandLine(ideaCommand);
|
||||||
List<String> candidates = configured.isEmpty()
|
List<List<String>> candidates = IdeaLaunchCommands.candidates(
|
||||||
? Arrays.asList("idea64.exe", "idea.bat", "idea")
|
IdeaLaunchCommands.currentOperatingSystem(), configured, args);
|
||||||
: Collections.singletonList(String.join(" ", configured));
|
|
||||||
|
|
||||||
for (String candidate : candidates) {
|
for (List<String> command : candidates) {
|
||||||
List<String> command = configured.isEmpty()
|
|
||||||
? new ArrayList<>(Collections.singletonList(candidate))
|
|
||||||
: new ArrayList<>(configured);
|
|
||||||
command.addAll(args);
|
|
||||||
if (startProcess(command)) {
|
if (startProcess(command)) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -219,7 +219,8 @@ public class GitReviewWindow {
|
|||||||
projectValueLabel = valueLabel();
|
projectValueLabel = valueLabel();
|
||||||
sourceBranchValueLabel = valueLabel();
|
sourceBranchValueLabel = valueLabel();
|
||||||
targetBranchValueLabel = valueLabel();
|
targetBranchValueLabel = valueLabel();
|
||||||
ideaCommandField = textField("idea64.exe");
|
ideaCommandField = textField("");
|
||||||
|
ideaCommandField.setPromptText("自动检测");
|
||||||
|
|
||||||
HBox ideaBox = new HBox(Theme.S2, ideaCommandField, smallButton("选择...", this::chooseIdeaCommand));
|
HBox ideaBox = new HBox(Theme.S2, ideaCommandField, smallButton("选择...", this::chooseIdeaCommand));
|
||||||
HBox.setHgrow(ideaCommandField, Priority.ALWAYS);
|
HBox.setHgrow(ideaCommandField, Priority.ALWAYS);
|
||||||
|
|||||||
@@ -0,0 +1,53 @@
|
|||||||
|
package com.example.workutils.biz.gitreview;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Locale;
|
||||||
|
|
||||||
|
final class IdeaLaunchCommands {
|
||||||
|
|
||||||
|
enum OperatingSystem { WINDOWS, MAC, LINUX }
|
||||||
|
|
||||||
|
private IdeaLaunchCommands() {
|
||||||
|
}
|
||||||
|
|
||||||
|
static OperatingSystem currentOperatingSystem() {
|
||||||
|
return detect(System.getProperty("os.name", ""));
|
||||||
|
}
|
||||||
|
|
||||||
|
static OperatingSystem detect(String osName) {
|
||||||
|
String normalized = osName.toLowerCase(Locale.ROOT);
|
||||||
|
if (normalized.contains("win")) {
|
||||||
|
return OperatingSystem.WINDOWS;
|
||||||
|
}
|
||||||
|
if (normalized.contains("mac")) {
|
||||||
|
return OperatingSystem.MAC;
|
||||||
|
}
|
||||||
|
return OperatingSystem.LINUX;
|
||||||
|
}
|
||||||
|
|
||||||
|
static List<List<String>> candidates(
|
||||||
|
OperatingSystem operatingSystem,
|
||||||
|
List<String> configured,
|
||||||
|
List<String> projectArguments) {
|
||||||
|
if (!configured.isEmpty()) {
|
||||||
|
return List.of(append(configured, projectArguments));
|
||||||
|
}
|
||||||
|
return switch (operatingSystem) {
|
||||||
|
case WINDOWS -> List.of(
|
||||||
|
append(List.of("idea64.exe"), projectArguments),
|
||||||
|
append(List.of("idea.bat"), projectArguments),
|
||||||
|
append(List.of("idea"), projectArguments));
|
||||||
|
case MAC -> List.of(
|
||||||
|
append(List.of("idea"), projectArguments),
|
||||||
|
append(List.of("open", "-a", "IntelliJ IDEA"), projectArguments));
|
||||||
|
case LINUX -> List.of(append(List.of("idea"), projectArguments));
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
private static List<String> append(List<String> command, List<String> arguments) {
|
||||||
|
List<String> result = new ArrayList<>(command);
|
||||||
|
result.addAll(arguments);
|
||||||
|
return List.copyOf(result);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,54 @@
|
|||||||
|
package com.example.workutils.biz.gitreview;
|
||||||
|
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import static com.example.workutils.biz.gitreview.IdeaLaunchCommands.OperatingSystem.LINUX;
|
||||||
|
import static com.example.workutils.biz.gitreview.IdeaLaunchCommands.OperatingSystem.MAC;
|
||||||
|
import static com.example.workutils.biz.gitreview.IdeaLaunchCommands.OperatingSystem.WINDOWS;
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
|
|
||||||
|
class IdeaLaunchCommandsTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void macUsesCliThenOpenApplicationFallback() {
|
||||||
|
List<List<String>> commands = IdeaLaunchCommands.candidates(
|
||||||
|
MAC, List.of(), List.of("/项目 空间/demo"));
|
||||||
|
|
||||||
|
assertEquals(List.of("idea", "/项目 空间/demo"), commands.get(0));
|
||||||
|
assertEquals(List.of("open", "-a", "IntelliJ IDEA", "/项目 空间/demo"), commands.get(1));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void windowsTriesExeBatchAndPathCommands() {
|
||||||
|
List<List<String>> commands = IdeaLaunchCommands.candidates(
|
||||||
|
WINDOWS, List.of(), List.of("D:/项目 空间"));
|
||||||
|
|
||||||
|
assertEquals(List.of("idea64.exe", "D:/项目 空间"), commands.get(0));
|
||||||
|
assertEquals(List.of("idea.bat", "D:/项目 空间"), commands.get(1));
|
||||||
|
assertEquals(List.of("idea", "D:/项目 空间"), commands.get(2));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void linuxUsesIdeaFromPath() {
|
||||||
|
assertEquals(List.of(List.of("idea", "/项目 空间")),
|
||||||
|
IdeaLaunchCommands.candidates(LINUX, List.of(), List.of("/项目 空间")));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void configuredCommandAlwaysWinsAndRetainsArgumentBoundaries() {
|
||||||
|
assertEquals(
|
||||||
|
List.of(List.of("/Applications/IntelliJ IDEA.app/Contents/MacOS/idea", "--wait", "/项目 空间")),
|
||||||
|
IdeaLaunchCommands.candidates(MAC,
|
||||||
|
List.of("/Applications/IntelliJ IDEA.app/Contents/MacOS/idea", "--wait"),
|
||||||
|
List.of("/项目 空间")));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void operatingSystemNamesAreDetectedCaseInsensitively() {
|
||||||
|
assertEquals(WINDOWS, IdeaLaunchCommands.detect("Windows 11"));
|
||||||
|
assertEquals(MAC, IdeaLaunchCommands.detect("Mac OS X"));
|
||||||
|
assertEquals(LINUX, IdeaLaunchCommands.detect("Linux"));
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user