diff --git a/platform/platform-impl/src/com/intellij/ide/actions/CreateDesktopEntryAction.java b/platform/platform-impl/src/com/intellij/ide/actions/CreateDesktopEntryAction.java index ef9068dcbad7..a81b0860f731 100644 --- a/platform/platform-impl/src/com/intellij/ide/actions/CreateDesktopEntryAction.java +++ b/platform/platform-impl/src/com/intellij/ide/actions/CreateDesktopEntryAction.java @@ -23,7 +23,9 @@ import com.intellij.notification.Notification; import com.intellij.notification.NotificationType; import com.intellij.notification.Notifications; import com.intellij.openapi.actionSystem.AnActionEvent; -import com.intellij.openapi.application.*; +import com.intellij.openapi.application.ApplicationBundle; +import com.intellij.openapi.application.ApplicationNamesInfo; +import com.intellij.openapi.application.PathManager; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.progress.ProgressIndicator; import com.intellij.openapi.progress.ProgressManager; @@ -31,6 +33,8 @@ import com.intellij.openapi.progress.Task; import com.intellij.openapi.project.DumbAwareAction; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.DialogWrapper; +import com.intellij.openapi.util.AtomicNullableLazyValue; +import com.intellij.openapi.util.NullableLazyValue; import com.intellij.openapi.util.SystemInfo; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.util.text.StringUtil; @@ -52,6 +56,26 @@ import static com.intellij.util.containers.ContainerUtil.newHashMap; public class CreateDesktopEntryAction extends DumbAwareAction { private static final Logger LOG = Logger.getInstance("#com.intellij.ide.actions.CreateDesktopEntryAction"); + private static final NullableLazyValue ourScript = new AtomicNullableLazyValue() { + @Nullable + @Override + protected String compute() { + String binPath = PathManager.getBinPath(); + ApplicationNamesInfo names = ApplicationNamesInfo.getInstance(); + + String execPath = binPath + '/' + names.getProductName() + ".sh"; + if (new File(execPath).canExecute()) return execPath; + + execPath = binPath + '/' + names.getProductName().toLowerCase(Locale.US) + ".sh"; + if (new File(execPath).canExecute()) return execPath; + + execPath = binPath + '/' + names.getScriptName() + ".sh"; + if (new File(execPath).canExecute()) return execPath; + + return null; + } + }; + public static boolean isAvailable() { return SystemInfo.isUnix && SystemInfo.hasXdgOpen(); } @@ -123,24 +147,21 @@ public class CreateDesktopEntryAction extends DumbAwareAction { } private static File prepare() throws IOException { - String homePath = PathManager.getHomePath(); - assert new File(homePath).isDirectory() : "Invalid home path: '" + homePath + "'"; - String binPath = homePath + "/bin"; + String binPath = PathManager.getBinPath(); assert new File(binPath).isDirectory() : "Invalid bin path: '" + binPath + "'"; - String name = ApplicationNamesInfo.getInstance().getFullProductName(); - if (PlatformUtils.isIdeaCommunity()) name += " Community Edition"; - String iconPath = AppUIUtil.findIcon(binPath); if (iconPath == null) { throw new RuntimeException(ApplicationBundle.message("desktop.entry.icon.missing", binPath)); } - String execPath = findScript(binPath); + String execPath = ourScript.getValue(); if (execPath == null) { throw new RuntimeException(ApplicationBundle.message("desktop.entry.script.missing", binPath)); } + String name = ApplicationNamesInfo.getInstance().getFullProductName(); + if (PlatformUtils.isIdeaCommunity()) name += " Community Edition"; String wmClass = AppUIUtil.getFrameClass(); Map vars = newHashMap(pair("$NAME$", name), pair("$SCRIPT$", execPath), pair("$ICON$", iconPath), pair("$WM_CLASS$", wmClass)); String content = ExecUtil.loadTemplate(CreateDesktopEntryAction.class.getClassLoader(), "entry.desktop", vars); @@ -149,22 +170,6 @@ public class CreateDesktopEntryAction extends DumbAwareAction { return entryFile; } - @Nullable - private static String findScript(String binPath) { - ApplicationNamesInfo names = ApplicationNamesInfo.getInstance(); - - String execPath = binPath + '/' + names.getProductName() + ".sh"; - if (new File(execPath).canExecute()) return execPath; - - execPath = binPath + '/' + names.getProductName().toLowerCase(Locale.US) + ".sh"; - if (new File(execPath).canExecute()) return execPath; - - execPath = binPath + '/' + names.getScriptName() + ".sh"; - if (new File(execPath).canExecute()) return execPath; - - return null; - } - private static void install(File entryFile, boolean globalEntry) throws IOException, ExecutionException { if (globalEntry) { File script = ExecUtil.createTempExecutableScript( @@ -213,4 +218,9 @@ public class CreateDesktopEntryAction extends DumbAwareAction { return myContentPane; } } + + @Nullable + public static String getLauncherScript() { + return ourScript.getValue(); + } } \ No newline at end of file diff --git a/platform/platform-impl/src/com/intellij/ide/actions/CreateLauncherScriptAction.java b/platform/platform-impl/src/com/intellij/ide/actions/CreateLauncherScriptAction.java index ac76e66b58e6..2537ec479aa6 100644 --- a/platform/platform-impl/src/com/intellij/ide/actions/CreateLauncherScriptAction.java +++ b/platform/platform-impl/src/com/intellij/ide/actions/CreateLauncherScriptAction.java @@ -149,9 +149,8 @@ public class CreateLauncherScriptAction extends DumbAwareAction { } private static File createLauncherScriptFile() throws IOException, ExecutionException { - String runPath; - if (SystemInfo.isMac) runPath = StringUtil.trimEnd(PathManager.getHomePath(), CONTENTS); - else runPath = PathManager.getBinPath() + "/" + ApplicationNamesInfo.getInstance().getProductName().toLowerCase(Locale.US) + ".sh"; + String runPath = SystemInfo.isMac ? StringUtil.trimEnd(PathManager.getHomePath(), CONTENTS) : CreateDesktopEntryAction.getLauncherScript(); + if (runPath == null) throw new IOException(ApplicationBundle.message("desktop.entry.script.missing", PathManager.getBinPath())); ClassLoader loader = CreateLauncherScriptAction.class.getClassLoader(); assert loader != null; @@ -166,7 +165,7 @@ public class CreateLauncherScriptAction extends DumbAwareAction { public static String defaultScriptPath() { String scriptName = ApplicationNamesInfo.getInstance().getScriptName(); - if (StringUtil.isEmptyOrSpaces(scriptName)) scriptName = "idea"; + if (StringUtil.isEmptyOrSpaces(scriptName)) scriptName = ApplicationNamesInfo.getInstance().getProductName().toLowerCase(Locale.US); return "/usr/local/bin/" + scriptName; } } \ No newline at end of file diff --git a/platform/platform-impl/src/com/intellij/util/Restarter.java b/platform/platform-impl/src/com/intellij/util/Restarter.java index 7c932ba8f1bd..4e3f507e692f 100644 --- a/platform/platform-impl/src/com/intellij/util/Restarter.java +++ b/platform/platform-impl/src/com/intellij/util/Restarter.java @@ -15,8 +15,8 @@ */ package com.intellij.util; +import com.intellij.ide.actions.CreateDesktopEntryAction; import com.intellij.jna.JnaLoader; -import com.intellij.openapi.application.ApplicationNamesInfo; import com.intellij.openapi.application.PathManager; import com.intellij.openapi.util.SystemInfo; import com.intellij.openapi.util.io.FileUtilRt; @@ -34,16 +34,10 @@ import java.io.IOException; import java.util.ArrayList; import java.util.Collections; import java.util.List; -import java.util.Locale; public class Restarter { private Restarter() { } - private static File getLauncherScript() { - String name = ApplicationNamesInfo.getInstance().getProductName().toLowerCase(Locale.US); - return new File(PathManager.getBinPath(), name + ".sh"); - } - public static boolean isSupported() { if (SystemInfo.isWindows) { return JnaLoader.isLoaded() && new File(PathManager.getBinPath(), "restarter.exe").exists(); @@ -52,7 +46,7 @@ public class Restarter { return PathManager.getHomePath().contains(".app") && new File(PathManager.getBinPath(), "restarter").canExecute(); } if (SystemInfo.isUnix) { - return getLauncherScript().canExecute() && new File(PathManager.getBinPath(), "restart.py").canExecute(); + return CreateDesktopEntryAction.getLauncherScript() != null && new File(PathManager.getBinPath(), "restart.py").canExecute(); } return false; @@ -139,10 +133,10 @@ public class Restarter { } private static void restartOnUnix(String... beforeRestart) throws IOException { - File launcherScript = getLauncherScript(); - if (!launcherScript.exists()) throw new IOException("Launcher script not found: " + launcherScript); + String launcherScript = CreateDesktopEntryAction.getLauncherScript(); + if (launcherScript == null) throw new IOException("Launcher script not found in " + PathManager.getBinPath()); doScheduleRestart(new File(PathManager.getBinPath(), "restart.py"), commands -> { - commands.add(launcherScript.getPath()); + commands.add(launcherScript); Collections.addAll(commands, beforeRestart); }); }