famod commented on a change in pull request #446: URL: https://github.com/apache/maven/pull/446#discussion_r579859091
########## 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: TBH, I didn't follow the discussion of optional profiles, but shouldn't this be `info` instead? I mean I as a user have already made very clear at this point (via "?") that the project is optional. So why warn me if it isn't there? For me this is purely informative. IMO, the same applies to optional profiles. ---------------------------------------------------------------- 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