Commit 799417a3 authored by Kim "BKC" Carlbäcker's avatar Kim "BKC" Carlbäcker

- Update gitaly vendoring

- Wire up gitaly-*-pack to Gitaly. Don't pass git-*-pack to go
- Disable tests for go1.5 & 1.6
parent 4539a066
...@@ -63,14 +63,6 @@ go:1.7: ...@@ -63,14 +63,6 @@ go:1.7:
<<: *go_definition <<: *go_definition
image: golang:1.7 image: golang:1.7
go:1.6:
<<: *go_definition
image: golang:1.6
go:1.5:
<<: *go_definition
image: golang:1.5
codeclimate: codeclimate:
before_script: [] before_script: []
image: docker:latest image: docker:latest
......
...@@ -29,7 +29,9 @@ func main() { ...@@ -29,7 +29,9 @@ func main() {
logger.Fatal("unmarshaling request json failed", err) logger.Fatal("unmarshaling request json failed", err)
} }
if err := handler.ReceivePack(os.Args[1], &request); err != nil { code, err := handler.ReceivePack(os.Args[1], &request)
if err != nil {
logger.Fatal("receive-pack failed", err) logger.Fatal("receive-pack failed", err)
} }
os.Exit(int(code))
} }
...@@ -29,7 +29,9 @@ func main() { ...@@ -29,7 +29,9 @@ func main() {
logger.Fatal("unmarshaling request json failed", err) logger.Fatal("unmarshaling request json failed", err)
} }
if err := handler.UploadPack(os.Args[1], &request); err != nil { code, err := handler.UploadPack(os.Args[1], &request)
if err != nil {
logger.Fatal("upload-pack failed", err) logger.Fatal("upload-pack failed", err)
} }
os.Exit(int(code))
} }
package handler package handler
import ( import (
"context"
"fmt" "fmt"
"os"
pb "gitlab.com/gitlab-org/gitaly-proto/go" pb "gitlab.com/gitlab-org/gitaly-proto/go"
"gitlab.com/gitlab-org/gitaly/client"
) )
func ReceivePack(gitalyAddress string, request *pb.SSHReceivePackRequest) error { func ReceivePack(gitalyAddress string, request *pb.SSHReceivePackRequest) (int32, error) {
repoPath := request.Repository.Path if gitalyAddress == "" {
if repoPath == "" { return -1, fmt.Errorf("no gitaly_address given")
return fmt.Errorf("empty path in repository message")
} }
return execCommand("git-receive-pack", repoPath) conn, err := client.Dial(gitalyAddress, client.DefaultDialOpts)
if err != nil {
return -1, err
}
defer conn.Close()
ctx, cancel := context.WithCancel(context.TODO())
defer cancel()
return client.ReceivePack(ctx, conn, os.Stdin, os.Stdout, os.Stderr, request)
} }
package handler package handler
import ( import (
"context"
"fmt" "fmt"
"os"
pb "gitlab.com/gitlab-org/gitaly-proto/go" pb "gitlab.com/gitlab-org/gitaly-proto/go"
"gitlab.com/gitlab-org/gitaly/client"
) )
func UploadPack(gitalyAddress string, request *pb.SSHUploadPackRequest) error { func UploadPack(gitalyAddress string, request *pb.SSHUploadPackRequest) (int32, error) {
repoPath := request.Repository.Path if gitalyAddress == "" {
if repoPath == "" { return -1, fmt.Errorf("no gitaly_address given")
return fmt.Errorf("empty path in repository message")
} }
return execCommand("git-upload-pack", repoPath) conn, err := client.Dial(gitalyAddress, client.DefaultDialOpts)
if err != nil {
return -1, err
}
defer conn.Close()
ctx, cancel := context.WithCancel(context.TODO())
defer cancel()
return client.UploadPack(ctx, conn, os.Stdin, os.Stdout, os.Stderr, request)
} }
// Code generated by protoc-gen-go. // Code generated by protoc-gen-go. DO NOT EDIT.
// source: commit.proto // source: commit.proto
// DO NOT EDIT!
/* /*
Package gitaly is a generated protocol buffer package. Package gitaly is a generated protocol buffer package.
...@@ -17,8 +16,13 @@ It is generated from these files: ...@@ -17,8 +16,13 @@ It is generated from these files:
It has these top-level messages: It has these top-level messages:
CommitIsAncestorRequest CommitIsAncestorRequest
CommitIsAncestorResponse CommitIsAncestorResponse
TreeEntryRequest
TreeEntryResponse
CommitDiffRequest CommitDiffRequest
CommitDiffResponse CommitDiffResponse
CommitDeltaRequest
CommitDelta
CommitDeltaResponse
PostReceiveRequest PostReceiveRequest
PostReceiveResponse PostReceiveResponse
FindDefaultBranchNameRequest FindDefaultBranchNameRequest
...@@ -68,6 +72,35 @@ var _ = math.Inf ...@@ -68,6 +72,35 @@ var _ = math.Inf
// proto package needs to be updated. // proto package needs to be updated.
const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package
type TreeEntryResponse_ObjectType int32
const (
TreeEntryResponse_COMMIT TreeEntryResponse_ObjectType = 0
TreeEntryResponse_BLOB TreeEntryResponse_ObjectType = 1
TreeEntryResponse_TREE TreeEntryResponse_ObjectType = 2
TreeEntryResponse_TAG TreeEntryResponse_ObjectType = 3
)
var TreeEntryResponse_ObjectType_name = map[int32]string{
0: "COMMIT",
1: "BLOB",
2: "TREE",
3: "TAG",
}
var TreeEntryResponse_ObjectType_value = map[string]int32{
"COMMIT": 0,
"BLOB": 1,
"TREE": 2,
"TAG": 3,
}
func (x TreeEntryResponse_ObjectType) String() string {
return proto.EnumName(TreeEntryResponse_ObjectType_name, int32(x))
}
func (TreeEntryResponse_ObjectType) EnumDescriptor() ([]byte, []int) {
return fileDescriptor0, []int{3, 0}
}
type CommitIsAncestorRequest struct { type CommitIsAncestorRequest struct {
Repository *Repository `protobuf:"bytes,1,opt,name=repository" json:"repository,omitempty"` Repository *Repository `protobuf:"bytes,1,opt,name=repository" json:"repository,omitempty"`
AncestorId string `protobuf:"bytes,2,opt,name=ancestor_id,json=ancestorId" json:"ancestor_id,omitempty"` AncestorId string `protobuf:"bytes,2,opt,name=ancestor_id,json=ancestorId" json:"ancestor_id,omitempty"`
...@@ -116,9 +149,100 @@ func (m *CommitIsAncestorResponse) GetValue() bool { ...@@ -116,9 +149,100 @@ func (m *CommitIsAncestorResponse) GetValue() bool {
return false return false
} }
type TreeEntryRequest struct {
Repository *Repository `protobuf:"bytes,1,opt,name=repository" json:"repository,omitempty"`
Revision []byte `protobuf:"bytes,2,opt,name=revision,proto3" json:"revision,omitempty"`
Path []byte `protobuf:"bytes,3,opt,name=path,proto3" json:"path,omitempty"`
Limit int64 `protobuf:"varint,4,opt,name=limit" json:"limit,omitempty"`
}
func (m *TreeEntryRequest) Reset() { *m = TreeEntryRequest{} }
func (m *TreeEntryRequest) String() string { return proto.CompactTextString(m) }
func (*TreeEntryRequest) ProtoMessage() {}
func (*TreeEntryRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{2} }
func (m *TreeEntryRequest) GetRepository() *Repository {
if m != nil {
return m.Repository
}
return nil
}
func (m *TreeEntryRequest) GetRevision() []byte {
if m != nil {
return m.Revision
}
return nil
}
func (m *TreeEntryRequest) GetPath() []byte {
if m != nil {
return m.Path
}
return nil
}
func (m *TreeEntryRequest) GetLimit() int64 {
if m != nil {
return m.Limit
}
return 0
}
type TreeEntryResponse struct {
Type TreeEntryResponse_ObjectType `protobuf:"varint,1,opt,name=type,enum=gitaly.TreeEntryResponse_ObjectType" json:"type,omitempty"`
Oid string `protobuf:"bytes,2,opt,name=oid" json:"oid,omitempty"`
Size int64 `protobuf:"varint,3,opt,name=size" json:"size,omitempty"`
Mode int32 `protobuf:"varint,4,opt,name=mode" json:"mode,omitempty"`
Data []byte `protobuf:"bytes,5,opt,name=data,proto3" json:"data,omitempty"`
}
func (m *TreeEntryResponse) Reset() { *m = TreeEntryResponse{} }
func (m *TreeEntryResponse) String() string { return proto.CompactTextString(m) }
func (*TreeEntryResponse) ProtoMessage() {}
func (*TreeEntryResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{3} }
func (m *TreeEntryResponse) GetType() TreeEntryResponse_ObjectType {
if m != nil {
return m.Type
}
return TreeEntryResponse_COMMIT
}
func (m *TreeEntryResponse) GetOid() string {
if m != nil {
return m.Oid
}
return ""
}
func (m *TreeEntryResponse) GetSize() int64 {
if m != nil {
return m.Size
}
return 0
}
func (m *TreeEntryResponse) GetMode() int32 {
if m != nil {
return m.Mode
}
return 0
}
func (m *TreeEntryResponse) GetData() []byte {
if m != nil {
return m.Data
}
return nil
}
func init() { func init() {
proto.RegisterType((*CommitIsAncestorRequest)(nil), "gitaly.CommitIsAncestorRequest") proto.RegisterType((*CommitIsAncestorRequest)(nil), "gitaly.CommitIsAncestorRequest")
proto.RegisterType((*CommitIsAncestorResponse)(nil), "gitaly.CommitIsAncestorResponse") proto.RegisterType((*CommitIsAncestorResponse)(nil), "gitaly.CommitIsAncestorResponse")
proto.RegisterType((*TreeEntryRequest)(nil), "gitaly.TreeEntryRequest")
proto.RegisterType((*TreeEntryResponse)(nil), "gitaly.TreeEntryResponse")
proto.RegisterEnum("gitaly.TreeEntryResponse_ObjectType", TreeEntryResponse_ObjectType_name, TreeEntryResponse_ObjectType_value)
} }
// Reference imports to suppress errors if they are not otherwise used. // Reference imports to suppress errors if they are not otherwise used.
...@@ -133,6 +257,7 @@ const _ = grpc.SupportPackageIsVersion4 ...@@ -133,6 +257,7 @@ const _ = grpc.SupportPackageIsVersion4
type CommitClient interface { type CommitClient interface {
CommitIsAncestor(ctx context.Context, in *CommitIsAncestorRequest, opts ...grpc.CallOption) (*CommitIsAncestorResponse, error) CommitIsAncestor(ctx context.Context, in *CommitIsAncestorRequest, opts ...grpc.CallOption) (*CommitIsAncestorResponse, error)
TreeEntry(ctx context.Context, in *TreeEntryRequest, opts ...grpc.CallOption) (Commit_TreeEntryClient, error)
} }
type commitClient struct { type commitClient struct {
...@@ -152,10 +277,43 @@ func (c *commitClient) CommitIsAncestor(ctx context.Context, in *CommitIsAncesto ...@@ -152,10 +277,43 @@ func (c *commitClient) CommitIsAncestor(ctx context.Context, in *CommitIsAncesto
return out, nil return out, nil
} }
func (c *commitClient) TreeEntry(ctx context.Context, in *TreeEntryRequest, opts ...grpc.CallOption) (Commit_TreeEntryClient, error) {
stream, err := grpc.NewClientStream(ctx, &_Commit_serviceDesc.Streams[0], c.cc, "/gitaly.Commit/TreeEntry", opts...)
if err != nil {
return nil, err
}
x := &commitTreeEntryClient{stream}
if err := x.ClientStream.SendMsg(in); err != nil {
return nil, err
}
if err := x.ClientStream.CloseSend(); err != nil {
return nil, err
}
return x, nil
}
type Commit_TreeEntryClient interface {
Recv() (*TreeEntryResponse, error)
grpc.ClientStream
}
type commitTreeEntryClient struct {
grpc.ClientStream
}
func (x *commitTreeEntryClient) Recv() (*TreeEntryResponse, error) {
m := new(TreeEntryResponse)
if err := x.ClientStream.RecvMsg(m); err != nil {
return nil, err
}
return m, nil
}
// Server API for Commit service // Server API for Commit service
type CommitServer interface { type CommitServer interface {
CommitIsAncestor(context.Context, *CommitIsAncestorRequest) (*CommitIsAncestorResponse, error) CommitIsAncestor(context.Context, *CommitIsAncestorRequest) (*CommitIsAncestorResponse, error)
TreeEntry(*TreeEntryRequest, Commit_TreeEntryServer) error
} }
func RegisterCommitServer(s *grpc.Server, srv CommitServer) { func RegisterCommitServer(s *grpc.Server, srv CommitServer) {
...@@ -180,6 +338,27 @@ func _Commit_CommitIsAncestor_Handler(srv interface{}, ctx context.Context, dec ...@@ -180,6 +338,27 @@ func _Commit_CommitIsAncestor_Handler(srv interface{}, ctx context.Context, dec
return interceptor(ctx, in, info, handler) return interceptor(ctx, in, info, handler)
} }
func _Commit_TreeEntry_Handler(srv interface{}, stream grpc.ServerStream) error {
m := new(TreeEntryRequest)
if err := stream.RecvMsg(m); err != nil {
return err
}
return srv.(CommitServer).TreeEntry(m, &commitTreeEntryServer{stream})
}
type Commit_TreeEntryServer interface {
Send(*TreeEntryResponse) error
grpc.ServerStream
}
type commitTreeEntryServer struct {
grpc.ServerStream
}
func (x *commitTreeEntryServer) Send(m *TreeEntryResponse) error {
return x.ServerStream.SendMsg(m)
}
var _Commit_serviceDesc = grpc.ServiceDesc{ var _Commit_serviceDesc = grpc.ServiceDesc{
ServiceName: "gitaly.Commit", ServiceName: "gitaly.Commit",
HandlerType: (*CommitServer)(nil), HandlerType: (*CommitServer)(nil),
...@@ -189,26 +368,44 @@ var _Commit_serviceDesc = grpc.ServiceDesc{ ...@@ -189,26 +368,44 @@ var _Commit_serviceDesc = grpc.ServiceDesc{
Handler: _Commit_CommitIsAncestor_Handler, Handler: _Commit_CommitIsAncestor_Handler,
}, },
}, },
Streams: []grpc.StreamDesc{}, Streams: []grpc.StreamDesc{
{
StreamName: "TreeEntry",
Handler: _Commit_TreeEntry_Handler,
ServerStreams: true,
},
},
Metadata: "commit.proto", Metadata: "commit.proto",
} }
func init() { proto.RegisterFile("commit.proto", fileDescriptor0) } func init() { proto.RegisterFile("commit.proto", fileDescriptor0) }
var fileDescriptor0 = []byte{ var fileDescriptor0 = []byte{
// 213 bytes of a gzipped FileDescriptorProto // 404 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x74, 0x50, 0xbf, 0x4e, 0x84, 0x30, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x92, 0xc1, 0x6a, 0xdc, 0x30,
0x18, 0xb7, 0x1a, 0x11, 0x3f, 0x18, 0xcc, 0x17, 0x13, 0x91, 0x05, 0xc2, 0xc4, 0x44, 0x0c, 0x3e, 0x10, 0x86, 0x57, 0xb1, 0xd7, 0x71, 0x26, 0xa6, 0xb8, 0x43, 0xa1, 0xce, 0x5e, 0x62, 0x4c, 0x0f,
0x81, 0x71, 0x62, 0xed, 0xe2, 0x68, 0x2a, 0x6d, 0xa4, 0x09, 0x50, 0x6c, 0x8b, 0x09, 0x8f, 0x70, 0x7b, 0x32, 0xc1, 0xa5, 0xd0, 0x6b, 0x92, 0x2e, 0xc5, 0xd0, 0xb0, 0x20, 0x0c, 0x3d, 0x16, 0xc7,
0x6f, 0x7d, 0xb9, 0xf6, 0xb8, 0x5c, 0xee, 0xc2, 0xf8, 0xfb, 0xdb, 0x5f, 0x3f, 0x88, 0x5b, 0x35, 0x16, 0x5d, 0x15, 0xdb, 0x72, 0x25, 0x25, 0xe0, 0xbe, 0x41, 0xa1, 0xef, 0xd1, 0xf7, 0xe9, 0x13,
0x0c, 0xd2, 0x56, 0x93, 0x56, 0x56, 0x61, 0xf0, 0x2b, 0x2d, 0xeb, 0x97, 0x34, 0x36, 0x1d, 0xd3, 0x15, 0x49, 0x59, 0x37, 0x34, 0xdd, 0x53, 0x6f, 0xff, 0xcc, 0xfc, 0x1e, 0x7f, 0xfa, 0x25, 0x88,
0x82, 0x7b, 0xb6, 0xd8, 0x11, 0x78, 0xf9, 0x74, 0xb6, 0xc6, 0x7c, 0x8c, 0xad, 0x30, 0x56, 0x69, 0x1a, 0xd1, 0xf7, 0x5c, 0xe7, 0xa3, 0x14, 0x5a, 0x60, 0xf0, 0x99, 0xeb, 0xba, 0x9b, 0x56, 0x91,
0x2a, 0xfe, 0x66, 0x61, 0x2c, 0xd6, 0x00, 0x5a, 0x4c, 0xca, 0x48, 0xab, 0xf4, 0x92, 0x90, 0x9c, 0xda, 0xd5, 0x92, 0xb5, 0xae, 0x9b, 0x7d, 0x27, 0xf0, 0xf2, 0xda, 0xda, 0x4a, 0x75, 0x39, 0x34,
0x94, 0x51, 0x8d, 0x95, 0xaf, 0xa9, 0xe8, 0x49, 0xa1, 0x67, 0x2e, 0xcc, 0x20, 0x62, 0xc7, 0x9a, 0x4c, 0x69, 0x21, 0x29, 0xfb, 0x7a, 0xc7, 0x94, 0xc6, 0x02, 0x40, 0xb2, 0x51, 0x28, 0xae, 0x85,
0x6f, 0xc9, 0x93, 0xdb, 0x9c, 0x94, 0x8f, 0x14, 0x56, 0xaa, 0xe1, 0xf8, 0x0a, 0x61, 0xdb, 0xc9, 0x9c, 0x12, 0x92, 0x92, 0xf5, 0x69, 0x81, 0xb9, 0x5b, 0x93, 0xd3, 0x79, 0x42, 0x1f, 0xb9, 0xf0,
0x9e, 0x1f, 0xd4, 0x3b, 0xa7, 0x3e, 0x38, 0xdc, 0xf0, 0xe2, 0x0d, 0x92, 0xeb, 0x29, 0x66, 0x52, 0x1c, 0x4e, 0xeb, 0x87, 0x35, 0x9f, 0x78, 0x9b, 0x1c, 0xa5, 0x64, 0x7d, 0x42, 0x61, 0xdf, 0x2a,
0xa3, 0x11, 0xf8, 0x0c, 0xf7, 0xff, 0xac, 0x9f, 0x85, 0x9b, 0x11, 0x52, 0x0f, 0x6a, 0x06, 0x81, 0x5b, 0x3c, 0x83, 0xb0, 0xd9, 0xf1, 0xae, 0x35, 0x53, 0xcf, 0x4e, 0x8f, 0x6d, 0x5d, 0xb6, 0xd9,
0x4f, 0xe0, 0x17, 0x3c, 0x5d, 0x66, 0x31, 0x5b, 0xb7, 0x6e, 0x7c, 0x30, 0xcd, 0xb7, 0x0d, 0xfe, 0x05, 0x24, 0x4f, 0x51, 0xd4, 0x28, 0x06, 0xc5, 0xf0, 0x05, 0x2c, 0xef, 0xeb, 0xee, 0x8e, 0x59,
0xd9, 0xe2, 0xe6, 0x27, 0x70, 0x77, 0x7a, 0xdf, 0x07, 0x00, 0x00, 0xff, 0xff, 0x5d, 0x48, 0xb7, 0x8c, 0x90, 0xba, 0x22, 0xfb, 0x41, 0x20, 0xae, 0x24, 0x63, 0x9b, 0x41, 0xcb, 0xe9, 0x7f, 0xb0,
0xcb, 0x4d, 0x01, 0x00, 0x00, 0x57, 0x10, 0x4a, 0x76, 0xcf, 0x15, 0x17, 0x83, 0x65, 0x8e, 0xe8, 0x5c, 0x23, 0x82, 0x3f, 0xd6,
0x7a, 0x67, 0x69, 0x23, 0x6a, 0xb5, 0xc1, 0xe9, 0x78, 0xcf, 0x75, 0xe2, 0xa7, 0x64, 0xed, 0x51,
0x57, 0x64, 0xbf, 0x08, 0x3c, 0x7f, 0x84, 0xf3, 0x80, 0xfe, 0x16, 0x7c, 0x3d, 0x8d, 0x8e, 0xfc,
0x59, 0xf1, 0x6a, 0x4f, 0xf2, 0xc4, 0x98, 0x6f, 0x6f, 0xbf, 0xb0, 0x46, 0x57, 0xd3, 0xc8, 0xa8,
0xfd, 0x02, 0x63, 0xf0, 0xc4, 0x1c, 0xa2, 0x91, 0x86, 0x45, 0xf1, 0x6f, 0xcc, 0xb2, 0x78, 0xd4,
0x6a, 0xd3, 0xeb, 0x45, 0xcb, 0x2c, 0xca, 0x92, 0x5a, 0x6d, 0x7a, 0x6d, 0xad, 0xeb, 0x64, 0xe9,
0x98, 0x8d, 0xce, 0xde, 0x00, 0xfc, 0xf9, 0x03, 0x02, 0x04, 0xd7, 0xdb, 0x9b, 0x9b, 0xb2, 0x8a,
0x17, 0x18, 0x82, 0x7f, 0xf5, 0x61, 0x7b, 0x15, 0x13, 0xa3, 0x2a, 0xba, 0xd9, 0xc4, 0x47, 0x78,
0x0c, 0x5e, 0x75, 0xf9, 0x3e, 0xf6, 0x8a, 0x9f, 0x04, 0x02, 0x77, 0x2d, 0xf8, 0x11, 0xe2, 0xbf,
0x2f, 0x08, 0xcf, 0xf7, 0xe7, 0x39, 0xf0, 0x8a, 0x56, 0xe9, 0x61, 0x83, 0x3b, 0x77, 0xb6, 0xc0,
0x77, 0x70, 0x32, 0xc7, 0x81, 0xc9, 0x3f, 0x12, 0x72, 0xab, 0xce, 0x0e, 0x66, 0x97, 0x2d, 0x2e,
0xc8, 0x6d, 0x60, 0x9f, 0xf4, 0xeb, 0xdf, 0x01, 0x00, 0x00, 0xff, 0xff, 0xa2, 0xe6, 0x0b, 0xac,
0xf8, 0x02, 0x00, 0x00,
} }
// Code generated by protoc-gen-go. // Code generated by protoc-gen-go. DO NOT EDIT.
// source: diff.proto // source: diff.proto
// DO NOT EDIT!
package gitaly package gitaly
...@@ -22,6 +21,8 @@ type CommitDiffRequest struct { ...@@ -22,6 +21,8 @@ type CommitDiffRequest struct {
Repository *Repository `protobuf:"bytes,1,opt,name=repository" json:"repository,omitempty"` Repository *Repository `protobuf:"bytes,1,opt,name=repository" json:"repository,omitempty"`
LeftCommitId string `protobuf:"bytes,2,opt,name=left_commit_id,json=leftCommitId" json:"left_commit_id,omitempty"` LeftCommitId string `protobuf:"bytes,2,opt,name=left_commit_id,json=leftCommitId" json:"left_commit_id,omitempty"`
RightCommitId string `protobuf:"bytes,3,opt,name=right_commit_id,json=rightCommitId" json:"right_commit_id,omitempty"` RightCommitId string `protobuf:"bytes,3,opt,name=right_commit_id,json=rightCommitId" json:"right_commit_id,omitempty"`
IgnoreWhitespaceChange bool `protobuf:"varint,4,opt,name=ignore_whitespace_change,json=ignoreWhitespaceChange" json:"ignore_whitespace_change,omitempty"`
Paths [][]byte `protobuf:"bytes,5,rep,name=paths,proto3" json:"paths,omitempty"`
} }
func (m *CommitDiffRequest) Reset() { *m = CommitDiffRequest{} } func (m *CommitDiffRequest) Reset() { *m = CommitDiffRequest{} }
...@@ -50,6 +51,20 @@ func (m *CommitDiffRequest) GetRightCommitId() string { ...@@ -50,6 +51,20 @@ func (m *CommitDiffRequest) GetRightCommitId() string {
return "" return ""
} }
func (m *CommitDiffRequest) GetIgnoreWhitespaceChange() bool {
if m != nil {
return m.IgnoreWhitespaceChange
}
return false
}
func (m *CommitDiffRequest) GetPaths() [][]byte {
if m != nil {
return m.Paths
}
return nil
}
// A CommitDiffResponse corresponds to a single changed file in a commit. // A CommitDiffResponse corresponds to a single changed file in a commit.
type CommitDiffResponse struct { type CommitDiffResponse struct {
FromPath []byte `protobuf:"bytes,1,opt,name=from_path,json=fromPath,proto3" json:"from_path,omitempty"` FromPath []byte `protobuf:"bytes,1,opt,name=from_path,json=fromPath,proto3" json:"from_path,omitempty"`
...@@ -60,7 +75,8 @@ type CommitDiffResponse struct { ...@@ -60,7 +75,8 @@ type CommitDiffResponse struct {
OldMode int32 `protobuf:"varint,5,opt,name=old_mode,json=oldMode" json:"old_mode,omitempty"` OldMode int32 `protobuf:"varint,5,opt,name=old_mode,json=oldMode" json:"old_mode,omitempty"`
NewMode int32 `protobuf:"varint,6,opt,name=new_mode,json=newMode" json:"new_mode,omitempty"` NewMode int32 `protobuf:"varint,6,opt,name=new_mode,json=newMode" json:"new_mode,omitempty"`
Binary bool `protobuf:"varint,7,opt,name=binary" json:"binary,omitempty"` Binary bool `protobuf:"varint,7,opt,name=binary" json:"binary,omitempty"`
RawChunks [][]byte `protobuf:"bytes,8,rep,name=raw_chunks,json=rawChunks,proto3" json:"raw_chunks,omitempty"` RawPatchData []byte `protobuf:"bytes,9,opt,name=raw_patch_data,json=rawPatchData,proto3" json:"raw_patch_data,omitempty"`
EndOfPatch bool `protobuf:"varint,10,opt,name=end_of_patch,json=endOfPatch" json:"end_of_patch,omitempty"`
} }
func (m *CommitDiffResponse) Reset() { *m = CommitDiffResponse{} } func (m *CommitDiffResponse) Reset() { *m = CommitDiffResponse{} }
...@@ -117,9 +133,129 @@ func (m *CommitDiffResponse) GetBinary() bool { ...@@ -117,9 +133,129 @@ func (m *CommitDiffResponse) GetBinary() bool {
return false return false
} }
func (m *CommitDiffResponse) GetRawChunks() [][]byte { func (m *CommitDiffResponse) GetRawPatchData() []byte {
if m != nil {
return m.RawPatchData
}
return nil
}
func (m *CommitDiffResponse) GetEndOfPatch() bool {
if m != nil {
return m.EndOfPatch
}
return false
}
type CommitDeltaRequest struct {
Repository *Repository `protobuf:"bytes,1,opt,name=repository" json:"repository,omitempty"`
LeftCommitId string `protobuf:"bytes,2,opt,name=left_commit_id,json=leftCommitId" json:"left_commit_id,omitempty"`
RightCommitId string `protobuf:"bytes,3,opt,name=right_commit_id,json=rightCommitId" json:"right_commit_id,omitempty"`
Paths [][]byte `protobuf:"bytes,4,rep,name=paths,proto3" json:"paths,omitempty"`
}
func (m *CommitDeltaRequest) Reset() { *m = CommitDeltaRequest{} }
func (m *CommitDeltaRequest) String() string { return proto.CompactTextString(m) }
func (*CommitDeltaRequest) ProtoMessage() {}
func (*CommitDeltaRequest) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{2} }
func (m *CommitDeltaRequest) GetRepository() *Repository {
if m != nil {
return m.Repository
}
return nil
}
func (m *CommitDeltaRequest) GetLeftCommitId() string {
if m != nil {
return m.LeftCommitId
}
return ""
}
func (m *CommitDeltaRequest) GetRightCommitId() string {
if m != nil {
return m.RightCommitId
}
return ""
}
func (m *CommitDeltaRequest) GetPaths() [][]byte {
if m != nil { if m != nil {
return m.RawChunks return m.Paths
}
return nil
}
type CommitDelta struct {
FromPath []byte `protobuf:"bytes,1,opt,name=from_path,json=fromPath,proto3" json:"from_path,omitempty"`
ToPath []byte `protobuf:"bytes,2,opt,name=to_path,json=toPath,proto3" json:"to_path,omitempty"`
// Blob ID as returned via `git diff --full-index`
FromId string `protobuf:"bytes,3,opt,name=from_id,json=fromId" json:"from_id,omitempty"`
ToId string `protobuf:"bytes,4,opt,name=to_id,json=toId" json:"to_id,omitempty"`
OldMode int32 `protobuf:"varint,5,opt,name=old_mode,json=oldMode" json:"old_mode,omitempty"`
NewMode int32 `protobuf:"varint,6,opt,name=new_mode,json=newMode" json:"new_mode,omitempty"`
}
func (m *CommitDelta) Reset() { *m = CommitDelta{} }
func (m *CommitDelta) String() string { return proto.CompactTextString(m) }
func (*CommitDelta) ProtoMessage() {}
func (*CommitDelta) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{3} }
func (m *CommitDelta) GetFromPath() []byte {
if m != nil {
return m.FromPath
}
return nil
}
func (m *CommitDelta) GetToPath() []byte {
if m != nil {
return m.ToPath
}
return nil
}
func (m *CommitDelta) GetFromId() string {
if m != nil {
return m.FromId
}
return ""
}
func (m *CommitDelta) GetToId() string {
if m != nil {
return m.ToId
}
return ""
}
func (m *CommitDelta) GetOldMode() int32 {
if m != nil {
return m.OldMode
}
return 0
}
func (m *CommitDelta) GetNewMode() int32 {
if m != nil {
return m.NewMode
}
return 0
}
type CommitDeltaResponse struct {
Deltas []*CommitDelta `protobuf:"bytes,1,rep,name=deltas" json:"deltas,omitempty"`
}
func (m *CommitDeltaResponse) Reset() { *m = CommitDeltaResponse{} }
func (m *CommitDeltaResponse) String() string { return proto.CompactTextString(m) }
func (*CommitDeltaResponse) ProtoMessage() {}
func (*CommitDeltaResponse) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{4} }
func (m *CommitDeltaResponse) GetDeltas() []*CommitDelta {
if m != nil {
return m.Deltas
} }
return nil return nil
} }
...@@ -127,6 +263,9 @@ func (m *CommitDiffResponse) GetRawChunks() [][]byte { ...@@ -127,6 +263,9 @@ func (m *CommitDiffResponse) GetRawChunks() [][]byte {
func init() { func init() {
proto.RegisterType((*CommitDiffRequest)(nil), "gitaly.CommitDiffRequest") proto.RegisterType((*CommitDiffRequest)(nil), "gitaly.CommitDiffRequest")
proto.RegisterType((*CommitDiffResponse)(nil), "gitaly.CommitDiffResponse") proto.RegisterType((*CommitDiffResponse)(nil), "gitaly.CommitDiffResponse")
proto.RegisterType((*CommitDeltaRequest)(nil), "gitaly.CommitDeltaRequest")
proto.RegisterType((*CommitDelta)(nil), "gitaly.CommitDelta")
proto.RegisterType((*CommitDeltaResponse)(nil), "gitaly.CommitDeltaResponse")
} }
// Reference imports to suppress errors if they are not otherwise used. // Reference imports to suppress errors if they are not otherwise used.
...@@ -140,8 +279,10 @@ const _ = grpc.SupportPackageIsVersion4 ...@@ -140,8 +279,10 @@ const _ = grpc.SupportPackageIsVersion4
// Client API for Diff service // Client API for Diff service
type DiffClient interface { type DiffClient interface {
// Returns stream of CommitDiffResponse: 1 per changed file // Returns stream of CommitDiffResponse with patches chunked over messages
CommitDiff(ctx context.Context, in *CommitDiffRequest, opts ...grpc.CallOption) (Diff_CommitDiffClient, error) CommitDiff(ctx context.Context, in *CommitDiffRequest, opts ...grpc.CallOption) (Diff_CommitDiffClient, error)
// Return a stream so we can divide the response in chunks of deltas
CommitDelta(ctx context.Context, in *CommitDeltaRequest, opts ...grpc.CallOption) (Diff_CommitDeltaClient, error)
} }
type diffClient struct { type diffClient struct {
...@@ -184,11 +325,45 @@ func (x *diffCommitDiffClient) Recv() (*CommitDiffResponse, error) { ...@@ -184,11 +325,45 @@ func (x *diffCommitDiffClient) Recv() (*CommitDiffResponse, error) {
return m, nil return m, nil
} }
func (c *diffClient) CommitDelta(ctx context.Context, in *CommitDeltaRequest, opts ...grpc.CallOption) (Diff_CommitDeltaClient, error) {
stream, err := grpc.NewClientStream(ctx, &_Diff_serviceDesc.Streams[1], c.cc, "/gitaly.Diff/CommitDelta", opts...)
if err != nil {
return nil, err
}
x := &diffCommitDeltaClient{stream}
if err := x.ClientStream.SendMsg(in); err != nil {
return nil, err
}
if err := x.ClientStream.CloseSend(); err != nil {
return nil, err
}
return x, nil
}
type Diff_CommitDeltaClient interface {
Recv() (*CommitDeltaResponse, error)
grpc.ClientStream
}
type diffCommitDeltaClient struct {
grpc.ClientStream
}
func (x *diffCommitDeltaClient) Recv() (*CommitDeltaResponse, error) {
m := new(CommitDeltaResponse)
if err := x.ClientStream.RecvMsg(m); err != nil {
return nil, err
}
return m, nil
}
// Server API for Diff service // Server API for Diff service
type DiffServer interface { type DiffServer interface {
// Returns stream of CommitDiffResponse: 1 per changed file // Returns stream of CommitDiffResponse with patches chunked over messages
CommitDiff(*CommitDiffRequest, Diff_CommitDiffServer) error CommitDiff(*CommitDiffRequest, Diff_CommitDiffServer) error
// Return a stream so we can divide the response in chunks of deltas
CommitDelta(*CommitDeltaRequest, Diff_CommitDeltaServer) error
} }
func RegisterDiffServer(s *grpc.Server, srv DiffServer) { func RegisterDiffServer(s *grpc.Server, srv DiffServer) {
...@@ -216,6 +391,27 @@ func (x *diffCommitDiffServer) Send(m *CommitDiffResponse) error { ...@@ -216,6 +391,27 @@ func (x *diffCommitDiffServer) Send(m *CommitDiffResponse) error {
return x.ServerStream.SendMsg(m) return x.ServerStream.SendMsg(m)
} }
func _Diff_CommitDelta_Handler(srv interface{}, stream grpc.ServerStream) error {
m := new(CommitDeltaRequest)
if err := stream.RecvMsg(m); err != nil {
return err
}
return srv.(DiffServer).CommitDelta(m, &diffCommitDeltaServer{stream})
}
type Diff_CommitDeltaServer interface {
Send(*CommitDeltaResponse) error
grpc.ServerStream
}
type diffCommitDeltaServer struct {
grpc.ServerStream
}
func (x *diffCommitDeltaServer) Send(m *CommitDeltaResponse) error {
return x.ServerStream.SendMsg(m)
}
var _Diff_serviceDesc = grpc.ServiceDesc{ var _Diff_serviceDesc = grpc.ServiceDesc{
ServiceName: "gitaly.Diff", ServiceName: "gitaly.Diff",
HandlerType: (*DiffServer)(nil), HandlerType: (*DiffServer)(nil),
...@@ -226,6 +422,11 @@ var _Diff_serviceDesc = grpc.ServiceDesc{ ...@@ -226,6 +422,11 @@ var _Diff_serviceDesc = grpc.ServiceDesc{
Handler: _Diff_CommitDiff_Handler, Handler: _Diff_CommitDiff_Handler,
ServerStreams: true, ServerStreams: true,
}, },
{
StreamName: "CommitDelta",
Handler: _Diff_CommitDelta_Handler,
ServerStreams: true,
},
}, },
Metadata: "diff.proto", Metadata: "diff.proto",
} }
...@@ -233,26 +434,35 @@ var _Diff_serviceDesc = grpc.ServiceDesc{ ...@@ -233,26 +434,35 @@ var _Diff_serviceDesc = grpc.ServiceDesc{
func init() { proto.RegisterFile("diff.proto", fileDescriptor1) } func init() { proto.RegisterFile("diff.proto", fileDescriptor1) }
var fileDescriptor1 = []byte{ var fileDescriptor1 = []byte{
// 328 bytes of a gzipped FileDescriptorProto // 473 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x6c, 0x91, 0xdd, 0x4a, 0xf3, 0x30, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x94, 0x4d, 0x8a, 0xdb, 0x30,
0x18, 0xc7, 0xdf, 0xec, 0xa3, 0xeb, 0x9e, 0xb7, 0x2a, 0x46, 0xd0, 0x6e, 0x22, 0x94, 0x21, 0xd2, 0x14, 0xc7, 0xab, 0xc4, 0x76, 0x9c, 0x17, 0xf7, 0x4b, 0x29, 0x53, 0x4d, 0x66, 0x63, 0x4c, 0x29,
0xa3, 0x21, 0xf3, 0x12, 0x26, 0xc8, 0x0e, 0x44, 0xc9, 0x0d, 0x94, 0x6c, 0x49, 0xd7, 0x60, 0xdb, 0x86, 0x42, 0x28, 0xe9, 0xa6, 0xeb, 0xce, 0x40, 0xc9, 0x40, 0xe9, 0xe0, 0x4d, 0x97, 0x46, 0x13,
0xa7, 0xa6, 0x19, 0x65, 0x17, 0xe2, 0x25, 0x7a, 0x1f, 0xd2, 0xc4, 0xcd, 0x82, 0x1e, 0xe6, 0xf7, 0xc9, 0xb1, 0xc0, 0xb1, 0x5c, 0x59, 0xc5, 0xe4, 0x1e, 0xdd, 0xf5, 0x00, 0xdd, 0xf4, 0x5a, 0xbd,
0xfb, 0x27, 0x79, 0x3e, 0x00, 0x84, 0x4a, 0xd3, 0x79, 0xa5, 0xd1, 0x20, 0xf5, 0xb6, 0xca, 0xf0, 0x47, 0x91, 0x94, 0x71, 0x3c, 0x25, 0x07, 0xc8, 0x52, 0xff, 0xdf, 0x5f, 0x4f, 0xef, 0xcb, 0x06,
0x7c, 0x3f, 0x0d, 0xea, 0x8c, 0x6b, 0x29, 0x1c, 0x9d, 0x7d, 0x10, 0x38, 0x5f, 0x62, 0x51, 0x28, 0x60, 0xa2, 0x28, 0x96, 0x8d, 0x92, 0x5a, 0xe2, 0x60, 0x2b, 0x34, 0xad, 0xf6, 0x8b, 0xa8, 0x2d,
0xf3, 0xa8, 0xd2, 0x94, 0xc9, 0xf7, 0x9d, 0xac, 0x0d, 0x5d, 0x00, 0x68, 0x59, 0x61, 0xad, 0x0c, 0xa9, 0xe2, 0xcc, 0xa9, 0xc9, 0x5f, 0x04, 0x2f, 0xaf, 0xe5, 0x6e, 0x27, 0xf4, 0x8d, 0x28, 0x8a,
0xea, 0x7d, 0x48, 0x22, 0x12, 0xff, 0x5f, 0xd0, 0xb9, 0x7b, 0x60, 0xce, 0x8e, 0x86, 0x75, 0x52, 0x8c, 0x7f, 0xff, 0xc1, 0x5b, 0x8d, 0x57, 0x00, 0x8a, 0x37, 0xb2, 0x15, 0x5a, 0xaa, 0x3d, 0x41,
0xf4, 0x16, 0x4e, 0x73, 0x99, 0x9a, 0x64, 0x63, 0x5f, 0x4b, 0x94, 0x08, 0x7b, 0x11, 0x89, 0xc7, 0x31, 0x4a, 0x67, 0x2b, 0xbc, 0x74, 0x01, 0x96, 0x59, 0x4f, 0xb2, 0x81, 0x0b, 0xbf, 0x81, 0x67,
0x2c, 0x68, 0xa9, 0xfb, 0x62, 0x25, 0xe8, 0x1d, 0x9c, 0x69, 0xb5, 0xcd, 0xba, 0xb1, 0xbe, 0x8d, 0x15, 0x2f, 0x74, 0xbe, 0xb1, 0xd1, 0x72, 0xc1, 0xc8, 0x28, 0x46, 0xe9, 0x34, 0x8b, 0x8c, 0xea,
0x9d, 0x58, 0x7c, 0xc8, 0xcd, 0x3e, 0x09, 0xd0, 0x6e, 0x5d, 0x75, 0x85, 0x65, 0x2d, 0xe9, 0x35, 0x9e, 0x58, 0x33, 0xfc, 0x16, 0x9e, 0x2b, 0xb1, 0x2d, 0x87, 0xb6, 0xb1, 0xb5, 0x3d, 0xb5, 0x72,
0x8c, 0x53, 0x8d, 0x45, 0x52, 0x71, 0x93, 0xd9, 0xba, 0x02, 0xe6, 0xb7, 0xe0, 0x95, 0x9b, 0x8c, 0xef, 0xfb, 0x08, 0x44, 0x6c, 0x6b, 0xa9, 0x78, 0xde, 0x95, 0x42, 0xf3, 0xb6, 0xa1, 0x1b, 0x9e,
0x5e, 0xc1, 0xc8, 0xa0, 0x53, 0x3d, 0xab, 0x3c, 0x83, 0x07, 0x61, 0x6f, 0x1d, 0x3f, 0xf3, 0xda, 0x6f, 0x4a, 0x5a, 0x6f, 0x39, 0xf1, 0x62, 0x94, 0x86, 0xd9, 0x85, 0xe3, 0xdf, 0x7a, 0x7c, 0x6d,
0xe3, 0x4a, 0xd0, 0x0b, 0x18, 0x1a, 0x6c, 0xf1, 0xc0, 0xe2, 0x81, 0xc1, 0x95, 0xa0, 0x13, 0xf0, 0x29, 0x7e, 0x05, 0x7e, 0x43, 0x75, 0xd9, 0x12, 0x3f, 0x1e, 0xa7, 0x51, 0xe6, 0x0e, 0xc9, 0xcf,
0x31, 0x17, 0x49, 0x81, 0x42, 0x86, 0xc3, 0x88, 0xc4, 0x43, 0x36, 0xc2, 0x5c, 0x3c, 0xa3, 0x90, 0x11, 0xe0, 0x61, 0x9d, 0x6d, 0x23, 0xeb, 0x96, 0xe3, 0x2b, 0x98, 0x16, 0x4a, 0xee, 0x72, 0x63,
0xad, 0x2a, 0x65, 0xe3, 0x94, 0xe7, 0x54, 0x29, 0x1b, 0xab, 0x2e, 0xc1, 0x5b, 0xab, 0x92, 0xeb, 0xb2, 0x75, 0x46, 0x59, 0x68, 0x84, 0x3b, 0xaa, 0x4b, 0xfc, 0x1a, 0x26, 0x5a, 0x3a, 0x34, 0xb2,
0x7d, 0x38, 0x8a, 0x48, 0xec, 0xb3, 0xef, 0x13, 0xbd, 0x01, 0xd0, 0xbc, 0x49, 0x36, 0xd9, 0xae, 0x28, 0xd0, 0xf2, 0x01, 0xd8, 0x5b, 0x7d, 0xf2, 0x81, 0x39, 0xae, 0x19, 0x9e, 0x83, 0xaf, 0xa5,
0x7c, 0xab, 0x43, 0x3f, 0xea, 0xc7, 0x01, 0x1b, 0x6b, 0xde, 0x2c, 0x2d, 0x58, 0xbc, 0xc0, 0xa0, 0x91, 0x3d, 0x2b, 0x7b, 0x5a, 0xae, 0x19, 0xbe, 0x84, 0x50, 0x56, 0x2c, 0xdf, 0x49, 0xc6, 0x89,
0x6d, 0x90, 0x3e, 0x01, 0xfc, 0xb4, 0x4b, 0x27, 0x87, 0x59, 0xff, 0x5a, 0xcd, 0x74, 0xfa, 0x97, 0x1f, 0xa3, 0xd4, 0xcf, 0x26, 0xb2, 0x62, 0x5f, 0x24, 0xe3, 0x06, 0xd5, 0xbc, 0x73, 0x28, 0x70,
0x72, 0xd3, 0x99, 0xfd, 0xbb, 0x27, 0x6b, 0xcf, 0xee, 0xf5, 0xe1, 0x2b, 0x00, 0x00, 0xff, 0xff, 0xa8, 0xe6, 0x9d, 0x45, 0x17, 0x10, 0xdc, 0x8b, 0x9a, 0xaa, 0x3d, 0x99, 0xd8, 0x72, 0x0f, 0x27,
0xca, 0xe9, 0x71, 0x86, 0xfb, 0x01, 0x00, 0x00, 0xd3, 0x66, 0x45, 0x3b, 0x93, 0xd5, 0xa6, 0xcc, 0x19, 0xd5, 0x94, 0x4c, 0x6d, 0x6e, 0x91, 0xa2,
0xdd, 0x9d, 0x11, 0x6f, 0xa8, 0xa6, 0x38, 0x86, 0x88, 0xd7, 0x2c, 0x97, 0x85, 0x33, 0x12, 0xb0,
0x31, 0x80, 0xd7, 0xec, 0x6b, 0x61, 0x5d, 0xb7, 0x5e, 0x18, 0xbe, 0x98, 0x26, 0x7f, 0x50, 0xdf,
0x16, 0x5e, 0x69, 0x7a, 0x3e, 0xf3, 0xef, 0xa7, 0xe8, 0x0d, 0xa7, 0xf8, 0x1b, 0xc1, 0x6c, 0x90,
0xee, 0xf9, 0x8e, 0x2f, 0xf9, 0x04, 0xf3, 0x47, 0x7d, 0x3d, 0xec, 0xdb, 0x3b, 0x08, 0x98, 0x11,
0x5a, 0x82, 0xe2, 0x71, 0x3a, 0x5b, 0xcd, 0x1f, 0x9a, 0x3a, 0x34, 0x1f, 0x2c, 0xab, 0x5f, 0x08,
0x3c, 0xb3, 0xad, 0xf8, 0x33, 0xc0, 0x71, 0x77, 0xf1, 0xe5, 0x7f, 0x77, 0x8e, 0xdf, 0xed, 0x62,
0x71, 0x0a, 0xb9, 0xa7, 0x93, 0x27, 0xef, 0x11, 0xbe, 0x7d, 0xdc, 0xbe, 0xc5, 0xa9, 0xd7, 0x0f,
0xa1, 0xae, 0x4e, 0xb2, 0x63, 0xac, 0xfb, 0xc0, 0xfe, 0x40, 0x3e, 0xfc, 0x0b, 0x00, 0x00, 0xff,
0xff, 0x0c, 0x62, 0x85, 0xba, 0x64, 0x04, 0x00, 0x00,
} }
package helper
import (
"io"
)
// NewReceiveReader turns receiver into an io.Reader. Errors from the
// receiver function are passed on unmodified. This means receiver should
// emit io.EOF when done.
func NewReceiveReader(receiver func() ([]byte, error)) io.Reader {
return &receiveReader{receiver: receiver}
}
type receiveReader struct {
receiver func() ([]byte, error)
data []byte
err error
}
func (rr *receiveReader) Read(p []byte) (int, error) {
if len(rr.data) == 0 {
rr.data, rr.err = rr.receiver()
}
n := copy(p, rr.data)
rr.data = rr.data[n:]
if len(rr.data) == 0 {
return n, rr.err
}
return n, nil
}
// NewSendWriter turns sender into an io.Writer. The number of 'bytes
// written' reported back is always len(p).
func NewSendWriter(sender func(p []byte) error) io.Writer {
return &sendWriter{sender: sender}
}
type sendWriter struct {
sender func([]byte) error
}
func (sw *sendWriter) Write(p []byte) (int, error) {
return len(p), sw.sender(p)
}
// Code generated by protoc-gen-go. // Code generated by protoc-gen-go. DO NOT EDIT.
// source: notifications.proto // source: notifications.proto
// DO NOT EDIT!
package gitaly package gitaly
......
// Code generated by protoc-gen-go. // Code generated by protoc-gen-go. DO NOT EDIT.
// source: ref.proto // source: ref.proto
// DO NOT EDIT!
package gitaly package gitaly
......
// Code generated by protoc-gen-go. // Code generated by protoc-gen-go. DO NOT EDIT.
// source: shared.proto // source: shared.proto
// DO NOT EDIT!
package gitaly package gitaly
...@@ -14,7 +13,6 @@ var _ = fmt.Errorf ...@@ -14,7 +13,6 @@ var _ = fmt.Errorf
var _ = math.Inf var _ = math.Inf
type Repository struct { type Repository struct {
Path string `protobuf:"bytes,1,opt,name=path" json:"path,omitempty"`
StorageName string `protobuf:"bytes,2,opt,name=storage_name,json=storageName" json:"storage_name,omitempty"` StorageName string `protobuf:"bytes,2,opt,name=storage_name,json=storageName" json:"storage_name,omitempty"`
RelativePath string `protobuf:"bytes,3,opt,name=relative_path,json=relativePath" json:"relative_path,omitempty"` RelativePath string `protobuf:"bytes,3,opt,name=relative_path,json=relativePath" json:"relative_path,omitempty"`
} }
...@@ -24,13 +22,6 @@ func (m *Repository) String() string { return proto.CompactTextString ...@@ -24,13 +22,6 @@ func (m *Repository) String() string { return proto.CompactTextString
func (*Repository) ProtoMessage() {} func (*Repository) ProtoMessage() {}
func (*Repository) Descriptor() ([]byte, []int) { return fileDescriptor4, []int{0} } func (*Repository) Descriptor() ([]byte, []int) { return fileDescriptor4, []int{0} }
func (m *Repository) GetPath() string {
if m != nil {
return m.Path
}
return ""
}
func (m *Repository) GetStorageName() string { func (m *Repository) GetStorageName() string {
if m != nil { if m != nil {
return m.StorageName return m.StorageName
...@@ -69,16 +60,16 @@ func init() { ...@@ -69,16 +60,16 @@ func init() {
func init() { proto.RegisterFile("shared.proto", fileDescriptor4) } func init() { proto.RegisterFile("shared.proto", fileDescriptor4) }
var fileDescriptor4 = []byte{ var fileDescriptor4 = []byte{
// 161 bytes of a gzipped FileDescriptorProto // 164 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x34, 0x8e, 0xb1, 0xca, 0xc2, 0x40, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x34, 0xce, 0x31, 0x0f, 0x82, 0x30,
0x10, 0x84, 0xc9, 0xff, 0x9b, 0x80, 0x6b, 0x6c, 0x16, 0x8b, 0x94, 0x1a, 0x1b, 0x2b, 0x1b, 0x9f, 0x10, 0x05, 0xe0, 0x14, 0x81, 0xe8, 0x89, 0x89, 0x69, 0x1c, 0x18, 0x11, 0x17, 0x26, 0x17, 0x7f,
0xc1, 0x56, 0xe4, 0x7c, 0x80, 0xb0, 0xe2, 0x92, 0x3b, 0xb8, 0x78, 0xc7, 0xdd, 0x26, 0x98, 0xb7, 0x83, 0x8b, 0x83, 0x31, 0xf5, 0x07, 0xe0, 0x19, 0x2f, 0xd0, 0xa4, 0xd8, 0xa6, 0x3d, 0x88, 0xfc,
0x17, 0x56, 0xed, 0x76, 0xbf, 0x99, 0x61, 0x06, 0xea, 0x6c, 0x29, 0xf1, 0xe3, 0x18, 0x53, 0x90, 0x7b, 0x23, 0xea, 0xf8, 0xbe, 0xf7, 0x86, 0x07, 0x59, 0x68, 0xd1, 0xd3, 0x63, 0xef, 0xbc, 0x65,
0x80, 0x55, 0xef, 0x84, 0xfc, 0xdc, 0x5a, 0x00, 0xc3, 0x31, 0x64, 0x27, 0x21, 0xcd, 0x88, 0xb0, 0x2b, 0xd3, 0x46, 0x33, 0x9a, 0xb1, 0xbc, 0x01, 0x28, 0x72, 0x36, 0x68, 0xb6, 0x7e, 0x94, 0x5b,
0x88, 0x24, 0xb6, 0x29, 0xb6, 0xc5, 0x61, 0x69, 0xf4, 0xc6, 0x1d, 0xd4, 0x59, 0x42, 0xa2, 0x9e, 0xc8, 0x02, 0x5b, 0x8f, 0x0d, 0xd5, 0x4f, 0xec, 0x28, 0x8f, 0x0a, 0x51, 0x2d, 0xd4, 0xf2, 0x67,
0xbb, 0x27, 0x0d, 0xdc, 0xfc, 0xa9, 0xb6, 0xfa, 0xb2, 0x0b, 0x0d, 0x8c, 0x7b, 0x58, 0x27, 0xf6, 0x67, 0xec, 0x48, 0xee, 0x60, 0xe5, 0xc9, 0x20, 0xeb, 0x81, 0x6a, 0x87, 0xdc, 0xe6, 0xb3, 0x69,
0x24, 0x6e, 0xe2, 0x4e, 0xf3, 0xff, 0xea, 0xa9, 0x7f, 0xf0, 0x4a, 0x62, 0xdb, 0x16, 0xe0, 0xfc, 0x93, 0xfd, 0xf1, 0x82, 0xdc, 0x9e, 0xe2, 0xb9, 0x58, 0x47, 0x2a, 0xfe, 0xf4, 0x65, 0x09, 0x70,
0x72, 0x72, 0x13, 0x92, 0x31, 0xe3, 0x06, 0xca, 0x89, 0xfc, 0xc8, 0x5a, 0x55, 0x9a, 0xcf, 0x73, 0x7c, 0x69, 0xbe, 0x32, 0x72, 0x1f, 0xe4, 0x06, 0x92, 0x01, 0x4d, 0x4f, 0xb9, 0x28, 0x44, 0x95,
0xaf, 0x74, 0xdc, 0xe9, 0x1d, 0x00, 0x00, 0xff, 0xff, 0xbd, 0xf7, 0x56, 0x73, 0xac, 0x00, 0x00, 0xa8, 0x6f, 0xb8, 0xa7, 0xd3, 0xa9, 0xc3, 0x3b, 0x00, 0x00, 0xff, 0xff, 0xfe, 0x53, 0x2c, 0xb6,
0x00, 0xa4, 0x00, 0x00, 0x00,
} }
// Code generated by protoc-gen-go. // Code generated by protoc-gen-go. DO NOT EDIT.
// source: smarthttp.proto // source: smarthttp.proto
// DO NOT EDIT!
package gitaly package gitaly
...@@ -98,9 +97,10 @@ type PostReceivePackRequest struct { ...@@ -98,9 +97,10 @@ type PostReceivePackRequest struct {
Repository *Repository `protobuf:"bytes,1,opt,name=repository" json:"repository,omitempty"` Repository *Repository `protobuf:"bytes,1,opt,name=repository" json:"repository,omitempty"`
// Raw data to be copied to stdin of 'git receive-pack' // Raw data to be copied to stdin of 'git receive-pack'
Data []byte `protobuf:"bytes,2,opt,name=data,proto3" json:"data,omitempty"` Data []byte `protobuf:"bytes,2,opt,name=data,proto3" json:"data,omitempty"`
// gl_id becomes env variable GL_ID, used by the Git {pre,post}-receive // gl_id and gl_repository becomes env variables, used by the Git {pre,post}-receive
// hooks. Should only be present in the first message of the stream. // hooks. They should only be present in the first message of the stream.
GlId string `protobuf:"bytes,3,opt,name=gl_id,json=glId" json:"gl_id,omitempty"` GlId string `protobuf:"bytes,3,opt,name=gl_id,json=glId" json:"gl_id,omitempty"`
GlRepository string `protobuf:"bytes,4,opt,name=gl_repository,json=glRepository" json:"gl_repository,omitempty"`
} }
func (m *PostReceivePackRequest) Reset() { *m = PostReceivePackRequest{} } func (m *PostReceivePackRequest) Reset() { *m = PostReceivePackRequest{} }
...@@ -129,6 +129,13 @@ func (m *PostReceivePackRequest) GetGlId() string { ...@@ -129,6 +129,13 @@ func (m *PostReceivePackRequest) GetGlId() string {
return "" return ""
} }
func (m *PostReceivePackRequest) GetGlRepository() string {
if m != nil {
return m.GlRepository
}
return ""
}
type PostReceivePackResponse struct { type PostReceivePackResponse struct {
// Raw data from stdout of 'git receive-pack' // Raw data from stdout of 'git receive-pack'
Data []byte `protobuf:"bytes,1,opt,name=data,proto3" json:"data,omitempty"` Data []byte `protobuf:"bytes,1,opt,name=data,proto3" json:"data,omitempty"`
...@@ -455,24 +462,26 @@ var _SmartHTTP_serviceDesc = grpc.ServiceDesc{ ...@@ -455,24 +462,26 @@ var _SmartHTTP_serviceDesc = grpc.ServiceDesc{
func init() { proto.RegisterFile("smarthttp.proto", fileDescriptor5) } func init() { proto.RegisterFile("smarthttp.proto", fileDescriptor5) }
var fileDescriptor5 = []byte{ var fileDescriptor5 = []byte{
// 304 bytes of a gzipped FileDescriptorProto // 321 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x53, 0x4d, 0x4b, 0xc3, 0x40, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x53, 0x4d, 0x4b, 0xc3, 0x40,
0x14, 0x74, 0x6b, 0x2d, 0xf4, 0x59, 0xac, 0xbc, 0xa2, 0x0d, 0x01, 0xb5, 0xe4, 0x20, 0x39, 0x68, 0x10, 0x75, 0x6b, 0x2d, 0x74, 0xac, 0x56, 0xa6, 0x68, 0x4b, 0x40, 0x2d, 0x11, 0xa4, 0x07, 0x0d,
0x28, 0xf1, 0x37, 0x08, 0x16, 0x3d, 0x84, 0xb5, 0x05, 0x6f, 0x65, 0x6d, 0xb6, 0x69, 0x30, 0x76, 0x25, 0xfe, 0x06, 0xc1, 0xa2, 0x87, 0xb0, 0xb6, 0xe0, 0x2d, 0xac, 0xcd, 0x36, 0x0d, 0xae, 0xdd,
0xe3, 0xee, 0x56, 0xe8, 0x2f, 0xf5, 0xef, 0x88, 0x09, 0xf9, 0x68, 0x62, 0x3c, 0x28, 0xde, 0xc2, 0x98, 0x5d, 0x85, 0xfe, 0x15, 0xff, 0x98, 0x7f, 0x47, 0x4c, 0xc8, 0x47, 0x13, 0xe3, 0x41, 0xf1,
0x9b, 0xf7, 0x66, 0x26, 0x33, 0x2c, 0xf4, 0xd5, 0x2b, 0x93, 0x7a, 0xa5, 0x75, 0xec, 0xc4, 0x52, 0x16, 0xe6, 0xcd, 0xbc, 0xf7, 0x66, 0x5e, 0x16, 0xba, 0xea, 0x99, 0x45, 0x7a, 0xa9, 0x75, 0x68,
0x68, 0x81, 0x9d, 0x20, 0xd4, 0x2c, 0xda, 0x9a, 0x3d, 0xb5, 0x62, 0x92, 0xfb, 0xe9, 0xd4, 0xba, 0x85, 0x91, 0xd4, 0x12, 0x5b, 0x7e, 0xa0, 0x99, 0x58, 0x1b, 0x1d, 0xb5, 0x64, 0x11, 0xf7, 0x92,
0x85, 0xfe, 0x64, 0xbd, 0x14, 0x94, 0x2f, 0x15, 0xe5, 0x6f, 0x1b, 0xae, 0x34, 0xba, 0x00, 0x92, 0xaa, 0x79, 0x0d, 0xdd, 0xc9, 0x6a, 0x21, 0x29, 0x5f, 0x28, 0xca, 0x5f, 0x5e, 0xb9, 0xd2, 0x68,
0xc7, 0x42, 0x85, 0x5a, 0xc8, 0xad, 0x41, 0x46, 0xc4, 0x3e, 0x74, 0xd1, 0x49, 0xaf, 0x1d, 0x9a, 0x03, 0x44, 0x3c, 0x94, 0x2a, 0xd0, 0x32, 0x5a, 0x0f, 0xc8, 0x90, 0x8c, 0x76, 0x6d, 0xb4, 0x92,
0x23, 0xb4, 0xb4, 0x65, 0x5d, 0xc2, 0x71, 0x41, 0xa3, 0x62, 0xb1, 0x56, 0x1c, 0x11, 0xda, 0x3e, 0x69, 0x8b, 0x66, 0x08, 0x2d, 0x74, 0x99, 0xe7, 0x70, 0x90, 0xd3, 0xa8, 0x50, 0xae, 0x14, 0x47,
0xd3, 0x2c, 0x61, 0xe8, 0xd1, 0xe4, 0xdb, 0x9a, 0xc3, 0x89, 0x27, 0x94, 0x9e, 0xc5, 0x91, 0x60, 0x84, 0xa6, 0xc7, 0x34, 0x8b, 0x19, 0x3a, 0x34, 0xfe, 0x36, 0x5d, 0x38, 0x74, 0xa4, 0xd2, 0xb3,
0xbe, 0xc7, 0x16, 0x2f, 0x7f, 0x10, 0xcd, 0x05, 0x5a, 0x25, 0x81, 0x2b, 0x38, 0xad, 0x0a, 0xfc, 0x50, 0x48, 0xe6, 0x39, 0x6c, 0xfe, 0xf4, 0x07, 0xd1, 0x4c, 0xa0, 0x51, 0x10, 0xb8, 0x80, 0xa3,
0x60, 0x67, 0x93, 0x6e, 0x53, 0xbe, 0xe0, 0xe1, 0x3b, 0xff, 0x07, 0x3f, 0x38, 0x80, 0x83, 0x20, 0xb2, 0xc0, 0x0f, 0x76, 0xde, 0x49, 0xd2, 0x4e, 0xf9, 0x9c, 0x07, 0x6f, 0xfc, 0x1f, 0x0c, 0x61,
0x9a, 0x87, 0xbe, 0xb1, 0x3f, 0x22, 0x76, 0x97, 0xb6, 0x83, 0x68, 0xe2, 0x5b, 0xd7, 0x30, 0xac, 0x0f, 0x76, 0x7c, 0xe1, 0x06, 0xde, 0x60, 0x7b, 0x48, 0x46, 0x6d, 0xda, 0xf4, 0xc5, 0xc4, 0xc3,
0xc9, 0x36, 0xbb, 0x74, 0x3f, 0x5a, 0xd0, 0x7d, 0xfc, 0x6a, 0xf3, 0x6e, 0x3a, 0xf5, 0xf0, 0x1e, 0x33, 0xd8, 0xf3, 0x85, 0x5b, 0xe0, 0x6f, 0xc6, 0x60, 0xc7, 0x17, 0x39, 0xb3, 0x79, 0x09, 0xfd,
0x30, 0x8b, 0xba, 0xf8, 0x4b, 0x1c, 0x66, 0xde, 0x2a, 0x6d, 0x9a, 0x46, 0x1d, 0x48, 0xa5, 0xac, 0x8a, 0xb7, 0xfa, 0x5d, 0xec, 0x8f, 0x06, 0xb4, 0xef, 0xbf, 0x32, 0xbf, 0x99, 0x4e, 0x1d, 0xbc,
0xbd, 0x31, 0xc1, 0x07, 0x18, 0x14, 0xf3, 0xdc, 0xcd, 0x6f, 0xd9, 0x66, 0x70, 0xb4, 0x1b, 0x3e, 0x05, 0x4c, 0x03, 0xc9, 0x6f, 0x81, 0xfd, 0x74, 0x81, 0x52, 0xe6, 0xc6, 0xa0, 0x0a, 0x24, 0x52,
0x9e, 0x65, 0xfb, 0xdf, 0xb6, 0x6e, 0x9e, 0x37, 0xc1, 0x19, 0xa9, 0x4d, 0xc6, 0x04, 0x9f, 0xa0, 0xe6, 0xd6, 0x98, 0xe0, 0x1d, 0xf4, 0xf2, 0x7a, 0xe6, 0xe6, 0xb7, 0x6c, 0x33, 0xd8, 0xdf, 0x8c,
0x5f, 0x89, 0x0b, 0x77, 0x0e, 0xeb, 0xf5, 0x99, 0x17, 0x8d, 0x78, 0x99, 0xf9, 0xb9, 0x93, 0x3c, 0x08, 0x8f, 0xd3, 0xfe, 0x6f, 0xff, 0x0d, 0xe3, 0xa4, 0x0e, 0x4e, 0x49, 0x47, 0x64, 0x4c, 0xf0,
0x82, 0x9b, 0xcf, 0x00, 0x00, 0x00, 0xff, 0xff, 0x16, 0x3e, 0x9b, 0xd1, 0x2d, 0x03, 0x00, 0x00, 0x01, 0xba, 0xa5, 0x73, 0xe1, 0xc6, 0x60, 0x35, 0x63, 0xe3, 0xb4, 0x16, 0x2f, 0x32, 0x3f, 0xb6,
0xe2, 0xa7, 0x72, 0xf5, 0x19, 0x00, 0x00, 0xff, 0xff, 0x4c, 0x33, 0x8a, 0x1a, 0x53, 0x03, 0x00,
0x00,
} }
// Code generated by protoc-gen-go. // Code generated by protoc-gen-go. DO NOT EDIT.
// source: ssh.proto // source: ssh.proto
// DO NOT EDIT!
package gitaly package gitaly
...@@ -85,8 +84,10 @@ type SSHReceivePackRequest struct { ...@@ -85,8 +84,10 @@ type SSHReceivePackRequest struct {
Repository *Repository `protobuf:"bytes,1,opt,name=repository" json:"repository,omitempty"` Repository *Repository `protobuf:"bytes,1,opt,name=repository" json:"repository,omitempty"`
// A chunk of raw data to be copied to 'git upload-pack' standard input // A chunk of raw data to be copied to 'git upload-pack' standard input
Stdin []byte `protobuf:"bytes,2,opt,name=stdin,proto3" json:"stdin,omitempty"` Stdin []byte `protobuf:"bytes,2,opt,name=stdin,proto3" json:"stdin,omitempty"`
// Contents of GL_ID environment variable for 'git receive-pack' // Contents of GL_ID and GL_REPOSITORY environment variables for
// 'git receive-pack'
GlId string `protobuf:"bytes,3,opt,name=gl_id,json=glId" json:"gl_id,omitempty"` GlId string `protobuf:"bytes,3,opt,name=gl_id,json=glId" json:"gl_id,omitempty"`
GlRepository string `protobuf:"bytes,4,opt,name=gl_repository,json=glRepository" json:"gl_repository,omitempty"`
} }
func (m *SSHReceivePackRequest) Reset() { *m = SSHReceivePackRequest{} } func (m *SSHReceivePackRequest) Reset() { *m = SSHReceivePackRequest{} }
...@@ -115,6 +116,13 @@ func (m *SSHReceivePackRequest) GetGlId() string { ...@@ -115,6 +116,13 @@ func (m *SSHReceivePackRequest) GetGlId() string {
return "" return ""
} }
func (m *SSHReceivePackRequest) GetGlRepository() string {
if m != nil {
return m.GlRepository
}
return ""
}
type SSHReceivePackResponse struct { type SSHReceivePackResponse struct {
// A chunk of raw data from 'git receive-pack' standard output // A chunk of raw data from 'git receive-pack' standard output
Stdout []byte `protobuf:"bytes,1,opt,name=stdout,proto3" json:"stdout,omitempty"` Stdout []byte `protobuf:"bytes,1,opt,name=stdout,proto3" json:"stdout,omitempty"`
...@@ -334,23 +342,24 @@ var _SSH_serviceDesc = grpc.ServiceDesc{ ...@@ -334,23 +342,24 @@ var _SSH_serviceDesc = grpc.ServiceDesc{
func init() { proto.RegisterFile("ssh.proto", fileDescriptor6) } func init() { proto.RegisterFile("ssh.proto", fileDescriptor6) }
var fileDescriptor6 = []byte{ var fileDescriptor6 = []byte{
// 284 bytes of a gzipped FileDescriptorProto // 304 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x52, 0xcd, 0x4a, 0xc3, 0x40, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x52, 0xcd, 0x4e, 0xf3, 0x30,
0x10, 0x76, 0xad, 0x0d, 0x74, 0x1a, 0x3d, 0xac, 0xb5, 0x84, 0xa0, 0x52, 0x72, 0xca, 0x29, 0x48, 0x10, 0xfc, 0xfc, 0xf5, 0x47, 0xea, 0x36, 0xe5, 0xb0, 0x94, 0xaa, 0x8a, 0x00, 0x55, 0xe1, 0x92,
0xfa, 0x0c, 0x42, 0xbd, 0xc9, 0x86, 0x9e, 0x6b, 0xec, 0x2e, 0xe9, 0x62, 0xe8, 0xc6, 0x9d, 0x49, 0x53, 0x84, 0xd2, 0x67, 0x40, 0x2a, 0x37, 0xe4, 0xa8, 0xe7, 0x10, 0x6a, 0x2b, 0xb5, 0xb0, 0xea,
0x69, 0x41, 0xdf, 0xc9, 0x47, 0x14, 0x92, 0x58, 0x92, 0x6a, 0x8f, 0xf6, 0xb6, 0x33, 0xdf, 0xce, 0x60, 0x3b, 0xa8, 0x95, 0xe0, 0x49, 0x78, 0x09, 0x1e, 0x11, 0xc9, 0x09, 0x25, 0x29, 0xf4, 0x08,
0xf7, 0x33, 0xbb, 0x30, 0x40, 0x5c, 0x45, 0x85, 0x35, 0x64, 0xb8, 0x93, 0x69, 0x4a, 0xf3, 0x9d, 0xb7, 0xcc, 0x4e, 0x76, 0x66, 0xd6, 0xbb, 0x30, 0x30, 0x66, 0x1d, 0x15, 0x5a, 0x59, 0x85, 0xfd,
0xef, 0xe2, 0x2a, 0xb5, 0x4a, 0xd6, 0xdd, 0xe0, 0x05, 0x46, 0x49, 0x32, 0x9b, 0x17, 0xb9, 0x49, 0x5c, 0xd8, 0x4c, 0xee, 0x7c, 0xcf, 0xac, 0x33, 0xcd, 0x59, 0x55, 0x0d, 0xee, 0x61, 0x9c, 0x24,
0xe5, 0x73, 0xba, 0x7c, 0x13, 0xea, 0xbd, 0x54, 0x48, 0x3c, 0x06, 0xb0, 0xaa, 0x30, 0xa8, 0xc9, 0x8b, 0x65, 0x21, 0x55, 0xc6, 0xee, 0xb2, 0xd5, 0x23, 0xe5, 0x4f, 0x25, 0x37, 0x16, 0x63, 0x00,
0xd8, 0x9d, 0xc7, 0x26, 0x2c, 0x1c, 0xc6, 0x3c, 0xaa, 0x29, 0x22, 0xb1, 0x47, 0x44, 0xeb, 0x16, 0xcd, 0x0b, 0x65, 0x84, 0x55, 0x7a, 0x37, 0x25, 0x33, 0x12, 0x0e, 0x63, 0x8c, 0x2a, 0x89, 0x88,
0x1f, 0x41, 0x1f, 0x49, 0xea, 0xb5, 0x77, 0x3e, 0x61, 0xa1, 0x2b, 0xea, 0x22, 0xf8, 0x80, 0x9b, 0xee, 0x19, 0xda, 0xf8, 0x0b, 0xc7, 0xd0, 0x33, 0x96, 0x89, 0xcd, 0xf4, 0xff, 0x8c, 0x84, 0x1e,
0x03, 0x05, 0x2c, 0xcc, 0x1a, 0x15, 0x1f, 0x83, 0x83, 0x24, 0x4d, 0x49, 0x15, 0xbd, 0x2b, 0x9a, 0xad, 0x40, 0xf0, 0x02, 0x67, 0x07, 0x0e, 0xa6, 0x50, 0x1b, 0xc3, 0x71, 0x02, 0x7d, 0x63, 0x99,
0xaa, 0xe9, 0x2b, 0x6b, 0x1b, 0x9e, 0xa6, 0xe2, 0x53, 0x18, 0xaa, 0xad, 0xa6, 0x05, 0x52, 0x4a, 0x2a, 0xad, 0x93, 0xf7, 0x68, 0x8d, 0xea, 0x3a, 0xd7, 0xba, 0xd6, 0xa9, 0x11, 0xce, 0x61, 0xc8,
0x25, 0x7a, 0xbd, 0xae, 0xa7, 0xc7, 0xad, 0xa6, 0xa4, 0x42, 0x04, 0xa8, 0xfd, 0x39, 0xd8, 0x54, 0xb7, 0xc2, 0xa6, 0xc6, 0x66, 0xb6, 0x34, 0xd3, 0x4e, 0x3b, 0xd3, 0xcd, 0x56, 0xd8, 0xc4, 0x31,
0xea, 0x42, 0x2d, 0x95, 0xde, 0xa8, 0x7f, 0x09, 0xc8, 0xaf, 0xa1, 0x9f, 0xe5, 0x0b, 0x2d, 0x2b, 0x14, 0xf8, 0xfe, 0x3b, 0x78, 0x23, 0xce, 0x9e, 0xf2, 0x15, 0x17, 0xcf, 0xfc, 0x57, 0x26, 0xc4,
0x47, 0x03, 0x71, 0x91, 0xe5, 0x4f, 0x32, 0xf8, 0x84, 0xf1, 0xa1, 0xee, 0x09, 0x63, 0xc7, 0x5f, 0x53, 0xe8, 0xe5, 0x32, 0x15, 0xcc, 0x45, 0x1a, 0xd0, 0x6e, 0x2e, 0x6f, 0x19, 0x5e, 0xc1, 0x28,
0x0c, 0x7a, 0x49, 0x32, 0xe3, 0x02, 0x2e, 0x3b, 0xcb, 0xe7, 0xb7, 0x3f, 0x83, 0x7f, 0xbd, 0xba, 0x97, 0x69, 0xc3, 0xa1, 0xeb, 0x48, 0x2f, 0x97, 0x5f, 0xda, 0xc1, 0x2b, 0x4c, 0x0e, 0xc3, 0xfd,
0x7f, 0x77, 0x04, 0xad, 0xad, 0x07, 0x67, 0x21, 0x7b, 0x60, 0x7c, 0x0e, 0x57, 0xdd, 0x68, 0xbc, 0xe1, 0xe3, 0xc4, 0xef, 0x04, 0x3a, 0x49, 0xb2, 0x40, 0x0a, 0xa3, 0xd6, 0x8a, 0xf0, 0xfc, 0xb3,
0x3d, 0xf6, 0x7b, 0xd5, 0xfe, 0xfd, 0x31, 0xb8, 0x4d, 0xfb, 0xea, 0x54, 0x1f, 0x72, 0xfa, 0x1d, 0xf1, 0xa7, 0xdb, 0xf0, 0x2f, 0x8e, 0xb0, 0x55, 0xf4, 0xe0, 0x5f, 0x48, 0xae, 0x09, 0x2e, 0xe1,
0x00, 0x00, 0xff, 0xff, 0x71, 0xde, 0xae, 0x4f, 0xb3, 0x02, 0x00, 0x00, 0xa4, 0x3d, 0x1a, 0x36, 0xdb, 0xbe, 0xef, 0xc3, 0xbf, 0x3c, 0x46, 0x37, 0x65, 0x1f, 0xfa, 0xee,
0x6c, 0xe7, 0x1f, 0x01, 0x00, 0x00, 0xff, 0xff, 0xa3, 0x3d, 0xb9, 0xce, 0xd9, 0x02, 0x00, 0x00,
} }
The MIT License (MIT)
Copyright (c) 2016-2017 GitLab B.V.
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
This source diff could not be displayed because it is too large. You can view the blob instead.
package client
import (
"fmt"
"net"
"net/url"
"strings"
"time"
"google.golang.org/grpc"
)
// DefaultDialOpts hold the default DialOptions for connection to Gitaly over UNIX-socket
var DefaultDialOpts = []grpc.DialOption{
grpc.WithInsecure(),
}
// Dial gitaly
func Dial(rawAddress string, connOpts []grpc.DialOption) (*grpc.ClientConn, error) {
network, addr, err := parseAddress(rawAddress)
if err != nil {
return nil, err
}
connOpts = append(connOpts,
grpc.WithDialer(func(a string, _ time.Duration) (net.Conn, error) {
return net.Dial(network, a)
}))
conn, err := grpc.Dial(addr, connOpts...)
if err != nil {
return nil, err
}
return conn, nil
}
func parseAddress(rawAddress string) (network, addr string, err error) {
// Parsing unix:// URL's with url.Parse does not give the result we want
// so we do it manually.
for _, prefix := range []string{"unix://", "unix:"} {
if strings.HasPrefix(rawAddress, prefix) {
return "unix", strings.TrimPrefix(rawAddress, prefix), nil
}
}
u, err := url.Parse(rawAddress)
if err != nil {
return "", "", err
}
if u.Scheme != "tcp" {
return "", "", fmt.Errorf("unknown scheme: %q", rawAddress)
}
if u.Host == "" {
return "", "", fmt.Errorf("network tcp requires host: %q", rawAddress)
}
if u.Path != "" {
return "", "", fmt.Errorf("network tcp should have no path: %q", rawAddress)
}
return "tcp", u.Host, nil
}
package client
import (
"fmt"
"io"
"google.golang.org/grpc"
"golang.org/x/net/context"
pb "gitlab.com/gitlab-org/gitaly-proto/go"
pbhelper "gitlab.com/gitlab-org/gitaly-proto/go/helper"
)
// ReceivePack proxies an SSH git-receive-pack (git push) session to Gitaly
func ReceivePack(ctx context.Context, conn *grpc.ClientConn, stdin io.Reader, stdout, stderr io.Writer, req *pb.SSHReceivePackRequest) (int32, error) {
ctx2, cancel := context.WithCancel(ctx)
defer cancel()
ssh := pb.NewSSHClient(conn)
stream, err := ssh.SSHReceivePack(ctx2)
if err != nil {
return 0, err
}
if err = stream.Send(req); err != nil {
return 0, err
}
inWriter := pbhelper.NewSendWriter(func(p []byte) error {
return stream.Send(&pb.SSHReceivePackRequest{Stdin: p})
})
errC := make(chan error, 1)
go func() {
_, errRecv := io.Copy(inWriter, stdin)
stream.CloseSend()
errC <- errRecv
}()
exitStatus, errRecv := recvStdoutStderrStream(func() (stdoutStderrResponse, error) {
return stream.Recv()
}, stdout, stderr)
if errRecv != nil {
return exitStatus, errRecv
}
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
}
}
package client
import (
"io"
pb "gitlab.com/gitlab-org/gitaly-proto/go"
)
type stdoutStderrResponse interface {
GetExitStatus() *pb.ExitStatus
GetStderr() []byte
GetStdout() []byte
}
func recvStdoutStderrStream(recv func() (stdoutStderrResponse, error), stdout, stderr io.Writer) (int32, error) {
var (
exitStatus int32
err error
resp stdoutStderrResponse
)
for {
resp, err = recv()
if err != nil {
break
}
if resp.GetExitStatus() != nil {
exitStatus = resp.GetExitStatus().GetValue()
}
if len(resp.GetStderr()) > 0 {
if _, errWrite := stderr.Write(resp.GetStderr()); errWrite != nil {
return exitStatus, errWrite
}
}
if len(resp.GetStdout()) > 0 {
if _, errWrite := stdout.Write(resp.GetStdout()); errWrite != nil {
return exitStatus, errWrite
}
}
}
if err == io.EOF {
err = nil
}
return exitStatus, err
}
package client
import (
"fmt"
"io"
"google.golang.org/grpc"
"golang.org/x/net/context"
pb "gitlab.com/gitlab-org/gitaly-proto/go"
pbhelper "gitlab.com/gitlab-org/gitaly-proto/go/helper"
)
// UploadPack proxies an SSH git-upload-pack (git fetch) session to Gitaly
func UploadPack(ctx context.Context, conn *grpc.ClientConn, stdin io.Reader, stdout, stderr io.Writer, req *pb.SSHUploadPackRequest) (int32, error) {
ctx2, cancel := context.WithCancel(ctx)
defer cancel()
ssh := pb.NewSSHClient(conn)
stream, err := ssh.SSHUploadPack(ctx2)
if err != nil {
return 0, err
}
if err = stream.Send(req); err != nil {
return 0, err
}
inWriter := pbhelper.NewSendWriter(func(p []byte) error {
return stream.Send(&pb.SSHUploadPackRequest{Stdin: p})
})
errC := make(chan error, 1)
go func() {
_, errRecv := io.Copy(inWriter, stdin)
stream.CloseSend()
errC <- errRecv
}()
exitStatus, errRecv := recvStdoutStderrStream(func() (stdoutStderrResponse, error) {
return stream.Recv()
}, stdout, stderr)
if errRecv != nil {
return exitStatus, errRecv
}
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
}
}
...@@ -21,13 +21,19 @@ ...@@ -21,13 +21,19 @@
"revisionTime": "2017-03-31T03:19:02Z" "revisionTime": "2017-03-31T03:19:02Z"
}, },
{ {
"checksumSHA1": "EE3twlbq1QkQ5J9dor9QFDR5LX4=", "checksumSHA1": "guPHQjm2kqtHM03hF2rss9K6YR8=",
"path": "gitlab.com/gitlab-org/gitaly-proto/go", "path": "gitlab.com/gitlab-org/gitaly-proto/go",
"revision": "52f77b23166e640a932e50223472d761404afb42", "revision": "e302a46f7ccd889bfaa683d2ba06ffe06ca5875b",
"revisionTime": "2017-03-29T16:52:58Z", "revisionTime": "2017-06-12T18:49:50Z",
"tree": true, "tree": true,
"version": "v0.5.0", "version": "v0.9.0",
"versionExact": "v0.5.0" "versionExact": "v0.9.0"
},
{
"checksumSHA1": "xDXnu1dEiNdrGdL1VfuCnJZey7s=",
"path": "gitlab.com/gitlab-org/gitaly/client",
"revision": "cf955be6f08f16cca367a97d1ac2631a2ba33be3",
"revisionTime": "2017-06-25T13:40:46Z"
}, },
{ {
"checksumSHA1": "Y+HGqEkYM15ir+J93MEaHdyFy0c=", "checksumSHA1": "Y+HGqEkYM15ir+J93MEaHdyFy0c=",
......
require 'json' require 'json'
class GitAccessStatus class GitAccessStatus
attr_reader :message, :gl_repository, :repository_path attr_reader :message, :gl_repository, :repository_path, :gitaly
def initialize(status, message, gl_repository, repository_path) def initialize(status, message, gl_repository, repository_path, gitaly)
@status = status @status = status
@message = message @message = message
@gl_repository = gl_repository @gl_repository = gl_repository
@repository_path = repository_path @repository_path = repository_path
@gitaly = gitaly
end end
def self.create_from_json(json) def self.create_from_json(json)
values = JSON.parse(json) values = JSON.parse(json)
self.new(values["status"], values["message"], values["gl_repository"], values["repository_path"]) self.new(values["status"], values["message"], values["gl_repository"], values["repository_path"], values["gitaly"])
end end
def allowed? def allowed?
......
...@@ -17,7 +17,7 @@ class GitlabShell ...@@ -17,7 +17,7 @@ class GitlabShell
API_COMMANDS = %w(2fa_recovery_codes) API_COMMANDS = %w(2fa_recovery_codes)
GL_PROTOCOL = 'ssh'.freeze GL_PROTOCOL = 'ssh'.freeze
attr_accessor :key_id, :gl_repository, :repo_name, :command, :git_access attr_accessor :key_id, :gl_repository, :repo_name, :command, :git_access, :repository, :gitaly_address
attr_reader :repo_path attr_reader :repo_path
def initialize(key_id) def initialize(key_id)
...@@ -99,6 +99,7 @@ class GitlabShell ...@@ -99,6 +99,7 @@ class GitlabShell
self.repo_path = status.repository_path self.repo_path = status.repository_path
@gl_repository = status.gl_repository @gl_repository = status.gl_repository
@gitaly = status.gitaly
end end
def process_cmd(args) def process_cmd(args)
...@@ -115,15 +116,16 @@ class GitlabShell ...@@ -115,15 +116,16 @@ class GitlabShell
executable = @command executable = @command
args = [repo_path] args = [repo_path]
if GITALY_MIGRATED_COMMANDS.has_key?(executable) if GITALY_MIGRATED_COMMANDS.has_key?(executable) && @gitaly
executable = GITALY_MIGRATED_COMMANDS[executable] executable = GITALY_MIGRATED_COMMANDS[executable]
gitaly_address = '' # would be returned by gitlab-rails internal API gitaly_address = @gitaly['address']
# The entire gitaly_request hash should be built in gitlab-ce and passed # The entire gitaly_request hash should be built in gitlab-ce and passed
# on as-is. For now we build a fake one on the spot. # on as-is. For now we build a fake one on the spot.
gitaly_request = JSON.dump({ gitaly_request = JSON.dump({
'repository' => { 'path' => repo_path }, 'repository' => @gitaly['repository'],
'gl_repository' => @gl_repository,
'gl_id' => @key_id, 'gl_id' => @key_id,
}) })
...@@ -153,6 +155,11 @@ class GitlabShell ...@@ -153,6 +155,11 @@ class GitlabShell
'GL_PROTOCOL' => GL_PROTOCOL, 'GL_PROTOCOL' => GL_PROTOCOL,
'GL_REPOSITORY' => @gl_repository 'GL_REPOSITORY' => @gl_repository
} }
if @gitaly && @gitaly.has?('token')
env.merge!({
'GITALY_TOKEN' => @gitaly['token']
})
end
if git_trace_available? if git_trace_available?
env.merge!({ env.merge!({
......
...@@ -7,7 +7,7 @@ describe GitlabAccess do ...@@ -7,7 +7,7 @@ describe GitlabAccess do
let(:repo_path) { File.join(repository_path, repo_name) + ".git" } let(:repo_path) { File.join(repository_path, repo_name) + ".git" }
let(:api) do let(:api) do
double(GitlabNet).tap do |api| double(GitlabNet).tap do |api|
api.stub(check_access: GitAccessStatus.new(true, 'ok', 'project-1', '/home/git/repositories')) api.stub(check_access: GitAccessStatus.new(true, 'ok', 'project-1', '/home/git/repositories', nil))
end end
end end
subject do subject do
...@@ -38,7 +38,7 @@ describe GitlabAccess do ...@@ -38,7 +38,7 @@ describe GitlabAccess do
context "access is denied" do context "access is denied" do
before do before do
api.stub(check_access: GitAccessStatus.new(false, 'denied', nil, nil)) api.stub(check_access: GitAccessStatus.new(false, 'denied', nil, nil, nil))
end end
it "returns false" do it "returns false" do
......
...@@ -19,10 +19,12 @@ describe GitlabShell do ...@@ -19,10 +19,12 @@ describe GitlabShell do
end end
end end
let(:gitaly_check_access) { GitAccessStatus.new(true, 'ok', gl_repository, repo_path, { 'repository' => { 'relative_path' => repo_name, 'storage_name' => 'default'} , 'address' => 'unix:gitaly.socket' })}
let(:api) do let(:api) do
double(GitlabNet).tap do |api| double(GitlabNet).tap do |api|
api.stub(discover: { 'name' => 'John Doe' }) api.stub(discover: { 'name' => 'John Doe' })
api.stub(check_access: GitAccessStatus.new(true, 'ok', gl_repository, repo_path)) api.stub(check_access: GitAccessStatus.new(true, 'ok', gl_repository, repo_path, nil))
api.stub(two_factor_recovery_codes: { api.stub(two_factor_recovery_codes: {
'success' => true, 'success' => true,
'recovery_codes' => ['f67c514de60c4953', '41278385fc00c1e0'] 'recovery_codes' => ['f67c514de60c4953', '41278385fc00c1e0']
...@@ -128,7 +130,7 @@ describe GitlabShell do ...@@ -128,7 +130,7 @@ describe GitlabShell do
end end
describe :exec do describe :exec do
let(:gitaly_message) { JSON.dump({ 'repository' => { 'path' => repo_path }, 'gl_id' => key_id }) } let(:gitaly_message) { JSON.dump({ 'repository' => { 'relative_path' => repo_name, 'storage_name' => 'default' }, 'gl_repository' => gl_repository , 'gl_id' => key_id}) }
context 'git-upload-pack' do context 'git-upload-pack' do
let(:ssh_cmd) { "git-upload-pack gitlab-ci.git" } let(:ssh_cmd) { "git-upload-pack gitlab-ci.git" }
...@@ -139,12 +141,40 @@ describe GitlabShell do ...@@ -139,12 +141,40 @@ describe GitlabShell do
end end
it "should execute the command" do it "should execute the command" do
subject.should_receive(:exec_cmd).with(File.join(ROOT_PATH, "bin/gitaly-upload-pack"), '', gitaly_message) subject.should_receive(:exec_cmd).with('git-upload-pack', repo_path)
end
it "should log the command execution" do
message = "gitlab-shell: executing git command "
message << "<git-upload-pack #{repo_path}> "
message << "for user with key #{key_id}."
$logger.should_receive(:info).with(message)
end
it "should use usernames if configured to do so" do
GitlabConfig.any_instance.stub(audit_usernames: true)
$logger.should_receive(:info) { |msg| msg.should =~ /for John Doe/ }
end
end
context 'gitaly-upload-pack' do
let(:ssh_cmd) { "git-upload-pack gitlab-ci.git" }
before {
api.stub(check_access: gitaly_check_access)
}
after { subject.exec(ssh_cmd) }
it "should process the command" do
subject.should_receive(:process_cmd).with(%W(git-upload-pack gitlab-ci.git))
end
it "should execute the command" do
subject.should_receive(:exec_cmd).with(File.join(ROOT_PATH, "bin/gitaly-upload-pack"), 'unix:gitaly.socket', gitaly_message)
end end
it "should log the command execution" do it "should log the command execution" do
message = "gitlab-shell: executing git command " message = "gitlab-shell: executing git command "
message << "<gitaly-upload-pack #{gitaly_message}> " message << "<gitaly-upload-pack unix:gitaly.socket #{gitaly_message}> "
message << "for user with key #{key_id}." message << "for user with key #{key_id}."
$logger.should_receive(:info).with(message) $logger.should_receive(:info).with(message)
end end
...@@ -164,17 +194,45 @@ describe GitlabShell do ...@@ -164,17 +194,45 @@ describe GitlabShell do
end end
it "should execute the command" do it "should execute the command" do
subject.should_receive(:exec_cmd).with(File.join(ROOT_PATH, "bin/gitaly-receive-pack"), '', gitaly_message) subject.should_receive(:exec_cmd).with('git-receive-pack', repo_path)
end end
it "should log the command execution" do it "should log the command execution" do
message = "gitlab-shell: executing git command " message = "gitlab-shell: executing git command "
message << "<gitaly-receive-pack #{gitaly_message}> " message << "<git-receive-pack #{repo_path}> "
message << "for user with key #{key_id}." message << "for user with key #{key_id}."
$logger.should_receive(:info).with(message) $logger.should_receive(:info).with(message)
end end
end end
context 'gitaly-receive-pack' do
let(:ssh_cmd) { "git-receive-pack gitlab-ci.git" }
before {
api.stub(check_access: gitaly_check_access)
}
after { subject.exec(ssh_cmd) }
it "should process the command" do
subject.should_receive(:process_cmd).with(%W(git-receive-pack gitlab-ci.git))
end
it "should execute the command" do
subject.should_receive(:exec_cmd).with(File.join(ROOT_PATH, "bin/gitaly-receive-pack"), 'unix:gitaly.socket', gitaly_message)
end
it "should log the command execution" do
message = "gitlab-shell: executing git command "
message << "<gitaly-receive-pack unix:gitaly.socket #{gitaly_message}> "
message << "for user with key #{key_id}."
$logger.should_receive(:info).with(message)
end
it "should use usernames if configured to do so" do
GitlabConfig.any_instance.stub(audit_usernames: true)
$logger.should_receive(:info) { |msg| msg.should =~ /for John Doe/ }
end
end
context 'arbitrary command' do context 'arbitrary command' do
let(:ssh_cmd) { 'arbitrary command' } let(:ssh_cmd) { 'arbitrary command' }
after { subject.exec(ssh_cmd) } after { subject.exec(ssh_cmd) }
...@@ -268,7 +326,7 @@ describe GitlabShell do ...@@ -268,7 +326,7 @@ describe GitlabShell do
end end
it "should disallow access and log the attempt if check_access returns false status" do it "should disallow access and log the attempt if check_access returns false status" do
api.stub(check_access: GitAccessStatus.new(false, 'denied', nil, nil)) api.stub(check_access: GitAccessStatus.new(false, 'denied', nil, nil, nil))
message = "gitlab-shell: Access denied for git command <git-upload-pack gitlab-ci.git> " message = "gitlab-shell: Access denied for git command <git-upload-pack gitlab-ci.git> "
message << "by user with key #{key_id}." message << "by user with key #{key_id}."
$logger.should_receive(:warn).with(message) $logger.should_receive(:warn).with(message)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment