diff options
Diffstat (limited to 'workhorse/internal/gitaly/diff.go')
-rw-r--r-- | workhorse/internal/gitaly/diff.go | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/workhorse/internal/gitaly/diff.go b/workhorse/internal/gitaly/diff.go new file mode 100644 index 00000000000..035a58ec6fd --- /dev/null +++ b/workhorse/internal/gitaly/diff.go @@ -0,0 +1,55 @@ +package gitaly + +import ( + "context" + "fmt" + "io" + "net/http" + + "gitlab.com/gitlab-org/gitaly/proto/go/gitalypb" + "gitlab.com/gitlab-org/gitaly/streamio" +) + +type DiffClient struct { + gitalypb.DiffServiceClient +} + +func (client *DiffClient) SendRawDiff(ctx context.Context, w http.ResponseWriter, request *gitalypb.RawDiffRequest) error { + c, err := client.RawDiff(ctx, request) + if err != nil { + return fmt.Errorf("rpc failed: %v", err) + } + + w.Header().Del("Content-Length") + + rr := streamio.NewReader(func() ([]byte, error) { + resp, err := c.Recv() + return resp.GetData(), err + }) + + if _, err := io.Copy(w, rr); err != nil { + return fmt.Errorf("copy rpc data: %v", err) + } + + return nil +} + +func (client *DiffClient) SendRawPatch(ctx context.Context, w http.ResponseWriter, request *gitalypb.RawPatchRequest) error { + c, err := client.RawPatch(ctx, request) + if err != nil { + return fmt.Errorf("rpc failed: %v", err) + } + + w.Header().Del("Content-Length") + + rr := streamio.NewReader(func() ([]byte, error) { + resp, err := c.Recv() + return resp.GetData(), err + }) + + if _, err := io.Copy(w, rr); err != nil { + return fmt.Errorf("copy rpc data: %v", err) + } + + return nil +} |