From 844c54b62de7c8b98dba2227bf32ded9af29dd87 Mon Sep 17 00:00:00 2001 From: Guillaume Nodet Date: Tue, 20 Oct 2020 11:14:15 +0200 Subject: [PATCH] Improve progress display, fixes #112 --- .../jboss/fuse/mvnd/client/DefaultClient.java | 12 +++++++ .../mvnd/common/logging/ClientOutput.java | 2 ++ .../mvnd/common/logging/TerminalOutput.java | 33 ++++++++++++++++++- .../org/jboss/fuse/mvnd/daemon/Server.java | 16 +++++++-- .../logging/smart/AbstractLoggingSpy.java | 5 +-- .../mvnd/logging/smart/MavenLoggingSpy.java | 7 +++- 6 files changed, 69 insertions(+), 6 deletions(-) diff --git a/client/src/main/java/org/jboss/fuse/mvnd/client/DefaultClient.java b/client/src/main/java/org/jboss/fuse/mvnd/client/DefaultClient.java index 98aaca36..9678fd7d 100644 --- a/client/src/main/java/org/jboss/fuse/mvnd/client/DefaultClient.java +++ b/client/src/main/java/org/jboss/fuse/mvnd/client/DefaultClient.java @@ -15,6 +15,7 @@ */ package org.jboss.fuse.mvnd.client; +import java.io.StringReader; import java.nio.file.Path; import java.nio.file.Paths; import java.time.Instant; @@ -200,6 +201,17 @@ public class DefaultClient implements Client { BuildEvent be = (BuildEvent) m; switch (be.getType()) { case BuildStarted: + int projects = 0; + int cores = 0; + Properties props = new Properties(); + try { + props.load(new StringReader(be.getDisplay())); + projects = Integer.parseInt(props.getProperty("projects")); + cores = Integer.parseInt(props.getProperty("cores")); + } catch (Exception e) { + // Ignore + } + output.startBuild(be.getProjectId(), projects, cores); break; case BuildStopped: return new DefaultResult(argv, null); diff --git a/common/src/main/java/org/jboss/fuse/mvnd/common/logging/ClientOutput.java b/common/src/main/java/org/jboss/fuse/mvnd/common/logging/ClientOutput.java index e8f7e7ee..6327f827 100644 --- a/common/src/main/java/org/jboss/fuse/mvnd/common/logging/ClientOutput.java +++ b/common/src/main/java/org/jboss/fuse/mvnd/common/logging/ClientOutput.java @@ -20,6 +20,8 @@ package org.jboss.fuse.mvnd.common.logging; */ public interface ClientOutput extends AutoCloseable { + void startBuild(String name, int projects, int cores); + void projectStateChanged(String projectId, String display); void projectFinished(String projectId); diff --git a/common/src/main/java/org/jboss/fuse/mvnd/common/logging/TerminalOutput.java b/common/src/main/java/org/jboss/fuse/mvnd/common/logging/TerminalOutput.java index f1a63db2..017472e5 100644 --- a/common/src/main/java/org/jboss/fuse/mvnd/common/logging/TerminalOutput.java +++ b/common/src/main/java/org/jboss/fuse/mvnd/common/logging/TerminalOutput.java @@ -63,7 +63,14 @@ public class TerminalOutput implements ClientOutput { private int linesPerProject = 0; private boolean displayDone = false; + private long start; + private String name; + private int totalProjects; + private int doneProjects; + private int usedCores; + enum EventType { + BUILD, PROJECT_STATE, PROJECT_FINISHED, LOG, @@ -108,6 +115,14 @@ public class TerminalOutput implements ClientOutput { this.reader = r; } + public void startBuild(String name, int projects, int cores) { + this.name = name; + this.start = System.currentTimeMillis(); + this.totalProjects = projects; + this.doneProjects = 0; + this.usedCores = cores; + } + public void projectStateChanged(String projectId, String task) { try { queue.put(new Event(EventType.PROJECT_STATE, projectId, task)); @@ -215,6 +230,7 @@ public class TerminalOutput implements ClientOutput { if (prj != null) { prj.log.forEach(log); } + doneProjects++; displayDone(); break; } @@ -285,7 +301,22 @@ public class TerminalOutput implements ClientOutput { int dispLines = rows - 1; // for the "Building..." line dispLines--; // there's a bug which sometimes make the cursor goes one line below, so keep one more line empty at the end if (projects.size() <= dispLines) { - lines.add(new AttributedString("Building...")); + String dstr = ""; + if (start > 0) { + long sec = (System.currentTimeMillis() - this.start) / 1000; + if (sec > 60) { + dstr = "(time: " + (sec / 60) + "m" + (sec % 60) + "s)"; + } else { + dstr = "(time: " + sec + "s)"; + } + } + String pstr = ""; + if (totalProjects > 0) { + pstr = "(progress: " + ((doneProjects * 100) / totalProjects) + "% - " + doneProjects + " out of " + + totalProjects + " projects)"; + } + lines.add(new AttributedString( + "Building " + name + "... (cores: " + usedCores + ")" + dstr + pstr)); int remLogLines = dispLines - projects.size(); for (Project prj : projects.values()) { lines.add(AttributedString.fromAnsi(prj.status != null ? prj.status : prj.id + ":")); diff --git a/daemon/src/main/java/org/jboss/fuse/mvnd/daemon/Server.java b/daemon/src/main/java/org/jboss/fuse/mvnd/daemon/Server.java index 1463117c..b7352190 100644 --- a/daemon/src/main/java/org/jboss/fuse/mvnd/daemon/Server.java +++ b/daemon/src/main/java/org/jboss/fuse/mvnd/daemon/Server.java @@ -16,6 +16,7 @@ package org.jboss.fuse.mvnd.daemon; import java.io.IOException; +import java.io.StringWriter; import java.lang.reflect.Field; import java.net.InetSocketAddress; import java.nio.channels.ServerSocketChannel; @@ -27,6 +28,7 @@ import java.util.Comparator; import java.util.List; import java.util.Locale; import java.util.Map; +import java.util.Properties; import java.util.concurrent.BlockingQueue; import java.util.concurrent.Executors; import java.util.concurrent.PriorityBlockingQueue; @@ -38,6 +40,7 @@ import java.util.concurrent.locks.ReentrantLock; import org.apache.maven.cli.CliRequest; import org.apache.maven.cli.CliRequestBuilder; import org.apache.maven.cli.DaemonMavenCli; +import org.apache.maven.execution.MavenSession; import org.jboss.fuse.mvnd.common.DaemonConnection; import org.jboss.fuse.mvnd.common.DaemonException; import org.jboss.fuse.mvnd.common.DaemonExpirationStatus; @@ -527,8 +530,17 @@ public class Server implements AutoCloseable, Runnable { } @Override - protected void onStartSession() { - queue.add(new BuildEvent(Type.BuildStarted, "", "")); + protected void onStartSession(MavenSession session) { + Properties props = new Properties(); + props.setProperty("projects", Integer.toString(session.getAllProjects().size())); + props.setProperty("cores", Integer.toString(session.getRequest().getDegreeOfConcurrency())); + StringWriter sw = new StringWriter(); + try { + props.store(sw, null); + } catch (IOException e) { + throw new IllegalStateException(e); + } + queue.add(new BuildEvent(Type.BuildStarted, session.getTopLevelProject().getName(), sw.toString())); } @Override diff --git a/daemon/src/main/java/org/jboss/fuse/mvnd/logging/smart/AbstractLoggingSpy.java b/daemon/src/main/java/org/jboss/fuse/mvnd/logging/smart/AbstractLoggingSpy.java index 66637e76..727148f3 100644 --- a/daemon/src/main/java/org/jboss/fuse/mvnd/logging/smart/AbstractLoggingSpy.java +++ b/daemon/src/main/java/org/jboss/fuse/mvnd/logging/smart/AbstractLoggingSpy.java @@ -16,6 +16,7 @@ package org.jboss.fuse.mvnd.logging.smart; import org.apache.maven.execution.ExecutionEvent; +import org.apache.maven.execution.MavenSession; public abstract class AbstractLoggingSpy { @@ -43,7 +44,7 @@ public abstract class AbstractLoggingSpy { } protected void notifySessionStart(ExecutionEvent event) { - onStartSession(); + onStartSession(event.getSession()); } protected void notifySessionFinish(ExecutionEvent event) { @@ -66,7 +67,7 @@ public abstract class AbstractLoggingSpy { onStopMojo(getProjectId(event), getProjectDisplay(event)); } - protected void onStartSession() { + protected void onStartSession(MavenSession session) { } protected void onFinishSession() { diff --git a/daemon/src/main/java/org/jboss/fuse/mvnd/logging/smart/MavenLoggingSpy.java b/daemon/src/main/java/org/jboss/fuse/mvnd/logging/smart/MavenLoggingSpy.java index 1a78bc9e..94b1fafd 100644 --- a/daemon/src/main/java/org/jboss/fuse/mvnd/logging/smart/MavenLoggingSpy.java +++ b/daemon/src/main/java/org/jboss/fuse/mvnd/logging/smart/MavenLoggingSpy.java @@ -16,6 +16,7 @@ package org.jboss.fuse.mvnd.logging.smart; import java.io.IOError; +import org.apache.maven.execution.MavenSession; import org.jboss.fuse.mvnd.common.logging.TerminalOutput; public class MavenLoggingSpy extends AbstractLoggingSpy { @@ -26,9 +27,13 @@ public class MavenLoggingSpy extends AbstractLoggingSpy { } @Override - protected void onStartSession() { + protected void onStartSession(MavenSession session) { try { output = new TerminalOutput(null); + output.startBuild( + session.getTopLevelProject().getName(), + session.getAllProjects().size(), + session.getRequest().getDegreeOfConcurrency()); } catch (Exception e) { throw new IOError(e); }