diff options
Diffstat (limited to 'python/src/com/jetbrains/python/sdk/flavors/WinPythonSdkFlavor.java')
-rw-r--r-- | python/src/com/jetbrains/python/sdk/flavors/WinPythonSdkFlavor.java | 31 |
1 files changed, 28 insertions, 3 deletions
diff --git a/python/src/com/jetbrains/python/sdk/flavors/WinPythonSdkFlavor.java b/python/src/com/jetbrains/python/sdk/flavors/WinPythonSdkFlavor.java index 8e75e634755b..9d22af8c03bf 100644 --- a/python/src/com/jetbrains/python/sdk/flavors/WinPythonSdkFlavor.java +++ b/python/src/com/jetbrains/python/sdk/flavors/WinPythonSdkFlavor.java @@ -15,7 +15,9 @@ */ package com.jetbrains.python.sdk.flavors; +import com.google.common.collect.ImmutableMap; import com.intellij.openapi.util.io.FileUtil; +import com.intellij.openapi.util.io.WindowsRegistryUtil; import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.LocalFileSystem; import com.intellij.openapi.vfs.VirtualFile; @@ -23,15 +25,17 @@ import com.intellij.openapi.vfs.newvfs.NewVirtualFile; import com.jetbrains.python.PythonHelpersLocator; import java.io.File; -import java.util.Collection; -import java.util.Set; -import java.util.TreeSet; +import java.util.*; /** * @author yole */ public class WinPythonSdkFlavor extends CPythonSdkFlavor { public static WinPythonSdkFlavor INSTANCE = new WinPythonSdkFlavor(); + private static Map<String, String> ourRegistryMap = + ImmutableMap.of("HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore", "python.exe", + "HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\Python\\PythonCore", "python.exe", + "HKEY_LOCAL_MACHINE\\SOFTWARE\\IronPython", "ipy.exe"); private WinPythonSdkFlavor() { } @@ -48,6 +52,7 @@ public class WinPythonSdkFlavor extends CPythonSdkFlavor { for (String name : exe_names) { findInstallations(candidates, name, "C:\\", "C:\\Program Files\\"); findInPath(candidates, name); + findInRegistry(candidates); } } @@ -59,6 +64,7 @@ public class WinPythonSdkFlavor extends CPythonSdkFlavor { public static void findInPath(Collection<String> candidates, String exeName) { final String path = System.getenv("PATH"); + if (path == null) return; for (String pathEntry : StringUtil.split(path, ";")) { if (pathEntry.startsWith("\"") && pathEntry.endsWith("\"")) { if (pathEntry.length() < 2) continue; @@ -71,6 +77,25 @@ public class WinPythonSdkFlavor extends CPythonSdkFlavor { } } + public static void findInRegistry(Collection<String> candidates) { + for (Map.Entry<String, String> entry : ourRegistryMap.entrySet()) { + final String prefix = entry.getKey(); + final String exePath = entry.getValue(); + List<String> strings = WindowsRegistryUtil.readRegistryBranch(prefix); + for (String string : strings) { + final String path = + WindowsRegistryUtil.readRegistryDefault(prefix + "\\" + string + + "\\InstallPath"); + if (path != null) { + File f = new File(path, exePath); + if (f.exists()) { + candidates.add(FileUtil.toSystemDependentName(f.getPath())); + } + } + } + } + } + private static void findSubdirInstallations(Collection<String> candidates, String rootDir, String dir_prefix, String exe_name) { VirtualFile rootVDir = LocalFileSystem.getInstance().findFileByPath(rootDir); if (rootVDir != null) { |