Skip to content

Commit 413f16e

Browse files
committed
ScriptFinder: discover each script only once
Even if overlapping base script directories are added, such that a script might be examined more than once, let's only add it to the first time it is matched. This will be useful to support Fiji 1.x's special handling of scripts in the Plugins/Scripts subtree.
1 parent 03e909e commit 413f16e

File tree

1 file changed

+10
-3
lines changed

1 file changed

+10
-3
lines changed

src/main/java/org/scijava/script/ScriptFinder.java

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,9 @@
3232
package org.scijava.script;
3333

3434
import java.io.File;
35+
import java.util.HashSet;
3536
import java.util.List;
37+
import java.util.Set;
3638

3739
import org.scijava.AbstractContextual;
3840
import org.scijava.MenuEntry;
@@ -78,6 +80,7 @@ public void findScripts(final List<ScriptInfo> scripts) {
7880

7981
int scriptCount = 0;
8082

83+
final HashSet<File> scriptFiles = new HashSet<File>();
8184
for (final File directory : directories) {
8285
if (!directory.exists()) {
8386
log.warn("Ignoring non-existent scripts directory: " +
@@ -86,7 +89,8 @@ public void findScripts(final List<ScriptInfo> scripts) {
8689
}
8790
final MenuPath prefix = scriptService.getMenuPrefix(directory);
8891
final MenuPath menuPath = prefix == null ? new MenuPath() : prefix;
89-
scriptCount += discoverScripts(scripts, directory, menuPath);
92+
scriptCount +=
93+
discoverScripts(scripts, scriptFiles, directory, menuPath);
9094
}
9195

9296
log.info("Found " + scriptCount + " scripts");
@@ -102,7 +106,7 @@ public void findScripts(final List<ScriptInfo> scripts) {
102106
* @param menuPath The menu path, which must not be {@code null}.
103107
*/
104108
private int discoverScripts(final List<ScriptInfo> scripts,
105-
final File directory, final MenuPath menuPath)
109+
final Set<File> scriptFiles, final File directory, final MenuPath menuPath)
106110
{
107111
final File[] fileList = directory.listFiles();
108112
if (fileList == null) return 0; // directory does not exist
@@ -111,10 +115,12 @@ private int discoverScripts(final List<ScriptInfo> scripts,
111115
final boolean isTopLevel = menuPath.size() == 0;
112116

113117
for (final File file : fileList) {
118+
if (scriptFiles.contains(file)) continue; // script already added
119+
114120
final String name = file.getName().replace('_', ' ');
115121
if (file.isDirectory()) {
116122
// recurse into subdirectory
117-
discoverScripts(scripts, file, subMenuPath(menuPath, name));
123+
discoverScripts(scripts, scriptFiles, file, subMenuPath(menuPath, name));
118124
}
119125
else if (isTopLevel) {
120126
// ignore scripts in toplevel script directories
@@ -125,6 +131,7 @@ else if (scriptService.canHandleFile(file)) {
125131
final int dot = name.lastIndexOf('.');
126132
final String noExt = dot <= 0 ? name : name.substring(0, dot);
127133
scripts.add(createEntry(file, subMenuPath(menuPath, noExt)));
134+
scriptFiles.add(file);
128135
scriptCount++;
129136
}
130137
}

0 commit comments

Comments
 (0)