Commit b0798c9b authored by Nick Thomas's avatar Nick Thomas Committed by Jacob Vosmaer (GitLab)

Bridge between Gitaly and GitLab for a new repository snapshot endpoint

parent 9c54fcc3
...@@ -2,6 +2,7 @@ package main ...@@ -2,6 +2,7 @@ package main
import ( import (
"bytes" "bytes"
"encoding/json"
"fmt" "fmt"
"io/ioutil" "io/ioutil"
"math/rand" "math/rand"
...@@ -22,6 +23,8 @@ import ( ...@@ -22,6 +23,8 @@ import (
pb "gitlab.com/gitlab-org/gitaly-proto/go" pb "gitlab.com/gitlab-org/gitaly-proto/go"
"github.com/golang/protobuf/jsonpb"
"github.com/golang/protobuf/proto"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require" "github.com/stretchr/testify/require"
"google.golang.org/grpc" "google.golang.org/grpc"
...@@ -579,6 +582,106 @@ func TestGetPatchProxiedToGitalyInterruptedStream(t *testing.T) { ...@@ -579,6 +582,106 @@ func TestGetPatchProxiedToGitalyInterruptedStream(t *testing.T) {
} }
} }
func TestGetSnapshotProxiedToGitalySuccessfully(t *testing.T) {
gitalyServer, socketPath := startGitalyServer(t, codes.OK)
defer gitalyServer.Stop()
gitalyAddress := "unix://" + socketPath
expectedBody := testhelper.GitalyGetSnapshotResponseMock
archiveLength := len(expectedBody)
params := buildGetSnapshotParams(gitalyAddress, buildPbRepo("default", "foo/bar.git"))
resp, body, err := doSendDataRequest("/api/v4/projects/:id/snapshot", "git-snapshot", params)
require.NoError(t, err)
assert.Equal(t, http.StatusOK, resp.StatusCode, "GET %q: status code", resp.Request.URL)
assert.Equal(t, expectedBody, string(body), "GET %q: body", resp.Request.URL)
assert.Equal(t, archiveLength, len(body), "GET %q: body size", resp.Request.URL)
testhelper.AssertResponseHeader(t, resp, "Content-Disposition", `attachment; filename="snapshot.tar"`)
testhelper.AssertResponseHeader(t, resp, "Content-Type", "application/x-tar")
testhelper.AssertResponseHeader(t, resp, "Content-Transfer-Encoding", "binary")
testhelper.AssertResponseHeader(t, resp, "Cache-Control", "private")
}
func TestGetSnapshotProxiedToGitalyInterruptedStream(t *testing.T) {
gitalyServer, socketPath := startGitalyServer(t, codes.OK)
defer gitalyServer.Stop()
gitalyAddress := "unix://" + socketPath
params := buildGetSnapshotParams(gitalyAddress, buildPbRepo("default", "foo/bar.git"))
resp, _, err := doSendDataRequest("/api/v4/projects/:id/snapshot", "git-snapshot", params)
require.NoError(t, err)
// This causes the server stream to be interrupted instead of consumed entirely.
resp.Body.Close()
done := make(chan struct{})
go func() {
gitalyServer.WaitGroup.Wait()
close(done)
}()
select {
case <-done:
return
case <-time.After(10 * time.Second):
t.Fatal("time out waiting for gitaly handler to return")
}
}
func buildGetSnapshotParams(gitalyAddress string, repo *pb.Repository) string {
msg := serializedMessage("GetSnapshotRequest", &pb.GetSnapshotRequest{Repository: repo})
return buildGitalyRpcParams(gitalyAddress, msg)
}
type rpcArg struct {
k string
v interface{}
}
// Gitlab asks workhorse to perform some long-running RPCs for it by sending
// the RPC arguments (which are protobuf messages) in HTTP response headers.
// The messages are encoded to JSON objects using pbjson, The strings are then
// re-encoded to JSON strings using json. We must replicate this behaviour here
func buildGitalyRpcParams(gitalyAddress string, rpcArgs ...rpcArg) string {
built := map[string]interface{}{
"GitalyServer": map[string]string{
"Address": gitalyAddress,
"Token": "",
},
}
for _, arg := range rpcArgs {
built[arg.k] = arg.v
}
b, err := json.Marshal(interface{}(built))
if err != nil {
panic(err)
}
return string(b)
}
func buildPbRepo(storageName, relativePath string) *pb.Repository {
return &pb.Repository{
StorageName: storageName,
RelativePath: relativePath,
}
}
func serializedMessage(name string, arg proto.Message) rpcArg {
m := &jsonpb.Marshaler{}
str, err := m.MarshalToString(arg)
if err != nil {
panic(err)
}
return rpcArg{name, str}
}
type combinedServer struct { type combinedServer struct {
*grpc.Server *grpc.Server
*testhelper.GitalyTestServer *testhelper.GitalyTestServer
......
package git
import (
"fmt"
"io"
"net/http"
"github.com/golang/protobuf/jsonpb"
pb "gitlab.com/gitlab-org/gitaly-proto/go"
"gitlab.com/gitlab-org/gitlab-workhorse/internal/gitaly"
"gitlab.com/gitlab-org/gitlab-workhorse/internal/helper"
"gitlab.com/gitlab-org/gitlab-workhorse/internal/senddata"
)
type snapshot struct {
senddata.Prefix
}
type snapshotParams struct {
GitalyServer gitaly.Server
GetSnapshotRequest string
}
var (
SendSnapshot = &snapshot{"git-snapshot:"}
)
func (s *snapshot) Inject(w http.ResponseWriter, r *http.Request, sendData string) {
var params snapshotParams
if err := s.Unpack(&params, sendData); err != nil {
helper.Fail500(w, r, fmt.Errorf("SendSnapshot: unpack sendData: %v", err))
return
}
request := &pb.GetSnapshotRequest{}
if err := jsonpb.UnmarshalString(params.GetSnapshotRequest, request); err != nil {
helper.Fail500(w, r, fmt.Errorf("SendSnapshot: unmarshal GetSnapshotRequest: %v", err))
return
}
c, err := gitaly.NewRepositoryClient(params.GitalyServer)
if err != nil {
helper.Fail500(w, r, fmt.Errorf("SendSnapshot: gitaly.NewRepositoryClient: %v", err))
return
}
reader, err := c.SnapshotReader(r.Context(), request)
if err != nil {
helper.Fail500(w, r, fmt.Errorf("SendSnapshot: client.SnapshotReader: %v", err))
return
}
w.Header().Del("Content-Length")
w.Header().Set("Content-Disposition", `attachment; filename="snapshot.tar"`)
w.Header().Set("Content-Type", "application/x-tar")
w.Header().Set("Content-Transfer-Encoding", "binary")
w.Header().Set("Cache-Control", "private")
w.WriteHeader(http.StatusOK) // Errors aren't detectable beyond this point
if _, err := io.Copy(w, reader); err != nil {
helper.LogError(r, fmt.Errorf("SendSnapshot: copy gitaly output: %v", err))
}
return
}
...@@ -28,3 +28,18 @@ func (client *RepositoryClient) ArchiveReader(ctx context.Context, request *pb.G ...@@ -28,3 +28,18 @@ func (client *RepositoryClient) ArchiveReader(ctx context.Context, request *pb.G
return resp.GetData(), err return resp.GetData(), err
}), nil }), nil
} }
// SnapshotReader performs a GetSnapshot Gitaly request and returns an io.Reader
// for the response
func (client *RepositoryClient) SnapshotReader(ctx context.Context, request *pb.GetSnapshotRequest) (io.Reader, error) {
c, err := client.GetSnapshot(ctx, request)
if err != nil {
return nil, fmt.Errorf("RepositoryService::GetSnapshot: %v", err)
}
return streamio.NewReader(func() ([]byte, error) {
resp, err := c.Recv()
return resp.GetData(), err
}), nil
}
...@@ -23,11 +23,14 @@ type GitalyTestServer struct { ...@@ -23,11 +23,14 @@ type GitalyTestServer struct {
} }
var ( var (
GitalyInfoRefsResponseMock = strings.Repeat("Mock Gitaly InfoRefsResponse data", 100000) GitalyInfoRefsResponseMock = strings.Repeat("Mock Gitaly InfoRefsResponse data", 100000)
GitalyGetBlobResponseMock = strings.Repeat("Mock Gitaly GetBlobResponse data", 100000) GitalyGetBlobResponseMock = strings.Repeat("Mock Gitaly GetBlobResponse data", 100000)
GitalyGetArchiveResponseMock = strings.Repeat("Mock Gitaly GetArchiveResponse data", 100000) GitalyGetArchiveResponseMock = strings.Repeat("Mock Gitaly GetArchiveResponse data", 100000)
GitalyGetDiffResponseMock = strings.Repeat("Mock Gitaly GetDiffResponse data", 100000) GitalyGetDiffResponseMock = strings.Repeat("Mock Gitaly GetDiffResponse data", 100000)
GitalyGetPatchResponseMock = strings.Repeat("Mock Gitaly GetPatchResponse data", 100000) GitalyGetPatchResponseMock = strings.Repeat("Mock Gitaly GetPatchResponse data", 100000)
GitalyGetSnapshotResponseMock = strings.Repeat("Mock Gitaly GetSnapshotResponse data", 100000)
GitalyReceivePackResponseMock []byte GitalyReceivePackResponseMock []byte
GitalyUploadPackResponseMock []byte GitalyUploadPackResponseMock []byte
) )
...@@ -280,6 +283,27 @@ func (s *GitalyTestServer) RawPatch(in *pb.RawPatchRequest, stream pb.DiffServic ...@@ -280,6 +283,27 @@ func (s *GitalyTestServer) RawPatch(in *pb.RawPatchRequest, stream pb.DiffServic
return s.finalError() return s.finalError()
} }
func (s *GitalyTestServer) GetSnapshot(in *pb.GetSnapshotRequest, stream pb.RepositoryService_GetSnapshotServer) error {
s.WaitGroup.Add(1)
defer s.WaitGroup.Done()
if err := validateRepository(in.GetRepository()); err != nil {
return err
}
nSends, err := sendBytes([]byte(GitalyGetSnapshotResponseMock), 100, func(p []byte) error {
return stream.Send(&pb.GetSnapshotResponse{Data: p})
})
if err != nil {
return err
}
if nSends <= 1 {
panic("should have sent more than one message")
}
return s.finalError()
}
func (s *GitalyTestServer) RepositoryExists(context.Context, *pb.RepositoryExistsRequest) (*pb.RepositoryExistsResponse, error) { func (s *GitalyTestServer) RepositoryExists(context.Context, *pb.RepositoryExistsRequest) (*pb.RepositoryExistsResponse, error) {
return nil, nil return nil, nil
} }
...@@ -408,6 +432,10 @@ func (s *GitalyTestServer) Cleanup(context.Context, *pb.CleanupRequest) (*pb.Cle ...@@ -408,6 +432,10 @@ func (s *GitalyTestServer) Cleanup(context.Context, *pb.CleanupRequest) (*pb.Cle
return nil, nil return nil, nil
} }
func (s *GitalyTestServer) CreateRepositoryFromSnapshot(context.Context, *pb.CreateRepositoryFromSnapshotRequest) (*pb.CreateRepositoryFromSnapshotResponse, error) {
return nil, nil
}
// sendBytes returns the number of times the 'sender' function was called and an error. // 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) { func sendBytes(data []byte, chunkSize int, sender func([]byte) error) (int, error) {
i := 0 i := 0
......
...@@ -140,6 +140,7 @@ func (u *Upstream) configureRoutes() { ...@@ -140,6 +140,7 @@ func (u *Upstream) configureRoutes() {
git.SendBlob, git.SendBlob,
git.SendDiff, git.SendDiff,
git.SendPatch, git.SendPatch,
git.SendSnapshot,
artifacts.SendEntry, artifacts.SendEntry,
sendurl.SendURL, sendurl.SendURL,
) )
......
...@@ -219,6 +219,10 @@ It has these top-level messages: ...@@ -219,6 +219,10 @@ It has these top-level messages:
GetInfoAttributesResponse GetInfoAttributesResponse
CalculateChecksumRequest CalculateChecksumRequest
CalculateChecksumResponse CalculateChecksumResponse
GetSnapshotRequest
GetSnapshotResponse
CreateRepositoryFromSnapshotRequest
CreateRepositoryFromSnapshotResponse
ServerInfoRequest ServerInfoRequest
ServerInfoResponse ServerInfoResponse
Repository Repository
......
...@@ -1003,6 +1003,82 @@ func (m *CalculateChecksumResponse) GetChecksum() string { ...@@ -1003,6 +1003,82 @@ func (m *CalculateChecksumResponse) GetChecksum() string {
return "" return ""
} }
type GetSnapshotRequest struct {
Repository *Repository `protobuf:"bytes,1,opt,name=repository" json:"repository,omitempty"`
}
func (m *GetSnapshotRequest) Reset() { *m = GetSnapshotRequest{} }
func (m *GetSnapshotRequest) String() string { return proto.CompactTextString(m) }
func (*GetSnapshotRequest) ProtoMessage() {}
func (*GetSnapshotRequest) Descriptor() ([]byte, []int) { return fileDescriptor10, []int{50} }
func (m *GetSnapshotRequest) GetRepository() *Repository {
if m != nil {
return m.Repository
}
return nil
}
type GetSnapshotResponse struct {
Data []byte `protobuf:"bytes,1,opt,name=data,proto3" json:"data,omitempty"`
}
func (m *GetSnapshotResponse) Reset() { *m = GetSnapshotResponse{} }
func (m *GetSnapshotResponse) String() string { return proto.CompactTextString(m) }
func (*GetSnapshotResponse) ProtoMessage() {}
func (*GetSnapshotResponse) Descriptor() ([]byte, []int) { return fileDescriptor10, []int{51} }
func (m *GetSnapshotResponse) GetData() []byte {
if m != nil {
return m.Data
}
return nil
}
type CreateRepositoryFromSnapshotRequest struct {
Repository *Repository `protobuf:"bytes,1,opt,name=repository" json:"repository,omitempty"`
HttpUrl string `protobuf:"bytes,2,opt,name=http_url,json=httpUrl" json:"http_url,omitempty"`
HttpAuth string `protobuf:"bytes,3,opt,name=http_auth,json=httpAuth" json:"http_auth,omitempty"`
}
func (m *CreateRepositoryFromSnapshotRequest) Reset() { *m = CreateRepositoryFromSnapshotRequest{} }
func (m *CreateRepositoryFromSnapshotRequest) String() string { return proto.CompactTextString(m) }
func (*CreateRepositoryFromSnapshotRequest) ProtoMessage() {}
func (*CreateRepositoryFromSnapshotRequest) Descriptor() ([]byte, []int) {
return fileDescriptor10, []int{52}
}
func (m *CreateRepositoryFromSnapshotRequest) GetRepository() *Repository {
if m != nil {
return m.Repository
}
return nil
}
func (m *CreateRepositoryFromSnapshotRequest) GetHttpUrl() string {
if m != nil {
return m.HttpUrl
}
return ""
}
func (m *CreateRepositoryFromSnapshotRequest) GetHttpAuth() string {
if m != nil {
return m.HttpAuth
}
return ""
}
type CreateRepositoryFromSnapshotResponse struct {
}
func (m *CreateRepositoryFromSnapshotResponse) Reset() { *m = CreateRepositoryFromSnapshotResponse{} }
func (m *CreateRepositoryFromSnapshotResponse) String() string { return proto.CompactTextString(m) }
func (*CreateRepositoryFromSnapshotResponse) ProtoMessage() {}
func (*CreateRepositoryFromSnapshotResponse) Descriptor() ([]byte, []int) {
return fileDescriptor10, []int{53}
}
func init() { func init() {
proto.RegisterType((*RepositoryExistsRequest)(nil), "gitaly.RepositoryExistsRequest") proto.RegisterType((*RepositoryExistsRequest)(nil), "gitaly.RepositoryExistsRequest")
proto.RegisterType((*RepositoryExistsResponse)(nil), "gitaly.RepositoryExistsResponse") proto.RegisterType((*RepositoryExistsResponse)(nil), "gitaly.RepositoryExistsResponse")
...@@ -1054,6 +1130,10 @@ func init() { ...@@ -1054,6 +1130,10 @@ func init() {
proto.RegisterType((*GetInfoAttributesResponse)(nil), "gitaly.GetInfoAttributesResponse") proto.RegisterType((*GetInfoAttributesResponse)(nil), "gitaly.GetInfoAttributesResponse")
proto.RegisterType((*CalculateChecksumRequest)(nil), "gitaly.CalculateChecksumRequest") proto.RegisterType((*CalculateChecksumRequest)(nil), "gitaly.CalculateChecksumRequest")
proto.RegisterType((*CalculateChecksumResponse)(nil), "gitaly.CalculateChecksumResponse") proto.RegisterType((*CalculateChecksumResponse)(nil), "gitaly.CalculateChecksumResponse")
proto.RegisterType((*GetSnapshotRequest)(nil), "gitaly.GetSnapshotRequest")
proto.RegisterType((*GetSnapshotResponse)(nil), "gitaly.GetSnapshotResponse")
proto.RegisterType((*CreateRepositoryFromSnapshotRequest)(nil), "gitaly.CreateRepositoryFromSnapshotRequest")
proto.RegisterType((*CreateRepositoryFromSnapshotResponse)(nil), "gitaly.CreateRepositoryFromSnapshotResponse")
proto.RegisterEnum("gitaly.GetArchiveRequest_Format", GetArchiveRequest_Format_name, GetArchiveRequest_Format_value) proto.RegisterEnum("gitaly.GetArchiveRequest_Format", GetArchiveRequest_Format_name, GetArchiveRequest_Format_value)
} }
...@@ -1093,6 +1173,8 @@ type RepositoryServiceClient interface { ...@@ -1093,6 +1173,8 @@ type RepositoryServiceClient interface {
GetInfoAttributes(ctx context.Context, in *GetInfoAttributesRequest, opts ...grpc.CallOption) (RepositoryService_GetInfoAttributesClient, error) GetInfoAttributes(ctx context.Context, in *GetInfoAttributesRequest, opts ...grpc.CallOption) (RepositoryService_GetInfoAttributesClient, error)
CalculateChecksum(ctx context.Context, in *CalculateChecksumRequest, opts ...grpc.CallOption) (*CalculateChecksumResponse, error) CalculateChecksum(ctx context.Context, in *CalculateChecksumRequest, opts ...grpc.CallOption) (*CalculateChecksumResponse, error)
Cleanup(ctx context.Context, in *CleanupRequest, opts ...grpc.CallOption) (*CleanupResponse, error) Cleanup(ctx context.Context, in *CleanupRequest, opts ...grpc.CallOption) (*CleanupResponse, error)
GetSnapshot(ctx context.Context, in *GetSnapshotRequest, opts ...grpc.CallOption) (RepositoryService_GetSnapshotClient, error)
CreateRepositoryFromSnapshot(ctx context.Context, in *CreateRepositoryFromSnapshotRequest, opts ...grpc.CallOption) (*CreateRepositoryFromSnapshotResponse, error)
} }
type repositoryServiceClient struct { type repositoryServiceClient struct {
...@@ -1422,6 +1504,47 @@ func (c *repositoryServiceClient) Cleanup(ctx context.Context, in *CleanupReques ...@@ -1422,6 +1504,47 @@ func (c *repositoryServiceClient) Cleanup(ctx context.Context, in *CleanupReques
return out, nil return out, nil
} }
func (c *repositoryServiceClient) GetSnapshot(ctx context.Context, in *GetSnapshotRequest, opts ...grpc.CallOption) (RepositoryService_GetSnapshotClient, error) {
stream, err := grpc.NewClientStream(ctx, &_RepositoryService_serviceDesc.Streams[4], c.cc, "/gitaly.RepositoryService/GetSnapshot", opts...)
if err != nil {
return nil, err
}
x := &repositoryServiceGetSnapshotClient{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 RepositoryService_GetSnapshotClient interface {
Recv() (*GetSnapshotResponse, error)
grpc.ClientStream
}
type repositoryServiceGetSnapshotClient struct {
grpc.ClientStream
}
func (x *repositoryServiceGetSnapshotClient) Recv() (*GetSnapshotResponse, error) {
m := new(GetSnapshotResponse)
if err := x.ClientStream.RecvMsg(m); err != nil {
return nil, err
}
return m, nil
}
func (c *repositoryServiceClient) CreateRepositoryFromSnapshot(ctx context.Context, in *CreateRepositoryFromSnapshotRequest, opts ...grpc.CallOption) (*CreateRepositoryFromSnapshotResponse, error) {
out := new(CreateRepositoryFromSnapshotResponse)
err := grpc.Invoke(ctx, "/gitaly.RepositoryService/CreateRepositoryFromSnapshot", in, out, c.cc, opts...)
if err != nil {
return nil, err
}
return out, nil
}
// Server API for RepositoryService service // Server API for RepositoryService service
type RepositoryServiceServer interface { type RepositoryServiceServer interface {
...@@ -1450,6 +1573,8 @@ type RepositoryServiceServer interface { ...@@ -1450,6 +1573,8 @@ type RepositoryServiceServer interface {
GetInfoAttributes(*GetInfoAttributesRequest, RepositoryService_GetInfoAttributesServer) error GetInfoAttributes(*GetInfoAttributesRequest, RepositoryService_GetInfoAttributesServer) error
CalculateChecksum(context.Context, *CalculateChecksumRequest) (*CalculateChecksumResponse, error) CalculateChecksum(context.Context, *CalculateChecksumRequest) (*CalculateChecksumResponse, error)
Cleanup(context.Context, *CleanupRequest) (*CleanupResponse, error) Cleanup(context.Context, *CleanupRequest) (*CleanupResponse, error)
GetSnapshot(*GetSnapshotRequest, RepositoryService_GetSnapshotServer) error
CreateRepositoryFromSnapshot(context.Context, *CreateRepositoryFromSnapshotRequest) (*CreateRepositoryFromSnapshotResponse, error)
} }
func RegisterRepositoryServiceServer(s *grpc.Server, srv RepositoryServiceServer) { func RegisterRepositoryServiceServer(s *grpc.Server, srv RepositoryServiceServer) {
...@@ -1923,6 +2048,45 @@ func _RepositoryService_Cleanup_Handler(srv interface{}, ctx context.Context, de ...@@ -1923,6 +2048,45 @@ func _RepositoryService_Cleanup_Handler(srv interface{}, ctx context.Context, de
return interceptor(ctx, in, info, handler) return interceptor(ctx, in, info, handler)
} }
func _RepositoryService_GetSnapshot_Handler(srv interface{}, stream grpc.ServerStream) error {
m := new(GetSnapshotRequest)
if err := stream.RecvMsg(m); err != nil {
return err
}
return srv.(RepositoryServiceServer).GetSnapshot(m, &repositoryServiceGetSnapshotServer{stream})
}
type RepositoryService_GetSnapshotServer interface {
Send(*GetSnapshotResponse) error
grpc.ServerStream
}
type repositoryServiceGetSnapshotServer struct {
grpc.ServerStream
}
func (x *repositoryServiceGetSnapshotServer) Send(m *GetSnapshotResponse) error {
return x.ServerStream.SendMsg(m)
}
func _RepositoryService_CreateRepositoryFromSnapshot_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(CreateRepositoryFromSnapshotRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(RepositoryServiceServer).CreateRepositoryFromSnapshot(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/gitaly.RepositoryService/CreateRepositoryFromSnapshot",
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(RepositoryServiceServer).CreateRepositoryFromSnapshot(ctx, req.(*CreateRepositoryFromSnapshotRequest))
}
return interceptor(ctx, in, info, handler)
}
var _RepositoryService_serviceDesc = grpc.ServiceDesc{ var _RepositoryService_serviceDesc = grpc.ServiceDesc{
ServiceName: "gitaly.RepositoryService", ServiceName: "gitaly.RepositoryService",
HandlerType: (*RepositoryServiceServer)(nil), HandlerType: (*RepositoryServiceServer)(nil),
...@@ -2011,6 +2175,10 @@ var _RepositoryService_serviceDesc = grpc.ServiceDesc{ ...@@ -2011,6 +2175,10 @@ var _RepositoryService_serviceDesc = grpc.ServiceDesc{
MethodName: "Cleanup", MethodName: "Cleanup",
Handler: _RepositoryService_Cleanup_Handler, Handler: _RepositoryService_Cleanup_Handler,
}, },
{
MethodName: "CreateRepositoryFromSnapshot",
Handler: _RepositoryService_CreateRepositoryFromSnapshot_Handler,
},
}, },
Streams: []grpc.StreamDesc{ Streams: []grpc.StreamDesc{
{ {
...@@ -2033,6 +2201,11 @@ var _RepositoryService_serviceDesc = grpc.ServiceDesc{ ...@@ -2033,6 +2201,11 @@ var _RepositoryService_serviceDesc = grpc.ServiceDesc{
Handler: _RepositoryService_GetInfoAttributes_Handler, Handler: _RepositoryService_GetInfoAttributes_Handler,
ServerStreams: true, ServerStreams: true,
}, },
{
StreamName: "GetSnapshot",
Handler: _RepositoryService_GetSnapshot_Handler,
ServerStreams: true,
},
}, },
Metadata: "repository-service.proto", Metadata: "repository-service.proto",
} }
...@@ -2040,105 +2213,112 @@ var _RepositoryService_serviceDesc = grpc.ServiceDesc{ ...@@ -2040,105 +2213,112 @@ var _RepositoryService_serviceDesc = grpc.ServiceDesc{
func init() { proto.RegisterFile("repository-service.proto", fileDescriptor10) } func init() { proto.RegisterFile("repository-service.proto", fileDescriptor10) }
var fileDescriptor10 = []byte{ var fileDescriptor10 = []byte{
// 1587 bytes of a gzipped FileDescriptorProto // 1698 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x58, 0xef, 0x6e, 0xdb, 0x36, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x59, 0x5f, 0x6f, 0xdb, 0xc8,
0x10, 0xb7, 0xf3, 0xd7, 0xbe, 0xb8, 0xad, 0xc3, 0xfc, 0x93, 0x95, 0xb4, 0x49, 0xb8, 0x62, 0xcb, 0x11, 0x97, 0xfc, 0x4f, 0xd2, 0x48, 0x97, 0x93, 0xd7, 0xff, 0x28, 0xda, 0x89, 0xed, 0xbd, 0xe0,
0xda, 0x2e, 0x28, 0x92, 0x0f, 0x1b, 0xb0, 0x0d, 0x45, 0x92, 0x35, 0x89, 0xd7, 0xa6, 0xc8, 0x94, 0xea, 0xbb, 0xa4, 0xc6, 0xc1, 0x7e, 0x68, 0x81, 0xb6, 0x38, 0xd8, 0x6e, 0x6c, 0x2b, 0x89, 0x03,
0x0e, 0x05, 0x82, 0x0d, 0x86, 0x22, 0xd3, 0xb6, 0x60, 0x59, 0x72, 0x49, 0x2a, 0x6d, 0xfa, 0x79, 0x97, 0x4e, 0x10, 0xc0, 0x68, 0x21, 0xd0, 0xd4, 0x4a, 0x24, 0x44, 0x91, 0xca, 0xee, 0xd2, 0x89,
0x1f, 0xf6, 0x5c, 0x7d, 0x85, 0x3d, 0xc6, 0x5e, 0x62, 0x10, 0x45, 0x89, 0x92, 0x25, 0x65, 0x05, 0xd3, 0xd7, 0x3e, 0x14, 0xe8, 0x53, 0xbf, 0x52, 0xbf, 0x42, 0x3f, 0x46, 0xbf, 0x44, 0xc1, 0xe5,
0xd4, 0x61, 0xdf, 0xc4, 0xe3, 0xf1, 0x77, 0xa7, 0x3b, 0xde, 0xe9, 0x77, 0x02, 0x8d, 0x92, 0xb1, 0x8a, 0x4b, 0x8a, 0xa4, 0x1a, 0x80, 0x29, 0xee, 0x8d, 0x3b, 0xbb, 0xfb, 0x9b, 0xd9, 0x99, 0x9d,
0xc7, 0x6c, 0xee, 0xd1, 0x9b, 0x6f, 0x18, 0xa1, 0xd7, 0xb6, 0x45, 0x76, 0xc7, 0xd4, 0xe3, 0x1e, 0xd1, 0x6f, 0x56, 0xa0, 0x51, 0x32, 0xf1, 0x99, 0xc3, 0x7d, 0xfa, 0xf0, 0x6b, 0x46, 0xe8, 0xbd,
0x9a, 0xeb, 0xdb, 0xdc, 0x74, 0x6e, 0xf4, 0x06, 0x1b, 0x98, 0x94, 0x74, 0x43, 0x29, 0x3e, 0x83, 0x63, 0x91, 0xc3, 0x09, 0xf5, 0xb9, 0x8f, 0x56, 0x86, 0x0e, 0x37, 0xdd, 0x07, 0xbd, 0xc5, 0x6c,
0x35, 0x23, 0x3e, 0xf1, 0xfc, 0xbd, 0xcd, 0x38, 0x33, 0xc8, 0x5b, 0x9f, 0x30, 0x8e, 0xf6, 0x00, 0x93, 0x92, 0x7e, 0x24, 0xc5, 0x57, 0xb0, 0x65, 0xc4, 0x3b, 0x5e, 0x7c, 0x72, 0x18, 0x67, 0x06,
0x14, 0x98, 0x56, 0xdd, 0xaa, 0xee, 0x2c, 0xec, 0xa1, 0xdd, 0x10, 0x65, 0x57, 0x1d, 0x32, 0x12, 0xf9, 0x10, 0x10, 0xc6, 0xd1, 0x11, 0x80, 0x02, 0xd3, 0xaa, 0x7b, 0xd5, 0x83, 0xe6, 0x11, 0x3a,
0x5a, 0x78, 0x0f, 0xb4, 0x2c, 0x1c, 0x1b, 0x7b, 0x2e, 0x23, 0x68, 0x15, 0xe6, 0x88, 0x90, 0x08, 0x8c, 0x50, 0x0e, 0xd5, 0x26, 0x23, 0xb1, 0x0a, 0x1f, 0x81, 0x96, 0x85, 0x63, 0x13, 0xdf, 0x63,
0xac, 0x9a, 0x21, 0x57, 0xf8, 0x95, 0x38, 0x63, 0x5a, 0xc3, 0xb6, 0x6b, 0x51, 0x32, 0x22, 0x2e, 0x04, 0x6d, 0xc2, 0x0a, 0x11, 0x12, 0x81, 0x55, 0x37, 0xe4, 0x08, 0xbf, 0x11, 0x7b, 0x4c, 0x6b,
0x37, 0x9d, 0x32, 0x3e, 0xac, 0x43, 0x2b, 0x07, 0x2f, 0x74, 0x02, 0x3b, 0xb0, 0x18, 0x6e, 0x1e, 0xd4, 0xf5, 0x2c, 0x4a, 0xc6, 0xc4, 0xe3, 0xa6, 0x5b, 0xc6, 0x86, 0x6d, 0xe8, 0xe4, 0xe0, 0x45,
0xfb, 0x4e, 0x19, 0x2b, 0xe8, 0x0b, 0xb8, 0x63, 0x51, 0x62, 0x72, 0xd2, 0xb9, 0xb2, 0xf9, 0xc8, 0x46, 0x60, 0x17, 0x56, 0xa3, 0xc9, 0xf3, 0xc0, 0x2d, 0xa3, 0x05, 0x7d, 0x07, 0xdf, 0x58, 0x94,
0x1c, 0x6b, 0x53, 0xe2, 0xa5, 0x1a, 0xa1, 0xf0, 0x50, 0xc8, 0xf0, 0x32, 0xa0, 0xa4, 0x35, 0xe9, 0x98, 0x9c, 0xf4, 0xee, 0x1c, 0x3e, 0x36, 0x27, 0xda, 0x82, 0x38, 0x54, 0x2b, 0x12, 0x9e, 0x0a,
0xc3, 0x18, 0x56, 0x4e, 0x4c, 0x7a, 0x65, 0xf6, 0xc9, 0x91, 0xe7, 0x38, 0xc4, 0xe2, 0xff, 0xb9, 0x19, 0x5e, 0x07, 0x94, 0xd4, 0x26, 0x6d, 0x98, 0xc0, 0xc6, 0x85, 0x49, 0xef, 0xcc, 0x21, 0x39,
0x1f, 0x1a, 0xac, 0x4e, 0x5a, 0x94, 0xbe, 0xfc, 0x04, 0x77, 0x8f, 0x1c, 0x62, 0xba, 0xfe, 0xb8, 0xf3, 0x5d, 0x97, 0x58, 0xfc, 0xff, 0x6e, 0x87, 0x06, 0x9b, 0xb3, 0x1a, 0xa5, 0x2d, 0x7f, 0x84,
0x4c, 0xc8, 0x17, 0xe1, 0x5e, 0x8c, 0x22, 0x81, 0x5f, 0xc0, 0x8a, 0x52, 0xbe, 0xb0, 0x3f, 0x90, 0x47, 0x67, 0x2e, 0x31, 0xbd, 0x60, 0x52, 0xc6, 0xe5, 0xab, 0xf0, 0x6d, 0x8c, 0x22, 0x81, 0x5f,
0x32, 0xf8, 0x4f, 0x60, 0x75, 0x12, 0x4c, 0x5e, 0x2a, 0x04, 0x33, 0xcc, 0xfe, 0x40, 0x04, 0xce, 0xc1, 0x86, 0x5a, 0x7c, 0xe3, 0x7c, 0x26, 0x65, 0xf0, 0x9f, 0xc3, 0xe6, 0x2c, 0x98, 0xbc, 0x54,
0xb4, 0x21, 0x9e, 0xf1, 0x10, 0x5a, 0x07, 0xe3, 0xb1, 0x73, 0x73, 0x62, 0x73, 0x93, 0x73, 0x6a, 0x08, 0x96, 0x98, 0xf3, 0x99, 0x08, 0x9c, 0x45, 0x43, 0x7c, 0xe3, 0x11, 0x74, 0x4e, 0x26, 0x13,
0x5f, 0xf9, 0x9c, 0x94, 0xb9, 0xd5, 0x48, 0x87, 0x1a, 0x25, 0xd7, 0x36, 0xb3, 0x3d, 0x57, 0x84, 0xf7, 0xe1, 0xc2, 0xe1, 0x26, 0xe7, 0xd4, 0xb9, 0x0b, 0x38, 0x29, 0x73, 0xab, 0x91, 0x0e, 0x75,
0xb7, 0x61, 0xc4, 0x6b, 0xbc, 0x01, 0x7a, 0x9e, 0x31, 0x19, 0x85, 0x3f, 0xa6, 0x00, 0x1d, 0x13, 0x4a, 0xee, 0x1d, 0xe6, 0xf8, 0x9e, 0x70, 0x6f, 0xcb, 0x88, 0xc7, 0x78, 0x07, 0xf4, 0x3c, 0x65,
0x6e, 0x0d, 0x0c, 0x32, 0xf2, 0x78, 0x99, 0x18, 0x04, 0xe5, 0x43, 0x05, 0x88, 0x70, 0xa1, 0x6e, 0xd2, 0x0b, 0x7f, 0x5b, 0x00, 0x74, 0x4e, 0xb8, 0x65, 0x1b, 0x64, 0xec, 0xf3, 0x32, 0x3e, 0x08,
0xc8, 0x15, 0x5a, 0x86, 0xd9, 0x9e, 0x47, 0x2d, 0xa2, 0x4d, 0x8b, 0xc4, 0x87, 0x0b, 0xb4, 0x06, 0xd3, 0x87, 0x0a, 0x10, 0x61, 0x42, 0xc3, 0x90, 0x23, 0xb4, 0x0e, 0xcb, 0x03, 0x9f, 0x5a, 0x44,
0xf3, 0xae, 0xd7, 0xe1, 0x66, 0x9f, 0x69, 0x33, 0x61, 0xb5, 0xb9, 0xde, 0x6b, 0xb3, 0xcf, 0x90, 0x5b, 0x14, 0x81, 0x8f, 0x06, 0x68, 0x0b, 0x6a, 0x9e, 0xdf, 0xe3, 0xe6, 0x90, 0x69, 0x4b, 0x51,
0x06, 0xf3, 0xdc, 0x1e, 0x11, 0xcf, 0xe7, 0xda, 0xec, 0x56, 0x75, 0x67, 0xd6, 0x88, 0x96, 0xc1, 0xb6, 0x79, 0xfe, 0x5b, 0x73, 0xc8, 0x90, 0x06, 0x35, 0xee, 0x8c, 0x89, 0x1f, 0x70, 0x6d, 0x79,
0x11, 0xc6, 0x06, 0x9d, 0x21, 0xb9, 0xd1, 0xe6, 0x42, 0x0b, 0x8c, 0x0d, 0x5e, 0x90, 0x1b, 0xb4, 0xaf, 0x7a, 0xb0, 0x6c, 0x4c, 0x87, 0xe1, 0x16, 0xc6, 0xec, 0xde, 0x88, 0x3c, 0x68, 0x2b, 0x91,
0x09, 0x0b, 0x43, 0xd7, 0x7b, 0xe7, 0x76, 0x06, 0x5e, 0x50, 0xbd, 0xf3, 0x62, 0x13, 0x84, 0xe8, 0x06, 0xc6, 0xec, 0x57, 0xe4, 0x01, 0xed, 0x42, 0x73, 0xe4, 0xf9, 0x1f, 0xbd, 0x9e, 0xed, 0x87,
0x34, 0x90, 0xa0, 0x16, 0xd4, 0x5c, 0xaf, 0x33, 0xa6, 0xbe, 0x4b, 0xb4, 0xba, 0xb0, 0x36, 0xef, 0xd9, 0x5b, 0x13, 0x93, 0x20, 0x44, 0x97, 0xa1, 0x04, 0x75, 0xa0, 0xee, 0xf9, 0xbd, 0x09, 0x0d,
0x7a, 0xe7, 0xc1, 0xf2, 0xe7, 0x99, 0x5a, 0xad, 0x59, 0xc7, 0x2b, 0xb0, 0x94, 0x8a, 0x82, 0x8c, 0x3c, 0xa2, 0x35, 0x84, 0xb6, 0x9a, 0xe7, 0x5f, 0x87, 0xc3, 0x97, 0x4b, 0xf5, 0x7a, 0xbb, 0x81,
0xce, 0x19, 0xac, 0x1d, 0x89, 0x6b, 0x9a, 0x78, 0xe5, 0x12, 0xb7, 0x44, 0x07, 0x2d, 0x0b, 0x27, 0x37, 0x60, 0x2d, 0xe5, 0x05, 0xe9, 0x9d, 0x2b, 0xd8, 0x3a, 0x13, 0xd7, 0x34, 0x71, 0xe4, 0x12,
0x4d, 0xfd, 0x5d, 0x85, 0xc5, 0x13, 0xc2, 0x0f, 0xa8, 0x35, 0xb0, 0xaf, 0x4b, 0xe5, 0x61, 0x1d, 0xb7, 0x44, 0x07, 0x2d, 0x0b, 0x27, 0x55, 0xfd, 0xa7, 0x0a, 0xab, 0x17, 0x84, 0x9f, 0x50, 0xcb,
0xea, 0x96, 0x37, 0x1a, 0xd9, 0xbc, 0x63, 0x77, 0x65, 0x2a, 0x6a, 0xa1, 0xa0, 0xdd, 0x0d, 0x92, 0x76, 0xee, 0x4b, 0xc5, 0x61, 0x1b, 0x1a, 0x96, 0x3f, 0x1e, 0x3b, 0xbc, 0xe7, 0xf4, 0x65, 0x28,
0x34, 0xa6, 0xa4, 0x67, 0xbf, 0x17, 0xd9, 0xa8, 0x1b, 0x72, 0x85, 0xbe, 0x83, 0xb9, 0x9e, 0x47, 0xea, 0x91, 0xa0, 0xdb, 0x0f, 0x83, 0x34, 0xa1, 0x64, 0xe0, 0x7c, 0x12, 0xd1, 0x68, 0x18, 0x72,
0x47, 0x26, 0x17, 0xd9, 0xb8, 0xbb, 0xb7, 0x15, 0x19, 0xc9, 0xf8, 0xb4, 0x7b, 0x2c, 0xf4, 0x0c, 0x84, 0x7e, 0x0b, 0x2b, 0x03, 0x9f, 0x8e, 0x4d, 0x2e, 0xa2, 0xf1, 0xe8, 0x68, 0x6f, 0xaa, 0x24,
0xa9, 0x8f, 0xf7, 0x61, 0x2e, 0x94, 0xa0, 0x79, 0x98, 0xbe, 0x6c, 0x9f, 0x37, 0x2b, 0xc1, 0xc3, 0x63, 0xd3, 0xe1, 0xb9, 0x58, 0x67, 0xc8, 0xf5, 0xf8, 0x18, 0x56, 0x22, 0x09, 0xaa, 0xc1, 0xe2,
0xeb, 0x03, 0xa3, 0x59, 0x45, 0x00, 0x73, 0xaf, 0x0f, 0x8c, 0xce, 0xc9, 0x65, 0x73, 0x0a, 0x2d, 0x6d, 0xf7, 0xba, 0x5d, 0x09, 0x3f, 0xde, 0x9e, 0x18, 0xed, 0x2a, 0x02, 0x58, 0x79, 0x7b, 0x62,
0xc0, 0x7c, 0xf0, 0x7c, 0x78, 0xb9, 0xd7, 0x9c, 0xc6, 0x3b, 0x80, 0x92, 0xc0, 0xaa, 0x56, 0xba, 0xf4, 0x2e, 0x6e, 0xdb, 0x0b, 0xa8, 0x09, 0xb5, 0xf0, 0xfb, 0xf4, 0xf6, 0xa8, 0xbd, 0x88, 0x0f,
0x26, 0x37, 0xc5, 0x7b, 0x36, 0x0c, 0xf1, 0x1c, 0xa4, 0xe0, 0xd4, 0x64, 0x2f, 0x3d, 0xcb, 0x74, 0x00, 0x25, 0x81, 0x55, 0xae, 0xf4, 0x4d, 0x6e, 0x8a, 0x73, 0xb6, 0x0c, 0xf1, 0x1d, 0x86, 0xe0,
0x0e, 0xa9, 0xe9, 0x5a, 0x83, 0x52, 0x95, 0x82, 0x9f, 0x82, 0x96, 0x85, 0x93, 0xe6, 0x97, 0x61, 0xd2, 0x64, 0xaf, 0x7d, 0xcb, 0x74, 0x4f, 0xa9, 0xe9, 0x59, 0x76, 0xa9, 0x4c, 0xc1, 0x3f, 0x81,
0xf6, 0xda, 0x74, 0x7c, 0x22, 0xdb, 0x7f, 0xb8, 0xc0, 0x7f, 0x55, 0x41, 0x13, 0x77, 0xe3, 0xc2, 0x96, 0x85, 0x93, 0xea, 0xd7, 0x61, 0xf9, 0xde, 0x74, 0x03, 0x22, 0xcb, 0x7f, 0x34, 0xc0, 0xff,
0xf3, 0xa9, 0x45, 0xc2, 0x53, 0x65, 0xf2, 0xf3, 0x0c, 0x16, 0x99, 0x80, 0xea, 0x24, 0x8e, 0x4e, 0xae, 0x82, 0x26, 0xee, 0xc6, 0x8d, 0x1f, 0x50, 0x8b, 0x44, 0xbb, 0xca, 0xc4, 0xe7, 0x67, 0x58,
0x15, 0x1e, 0x6d, 0x86, 0xca, 0x46, 0xaa, 0xa3, 0x4a, 0x80, 0x2b, 0xe1, 0x8c, 0x48, 0x65, 0xc3, 0x65, 0x02, 0xaa, 0x97, 0xd8, 0xba, 0x50, 0xb8, 0xb5, 0x1d, 0x2d, 0x36, 0x52, 0x15, 0x55, 0x02,
0x68, 0xb0, 0x84, 0x83, 0xe8, 0x3e, 0x00, 0x37, 0x69, 0x9f, 0xf0, 0x0e, 0x25, 0x3d, 0x91, 0xd4, 0xdc, 0x09, 0x63, 0x44, 0x28, 0x5b, 0x46, 0x8b, 0x25, 0x0c, 0x44, 0x8f, 0x01, 0xb8, 0x49, 0x87,
0x86, 0x51, 0x0f, 0x25, 0x06, 0xe9, 0xe1, 0x7d, 0x68, 0xe5, 0xbc, 0x94, 0xfa, 0x10, 0x52, 0xc2, 0x84, 0xf7, 0x28, 0x19, 0x88, 0xa0, 0xb6, 0x8c, 0x46, 0x24, 0x31, 0xc8, 0x00, 0x1f, 0x43, 0x27,
0x7c, 0x87, 0x47, 0x1f, 0xc2, 0x70, 0x85, 0x0f, 0x60, 0xe1, 0x98, 0x59, 0xc3, 0x32, 0xf1, 0x7f, 0xe7, 0x50, 0xea, 0x87, 0x90, 0x12, 0x16, 0xb8, 0x7c, 0xfa, 0x43, 0x18, 0x8d, 0xf0, 0x09, 0x34,
0x08, 0x8d, 0x10, 0x42, 0xc5, 0x9c, 0x50, 0xea, 0x51, 0x99, 0xf3, 0x70, 0x81, 0x3f, 0x56, 0xe1, 0xcf, 0x99, 0x35, 0x2a, 0xe3, 0xff, 0xa7, 0xd0, 0x8a, 0x20, 0x94, 0xcf, 0x09, 0xa5, 0x3e, 0x95,
0xde, 0x1b, 0x6a, 0x07, 0x85, 0xd2, 0x2b, 0x13, 0xea, 0x26, 0x4c, 0x07, 0x6f, 0x1f, 0xb6, 0xc4, 0x31, 0x8f, 0x06, 0xf8, 0x5f, 0x55, 0xf8, 0xf6, 0x3d, 0x75, 0xc2, 0x44, 0x19, 0x94, 0x71, 0x75,
0xe0, 0x31, 0xd5, 0x29, 0xa7, 0xd3, 0x9d, 0x12, 0x6d, 0x43, 0xc3, 0x73, 0xba, 0x9d, 0x78, 0x3f, 0x1b, 0x16, 0xc3, 0xd3, 0x47, 0x25, 0x31, 0xfc, 0x4c, 0x55, 0xca, 0xc5, 0x74, 0xa5, 0x44, 0xfb,
0x0c, 0xda, 0x82, 0xe7, 0x74, 0x8d, 0x48, 0x25, 0xee, 0x65, 0xb3, 0xc9, 0x5e, 0xb6, 0x0c, 0xb3, 0xd0, 0xf2, 0xdd, 0x7e, 0x2f, 0x9e, 0x8f, 0x9c, 0xd6, 0xf4, 0xdd, 0xbe, 0x31, 0x5d, 0x12, 0xd7,
0x6c, 0x40, 0x1c, 0x47, 0xb4, 0xa5, 0x9a, 0x11, 0x2e, 0xf0, 0x0e, 0x34, 0xd5, 0x3b, 0xdc, 0xfa, 0xb2, 0xe5, 0x64, 0x2d, 0x5b, 0x87, 0x65, 0x66, 0x13, 0xd7, 0x15, 0x65, 0xa9, 0x6e, 0x44, 0x03,
0xba, 0x03, 0x58, 0x3e, 0xb6, 0xdd, 0xee, 0x19, 0xa1, 0x7d, 0x72, 0x68, 0xb2, 0x52, 0xd5, 0xbf, 0x7c, 0x00, 0x6d, 0x75, 0x86, 0xb9, 0xc7, 0xb5, 0x61, 0xfd, 0xdc, 0xf1, 0xfa, 0x57, 0x84, 0x0e,
0x01, 0xf5, 0xe8, 0x05, 0x98, 0x36, 0xb5, 0x35, 0x1d, 0xa4, 0x3d, 0x16, 0xe0, 0xc7, 0xb0, 0x32, 0xc9, 0xa9, 0xc9, 0x4a, 0x65, 0xff, 0x0e, 0x34, 0xa6, 0x07, 0x60, 0xda, 0xc2, 0xde, 0x62, 0x18,
0x61, 0x49, 0x95, 0xde, 0x95, 0xc9, 0xc2, 0xab, 0x5f, 0x37, 0xc4, 0x33, 0xfe, 0xb3, 0x0a, 0x8b, 0xf6, 0x58, 0x80, 0x9f, 0xc1, 0xc6, 0x8c, 0x26, 0x95, 0x7a, 0x77, 0x26, 0x8b, 0xae, 0x7e, 0xc3,
0x61, 0xbf, 0x3a, 0xf6, 0xe8, 0xf0, 0xff, 0xbc, 0xf2, 0x01, 0x4f, 0x49, 0x7a, 0x12, 0x73, 0xa5, 0x10, 0xdf, 0xf8, 0xef, 0x55, 0x58, 0x8d, 0xea, 0xd5, 0xb9, 0x4f, 0x47, 0xbf, 0xe4, 0x95, 0x0f,
0x56, 0x9b, 0x19, 0x24, 0x70, 0xb6, 0xed, 0x9e, 0x53, 0xaf, 0x4f, 0x09, 0x63, 0x25, 0x5b, 0x27, 0x79, 0x4a, 0xd2, 0x92, 0x98, 0x2b, 0x75, 0xba, 0xcc, 0x20, 0xa1, 0xb1, 0x5d, 0xef, 0x9a, 0xfa,
0x15, 0x70, 0x89, 0xd6, 0x19, 0x0a, 0xda, 0x5d, 0xfc, 0x23, 0xe8, 0x79, 0xd6, 0x64, 0x00, 0x37, 0x43, 0x4a, 0x18, 0x2b, 0x59, 0x3a, 0xa9, 0x80, 0x4b, 0x94, 0xce, 0x48, 0xd0, 0xed, 0xe3, 0x3f,
0x61, 0xc1, 0x76, 0x3b, 0x63, 0x29, 0x96, 0x85, 0x03, 0x76, 0xac, 0x18, 0x3a, 0x7b, 0xf1, 0xd6, 0x80, 0x9e, 0xa7, 0x4d, 0x3a, 0x70, 0x17, 0x9a, 0x8e, 0xd7, 0x9b, 0x48, 0xb1, 0x4c, 0x1c, 0x70,
0x37, 0xd9, 0xe0, 0xb3, 0x39, 0xcb, 0x04, 0x5c, 0xc2, 0xd9, 0x50, 0x10, 0x39, 0x9b, 0xb5, 0xf6, 0xe2, 0x85, 0x91, 0xb1, 0x37, 0x1f, 0x02, 0x93, 0xd9, 0x5f, 0xcd, 0x58, 0x26, 0xe0, 0x12, 0xc6,
0xa9, 0xce, 0xf6, 0xe0, 0xc1, 0xe4, 0x97, 0xea, 0x98, 0x7a, 0xa3, 0x5f, 0x8d, 0x97, 0x25, 0xcb, 0x46, 0x82, 0xa9, 0xb1, 0x59, 0x6d, 0x5f, 0x6a, 0xec, 0x00, 0x9e, 0xcc, 0xfe, 0x52, 0x9d, 0x53,
0xd1, 0xa7, 0x8e, 0xf4, 0x35, 0x78, 0xc4, 0xdb, 0xb0, 0x59, 0x68, 0x47, 0x26, 0xb9, 0x0d, 0x4b, 0x7f, 0xfc, 0xce, 0x78, 0x5d, 0x32, 0x1d, 0x03, 0xea, 0x4a, 0x5b, 0xc3, 0x4f, 0xbc, 0x0f, 0xbb,
0xa1, 0xca, 0xa1, 0xef, 0x76, 0x9d, 0x52, 0x2c, 0xed, 0x11, 0x2c, 0xa7, 0xa1, 0x6e, 0xf9, 0xee, 0x85, 0x7a, 0x64, 0x90, 0xbb, 0xb0, 0x16, 0x2d, 0x39, 0x0d, 0xbc, 0xbe, 0x5b, 0x8a, 0xa5, 0xfd,
0x10, 0x40, 0xa2, 0x7a, 0x8f, 0x3c, 0xb7, 0x67, 0xf7, 0x4b, 0xe6, 0xa9, 0xe7, 0x3b, 0x4e, 0x67, 0x08, 0xeb, 0x69, 0xa8, 0x39, 0xbf, 0x3b, 0x04, 0x90, 0xc8, 0xde, 0x33, 0xdf, 0x1b, 0x38, 0xc3,
0x6c, 0xf2, 0x41, 0x94, 0xa7, 0x40, 0x70, 0x6e, 0xf2, 0x01, 0x7e, 0x0c, 0x4b, 0x29, 0x33, 0xb7, 0x92, 0x71, 0x1a, 0x04, 0xae, 0xdb, 0x9b, 0x98, 0xdc, 0x9e, 0xc6, 0x29, 0x14, 0x5c, 0x9b, 0xdc,
0xf6, 0x89, 0x21, 0x6c, 0xe7, 0x45, 0xab, 0x74, 0x60, 0xe2, 0x00, 0x4c, 0x25, 0x02, 0xf0, 0x10, 0xc6, 0xcf, 0x60, 0x2d, 0xa5, 0x66, 0x6e, 0x9d, 0x18, 0xc1, 0x7e, 0x9e, 0xb7, 0x4a, 0x3b, 0x26,
0xf0, 0x6d, 0xc6, 0x64, 0x76, 0x4e, 0x01, 0x05, 0x0d, 0xe5, 0xa5, 0x6d, 0x11, 0xb7, 0x54, 0xe3, 0x76, 0xc0, 0x42, 0xc2, 0x01, 0x4f, 0x01, 0xcf, 0x53, 0x26, 0xa3, 0x73, 0x09, 0x28, 0x2c, 0x28,
0xc2, 0x47, 0xb0, 0x94, 0x42, 0x92, 0x91, 0x78, 0x02, 0xc8, 0x09, 0x45, 0x1d, 0x36, 0xf0, 0x28, 0xaf, 0x1d, 0x8b, 0x78, 0xa5, 0x0a, 0x17, 0x3e, 0x83, 0xb5, 0x14, 0x92, 0xf4, 0xc4, 0x73, 0x40,
0xef, 0xb8, 0xe6, 0x28, 0x6a, 0x53, 0x4d, 0xb9, 0x73, 0x11, 0x6c, 0xbc, 0x32, 0x47, 0x24, 0x18, 0x6e, 0x24, 0xea, 0x31, 0xdb, 0xa7, 0xbc, 0xe7, 0x99, 0xe3, 0x69, 0x99, 0x6a, 0xcb, 0x99, 0x9b,
0xd5, 0x4e, 0x08, 0x6f, 0xbb, 0x3d, 0xef, 0xe0, 0x73, 0x10, 0x6b, 0xfc, 0x3d, 0xb4, 0x72, 0xf0, 0x70, 0xe2, 0x8d, 0x39, 0x26, 0x61, 0xab, 0x76, 0x41, 0x78, 0xd7, 0x1b, 0xf8, 0x27, 0x5f, 0x83,
0xa4, 0x6b, 0x0f, 0x00, 0x14, 0xa3, 0x96, 0x99, 0x4a, 0x48, 0x02, 0x67, 0x8e, 0x4c, 0xc7, 0xf2, 0x58, 0xe3, 0xdf, 0x41, 0x27, 0x07, 0x4f, 0x9a, 0xf6, 0x04, 0x40, 0x31, 0x6a, 0x19, 0xa9, 0x84,
0x1d, 0x93, 0x93, 0xa3, 0x01, 0xb1, 0x86, 0xcc, 0x1f, 0x95, 0x71, 0xe6, 0x5b, 0x68, 0xe5, 0xe0, 0x24, 0x34, 0xe6, 0xcc, 0x74, 0xad, 0xc0, 0x35, 0x39, 0x39, 0xb3, 0x89, 0x35, 0x62, 0xc1, 0xb8,
0x49, 0x67, 0x74, 0xa8, 0x59, 0x52, 0x26, 0xa3, 0x13, 0xaf, 0xf7, 0x3e, 0x36, 0xc5, 0x50, 0x19, 0x8c, 0x31, 0xbf, 0x81, 0x4e, 0x0e, 0x9e, 0x34, 0x46, 0x87, 0xba, 0x25, 0x65, 0xd2, 0x3b, 0xf1,
0x8d, 0x27, 0xe1, 0xd4, 0x8d, 0xde, 0x40, 0x73, 0x72, 0x14, 0x46, 0x9b, 0x59, 0x17, 0x52, 0x33, 0x38, 0x0c, 0xd2, 0x05, 0xe1, 0x37, 0x9e, 0x39, 0x61, 0xb6, 0x5f, 0xa6, 0x99, 0xc3, 0x3f, 0xc0,
0xb7, 0xbe, 0x55, 0xac, 0x20, 0x6f, 0x44, 0x05, 0x5d, 0x46, 0x23, 0x6c, 0x62, 0xbe, 0x45, 0xc9, 0x5a, 0x0a, 0x69, 0x4e, 0x02, 0xfd, 0xb3, 0x0a, 0xdf, 0xe5, 0x5d, 0xa0, 0xaf, 0x60, 0x46, 0xc8,
0x83, 0xb9, 0xa3, 0xb4, 0xbe, 0x7d, 0x8b, 0x46, 0x8c, 0xfd, 0x1c, 0x40, 0x0d, 0xac, 0xa8, 0x95, 0xe7, 0x6d, 0xce, 0x27, 0x3d, 0x55, 0x4d, 0x6a, 0xe1, 0xf8, 0x1d, 0x75, 0xc3, 0x6c, 0x13, 0x53,
0x3e, 0x92, 0x18, 0x99, 0x75, 0x3d, 0x6f, 0x2b, 0x86, 0xf9, 0x05, 0xee, 0xa6, 0xe7, 0x4d, 0x74, 0x66, 0xc0, 0x6d, 0xc9, 0x71, 0xc5, 0xda, 0x93, 0x80, 0xdb, 0xf8, 0x7b, 0x78, 0x3a, 0xdf, 0xa4,
0x3f, 0x26, 0xbc, 0x79, 0x93, 0xaf, 0xfe, 0xa0, 0x68, 0x3b, 0x09, 0x99, 0x1e, 0x01, 0x15, 0x64, 0xe8, 0x3c, 0x47, 0xff, 0x40, 0xa2, 0x0b, 0x9f, 0xf6, 0x73, 0xd1, 0x33, 0x05, 0x7a, 0x0f, 0xed,
0xee, 0x9c, 0xa9, 0x20, 0xf3, 0x27, 0x47, 0x5c, 0x41, 0xbf, 0x03, 0xca, 0x8e, 0x6e, 0x28, 0x8e, 0xd9, 0xb7, 0x03, 0xb4, 0x9b, 0xb5, 0x34, 0xf5, 0x48, 0xa1, 0xef, 0x15, 0x2f, 0x90, 0x29, 0x54,
0x53, 0xe1, 0x0c, 0xa9, 0xe3, 0xdb, 0x54, 0x62, 0xf8, 0x53, 0x58, 0x48, 0x0c, 0x3d, 0x28, 0x8e, 0x41, 0xb7, 0xd3, 0x9e, 0x3f, 0xf1, 0x20, 0x80, 0x92, 0x1b, 0x73, 0xdf, 0x1e, 0xf4, 0xfd, 0x39,
0x58, 0x76, 0x1e, 0xd4, 0xd7, 0x73, 0xf7, 0x62, 0xa4, 0x37, 0xd0, 0x9c, 0xec, 0x15, 0xea, 0x2a, 0x2b, 0x62, 0xec, 0x17, 0x00, 0xaa, 0xc3, 0x47, 0x9d, 0xf4, 0x96, 0xc4, 0x1b, 0x83, 0xae, 0xe7,
0x15, 0x4c, 0x50, 0xea, 0x2a, 0x15, 0xce, 0x44, 0x15, 0x74, 0x02, 0xa0, 0xe6, 0x04, 0x95, 0xee, 0x4d, 0xc5, 0x30, 0x7f, 0x82, 0x47, 0xe9, 0x06, 0x1d, 0x3d, 0x8e, 0x3b, 0x84, 0xbc, 0xa7, 0x02,
0xcc, 0x50, 0xa2, 0xd2, 0x9d, 0x1d, 0x2b, 0x70, 0xe5, 0x69, 0x35, 0xf0, 0x70, 0x92, 0xf7, 0x2b, 0xfd, 0x49, 0xd1, 0x74, 0x12, 0x32, 0xdd, 0x33, 0x2b, 0xc8, 0xdc, 0xc6, 0x5c, 0x41, 0xe6, 0xb7,
0x0f, 0x0b, 0x06, 0x0c, 0xe5, 0x61, 0xd1, 0xc8, 0x10, 0x5e, 0xf6, 0x0c, 0x91, 0x56, 0x97, 0xbd, 0xda, 0xb8, 0x82, 0xfe, 0x02, 0x28, 0xdb, 0xeb, 0xa2, 0xd8, 0x4f, 0x85, 0x4d, 0xb7, 0x8e, 0xe7,
0x68, 0x70, 0x50, 0x97, 0xbd, 0x90, 0x85, 0xe3, 0x0a, 0xda, 0x87, 0x99, 0x80, 0x2c, 0xa3, 0xa5, 0x2d, 0x89, 0xe1, 0x2f, 0xa1, 0x99, 0xe8, 0x12, 0x51, 0xec, 0xb1, 0x6c, 0x03, 0xad, 0x6f, 0xe7,
0x58, 0x59, 0xb1, 0x6f, 0x7d, 0x39, 0x2d, 0x8c, 0x0f, 0x3d, 0x83, 0x5a, 0x44, 0x3b, 0xd1, 0x5a, 0xce, 0xc5, 0x48, 0xef, 0xa1, 0x3d, 0x7b, 0x11, 0xd5, 0x55, 0x2a, 0x68, 0x39, 0xd5, 0x55, 0x2a,
0xa4, 0x33, 0x41, 0xa6, 0x75, 0x2d, 0xbb, 0x11, 0x03, 0xbc, 0x82, 0x3b, 0x29, 0x8e, 0x88, 0x36, 0x6c, 0x22, 0x2b, 0xe8, 0x02, 0x40, 0x35, 0x56, 0x2a, 0xdc, 0x99, 0x2e, 0x4e, 0x85, 0x3b, 0xdb,
0x62, 0x4b, 0x39, 0x24, 0x55, 0xbf, 0x5f, 0xb0, 0x9b, 0x2c, 0x59, 0xc5, 0xdd, 0x54, 0x0e, 0x33, 0x87, 0xe1, 0xca, 0x4f, 0xd5, 0xd0, 0xc2, 0xd9, 0x46, 0x49, 0x59, 0x58, 0xd0, 0x91, 0x29, 0x0b,
0xcc, 0x52, 0xe5, 0x30, 0x87, 0xea, 0x89, 0x62, 0xc8, 0xd2, 0x2f, 0x55, 0x0c, 0x85, 0x44, 0x50, 0x8b, 0x7a, 0xac, 0xe8, 0xb2, 0x67, 0x3a, 0x0f, 0x75, 0xd9, 0x8b, 0x3a, 0x2d, 0x75, 0xd9, 0x0b,
0x15, 0x43, 0x31, 0x7b, 0x8b, 0xe0, 0x27, 0x09, 0x53, 0x12, 0xbe, 0x80, 0xba, 0x25, 0xe1, 0x8b, 0xdb, 0x16, 0x5c, 0x41, 0xc7, 0xb0, 0x14, 0x76, 0x17, 0x68, 0x2d, 0x5e, 0xac, 0xda, 0x15, 0x7d,
0xf8, 0x16, 0xae, 0x20, 0x27, 0xfb, 0x27, 0x41, 0x12, 0x1d, 0xf4, 0x65, 0x51, 0x1d, 0xa4, 0x19, 0x3d, 0x2d, 0x8c, 0x37, 0xfd, 0x0c, 0xf5, 0x29, 0x4f, 0x47, 0x5b, 0xd3, 0x35, 0x33, 0xdd, 0x87,
0x97, 0xfe, 0xd5, 0xbf, 0xea, 0xc5, 0xd6, 0xce, 0xa0, 0x91, 0x24, 0x3a, 0x68, 0x3d, 0x7d, 0x34, 0xae, 0x65, 0x27, 0x62, 0x80, 0x37, 0xf0, 0x4d, 0x8a, 0x54, 0xa3, 0x9d, 0x58, 0x53, 0x0e, 0xab,
0x45, 0x18, 0xf4, 0x8d, 0xfc, 0xcd, 0x44, 0xf1, 0xbc, 0x03, 0xbd, 0x98, 0x0a, 0xa0, 0xaf, 0x6f, 0xd7, 0x1f, 0x17, 0xcc, 0x26, 0x53, 0x56, 0x91, 0x5d, 0x15, 0xc3, 0x0c, 0x15, 0x57, 0x31, 0xcc,
0xf3, 0x2b, 0x6d, 0xea, 0xd1, 0xa7, 0xa8, 0x46, 0x86, 0x77, 0xaa, 0x41, 0x87, 0x4a, 0xb0, 0x23, 0xe1, 0xc6, 0x22, 0x19, 0xb2, 0x7c, 0x55, 0x25, 0x43, 0x21, 0x73, 0x56, 0xc9, 0x50, 0x4c, 0x77,
0xd5, 0xa1, 0xb2, 0xcc, 0x4c, 0x75, 0xa8, 0x1c, 0x3a, 0x25, 0x7b, 0x9d, 0x62, 0x17, 0x89, 0x5e, 0xa7, 0xf0, 0xb3, 0x0c, 0x33, 0x09, 0x5f, 0xc0, 0x75, 0x93, 0xf0, 0x45, 0x04, 0x15, 0x57, 0x90,
0x97, 0x21, 0x2f, 0x89, 0x5e, 0x97, 0xa5, 0x23, 0xb8, 0x82, 0x7e, 0x13, 0xff, 0x69, 0xd2, 0x94, 0x9b, 0x7d, 0x7a, 0x91, 0xcc, 0x10, 0x7d, 0x5f, 0x94, 0x07, 0x69, 0x8a, 0xaa, 0xff, 0xea, 0x7f,
0x00, 0x25, 0x7f, 0x97, 0xe4, 0xb2, 0x0f, 0x55, 0xf0, 0x85, 0x7c, 0x42, 0x84, 0xfa, 0x12, 0x16, 0xae, 0x8b, 0xb5, 0x5d, 0x41, 0x2b, 0xc9, 0x0c, 0xd1, 0x76, 0x7a, 0x6b, 0x8a, 0x61, 0xe9, 0x3b,
0x33, 0xdf, 0x78, 0x85, 0x5e, 0x44, 0x27, 0x14, 0x7a, 0x21, 0x41, 0xc0, 0x15, 0xf4, 0x03, 0xcc, 0xf9, 0x93, 0x89, 0xe4, 0xf9, 0x08, 0x7a, 0x31, 0x77, 0x42, 0x3f, 0xcc, 0xb3, 0x2b, 0xad, 0xea,
0xcb, 0x9f, 0xa0, 0x68, 0x35, 0xd6, 0x4f, 0xfd, 0x5b, 0xd5, 0xd7, 0x32, 0xf2, 0xe8, 0xf4, 0xd5, 0xc7, 0x2f, 0x59, 0x3a, 0x55, 0x7c, 0x50, 0x0d, 0x2b, 0x54, 0x82, 0x4e, 0xaa, 0x0a, 0x95, 0xa5,
0x9c, 0xf8, 0x1f, 0xbf, 0xff, 0x4f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x23, 0xc7, 0xc8, 0xe3, 0xc1, 0xb2, 0xaa, 0x42, 0xe5, 0xf0, 0x4f, 0x59, 0xeb, 0x14, 0x1d, 0x4b, 0xd4, 0xba, 0x0c, 0xdb, 0x4b,
0x17, 0x00, 0x00, 0xd4, 0xba, 0x2c, 0x7f, 0xc3, 0x15, 0xf4, 0x67, 0xf1, 0xb0, 0x95, 0xe6, 0x50, 0x28, 0xf9, 0xbe,
0x94, 0x4b, 0xd7, 0x54, 0xc2, 0x17, 0x12, 0x30, 0xe1, 0xea, 0x5b, 0x58, 0xcd, 0x90, 0x22, 0x85,
0x5e, 0xc4, 0xbf, 0x14, 0x7a, 0x21, 0xa3, 0xc2, 0x15, 0xf4, 0x7b, 0xa8, 0xc9, 0x57, 0x63, 0xb4,
0x19, 0xaf, 0x4f, 0x3d, 0x46, 0xeb, 0x5b, 0x19, 0x79, 0xbc, 0xfb, 0x25, 0x34, 0x13, 0x5c, 0x09,
0x25, 0x0b, 0xee, 0x0c, 0x07, 0x52, 0x1e, 0xcc, 0x21, 0x57, 0xe2, 0x94, 0x7f, 0x85, 0x9d, 0x79,
0xc4, 0x05, 0x3d, 0x9b, 0x77, 0x4f, 0x66, 0xb5, 0x3d, 0xff, 0xb2, 0xc5, 0x53, 0xf5, 0x77, 0x2b,
0xe2, 0x9f, 0x98, 0xe3, 0xff, 0x06, 0x00, 0x00, 0xff, 0xff, 0x04, 0x94, 0xb1, 0xc3, 0xbb, 0x19,
0x00, 0x00,
} }
...@@ -197,12 +197,12 @@ ...@@ -197,12 +197,12 @@
"revisionTime": "2016-11-17T07:43:51Z" "revisionTime": "2016-11-17T07:43:51Z"
}, },
{ {
"checksumSHA1": "MVrf0BwLEpU3uGHmYOrIWVoJGCk=", "checksumSHA1": "B+FjK1qIgELTplSb/hl3ZHGHjl0=",
"path": "gitlab.com/gitlab-org/gitaly-proto/go", "path": "gitlab.com/gitlab-org/gitaly-proto/go",
"revision": "00d4006669b30b6a0fe66aaa9fa72285d18616fb", "revision": "8680efed3cdd68f3a2d4ccd56fb6684a6761d59e",
"revisionTime": "2018-04-03T14:25:38Z", "revisionTime": "2018-04-05T16:15:56Z",
"version": "v0.95.0", "version": "v0.96.0",
"versionExact": "v0.95.0" "versionExact": "v0.96.0"
}, },
{ {
"checksumSHA1": "dUHJbKas746n5fLzlwxHb6FOCxs=", "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