Author: bentmann
Date: Sat Oct  4 09:27:11 2008
New Revision: 701662

URL: http://svn.apache.org/viewvc?rev=701662&view=rev
Log:
[MINVOKER-71] Usage of <setupIncludes> can result in duplicate project 
invocation

Modified:
    maven/plugins/trunk/maven-invoker-plugin/pom.xml
    maven/plugins/trunk/maven-invoker-plugin/src/it/project-setup/pom.xml
    
maven/plugins/trunk/maven-invoker-plugin/src/main/java/org/apache/maven/plugin/invoker/InvokerMojo.java

Modified: maven/plugins/trunk/maven-invoker-plugin/pom.xml
URL: 
http://svn.apache.org/viewvc/maven/plugins/trunk/maven-invoker-plugin/pom.xml?rev=701662&r1=701661&r2=701662&view=diff
==============================================================================
--- maven/plugins/trunk/maven-invoker-plugin/pom.xml (original)
+++ maven/plugins/trunk/maven-invoker-plugin/pom.xml Sat Oct  4 09:27:11 2008
@@ -84,11 +84,6 @@
       <version>2.0.6</version>
     </dependency>
     <dependency>
-      <groupId>org.apache.maven.shared</groupId>
-      <artifactId>file-management</artifactId>
-      <version>1.1</version>
-    </dependency>
-    <dependency>
       <groupId>org.beanshell</groupId>
       <artifactId>bsh</artifactId>
       <version>2.0b4</version>

Modified: maven/plugins/trunk/maven-invoker-plugin/src/it/project-setup/pom.xml
URL: 
http://svn.apache.org/viewvc/maven/plugins/trunk/maven-invoker-plugin/src/it/project-setup/pom.xml?rev=701662&r1=701661&r2=701662&view=diff
==============================================================================
--- maven/plugins/trunk/maven-invoker-plugin/src/it/project-setup/pom.xml 
(original)
+++ maven/plugins/trunk/maven-invoker-plugin/src/it/project-setup/pom.xml Sat 
Oct  4 09:27:11 2008
@@ -42,7 +42,7 @@
         <configuration>
           <cloneProjectsTo>${project.build.directory}/it</cloneProjectsTo>
           <setupIncludes>
-            <setupInclude>project3/pom.xml</setupInclude>
+            <setupInclude>project3</setupInclude>
           </setupIncludes>
           <pomIncludes>
             <pomInclude>*/pom.xml</pomInclude>

Modified: 
maven/plugins/trunk/maven-invoker-plugin/src/main/java/org/apache/maven/plugin/invoker/InvokerMojo.java
URL: 
http://svn.apache.org/viewvc/maven/plugins/trunk/maven-invoker-plugin/src/main/java/org/apache/maven/plugin/invoker/InvokerMojo.java?rev=701662&r1=701661&r2=701662&view=diff
==============================================================================
--- 
maven/plugins/trunk/maven-invoker-plugin/src/main/java/org/apache/maven/plugin/invoker/InvokerMojo.java
 (original)
+++ 
maven/plugins/trunk/maven-invoker-plugin/src/main/java/org/apache/maven/plugin/invoker/InvokerMojo.java
 Sat Oct  4 09:27:11 2008
@@ -56,8 +56,6 @@
 import org.apache.maven.shared.invoker.Invoker;
 import org.apache.maven.shared.invoker.MavenCommandLineBuilder;
 import org.apache.maven.shared.invoker.MavenInvocationException;
-import org.apache.maven.shared.model.fileset.FileSet;
-import org.apache.maven.shared.model.fileset.util.FileSetManager;
 import org.codehaus.plexus.util.DirectoryScanner;
 import org.codehaus.plexus.util.FileUtils;
 import org.codehaus.plexus.util.IOUtil;
@@ -1501,13 +1499,14 @@
             }
 
             String[] setupPoms = scanProjectsDirectory( setupIncludes, 
excludes );
+            getLog().debug( "Setup projects: " + Arrays.asList( setupPoms ) );
 
-            excludes.addAll( setupIncludes );
             String[] normalPoms = scanProjectsDirectory( pomIncludes, excludes 
);
 
-            poms = new String[setupPoms.length + normalPoms.length];
-            System.arraycopy( setupPoms, 0, poms, 0, setupPoms.length );
-            System.arraycopy( normalPoms, 0, poms, setupPoms.length, 
normalPoms.length );
+            Collection uniquePoms = new LinkedHashSet();
+            uniquePoms.addAll( Arrays.asList( setupPoms ) );
+            uniquePoms.addAll( Arrays.asList( normalPoms ) );
+            poms = (String[]) uniquePoms.toArray( new 
String[uniquePoms.size()] );
         }
 
         poms = relativizeProjectPaths( poms );
@@ -1517,7 +1516,9 @@
 
     /**
      * Scans the projects directory for projects to build. Both (POM) files 
and mere directories will be matched by the
-     * scanner patterns.
+     * scanner patterns. If the patterns match a directory which contains a 
file named "pom.xml", the results will
+     * include the path to this file rather than the directory path in order 
to avoid duplicate invocations of the same
+     * project.
      * 
      * @param includes The include patterns for the scanner, may be 
<code>null</code>.
      * @param excludes The exclude patterns for the scanner, may be 
<code>null</code> to exclude nothing.
@@ -1527,21 +1528,44 @@
     private String[] scanProjectsDirectory( List includes, List excludes )
         throws IOException
     {
-        final FileSet fs = new FileSet();
+        if ( !projectsDirectory.isDirectory() )
+        {
+            return new String[0];
+        }
+
+        DirectoryScanner scanner = new DirectoryScanner();
+        scanner.setBasedir( projectsDirectory.getCanonicalFile() );
+        scanner.setFollowSymlinks( false );
+        if ( includes != null )
+        {
+            scanner.setIncludes( (String[]) includes.toArray( new 
String[includes.size()] ) );
+        }
+        if ( excludes != null )
+        {
+            scanner.setExcludes( (String[]) excludes.toArray( new 
String[excludes.size()] ) );
+        }
+        scanner.addDefaultExcludes();
+        scanner.scan();
 
-        fs.setIncludes( includes );
-        fs.setExcludes( excludes );
-        fs.setDirectory( projectsDirectory.getCanonicalPath() );
-        fs.setFollowSymlinks( false );
-        fs.setUseDefaultExcludes( true );
+        Collection matches = new LinkedHashSet();
 
-        final FileSetManager fsm = new FileSetManager( getLog() );
+        matches.addAll( Arrays.asList( scanner.getIncludedFiles() ) );
 
-        List included = new ArrayList();
-        included.addAll( Arrays.asList( fsm.getIncludedFiles( fs ) ) );
-        included.addAll( Arrays.asList( fsm.getIncludedDirectories( fs ) ) );
+        String[] includedDirs = scanner.getIncludedDirectories();
+        for ( int i = 0; i < includedDirs.length; i++ )
+        {
+            String includedFile = includedDirs[i] + File.separatorChar + 
"pom.xml";
+            if ( new File( scanner.getBasedir(), includedFile ).isFile() )
+            {
+                matches.add( includedFile );
+            }
+            else
+            {
+                matches.add( includedDirs[i] );
+            }
+        }
 
-        return (String[]) included.toArray( new String[included.size()] );
+        return (String[]) matches.toArray( new String[matches.size()] );
     }
 
     /**


Reply via email to