Commit 9f4a72a4 authored by Nick Thomas's avatar Nick Thomas

Merge branch '149-show-all-refs' into 'master'

Respect the ShowAllRefs flag in git upload-pack and info-refs

Closes #149

See merge request gitlab-org/gitlab-workhorse!203
parents 2ee8ec83 ba8d951b
......@@ -15,6 +15,7 @@ import (
"time"
"gitlab.com/gitlab-org/gitlab-workhorse/internal/api"
"gitlab.com/gitlab-org/gitlab-workhorse/internal/git"
"gitlab.com/gitlab-org/gitlab-workhorse/internal/gitaly"
"gitlab.com/gitlab-org/gitlab-workhorse/internal/testhelper"
......@@ -60,6 +61,10 @@ func TestGetInfoRefsProxiedToGitalySuccessfully(t *testing.T) {
apiResponse := gitOkBody(t)
apiResponse.GitalyServer.Address = gitalyAddress
for _, showAllRefs := range []bool{true, false} {
t.Run(fmt.Sprintf("ShowAllRefs=%v", showAllRefs), func(t *testing.T) {
apiResponse.ShowAllRefs = showAllRefs
ts := testAuthServer(nil, 200, apiResponse)
defer ts.Close()
......@@ -69,8 +74,16 @@ func TestGetInfoRefsProxiedToGitalySuccessfully(t *testing.T) {
resource := "/gitlab-org/gitlab-test.git/info/refs?service=git-upload-pack"
_, body := httpGet(t, ws.URL+resource)
expectedContent := string(testhelper.GitalyInfoRefsResponseMock)
expectedContent := "\n\000" + string(testhelper.GitalyInfoRefsResponseMock) + "\000"
if showAllRefs {
expectedContent = git.GitConfigShowAllRefs + expectedContent
}
assert.Equal(t, expectedContent, body, "GET %q: response body", resource)
})
}
}
func TestGetInfoRefsProxiedToGitalyInterruptedStream(t *testing.T) {
......@@ -182,11 +195,20 @@ func TestPostReceivePackProxiedToGitalyInterrupted(t *testing.T) {
}
func TestPostUploadPackProxiedToGitalySuccessfully(t *testing.T) {
for i, tc := range []struct {
showAllRefs bool
code codes.Code
}{
{true, codes.OK},
{true, codes.Unavailable},
{false, codes.OK},
{false, codes.Unavailable},
} {
t.Run(fmt.Sprintf("Case %d", i), func(t *testing.T) {
apiResponse := gitOkBody(t)
apiResponse.ShowAllRefs = tc.showAllRefs
for _, code := range []codes.Code{codes.OK, codes.Unavailable} {
func() {
gitalyServer, socketPath := startGitalyServer(t, code)
gitalyServer, socketPath := startGitalyServer(t, tc.code)
defer gitalyServer.Stop()
apiResponse.GitalyServer.Address = "unix://" + socketPath
......@@ -204,16 +226,23 @@ func TestPostUploadPackProxiedToGitalySuccessfully(t *testing.T) {
testhelper.GitalyUploadPackResponseMock,
)
expectedBody := strings.Join([]string{
expectedBodyParts := []string{
apiResponse.Repository.StorageName,
apiResponse.Repository.RelativePath,
string(testhelper.GitalyUploadPackResponseMock),
}, "\000")
}
if tc.showAllRefs {
expectedBodyParts = append(expectedBodyParts, git.GitConfigShowAllRefs+"\n")
} else {
expectedBodyParts = append(expectedBodyParts, "\n")
}
expectedBodyParts = append(expectedBodyParts, string(testhelper.GitalyUploadPackResponseMock))
expectedBody := strings.Join(expectedBodyParts, "\000")
assert.Equal(t, 200, resp.StatusCode, "POST %q", resource)
assert.Equal(t, expectedBody, body, "POST %q: response body", resource)
testhelper.AssertResponseHeader(t, resp, "Content-Type", "application/x-git-upload-pack-result")
}()
})
}
}
......
......@@ -114,6 +114,8 @@ type Response struct {
// Repository object for making gRPC requests to Gitaly. This will
// eventually replace the RepoPath field.
Repository pb.Repository
// For git-http, does the requestor have the right to view all refs?
ShowAllRefs bool
}
// singleJoiningSlash is taken from reverseproxy.go:NewSingleHostReverseProxy
......
......@@ -20,6 +20,12 @@ import (
"gitlab.com/gitlab-org/gitlab-workhorse/internal/helper"
)
const (
// We have to use a negative transfer.hideRefs since this is the only way
// to undo an already set parameter: https://www.spinics.net/lists/git/msg256772.html
GitConfigShowAllRefs = "transfer.hideRefs=!refs"
)
func ReceivePack(a *api.API) http.Handler {
return postRPCHandler(a, "handleReceivePack", handleReceivePack)
}
......@@ -28,6 +34,16 @@ func UploadPack(a *api.API) http.Handler {
return postRPCHandler(a, "handleUploadPack", handleUploadPack)
}
func gitConfigOptions(a *api.Response) []string {
var out []string
if a.ShowAllRefs {
out = append(out, GitConfigShowAllRefs)
}
return out
}
func postRPCHandler(a *api.API, name string, handler func(*GitHttpResponseWriter, *http.Request, *api.Response) error) http.Handler {
return repoPreAuthorizeHandler(a, func(rw http.ResponseWriter, r *http.Request, ar *api.Response) {
cr := &countReadCloser{ReadCloser: r.Body}
......
......@@ -77,7 +77,7 @@ func handleGetInfoRefsWithGitaly(ctx context.Context, w http.ResponseWriter, a *
return fmt.Errorf("GetInfoRefsHandler: %v", err)
}
infoRefsResponseReader, err := smarthttp.InfoRefsResponseReader(ctx, &a.Repository, rpc)
infoRefsResponseReader, err := smarthttp.InfoRefsResponseReader(ctx, &a.Repository, rpc, gitConfigOptions(a))
if err != nil {
return fmt.Errorf("GetInfoRefsHandler: %v", err)
}
......
......@@ -65,7 +65,7 @@ func handleUploadPackWithGitaly(ctx context.Context, a *api.Response, clientRequ
return fmt.Errorf("smarthttp.UploadPack: %v", err)
}
if err := smarthttp.UploadPack(ctx, &a.Repository, clientRequest, clientResponse); err != nil {
if err := smarthttp.UploadPack(ctx, &a.Repository, clientRequest, clientResponse, gitConfigOptions(a)); err != nil {
return fmt.Errorf("smarthttp.UploadPack: %v", err)
}
......
......@@ -13,8 +13,8 @@ type SmartHTTPClient struct {
pb.SmartHTTPServiceClient
}
func (client *SmartHTTPClient) InfoRefsResponseReader(ctx context.Context, repo *pb.Repository, rpc string) (io.Reader, error) {
rpcRequest := &pb.InfoRefsRequest{Repository: repo}
func (client *SmartHTTPClient) InfoRefsResponseReader(ctx context.Context, repo *pb.Repository, rpc string, gitConfigOptions []string) (io.Reader, error) {
rpcRequest := &pb.InfoRefsRequest{Repository: repo, GitConfigOptions: gitConfigOptions}
switch rpc {
case "git-upload-pack":
......@@ -86,7 +86,7 @@ func (client *SmartHTTPClient) ReceivePack(ctx context.Context, repo *pb.Reposit
return nil
}
func (client *SmartHTTPClient) UploadPack(ctx context.Context, repo *pb.Repository, clientRequest io.Reader, clientResponse io.Writer) error {
func (client *SmartHTTPClient) UploadPack(ctx context.Context, repo *pb.Repository, clientRequest io.Reader, clientResponse io.Writer, gitConfigOptions []string) error {
stream, err := client.PostUploadPack(ctx)
if err != nil {
return err
......@@ -94,6 +94,7 @@ func (client *SmartHTTPClient) UploadPack(ctx context.Context, repo *pb.Reposito
rpcRequest := &pb.PostUploadPackRequest{
Repository: repo,
GitConfigOptions: gitConfigOptions,
}
if err := stream.Send(rpcRequest); err != nil {
......
......@@ -53,7 +53,14 @@ func (s *GitalyTestServer) InfoRefsUploadPack(in *pb.InfoRefsRequest, stream pb.
return err
}
nSends, err := sendBytes([]byte(GitalyInfoRefsResponseMock), 100, func(p []byte) error {
fmt.Printf("Result: %+v", in)
data := []byte(strings.Join([]string{
strings.Join(in.GitConfigOptions, "\n") + "\n",
GitalyInfoRefsResponseMock,
}, "\000") + "\000")
nSends, err := sendBytes(data, 100, func(p []byte) error {
return stream.Send(&pb.InfoRefsResponse{Data: p})
})
if err != nil {
......@@ -147,6 +154,7 @@ func (s *GitalyTestServer) PostUploadPack(stream pb.SmartHTTPService_PostUploadP
data := []byte(strings.Join([]string{
repo.GetStorageName(),
repo.GetRelativePath(),
strings.Join(req.GitConfigOptions, "\n") + "\n",
}, "\000") + "\000")
// The body of the request starts in the second message
......@@ -307,6 +315,10 @@ func (s *GitalyTestServer) Exists(context.Context, *pb.RepositoryExistsRequest)
return nil, nil
}
func (s *GitalyTestServer) HasLocalBranches(ctx context.Context, in *pb.HasLocalBranchesRequest) (*pb.HasLocalBranchesResponse, error) {
return nil, nil
}
func (s *GitalyTestServer) CommitDelta(in *pb.CommitDeltaRequest, stream pb.DiffService_CommitDeltaServer) error {
return nil
}
......@@ -319,6 +331,10 @@ func (s *GitalyTestServer) CommitPatch(in *pb.CommitPatchRequest, stream pb.Diff
return nil
}
func (s *GitalyTestServer) GetBlobs(in *pb.GetBlobsRequest, stream pb.BlobService_GetBlobsServer) error {
return nil
}
// sendBytes returns the number of times the 'sender' function was called and an error.
func sendBytes(data []byte, chunkSize int, sender func([]byte) error) (int, error) {
i := 0
......
......@@ -17,10 +17,13 @@ It is generated from these files:
shared.proto
smarthttp.proto
ssh.proto
wiki.proto
It has these top-level messages:
GetBlobRequest
GetBlobResponse
GetBlobsRequest
GetBlobsResponse
CommitStatsRequest
CommitStatsResponse
CommitIsAncestorRequest
......@@ -79,6 +82,9 @@ It has these top-level messages:
UserDeleteTagResponse
UserCreateTagRequest
UserCreateTagResponse
UserMergeBranchRequest
UserMergeBranchResponse
OperationBranchUpdate
FindDefaultBranchNameRequest
FindDefaultBranchNameResponse
FindAllBranchNamesRequest
......@@ -121,6 +127,8 @@ It has these top-level messages:
CreateRepositoryResponse
GetArchiveRequest
GetArchiveResponse
HasLocalBranchesRequest
HasLocalBranchesResponse
Repository
GitCommit
CommitAuthor
......@@ -138,6 +146,9 @@ It has these top-level messages:
SSHUploadPackResponse
SSHReceivePackRequest
SSHReceivePackResponse
WikiPageVersion
WikiGetPageVersionsRequest
WikiGetPageVersionsResponse
*/
package gitaly
......@@ -230,9 +241,80 @@ func (m *GetBlobResponse) GetOid() string {
return ""
}
type GetBlobsRequest struct {
Repository *Repository `protobuf:"bytes,1,opt,name=repository" json:"repository,omitempty"`
// Object IDs (SHA1) of the blobs we want to get
Oids []string `protobuf:"bytes,2,rep,name=oids" json:"oids,omitempty"`
// Maximum number of bytes we want to receive. Use '-1' to get the full blobs no matter how big.
Limit int64 `protobuf:"varint,3,opt,name=limit" json:"limit,omitempty"`
}
func (m *GetBlobsRequest) Reset() { *m = GetBlobsRequest{} }
func (m *GetBlobsRequest) String() string { return proto.CompactTextString(m) }
func (*GetBlobsRequest) ProtoMessage() {}
func (*GetBlobsRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{2} }
func (m *GetBlobsRequest) GetRepository() *Repository {
if m != nil {
return m.Repository
}
return nil
}
func (m *GetBlobsRequest) GetOids() []string {
if m != nil {
return m.Oids
}
return nil
}
func (m *GetBlobsRequest) GetLimit() int64 {
if m != nil {
return m.Limit
}
return 0
}
type GetBlobsResponse struct {
// Blob size; present only on the first message per blob
Size int64 `protobuf:"varint,1,opt,name=size" json:"size,omitempty"`
// Chunk of blob data
Data []byte `protobuf:"bytes,2,opt,name=data,proto3" json:"data,omitempty"`
// Object ID of the current blob. Only present on the first message per blob. Empty if no blob was found.
Oid string `protobuf:"bytes,3,opt,name=oid" json:"oid,omitempty"`
}
func (m *GetBlobsResponse) Reset() { *m = GetBlobsResponse{} }
func (m *GetBlobsResponse) String() string { return proto.CompactTextString(m) }
func (*GetBlobsResponse) ProtoMessage() {}
func (*GetBlobsResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{3} }
func (m *GetBlobsResponse) GetSize() int64 {
if m != nil {
return m.Size
}
return 0
}
func (m *GetBlobsResponse) GetData() []byte {
if m != nil {
return m.Data
}
return nil
}
func (m *GetBlobsResponse) GetOid() string {
if m != nil {
return m.Oid
}
return ""
}
func init() {
proto.RegisterType((*GetBlobRequest)(nil), "gitaly.GetBlobRequest")
proto.RegisterType((*GetBlobResponse)(nil), "gitaly.GetBlobResponse")
proto.RegisterType((*GetBlobsRequest)(nil), "gitaly.GetBlobsRequest")
proto.RegisterType((*GetBlobsResponse)(nil), "gitaly.GetBlobsResponse")
}
// Reference imports to suppress errors if they are not otherwise used.
......@@ -250,6 +332,11 @@ type BlobServiceClient interface {
// ID. We use a stream to return a chunked arbitrarily large binary
// response
GetBlob(ctx context.Context, in *GetBlobRequest, opts ...grpc.CallOption) (BlobService_GetBlobClient, error)
// GetBlobsBySHA returns the contents of a blob objects referenced by their object
// ID. We use a stream to return a chunked arbitrarily large binary response.
// The blobs are sent in a continous stream, the caller is responsible for spliting
// them up into multiple blobs by their object IDs.
GetBlobs(ctx context.Context, in *GetBlobsRequest, opts ...grpc.CallOption) (BlobService_GetBlobsClient, error)
}
type blobServiceClient struct {
......@@ -292,6 +379,38 @@ func (x *blobServiceGetBlobClient) Recv() (*GetBlobResponse, error) {
return m, nil
}
func (c *blobServiceClient) GetBlobs(ctx context.Context, in *GetBlobsRequest, opts ...grpc.CallOption) (BlobService_GetBlobsClient, error) {
stream, err := grpc.NewClientStream(ctx, &_BlobService_serviceDesc.Streams[1], c.cc, "/gitaly.BlobService/GetBlobs", opts...)
if err != nil {
return nil, err
}
x := &blobServiceGetBlobsClient{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 BlobService_GetBlobsClient interface {
Recv() (*GetBlobsResponse, error)
grpc.ClientStream
}
type blobServiceGetBlobsClient struct {
grpc.ClientStream
}
func (x *blobServiceGetBlobsClient) Recv() (*GetBlobsResponse, error) {
m := new(GetBlobsResponse)
if err := x.ClientStream.RecvMsg(m); err != nil {
return nil, err
}
return m, nil
}
// Server API for BlobService service
type BlobServiceServer interface {
......@@ -299,6 +418,11 @@ type BlobServiceServer interface {
// ID. We use a stream to return a chunked arbitrarily large binary
// response
GetBlob(*GetBlobRequest, BlobService_GetBlobServer) error
// GetBlobsBySHA returns the contents of a blob objects referenced by their object
// ID. We use a stream to return a chunked arbitrarily large binary response.
// The blobs are sent in a continous stream, the caller is responsible for spliting
// them up into multiple blobs by their object IDs.
GetBlobs(*GetBlobsRequest, BlobService_GetBlobsServer) error
}
func RegisterBlobServiceServer(s *grpc.Server, srv BlobServiceServer) {
......@@ -326,6 +450,27 @@ func (x *blobServiceGetBlobServer) Send(m *GetBlobResponse) error {
return x.ServerStream.SendMsg(m)
}
func _BlobService_GetBlobs_Handler(srv interface{}, stream grpc.ServerStream) error {
m := new(GetBlobsRequest)
if err := stream.RecvMsg(m); err != nil {
return err
}
return srv.(BlobServiceServer).GetBlobs(m, &blobServiceGetBlobsServer{stream})
}
type BlobService_GetBlobsServer interface {
Send(*GetBlobsResponse) error
grpc.ServerStream
}
type blobServiceGetBlobsServer struct {
grpc.ServerStream
}
func (x *blobServiceGetBlobsServer) Send(m *GetBlobsResponse) error {
return x.ServerStream.SendMsg(m)
}
var _BlobService_serviceDesc = grpc.ServiceDesc{
ServiceName: "gitaly.BlobService",
HandlerType: (*BlobServiceServer)(nil),
......@@ -336,6 +481,11 @@ var _BlobService_serviceDesc = grpc.ServiceDesc{
Handler: _BlobService_GetBlob_Handler,
ServerStreams: true,
},
{
StreamName: "GetBlobs",
Handler: _BlobService_GetBlobs_Handler,
ServerStreams: true,
},
},
Metadata: "blob.proto",
}
......@@ -343,19 +493,22 @@ var _BlobService_serviceDesc = grpc.ServiceDesc{
func init() { proto.RegisterFile("blob.proto", fileDescriptor0) }
var fileDescriptor0 = []byte{
// 217 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x64, 0x90, 0x31, 0x4b, 0xc7, 0x30,
0x10, 0xc5, 0x8d, 0xd1, 0xbf, 0x78, 0x2d, 0x2a, 0x87, 0x68, 0xe9, 0x54, 0x3a, 0x75, 0x2a, 0x52,
0x77, 0x07, 0x17, 0x07, 0x71, 0x89, 0x9f, 0x20, 0xb1, 0x87, 0x06, 0xa2, 0x57, 0x93, 0x28, 0xd4,
0x4f, 0x2f, 0x4d, 0x6c, 0x51, 0xdc, 0x5e, 0x5e, 0x92, 0xf7, 0x7b, 0x77, 0x00, 0xc6, 0xb1, 0xe9,
0x27, 0xcf, 0x91, 0x71, 0xf7, 0x6c, 0xa3, 0x76, 0x73, 0x5d, 0x86, 0x17, 0xed, 0x69, 0xcc, 0x6e,
0xeb, 0xe0, 0xe4, 0x8e, 0xe2, 0xad, 0x63, 0xa3, 0xe8, 0xfd, 0x83, 0x42, 0xc4, 0x01, 0xc0, 0xd3,
0xc4, 0xc1, 0x46, 0xf6, 0x73, 0x25, 0x1a, 0xd1, 0x15, 0x03, 0xf6, 0xf9, 0x73, 0xaf, 0xb6, 0x1b,
0xf5, 0xeb, 0x15, 0x9e, 0x81, 0x64, 0x3b, 0x56, 0xfb, 0x8d, 0xe8, 0x8e, 0xd5, 0x22, 0xf1, 0x1c,
0x0e, 0x9d, 0x7d, 0xb5, 0xb1, 0x92, 0x8d, 0xe8, 0xa4, 0xca, 0x87, 0xf6, 0x1e, 0x4e, 0x37, 0x5a,
0x98, 0xf8, 0x2d, 0x10, 0x22, 0x1c, 0x04, 0xfb, 0x45, 0x09, 0x24, 0x55, 0xd2, 0x8b, 0x37, 0xea,
0xa8, 0x53, 0x5e, 0xa9, 0x92, 0x5e, 0x11, 0x72, 0x43, 0x0c, 0x0f, 0x50, 0x2c, 0x49, 0x8f, 0xe4,
0x3f, 0xed, 0x13, 0xe1, 0x0d, 0x1c, 0xfd, 0x64, 0xe3, 0xc5, 0x5a, 0xf7, 0xef, 0x68, 0xf5, 0xe5,
0x3f, 0x3f, 0x97, 0x68, 0xf7, 0xae, 0x84, 0xd9, 0xa5, 0x85, 0x5c, 0x7f, 0x07, 0x00, 0x00, 0xff,
0xff, 0xab, 0x77, 0x1a, 0x6d, 0x34, 0x01, 0x00, 0x00,
// 266 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x92, 0x31, 0x4f, 0xc3, 0x30,
0x10, 0x85, 0x71, 0x5d, 0x0a, 0xbd, 0x56, 0x50, 0x9d, 0x10, 0x58, 0x99, 0xa2, 0x4c, 0x99, 0x22,
0x14, 0x76, 0x24, 0x58, 0x18, 0x60, 0x32, 0xbf, 0x20, 0x21, 0x27, 0xb0, 0x64, 0xb8, 0x60, 0x1b,
0xa4, 0xf2, 0x2b, 0xf8, 0xc9, 0x28, 0x0e, 0x49, 0x81, 0x8a, 0xa9, 0xdb, 0xcb, 0xbb, 0xcb, 0x7b,
0x9f, 0x6c, 0x03, 0xd4, 0x96, 0xeb, 0xa2, 0x75, 0x1c, 0x18, 0x67, 0x8f, 0x26, 0x54, 0x76, 0x9d,
0x2c, 0xfd, 0x53, 0xe5, 0xa8, 0xe9, 0xdd, 0xcc, 0xc2, 0xd1, 0x0d, 0x85, 0x6b, 0xcb, 0xb5, 0xa6,
0xd7, 0x37, 0xf2, 0x01, 0x4b, 0x00, 0x47, 0x2d, 0x7b, 0x13, 0xd8, 0xad, 0x95, 0x48, 0x45, 0xbe,
0x28, 0xb1, 0xe8, 0x7f, 0x2e, 0xf4, 0x38, 0xd1, 0x3f, 0xb6, 0x70, 0x05, 0x92, 0x4d, 0xa3, 0x26,
0xa9, 0xc8, 0xe7, 0xba, 0x93, 0x78, 0x02, 0xfb, 0xd6, 0x3c, 0x9b, 0xa0, 0x64, 0x2a, 0x72, 0xa9,
0xfb, 0x8f, 0xec, 0x16, 0x8e, 0xc7, 0x36, 0xdf, 0xf2, 0x8b, 0x27, 0x44, 0x98, 0x7a, 0xf3, 0x41,
0xb1, 0x48, 0xea, 0xa8, 0x3b, 0xaf, 0xa9, 0x42, 0x15, 0xf3, 0x96, 0x3a, 0xea, 0xa1, 0x42, 0x8e,
0x15, 0x19, 0x8f, 0x61, 0x7e, 0x17, 0x76, 0x84, 0x29, 0x9b, 0xc6, 0xab, 0x49, 0x2a, 0xf3, 0xb9,
0x8e, 0xfa, 0x1f, 0xfa, 0x3b, 0x58, 0x6d, 0x0a, 0x77, 0xc5, 0x2f, 0x3f, 0x05, 0x2c, 0xba, 0xac,
0x7b, 0x72, 0xef, 0xe6, 0x81, 0xf0, 0x12, 0x0e, 0xbe, 0xd3, 0xf1, 0x74, 0x40, 0xfe, 0x7d, 0x35,
0xc9, 0xd9, 0x96, 0xdf, 0x53, 0x64, 0x7b, 0xe7, 0x02, 0xaf, 0xe0, 0x70, 0xa0, 0xc3, 0xbf, 0x8b,
0xc3, 0x01, 0x25, 0x6a, 0x7b, 0xb0, 0x89, 0xa8, 0x67, 0xf1, 0x4d, 0x5c, 0x7c, 0x05, 0x00, 0x00,
0xff, 0xff, 0x99, 0x07, 0x5e, 0x8d, 0x37, 0x02, 0x00, 0x00,
}
......@@ -259,6 +259,128 @@ func (m *UserCreateTagResponse) GetPreReceiveError() string {
return ""
}
type UserMergeBranchRequest struct {
// First message
Repository *Repository `protobuf:"bytes,1,opt,name=repository" json:"repository,omitempty"`
User *User `protobuf:"bytes,2,opt,name=user" json:"user,omitempty"`
CommitId string `protobuf:"bytes,3,opt,name=commit_id,json=commitId" json:"commit_id,omitempty"`
Branch []byte `protobuf:"bytes,4,opt,name=branch,proto3" json:"branch,omitempty"`
Message []byte `protobuf:"bytes,5,opt,name=message,proto3" json:"message,omitempty"`
// Second message
// Tell the server to apply the merge to the branch
Apply bool `protobuf:"varint,6,opt,name=apply" json:"apply,omitempty"`
}
func (m *UserMergeBranchRequest) Reset() { *m = UserMergeBranchRequest{} }
func (m *UserMergeBranchRequest) String() string { return proto.CompactTextString(m) }
func (*UserMergeBranchRequest) ProtoMessage() {}
func (*UserMergeBranchRequest) Descriptor() ([]byte, []int) { return fileDescriptor6, []int{8} }
func (m *UserMergeBranchRequest) GetRepository() *Repository {
if m != nil {
return m.Repository
}
return nil
}
func (m *UserMergeBranchRequest) GetUser() *User {
if m != nil {
return m.User
}
return nil
}
func (m *UserMergeBranchRequest) GetCommitId() string {
if m != nil {
return m.CommitId
}
return ""
}
func (m *UserMergeBranchRequest) GetBranch() []byte {
if m != nil {
return m.Branch
}
return nil
}
func (m *UserMergeBranchRequest) GetMessage() []byte {
if m != nil {
return m.Message
}
return nil
}
func (m *UserMergeBranchRequest) GetApply() bool {
if m != nil {
return m.Apply
}
return false
}
type UserMergeBranchResponse struct {
// First message
// The merge commit the branch will be updated to. The caller can still abort the merge.
CommitId string `protobuf:"bytes,1,opt,name=commit_id,json=commitId" json:"commit_id,omitempty"`
// Second message
// If set, the merge has been applied to the branch.
BranchUpdate *OperationBranchUpdate `protobuf:"bytes,3,opt,name=branch_update,json=branchUpdate" json:"branch_update,omitempty"`
}
func (m *UserMergeBranchResponse) Reset() { *m = UserMergeBranchResponse{} }
func (m *UserMergeBranchResponse) String() string { return proto.CompactTextString(m) }
func (*UserMergeBranchResponse) ProtoMessage() {}
func (*UserMergeBranchResponse) Descriptor() ([]byte, []int) { return fileDescriptor6, []int{9} }
func (m *UserMergeBranchResponse) GetCommitId() string {
if m != nil {
return m.CommitId
}
return ""
}
func (m *UserMergeBranchResponse) GetBranchUpdate() *OperationBranchUpdate {
if m != nil {
return m.BranchUpdate
}
return nil
}
type OperationBranchUpdate struct {
// If this string is non-empty the branch has been updated.
CommitId string `protobuf:"bytes,1,opt,name=commit_id,json=commitId" json:"commit_id,omitempty"`
// Used for cache invalidation in GitLab
RepoCreated bool `protobuf:"varint,2,opt,name=repo_created,json=repoCreated" json:"repo_created,omitempty"`
// Used for cache invalidation in GitLab
BranchCreated bool `protobuf:"varint,3,opt,name=branch_created,json=branchCreated" json:"branch_created,omitempty"`
}
func (m *OperationBranchUpdate) Reset() { *m = OperationBranchUpdate{} }
func (m *OperationBranchUpdate) String() string { return proto.CompactTextString(m) }
func (*OperationBranchUpdate) ProtoMessage() {}
func (*OperationBranchUpdate) Descriptor() ([]byte, []int) { return fileDescriptor6, []int{10} }
func (m *OperationBranchUpdate) GetCommitId() string {
if m != nil {
return m.CommitId
}
return ""
}
func (m *OperationBranchUpdate) GetRepoCreated() bool {
if m != nil {
return m.RepoCreated
}
return false
}
func (m *OperationBranchUpdate) GetBranchCreated() bool {
if m != nil {
return m.BranchCreated
}
return false
}
func init() {
proto.RegisterType((*UserCreateBranchRequest)(nil), "gitaly.UserCreateBranchRequest")
proto.RegisterType((*UserCreateBranchResponse)(nil), "gitaly.UserCreateBranchResponse")
......@@ -268,6 +390,9 @@ func init() {
proto.RegisterType((*UserDeleteTagResponse)(nil), "gitaly.UserDeleteTagResponse")
proto.RegisterType((*UserCreateTagRequest)(nil), "gitaly.UserCreateTagRequest")
proto.RegisterType((*UserCreateTagResponse)(nil), "gitaly.UserCreateTagResponse")
proto.RegisterType((*UserMergeBranchRequest)(nil), "gitaly.UserMergeBranchRequest")
proto.RegisterType((*UserMergeBranchResponse)(nil), "gitaly.UserMergeBranchResponse")
proto.RegisterType((*OperationBranchUpdate)(nil), "gitaly.OperationBranchUpdate")
}
// Reference imports to suppress errors if they are not otherwise used.
......@@ -285,6 +410,7 @@ type OperationServiceClient interface {
UserDeleteBranch(ctx context.Context, in *UserDeleteBranchRequest, opts ...grpc.CallOption) (*UserDeleteBranchResponse, error)
UserCreateTag(ctx context.Context, in *UserCreateTagRequest, opts ...grpc.CallOption) (*UserCreateTagResponse, error)
UserDeleteTag(ctx context.Context, in *UserDeleteTagRequest, opts ...grpc.CallOption) (*UserDeleteTagResponse, error)
UserMergeBranch(ctx context.Context, opts ...grpc.CallOption) (OperationService_UserMergeBranchClient, error)
}
type operationServiceClient struct {
......@@ -331,6 +457,37 @@ func (c *operationServiceClient) UserDeleteTag(ctx context.Context, in *UserDele
return out, nil
}
func (c *operationServiceClient) UserMergeBranch(ctx context.Context, opts ...grpc.CallOption) (OperationService_UserMergeBranchClient, error) {
stream, err := grpc.NewClientStream(ctx, &_OperationService_serviceDesc.Streams[0], c.cc, "/gitaly.OperationService/UserMergeBranch", opts...)
if err != nil {
return nil, err
}
x := &operationServiceUserMergeBranchClient{stream}
return x, nil
}
type OperationService_UserMergeBranchClient interface {
Send(*UserMergeBranchRequest) error
Recv() (*UserMergeBranchResponse, error)
grpc.ClientStream
}
type operationServiceUserMergeBranchClient struct {
grpc.ClientStream
}
func (x *operationServiceUserMergeBranchClient) Send(m *UserMergeBranchRequest) error {
return x.ClientStream.SendMsg(m)
}
func (x *operationServiceUserMergeBranchClient) Recv() (*UserMergeBranchResponse, error) {
m := new(UserMergeBranchResponse)
if err := x.ClientStream.RecvMsg(m); err != nil {
return nil, err
}
return m, nil
}
// Server API for OperationService service
type OperationServiceServer interface {
......@@ -338,6 +495,7 @@ type OperationServiceServer interface {
UserDeleteBranch(context.Context, *UserDeleteBranchRequest) (*UserDeleteBranchResponse, error)
UserCreateTag(context.Context, *UserCreateTagRequest) (*UserCreateTagResponse, error)
UserDeleteTag(context.Context, *UserDeleteTagRequest) (*UserDeleteTagResponse, error)
UserMergeBranch(OperationService_UserMergeBranchServer) error
}
func RegisterOperationServiceServer(s *grpc.Server, srv OperationServiceServer) {
......@@ -416,6 +574,32 @@ func _OperationService_UserDeleteTag_Handler(srv interface{}, ctx context.Contex
return interceptor(ctx, in, info, handler)
}
func _OperationService_UserMergeBranch_Handler(srv interface{}, stream grpc.ServerStream) error {
return srv.(OperationServiceServer).UserMergeBranch(&operationServiceUserMergeBranchServer{stream})
}
type OperationService_UserMergeBranchServer interface {
Send(*UserMergeBranchResponse) error
Recv() (*UserMergeBranchRequest, error)
grpc.ServerStream
}
type operationServiceUserMergeBranchServer struct {
grpc.ServerStream
}
func (x *operationServiceUserMergeBranchServer) Send(m *UserMergeBranchResponse) error {
return x.ServerStream.SendMsg(m)
}
func (x *operationServiceUserMergeBranchServer) Recv() (*UserMergeBranchRequest, error) {
m := new(UserMergeBranchRequest)
if err := x.ServerStream.RecvMsg(m); err != nil {
return nil, err
}
return m, nil
}
var _OperationService_serviceDesc = grpc.ServiceDesc{
ServiceName: "gitaly.OperationService",
HandlerType: (*OperationServiceServer)(nil),
......@@ -437,42 +621,59 @@ var _OperationService_serviceDesc = grpc.ServiceDesc{
Handler: _OperationService_UserDeleteTag_Handler,
},
},
Streams: []grpc.StreamDesc{},
Streams: []grpc.StreamDesc{
{
StreamName: "UserMergeBranch",
Handler: _OperationService_UserMergeBranch_Handler,
ServerStreams: true,
ClientStreams: true,
},
},
Metadata: "operations.proto",
}
func init() { proto.RegisterFile("operations.proto", fileDescriptor6) }
var fileDescriptor6 = []byte{
// 472 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x54, 0xcd, 0x6e, 0xd3, 0x40,
0x10, 0x8e, 0x9b, 0xe2, 0x96, 0x49, 0x68, 0xc3, 0x8a, 0x1f, 0x13, 0x51, 0xd5, 0xda, 0x03, 0x54,
0x1c, 0x72, 0x08, 0x6f, 0x40, 0x81, 0x63, 0x41, 0x0b, 0x88, 0xa3, 0xb5, 0x0d, 0x23, 0x77, 0xa5,
0xc6, 0x6b, 0x66, 0x37, 0x11, 0xe1, 0x05, 0xb8, 0xf2, 0x2a, 0xbc, 0x06, 0xcf, 0xc1, 0x83, 0x20,
0x7b, 0xd7, 0x89, 0xed, 0x38, 0x12, 0x82, 0x03, 0x3d, 0xee, 0x37, 0xa3, 0x6f, 0xbe, 0xef, 0xd3,
0xcc, 0xc2, 0x48, 0xe7, 0x48, 0xd2, 0x2a, 0x9d, 0x99, 0x49, 0x4e, 0xda, 0x6a, 0x16, 0xa6, 0xca,
0xca, 0xeb, 0xd5, 0x78, 0x68, 0xae, 0x24, 0xe1, 0x27, 0x87, 0xf2, 0x1f, 0x01, 0x3c, 0xfc, 0x60,
0x90, 0xce, 0x09, 0xa5, 0xc5, 0x17, 0x24, 0xb3, 0xd9, 0x95, 0xc0, 0xcf, 0x0b, 0x34, 0x96, 0x4d,
0x01, 0x08, 0x73, 0x6d, 0x94, 0xd5, 0xb4, 0x8a, 0x82, 0x38, 0x38, 0x1b, 0x4c, 0xd9, 0xc4, 0xd1,
0x4c, 0xc4, 0xba, 0x22, 0x6a, 0x5d, 0xec, 0x14, 0x06, 0x97, 0x25, 0x49, 0x92, 0xc9, 0x39, 0x46,
0x7b, 0x71, 0x70, 0x36, 0x14, 0xe0, 0xa0, 0x0b, 0x39, 0x47, 0x16, 0xc3, 0xfe, 0xc2, 0x20, 0x45,
0xfd, 0x92, 0x6e, 0x58, 0xd1, 0x15, 0x1a, 0x44, 0x59, 0x29, 0x28, 0x8c, 0x95, 0x64, 0x93, 0x5c,
0xab, 0xcc, 0x46, 0xfb, 0x8e, 0xa2, 0x84, 0xde, 0x16, 0x08, 0xcf, 0x20, 0xda, 0x96, 0x6c, 0x72,
0x9d, 0x19, 0x64, 0x4f, 0x20, 0x74, 0xc3, 0xbc, 0xde, 0xa3, 0x6a, 0x80, 0xef, 0xf3, 0x55, 0xf6,
0x0c, 0xee, 0xe6, 0x84, 0x09, 0xe1, 0x0c, 0xd5, 0x12, 0x13, 0x24, 0xd2, 0x54, 0xaa, 0xbd, 0x2d,
0x8e, 0x73, 0x42, 0xe1, 0xf0, 0x57, 0x05, 0xcc, 0xbf, 0xfb, 0x8c, 0x5e, 0xe2, 0x35, 0xde, 0x8c,
0x8c, 0xf8, 0x6b, 0x17, 0x41, 0x53, 0x91, 0x8f, 0xa0, 0xd3, 0x5a, 0xd0, 0x6d, 0xed, 0x5b, 0x00,
0xf7, 0x36, 0x44, 0xef, 0x65, 0xfa, 0x2f, 0xbe, 0x1e, 0xc1, 0xa1, 0x95, 0x69, 0xdd, 0xd4, 0x81,
0x95, 0xe9, 0x1f, 0x3a, 0x3a, 0x87, 0xfb, 0x2d, 0x21, 0x7f, 0x61, 0xe7, 0xa7, 0xb7, 0xe3, 0x56,
0xe3, 0x3f, 0xda, 0x61, 0x4f, 0xe1, 0xd8, 0x4a, 0x4a, 0xd1, 0x26, 0x84, 0x4b, 0x65, 0x94, 0xce,
0xfc, 0x22, 0x1f, 0x39, 0x58, 0x78, 0x94, 0x45, 0x70, 0x30, 0x47, 0x63, 0x64, 0x8a, 0xd1, 0x2d,
0x37, 0xc4, 0x3f, 0xf9, 0x57, 0x97, 0x48, 0xcd, 0x8b, 0x4f, 0xe4, 0x04, 0xfa, 0x56, 0xa6, 0xde,
0xc5, 0xa0, 0x1a, 0x5e, 0x74, 0x14, 0x38, 0x7b, 0x00, 0x21, 0x7e, 0x51, 0xc6, 0x9a, 0x52, 0xf5,
0xa1, 0xf0, 0xaf, 0xee, 0x20, 0xfb, 0x9d, 0x41, 0x4e, 0x7f, 0xed, 0xc1, 0xe8, 0x4d, 0xf5, 0x83,
0xbc, 0x43, 0x5a, 0xaa, 0x19, 0xb2, 0x8f, 0x30, 0x6a, 0xdf, 0x1d, 0x3b, 0xad, 0x7b, 0xef, 0xf8,
0x44, 0xc6, 0xf1, 0xee, 0x06, 0x67, 0x87, 0xf7, 0x2a, 0xe2, 0xfa, 0x36, 0x37, 0x89, 0x3b, 0x2e,
0xaf, 0x49, 0xdc, 0x75, 0x08, 0xbc, 0xc7, 0x2e, 0xe0, 0x4e, 0x23, 0x42, 0xf6, 0x78, 0x5b, 0xcd,
0x66, 0x4b, 0xc6, 0x27, 0x3b, 0xaa, 0x6d, 0xbe, 0xf5, 0x92, 0x36, 0xf9, 0xda, 0x47, 0xd4, 0xe4,
0xdb, 0xda, 0x6c, 0xde, 0xbb, 0x0c, 0xcb, 0x4f, 0xf8, 0xf9, 0xef, 0x00, 0x00, 0x00, 0xff, 0xff,
0x4d, 0x0d, 0x02, 0xa3, 0xae, 0x05, 0x00, 0x00,
// 637 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x55, 0xc1, 0x6e, 0xd3, 0x40,
0x10, 0xad, 0xe3, 0x34, 0x4d, 0x27, 0x69, 0x12, 0x56, 0x6d, 0x31, 0x81, 0x90, 0x60, 0x09, 0x88,
0x38, 0x44, 0x28, 0xfc, 0x41, 0x0b, 0x48, 0x20, 0x51, 0x90, 0xa1, 0x82, 0x9b, 0xb5, 0x89, 0x47,
0xae, 0xa5, 0xc4, 0x36, 0xbb, 0x9b, 0x88, 0x70, 0x40, 0xdc, 0xb8, 0xf2, 0x2b, 0xfc, 0x00, 0x1f,
0xc0, 0x95, 0x1f, 0x42, 0xde, 0x5d, 0xa7, 0xb6, 0xe3, 0x20, 0x04, 0x48, 0x70, 0xdc, 0xd9, 0xf1,
0x9b, 0xf7, 0xde, 0xce, 0x8c, 0xa1, 0x13, 0xc5, 0xc8, 0xa8, 0x08, 0xa2, 0x90, 0x8f, 0x62, 0x16,
0x89, 0x88, 0xd4, 0xfc, 0x40, 0xd0, 0xd9, 0xaa, 0xdb, 0xe4, 0x17, 0x94, 0xa1, 0xa7, 0xa2, 0xf6,
0x17, 0x03, 0xae, 0x9e, 0x73, 0x64, 0xa7, 0x0c, 0xa9, 0xc0, 0x13, 0x46, 0xc3, 0xe9, 0x85, 0x83,
0x6f, 0x17, 0xc8, 0x05, 0x19, 0x03, 0x30, 0x8c, 0x23, 0x1e, 0x88, 0x88, 0xad, 0x2c, 0x63, 0x60,
0x0c, 0x1b, 0x63, 0x32, 0x52, 0x30, 0x23, 0x67, 0x7d, 0xe3, 0x64, 0xb2, 0x48, 0x1f, 0x1a, 0x13,
0x09, 0xe2, 0x86, 0x74, 0x8e, 0x56, 0x65, 0x60, 0x0c, 0x9b, 0x0e, 0xa8, 0xd0, 0x19, 0x9d, 0x23,
0x19, 0x40, 0x75, 0xc1, 0x91, 0x59, 0xa6, 0x84, 0x6b, 0xa6, 0x70, 0x09, 0x07, 0x47, 0xde, 0x24,
0x10, 0x5c, 0x50, 0x26, 0xdc, 0x38, 0x0a, 0x42, 0x61, 0x55, 0x15, 0x84, 0x0c, 0xbd, 0x48, 0x22,
0x76, 0x08, 0xd6, 0x26, 0x65, 0x1e, 0x47, 0x21, 0x47, 0x72, 0x07, 0x6a, 0xaa, 0x98, 0xe6, 0xdb,
0x4a, 0x0b, 0xe8, 0x3c, 0x7d, 0x4b, 0xee, 0xc1, 0x95, 0x98, 0xa1, 0xcb, 0x70, 0x8a, 0xc1, 0x12,
0x5d, 0x64, 0x2c, 0x62, 0x92, 0xed, 0xbe, 0xd3, 0x8e, 0x19, 0x3a, 0x2a, 0xfe, 0x28, 0x09, 0xdb,
0x9f, 0xb5, 0x47, 0x0f, 0x71, 0x86, 0xff, 0x87, 0x47, 0xf6, 0x63, 0x65, 0x41, 0x9e, 0x91, 0xb6,
0xa0, 0x54, 0x9a, 0x51, 0x2e, 0xed, 0x93, 0x01, 0x87, 0x97, 0x40, 0xaf, 0xa8, 0xff, 0x27, 0xba,
0xae, 0x41, 0x5d, 0x50, 0x3f, 0x2b, 0x6a, 0x4f, 0x50, 0xff, 0x17, 0x15, 0x9d, 0xc2, 0x51, 0x81,
0xc8, 0x6f, 0xc8, 0xf9, 0xa6, 0xe5, 0xa8, 0xd6, 0xf8, 0x87, 0x72, 0xc8, 0x5d, 0x68, 0x0b, 0xca,
0x7c, 0x14, 0x2e, 0xc3, 0x65, 0xc0, 0x83, 0x28, 0xd4, 0x8d, 0xdc, 0x52, 0x61, 0x47, 0x47, 0x89,
0x05, 0x7b, 0x73, 0xe4, 0x9c, 0xfa, 0x68, 0xed, 0xaa, 0x22, 0xfa, 0x68, 0xbf, 0x57, 0x8e, 0x64,
0xb4, 0x68, 0x47, 0x7a, 0x60, 0x0a, 0xea, 0x6b, 0x15, 0x8d, 0xb4, 0x78, 0x92, 0x91, 0xc4, 0xc9,
0x31, 0xd4, 0xf0, 0x5d, 0xc0, 0x05, 0x97, 0xac, 0xeb, 0x8e, 0x3e, 0x95, 0x1b, 0x69, 0x96, 0x1b,
0xf9, 0xdd, 0x80, 0xe3, 0xa4, 0xf8, 0x33, 0x64, 0xfe, 0x5f, 0xe8, 0xf8, 0xd4, 0xaf, 0xca, 0x56,
0xbf, 0xae, 0xc3, 0xfe, 0x34, 0x9a, 0xcf, 0x03, 0xe1, 0x06, 0x9e, 0x26, 0x55, 0x57, 0x81, 0x27,
0x5e, 0xa2, 0x48, 0x0f, 0xb5, 0xf2, 0x30, 0x1d, 0xe2, 0xad, 0xde, 0x91, 0x43, 0xd8, 0xa5, 0x71,
0x3c, 0x5b, 0x59, 0x35, 0x69, 0x81, 0x3a, 0xd8, 0x1f, 0xf5, 0x20, 0xe7, 0x54, 0x69, 0x53, 0x73,
0x04, 0x8c, 0x02, 0x81, 0x13, 0x38, 0xd0, 0x13, 0xbb, 0x88, 0x3d, 0x2a, 0x50, 0x3f, 0x7c, 0x2f,
0x15, 0xf2, 0x3c, 0x5d, 0xb6, 0x0a, 0xf4, 0x5c, 0x26, 0x39, 0xcd, 0x49, 0xe6, 0xf4, 0xb4, 0x5a,
0xaf, 0x74, 0x4c, 0xfb, 0x03, 0x1c, 0x95, 0x26, 0xff, 0xbc, 0xfe, 0x2d, 0x68, 0x26, 0x6e, 0xba,
0x53, 0xd9, 0x0b, 0x9e, 0x7e, 0xd8, 0x46, 0x12, 0x53, 0xed, 0xe1, 0x91, 0xdb, 0xd0, 0xd2, 0x14,
0xd3, 0x24, 0x53, 0x26, 0x69, 0xe2, 0x3a, 0x6d, 0xfc, 0xd5, 0x84, 0xce, 0x9a, 0xc0, 0x4b, 0x64,
0xcb, 0x60, 0x8a, 0xe4, 0x35, 0x74, 0x8a, 0x0b, 0x95, 0xf4, 0xb3, 0x8f, 0x54, 0xf2, 0x77, 0xe8,
0x0e, 0xb6, 0x27, 0x28, 0x4b, 0xed, 0x9d, 0x14, 0x38, 0xbb, 0xa6, 0xf2, 0xc0, 0x25, 0x2b, 0x35,
0x0f, 0x5c, 0xb6, 0xe1, 0xec, 0x1d, 0x72, 0x06, 0x07, 0xb9, 0xd9, 0x20, 0x37, 0x36, 0xd9, 0x5c,
0x8e, 0x7f, 0xb7, 0xb7, 0xe5, 0xb6, 0x88, 0xb7, 0xde, 0x3e, 0x79, 0xbc, 0xe2, 0x76, 0xcc, 0xe3,
0x6d, 0xac, 0x2c, 0x7b, 0x87, 0xbc, 0x81, 0x76, 0xa1, 0xd1, 0xc8, 0xcd, 0xec, 0x37, 0x9b, 0x73,
0xd5, 0xed, 0x6f, 0xbd, 0x4f, 0x51, 0x87, 0xc6, 0x7d, 0x63, 0x52, 0x93, 0xff, 0xed, 0x07, 0x3f,
0x02, 0x00, 0x00, 0xff, 0xff, 0xd1, 0x35, 0x6e, 0x0e, 0xe1, 0x07, 0x00, 0x00,
}
......@@ -381,6 +381,38 @@ func (m *GetArchiveResponse) GetData() []byte {
return nil
}
type HasLocalBranchesRequest struct {
Repository *Repository `protobuf:"bytes,1,opt,name=repository" json:"repository,omitempty"`
}
func (m *HasLocalBranchesRequest) Reset() { *m = HasLocalBranchesRequest{} }
func (m *HasLocalBranchesRequest) String() string { return proto.CompactTextString(m) }
func (*HasLocalBranchesRequest) ProtoMessage() {}
func (*HasLocalBranchesRequest) Descriptor() ([]byte, []int) { return fileDescriptor8, []int{18} }
func (m *HasLocalBranchesRequest) GetRepository() *Repository {
if m != nil {
return m.Repository
}
return nil
}
type HasLocalBranchesResponse struct {
Value bool `protobuf:"varint,1,opt,name=value" json:"value,omitempty"`
}
func (m *HasLocalBranchesResponse) Reset() { *m = HasLocalBranchesResponse{} }
func (m *HasLocalBranchesResponse) String() string { return proto.CompactTextString(m) }
func (*HasLocalBranchesResponse) ProtoMessage() {}
func (*HasLocalBranchesResponse) Descriptor() ([]byte, []int) { return fileDescriptor8, []int{19} }
func (m *HasLocalBranchesResponse) GetValue() bool {
if m != nil {
return m.Value
}
return false
}
func init() {
proto.RegisterType((*RepositoryExistsRequest)(nil), "gitaly.RepositoryExistsRequest")
proto.RegisterType((*RepositoryExistsResponse)(nil), "gitaly.RepositoryExistsResponse")
......@@ -400,6 +432,8 @@ func init() {
proto.RegisterType((*CreateRepositoryResponse)(nil), "gitaly.CreateRepositoryResponse")
proto.RegisterType((*GetArchiveRequest)(nil), "gitaly.GetArchiveRequest")
proto.RegisterType((*GetArchiveResponse)(nil), "gitaly.GetArchiveResponse")
proto.RegisterType((*HasLocalBranchesRequest)(nil), "gitaly.HasLocalBranchesRequest")
proto.RegisterType((*HasLocalBranchesResponse)(nil), "gitaly.HasLocalBranchesResponse")
proto.RegisterEnum("gitaly.GetArchiveRequest_Format", GetArchiveRequest_Format_name, GetArchiveRequest_Format_value)
}
......@@ -423,8 +457,7 @@ type RepositoryServiceClient interface {
FetchRemote(ctx context.Context, in *FetchRemoteRequest, opts ...grpc.CallOption) (*FetchRemoteResponse, error)
CreateRepository(ctx context.Context, in *CreateRepositoryRequest, opts ...grpc.CallOption) (*CreateRepositoryResponse, error)
GetArchive(ctx context.Context, in *GetArchiveRequest, opts ...grpc.CallOption) (RepositoryService_GetArchiveClient, error)
// Deprecated, use the RepositoryExists RPC instead.
Exists(ctx context.Context, in *RepositoryExistsRequest, opts ...grpc.CallOption) (*RepositoryExistsResponse, error)
HasLocalBranches(ctx context.Context, in *HasLocalBranchesRequest, opts ...grpc.CallOption) (*HasLocalBranchesResponse, error)
}
type repositoryServiceClient struct {
......@@ -539,9 +572,9 @@ func (x *repositoryServiceGetArchiveClient) Recv() (*GetArchiveResponse, error)
return m, nil
}
func (c *repositoryServiceClient) Exists(ctx context.Context, in *RepositoryExistsRequest, opts ...grpc.CallOption) (*RepositoryExistsResponse, error) {
out := new(RepositoryExistsResponse)
err := grpc.Invoke(ctx, "/gitaly.RepositoryService/Exists", in, out, c.cc, opts...)
func (c *repositoryServiceClient) HasLocalBranches(ctx context.Context, in *HasLocalBranchesRequest, opts ...grpc.CallOption) (*HasLocalBranchesResponse, error) {
out := new(HasLocalBranchesResponse)
err := grpc.Invoke(ctx, "/gitaly.RepositoryService/HasLocalBranches", in, out, c.cc, opts...)
if err != nil {
return nil, err
}
......@@ -560,8 +593,7 @@ type RepositoryServiceServer interface {
FetchRemote(context.Context, *FetchRemoteRequest) (*FetchRemoteResponse, error)
CreateRepository(context.Context, *CreateRepositoryRequest) (*CreateRepositoryResponse, error)
GetArchive(*GetArchiveRequest, RepositoryService_GetArchiveServer) error
// Deprecated, use the RepositoryExists RPC instead.
Exists(context.Context, *RepositoryExistsRequest) (*RepositoryExistsResponse, error)
HasLocalBranches(context.Context, *HasLocalBranchesRequest) (*HasLocalBranchesResponse, error)
}
func RegisterRepositoryServiceServer(s *grpc.Server, srv RepositoryServiceServer) {
......@@ -733,20 +765,20 @@ func (x *repositoryServiceGetArchiveServer) Send(m *GetArchiveResponse) error {
return x.ServerStream.SendMsg(m)
}
func _RepositoryService_Exists_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(RepositoryExistsRequest)
func _RepositoryService_HasLocalBranches_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(HasLocalBranchesRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(RepositoryServiceServer).Exists(ctx, in)
return srv.(RepositoryServiceServer).HasLocalBranches(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/gitaly.RepositoryService/Exists",
FullMethod: "/gitaly.RepositoryService/HasLocalBranches",
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(RepositoryServiceServer).Exists(ctx, req.(*RepositoryExistsRequest))
return srv.(RepositoryServiceServer).HasLocalBranches(ctx, req.(*HasLocalBranchesRequest))
}
return interceptor(ctx, in, info, handler)
}
......@@ -788,8 +820,8 @@ var _RepositoryService_serviceDesc = grpc.ServiceDesc{
Handler: _RepositoryService_CreateRepository_Handler,
},
{
MethodName: "Exists",
Handler: _RepositoryService_Exists_Handler,
MethodName: "HasLocalBranches",
Handler: _RepositoryService_HasLocalBranches_Handler,
},
},
Streams: []grpc.StreamDesc{
......@@ -805,51 +837,54 @@ var _RepositoryService_serviceDesc = grpc.ServiceDesc{
func init() { proto.RegisterFile("repository-service.proto", fileDescriptor8) }
var fileDescriptor8 = []byte{
// 734 bytes of a gzipped FileDescriptorProto
// 777 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x56, 0x4f, 0x6f, 0xda, 0x4a,
0x10, 0x87, 0x90, 0x98, 0x64, 0xe0, 0x45, 0x64, 0x5e, 0xfe, 0x38, 0xce, 0x7b, 0x0d, 0x75, 0x2f,
0x39, 0xb4, 0xa8, 0x22, 0x97, 0x5e, 0x49, 0x94, 0x90, 0x28, 0x4a, 0xd5, 0xba, 0x91, 0x22, 0x21,
0x55, 0x68, 0x31, 0x1b, 0x58, 0x01, 0x5e, 0x77, 0x77, 0x49, 0x43, 0xbe, 0x64, 0x3f, 0x44, 0x8f,
0xfd, 0x12, 0x15, 0x6b, 0x63, 0x1b, 0x6c, 0x72, 0xa1, 0xbd, 0x79, 0x67, 0x67, 0x7e, 0x33, 0xfb,
0x9b, 0x99, 0x9f, 0x0c, 0xa6, 0xa0, 0x3e, 0x97, 0x4c, 0x71, 0x31, 0x79, 0x27, 0xa9, 0x78, 0x64,
0x2e, 0xad, 0xf9, 0x82, 0x2b, 0x8e, 0x46, 0x8f, 0x29, 0x32, 0x9c, 0x58, 0x65, 0xd9, 0x27, 0x82,
0x76, 0x03, 0xab, 0x7d, 0x0b, 0x07, 0x4e, 0x14, 0x71, 0xf1, 0xc4, 0xa4, 0x92, 0x0e, 0xfd, 0x36,
0xa6, 0x52, 0x61, 0x1d, 0x20, 0x06, 0x33, 0xf3, 0xd5, 0xfc, 0x49, 0xa9, 0x8e, 0xb5, 0x00, 0xa5,
0x16, 0x07, 0x39, 0x09, 0x2f, 0xbb, 0x0e, 0x66, 0x1a, 0x4e, 0xfa, 0xdc, 0x93, 0x14, 0xf7, 0xc1,
0xa0, 0xda, 0xa2, 0xb1, 0x36, 0x9d, 0xf0, 0x64, 0x7f, 0xd4, 0x31, 0xc4, 0x1d, 0x5c, 0x7b, 0xae,
0xa0, 0x23, 0xea, 0x29, 0x32, 0x5c, 0xa5, 0x86, 0x23, 0x38, 0xcc, 0xc0, 0x0b, 0x8a, 0xb0, 0x87,
0xb0, 0x13, 0x5c, 0x5e, 0x8e, 0x87, 0xab, 0x64, 0xc1, 0x37, 0xf0, 0x8f, 0x2b, 0x28, 0x51, 0xb4,
0xdd, 0x61, 0x6a, 0x44, 0x7c, 0x73, 0x4d, 0x3f, 0xaa, 0x1c, 0x18, 0xcf, 0xb4, 0xcd, 0xde, 0x05,
0x4c, 0x66, 0x0b, 0x6b, 0xf0, 0x61, 0xaf, 0x49, 0x44, 0x87, 0xf4, 0xe8, 0x39, 0x1f, 0x0e, 0xa9,
0xab, 0xfe, 0x7a, 0x1d, 0x26, 0xec, 0x2f, 0x66, 0x0c, 0x6b, 0xb9, 0x81, 0xbd, 0x18, 0xf8, 0x0b,
0x7b, 0xa6, 0xab, 0x30, 0xff, 0x16, 0xf6, 0x17, 0xc1, 0xc2, 0xde, 0x23, 0xac, 0x4b, 0xf6, 0x4c,
0x35, 0x4e, 0xc1, 0xd1, 0xdf, 0xf6, 0x00, 0x0e, 0x1b, 0xbe, 0x3f, 0x9c, 0x34, 0x99, 0x22, 0x4a,
0x09, 0xd6, 0x19, 0x2b, 0xba, 0xca, 0xf0, 0xa1, 0x05, 0x9b, 0x82, 0x3e, 0x32, 0xc9, 0xb8, 0xa7,
0x59, 0x28, 0x3b, 0xd1, 0xd9, 0xfe, 0x0f, 0xac, 0xac, 0x64, 0x21, 0x0b, 0x3f, 0xf3, 0x80, 0x97,
0x54, 0xb9, 0x7d, 0x87, 0x8e, 0xb8, 0x5a, 0x85, 0x83, 0xe9, 0x94, 0x0b, 0x0d, 0xa2, 0x4b, 0xd8,
0x72, 0xc2, 0x13, 0xee, 0xc2, 0xc6, 0x03, 0x17, 0x2e, 0x35, 0x0b, 0xba, 0x3f, 0xc1, 0x01, 0x0f,
0xa0, 0xe8, 0xf1, 0xb6, 0x22, 0x3d, 0x69, 0xae, 0x07, 0x4b, 0xe1, 0xf1, 0x3b, 0xd2, 0x93, 0x68,
0x42, 0x51, 0xb1, 0x11, 0xe5, 0x63, 0x65, 0x6e, 0x54, 0xf3, 0x27, 0x1b, 0xce, 0xec, 0x38, 0x0d,
0x91, 0xb2, 0xdf, 0x1e, 0xd0, 0x89, 0x69, 0x04, 0x19, 0xa4, 0xec, 0xdf, 0xd0, 0x09, 0x1e, 0x43,
0x69, 0xe0, 0xf1, 0xef, 0x5e, 0xbb, 0xcf, 0xa7, 0x4b, 0x56, 0xd4, 0x97, 0xa0, 0x4d, 0x57, 0x53,
0x8b, 0xbd, 0x07, 0xff, 0xce, 0x3d, 0x32, 0x7c, 0xfc, 0x2d, 0x1c, 0x9c, 0xeb, 0x61, 0x49, 0xbc,
0x68, 0x85, 0x21, 0xb0, 0xc0, 0x4c, 0xc3, 0x85, 0xa9, 0x7e, 0xe5, 0x61, 0xa7, 0x49, 0x55, 0x43,
0xb8, 0x7d, 0xf6, 0xb8, 0x12, 0xcd, 0x47, 0xb0, 0xe5, 0xf2, 0xd1, 0x88, 0xa9, 0x36, 0xeb, 0x86,
0x4c, 0x6f, 0x06, 0x86, 0xeb, 0xee, 0xb4, 0x07, 0xbe, 0xa0, 0x0f, 0xec, 0x49, 0x93, 0xbd, 0xe5,
0x84, 0x27, 0xfc, 0x00, 0xc6, 0x03, 0x17, 0x23, 0xa2, 0x34, 0xd9, 0xdb, 0xf5, 0xea, 0x2c, 0x49,
0xaa, 0xa6, 0xda, 0xa5, 0xf6, 0x73, 0x42, 0x7f, 0xfb, 0x14, 0x8c, 0xc0, 0x82, 0x45, 0x28, 0xb4,
0xae, 0x3f, 0x55, 0x72, 0xd3, 0x8f, 0xbb, 0x86, 0x53, 0xc9, 0x23, 0x80, 0x71, 0xd7, 0x70, 0xda,
0xcd, 0x56, 0x65, 0x0d, 0x4b, 0x50, 0x9c, 0x7e, 0x9f, 0xb5, 0xea, 0x95, 0x82, 0x7d, 0x02, 0x98,
0x04, 0x8e, 0x57, 0xa1, 0x4b, 0x14, 0xd1, 0xef, 0x2c, 0x3b, 0xfa, 0xbb, 0xfe, 0xc3, 0xd0, 0xb2,
0x34, 0xdb, 0x9c, 0x40, 0xb7, 0xf1, 0x1e, 0x2a, 0x8b, 0x62, 0x8a, 0xc7, 0x69, 0x5e, 0xe6, 0x54,
0xdb, 0xaa, 0x2e, 0x77, 0x08, 0x9b, 0x90, 0xc3, 0xd6, 0x4c, 0x04, 0x13, 0x0a, 0x89, 0xc9, 0xc0,
0x4c, 0x31, 0xb6, 0x5e, 0xbf, 0xe0, 0x11, 0x61, 0x5f, 0x00, 0xc4, 0x92, 0x87, 0x87, 0xf3, 0x21,
0x09, 0xd1, 0xb5, 0xac, 0xac, 0xab, 0x08, 0xe6, 0x33, 0x6c, 0xcf, 0x2b, 0x16, 0xfe, 0x1f, 0x35,
0x2b, 0x4b, 0x3b, 0xad, 0x57, 0xcb, 0xae, 0x93, 0x90, 0xf3, 0xea, 0x14, 0x43, 0x66, 0x4a, 0x60,
0x0c, 0x99, 0x2d, 0x6a, 0x76, 0x0e, 0xbf, 0x02, 0xa6, 0x55, 0x05, 0x23, 0x9e, 0x96, 0xca, 0x9b,
0x65, 0xbf, 0xe4, 0x12, 0xc1, 0x5f, 0x41, 0x29, 0xb1, 0xb0, 0x18, 0x31, 0x96, 0x96, 0x2a, 0xeb,
0x28, 0xf3, 0x2e, 0x42, 0xba, 0x87, 0xca, 0xe2, 0x52, 0xc6, 0xa3, 0xb4, 0x64, 0xfb, 0xe3, 0x51,
0x5a, 0xba, 0xcf, 0x39, 0x6c, 0x02, 0xc4, 0x33, 0x1e, 0xb7, 0x3b, 0xb5, 0x50, 0x71, 0xbb, 0xd3,
0x2b, 0x61, 0xe7, 0xde, 0xe7, 0xf1, 0x16, 0x8c, 0x3f, 0x38, 0xe2, 0x1d, 0x43, 0xff, 0xde, 0x9c,
0xfe, 0x0e, 0x00, 0x00, 0xff, 0xff, 0x20, 0x17, 0xa1, 0x43, 0x10, 0x09, 0x00, 0x00,
0x10, 0x87, 0x10, 0x4c, 0x32, 0xf0, 0x22, 0xb2, 0x2f, 0x7f, 0x1c, 0xe7, 0xbd, 0x17, 0x9e, 0x7b,
0xc9, 0xa1, 0x45, 0x11, 0xb9, 0xf4, 0x4a, 0xa2, 0x84, 0x44, 0x69, 0xaa, 0xd6, 0x8d, 0x14, 0x09,
0xa9, 0x42, 0x8b, 0xd9, 0xc0, 0x0a, 0xe3, 0x75, 0x77, 0x17, 0x1a, 0xf2, 0x4d, 0x7b, 0xee, 0xb1,
0x5f, 0xa2, 0xf2, 0xda, 0xd8, 0x06, 0x9b, 0x5c, 0xac, 0xde, 0x76, 0x66, 0x67, 0x7e, 0x33, 0x3b,
0x7f, 0x7e, 0x36, 0xe8, 0x9c, 0x78, 0x4c, 0x50, 0xc9, 0xf8, 0xfc, 0x9d, 0x20, 0x7c, 0x46, 0x6d,
0xd2, 0xf4, 0x38, 0x93, 0x0c, 0x69, 0x43, 0x2a, 0xb1, 0x33, 0x37, 0x6a, 0x62, 0x84, 0x39, 0x19,
0x04, 0x5a, 0xf3, 0x1e, 0x0e, 0xad, 0xc8, 0xe3, 0xea, 0x99, 0x0a, 0x29, 0x2c, 0xf2, 0x6d, 0x4a,
0x84, 0x44, 0x2d, 0x80, 0x18, 0x4c, 0x2f, 0x36, 0x8a, 0xa7, 0xd5, 0x16, 0x6a, 0x06, 0x28, 0xcd,
0xd8, 0xc9, 0x4a, 0x58, 0x99, 0x2d, 0xd0, 0xd3, 0x70, 0xc2, 0x63, 0xae, 0x20, 0xe8, 0x00, 0x34,
0xa2, 0x34, 0x0a, 0x6b, 0xcb, 0x0a, 0x25, 0xf3, 0xa3, 0xf2, 0xc1, 0xf6, 0xf8, 0xd6, 0xb5, 0x39,
0x99, 0x10, 0x57, 0x62, 0x27, 0x4f, 0x0e, 0xc7, 0x70, 0x94, 0x81, 0x17, 0x24, 0x61, 0x3a, 0xb0,
0x1b, 0x5c, 0x5e, 0x4f, 0x9d, 0x3c, 0x51, 0xd0, 0x1b, 0xf8, 0xcb, 0xe6, 0x04, 0x4b, 0xd2, 0xeb,
0x53, 0x39, 0xc1, 0x9e, 0xbe, 0xa1, 0x1e, 0x55, 0x0b, 0x94, 0x17, 0x4a, 0x67, 0xee, 0x01, 0x4a,
0x46, 0x0b, 0x73, 0xf0, 0x60, 0xbf, 0x83, 0x79, 0x1f, 0x0f, 0xc9, 0x25, 0x73, 0x1c, 0x62, 0xcb,
0x3f, 0x9e, 0x87, 0x0e, 0x07, 0xab, 0x11, 0xc3, 0x5c, 0xee, 0x60, 0x3f, 0x06, 0xfe, 0x42, 0x5f,
0x48, 0x9e, 0xca, 0xbf, 0x85, 0x83, 0x55, 0xb0, 0xb0, 0xf7, 0x08, 0x36, 0x05, 0x7d, 0x21, 0x0a,
0xa7, 0x64, 0xa9, 0xb3, 0x39, 0x86, 0xa3, 0xb6, 0xe7, 0x39, 0xf3, 0x0e, 0x95, 0x58, 0x4a, 0x4e,
0xfb, 0x53, 0x49, 0xf2, 0x0c, 0x1f, 0x32, 0x60, 0x8b, 0x93, 0x19, 0x15, 0x94, 0xb9, 0xaa, 0x0a,
0x35, 0x2b, 0x92, 0xcd, 0x7f, 0xc0, 0xc8, 0x0a, 0x16, 0x56, 0xe1, 0x67, 0x11, 0xd0, 0x35, 0x91,
0xf6, 0xc8, 0x22, 0x13, 0x26, 0xf3, 0xd4, 0xc0, 0x9f, 0x72, 0xae, 0x40, 0x54, 0x0a, 0xdb, 0x56,
0x28, 0xa1, 0x3d, 0x28, 0x3f, 0x31, 0x6e, 0x13, 0xbd, 0xa4, 0xfa, 0x13, 0x08, 0xe8, 0x10, 0x2a,
0x2e, 0xeb, 0x49, 0x3c, 0x14, 0xfa, 0x66, 0xb0, 0x14, 0x2e, 0x7b, 0xc0, 0x43, 0x81, 0x74, 0xa8,
0x48, 0x3a, 0x21, 0x6c, 0x2a, 0xf5, 0x72, 0xa3, 0x78, 0x5a, 0xb6, 0x16, 0xa2, 0xef, 0x22, 0xc4,
0xa8, 0x37, 0x26, 0x73, 0x5d, 0x0b, 0x22, 0x08, 0x31, 0xba, 0x23, 0x73, 0x74, 0x02, 0xd5, 0xb1,
0xcb, 0xbe, 0xbb, 0xbd, 0x11, 0xf3, 0x97, 0xac, 0xa2, 0x2e, 0x41, 0xa9, 0x6e, 0x7c, 0x8d, 0xb9,
0x0f, 0x7f, 0x2f, 0x3d, 0x32, 0x7c, 0xfc, 0x3d, 0x1c, 0x5e, 0xaa, 0x61, 0x49, 0xbc, 0x28, 0xc7,
0x10, 0x18, 0xa0, 0xa7, 0xe1, 0xc2, 0x50, 0xbf, 0x8a, 0xb0, 0xdb, 0x21, 0xb2, 0xcd, 0xed, 0x11,
0x9d, 0xe5, 0x2a, 0xf3, 0x31, 0x6c, 0xdb, 0x6c, 0x32, 0xa1, 0xb2, 0x47, 0x07, 0x61, 0xa5, 0xb7,
0x02, 0xc5, 0xed, 0xc0, 0xef, 0x81, 0xc7, 0xc9, 0x13, 0x7d, 0x56, 0xc5, 0xde, 0xb6, 0x42, 0x09,
0xbd, 0x07, 0xed, 0x89, 0xf1, 0x09, 0x96, 0xaa, 0xd8, 0x3b, 0xad, 0xc6, 0x22, 0x48, 0x2a, 0xa7,
0xe6, 0xb5, 0xb2, 0xb3, 0x42, 0x7b, 0xf3, 0x1c, 0xb4, 0x40, 0x83, 0x2a, 0x50, 0xea, 0xde, 0x7e,
0xaa, 0x17, 0xfc, 0xc3, 0x43, 0xdb, 0xaa, 0x17, 0x11, 0x80, 0xf6, 0xd0, 0xb6, 0x7a, 0x9d, 0x6e,
0x7d, 0x03, 0x55, 0xa1, 0xe2, 0x9f, 0x2f, 0xba, 0xad, 0x7a, 0xc9, 0x3c, 0x05, 0x94, 0x04, 0x8e,
0x57, 0x61, 0x80, 0x25, 0x56, 0xef, 0xac, 0x59, 0xea, 0xec, 0xb7, 0xe0, 0x06, 0x8b, 0x0f, 0xcc,
0xc6, 0xce, 0x05, 0xc7, 0xae, 0x3d, 0xca, 0xb5, 0x08, 0xe6, 0x19, 0xe8, 0x69, 0xb8, 0x30, 0xfc,
0x1e, 0x94, 0x67, 0xd8, 0x99, 0x92, 0x90, 0x84, 0x03, 0xa1, 0xf5, 0x43, 0x53, 0xbc, 0xb8, 0x58,
0xdd, 0xe0, 0xc3, 0x81, 0x1e, 0xa1, 0xbe, 0xca, 0xe6, 0xe8, 0x24, 0x1d, 0x7b, 0xe9, 0xb3, 0x61,
0x34, 0xd6, 0x1b, 0x84, 0x53, 0x50, 0x40, 0xdd, 0x05, 0x0b, 0x27, 0x28, 0x1a, 0x25, 0x1d, 0x33,
0xbf, 0x06, 0xc6, 0xff, 0xaf, 0x58, 0x44, 0xd8, 0x57, 0x00, 0x31, 0xe7, 0xa2, 0xa3, 0x65, 0x97,
0x04, 0xeb, 0x1b, 0x46, 0xd6, 0x55, 0x04, 0xf3, 0x19, 0x76, 0x96, 0x29, 0x13, 0xfd, 0x1b, 0x4d,
0x4b, 0x16, 0x79, 0x1b, 0xff, 0xad, 0xbb, 0x4e, 0x42, 0x2e, 0xd3, 0x63, 0x0c, 0x99, 0xc9, 0xc1,
0x31, 0x64, 0x36, 0xab, 0x9a, 0x05, 0xf4, 0x15, 0x50, 0x9a, 0xd6, 0x50, 0x54, 0xa7, 0xb5, 0xfc,
0x6a, 0x98, 0xaf, 0x99, 0x44, 0xf0, 0x37, 0x50, 0x4d, 0x30, 0x06, 0x8a, 0x2a, 0x96, 0xe6, 0x4a,
0xe3, 0x38, 0xf3, 0x2e, 0x42, 0x7a, 0x84, 0xfa, 0x2a, 0x2b, 0xc4, 0xa3, 0xb4, 0x86, 0x7e, 0xe2,
0x51, 0x5a, 0x4b, 0x28, 0x05, 0xd4, 0x01, 0x88, 0x97, 0x2c, 0x6e, 0x77, 0x6a, 0xa3, 0xe3, 0x76,
0xa7, 0x77, 0xd2, 0x2c, 0x9c, 0x15, 0xfd, 0x0c, 0x57, 0x97, 0x26, 0xce, 0x70, 0xcd, 0x76, 0xc6,
0x19, 0xae, 0xdb, 0x37, 0xb3, 0xd0, 0xd7, 0xd4, 0x9f, 0xd6, 0xf9, 0xef, 0x00, 0x00, 0x00, 0xff,
0xff, 0x3d, 0x9f, 0x6f, 0xec, 0x9b, 0x09, 0x00, 0x00,
}
......@@ -19,6 +19,8 @@ var _ = math.Inf
type InfoRefsRequest struct {
Repository *Repository `protobuf:"bytes,1,opt,name=repository" json:"repository,omitempty"`
// Parameters to use with git -c (key=value pairs)
GitConfigOptions []string `protobuf:"bytes,2,rep,name=git_config_options,json=gitConfigOptions" json:"git_config_options,omitempty"`
}
func (m *InfoRefsRequest) Reset() { *m = InfoRefsRequest{} }
......@@ -33,6 +35,13 @@ func (m *InfoRefsRequest) GetRepository() *Repository {
return nil
}
func (m *InfoRefsRequest) GetGitConfigOptions() []string {
if m != nil {
return m.GitConfigOptions
}
return nil
}
type InfoRefsResponse struct {
Data []byte `protobuf:"bytes,1,opt,name=data,proto3" json:"data,omitempty"`
}
......@@ -54,6 +63,8 @@ type PostUploadPackRequest struct {
Repository *Repository `protobuf:"bytes,1,opt,name=repository" json:"repository,omitempty"`
// Raw data to be copied to stdin of 'git upload-pack'
Data []byte `protobuf:"bytes,2,opt,name=data,proto3" json:"data,omitempty"`
// Parameters to use with git -c (key=value pairs)
GitConfigOptions []string `protobuf:"bytes,3,rep,name=git_config_options,json=gitConfigOptions" json:"git_config_options,omitempty"`
}
func (m *PostUploadPackRequest) Reset() { *m = PostUploadPackRequest{} }
......@@ -75,6 +86,13 @@ func (m *PostUploadPackRequest) GetData() []byte {
return nil
}
func (m *PostUploadPackRequest) GetGitConfigOptions() []string {
if m != nil {
return m.GitConfigOptions
}
return nil
}
type PostUploadPackResponse struct {
// Raw data from stdout of 'git upload-pack'
Data []byte `protobuf:"bytes,1,opt,name=data,proto3" json:"data,omitempty"`
......@@ -470,27 +488,30 @@ var _SmartHTTPService_serviceDesc = grpc.ServiceDesc{
func init() { proto.RegisterFile("smarthttp.proto", fileDescriptor10) }
var fileDescriptor10 = []byte{
// 346 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x53, 0xd1, 0x4e, 0xc2, 0x30,
0x14, 0x75, 0x08, 0x24, 0x5e, 0x50, 0xc8, 0x25, 0xca, 0xb2, 0x44, 0x21, 0x33, 0x31, 0x3c, 0x28,
0x21, 0xf8, 0x0d, 0x26, 0x12, 0x7d, 0x20, 0x05, 0x12, 0xdf, 0x96, 0xca, 0x4a, 0x59, 0x2c, 0x74,
0xb6, 0x85, 0x84, 0x6f, 0xf3, 0x5f, 0xfc, 0x16, 0xe3, 0xe6, 0xd8, 0x00, 0xf1, 0x41, 0xe3, 0xdb,
0x72, 0xcf, 0xe9, 0x39, 0xa7, 0xbd, 0x67, 0x50, 0xd1, 0x33, 0xaa, 0xcc, 0xd4, 0x98, 0xb0, 0x1d,
0x2a, 0x69, 0x24, 0x16, 0x79, 0x60, 0xa8, 0x58, 0x39, 0x65, 0x3d, 0xa5, 0x8a, 0xf9, 0xf1, 0xd4,
0xbd, 0x83, 0x4a, 0x6f, 0x3e, 0x91, 0x84, 0x4d, 0x34, 0x61, 0xaf, 0x0b, 0xa6, 0x0d, 0x76, 0x01,
0x14, 0x0b, 0xa5, 0x0e, 0x8c, 0x54, 0x2b, 0xdb, 0x6a, 0x5a, 0xad, 0x52, 0x17, 0xdb, 0xf1, 0xe9,
0x36, 0x59, 0x23, 0x24, 0xc3, 0x72, 0xaf, 0xa0, 0x9a, 0xca, 0xe8, 0x50, 0xce, 0x35, 0x43, 0x84,
0xbc, 0x4f, 0x0d, 0x8d, 0x14, 0xca, 0x24, 0xfa, 0x76, 0x3d, 0x38, 0xed, 0x4b, 0x6d, 0x46, 0xa1,
0x90, 0xd4, 0xef, 0xd3, 0xf1, 0xcb, 0x1f, 0x4c, 0xd7, 0x06, 0xb9, 0x8c, 0xc1, 0x35, 0x9c, 0x6d,
0x1b, 0xfc, 0x10, 0xe7, 0xcd, 0x8a, 0xe9, 0x84, 0x8d, 0x59, 0xb0, 0x64, 0xff, 0x10, 0x08, 0x6b,
0x50, 0xe0, 0xc2, 0x0b, 0x7c, 0xfb, 0xb0, 0x69, 0xb5, 0x8e, 0x48, 0x9e, 0x8b, 0x9e, 0x8f, 0x97,
0x70, 0xcc, 0x85, 0x97, 0xd1, 0xcf, 0x47, 0x60, 0x99, 0x8b, 0x54, 0x19, 0x1b, 0x50, 0xe2, 0xc2,
0x5b, 0x68, 0xa6, 0xe6, 0x74, 0xc6, 0xec, 0x42, 0x44, 0x01, 0x2e, 0x46, 0x5f, 0x13, 0xf7, 0x06,
0xea, 0x3b, 0xe1, 0xf7, 0x5f, 0xb6, 0xfb, 0x9e, 0x83, 0xea, 0xe0, 0xb3, 0x14, 0xf7, 0xc3, 0x61,
0x7f, 0xc0, 0xd4, 0x32, 0x18, 0x33, 0x7c, 0x00, 0x4c, 0x16, 0x97, 0xbe, 0x19, 0xd6, 0x93, 0x8b,
0x6e, 0x75, 0xc3, 0xb1, 0x77, 0x81, 0xd8, 0xd1, 0x3d, 0xe8, 0x58, 0xf8, 0x08, 0xb5, 0x74, 0xbe,
0x0e, 0xf5, 0x5b, 0xb5, 0x11, 0x9c, 0x6c, 0xae, 0x12, 0xcf, 0x13, 0xfe, 0xb7, 0x1d, 0x72, 0x2e,
0xf6, 0xc1, 0x89, 0x68, 0xcb, 0xea, 0x58, 0xf8, 0x04, 0x95, 0xad, 0x57, 0xc3, 0x8d, 0x83, 0xbb,
0x5d, 0x70, 0x1a, 0x7b, 0xf1, 0xac, 0xf2, 0x73, 0x31, 0xfa, 0xa5, 0x6e, 0x3f, 0x02, 0x00, 0x00,
0xff, 0xff, 0x58, 0x82, 0x47, 0x22, 0x7b, 0x03, 0x00, 0x00,
// 386 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x93, 0xdd, 0xee, 0xd2, 0x40,
0x10, 0xc5, 0x5d, 0xbe, 0x12, 0x06, 0x14, 0x32, 0x44, 0x69, 0x9a, 0x28, 0xa4, 0x26, 0xa6, 0x17,
0x48, 0x08, 0x3e, 0x82, 0x37, 0x12, 0x4d, 0x24, 0x0b, 0x24, 0xde, 0x35, 0x6b, 0xbb, 0x2c, 0x1b,
0x97, 0x6e, 0xed, 0x2e, 0x24, 0x3c, 0x84, 0x4f, 0xe4, 0xbb, 0xf8, 0x2c, 0xc6, 0xd6, 0x52, 0x3e,
0xac, 0x17, 0x9a, 0xff, 0x5d, 0x33, 0x67, 0xf6, 0x9c, 0xdf, 0xee, 0x4c, 0xa1, 0x67, 0xf6, 0x2c,
0xb5, 0x3b, 0x6b, 0x93, 0x69, 0x92, 0x6a, 0xab, 0xb1, 0x25, 0xa4, 0x65, 0xea, 0xe4, 0x76, 0xcd,
0x8e, 0xa5, 0x3c, 0xca, 0xab, 0x9e, 0x81, 0xde, 0x22, 0xde, 0x6a, 0xca, 0xb7, 0x86, 0xf2, 0xaf,
0x07, 0x6e, 0x2c, 0xce, 0x01, 0x52, 0x9e, 0x68, 0x23, 0xad, 0x4e, 0x4f, 0x0e, 0x19, 0x13, 0xbf,
0x33, 0xc7, 0x69, 0x7e, 0x7a, 0x4a, 0xcf, 0x0a, 0xbd, 0xe8, 0xc2, 0x09, 0xa0, 0x90, 0x36, 0x08,
0x75, 0xbc, 0x95, 0x22, 0xd0, 0x89, 0x95, 0x3a, 0x36, 0x4e, 0x6d, 0x5c, 0xf7, 0xdb, 0xb4, 0x2f,
0xa4, 0x7d, 0x9b, 0x09, 0x1f, 0xf3, 0xba, 0xf7, 0x0a, 0xfa, 0x65, 0xa8, 0x49, 0x74, 0x6c, 0x38,
0x22, 0x34, 0x22, 0x66, 0x59, 0x96, 0xd7, 0xa5, 0xd9, 0xb7, 0xf7, 0x8d, 0xc0, 0xd3, 0xa5, 0x36,
0x76, 0x93, 0x28, 0xcd, 0xa2, 0x25, 0x0b, 0xbf, 0xfc, 0x0f, 0x63, 0x91, 0x50, 0x2b, 0x13, 0x2a,
0xb8, 0xeb, 0x15, 0xdc, 0x13, 0x78, 0x76, 0x8b, 0xf3, 0x17, 0xfa, 0xef, 0x24, 0x6f, 0xa7, 0x3c,
0xe4, 0xf2, 0xc8, 0x1f, 0x02, 0x7f, 0x00, 0x4d, 0xa1, 0x02, 0x19, 0x39, 0xf5, 0x31, 0xf1, 0xdb,
0xb4, 0x21, 0xd4, 0x22, 0xc2, 0x97, 0xf0, 0x58, 0xa8, 0xe0, 0xc2, 0xbf, 0x91, 0x89, 0x5d, 0xa1,
0x4a, 0x67, 0x1c, 0x41, 0x47, 0xa8, 0xe0, 0x60, 0x78, 0x1a, 0xb3, 0x3d, 0x77, 0x9a, 0x59, 0x0b,
0x08, 0xb5, 0xf9, 0x5d, 0xf1, 0x5e, 0xc3, 0xf0, 0x0e, 0xbe, 0xfa, 0xb2, 0xf3, 0x1f, 0x35, 0xe8,
0xaf, 0x7e, 0x6d, 0xdc, 0xbb, 0xf5, 0x7a, 0xb9, 0xe2, 0xe9, 0x51, 0x86, 0x1c, 0xdf, 0x03, 0x16,
0x73, 0x2e, 0xdf, 0x0c, 0x87, 0xc5, 0x45, 0x6f, 0x16, 0xcf, 0x75, 0xee, 0x85, 0x3c, 0xd1, 0x7b,
0x34, 0x23, 0xf8, 0x01, 0x06, 0x65, 0xfd, 0x0c, 0xf5, 0xaf, 0x6e, 0x1b, 0x78, 0x72, 0x3d, 0x4a,
0x7c, 0x5e, 0xf4, 0xff, 0x71, 0xe3, 0xdc, 0x17, 0x55, 0x72, 0x61, 0xea, 0x93, 0x19, 0xc1, 0x4f,
0xd0, 0xbb, 0x79, 0x35, 0xbc, 0x3a, 0x78, 0xbf, 0x0b, 0xee, 0xa8, 0x52, 0xbf, 0x74, 0xfe, 0xdc,
0xca, 0xfe, 0xd7, 0x37, 0x3f, 0x03, 0x00, 0x00, 0xff, 0xff, 0xaf, 0x85, 0x01, 0x06, 0xd8, 0x03,
0x00, 0x00,
}
// Code generated by protoc-gen-go. DO NOT EDIT.
// source: wiki.proto
package gitaly
import proto "github.com/golang/protobuf/proto"
import fmt "fmt"
import math "math"
import (
context "golang.org/x/net/context"
grpc "google.golang.org/grpc"
)
// Reference imports to suppress errors if they are not otherwise used.
var _ = proto.Marshal
var _ = fmt.Errorf
var _ = math.Inf
type WikiPageVersion struct {
Commit *GitCommit `protobuf:"bytes,1,opt,name=commit" json:"commit,omitempty"`
Format string `protobuf:"bytes,2,opt,name=format" json:"format,omitempty"`
}
func (m *WikiPageVersion) Reset() { *m = WikiPageVersion{} }
func (m *WikiPageVersion) String() string { return proto.CompactTextString(m) }
func (*WikiPageVersion) ProtoMessage() {}
func (*WikiPageVersion) Descriptor() ([]byte, []int) { return fileDescriptor12, []int{0} }
func (m *WikiPageVersion) GetCommit() *GitCommit {
if m != nil {
return m.Commit
}
return nil
}
func (m *WikiPageVersion) GetFormat() string {
if m != nil {
return m.Format
}
return ""
}
type WikiGetPageVersionsRequest struct {
Repository *Repository `protobuf:"bytes,1,opt,name=repository" json:"repository,omitempty"`
PagePath []byte `protobuf:"bytes,2,opt,name=page_path,json=pagePath,proto3" json:"page_path,omitempty"`
}
func (m *WikiGetPageVersionsRequest) Reset() { *m = WikiGetPageVersionsRequest{} }
func (m *WikiGetPageVersionsRequest) String() string { return proto.CompactTextString(m) }
func (*WikiGetPageVersionsRequest) ProtoMessage() {}
func (*WikiGetPageVersionsRequest) Descriptor() ([]byte, []int) { return fileDescriptor12, []int{1} }
func (m *WikiGetPageVersionsRequest) GetRepository() *Repository {
if m != nil {
return m.Repository
}
return nil
}
func (m *WikiGetPageVersionsRequest) GetPagePath() []byte {
if m != nil {
return m.PagePath
}
return nil
}
type WikiGetPageVersionsResponse struct {
Versions []*WikiPageVersion `protobuf:"bytes,1,rep,name=versions" json:"versions,omitempty"`
}
func (m *WikiGetPageVersionsResponse) Reset() { *m = WikiGetPageVersionsResponse{} }
func (m *WikiGetPageVersionsResponse) String() string { return proto.CompactTextString(m) }
func (*WikiGetPageVersionsResponse) ProtoMessage() {}
func (*WikiGetPageVersionsResponse) Descriptor() ([]byte, []int) { return fileDescriptor12, []int{2} }
func (m *WikiGetPageVersionsResponse) GetVersions() []*WikiPageVersion {
if m != nil {
return m.Versions
}
return nil
}
func init() {
proto.RegisterType((*WikiPageVersion)(nil), "gitaly.WikiPageVersion")
proto.RegisterType((*WikiGetPageVersionsRequest)(nil), "gitaly.WikiGetPageVersionsRequest")
proto.RegisterType((*WikiGetPageVersionsResponse)(nil), "gitaly.WikiGetPageVersionsResponse")
}
// Reference imports to suppress errors if they are not otherwise used.
var _ context.Context
var _ grpc.ClientConn
// This is a compile-time assertion to ensure that this generated file
// is compatible with the grpc package it is being compiled against.
const _ = grpc.SupportPackageIsVersion4
// Client API for WikiService service
type WikiServiceClient interface {
WikiGetPageVersions(ctx context.Context, in *WikiGetPageVersionsRequest, opts ...grpc.CallOption) (WikiService_WikiGetPageVersionsClient, error)
}
type wikiServiceClient struct {
cc *grpc.ClientConn
}
func NewWikiServiceClient(cc *grpc.ClientConn) WikiServiceClient {
return &wikiServiceClient{cc}
}
func (c *wikiServiceClient) WikiGetPageVersions(ctx context.Context, in *WikiGetPageVersionsRequest, opts ...grpc.CallOption) (WikiService_WikiGetPageVersionsClient, error) {
stream, err := grpc.NewClientStream(ctx, &_WikiService_serviceDesc.Streams[0], c.cc, "/gitaly.WikiService/WikiGetPageVersions", opts...)
if err != nil {
return nil, err
}
x := &wikiServiceWikiGetPageVersionsClient{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 WikiService_WikiGetPageVersionsClient interface {
Recv() (*WikiGetPageVersionsResponse, error)
grpc.ClientStream
}
type wikiServiceWikiGetPageVersionsClient struct {
grpc.ClientStream
}
func (x *wikiServiceWikiGetPageVersionsClient) Recv() (*WikiGetPageVersionsResponse, error) {
m := new(WikiGetPageVersionsResponse)
if err := x.ClientStream.RecvMsg(m); err != nil {
return nil, err
}
return m, nil
}
// Server API for WikiService service
type WikiServiceServer interface {
WikiGetPageVersions(*WikiGetPageVersionsRequest, WikiService_WikiGetPageVersionsServer) error
}
func RegisterWikiServiceServer(s *grpc.Server, srv WikiServiceServer) {
s.RegisterService(&_WikiService_serviceDesc, srv)
}
func _WikiService_WikiGetPageVersions_Handler(srv interface{}, stream grpc.ServerStream) error {
m := new(WikiGetPageVersionsRequest)
if err := stream.RecvMsg(m); err != nil {
return err
}
return srv.(WikiServiceServer).WikiGetPageVersions(m, &wikiServiceWikiGetPageVersionsServer{stream})
}
type WikiService_WikiGetPageVersionsServer interface {
Send(*WikiGetPageVersionsResponse) error
grpc.ServerStream
}
type wikiServiceWikiGetPageVersionsServer struct {
grpc.ServerStream
}
func (x *wikiServiceWikiGetPageVersionsServer) Send(m *WikiGetPageVersionsResponse) error {
return x.ServerStream.SendMsg(m)
}
var _WikiService_serviceDesc = grpc.ServiceDesc{
ServiceName: "gitaly.WikiService",
HandlerType: (*WikiServiceServer)(nil),
Methods: []grpc.MethodDesc{},
Streams: []grpc.StreamDesc{
{
StreamName: "WikiGetPageVersions",
Handler: _WikiService_WikiGetPageVersions_Handler,
ServerStreams: true,
},
},
Metadata: "wiki.proto",
}
func init() { proto.RegisterFile("wiki.proto", fileDescriptor12) }
var fileDescriptor12 = []byte{
// 258 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x91, 0xcf, 0x4a, 0xf3, 0x40,
0x14, 0xc5, 0xbf, 0x7c, 0x42, 0x68, 0x6f, 0x0a, 0xe2, 0x08, 0x1a, 0xd2, 0x4d, 0x18, 0x37, 0x71,
0x13, 0x24, 0x7d, 0x04, 0x17, 0xdd, 0x96, 0x51, 0x74, 0x29, 0xd3, 0x7a, 0x4d, 0x2e, 0x35, 0x9d,
0xe9, 0xcc, 0xb5, 0xd2, 0xb7, 0x97, 0xfc, 0x69, 0x09, 0x12, 0x5c, 0xce, 0x39, 0x67, 0xce, 0x6f,
0x0e, 0x03, 0xf0, 0x4d, 0x5b, 0xca, 0xad, 0x33, 0x6c, 0x44, 0x58, 0x12, 0xeb, 0xcf, 0x63, 0x32,
0xf3, 0x95, 0x76, 0xf8, 0xde, 0xa9, 0xf2, 0x19, 0x2e, 0x5f, 0x69, 0x4b, 0x2b, 0x5d, 0xe2, 0x0b,
0x3a, 0x4f, 0x66, 0x27, 0xee, 0x21, 0xdc, 0x98, 0xba, 0x26, 0x8e, 0x83, 0x34, 0xc8, 0xa2, 0xe2,
0x2a, 0xef, 0x6e, 0xe6, 0x4b, 0xe2, 0xc7, 0xd6, 0x50, 0x7d, 0x40, 0xdc, 0x40, 0xf8, 0x61, 0x5c,
0xad, 0x39, 0xfe, 0x9f, 0x06, 0xd9, 0x54, 0xf5, 0x27, 0x59, 0x43, 0xd2, 0xb4, 0x2e, 0x91, 0x07,
0xc5, 0x5e, 0xe1, 0xfe, 0x0b, 0x3d, 0x8b, 0x02, 0xc0, 0xa1, 0x35, 0x9e, 0xd8, 0xb8, 0x63, 0x0f,
0x11, 0x27, 0x88, 0x3a, 0x3b, 0x6a, 0x90, 0x12, 0x73, 0x98, 0x5a, 0x5d, 0xe2, 0x9b, 0xd5, 0x5c,
0xb5, 0xb0, 0x99, 0x9a, 0x34, 0xc2, 0x4a, 0x73, 0x25, 0x15, 0xcc, 0x47, 0x71, 0xde, 0x9a, 0x9d,
0x47, 0xb1, 0x80, 0xc9, 0xa1, 0xd7, 0xe2, 0x20, 0xbd, 0xc8, 0xa2, 0xe2, 0xf6, 0x44, 0xfb, 0xb5,
0x5d, 0x9d, 0x83, 0xc5, 0x1e, 0xa2, 0xc6, 0x7c, 0x42, 0x77, 0xa0, 0x0d, 0x8a, 0x35, 0x5c, 0x8f,
0x20, 0x84, 0x1c, 0x16, 0x8d, 0xcf, 0x4d, 0xee, 0xfe, 0xcc, 0x74, 0x6f, 0x94, 0xff, 0x1e, 0x82,
0x75, 0xd8, 0x7e, 0xc9, 0xe2, 0x27, 0x00, 0x00, 0xff, 0xff, 0x7d, 0x27, 0x74, 0x80, 0xb6, 0x01,
0x00, 0x00,
}
......@@ -164,12 +164,12 @@
"revisionTime": "2016-11-17T07:43:51Z"
},
{
"checksumSHA1": "I7Kz+IncdenJ5tOCo/5qJlQ4U7k=",
"checksumSHA1": "3b0dq1/Vmln2vOY8upDIrDlucyo=",
"path": "gitlab.com/gitlab-org/gitaly-proto/go",
"revision": "8ac6c4c6cb2c124ff95cdd0f97bc4624055edc8f",
"revisionTime": "2017-10-02T18:55:11Z",
"version": "v0.39.0",
"versionExact": "v0.39.0"
"revision": "e3cc4aa1f29786b725db87b5f55f15aeb8670555",
"revisionTime": "2017-10-12T15:06:35Z",
"version": "v0.44.0",
"versionExact": "v0.44.0"
},
{
"checksumSHA1": "dUHJbKas746n5fLzlwxHb6FOCxs=",
......
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