mthmulders commented on a change in pull request #446: URL: https://github.com/apache/maven/pull/446#discussion_r583681131
########## File path: maven-core/src/main/java/org/apache/maven/graph/DefaultGraphBuilder.java ########## @@ -176,38 +177,69 @@ public DefaultGraphBuilder( BuildResumptionDataRepository buildResumptionDataRep { List<MavenProject> result = projects; - if ( !request.getSelectedProjects().isEmpty() ) + ProjectActivation projectActivation = request.getProjectActivation(); + Set<String> requiredSelectors = projectActivation.getRequiredActiveProjectSelectors(); + Set<String> optionalSelectors = projectActivation.getOptionalActiveProjectSelectors(); + if ( !requiredSelectors.isEmpty() || !optionalSelectors.isEmpty() ) { - File reactorDirectory = getReactorDirectory( request ); + 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 ); + + 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; + } - Collection<MavenProject> selectedProjects = new LinkedHashSet<>(); + private Set<MavenProject> getProjectsBySelectors( MavenExecutionRequest request, List<MavenProject> projects, + Set<String> projectSelectors, boolean required ) + throws MavenExecutionException + { + Set<MavenProject> selectedProjects = new LinkedHashSet<>(); + File reactorDirectory = getReactorDirectory( request ); - for ( String selector : request.getSelectedProjects() ) + for ( String selector : projectSelectors ) + { + Optional<MavenProject> optSelectedProject = projects.stream() + .filter( project -> isMatchingProject( project, selector, reactorDirectory ) ) + .findFirst(); + if ( !optSelectedProject.isPresent() ) { - 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 ); - - List<MavenProject> children = selectedProject.getCollectedProjects(); - if ( children != null ) + String message = "Could not find the selected project in the reactor: " + selector; + if ( required ) + { + throw new MavenExecutionException( message, request.getPom() ); + } + else { - selectedProjects.addAll( children ); + LOGGER.warn( message ); Review comment: Makes sense... I think it should be consistent between project and profile selection, so if we decide it should be `info` here that should also change for profiles. @michael-o, what do you think? ---------------------------------------------------------------- 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. For queries about this service, please contact Infrastructure at: us...@infra.apache.org