mirror of https://github.com/sbt/sbt.git
Merge pull request #6116 from eatkins/supershell-interlace-v2
Fix supershell blowing away lines on windows
This commit is contained in:
commit
1d0e6928fe
|
|
@ -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 ++= l.getBytes("UTF-8")
|
||||||
|
toWrite ++= clearScreenBytes
|
||||||
|
if (appendNewline) toWrite ++= lineSeparatorBytes
|
||||||
}
|
}
|
||||||
toWrite ++= ClearScreenAfterCursor.getBytes("UTF-8")
|
parts.dropRight(1).foreach(appendLine(_, true))
|
||||||
if (bytes.endsWith(lineSeparatorBytes)) {
|
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)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue