39 lines
999 B
Go
39 lines
999 B
Go
package client
|
|
|
|
import (
|
|
"context"
|
|
"io"
|
|
|
|
"gitlab.com/gitlab-org/gitaly/proto/go/gitalypb"
|
|
"gitlab.com/gitlab-org/gitaly/streamio"
|
|
"google.golang.org/grpc"
|
|
)
|
|
|
|
// UploadArchive proxies an SSH git-upload-archive (git archive --remote) session to Gitaly
|
|
func UploadArchive(ctx context.Context, conn *grpc.ClientConn, stdin io.Reader, stdout, stderr io.Writer, req *gitalypb.SSHUploadArchiveRequest) (int32, error) {
|
|
ctx2, cancel := context.WithCancel(ctx)
|
|
defer cancel()
|
|
|
|
ssh := gitalypb.NewSSHServiceClient(conn)
|
|
stream, err := ssh.SSHUploadArchive(ctx2)
|
|
if err != nil {
|
|
return 0, err
|
|
}
|
|
|
|
if err = stream.Send(req); err != nil {
|
|
return 0, err
|
|
}
|
|
|
|
inWriter := streamio.NewWriter(func(p []byte) error {
|
|
return stream.Send(&gitalypb.SSHUploadArchiveRequest{Stdin: p})
|
|
})
|
|
|
|
return streamHandler(func() (stdoutStderrResponse, error) {
|
|
return stream.Recv()
|
|
}, func(errC chan error) {
|
|
_, errRecv := io.Copy(inWriter, stdin)
|
|
stream.CloseSend()
|
|
errC <- errRecv
|
|
}, stdout, stderr)
|
|
}
|