Merge pull request #6614 from vvoland/list-tree-header-ansi
image/tree: Fix table header having escape codes when not tty
This commit is contained in:
@@ -1,2 +1,2 @@
|
||||
Info -> U In Use
|
||||
[39m[1mIMAGE[0m [39m[1mID[0m [39m[1mDISK USAGE[0m [39m[1mCONTENT SIZE[0m [39m[1mEXTRA[0m
|
||||
IMAGE ID DISK USAGE CONTENT SIZE EXTRA
|
||||
|
||||
@@ -1,2 +1,2 @@
|
||||
Info -> U In Use
|
||||
[39m[1mIMAGE[0m [39m[1mID[0m [39m[1mDISK USAGE[0m [39m[1mCONTENT SIZE[0m [39m[1mEXTRA[0m
|
||||
IMAGE ID DISK USAGE CONTENT SIZE EXTRA
|
||||
|
||||
@@ -1,2 +1,2 @@
|
||||
Info -> U In Use
|
||||
[39m[1mIMAGE[0m [39m[1mID[0m [39m[1mDISK USAGE[0m [39m[1mCONTENT SIZE[0m [39m[1mEXTRA[0m
|
||||
IMAGE ID DISK USAGE CONTENT SIZE EXTRA
|
||||
|
||||
@@ -1,2 +1,2 @@
|
||||
Info -> U In Use
|
||||
[39m[1mIMAGE[0m [39m[1mID[0m [39m[1mDISK USAGE[0m [39m[1mCONTENT SIZE[0m [39m[1mEXTRA[0m
|
||||
IMAGE ID DISK USAGE CONTENT SIZE EXTRA
|
||||
|
||||
@@ -224,12 +224,12 @@ func getPossibleChips(view treeView) (chips []imageChip) {
|
||||
return possible
|
||||
}
|
||||
|
||||
func printImageTree(dockerCLI command.Cli, view treeView) {
|
||||
if streamRedirected(dockerCLI.Out()) {
|
||||
_, _ = fmt.Fprintln(dockerCLI.Err(), "WARNING: This output is designed for human readability. For machine-readable output, please use --format.")
|
||||
func printImageTree(outs command.Streams, view treeView) {
|
||||
if streamRedirected(outs.Out()) {
|
||||
_, _ = fmt.Fprintln(outs.Err(), "WARNING: This output is designed for human readability. For machine-readable output, please use --format.")
|
||||
}
|
||||
|
||||
out := tui.NewOutput(dockerCLI.Out())
|
||||
out := tui.NewOutput(outs.Out())
|
||||
_, width := out.GetTtySize()
|
||||
if width == 0 {
|
||||
width = 80
|
||||
@@ -241,6 +241,8 @@ func printImageTree(dockerCLI command.Cli, view treeView) {
|
||||
topNameColor := out.Color(aec.NewBuilder(aec.BlueF, aec.Bold).ANSI)
|
||||
normalColor := out.Color(tui.ColorSecondary)
|
||||
untaggedColor := out.Color(tui.ColorTertiary)
|
||||
titleColor := out.Color(tui.ColorTitle)
|
||||
|
||||
isTerm := out.IsTerminal()
|
||||
|
||||
out.Println(generateLegend(out, width))
|
||||
@@ -316,7 +318,7 @@ func printImageTree(dockerCLI command.Cli, view treeView) {
|
||||
_, _ = fmt.Fprint(out, strings.Repeat(" ", columnSpacing))
|
||||
}
|
||||
|
||||
_, _ = fmt.Fprint(out, h.Print(tui.ColorTitle, strings.ToUpper(h.Title)))
|
||||
_, _ = fmt.Fprint(out, h.Print(titleColor, strings.ToUpper(h.Title)))
|
||||
}
|
||||
_, _ = fmt.Fprintln(out)
|
||||
|
||||
|
||||
@@ -0,0 +1,132 @@
|
||||
package image
|
||||
|
||||
import (
|
||||
"strings"
|
||||
"testing"
|
||||
|
||||
"github.com/docker/cli/internal/test"
|
||||
"gotest.tools/v3/assert"
|
||||
)
|
||||
|
||||
func TestPrintImageTreeAnsiTty(t *testing.T) {
|
||||
testCases := []struct {
|
||||
name string
|
||||
stdinTty bool
|
||||
stdoutTty bool
|
||||
stderrTty bool
|
||||
expectedAnsi bool
|
||||
}{
|
||||
{
|
||||
name: "non-terminal",
|
||||
stdinTty: false,
|
||||
stdoutTty: false,
|
||||
stderrTty: false,
|
||||
|
||||
expectedAnsi: false,
|
||||
},
|
||||
{
|
||||
name: "terminal",
|
||||
stdinTty: true,
|
||||
stdoutTty: true,
|
||||
stderrTty: true,
|
||||
|
||||
expectedAnsi: true,
|
||||
},
|
||||
{
|
||||
name: "stdout-tty-only",
|
||||
stdinTty: false,
|
||||
stdoutTty: true,
|
||||
stderrTty: false,
|
||||
|
||||
expectedAnsi: true,
|
||||
},
|
||||
{
|
||||
name: "stdin-stderr-tty-only",
|
||||
stdinTty: true,
|
||||
stdoutTty: false,
|
||||
stderrTty: true,
|
||||
|
||||
expectedAnsi: false,
|
||||
},
|
||||
{
|
||||
name: "stdout-stdin-tty",
|
||||
stdinTty: true,
|
||||
stdoutTty: true,
|
||||
stderrTty: false,
|
||||
|
||||
expectedAnsi: true,
|
||||
},
|
||||
{
|
||||
name: "stdout-stderr-tty",
|
||||
stdinTty: false,
|
||||
stdoutTty: true,
|
||||
stderrTty: true,
|
||||
|
||||
expectedAnsi: true,
|
||||
},
|
||||
{
|
||||
name: "stdin-tty-only",
|
||||
stdinTty: true,
|
||||
stdoutTty: false,
|
||||
stderrTty: false,
|
||||
|
||||
expectedAnsi: false,
|
||||
},
|
||||
{
|
||||
name: "stderr-tty-only",
|
||||
stdinTty: false,
|
||||
stdoutTty: false,
|
||||
stderrTty: true,
|
||||
|
||||
expectedAnsi: false,
|
||||
},
|
||||
}
|
||||
|
||||
mockView := treeView{
|
||||
images: []topImage{
|
||||
{
|
||||
Names: []string{"test-image:latest"},
|
||||
Details: imageDetails{
|
||||
ID: "sha256:1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef",
|
||||
DiskUsage: "10.5 MB",
|
||||
InUse: true,
|
||||
ContentSize: "5.2 MB",
|
||||
},
|
||||
Children: []subImage{
|
||||
{
|
||||
Platform: "linux/amd64",
|
||||
Available: true,
|
||||
Details: imageDetails{
|
||||
ID: "sha256:abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890",
|
||||
DiskUsage: "5.1 MB",
|
||||
InUse: false,
|
||||
ContentSize: "2.5 MB",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
imageSpacing: false,
|
||||
}
|
||||
|
||||
for _, tc := range testCases {
|
||||
t.Run(tc.name, func(t *testing.T) {
|
||||
cli := test.NewFakeCli(nil)
|
||||
cli.In().SetIsTerminal(tc.stdinTty)
|
||||
cli.Out().SetIsTerminal(tc.stdoutTty)
|
||||
cli.Err().SetIsTerminal(tc.stderrTty)
|
||||
|
||||
printImageTree(cli, mockView)
|
||||
|
||||
out := cli.OutBuffer().String()
|
||||
assert.Check(t, len(out) > 0, "Output should not be empty")
|
||||
|
||||
hasAnsi := strings.Contains(out, "\x1b[")
|
||||
if tc.expectedAnsi {
|
||||
assert.Check(t, hasAnsi, "Output should contain ANSI escape codes")
|
||||
} else {
|
||||
assert.Check(t, !hasAnsi, "Output should not contain ANSI escape codes")
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user