From 95293d51c17744599e31b76e3d18ae612c516a0c Mon Sep 17 00:00:00 2001 From: buffer <1045931706@qq.com> Date: Tue, 21 Dec 2021 16:53:46 +0800 Subject: [PATCH] ctl: pd-ctl cmd will work well in char device mode (#4479) * pd-ctl cmd will work well in crontab && close 4478 Signed-off-by: bufferflies <1045931706@qq.com> * add unit test && close #4478 Signed-off-by: bufferflies <1045931706@qq.com> * string nil and add return Signed-off-by: bufferflies <1045931706@qq.com> Co-authored-by: Ti Chi Robot --- tools/pd-ctl/main.go | 11 ++++------- tools/pd-ctl/pdctl/ctl.go | 12 ++++++++++++ tools/pd-ctl/pdctl/ctl_test.go | 29 +++++++++++++++++++++++++++++ 3 files changed, 45 insertions(+), 7 deletions(-) diff --git a/tools/pd-ctl/main.go b/tools/pd-ctl/main.go index 9d969483be0..3ee1956a56e 100644 --- a/tools/pd-ctl/main.go +++ b/tools/pd-ctl/main.go @@ -16,10 +16,8 @@ package main import ( "fmt" - "io" "os" "os/signal" - "strings" "syscall" "github.com/tikv/pd/tools/pd-ctl/pdctl" @@ -49,16 +47,15 @@ func main() { } }() - var input []string + var inputs []string stat, _ := os.Stdin.Stat() if (stat.Mode() & os.ModeCharDevice) == 0 { - b, err := io.ReadAll(os.Stdin) + in, err := pdctl.ReadStdin(os.Stdin) if err != nil { fmt.Println(err) return } - input = strings.Split(strings.TrimSpace(string(b)), " ") + inputs = in } - - pdctl.MainStart(append(os.Args[1:], input...)) + pdctl.MainStart(append(os.Args[1:], inputs...)) } diff --git a/tools/pd-ctl/pdctl/ctl.go b/tools/pd-ctl/pdctl/ctl.go index b6cb2fd162f..ef3c1467208 100644 --- a/tools/pd-ctl/pdctl/ctl.go +++ b/tools/pd-ctl/pdctl/ctl.go @@ -198,3 +198,15 @@ func genCompleter(cmd *cobra.Command) []readline.PrefixCompleterInterface { } return pc } + +// ReadStdin convert stdin to string array +func ReadStdin(r io.Reader) (input []string, err error) { + b, err := io.ReadAll(r) + if err != nil { + return nil, err + } + if s := strings.TrimSpace(string(b)); len(s) > 0 { + input = strings.Split(s, " ") + } + return input, nil +} diff --git a/tools/pd-ctl/pdctl/ctl_test.go b/tools/pd-ctl/pdctl/ctl_test.go index cf3d2840811..90369bab46c 100644 --- a/tools/pd-ctl/pdctl/ctl_test.go +++ b/tools/pd-ctl/pdctl/ctl_test.go @@ -15,6 +15,8 @@ package pdctl import ( + "io" + "strings" "testing" "github.com/spf13/cobra" @@ -68,3 +70,30 @@ func TestGenCompleter(t *testing.T) { } } } + +func TestReadStdin(t *testing.T) { + s := []struct { + in io.Reader + targets []string + }{{ + in: strings.NewReader(""), + targets: []string{}, + }, { + in: strings.NewReader("a b c"), + targets: []string{"a", "b", "c"}, + }} + for _, v := range s { + in, err := ReadStdin(v.in) + if err != nil { + t.Errorf("ReadStdin err:%v", err) + } + if len(v.targets) != len(in) { + t.Errorf("ReadStdin = %v, want %s, nil", in, v.targets) + } + for i, target := range v.targets { + if target != in[i] { + t.Errorf("ReadStdin = %v, want %s, nil", in, v.targets) + } + } + } +}