You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by ma...@apache.org on 2020/12/15 08:23:30 UTC

[maven] branch master updated: [MNG-6566] Plugins that require a certain phase should not fork goals that are already in the execution plan.

This is an automated email from the ASF dual-hosted git repository.

martinkanters pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/maven.git


The following commit(s) were added to refs/heads/master by this push:
     new d8c2cc7  [MNG-6566] Plugins that require a certain phase should not fork goals that are already in the execution plan.
d8c2cc7 is described below

commit d8c2cc7e4ae8e1c82be49aa264f0a0ae026b1f5a
Author: Martin Kanters <ma...@apache.org>
AuthorDate: Tue Oct 27 16:43:24 2020 +0100

    [MNG-6566] Plugins that require a certain phase should not fork goals that are already in the execution plan.
    
    This closes #397
---
 .../DefaultLifecycleExecutionPlanCalculator.java   | 84 ++++++++++++++--------
 .../internal/LifecycleExecutionPlanCalculator.java |  5 +-
 .../maven/lifecycle/LifecycleExecutorTest.java     |  4 +-
 .../stub/LifecycleExecutionPlanCalculatorStub.java |  2 +-
 4 files changed, 64 insertions(+), 31 deletions(-)

diff --git a/maven-core/src/main/java/org/apache/maven/lifecycle/internal/DefaultLifecycleExecutionPlanCalculator.java b/maven-core/src/main/java/org/apache/maven/lifecycle/internal/DefaultLifecycleExecutionPlanCalculator.java
index 279b2af..d90a58b 100644
--- a/maven-core/src/main/java/org/apache/maven/lifecycle/internal/DefaultLifecycleExecutionPlanCalculator.java
+++ b/maven-core/src/main/java/org/apache/maven/lifecycle/internal/DefaultLifecycleExecutionPlanCalculator.java
@@ -27,6 +27,7 @@ import java.util.Collections;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 import javax.inject.Inject;
 import javax.inject.Named;
@@ -153,37 +154,65 @@ public class DefaultLifecycleExecutionPlanCalculator
         MojoNotFoundException, InvalidPluginDescriptorException, NoPluginFoundForPrefixException,
         LifecyclePhaseNotFoundException, LifecycleNotFoundException, PluginVersionResolutionException
     {
+        Set<MojoDescriptor> alreadyPlannedExecutions = fillMojoDescriptors( session, project, mojoExecutions );
+        
         for ( MojoExecution mojoExecution : mojoExecutions )
         {
-            setupMojoExecution( session, project, mojoExecution );
+            setupMojoExecution( session, project, mojoExecution, alreadyPlannedExecutions );
         }
     }
 
-    @Override
-    public void setupMojoExecution( MavenSession session, MavenProject project, MojoExecution mojoExecution )
-        throws PluginNotFoundException, PluginResolutionException, PluginDescriptorParsingException,
-        MojoNotFoundException, InvalidPluginDescriptorException, NoPluginFoundForPrefixException,
-        LifecyclePhaseNotFoundException, LifecycleNotFoundException, PluginVersionResolutionException
+    private Set<MojoDescriptor> fillMojoDescriptors( MavenSession session, MavenProject project,
+                                                    List<MojoExecution> mojoExecutions )
+            throws InvalidPluginDescriptorException, MojoNotFoundException, PluginResolutionException,
+            PluginDescriptorParsingException, PluginNotFoundException
     {
-        MojoDescriptor mojoDescriptor = mojoExecution.getMojoDescriptor();
+        Set<MojoDescriptor> descriptors = new HashSet<>( mojoExecutions.size() );
+
+        for ( MojoExecution execution : mojoExecutions )
+        {
+            MojoDescriptor mojoDescriptor = fillMojoDescriptor( session, project, execution );
+            descriptors.add( mojoDescriptor );
+        }
+
+        return descriptors;
+    }
+
+    private MojoDescriptor fillMojoDescriptor( MavenSession session, MavenProject project, MojoExecution execution )
+            throws PluginNotFoundException, PluginResolutionException, PluginDescriptorParsingException,
+            MojoNotFoundException, InvalidPluginDescriptorException
+    {
+        MojoDescriptor mojoDescriptor = execution.getMojoDescriptor();
 
         if ( mojoDescriptor == null )
         {
             mojoDescriptor =
-                pluginManager.getMojoDescriptor( mojoExecution.getPlugin(), mojoExecution.getGoal(),
-                                                 project.getRemotePluginRepositories(),
-                                                 session.getRepositorySession() );
+                    pluginManager.getMojoDescriptor( execution.getPlugin(), execution.getGoal(),
+                            project.getRemotePluginRepositories(),
+                            session.getRepositorySession() );
 
-            mojoExecution.setMojoDescriptor( mojoDescriptor );
+            execution.setMojoDescriptor( mojoDescriptor );
         }
 
+        return mojoDescriptor;
+    }
+
+    @Override
+    public void setupMojoExecution( MavenSession session, MavenProject project, MojoExecution mojoExecution,
+                                    Set<MojoDescriptor> alreadyPlannedExecutions )
+        throws PluginNotFoundException, PluginResolutionException, PluginDescriptorParsingException,
+        MojoNotFoundException, InvalidPluginDescriptorException, NoPluginFoundForPrefixException,
+        LifecyclePhaseNotFoundException, LifecycleNotFoundException, PluginVersionResolutionException
+    {
+        fillMojoDescriptor( session, project, mojoExecution );
+
         mojoExecutionConfigurator( mojoExecution ).configure( project,
                                                               mojoExecution,
                                                         MojoExecution.Source.CLI.equals( mojoExecution.getSource() ) );
 
         finalizeMojoConfiguration( mojoExecution );
 
-        calculateForkedExecutions( mojoExecution, session, project, new HashSet<>() );
+        calculateForkedExecutions( mojoExecution, session, project, alreadyPlannedExecutions );
     }
 
     public List<MojoExecution> calculateMojoExecutions( MavenSession session, MavenProject project, List<Object> tasks )
@@ -339,7 +368,7 @@ public class DefaultLifecycleExecutionPlanCalculator
     }
 
     private void calculateForkedExecutions( MojoExecution mojoExecution, MavenSession session, MavenProject project,
-                                            Collection<MojoDescriptor> alreadyForkedExecutions )
+                                            Collection<MojoDescriptor> alreadyPlannedExecutions )
         throws MojoNotFoundException, PluginNotFoundException, PluginResolutionException,
         PluginDescriptorParsingException, NoPluginFoundForPrefixException, InvalidPluginDescriptorException,
         LifecyclePhaseNotFoundException, LifecycleNotFoundException, PluginVersionResolutionException
@@ -351,10 +380,7 @@ public class DefaultLifecycleExecutionPlanCalculator
             return;
         }
 
-        if ( !alreadyForkedExecutions.add( mojoDescriptor ) )
-        {
-            return;
-        }
+        alreadyPlannedExecutions.add( mojoDescriptor );
 
         List<MavenProject> forkedProjects =
             LifecycleDependencyResolver.getProjects( project, session, mojoDescriptor.isAggregator() );
@@ -371,23 +397,25 @@ public class DefaultLifecycleExecutionPlanCalculator
             if ( StringUtils.isNotEmpty( mojoDescriptor.getExecutePhase() ) )
             {
                 forkedExecutions =
-                    calculateForkedLifecycle( mojoExecution, session, forkedProject, alreadyForkedExecutions );
+                    calculateForkedLifecycle( mojoExecution, session, forkedProject, alreadyPlannedExecutions );
             }
             else
             {
                 forkedExecutions = calculateForkedGoal( mojoExecution, session, forkedProject,
-                                                        alreadyForkedExecutions );
+                                                        alreadyPlannedExecutions );
             }
 
-            mojoExecution.setForkedExecutions( BuilderCommon.getKey( forkedProject ), forkedExecutions );
+            // This List can be empty when the executions are already present in the plan
+            if ( !forkedExecutions.isEmpty() )
+            {
+                mojoExecution.setForkedExecutions( BuilderCommon.getKey( forkedProject ), forkedExecutions );
+            }
         }
-
-        alreadyForkedExecutions.remove( mojoDescriptor );
     }
 
     private List<MojoExecution> calculateForkedLifecycle( MojoExecution mojoExecution, MavenSession session,
                                                           MavenProject project,
-                                                          Collection<MojoDescriptor> alreadyForkedExecutions )
+                                                          Collection<MojoDescriptor> alreadyPlannedExecutions )
         throws MojoNotFoundException, PluginNotFoundException, PluginResolutionException,
         PluginDescriptorParsingException, NoPluginFoundForPrefixException, InvalidPluginDescriptorException,
         LifecyclePhaseNotFoundException, LifecycleNotFoundException, PluginVersionResolutionException
@@ -425,11 +453,11 @@ public class DefaultLifecycleExecutionPlanCalculator
         {
             for ( MojoExecution forkedExecution : forkedExecutions )
             {
-                if ( !alreadyForkedExecutions.contains( forkedExecution.getMojoDescriptor() ) )
+                if ( !alreadyPlannedExecutions.contains( forkedExecution.getMojoDescriptor() ) )
                 {
                     finalizeMojoConfiguration( forkedExecution );
 
-                    calculateForkedExecutions( forkedExecution, session, project, alreadyForkedExecutions );
+                    calculateForkedExecutions( forkedExecution, session, project, alreadyPlannedExecutions );
 
                     mojoExecutions.add( forkedExecution );
                 }
@@ -534,7 +562,7 @@ public class DefaultLifecycleExecutionPlanCalculator
 
     private List<MojoExecution> calculateForkedGoal( MojoExecution mojoExecution, MavenSession session,
                                                      MavenProject project,
-                                                     Collection<MojoDescriptor> alreadyForkedExecutions )
+                                                     Collection<MojoDescriptor> alreadyPlannedExecutions )
         throws MojoNotFoundException, PluginNotFoundException, PluginResolutionException,
         PluginDescriptorParsingException, NoPluginFoundForPrefixException, InvalidPluginDescriptorException,
         LifecyclePhaseNotFoundException, LifecycleNotFoundException, PluginVersionResolutionException
@@ -551,7 +579,7 @@ public class DefaultLifecycleExecutionPlanCalculator
             throw new MojoNotFoundException( forkedGoal, pluginDescriptor );
         }
 
-        if ( alreadyForkedExecutions.contains( forkedMojoDescriptor ) )
+        if ( alreadyPlannedExecutions.contains( forkedMojoDescriptor ) )
         {
             return Collections.emptyList();
         }
@@ -562,7 +590,7 @@ public class DefaultLifecycleExecutionPlanCalculator
 
         finalizeMojoConfiguration( forkedExecution );
 
-        calculateForkedExecutions( forkedExecution, session, project, alreadyForkedExecutions );
+        calculateForkedExecutions( forkedExecution, session, project, alreadyPlannedExecutions );
 
         return Collections.singletonList( forkedExecution );
     }
diff --git a/maven-core/src/main/java/org/apache/maven/lifecycle/internal/LifecycleExecutionPlanCalculator.java b/maven-core/src/main/java/org/apache/maven/lifecycle/internal/LifecycleExecutionPlanCalculator.java
index 7a8d9c9..c5ed0f1 100644
--- a/maven-core/src/main/java/org/apache/maven/lifecycle/internal/LifecycleExecutionPlanCalculator.java
+++ b/maven-core/src/main/java/org/apache/maven/lifecycle/internal/LifecycleExecutionPlanCalculator.java
@@ -29,11 +29,13 @@ import org.apache.maven.plugin.MojoNotFoundException;
 import org.apache.maven.plugin.PluginDescriptorParsingException;
 import org.apache.maven.plugin.PluginNotFoundException;
 import org.apache.maven.plugin.PluginResolutionException;
+import org.apache.maven.plugin.descriptor.MojoDescriptor;
 import org.apache.maven.plugin.prefix.NoPluginFoundForPrefixException;
 import org.apache.maven.plugin.version.PluginVersionResolutionException;
 import org.apache.maven.project.MavenProject;
 
 import java.util.List;
+import java.util.Set;
 
 /**
  * @since 3.0
@@ -58,7 +60,8 @@ public interface LifecycleExecutionPlanCalculator
         PluginDescriptorParsingException, NoPluginFoundForPrefixException, InvalidPluginDescriptorException,
         LifecyclePhaseNotFoundException, LifecycleNotFoundException, PluginVersionResolutionException;
 
-    void setupMojoExecution( MavenSession session, MavenProject project, MojoExecution mojoExecution )
+    void setupMojoExecution( MavenSession session, MavenProject project, MojoExecution mojoExecution,
+                             Set<MojoDescriptor> alreadyPlannedExecutions )
         throws PluginNotFoundException, PluginResolutionException, PluginDescriptorParsingException,
         MojoNotFoundException, InvalidPluginDescriptorException, NoPluginFoundForPrefixException,
         LifecyclePhaseNotFoundException, LifecycleNotFoundException, PluginVersionResolutionException;
diff --git a/maven-core/src/test/java/org/apache/maven/lifecycle/LifecycleExecutorTest.java b/maven-core/src/test/java/org/apache/maven/lifecycle/LifecycleExecutorTest.java
index b1b2adb..205538a 100644
--- a/maven-core/src/test/java/org/apache/maven/lifecycle/LifecycleExecutorTest.java
+++ b/maven-core/src/test/java/org/apache/maven/lifecycle/LifecycleExecutorTest.java
@@ -22,6 +22,7 @@ import java.io.File;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
+import java.util.HashSet;
 import java.util.List;
 
 import org.apache.maven.AbstractCoreMavenComponentTestCase;
@@ -386,7 +387,8 @@ public class LifecycleExecutorTest
         assertEquals(execution.toString(), "maven-it-plugin", execution.getArtifactId());
         assertNull(execution.getConfiguration());
 
-        lifeCycleExecutionPlanCalculator.setupMojoExecution( session, session.getCurrentProject(), execution );
+        lifeCycleExecutionPlanCalculator.setupMojoExecution( session, session.getCurrentProject(), execution,
+                new HashSet<>() );
         assertNotNull(execution.getConfiguration());
         assertEquals("1.0", execution.getConfiguration().getChild( "version" ).getAttribute( "default-value" ));
     }
diff --git a/maven-core/src/test/java/org/apache/maven/lifecycle/internal/stub/LifecycleExecutionPlanCalculatorStub.java b/maven-core/src/test/java/org/apache/maven/lifecycle/internal/stub/LifecycleExecutionPlanCalculatorStub.java
index 0d82ee0..1b945d9 100644
--- a/maven-core/src/test/java/org/apache/maven/lifecycle/internal/stub/LifecycleExecutionPlanCalculatorStub.java
+++ b/maven-core/src/test/java/org/apache/maven/lifecycle/internal/stub/LifecycleExecutionPlanCalculatorStub.java
@@ -158,7 +158,7 @@ public class LifecycleExecutionPlanCalculatorStub
         return calculateExecutionPlan( session, project, tasks, true );
     }
 
-    public void setupMojoExecution( MavenSession session, MavenProject project, MojoExecution mojoExecution )
+    public void setupMojoExecution( MavenSession session, MavenProject project, MojoExecution mojoExecution, Set<MojoDescriptor> alreadyForkedExecutions )
         throws PluginNotFoundException, PluginResolutionException, PluginDescriptorParsingException,
         MojoNotFoundException, InvalidPluginDescriptorException, NoPluginFoundForPrefixException,
         LifecyclePhaseNotFoundException, LifecycleNotFoundException, PluginVersionResolutionException