diff --git a/io/cmd.go b/io/cmd.go index fbb373f..65cf5c8 100644 --- a/io/cmd.go +++ b/io/cmd.go @@ -89,6 +89,7 @@ func RunCmdWithOutputParser(config CmdConfig, prompt bool, regExpStruct ...*CmdO return } errChan := make(chan error) + stdoutBuilder := strings.Builder{} wg.Add(1) go func() { defer wg.Done() @@ -97,9 +98,11 @@ func RunCmdWithOutputParser(config CmdConfig, prompt bool, regExpStruct ...*CmdO if prompt { fmt.Fprintf(os.Stderr, line+"\n") } - stdOut += line + "\n" + stdoutBuilder.WriteString(line) + stdoutBuilder.WriteRune('\n') } }() + stderrBuilder := strings.Builder{} wg.Add(1) go func() { defer wg.Done() @@ -108,7 +111,8 @@ func RunCmdWithOutputParser(config CmdConfig, prompt bool, regExpStruct ...*CmdO if prompt { fmt.Fprintf(os.Stderr, line+"\n") } - errorOut += line + "\n" + stderrBuilder.WriteString(line) + stderrBuilder.WriteRune('\n') if hasError { break } @@ -120,12 +124,11 @@ func RunCmdWithOutputParser(config CmdConfig, prompt bool, regExpStruct ...*CmdO close(errChan) }() - for channelErr := range errChan { - err = errors.Join(err, channelErr) - } - if err != nil { + for err = range errChan { return } + stdOut = stdoutBuilder.String() + errorOut = stderrBuilder.String() err = cmd.Wait() if err != nil { diff --git a/io/cmd_test.go b/io/cmd_test.go index 960c946..13cf5d0 100644 --- a/io/cmd_test.go +++ b/io/cmd_test.go @@ -12,24 +12,24 @@ var matchAllRegexp = regexp.MustCompile(".*") var errParsing = errors.New("parsing error") func TestRunCmdWithOutputParser(t *testing.T) { - config := NewCommand("git", "", []string{"status"}) + config := NewCommand("go", "", []string{"version"}) stdout, stderr, exitOk, err := RunCmdWithOutputParser(config, false, &CmdOutputPattern{ RegExp: matchAllRegexp, ExecFunc: func(pattern *CmdOutputPattern) (string, error) { return pattern.Line, nil }, }) assert.NoError(t, err) assert.True(t, exitOk) - assert.Contains(t, stdout, "On branch") + assert.Contains(t, stdout, "go version") assert.Empty(t, stderr) } func TestRunCmdWithOutputParserError(t *testing.T) { - config := NewCommand("git", "", []string{"status"}) + config := NewCommand("go", "", []string{"version"}) _, _, exitOk, err := RunCmdWithOutputParser(config, false, &CmdOutputPattern{ RegExp: matchAllRegexp, ExecFunc: func(pattern *CmdOutputPattern) (string, error) { return pattern.Line, errParsing }, }) - assert.ErrorContains(t, err, "parsing error\nparsing error") + assert.ErrorContains(t, err, "parsing error") assert.False(t, exitOk) }