mirror of
https://github.com/restic/restic.git
synced 2024-12-23 16:26:11 +00:00
b2208bb9c2
This now keeps the cursor at the first column of the first status line so that messages printed to stdout or stderr by some other part of the progarm will still be visible. The message will overwrite the status lines, but those are easily reprinted on the next status update.
36 lines
920 B
Go
36 lines
920 B
Go
package termstatus
|
|
|
|
import (
|
|
"bytes"
|
|
"fmt"
|
|
"io"
|
|
"os"
|
|
)
|
|
|
|
const (
|
|
posixControlMoveCursorHome = "\r"
|
|
posixControlMoveCursorUp = "\x1b[1A"
|
|
posixControlClearLine = "\x1b[2K"
|
|
)
|
|
|
|
// posixClearCurrentLine removes all characters from the current line and resets the
|
|
// cursor position to the first column.
|
|
func posixClearCurrentLine(wr io.Writer, fd uintptr) {
|
|
// clear current line
|
|
_, err := wr.Write([]byte(posixControlMoveCursorHome + posixControlClearLine))
|
|
if err != nil {
|
|
fmt.Fprintf(os.Stderr, "write failed: %v\n", err)
|
|
return
|
|
}
|
|
}
|
|
|
|
// posixMoveCursorUp moves the cursor to the line n lines above the current one.
|
|
func posixMoveCursorUp(wr io.Writer, fd uintptr, n int) {
|
|
data := []byte(posixControlMoveCursorHome)
|
|
data = append(data, bytes.Repeat([]byte(posixControlMoveCursorUp), n)...)
|
|
_, err := wr.Write(data)
|
|
if err != nil {
|
|
fmt.Fprintf(os.Stderr, "write failed: %v\n", err)
|
|
return
|
|
}
|
|
}
|