Skip to content
This repository was archived by the owner on Jul 30, 2023. It is now read-only.

Commit d00a659

Browse files
author
Hidetatsu Yaginuma
authored
Merge pull request #69 from dty1er/dty1er/handle_panic
handle panic
2 parents 330bb02 + 1db9c95 commit d00a659

File tree

4 files changed

+21
-24
lines changed

4 files changed

+21
-24
lines changed

command/runner.go

+20-5
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
package command
22

33
import (
4+
"bytes"
45
"fmt"
6+
"io"
57
"os"
68
"os/exec"
79
"strings"
@@ -57,7 +59,7 @@ func Run(args []string, version string) error {
5759

5860
// when should not colorize, just run command and return
5961
// TODO: right now, krew is unsupported by kubecolor but it should be.
60-
if !shouldColorize || subcommandInfo.IsKrew {
62+
if !shouldColorize {
6163
cmd.Stdout = Stdout
6264
cmd.Stderr = Stderr
6365
if err := cmd.Start(); err != nil {
@@ -72,16 +74,21 @@ func Run(args []string, version string) error {
7274
}
7375

7476
// when colorize, capture stdout and err then colorize it
75-
outReader, err := cmd.StdoutPipe()
77+
cmdOut, err := cmd.StdoutPipe()
7678
if err != nil {
7779
return err
7880
}
7981

80-
errReader, err := cmd.StderrPipe()
82+
cmdErr, err := cmd.StderrPipe()
8183
if err != nil {
8284
return err
8385
}
8486

87+
// make buffer to be used in defer recover()
88+
buff := new(bytes.Buffer)
89+
outReader := io.TeeReader(cmdOut, buff)
90+
errReader := io.TeeReader(cmdErr, buff)
91+
8592
if err := cmd.Start(); err != nil {
8693
return err
8794
}
@@ -92,14 +99,22 @@ func Run(args []string, version string) error {
9299

93100
wg.Add(1)
94101
go func() {
102+
defer wg.Done()
103+
defer func() {
104+
if r := recover(); r != nil {
105+
fmt.Fprintf(os.Stdout, buff.String())
106+
}
107+
}()
108+
109+
// This can panic when kubecolor has bug, so recover in defer
95110
printers.FullColoredPrinter.Print(outReader, Stdout)
96-
wg.Done()
97111
}()
98112

99113
wg.Add(1)
100114
go func() {
115+
defer wg.Done()
116+
// This will unlikely panic
101117
printers.ErrorPrinter.Print(errReader, Stderr)
102-
wg.Done()
103118
}()
104119

105120
wg.Wait()

command/subcommand.go

-4
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,6 @@ func ResolveSubcommand(args []string, config *KubecolorConfig) (bool, *kubectl.S
1616
// subcommandFound becomes false when subcommand is not found; e.g. "kubecolor --help"
1717
subcommandInfo, subcommandFound := kubectl.InspectSubcommandInfo(args)
1818

19-
if subcommandInfo.IsKrew {
20-
return false, subcommandInfo
21-
}
22-
2319
// if --plain found, it does not colorize
2420
if config.Plain {
2521
return false, subcommandInfo

kubectl/subcommand.go

+1-13
Original file line numberDiff line numberDiff line change
@@ -195,22 +195,10 @@ func CollectCommandlineOptions(args []string, info *SubcommandInfo) {
195195
}
196196
}
197197

198+
// TODO: return shouldColorize = false when the given args is for plugin
198199
func InspectSubcommandInfo(args []string) (*SubcommandInfo, bool) {
199-
// TODO: support krew
200-
contains := func(s []string, e string) bool {
201-
for _, a := range s {
202-
if a == e {
203-
return true
204-
}
205-
}
206-
return false
207-
}
208200
ret := &SubcommandInfo{}
209201

210-
if contains(args, "krew") {
211-
return &SubcommandInfo{IsKrew: true}, false
212-
}
213-
214202
CollectCommandlineOptions(args, ret)
215203

216204
for i := range args {

kubectl/subcommand_test.go

-2
Original file line numberDiff line numberDiff line change
@@ -62,8 +62,6 @@ func TestInspectSubcommandInfo(t *testing.T) {
6262

6363
{"apply", &SubcommandInfo{Subcommand: Apply}, true},
6464

65-
{"krew version", &SubcommandInfo{IsKrew: true}, false},
66-
6765
{"", &SubcommandInfo{}, false},
6866
}
6967
for _, tt := range tests {

0 commit comments

Comments
 (0)