You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by rf...@apache.org on 2020/06/20 20:39:41 UTC

[maven] branch master updated: [MNG-6863] Support --also-make flag in combination with --resume-from.

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

rfscholte 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 1e21770  [MNG-6863] Support --also-make flag in combination with --resume-from.
1e21770 is described below

commit 1e217703a8f6d6378e8a92c57878f53368b289af
Author: rfscholte <rf...@apache.org>
AuthorDate: Sat Jun 20 22:39:29 2020 +0200

    [MNG-6863] Support --also-make flag in combination with --resume-from.
    
    Author: Martin Kanters <Ma...@infosupport.com>
---
 .../apache/maven/graph/DefaultGraphBuilder.java    | 183 +++++++--------------
 .../maven/graph/DefaultGraphBuilderTest.java       |  11 +-
 2 files changed, 69 insertions(+), 125 deletions(-)

diff --git a/maven-core/src/main/java/org/apache/maven/graph/DefaultGraphBuilder.java b/maven-core/src/main/java/org/apache/maven/graph/DefaultGraphBuilder.java
index 07cb80e..164c3dc 100644
--- a/maven-core/src/main/java/org/apache/maven/graph/DefaultGraphBuilder.java
+++ b/maven-core/src/main/java/org/apache/maven/graph/DefaultGraphBuilder.java
@@ -25,10 +25,12 @@ import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.Iterator;
 import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 import javax.inject.Inject;
 import javax.inject.Named;
@@ -59,6 +61,8 @@ import org.codehaus.plexus.logging.Logger;
 import org.codehaus.plexus.util.StringUtils;
 import org.codehaus.plexus.util.dag.CycleDetectedException;
 
+import static java.util.Comparator.comparing;
+
 /**
  * Builds the {@link ProjectDependencyGraph inter-dependencies graph} between projects in the reactor.
  */
@@ -149,43 +153,27 @@ public class DefaultGraphBuilder
 
         if ( !request.getSelectedProjects().isEmpty() )
         {
-            result = new ArrayList<>( projects.size() );
+            File reactorDirectory = getReactorDirectory( request );
 
-            File reactorDirectory = null;
-            if ( request.getBaseDirectory() != null )
-            {
-                reactorDirectory = new File( request.getBaseDirectory() );
-            }
-
-            Collection<MavenProject> selectedProjects = new LinkedHashSet<>( projects.size() );
+            Collection<MavenProject> selectedProjects = new LinkedHashSet<>( request.getSelectedProjects().size(), 1 );
 
             for ( String selector : request.getSelectedProjects() )
             {
-                MavenProject selectedProject = null;
-
-                for ( MavenProject project : projects )
-                {
-                    if ( isMatchingProject( project, selector, reactorDirectory ) )
-                    {
-                        selectedProject = project;
-                        break;
-                    }
-                }
-
-                if ( selectedProject != null )
-                {
-                    selectedProjects.add( selectedProject );
-                }
-                else
-                {
-                    throw new MavenExecutionException( "Could not find the selected project in the reactor: "
-                        + selector, request.getPom() );
-                }
+                MavenProject selectedProject = projects.stream()
+                        .filter( project -> isMatchingProject( project, selector, reactorDirectory ) )
+                        .findFirst()
+                        .orElseThrow( () -> new MavenExecutionException(
+                                "Could not find the selected project in the reactor: " + selector, request.getPom() ) );
+                selectedProjects.add( selectedProject );
             }
 
-            result.addAll( selectedProjects );
+            result = new ArrayList<>( selectedProjects );
 
             result = includeAlsoMakeTransitively( result, request, graph );
+
+            // Order the new list in the original order
+            List<MavenProject> sortedProjects = graph.getSortedProjects();
+            result.sort( comparing( sortedProjects::indexOf ) );
         }
 
         return result;
@@ -199,38 +187,20 @@ public class DefaultGraphBuilder
 
         if ( StringUtils.isNotEmpty( request.getResumeFrom() ) )
         {
-            File reactorDirectory = null;
-            if ( request.getBaseDirectory() != null )
-            {
-                reactorDirectory = new File( request.getBaseDirectory() );
-            }
+            File reactorDirectory = getReactorDirectory( request );
 
             String selector = request.getResumeFrom();
 
-            result = new ArrayList<>( projects.size() );
-
-            boolean resumed = false;
-
-            for ( MavenProject project : projects )
-            {
-                if ( !resumed && isMatchingProject( project, selector, reactorDirectory ) )
-                {
-                    resumed = true;
-                }
-
-                if ( resumed )
-                {
-                    result.add( project );
-                }
-            }
-
-            if ( !resumed )
-            {
-                throw new MavenExecutionException( "Could not find project to resume reactor build from: " + selector
-                        + " vs " + formatProjects( projects ), request.getPom() );
-            }
+            MavenProject resumingFromProject = projects.stream()
+                    .filter( project -> isMatchingProject( project, selector, reactorDirectory ) )
+                    .findFirst()
+                    .orElseThrow( () -> new MavenExecutionException(
+                            "Could not find project to resume reactor build from: " + selector + " vs "
+                            + formatProjects( projects ), request.getPom() ) );
+            int resumeFromProjectIndex = projects.indexOf( resumingFromProject );
+            List<MavenProject> retainingProjects = result.subList( resumeFromProjectIndex, projects.size() );
 
-            result = includeAlsoMakeTransitively( result, request, graph );
+            result = includeAlsoMakeTransitively( retainingProjects, request, graph );
         }
 
         return result;
@@ -243,46 +213,18 @@ public class DefaultGraphBuilder
 
         if ( !request.getExcludedProjects().isEmpty() )
         {
-            File reactorDirectory = null;
-
-            if ( request.getBaseDirectory() != null )
-            {
-                reactorDirectory = new File( request.getBaseDirectory() );
-            }
+            File reactorDirectory = getReactorDirectory( request );
 
-            Collection<MavenProject> excludedProjects = new LinkedHashSet<>( projects.size() );
+            result = new ArrayList<>( projects );
 
             for ( String selector : request.getExcludedProjects() )
             {
-                MavenProject excludedProject = null;
-
-                for ( MavenProject project : projects )
-                {
-                    if ( isMatchingProject( project, selector, reactorDirectory ) )
-                    {
-                        excludedProject = project;
-                        break;
-                    }
-                }
-
-                if ( excludedProject != null )
-                {
-                    excludedProjects.add( excludedProject );
-                }
-                else
-                {
-                    throw new MavenExecutionException( "Could not find the selected project in the reactor: "
-                        + selector, request.getPom() );
-                }
-            }
-
-            result = new ArrayList<>( projects.size() );
-            for ( MavenProject project : projects )
-            {
-                if ( !excludedProjects.contains( project ) )
-                {
-                    result.add( project );
-                }
+                MavenProject excludedProject = projects.stream()
+                        .filter( project -> isMatchingProject( project, selector, reactorDirectory ) )
+                        .findFirst()
+                        .orElseThrow( () -> new MavenExecutionException( "Could not find the selected project in "
+                                + "the reactor: " + selector, request.getPom() ) );
+                result.remove( excludedProject );
             }
         }
 
@@ -293,54 +235,41 @@ public class DefaultGraphBuilder
                                                             ProjectDependencyGraph graph )
             throws MavenExecutionException
     {
-        List<MavenProject> result;
+        List<MavenProject> result = projects;
 
-        boolean makeUpstream = false;
-        boolean makeDownstream = false;
+        String makeBehavior = request.getMakeBehavior();
+        boolean makeBoth = MavenExecutionRequest.REACTOR_MAKE_BOTH.equals( makeBehavior );
 
-        if ( MavenExecutionRequest.REACTOR_MAKE_UPSTREAM.equals( request.getMakeBehavior() ) )
-        {
-            makeUpstream = true;
-        }
-        else if ( MavenExecutionRequest.REACTOR_MAKE_DOWNSTREAM.equals( request.getMakeBehavior() ) )
-        {
-            makeDownstream = true;
-        }
-        else if ( MavenExecutionRequest.REACTOR_MAKE_BOTH.equals( request.getMakeBehavior() ) )
-        {
-            makeUpstream = true;
-            makeDownstream = true;
-        }
-        else if ( StringUtils.isNotEmpty( request.getMakeBehavior() ) )
+        boolean makeUpstream = makeBoth || MavenExecutionRequest.REACTOR_MAKE_UPSTREAM.equals( makeBehavior );
+        boolean makeDownstream = makeBoth || MavenExecutionRequest.REACTOR_MAKE_DOWNSTREAM.equals( makeBehavior );
+
+        if ( StringUtils.isNotEmpty( makeBehavior ) && !makeUpstream && !makeDownstream )
         {
-            throw new MavenExecutionException( "Invalid reactor make behavior: " + request.getMakeBehavior(),
+            throw new MavenExecutionException( "Invalid reactor make behavior: " + makeBehavior,
                     request.getPom() );
         }
 
         if ( makeUpstream || makeDownstream )
         {
+            Set<MavenProject> projectsSet = new HashSet<>( projects );
 
-            for ( MavenProject project : new ArrayList<>( projects ) )
+            for ( MavenProject project : projects )
             {
                 if ( makeUpstream )
                 {
-                    projects.addAll( graph.getUpstreamProjects( project, true ) );
+                    projectsSet.addAll( graph.getUpstreamProjects( project, true ) );
                 }
                 if ( makeDownstream )
                 {
-                    projects.addAll( graph.getDownstreamProjects( project, true ) );
+                    projectsSet.addAll( graph.getDownstreamProjects( project, true ) );
                 }
             }
-        }
 
-        result = new ArrayList<>( projects.size() );
+            result = new ArrayList<>( projectsSet );
 
-        for ( MavenProject project : graph.getSortedProjects() )
-        {
-            if ( projects.contains( project ) )
-            {
-                result.add( project );
-            }
+            // Order the new list in the original order
+            List<MavenProject> sortedProjects = graph.getSortedProjects();
+            result.sort( comparing( sortedProjects::indexOf ) );
         }
 
         return result;
@@ -412,6 +341,16 @@ public class DefaultGraphBuilder
         return false;
     }
 
+    private File getReactorDirectory( MavenExecutionRequest request )
+    {
+        if ( request.getBaseDirectory() != null )
+        {
+            return new File( request.getBaseDirectory() );
+        }
+
+        return null;
+    }
+
     // ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
     //
     // Project collection
diff --git a/maven-core/src/test/java/org/apache/maven/graph/DefaultGraphBuilderTest.java b/maven-core/src/test/java/org/apache/maven/graph/DefaultGraphBuilderTest.java
index 5fdd73e..0c545a8 100644
--- a/maven-core/src/test/java/org/apache/maven/graph/DefaultGraphBuilderTest.java
+++ b/maven-core/src/test/java/org/apache/maven/graph/DefaultGraphBuilderTest.java
@@ -140,9 +140,14 @@ public class DefaultGraphBuilderTest
                 scenario( "Exclude the project we are resuming from (as proposed in MNG-6676)" )
                         .resumeFrom( MODULE_B )
                         .excludedProjects( singletonList( MODULE_B ) )
-                        .expectResult( singletonList( MODULE_C ) )
-
-
+                        .expectResult( singletonList( MODULE_C ) ),
+                scenario( "Selected projects in wrong order are resumed correctly in order" )
+                        .selectedProjects( asList( MODULE_C, MODULE_B, MODULE_A ) )
+                        .resumeFrom( MODULE_B )
+                        .expectResult( asList( MODULE_B, MODULE_C ) ),
+                scenario( "Duplicate projects are filtered out" )
+                        .selectedProjects( asList( MODULE_A, MODULE_A ) )
+                        .expectResult( singletonList( MODULE_A ) )
         );
     }