mirror of
https://github.com/containers/podman.git
synced 2025-12-12 17:57:31 +08:00
podman machine allows podman to create, manage, and interact with a vm running some form of linux (default is fcos). podman is then configured to be able to interact with the vm automatically. while this is usable on linux, the real push is to get this working on both current apple architectures in macos. Ashley Cui contributed to this PR and was a great help. [NO TESTS NEEDED] Signed-off-by: baude <bbaude@redhat.com>
85 lines
1.8 KiB
Go
85 lines
1.8 KiB
Go
package cwriter
|
|
|
|
import (
|
|
"bytes"
|
|
"errors"
|
|
"io"
|
|
"os"
|
|
"strconv"
|
|
)
|
|
|
|
// ErrNotTTY not a TeleTYpewriter error.
|
|
var ErrNotTTY = errors.New("not a terminal")
|
|
|
|
// http://ascii-table.com/ansi-escape-sequences.php
|
|
const (
|
|
escOpen = "\x1b["
|
|
cuuAndEd = "A\x1b[J"
|
|
)
|
|
|
|
// Writer is a buffered the writer that updates the terminal. The
|
|
// contents of writer will be flushed when Flush is called.
|
|
type Writer struct {
|
|
out io.Writer
|
|
buf bytes.Buffer
|
|
lineCount int
|
|
fd int
|
|
isTerminal bool
|
|
}
|
|
|
|
// New returns a new Writer with defaults.
|
|
func New(out io.Writer) *Writer {
|
|
w := &Writer{out: out}
|
|
if f, ok := out.(*os.File); ok {
|
|
w.fd = int(f.Fd())
|
|
w.isTerminal = IsTerminal(w.fd)
|
|
}
|
|
return w
|
|
}
|
|
|
|
// Flush flushes the underlying buffer.
|
|
func (w *Writer) Flush(lineCount int) (err error) {
|
|
// some terminals interpret 'cursor up 0' as 'cursor up 1'
|
|
if w.lineCount > 0 {
|
|
err = w.clearLines()
|
|
if err != nil {
|
|
return
|
|
}
|
|
}
|
|
w.lineCount = lineCount
|
|
_, err = w.buf.WriteTo(w.out)
|
|
return
|
|
}
|
|
|
|
// Write appends the contents of p to the underlying buffer.
|
|
func (w *Writer) Write(p []byte) (n int, err error) {
|
|
return w.buf.Write(p)
|
|
}
|
|
|
|
// WriteString writes string to the underlying buffer.
|
|
func (w *Writer) WriteString(s string) (n int, err error) {
|
|
return w.buf.WriteString(s)
|
|
}
|
|
|
|
// ReadFrom reads from the provided io.Reader and writes to the
|
|
// underlying buffer.
|
|
func (w *Writer) ReadFrom(r io.Reader) (n int64, err error) {
|
|
return w.buf.ReadFrom(r)
|
|
}
|
|
|
|
// GetWidth returns width of underlying terminal.
|
|
func (w *Writer) GetWidth() (int, error) {
|
|
if !w.isTerminal {
|
|
return -1, ErrNotTTY
|
|
}
|
|
tw, _, err := GetSize(w.fd)
|
|
return tw, err
|
|
}
|
|
|
|
func (w *Writer) ansiCuuAndEd() (err error) {
|
|
buf := make([]byte, 8)
|
|
buf = strconv.AppendInt(buf[:copy(buf, escOpen)], int64(w.lineCount), 10)
|
|
_, err = w.out.Write(append(buf, cuuAndEd...))
|
|
return
|
|
}
|