From 7597cdb19b8ed0b5771312224ddc322654f9788c Mon Sep 17 00:00:00 2001 From: Ethan Atkins Date: Tue, 24 Sep 2019 10:46:48 -0700 Subject: [PATCH] Take terminal width into account in supershell Sometimes if the progress lines are wider than the terminal width, the supershell blank zone can expand indefinitely because be do not move the cursor far enough up to properly re-fill the blank zone. --- .../scala/sbt/internal/util/ConsoleAppender.scala | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 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 eb6ea11c7..132280160 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 @@ -346,9 +346,11 @@ class ConsoleAppender private[ConsoleAppender] ( out.println(s"$DeleteLine$l") if (progress.length > 0) { val pad = if (padding.get > 0) padding.decrementAndGet() else 0 + val width = ConsoleAppender.terminalWidth + val len: Int = progress.foldLeft(progress.length)(_ + terminalLines(width)(_)) deleteConsoleLines(blankZone + pad) progress.foreach(out.println) - out.print(cursorUp(blankZone + progress.length + padding.get)) + out.print(cursorUp(blankZone + len + padding.get)) } } out.flush() @@ -370,18 +372,25 @@ class ConsoleAppender private[ConsoleAppender] ( s"$DeleteLine | => ${item.name} ${elapsed}s" } + val width = ConsoleAppender.terminalWidth + val extra: Int = info.foldLeft(0)(_ + terminalLines(width)(_)) val previousLines = progressLines.getAndSet(info) + val prevExtra = previousLines.foldLeft(0)(_ + terminalLines(width)(_)) + val prevPadding = padding.get - val newPadding = math.max(0, previousLines.length + prevPadding - info.length) + val newPadding = + math.max(0, previousLines.length + prevExtra + prevPadding - info.length - extra) padding.set(newPadding) deleteConsoleLines(newPadding) deleteConsoleLines(blankZone) info.foreach(i => out.println(i)) - out.print(cursorUp(blankZone + info.length + newPadding)) + out.print(cursorUp(blankZone + info.length + newPadding + extra)) out.flush() } + private def terminalLines(width: Int): String => Int = + (progressLine: String) => (progressLine.length - 1) / width private def deleteConsoleLines(n: Int): Unit = { (1 to n) foreach { _ => out.println(DeleteLine)