3232package org .scijava .script ;
3333
3434import java .io .File ;
35+ import java .util .HashSet ;
3536import java .util .List ;
37+ import java .util .Set ;
3638
3739import org .scijava .AbstractContextual ;
3840import 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