From 3318275d8042e4f100a23810c17a233ef7fec465 Mon Sep 17 00:00:00 2001 From: Anton Makeev Date: Fri, 25 Dec 2015 18:46:04 +0100 Subject: [PATCH] IDEA-149798 Extensible Attach to Local Process action: liststask.exe is now in platform --- .../helpers/process => bin/win}/listtasks.exe | Bin .../execution/process/ProcessListWin32.java | 8 +--- .../process/ProcessListWin32Internal.java | 41 +++++++++++------- .../execution/process/ProcessUtils.java | 8 ++-- .../src/messages/XDebuggerBundle.properties | 1 + .../actions/AttachToLocalProcessAction.java | 37 ++++++++-------- .../attach/PyAttachToProcessAction.java | 3 +- 7 files changed, 53 insertions(+), 45 deletions(-) rename {python/helpers/process => bin/win}/listtasks.exe (100%) diff --git a/python/helpers/process/listtasks.exe b/bin/win/listtasks.exe similarity index 100% rename from python/helpers/process/listtasks.exe rename to bin/win/listtasks.exe diff --git a/platform/platform-impl/src/com/intellij/execution/process/ProcessListWin32.java b/platform/platform-impl/src/com/intellij/execution/process/ProcessListWin32.java index df7354278688..cf24db61078a 100644 --- a/platform/platform-impl/src/com/intellij/execution/process/ProcessListWin32.java +++ b/platform/platform-impl/src/com/intellij/execution/process/ProcessListWin32.java @@ -33,12 +33,6 @@ import java.util.List; class ProcessListWin32 implements IProcessList { private static final Logger LOG = Logger.getInstance(ProcessListWin32.class); - private String myHelpersRoot; - - public ProcessListWin32(String helpersRoot) { - myHelpersRoot = helpersRoot; - } - @Override public ProcessInfo[] getProcessList() { try { @@ -56,7 +50,7 @@ class ProcessListWin32 implements IProcessList { } catch (Exception e) { //Use fallback - return new ProcessListWin32Internal(myHelpersRoot).getProcessList(); + return new ProcessListWin32Internal().getProcessList(); } try { return parseListTasks(p.getInputStream()); diff --git a/platform/platform-impl/src/com/intellij/execution/process/ProcessListWin32Internal.java b/platform/platform-impl/src/com/intellij/execution/process/ProcessListWin32Internal.java index 70c3180be776..3ed247016c43 100644 --- a/platform/platform-impl/src/com/intellij/execution/process/ProcessListWin32Internal.java +++ b/platform/platform-impl/src/com/intellij/execution/process/ProcessListWin32Internal.java @@ -15,6 +15,8 @@ */ package com.intellij.execution.process; +import com.intellij.openapi.application.PathManager; +import com.intellij.openapi.diagnostic.Logger; import com.intellij.util.containers.ContainerUtil; import java.io.*; @@ -26,25 +28,34 @@ import java.util.List; * Use through ProcessUtils. */ class ProcessListWin32Internal implements IProcessList { - private String myHelpersRoot; - - public ProcessListWin32Internal(String helpersRoot) { - myHelpersRoot = helpersRoot; - } + private static final Logger LOG = Logger.getInstance(ProcessListWin32Internal.class); @Override public ProcessInfo[] getProcessList() { + String[] dirs = { + PathManager.getBinPath(), + PathManager.getHomePath() + "/community/bin/win", + PathManager.getBinPath() + "/win"}; + + File listtasks = null; + + for (String each : dirs) { + listtasks = new File(each, "listtasks.exe"); + } + + if (!listtasks.exists()) { + LOG.error("listtasks.exe not found in bin folders"); + return ProcessInfo.EMPTY_ARRAY; + } + try { - File file = new File(myHelpersRoot, "process/listtasks.exe"); - if (file.exists()) { - String[] command = {file.getCanonicalPath()}; - Process p = ProcessUtils.createProcess(command, null, null); - try { - return parseListTasks(p.getInputStream()); - } - finally { - p.destroy(); - } + String[] command = {listtasks.getCanonicalPath()}; + Process p = ProcessUtils.createProcess(command, null, null); + try { + return parseListTasks(p.getInputStream()); + } + finally { + p.destroy(); } } catch (IOException ignored) { } diff --git a/platform/platform-impl/src/com/intellij/execution/process/ProcessUtils.java b/platform/platform-impl/src/com/intellij/execution/process/ProcessUtils.java index 7739519a5266..a96be96e96a7 100644 --- a/platform/platform-impl/src/com/intellij/execution/process/ProcessUtils.java +++ b/platform/platform-impl/src/com/intellij/execution/process/ProcessUtils.java @@ -63,14 +63,14 @@ public class ProcessUtils { @NotNull - public static ProcessInfo[] getProcessList(@NotNull String helpersRoot) { - return getProcessListImpl(helpersRoot).getProcessList(); + public static ProcessInfo[] getProcessList() { + return getProcessListImpl().getProcessList(); } @NotNull - private static IProcessList getProcessListImpl(@NotNull String helpersRoot) { + private static IProcessList getProcessListImpl() { if (SystemInfo.isWindows) { - return new ProcessListWin32(helpersRoot); + return new ProcessListWin32(); } if (SystemInfo.isLinux) { return new ProcessListLinux(); diff --git a/platform/platform-resources-en/src/messages/XDebuggerBundle.properties b/platform/platform-resources-en/src/messages/XDebuggerBundle.properties index 56000030ddd5..4813b4380d62 100644 --- a/platform/platform-resources-en/src/messages/XDebuggerBundle.properties +++ b/platform/platform-resources-en/src/messages/XDebuggerBundle.properties @@ -9,6 +9,7 @@ debugger.hotswap.display.name=HotSwap xdebugger.default.content.title=Debug xdebugger.debugger.tab.title=Debugger +xdebugger.attach.toLocal.popup.title=Attach xdebugger.attach.toLocal.action=Attach to Local Process... xdebugger.attach.toLocal.action.description=Attach to a locally running process with an available debugger diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/actions/AttachToLocalProcessAction.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/actions/AttachToLocalProcessAction.java index 1533eacc30ff..7e2d7de3ed0a 100644 --- a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/actions/AttachToLocalProcessAction.java +++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/actions/AttachToLocalProcessAction.java @@ -62,31 +62,34 @@ public class AttachToLocalProcessAction extends AnAction { // todo show message } - JBPopupFactory.getInstance().createListPopup(new BaseListPopupStep("Attach", items) { - @Override - public boolean isSpeedSearchEnabled() { - return true; - } + BaseListPopupStep step = + new BaseListPopupStep(XDebuggerBundle.message("xdebugger.attach.toLocal.popup.title"), items) { + @Override + public boolean isSpeedSearchEnabled() { + return true; + } - @NotNull - @Override - public String getTextFor(AttachItem value) { - return value.info.getPid() + " " + value.info.getExecutableName(); - } + @NotNull + @Override + public String getTextFor(AttachItem value) { + return value.info.getPid() + " " + value.info.getExecutableName(); + } - @Override - public PopupStep onChosen(AttachItem selectedValue, boolean finalChoice) { - startDebugSession(project, selectedValue.debuggers.get(0), selectedValue.info); - return super.onChosen(selectedValue, finalChoice); - } - }).showCenteredInCurrentWindow(project); + @Override + public PopupStep onChosen(AttachItem selectedValue, boolean finalChoice) { + startDebugSession(project, selectedValue.debuggers.get(0), selectedValue.info); + return super.onChosen(selectedValue, finalChoice); + } + }; + + JBPopupFactory.getInstance().createListPopup(step).showCenteredInCurrentWindow(project); } @NotNull private static List collectAttachItems(@NotNull Project project) { List result = new ArrayList(); - for (ProcessInfo eachInfo : ProcessUtils.getProcessList("")) { + for (ProcessInfo eachInfo : ProcessUtils.getProcessList()) { List availableDebuggers = new ArrayList(); for (XLocalAttachDebuggerProvider eachProvider : Extensions.getExtensions(XLocalAttachDebuggerProvider.EP)) { availableDebuggers.addAll(eachProvider.getAvailableDebuggers(project, eachInfo)); diff --git a/python/src/com/jetbrains/python/debugger/attach/PyAttachToProcessAction.java b/python/src/com/jetbrains/python/debugger/attach/PyAttachToProcessAction.java index e43479cc20b1..5bd3957fa853 100644 --- a/python/src/com/jetbrains/python/debugger/attach/PyAttachToProcessAction.java +++ b/python/src/com/jetbrains/python/debugger/attach/PyAttachToProcessAction.java @@ -31,7 +31,6 @@ import com.intellij.openapi.projectRoots.Sdk; import com.intellij.openapi.ui.Messages; import com.intellij.openapi.ui.SelectFromListDialog; import com.intellij.openapi.util.text.StringUtil; -import com.jetbrains.python.PythonHelpersLocator; import com.jetbrains.python.sdk.PythonSdkType; import org.jetbrains.annotations.NotNull; @@ -86,7 +85,7 @@ public class PyAttachToProcessAction extends AnAction { } private static ProcessInfo[] pythonProcessesList() { - ProcessInfo[] list = ProcessUtils.getProcessList(PythonHelpersLocator.getHelpersRoot().getAbsolutePath()); + ProcessInfo[] list = ProcessUtils.getProcessList(); return FluentIterable.from(Lists.newArrayList(list)).filter(new Predicate() { @Override public boolean apply(ProcessInfo input) {