diff --git a/GhidraBuild/EclipsePlugins/GhidraDev/GhidraDevFeature/category.xml b/GhidraBuild/EclipsePlugins/GhidraDev/GhidraDevFeature/category.xml
index c04702a7a4..c97bad1bd1 100644
--- a/GhidraBuild/EclipsePlugins/GhidraDev/GhidraDevFeature/category.xml
+++ b/GhidraBuild/EclipsePlugins/GhidraDev/GhidraDevFeature/category.xml
@@ -1,6 +1,6 @@
-
+
diff --git a/GhidraBuild/EclipsePlugins/GhidraDev/GhidraDevFeature/feature.xml b/GhidraBuild/EclipsePlugins/GhidraDev/GhidraDevFeature/feature.xml
index a12a0a45be..b014ffeb63 100644
--- a/GhidraBuild/EclipsePlugins/GhidraDev/GhidraDevFeature/feature.xml
+++ b/GhidraBuild/EclipsePlugins/GhidraDev/GhidraDevFeature/feature.xml
@@ -2,7 +2,7 @@
diff --git a/GhidraBuild/EclipsePlugins/GhidraDev/GhidraDevPlugin/GhidraDev_README.html b/GhidraBuild/EclipsePlugins/GhidraDev/GhidraDevPlugin/GhidraDev_README.html
index ced223204e..c3c0c8cf21 100644
--- a/GhidraBuild/EclipsePlugins/GhidraDev/GhidraDevPlugin/GhidraDev_README.html
+++ b/GhidraBuild/EclipsePlugins/GhidraDev/GhidraDevPlugin/GhidraDev_README.html
@@ -19,7 +19,7 @@
GhidraDev README
GhidraDev provides support for developing and debugging Ghidra scripts and modules in Eclipse.
-The information provided in this document is effective as of GhidraDev 2.1.0 and is subject to
+
The information provided in this document is effective as of GhidraDev 2.1.1 and is subject to
change with future releases.
@@ -53,6 +53,8 @@ change with future releases.
Change History
+2.1.1: Python debugging now works when PyDev is installed via the Eclipse "dropins"
+directory.
2.1.0:
-
diff --git a/GhidraBuild/EclipsePlugins/GhidraDev/GhidraDevPlugin/META-INF/MANIFEST.MF b/GhidraBuild/EclipsePlugins/GhidraDev/GhidraDevPlugin/META-INF/MANIFEST.MF
index b2d2405b25..303b7e3f1b 100644
--- a/GhidraBuild/EclipsePlugins/GhidraDev/GhidraDevPlugin/META-INF/MANIFEST.MF
+++ b/GhidraBuild/EclipsePlugins/GhidraDev/GhidraDevPlugin/META-INF/MANIFEST.MF
@@ -3,7 +3,7 @@ Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: GhidraDev
Bundle-SymbolicName: ghidra.ghidradev;singleton:=true
-Bundle-Version: 2.1.0.qualifier
+Bundle-Version: 2.1.1.qualifier
Bundle-Activator: ghidradev.Activator
Require-Bundle: org.eclipse.ant.core;bundle-version="3.5.200",
org.eclipse.buildship.core;bundle-version="3.0.0",
diff --git a/GhidraBuild/EclipsePlugins/GhidraDev/GhidraDevPlugin/src/main/java/ghidradev/ghidraprojectcreator/utils/PyDevUtils.java b/GhidraBuild/EclipsePlugins/GhidraDev/GhidraDevPlugin/src/main/java/ghidradev/ghidraprojectcreator/utils/PyDevUtils.java
index a5301df55c..edb9b1b0e3 100644
--- a/GhidraBuild/EclipsePlugins/GhidraDev/GhidraDevPlugin/src/main/java/ghidradev/ghidraprojectcreator/utils/PyDevUtils.java
+++ b/GhidraBuild/EclipsePlugins/GhidraDev/GhidraDevPlugin/src/main/java/ghidradev/ghidraprojectcreator/utils/PyDevUtils.java
@@ -16,14 +16,27 @@
package ghidradev.ghidraprojectcreator.utils;
import java.io.File;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.ArrayList;
import java.util.List;
+import java.util.Optional;
+import java.util.stream.Stream;
import javax.naming.OperationNotSupportedException;
-import org.eclipse.core.runtime.*;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.Status;
import org.eclipse.jdt.core.IClasspathEntry;
import org.eclipse.jdt.core.IJavaProject;
+import ghidradev.Activator;
+
/**
* Utility methods for interacting with PyDev.
*/
@@ -142,21 +155,33 @@ public class PyDevUtils {
* Gets The PyDev source directory.
*
* @return The PyDev source directory, or null if it was not found.
+ * @throws CoreException if there was a problem searching for the PyDev source directory.
*/
- public static File getPyDevSrcDir() {
+ public static File getPyDevSrcDir() throws CoreException {
String eclipsePath = Platform.getInstallLocation().getURL().getFile();
- File pluginsDir = new File(eclipsePath, "plugins");
- File[] pluginSubDirs = pluginsDir.listFiles(File::isDirectory);
- if (pluginSubDirs != null) {
- for (File dir : pluginSubDirs) {
- if (dir.getName().startsWith("org.python.pydev")) {
- File pysrcDir = new File(dir, "pysrc");
- if (pysrcDir.isDirectory()) {
- return pysrcDir;
- }
+
+ List searchDirs = new ArrayList<>();
+ searchDirs.add(new File(eclipsePath, "plugins"));
+ searchDirs.add(new File(eclipsePath, "dropins"));
+
+ for (File searchRoot : searchDirs) {
+ try (Stream paths = Files.walk(Paths.get(searchRoot.toURI()))) {
+ Optional pysrcDir = paths.filter(
+ Files::isDirectory)
+ .filter(p -> p.endsWith("pysrc"))
+ .map(p -> p.toFile())
+ .filter(f -> f.getParentFile().getName().startsWith("org.python.pydev"))
+ .findFirst();
+ if (pysrcDir.isPresent()) {
+ return pysrcDir.get();
}
}
+ catch (IOException e) {
+ throw new CoreException(new Status(IStatus.ERROR, Activator.PLUGIN_ID,
+ IStatus.ERROR, "Problem searching for PyDev source directory", e));
+ }
}
+
return null;
}
}