MartinKanters commented on a change in pull request #659:
URL: https://github.com/apache/maven/pull/659#discussion_r805338772



##########
File path: 
maven-core/src/main/java/org/apache/maven/graph/DefaultGraphBuilder.java
##########
@@ -137,72 +139,88 @@ public DefaultGraphBuilder( BuildResumptionDataRepository 
buildResumptionDataRep
         throws CycleDetectedException, DuplicateProjectException, 
MavenExecutionException
     {
         ProjectDependencyGraph projectDependencyGraph = new 
DefaultProjectDependencyGraph( projects );
-        List<MavenProject> activeProjects = 
projectDependencyGraph.getSortedProjects();
-        activeProjects = trimProjectsToRequest( activeProjects, 
projectDependencyGraph, session.getRequest() );
-        activeProjects = trimSelectedProjects( activeProjects, 
projectDependencyGraph, session.getRequest() );
-        activeProjects = trimResumedProjects( activeProjects, 
projectDependencyGraph, session.getRequest() );
-        activeProjects = trimExcludedProjects( activeProjects, 
projectDependencyGraph, session.getRequest() );
+        List<MavenProject> allSortedProjects = 
projectDependencyGraph.getSortedProjects();
+        MavenExecutionRequest request = session.getRequest();
+
+        // Select projects into the reactor
+        Set<MavenProject> projectsToActivate = new HashSet<>( 
allSortedProjects.size() );
+        Set<MavenProject> projectsBySelection = getProjectsBySelection( 
allSortedProjects, request );
+        projectsToActivate.addAll( projectsBySelection );
 
-        if ( activeProjects.size() != 
projectDependencyGraph.getSortedProjects().size() )
+        // If no projects were selected deliberately by the user, fall back to 
all projects in this dir and below.
+        if ( projectsToActivate.isEmpty() )
         {
-            projectDependencyGraph = new FilteredProjectDependencyGraph( 
projectDependencyGraph, activeProjects );
+            Set<MavenProject> projectsByDirectory = getProjectsByDirectory( 
allSortedProjects, request );
+            projectsToActivate.addAll( projectsByDirectory );
+        }
+
+        // Add all transitive dependencies
+        Set<MavenProject> alsoMakeDependencies = getAlsoMakeDependencies( 
projectsToActivate, request,
+                projectDependencyGraph );
+        projectsToActivate.addAll( alsoMakeDependencies );
+
+        // Trim until resumed project
+        Set<MavenProject> resumedProjects = getResumedProjects( 
projectsToActivate, allSortedProjects, request );
+        projectsToActivate.retainAll( resumedProjects );
+
+        // Add back all transitive dependencies after projects were trimmed
+        projectsToActivate.addAll( alsoMakeDependencies );
+
+        // Remove unwanted projects from the reactor
+        getExcludedProjects( projectsToActivate, projectDependencyGraph, 
request )
+                .forEach( projectsToActivate::remove );
+
+        if ( projectsToActivate.size() != 
projectDependencyGraph.getSortedProjects().size() )
+        {
+            // Sort all projects in build order
+            List<MavenProject> activeProjects = new ArrayList<>( 
projectsToActivate );
+            activeProjects.sort( comparing( allSortedProjects::indexOf ) );
+
+            return Result.success( new FilteredProjectDependencyGraph( 
projectDependencyGraph, activeProjects ) );
         }
 
         return Result.success( projectDependencyGraph );
     }
 
-    private List<MavenProject> trimProjectsToRequest( List<MavenProject> 
activeProjects,
-                                                      ProjectDependencyGraph 
graph,
+    private Set<MavenProject> getProjectsByDirectory( List<MavenProject> 
allSortedProjects,
                                                       MavenExecutionRequest 
request )
             throws MavenExecutionException
     {
-        List<MavenProject> result = activeProjects;
-
-        if ( request.getPom() != null )
+        if ( request.getPom() == null )
         {
-            result = getProjectsInRequestScope( request, activeProjects );
-
-            List<MavenProject> sortedProjects = graph.getSortedProjects();
-            result.sort( comparing( sortedProjects::indexOf ) );
-
-            result = includeAlsoMakeTransitively( result, request, graph );
+            return new HashSet<>( allSortedProjects );
         }
 
-        return result;
+        return getProjectsInRequestScope( request, allSortedProjects );
     }
 
-    private List<MavenProject> trimSelectedProjects( List<MavenProject> 
projects, ProjectDependencyGraph graph,
-                                                     MavenExecutionRequest 
request )
+    private Set<MavenProject> getProjectsBySelection( List<MavenProject> 
allSortedProjects,
+                                                      MavenExecutionRequest 
request )
         throws MavenExecutionException
     {
-        List<MavenProject> result = projects;
-
         ProjectActivation projectActivation = request.getProjectActivation();
         Set<String> requiredSelectors = 
projectActivation.getRequiredActiveProjectSelectors();
         Set<String> optionalSelectors = 
projectActivation.getOptionalActiveProjectSelectors();
-        if ( !requiredSelectors.isEmpty() || !optionalSelectors.isEmpty() )
+        if ( requiredSelectors.isEmpty() && optionalSelectors.isEmpty() )
         {
-            Set<MavenProject> selectedProjects = new HashSet<>( 
requiredSelectors.size() + optionalSelectors.size() );
-            selectedProjects.addAll( getProjectsBySelectors( request, 
projects, requiredSelectors, true ) );
-            selectedProjects.addAll( getProjectsBySelectors( request, 
projects, optionalSelectors, false ) );
-
-            // it can be empty when an optional project is missing from the 
reactor, fallback to returning all projects
-            if ( !selectedProjects.isEmpty() )
-            {
-                result = new ArrayList<>( selectedProjects );
+            return Collections.emptySet();
+        }
 
-                result = includeAlsoMakeTransitively( result, request, graph );
+        Set<MavenProject> selectedProjects = new HashSet<>( 
requiredSelectors.size() + optionalSelectors.size() );
+        selectedProjects.addAll( getProjectsBySelectors( request, 
allSortedProjects, requiredSelectors, true ) );
+        selectedProjects.addAll( getProjectsBySelectors( request, 
allSortedProjects, optionalSelectors, false ) );
 
-                // Order the new list in the original order
-                List<MavenProject> sortedProjects = graph.getSortedProjects();
-                result.sort( comparing( sortedProjects::indexOf ) );
-            }
+        // it can be empty when an optional project is missing from the reactor

Review comment:
       Actually just realised that this if-check is redundant. Basically it 
does: if (set == empty) return emptySet(); else return set.
   I'll remove it :) 




-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: issues-unsubscr...@maven.apache.org

For queries about this service, please contact Infrastructure at:
us...@infra.apache.org


Reply via email to