From 5cfab4c9a98c2511b0bae07c153af319c4f4e69d Mon Sep 17 00:00:00 2001 From: Ethan Atkins Date: Tue, 24 Sep 2019 16:33:40 -0700 Subject: [PATCH 1/2] Cleanup implementation of progress report It was a bit cleaner to consolidate `extra` and (previousLines|info).length into prevLength and currentLength. --- .../main/scala/sbt/internal/util/ConsoleAppender.scala | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/internal/util-logging/src/main/scala/sbt/internal/util/ConsoleAppender.scala b/internal/util-logging/src/main/scala/sbt/internal/util/ConsoleAppender.scala index 132280160..994b9bd8e 100644 --- a/internal/util-logging/src/main/scala/sbt/internal/util/ConsoleAppender.scala +++ b/internal/util-logging/src/main/scala/sbt/internal/util/ConsoleAppender.scala @@ -373,20 +373,19 @@ class ConsoleAppender private[ConsoleAppender] ( } val width = ConsoleAppender.terminalWidth - val extra: Int = info.foldLeft(0)(_ + terminalLines(width)(_)) + val currentLength = info.foldLeft(info.length)(_ + terminalLines(width)(_)) val previousLines = progressLines.getAndSet(info) - val prevExtra = previousLines.foldLeft(0)(_ + terminalLines(width)(_)) + val prevLength = previousLines.foldLeft(previousLines.length)(_ + terminalLines(width)(_)) val prevPadding = padding.get - val newPadding = - math.max(0, previousLines.length + prevExtra + prevPadding - info.length - extra) + val newPadding = math.max(0, prevLength + prevPadding - currentLength) padding.set(newPadding) deleteConsoleLines(newPadding) deleteConsoleLines(blankZone) info.foreach(i => out.println(i)) - out.print(cursorUp(blankZone + info.length + newPadding + extra)) + out.print(cursorUp(blankZone + currentLength + newPadding)) out.flush() } private def terminalLines(width: Int): String => Int = From 9c2dd05b6a48ad44bcf407251567efc991e73928 Mon Sep 17 00:00:00 2001 From: Ethan Atkins Date: Tue, 24 Sep 2019 16:35:03 -0700 Subject: [PATCH 2/2] Avoid possible divide by zero On the off chance that in some configurations the terminal width is set to zero, avoid an exception by returning 0 for terminal lines. It is likely that supershell will not work well if terminal width is zero, but that's better than a potential crash (I think the crash would be in the progress background thread, so I'm not sure how bad it would be, but still its good to avoid). --- .../src/main/scala/sbt/internal/util/ConsoleAppender.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/util-logging/src/main/scala/sbt/internal/util/ConsoleAppender.scala b/internal/util-logging/src/main/scala/sbt/internal/util/ConsoleAppender.scala index 994b9bd8e..c5d8cbea9 100644 --- a/internal/util-logging/src/main/scala/sbt/internal/util/ConsoleAppender.scala +++ b/internal/util-logging/src/main/scala/sbt/internal/util/ConsoleAppender.scala @@ -389,7 +389,7 @@ class ConsoleAppender private[ConsoleAppender] ( out.flush() } private def terminalLines(width: Int): String => Int = - (progressLine: String) => (progressLine.length - 1) / width + (progressLine: String) => if (width > 0) (progressLine.length - 1) / width else 0 private def deleteConsoleLines(n: Int): Unit = { (1 to n) foreach { _ => out.println(DeleteLine)