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

slawekjaranowski pushed a commit to branch maven-3.10.x
in repository https://gitbox.apache.org/repos/asf/maven.git


The following commit(s) were added to refs/heads/maven-3.10.x by this push:
     new c1aeb517e0 In failed build limit reactor summary to only failed 
modules - improvements
c1aeb517e0 is described below

commit c1aeb517e0e4b1f3ae33c2256879c26cf39310bf
Author: Slawomir Jaranowski <[email protected]>
AuthorDate: Sat Jul 11 19:14:01 2026 +0200

    In failed build limit reactor summary to only failed modules - improvements
    
    What changed:
    - Replace `isExecutionRoot` skip logic with `lastWasSkipped` flag in 
`logReactorSummary`
    - Print `...` before first visible entry and after last skipped group
    - Add `testSessionEndedFailureMultimoduleWithSeparatedFailures` test
    - Based on apache/maven#12330 / commit 
794866cb40e793b0ef0db67b4a78149c5dfbd4da
---
 .../maven/cli/event/ExecutionEventLogger.java      | 11 +--
 .../maven/cli/event/ExecutionEventLoggerTest.java  | 82 +++++++++++++++++++---
 2 files changed, 81 insertions(+), 12 deletions(-)

diff --git 
a/maven-embedder/src/main/java/org/apache/maven/cli/event/ExecutionEventLogger.java
 
b/maven-embedder/src/main/java/org/apache/maven/cli/event/ExecutionEventLogger.java
index 8e935964b0..d081cc4b71 100644
--- 
a/maven-embedder/src/main/java/org/apache/maven/cli/event/ExecutionEventLogger.java
+++ 
b/maven-embedder/src/main/java/org/apache/maven/cli/event/ExecutionEventLogger.java
@@ -170,6 +170,7 @@ private void logReactorSummary(MavenSession session) {
         String failureMessage = builder().failure("FAILURE").build();
         String unknownMessage = builder().warning("UNKNOWN").build();
 
+        boolean lastWasSkipped = false;
         for (MavenProject project : projects) {
             BuildSummary buildSummary = result.getBuildSummary(project);
 
@@ -187,11 +188,13 @@ private void logReactorSummary(MavenSession session) {
             }
 
             if (shouldSkip) {
-                if (project.isExecutionRoot()) {
-                    logger.info("...");
-                }
+                lastWasSkipped = true;
                 continue;
             }
+            if (lastWasSkipped) {
+                logger.info("...");
+                lastWasSkipped = false;
+            }
 
             StringBuilder buffer = new StringBuilder(128);
 
@@ -218,7 +221,7 @@ private void logReactorSummary(MavenSession session) {
             logger.info(buffer.toString());
         }
 
-        if (result.hasExceptions()) {
+        if (lastWasSkipped) {
             logger.info("...");
         }
     }
diff --git 
a/maven-embedder/src/test/java/org/apache/maven/cli/event/ExecutionEventLoggerTest.java
 
b/maven-embedder/src/test/java/org/apache/maven/cli/event/ExecutionEventLoggerTest.java
index 65744e7818..00ce1f79c3 100644
--- 
a/maven-embedder/src/test/java/org/apache/maven/cli/event/ExecutionEventLoggerTest.java
+++ 
b/maven-embedder/src/test/java/org/apache/maven/cli/event/ExecutionEventLoggerTest.java
@@ -35,19 +35,25 @@
 import org.apache.maven.jline.MessageUtils;
 import org.apache.maven.project.MavenProject;
 import org.junit.jupiter.api.AfterAll;
+import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 import org.mockito.InOrder;
+import org.mockito.Mockito;
+import org.mockito.MockitoSession;
 import org.slf4j.Logger;
 
 import static org.mockito.ArgumentMatchers.anyString;
 import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.Mockito.inOrder;
+import static org.mockito.Mockito.lenient;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
 public class ExecutionEventLoggerTest {
+    private MockitoSession mockitoSession;
+
     private ExecutionEventLogger executionEventLogger;
 
     private Logger logger;
@@ -64,11 +70,17 @@ public static void tearDownAfterAll() {
 
     @BeforeEach
     public void setup() {
+        mockitoSession = Mockito.mockitoSession().startMocking();
         logger = mock(Logger.class);
         when(logger.isInfoEnabled()).thenReturn(true);
         executionEventLogger = new ExecutionEventLogger(logger);
     }
 
+    @AfterEach
+    public void afterEach() {
+        mockitoSession.finishMocking();
+    }
+
     @Test
     public void testProjectStarted() {
         // prepare
@@ -135,7 +147,6 @@ public void testProjectStartedOverflow() {
     @Test
     public void testProjectStartedNoPom() {
         // prepare
-        File basedir = new File("").getAbsoluteFile();
         ExecutionEvent event = mock(ExecutionEvent.class);
         MavenProject project = mock(MavenProject.class);
         when(project.getGroupId()).thenReturn("org.apache.maven");
@@ -145,7 +156,6 @@ public void testProjectStartedNoPom() {
         when(project.getVersion()).thenReturn("1");
         when(event.getProject()).thenReturn(project);
         when(project.getFile()).thenReturn(null);
-        when(project.getBasedir()).thenReturn(basedir);
 
         // execute
         executionEventLogger.projectStarted(event);
@@ -237,8 +247,6 @@ public void testSessionEndedSuccessMultimodule() {
     public void testSessionEndedFailureMultimodule() {
         // prepare
         MavenProject project1 = aProject("artifact1");
-        when(project1.isExecutionRoot()).thenReturn(true);
-
         MavenProject project2 = aProject("artifact2");
         MavenProject project3 = aProject("artifact3");
 
@@ -282,12 +290,70 @@ public void testSessionEndedFailureMultimodule() {
         
inOrder.verify(logger).info("------------------------------------------------------------------------");
     }
 
+    @Test
+    public void testSessionEndedFailureMultimoduleWithSeparatedFailures() {
+        // prepare
+        MavenProject project1 = aProject("artifact1");
+        MavenProject project2 = aProject("artifact2");
+        MavenProject project3 = aProject("artifact3");
+        MavenProject project4 = aProject("artifact4");
+        MavenProject project5 = aProject("artifact5");
+        MavenProject project6 = aProject("artifact6");
+
+        MavenExecutionResult executionResult = new 
DefaultMavenExecutionResult();
+        executionResult.addBuildSummary(new BuildSuccess(project1, 1000));
+        executionResult.addBuildSummary(new BuildFailure(project2, 2000, new 
Exception("Failure 1")));
+        executionResult.addBuildSummary(new BuildSuccess(project3, 3000));
+        executionResult.addBuildSummary(new BuildSuccess(project4, 4000));
+        executionResult.addBuildSummary(new BuildFailure(project5, 5000, new 
Exception("Failure 2")));
+        executionResult.addException(new Exception("Failure 1"));
+        executionResult.addException(new Exception("Failure 2"));
+
+        MavenExecutionRequest executionRequest = new 
DefaultMavenExecutionRequest();
+        executionRequest.setStartTime(new Date());
+
+        ProjectDependencyGraph projectDependencyGraph = 
mock(ProjectDependencyGraph.class);
+        when(projectDependencyGraph.getSortedProjects())
+                .thenReturn(Arrays.asList(project1, project2, project3, 
project4, project5, project6));
+
+        MavenSession mavenSession = mock(MavenSession.class);
+        when(mavenSession.getResult()).thenReturn(executionResult);
+        when(mavenSession.getRequest()).thenReturn(executionRequest);
+        when(mavenSession.getProjects())
+                .thenReturn(Arrays.asList(project1, project2, project3, 
project4, project5, project6));
+        when(mavenSession.getTopLevelProject()).thenReturn(project1);
+        
when(mavenSession.getProjectDependencyGraph()).thenReturn(projectDependencyGraph);
+
+        ExecutionEvent event = mock(ExecutionEvent.class);
+        when(event.getSession()).thenReturn(mavenSession);
+
+        // execute
+        executionEventLogger.sessionEnded(event);
+
+        // verify
+        InOrder inOrder = inOrder(logger);
+        
inOrder.verify(logger).info("------------------------------------------------------------------------");
+        inOrder.verify(logger).info("Reactor Summary for Maven Project 
artifact1 1.0.0-SNAPSHOT:");
+        inOrder.verify(logger).info("");
+        inOrder.verify(logger).info("...");
+        inOrder.verify(logger).info("Maven Project artifact2 
............................ FAILURE [  2.000 s]");
+        inOrder.verify(logger).info("...");
+        inOrder.verify(logger).info("Maven Project artifact5 
............................ FAILURE [  5.000 s]");
+        inOrder.verify(logger).info("...");
+        
inOrder.verify(logger).info("------------------------------------------------------------------------");
+        inOrder.verify(logger).info("BUILD FAILURE");
+        
inOrder.verify(logger).info("------------------------------------------------------------------------");
+        inOrder.verify(logger).info(eq("Total time:  {}{}"), anyString(), 
anyString());
+        inOrder.verify(logger).info(eq("Finished at: {}"), anyString());
+        
inOrder.verify(logger).info("------------------------------------------------------------------------");
+    }
+
     private MavenProject aProject(String artifactId) {
         MavenProject project = mock(MavenProject.class);
-        when(project.getGroupId()).thenReturn("org.apache.maven");
-        when(project.getArtifactId()).thenReturn(artifactId);
-        when(project.getName()).thenReturn("Maven Project " + artifactId);
-        when(project.getVersion()).thenReturn("1.0.0-SNAPSHOT");
+        lenient().when(project.getGroupId()).thenReturn("org.apache.maven");
+        lenient().when(project.getArtifactId()).thenReturn(artifactId);
+        lenient().when(project.getName()).thenReturn("Maven Project " + 
artifactId);
+        lenient().when(project.getVersion()).thenReturn("1.0.0-SNAPSHOT");
 
         return project;
     }

Reply via email to