debian-mirror-gitlab/workhorse-vendor/gitlab.com/gitlab-org/gitaly/client/std_stream.go
2021-04-17 20:07:23 +05:30

67 lines
1.1 KiB
Go

package client
import (
"fmt"
"io"
"gitlab.com/gitlab-org/gitaly/proto/go/gitalypb"
)
type stdoutStderrResponse interface {
GetExitStatus() *gitalypb.ExitStatus
GetStderr() []byte
GetStdout() []byte
}
func streamHandler(recv func() (stdoutStderrResponse, error), send func(chan error), stdout, stderr io.Writer) (int32, error) {
var (
exitStatus int32
err error
resp stdoutStderrResponse
)
errC := make(chan error, 1)
go send(errC)
for {
resp, err = recv()
if err != nil {
break
}
if resp.GetExitStatus() != nil {
exitStatus = resp.GetExitStatus().GetValue()
}
if len(resp.GetStderr()) > 0 {
if _, err = stderr.Write(resp.GetStderr()); err != nil {
break
}
}
if len(resp.GetStdout()) > 0 {
if _, err = stdout.Write(resp.GetStdout()); err != nil {
break
}
}
}
if err == io.EOF {
err = nil
}
if err != nil {
return exitStatus, err
}
select {
case errSend := <-errC:
if errSend != nil {
// This should not happen
errSend = fmt.Errorf("stdin send error: %v", errSend)
}
return exitStatus, errSend
default:
return exitStatus, nil
}
}