diff options
Diffstat (limited to 'go/vendor/gitlab.com/gitlab-org/gitaly/client/upload_archive.go')
-rw-r--r-- | go/vendor/gitlab.com/gitlab-org/gitaly/client/upload_archive.go | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/go/vendor/gitlab.com/gitlab-org/gitaly/client/upload_archive.go b/go/vendor/gitlab.com/gitlab-org/gitaly/client/upload_archive.go new file mode 100644 index 0000000..6b4d682 --- /dev/null +++ b/go/vendor/gitlab.com/gitlab-org/gitaly/client/upload_archive.go @@ -0,0 +1,40 @@ +package client + +import ( + "io" + + "gitlab.com/gitlab-org/gitaly/streamio" + + pb "gitlab.com/gitlab-org/gitaly-proto/go" + + "golang.org/x/net/context" + "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 *pb.SSHUploadArchiveRequest) (int32, error) { + ctx2, cancel := context.WithCancel(ctx) + defer cancel() + + ssh := pb.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(&pb.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) +} |