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