mirror of
https://github.com/siderolabs/talos.git
synced 2025-08-18 12:37:05 +02:00
No major fixes, just keeping version up to date. Signed-off-by: Andrey Smirnov <smirnov.andrey@gmail.com>
99 lines
2.2 KiB
Go
99 lines
2.2 KiB
Go
// This Source Code Form is subject to the terms of the Mozilla Public
|
|
// License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
|
|
package check
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
"strings"
|
|
"unicode/utf8"
|
|
|
|
"github.com/fatih/color"
|
|
"github.com/mattn/go-isatty"
|
|
"golang.org/x/term"
|
|
|
|
"github.com/talos-systems/talos/pkg/conditions"
|
|
)
|
|
|
|
type writerReporter struct {
|
|
w *os.File
|
|
lastLine string
|
|
lastLineTemporary bool
|
|
|
|
colorized bool
|
|
spinnerIdx int
|
|
}
|
|
|
|
var spinner = []string{"◰", "◳", "◲", "◱"}
|
|
|
|
//nolint: gocyclo
|
|
func (wr *writerReporter) Update(condition conditions.Condition) {
|
|
line := strings.TrimSpace(fmt.Sprintf("waiting for %s", condition))
|
|
// replace tabs with spaces to get consistent output length
|
|
line = strings.ReplaceAll(line, "\t", " ")
|
|
|
|
if !wr.colorized {
|
|
if line != wr.lastLine {
|
|
fmt.Fprintln(wr.w, line)
|
|
wr.lastLine = line
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
w, _, _ := term.GetSize(int(wr.w.Fd())) //nolint: errcheck
|
|
if w <= 0 {
|
|
w = 80
|
|
}
|
|
|
|
var coloredLine string
|
|
|
|
showSpinner := false
|
|
prevLineTemporary := wr.lastLineTemporary
|
|
|
|
switch {
|
|
case strings.HasSuffix(line, "..."):
|
|
line = fmt.Sprintf("%s %s", spinner[wr.spinnerIdx], line)
|
|
coloredLine = color.YellowString("%s", line)
|
|
wr.lastLineTemporary = true
|
|
showSpinner = true
|
|
case strings.HasSuffix(line, "OK"):
|
|
coloredLine = line
|
|
wr.lastLineTemporary = false
|
|
default:
|
|
line = fmt.Sprintf("%s %s", spinner[wr.spinnerIdx], line)
|
|
coloredLine = color.RedString("%s", line)
|
|
wr.lastLineTemporary = true
|
|
showSpinner = true
|
|
}
|
|
|
|
if line == wr.lastLine {
|
|
return
|
|
}
|
|
|
|
if showSpinner {
|
|
wr.spinnerIdx = (wr.spinnerIdx + 1) % len(spinner)
|
|
}
|
|
|
|
if prevLineTemporary {
|
|
for _, outputLine := range strings.Split(wr.lastLine, "\n") {
|
|
for i := 0; i < (utf8.RuneCountInString(outputLine)+w-1)/w; i++ {
|
|
fmt.Fprint(wr.w, "\033[A\033[K") // cursor up, clear line
|
|
}
|
|
}
|
|
}
|
|
|
|
fmt.Fprintln(wr.w, coloredLine)
|
|
wr.lastLine = line
|
|
}
|
|
|
|
// StderrReporter returns console reporter with stderr output.
|
|
func StderrReporter() Reporter {
|
|
return &writerReporter{
|
|
w: os.Stderr,
|
|
colorized: isatty.IsTerminal(os.Stderr.Fd()),
|
|
}
|
|
}
|