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