Merge pull request #6116 from eatkins/supershell-interlace-v2

Fix supershell blowing away lines on windows
This commit is contained in:
eugene yokota 2020-11-18 18:18:25 -05:00 committed by GitHub
commit 1d0e6928fe
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 19 additions and 10 deletions

View File

@ -85,6 +85,9 @@ private[sbt] final class ProgressState(
prefix.getBytes ++ terminal.prompt.render().getBytes("UTF-8")
} else Array.empty
}
private[this] val cleanPrompt =
(DeleteLine + ClearScreenAfterCursor + CursorLeft1000).getBytes("UTF-8")
private[this] val clearScreenBytes = ClearScreenAfterCursor.getBytes("UTF-8")
private[util] def write(
terminal: Terminal,
bytes: Array[Byte],
@ -96,23 +99,29 @@ private[sbt] final class ProgressState(
addBytes(terminal, bytes)
val toWrite = new ArrayBuffer[Byte]
terminal.prompt match {
case a: Prompt.AskUser if a.render.nonEmpty && canClearPrompt =>
toWrite ++= (DeleteLine + ClearScreenAfterCursor + CursorLeft1000).getBytes("UTF-8")
case _ =>
case a: Prompt.AskUser if a.render.nonEmpty && canClearPrompt => toWrite ++= cleanPrompt
case _ =>
}
bytes.foreach { b =>
if (b == 10) toWrite ++= ClearScreenAfterCursor.getBytes("UTF-8")
toWrite += b
}
toWrite ++= ClearScreenAfterCursor.getBytes("UTF-8")
if (bytes.endsWith(lineSeparatorBytes)) {
val endsWithNewLine = bytes.endsWith(lineSeparatorBytes)
if (endsWithNewLine || bytes.containsSlice(lineSeparatorBytes)) {
val parts = new String(bytes, "UTF-8").split(System.lineSeparator)
def appendLine(l: String, appendNewline: Boolean): Unit = {
toWrite ++= l.getBytes("UTF-8")
toWrite ++= clearScreenBytes
if (appendNewline) toWrite ++= lineSeparatorBytes
}
parts.dropRight(1).foreach(appendLine(_, true))
parts.lastOption.foreach(appendLine(_, bytes.endsWith(lineSeparatorBytes)))
} else toWrite ++= bytes
toWrite ++= clearScreenBytes
if (endsWithNewLine) {
if (progressLines.get.nonEmpty) {
val lastLine = terminal.prompt match {
case a: Prompt.AskUser => a.render()
case _ => currentLine.getOrElse("")
}
val lines = printProgress(terminal, lastLine)
toWrite ++= (ClearScreenAfterCursor + lines).getBytes("UTF-8")
toWrite ++= lines.getBytes("UTF-8")
}
toWrite ++= getPrompt(terminal)
}