diff options
102 files changed, 2474 insertions, 5566 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md index 4989420e1..20b8052e2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # Gitaly changelog +## 14.2.1 (2021-08-23) + +No changes. + ## 14.2.0 (2021-08-20) ### Added (8 changes) @@ -394,8 +394,7 @@ proto: ${PROTOC} ${PROTOC_GEN_GO} ${PROTOC_GEN_GO_GRPC} ${SOURCE_DIR}/.ruby-bund ${SOURCE_DIR}/internal/praefect/mock/mock.proto \ ${SOURCE_DIR}/internal/middleware/cache/testdata/stream.proto \ ${SOURCE_DIR}/internal/helper/chunk/testdata/test.proto \ - ${SOURCE_DIR}/internal/middleware/limithandler/testdata/test.proto \ - ${SOURCE_DIR}/internal/streamrpc/testdata/test.proto + ${SOURCE_DIR}/internal/middleware/limithandler/testdata/test.proto ${PROTOC} ${SHARED_PROTOC_OPTS} -I ${SOURCE_DIR}/proto --go_out=${SOURCE_DIR}/proto --go-grpc_out=${SOURCE_DIR}/proto ${SOURCE_DIR}/proto/go/internal/linter/testdata/*.proto .PHONY: lint-proto diff --git a/cmd/gitaly-hooks/hooks.go b/cmd/gitaly-hooks/hooks.go index af26438fb..9e177b03f 100644 --- a/cmd/gitaly-hooks/hooks.go +++ b/cmd/gitaly-hooks/hooks.go @@ -6,6 +6,7 @@ import ( "fmt" "io" "log" + "net" "os" "strings" @@ -13,10 +14,12 @@ import ( gitalyauth "gitlab.com/gitlab-org/gitaly/v14/auth" "gitlab.com/gitlab-org/gitaly/v14/client" "gitlab.com/gitlab-org/gitaly/v14/internal/git" + "gitlab.com/gitlab-org/gitaly/v14/internal/git/pktline" "gitlab.com/gitlab-org/gitaly/v14/internal/gitaly/config" "gitlab.com/gitlab-org/gitaly/v14/internal/gitaly/config/prometheus" "gitlab.com/gitlab-org/gitaly/v14/internal/gitaly/hook" "gitlab.com/gitlab-org/gitaly/v14/internal/gitlab" + "gitlab.com/gitlab-org/gitaly/v14/internal/helper" "gitlab.com/gitlab-org/gitaly/v14/internal/helper/env" gitalylog "gitlab.com/gitlab-org/gitaly/v14/internal/log" "gitlab.com/gitlab-org/gitaly/v14/internal/metadata/featureflag" @@ -339,8 +342,20 @@ func packObjectsHook(ctx context.Context, payload git.HooksPayload, hookClient g fixedArgs = append(fixedArgs, fixFilterQuoteBug(a)) } - if err := handlePackObjects(ctx, hookClient, payload.Repo, fixedArgs); err != nil { - logger.Logger().WithFields(logrus.Fields{"args": args}).WithError(err).Error("PackObjectsHook RPC failed") + var rpc string + var err error + if featureflag.PackObjectsHookWithSidechannel.IsEnabled(helper.OutgoingToIncoming(ctx)) { + rpc = "PackObjectsHookWithSidechannel" + err = handlePackObjectsWithSidechannel(ctx, hookClient, payload.Repo, fixedArgs) + } else { + rpc = "PackObjectsHook" + err = handlePackObjects(ctx, hookClient, payload.Repo, fixedArgs) + } + if err != nil { + logger.Logger().WithFields(logrus.Fields{ + "args": args, + "rpc": rpc, + }).WithError(err).Error("RPC failed") return 1, nil } @@ -406,3 +421,49 @@ type nopExitStatus struct { } func (nopExitStatus) GetExitStatus() *gitalypb.ExitStatus { return nil } + +func handlePackObjectsWithSidechannel(ctx context.Context, hookClient gitalypb.HookServiceClient, repo *gitalypb.Repository, args []string) error { + ctx, wt, err := hook.SetupSidechannel(ctx, func(c *net.UnixConn) error { + // We don't have to worry about concurrent reads and writes and + // deadlocks, because we're connected to git-upload-pack which follows + // the sequence: (1) write to stdin of pack-objects, (2) close stdin of + // pack-objects, (3) concurrently read from stdout and stderr of + // pack-objects. + if _, err := io.Copy(c, os.Stdin); err != nil { + return fmt.Errorf("copy stdin: %w", err) + } + if err := c.CloseWrite(); err != nil { + return fmt.Errorf("close write: %w", err) + } + + if err := pktline.EachSidebandPacket(c, func(band byte, data []byte) error { + var err error + switch band { + case 1: + _, err = os.Stdout.Write(data) + case 2: + _, err = os.Stderr.Write(data) + default: + err = fmt.Errorf("unexpected side band: %d", band) + } + return err + }); err != nil { + return fmt.Errorf("demux response: %w", err) + } + + return nil + }) + if err != nil { + return fmt.Errorf("SetupSidechannel: %w", err) + } + defer wt.Close() + + if _, err := hookClient.PackObjectsHookWithSidechannel( + ctx, + &gitalypb.PackObjectsHookWithSidechannelRequest{Repository: repo, Args: args}, + ); err != nil { + return fmt.Errorf("call PackObjectsHookWithSidechannel: %w", err) + } + + return wt.Wait() +} diff --git a/cmd/gitaly-hooks/hooks_test.go b/cmd/gitaly-hooks/hooks_test.go index 1218b6017..60f24f227 100644 --- a/cmd/gitaly-hooks/hooks_test.go +++ b/cmd/gitaly-hooks/hooks_test.go @@ -14,6 +14,7 @@ import ( "strings" "testing" + "github.com/sirupsen/logrus/hooks/test" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "gitlab.com/gitlab-org/gitaly/v14/internal/command" @@ -48,19 +49,19 @@ type proxyValues struct { var enabledFeatureFlag = featureflag.FeatureFlag{Name: "enabled-feature-flag", OnByDefault: false} var disabledFeatureFlag = featureflag.FeatureFlag{Name: "disabled-feature-flag", OnByDefault: true} -func rawFeatureFlags() featureflag.Raw { - ctx := featureflag.IncomingCtxWithFeatureFlag(context.Background(), enabledFeatureFlag) +func rawFeatureFlags(ctx context.Context) featureflag.Raw { + ctx = featureflag.IncomingCtxWithFeatureFlag(ctx, enabledFeatureFlag) ctx = featureflag.IncomingCtxWithDisabledFeatureFlag(ctx, disabledFeatureFlag) return featureflag.RawFromContext(ctx) } // envForHooks generates a set of environment variables for gitaly hooks -func envForHooks(t testing.TB, cfg config.Cfg, repo *gitalypb.Repository, glHookValues glHookValues, proxyValues proxyValues, gitPushOptions ...string) []string { +func envForHooks(t testing.TB, ctx context.Context, cfg config.Cfg, repo *gitalypb.Repository, glHookValues glHookValues, proxyValues proxyValues, gitPushOptions ...string) []string { payload, err := git.NewHooksPayload(cfg, repo, nil, &git.ReceiveHooksPayload{ UserID: glHookValues.GLID, Username: glHookValues.GLUsername, Protocol: glHookValues.GLProtocol, - }, git.AllHooks, rawFeatureFlags()).Env() + }, git.AllHooks, rawFeatureFlags(ctx)).Env() require.NoError(t, err) env := append(os.Environ(), []string{ @@ -190,6 +191,7 @@ func testHooksPrePostReceive(t *testing.T, cfg config.Cfg, repo *gitalypb.Reposi cmd.Stdin = stdin cmd.Env = envForHooks( t, + context.Background(), cfg, repo, glHookValues{ @@ -280,7 +282,7 @@ func testHooksUpdate(t *testing.T, cfg config.Cfg, glValues glHookValues) { updateHookPath, err := filepath.Abs("../../ruby/git-hooks/update") require.NoError(t, err) cmd := exec.Command(updateHookPath, refval, oldval, newval) - cmd.Env = envForHooks(t, cfg, repo, glValues, proxyValues{}) + cmd.Env = envForHooks(t, context.Background(), cfg, repo, glValues, proxyValues{}) cmd.Dir = repoPath tempDir := testhelper.TempDir(t) @@ -415,11 +417,11 @@ func TestHooksPostReceiveFailed(t *testing.T) { Protocol: glProtocol, }, git.PostReceiveHook, - rawFeatureFlags(), + rawFeatureFlags(context.Background()), ).Env() require.NoError(t, err) - env := envForHooks(t, cfg, repo, glHookValues{}, proxyValues{}) + env := envForHooks(t, context.Background(), cfg, repo, glHookValues{}, proxyValues{}) env = append(env, hooksPayload) cmd := exec.Command(postReceiveHookPath) @@ -479,7 +481,7 @@ func TestHooksNotAllowed(t *testing.T) { cmd.Stderr = &stderr cmd.Stdout = &stdout cmd.Stdin = strings.NewReader(changes) - cmd.Env = envForHooks(t, cfg, repo, + cmd.Env = envForHooks(t, context.Background(), cfg, repo, glHookValues{ GLID: glID, GLUsername: glUsername, @@ -577,8 +579,8 @@ func TestCheckBadCreds(t *testing.T) { require.Regexp(t, `Checking GitLab API access: .* level=error msg="Internal API error" .* error="authorization failed" method=GET status=401 url="http://127.0.0.1:[0-9]+/api/v4/internal/check"\nFAIL`, stdout.String()) } -func runHookServiceServer(t *testing.T, cfg config.Cfg) { - runHookServiceWithGitlabClient(t, cfg, gitlab.NewMockClient()) +func runHookServiceServer(t *testing.T, cfg config.Cfg, serverOpts ...testserver.GitalyServerOpt) { + runHookServiceWithGitlabClient(t, cfg, gitlab.NewMockClient(), serverOpts...) } type featureFlagAsserter struct { @@ -617,12 +619,17 @@ func (svc featureFlagAsserter) PackObjectsHook(stream gitalypb.HookService_PackO return svc.wrapped.PackObjectsHook(stream) } -func runHookServiceWithGitlabClient(t *testing.T, cfg config.Cfg, gitlabClient gitlab.Client) { +func (svc featureFlagAsserter) PackObjectsHookWithSidechannel(ctx context.Context, req *gitalypb.PackObjectsHookWithSidechannelRequest) (*gitalypb.PackObjectsHookWithSidechannelResponse, error) { + svc.assertFlags(ctx) + return svc.wrapped.PackObjectsHookWithSidechannel(ctx, req) +} + +func runHookServiceWithGitlabClient(t *testing.T, cfg config.Cfg, gitlabClient gitlab.Client, serverOpts ...testserver.GitalyServerOpt) { testserver.RunGitalyServer(t, cfg, nil, func(srv *grpc.Server, deps *service.Dependencies) { gitalypb.RegisterHookServiceServer(srv, featureFlagAsserter{ t: t, wrapped: hook.NewServer(deps.GetCfg(), deps.GetHookManager(), deps.GetGitCmdFactory(), deps.GetPackObjectsCache()), }) - }, testserver.WithGitLabClient(gitlabClient)) + }, append(serverOpts, testserver.WithGitLabClient(gitlabClient))...) } func requireContainsOnce(t *testing.T, s string, contains string) { @@ -661,8 +668,6 @@ func TestGitalyHooksPackObjects(t *testing.T) { testhelper.BuildGitalyHooks(t, cfg) testhelper.BuildGitalySSH(t, cfg) - env := envForHooks(t, cfg, repo, glHookValues{}, proxyValues{}) - baseArgs := []string{ cfg.Git.BinPath, "clone", @@ -675,26 +680,48 @@ func TestGitalyHooksPackObjects(t *testing.T) { testCases := []struct { desc string + ctx context.Context extraArgs []string + method string }{ - {desc: "regular clone"}, - {desc: "shallow clone", extraArgs: []string{"--depth=1"}}, - {desc: "partial clone", extraArgs: []string{"--filter=blob:none"}}, + {desc: "regular clone", method: "PackObjectsHook"}, + {desc: "shallow clone", extraArgs: []string{"--depth=1"}, method: "PackObjectsHook"}, + {desc: "partial clone", extraArgs: []string{"--filter=blob:none"}, method: "PackObjectsHook"}, + { + desc: "regular clone PackObjectsHookWithSidechannel", + ctx: featureflag.IncomingCtxWithFeatureFlag(context.Background(), featureflag.PackObjectsHookWithSidechannel), + method: "PackObjectsHookWithSidechannel", + }, } for _, tc := range testCases { t.Run(tc.desc, func(t *testing.T) { - runHookServiceServer(t, cfg) + ctx := context.Background() + if tc.ctx != nil { + ctx = tc.ctx + } + + logger, hook := test.NewNullLogger() + runHookServiceServer(t, cfg, testserver.WithLogger(logger)) tempDir := testhelper.TempDir(t) args := append(baseArgs[1:], tc.extraArgs...) args = append(args, repoPath, tempDir) cmd := exec.Command(baseArgs[0], args...) - cmd.Env = env + cmd.Env = envForHooks(t, ctx, cfg, repo, glHookValues{}, proxyValues{}) cmd.Stderr = os.Stderr require.NoError(t, cmd.Run()) + + foundMethod := false + for _, e := range hook.AllEntries() { + if e.Data["grpc.service"] == "gitaly.HookService" { + require.Equal(t, tc.method, e.Data["grpc.method"]) + foundMethod = true + } + } + require.True(t, foundMethod) }) } } diff --git a/doc/README.md b/doc/README.md index fd96df56a..96fffbad1 100644 --- a/doc/README.md +++ b/doc/README.md @@ -38,7 +38,6 @@ For configuration please read [praefects configuration documentation](doc/config - [Tips for reading Git source code](reading_git_source.md) - [Serverside Git Usage](serverside_git_usage.md) - [Object Pools](object_pools.md) -- [StreamRPC](stream_rpc.md) #### RFCs diff --git a/doc/stream_rpc.md b/doc/stream_rpc.md deleted file mode 100644 index f78c6723f..000000000 --- a/doc/stream_rpc.md +++ /dev/null @@ -1,101 +0,0 @@ -# StreamRPC - -StreamRPC is a remote procedure call (RPC) protocol implemented by -Gitaly. It is used for RPC's that transfer a high volume of byte stream -data, such as the server side of `git fetch`. - -For background on why we created StreamRPC, see -https://gitlab.com/groups/gitlab-com/gl-infra/-/epics/463. - -## Design goals - -1. Give RPC handlers direct access to the underlying network socket or -TLS stream -1. Interoperate with existing Gitaly gRPC middlewares (logging, -authentication, metrics etc.) -1. Allow for efficient proxying in Praefect - -## Semantics - -A StreamRPC call has two phases: the handshake phase and the stream -phase. The structure of the handshake phase is described by the -StreamRPC protocol. The stream phase has no inherent structure as far -as StreamRPC is concerned; it is up to the RPC client and RPC handler -what they do with the stream. - -The handshake phase consists of two steps: - -1. Client sends request -1. Server sends response - -To allow for a clean transition from the handshake phase to the stream -phase, the handshake phase uses frames with length prefixes. Length -prefixes make it possible to implement the handshake without buffered -IO. When the transition to the stream phase happens, we do not have to -hand over buffered data. - -All length prefixes in the handshake phase are big-endian uint32 -values (4 bytes). Length prefixes do not include the length of the -prefix itself, so a blob `foobar` would be encoded as -`\x00\x00\x00\x06foobar`. - -### Request - -The request consists of a length prefix and a JSON object. - -The JSON object has three fields: - -1. `Method` (`string`): this is a gRPC style method name, including the -gRPC service name. -1. `Metadata` (`map[string][]string`): this contains gRPC metadata, which -can be compared to HTTP headers. It is used for authentication, -correlation ID's, etc. -1. `Message` (`string`): this field contains a base64-encoded (RFC 4648) -Protobuf message. This is here because Praefect, and some of our -middlewares, try to inspect the first request of each RPC to see what -repository etc. it targets. By having this request as part of the -protocol, we can support Praefect and gRPC middlewares in a natural -way. - -### Response - -The response is a length-prefixed empty string OR a JSON object. - -The server accepts the request and transitions to the stream phase if -and only if the frame is empty. That is, the accepting response is -`\x00\x00\x00\x00`. - -In case of a rejection, the server returns a JSON object with an error -message in the `Error` field. - -If the server rejects the request it will close the connection. - -## Relation to gRPC - -StreamRPC is designed to be embedded into a gRPC service (Gitaly). -StreamRPC RPC's are defined using Protobuf just like regular Gitaly -gRPC RPC's. From the point of view of gRPC middleware, StreamRPC RPC's -are unary methods which return an empty response message. - -```protobuf -import "google/protobuf/empty.proto"; - -service ExampleService { - rpc ExampleStream(ExampleStreamRequest) returns (google.protobuf.Empty) { - option (op_type) = { - op: ACCESSOR - }; - } -} - -message ExampleStreamRequest { - Repository repository = 1 [(target_repository)=true]; -} -``` - -The server handler may return an error after the stream phase, which -will be logged on the server, but this error cannot be transmitted to -the client. This is because the stream phase lasts until the -connection is closed. There is no way for the server to transmit the -error "after the stream phase", because the connection is then already -closed. diff --git a/internal/gitaly/hook/sidechannel.go b/internal/gitaly/hook/sidechannel.go new file mode 100644 index 000000000..18381237c --- /dev/null +++ b/internal/gitaly/hook/sidechannel.go @@ -0,0 +1,109 @@ +package hook + +import ( + "context" + "fmt" + "io/ioutil" + "net" + "os" + "path" + "time" + + gitaly_metadata "gitlab.com/gitlab-org/gitaly/v14/internal/metadata" + "google.golang.org/grpc/metadata" +) + +const ( + sidechannelHeader = "gitaly-sidechannel-socket" + sidechannelSocket = "sidechannel" +) + +type errInvalidSidechannelAddress struct{ string } + +func (e *errInvalidSidechannelAddress) Error() string { + return fmt.Sprintf("invalid side channel address: %q", e.string) +} + +// GetSidechannel looks for a sidechannel address in an incoming context +// and establishes a connection if it finds an address. +func GetSidechannel(ctx context.Context) (net.Conn, error) { + address := gitaly_metadata.GetValue(ctx, sidechannelHeader) + if path.Base(address) != sidechannelSocket { + return nil, &errInvalidSidechannelAddress{address} + } + + return net.DialTimeout("unix", address, time.Second) +} + +// SetupSidechannel creates a sidechannel listener in a tempdir and +// launches a goroutine that will run the callback if the listener +// receives a connection. The address of the listener is stored in the +// returned context, so that the caller can propagate it to a server. The +// caller must Close the SidechannelWaiter to prevent resource leaks. +func SetupSidechannel(ctx context.Context, callback func(*net.UnixConn) error) (context.Context, *SidechannelWaiter, error) { + socketDir, err := ioutil.TempDir("", "gitaly") + if err != nil { + return nil, nil, err + } + + address := path.Join(socketDir, sidechannelSocket) + l, err := net.ListenUnix("unix", &net.UnixAddr{Net: "unix", Name: address}) + if err != nil { + return nil, nil, err + } + + wt := &SidechannelWaiter{ + errC: make(chan error), + socketDir: socketDir, + listener: l, + } + go wt.run(callback) + + ctx = metadata.AppendToOutgoingContext(ctx, sidechannelHeader, address) + return ctx, wt, nil +} + +// SidechannelWaiter provides cleanup and error propagation for a +// sidechannel callback. +type SidechannelWaiter struct { + errC chan error + socketDir string + listener *net.UnixListener +} + +func (wt *SidechannelWaiter) run(callback func(*net.UnixConn) error) { + defer close(wt.errC) + + wt.errC <- func() error { + c, err := wt.listener.AcceptUnix() + if err != nil { + return err + } + defer c.Close() + + return callback(c) + }() +} + +// Close cleans up sidechannel resources. If the callback is already +// running, Close will block until the callback is done. +func (wt *SidechannelWaiter) Close() error { + // Run all cleanup actions _before_ checking errors, so that we cannot + // forget one. + cleanupErrors := []error{ + wt.listener.Close(), + os.RemoveAll(wt.socketDir), + wt.Wait(), + } + + for _, err := range cleanupErrors { + if err != nil { + return err + } + } + + return nil +} + +// Wait waits for the callback to run and returns its error value. +func (wt *SidechannelWaiter) Wait() error { return <-wt.errC } diff --git a/internal/gitaly/hook/sidechannel_test.go b/internal/gitaly/hook/sidechannel_test.go new file mode 100644 index 000000000..36dbf326e --- /dev/null +++ b/internal/gitaly/hook/sidechannel_test.go @@ -0,0 +1,60 @@ +package hook + +import ( + "context" + "io" + "io/ioutil" + "net" + "testing" + + "github.com/stretchr/testify/require" + "gitlab.com/gitlab-org/gitaly/v14/internal/helper" + "google.golang.org/grpc/metadata" +) + +func TestSidechannel(t *testing.T) { + // Client side + ctxOut, wt, err := SetupSidechannel( + context.Background(), + func(c *net.UnixConn) error { + _, err := io.WriteString(c, "ping") + return err + }, + ) + require.NoError(t, err) + defer wt.Close() + + // Server side + ctxIn := helper.OutgoingToIncoming(ctxOut) + c, err := GetSidechannel(ctxIn) + require.NoError(t, err) + defer c.Close() + + buf, err := ioutil.ReadAll(c) + require.NoError(t, err) + require.Equal(t, "ping", string(buf)) + + // Client side + require.NoError(t, wt.Wait()) +} + +func TestGetSidechannel(t *testing.T) { + testCases := []string{ + "foobar", + "sc.foo/../../bar", + "foo/../../bar", + "/etc/passwd", + } + + for _, tc := range testCases { + t.Run(tc, func(t *testing.T) { + ctx := metadata.NewIncomingContext( + context.Background(), + map[string][]string{sidechannelHeader: []string{tc}}, + ) + _, err := GetSidechannel(ctx) + require.Error(t, err) + require.Equal(t, &errInvalidSidechannelAddress{tc}, err) + }) + } +} diff --git a/internal/gitaly/hook/testdata/.gitkeep b/internal/gitaly/hook/testdata/.gitkeep new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/internal/gitaly/hook/testdata/.gitkeep diff --git a/internal/gitaly/service/blob/blobs.go b/internal/gitaly/service/blob/blobs.go index 3e6b434dd..cb6dcfc53 100644 --- a/internal/gitaly/service/blob/blobs.go +++ b/internal/gitaly/service/blob/blobs.go @@ -76,11 +76,16 @@ func (s *server) ListBlobs(req *gitalypb.ListBlobsRequest, stream gitalypb.BlobS }) if err := processBlobs(ctx, catfileProcess, catfileInfoIter, req.GetLimit(), req.GetBytesLimit(), - func(oid string, size int64, contents []byte) error { + func(oid string, size int64, contents []byte, path []byte) error { + if !req.GetWithPaths() { + path = nil + } + return chunker.Send(&gitalypb.ListBlobsResponse_Blob{ Oid: oid, Size: size, Data: contents, + Path: path, }) }, ); err != nil { @@ -100,7 +105,7 @@ func processBlobs( catfileInfoIter gitpipe.CatfileInfoIterator, blobsLimit uint32, bytesLimit int64, - callback func(oid string, size int64, contents []byte) error, + callback func(oid string, size int64, contents []byte, path []byte) error, ) error { // If we have a zero bytes limit, then the caller didn't request any blob contents at all. // We can thus skip reading blob contents completely. @@ -109,7 +114,12 @@ func processBlobs( for catfileInfoIter.Next() { blob := catfileInfoIter.Result() - if err := callback(blob.ObjectInfo.Oid.String(), blob.ObjectInfo.Size, nil); err != nil { + if err := callback( + blob.ObjectInfo.Oid.String(), + blob.ObjectInfo.Size, + nil, + blob.ObjectName, + ); err != nil { return helper.ErrInternal(fmt.Errorf("sending blob chunk: %w", err)) } @@ -140,7 +150,7 @@ func processBlobs( headerSent = true } - if err := callback(oid, size, p); err != nil { + if err := callback(oid, size, p, blob.ObjectName); err != nil { return helper.ErrInternal(fmt.Errorf("sending blob chunk: %w", err)) } @@ -168,7 +178,12 @@ func processBlobs( // itself didn't contain any data. Let's be prepared and send out the blob // header manually in that case. if !headerSent { - if err := callback(blob.ObjectInfo.Oid.String(), blob.ObjectInfo.Size, nil); err != nil { + if err := callback( + blob.ObjectInfo.Oid.String(), + blob.ObjectInfo.Size, + nil, + blob.ObjectName, + ); err != nil { return helper.ErrInternal(fmt.Errorf("sending blob chunk: %w", err)) } } @@ -234,7 +249,7 @@ func (s *server) ListAllBlobs(req *gitalypb.ListAllBlobsRequest, stream gitalypb }) if err := processBlobs(ctx, catfileProcess, catfileInfoIter, req.GetLimit(), req.GetBytesLimit(), - func(oid string, size int64, contents []byte) error { + func(oid string, size int64, contents []byte, path []byte) error { return chunker.Send(&gitalypb.ListAllBlobsResponse_Blob{ Oid: oid, Size: size, diff --git a/internal/gitaly/service/blob/blobs_test.go b/internal/gitaly/service/blob/blobs_test.go index 36118f6fd..5100564a5 100644 --- a/internal/gitaly/service/blob/blobs_test.go +++ b/internal/gitaly/service/blob/blobs_test.go @@ -50,6 +50,7 @@ func TestListBlobs(t *testing.T) { revisions []string limit uint32 bytesLimit int64 + withPaths bool expectedErr error expectedBlobs []*gitalypb.ListBlobsResponse_Blob }{ @@ -75,6 +76,18 @@ func TestListBlobs(t *testing.T) { }, }, { + desc: "single blob with paths", + revisions: []string{ + lfsPointer1, + }, + withPaths: true, + // When iterating blobs directly, we cannot deduce a path and thus don't get + // any as response. + expectedBlobs: []*gitalypb.ListBlobsResponse_Blob{ + {Oid: lfsPointer1, Size: lfsPointers[lfsPointer1].Size}, + }, + }, + { desc: "multiple blobs", revisions: []string{ lfsPointer1, @@ -97,6 +110,16 @@ func TestListBlobs(t *testing.T) { }, }, { + desc: "tree with paths", + revisions: []string{ + "b95c0fad32f4361845f91d9ce4c1721b52b82793", + }, + withPaths: true, + expectedBlobs: []*gitalypb.ListBlobsResponse_Blob{ + {Oid: "93e123ac8a3e6a0b600953d7598af629dec7b735", Size: 59, Path: []byte("branch-test.txt")}, + }, + }, + { desc: "revision range", revisions: []string{ "master", @@ -127,6 +150,18 @@ func TestListBlobs(t *testing.T) { }, }, { + desc: "revision with limit and path", + revisions: []string{ + "master", + }, + limit: 2, + withPaths: true, + expectedBlobs: []*gitalypb.ListBlobsResponse_Blob{ + {Oid: gitattributesOID, Size: gitattributesSize, Path: []byte(".gitattributes")}, + {Oid: gitignoreOID, Size: gitignoreSize, Path: []byte(".gitignore")}, + }, + }, + { desc: "revision with limit and bytes limit", revisions: []string{ "master", @@ -225,6 +260,7 @@ func TestListBlobs(t *testing.T) { Revisions: tc.revisions, Limit: tc.limit, BytesLimit: tc.bytesLimit, + WithPaths: tc.withPaths, }) require.NoError(t, err) diff --git a/internal/gitaly/service/conflicts/resolve_conflicts.go b/internal/gitaly/service/conflicts/resolve_conflicts.go index 267a3116c..ecc6ae983 100644 --- a/internal/gitaly/service/conflicts/resolve_conflicts.go +++ b/internal/gitaly/service/conflicts/resolve_conflicts.go @@ -20,7 +20,6 @@ import ( "gitlab.com/gitlab-org/gitaly/v14/internal/git/repository" "gitlab.com/gitlab-org/gitaly/v14/internal/git2go" "gitlab.com/gitlab-org/gitaly/v14/internal/helper" - "gitlab.com/gitlab-org/gitaly/v14/internal/metadata/featureflag" "gitlab.com/gitlab-org/gitaly/v14/proto/go/gitalypb" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" @@ -145,19 +144,11 @@ func (s *server) resolveConflicts(header *gitalypb.ResolveConflictsRequestHeader return err } - var quarantineRepo *localrepo.Repo - var quarantineDir *quarantine.Dir - if featureflag.QuarantinedResolveConflicts.IsEnabled(ctx) { - var err error - quarantineDir, err = quarantine.New(ctx, header.GetRepository(), s.locator) - if err != nil { - return helper.ErrInternalf("creating object quarantine: %w", err) - } - - quarantineRepo = s.localrepo(quarantineDir.QuarantinedRepo()) - } else { - quarantineRepo = s.localrepo(header.GetRepository()) + quarantineDir, err := quarantine.New(ctx, header.GetRepository(), s.locator) + if err != nil { + return helper.ErrInternalf("creating object quarantine: %w", err) } + quarantineRepo := s.localrepo(quarantineDir.QuarantinedRepo()) if err := s.repoWithBranchCommit(ctx, quarantineRepo, diff --git a/internal/gitaly/service/hook/pack_objects.go b/internal/gitaly/service/hook/pack_objects.go index 7d6cedb05..3272c0eea 100644 --- a/internal/gitaly/service/hook/pack_objects.go +++ b/internal/gitaly/service/hook/pack_objects.go @@ -19,10 +19,12 @@ import ( "github.com/sirupsen/logrus" "gitlab.com/gitlab-org/gitaly/v14/internal/git" "gitlab.com/gitlab-org/gitaly/v14/internal/git/pktline" + "gitlab.com/gitlab-org/gitaly/v14/internal/gitaly/hook" "gitlab.com/gitlab-org/gitaly/v14/internal/helper" "gitlab.com/gitlab-org/gitaly/v14/proto/go/gitalypb" "gitlab.com/gitlab-org/gitaly/v14/streamio" "google.golang.org/protobuf/encoding/protojson" + "google.golang.org/protobuf/proto" ) var ( @@ -41,10 +43,6 @@ var ( ) func (s *server) PackObjectsHook(stream gitalypb.HookService_PackObjectsHookServer) error { - if s.packObjectsCache == nil { - return helper.ErrInternalf("packObjectsCache is not available") - } - firstRequest, err := stream.Recv() if err != nil { return helper.ErrInternal(err) @@ -59,7 +57,32 @@ func (s *server) PackObjectsHook(stream gitalypb.HookService_PackObjectsHookServ return helper.ErrInvalidArgumentf("invalid pack-objects command: %v: %w", firstRequest.Args, err) } - if err := s.packObjectsHook(stream, firstRequest, args); err != nil { + stdin := streamio.NewReader(func() ([]byte, error) { + resp, err := stream.Recv() + return resp.GetStdin(), err + }) + + output := func(r io.Reader) (int64, error) { + var n int64 + err := pktline.EachSidebandPacket(r, func(band byte, data []byte) error { + resp := &gitalypb.PackObjectsHookResponse{} + + switch band { + case bandStdout: + resp.Stdout = data + case bandStderr: + resp.Stderr = data + default: + return fmt.Errorf("invalid side band: %d", band) + } + + n += int64(len(data)) + return stream.Send(resp) + }) + return n, err + } + + if err := s.packObjectsHook(stream.Context(), firstRequest.Repository, firstRequest, args, stdin, output); err != nil { return helper.ErrInternal(err) } @@ -71,10 +94,8 @@ const ( bandStderr = 2 ) -func (s *server) packObjectsHook(stream gitalypb.HookService_PackObjectsHookServer, firstRequest *gitalypb.PackObjectsHookRequest, args *packObjectsArgs) error { - ctx := stream.Context() - - data, err := protojson.Marshal(firstRequest) +func (s *server) packObjectsHook(ctx context.Context, repo *gitalypb.Repository, reqHash proto.Message, args *packObjectsArgs, stdinReader io.Reader, output func(io.Reader) (int64, error)) error { + data, err := protojson.Marshal(reqHash) if err != nil { return err } @@ -84,7 +105,7 @@ func (s *server) packObjectsHook(stream gitalypb.HookService_PackObjectsHookServ return err } - stdin, err := bufferStdin(stream, h) + stdin, err := bufferStdin(stdinReader, h) if err != nil { return err } @@ -104,7 +125,7 @@ func (s *server) packObjectsHook(stream gitalypb.HookService_PackObjectsHookServ key := hex.EncodeToString(h.Sum(nil)) r, created, err := s.packObjectsCache.FindOrCreate(key, func(w io.Writer) error { - return s.runPackObjects(ctx, w, firstRequest.Repository, args, stdin, key) + return s.runPackObjects(ctx, w, repo, args, stdin, key) }) if err != nil { return err @@ -127,21 +148,8 @@ func (s *server) packObjectsHook(stream gitalypb.HookService_PackObjectsHookServ packObjectsServedBytes.Add(float64(servedBytes)) }() - if err := pktline.EachSidebandPacket(r, func(band byte, data []byte) error { - resp := &gitalypb.PackObjectsHookResponse{} - - switch band { - case bandStdout: - resp.Stdout = data - case bandStderr: - resp.Stderr = data - default: - return fmt.Errorf("invalid side band: %d", band) - } - - servedBytes += int64(len(data)) - return stream.Send(resp) - }); err != nil { + servedBytes, err = output(r) + if err != nil { return err } @@ -298,7 +306,7 @@ func (p *packObjectsArgs) subcmd() git.SubCmd { return sc } -func bufferStdin(stream gitalypb.HookService_PackObjectsHookServer, h hash.Hash) (_ io.ReadCloser, err error) { +func bufferStdin(r io.Reader, h hash.Hash) (_ io.ReadCloser, err error) { f, err := ioutil.TempFile("", "PackObjectsHook-stdin") if err != nil { return nil, err @@ -313,15 +321,7 @@ func bufferStdin(stream gitalypb.HookService_PackObjectsHookServer, h hash.Hash) return nil, err } - stdin := io.TeeReader( - streamio.NewReader(func() ([]byte, error) { - resp, err := stream.Recv() - return resp.GetStdin(), err - }), - h, - ) - - _, err = io.Copy(f, stdin) + _, err = io.Copy(f, io.TeeReader(r, h)) if err != nil { return nil, err } @@ -343,3 +343,31 @@ func (cw *countingWriter) Write(p []byte) (int, error) { cw.N += int64(n) return n, err } + +func (s *server) PackObjectsHookWithSidechannel(ctx context.Context, req *gitalypb.PackObjectsHookWithSidechannelRequest) (*gitalypb.PackObjectsHookWithSidechannelResponse, error) { + if req.GetRepository() == nil { + return nil, helper.ErrInvalidArgument(errors.New("repository is empty")) + } + + args, err := parsePackObjectsArgs(req.Args) + if err != nil { + return nil, helper.ErrInvalidArgumentf("invalid pack-objects command: %v: %w", req.Args, err) + } + + c, err := hook.GetSidechannel(ctx) + if err != nil { + return nil, err + } + defer c.Close() + + output := func(r io.Reader) (int64, error) { return io.Copy(c, r) } + if err := s.packObjectsHook(ctx, req.Repository, req, args, c, output); err != nil { + return nil, err + } + + if err := c.Close(); err != nil { + return nil, err + } + + return &gitalypb.PackObjectsHookWithSidechannelResponse{}, nil +} diff --git a/internal/gitaly/service/hook/pack_objects_test.go b/internal/gitaly/service/hook/pack_objects_test.go index a10f1466e..b7587e086 100644 --- a/internal/gitaly/service/hook/pack_objects_test.go +++ b/internal/gitaly/service/hook/pack_objects_test.go @@ -4,6 +4,7 @@ import ( "bytes" "context" "io" + "net" "strings" "testing" "time" @@ -12,7 +13,9 @@ import ( "github.com/sirupsen/logrus/hooks/test" "github.com/stretchr/testify/require" "gitlab.com/gitlab-org/gitaly/v14/internal/git/gittest" + "gitlab.com/gitlab-org/gitaly/v14/internal/git/pktline" "gitlab.com/gitlab-org/gitaly/v14/internal/gitaly/config" + hookPkg "gitlab.com/gitlab-org/gitaly/v14/internal/gitaly/hook" "gitlab.com/gitlab-org/gitaly/v14/internal/streamcache" "gitlab.com/gitlab-org/gitaly/v14/internal/testhelper" "gitlab.com/gitlab-org/gitaly/v14/internal/testhelper/testcfg" @@ -303,3 +306,152 @@ func TestServer_PackObjectsHook_usesCache(t *testing.T) { require.NoError(t, entries[i].Err) } } + +func TestServer_PackObjectsHookWithSidechannel(t *testing.T) { + cfg, repo, repoPath := cfgWithCache(t) + + testCases := []struct { + desc string + stdin string + args []string + }{ + { + desc: "clone 1 branch", + stdin: "3dd08961455abf80ef9115f4afdc1c6f968b503c\n--not\n\n", + args: []string{"pack-objects", "--revs", "--thin", "--stdout", "--progress", "--delta-base-offset"}, + }, + { + desc: "shallow clone 1 branch", + stdin: "--shallow 1e292f8fedd741b75372e19097c76d327140c312\n1e292f8fedd741b75372e19097c76d327140c312\n--not\n\n", + args: []string{"--shallow-file", "", "pack-objects", "--revs", "--thin", "--stdout", "--shallow", "--progress", "--delta-base-offset", "--include-tag"}, + }, + } + + for _, tc := range testCases { + t.Run(tc.desc, func(t *testing.T) { + ctx, cancel := testhelper.Context() + defer cancel() + + logger, hook := test.NewNullLogger() + serverSocketPath := runHooksServer(t, cfg, nil, testserver.WithLogger(logger)) + + var packets []string + ctx, wt, err := hookPkg.SetupSidechannel( + ctx, + func(c *net.UnixConn) error { + if _, err := io.WriteString(c, tc.stdin); err != nil { + return err + } + if err := c.CloseWrite(); err != nil { + return err + } + + scanner := pktline.NewScanner(c) + for scanner.Scan() { + packets = append(packets, scanner.Text()) + } + return scanner.Err() + }, + ) + require.NoError(t, err) + defer wt.Close() + + client, conn := newHooksClient(t, serverSocketPath) + defer conn.Close() + + _, err = client.PackObjectsHookWithSidechannel(ctx, &gitalypb.PackObjectsHookWithSidechannelRequest{ + Repository: repo, + Args: tc.args, + }) + require.NoError(t, err) + + require.NoError(t, wt.Wait()) + require.NotEmpty(t, packets) + + var packdata []byte + for _, pkt := range packets { + require.Greater(t, len(pkt), 4) + + switch band := pkt[4]; band { + case 1: + packdata = append(packdata, pkt[5:]...) + case 2: + default: + t.Fatalf("unexpected band: %d", band) + } + } + + gittest.ExecStream( + t, + cfg, + bytes.NewReader(packdata), + "-C", repoPath, "index-pack", "--stdin", "--fix-thin", + ) + + for _, msg := range []string{"served bytes", "generated bytes"} { + t.Run(msg, func(t *testing.T) { + var entry *logrus.Entry + for _, e := range hook.AllEntries() { + if e.Message == msg { + entry = e + } + } + + require.NotNil(t, entry) + require.NotEmpty(t, entry.Data["cache_key"]) + require.Greater(t, entry.Data["bytes"], int64(0)) + }) + } + + t.Run("pack file compression statistic", func(t *testing.T) { + var entry *logrus.Entry + for _, e := range hook.AllEntries() { + if e.Message == "pack file compression statistic" { + entry = e + } + } + + require.NotNil(t, entry) + total := entry.Data["pack.stat"].(string) + require.True(t, strings.HasPrefix(total, "Total ")) + require.False(t, strings.Contains(total, "\n")) + }) + }) + } +} + +func TestServer_PackObjectsHookWithSidechannel_invalidArgument(t *testing.T) { + cfg, repo, _ := testcfg.BuildWithRepo(t) + serverSocketPath := runHooksServer(t, cfg, nil) + + ctx, cancel := testhelper.Context() + defer cancel() + + testCases := []struct { + desc string + req *gitalypb.PackObjectsHookWithSidechannelRequest + }{ + { + desc: "empty", + req: &gitalypb.PackObjectsHookWithSidechannelRequest{}, + }, + { + desc: "repo, no args", + req: &gitalypb.PackObjectsHookWithSidechannelRequest{Repository: repo}, + }, + { + desc: "repo, bad args", + req: &gitalypb.PackObjectsHookWithSidechannelRequest{Repository: repo, Args: []string{"rm", "-rf"}}, + }, + } + + for _, tc := range testCases { + t.Run(tc.desc, func(t *testing.T) { + client, conn := newHooksClient(t, serverSocketPath) + defer conn.Close() + + _, err := client.PackObjectsHookWithSidechannel(ctx, tc.req) + testhelper.RequireGrpcError(t, err, codes.InvalidArgument) + }) + } +} diff --git a/internal/gitaly/service/operations/branches.go b/internal/gitaly/service/operations/branches.go index 2fb9a2e03..b0dacfb46 100644 --- a/internal/gitaly/service/operations/branches.go +++ b/internal/gitaly/service/operations/branches.go @@ -6,7 +6,6 @@ import ( "gitlab.com/gitlab-org/gitaly/v14/internal/git" "gitlab.com/gitlab-org/gitaly/v14/internal/git/updateref" - "gitlab.com/gitlab-org/gitaly/v14/internal/metadata/featureflag" "gitlab.com/gitlab-org/gitaly/v14/proto/go/gitalypb" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" @@ -25,7 +24,7 @@ func (s *Server) UserCreateBranch(ctx context.Context, req *gitalypb.UserCreateB return nil, status.Errorf(codes.InvalidArgument, "empty start point") } - quarantineDir, quarantineRepo, err := s.quarantinedRepo(ctx, req.GetRepository(), featureflag.Quarantine) + quarantineDir, quarantineRepo, err := s.quarantinedRepo(ctx, req.GetRepository()) if err != nil { return nil, err } @@ -117,7 +116,7 @@ func (s *Server) UserUpdateBranch(ctx context.Context, req *gitalypb.UserUpdateB referenceName := git.NewReferenceNameFromBranchName(string(req.BranchName)) - quarantineDir, _, err := s.quarantinedRepo(ctx, req.GetRepository(), featureflag.Quarantine) + quarantineDir, _, err := s.quarantinedRepo(ctx, req.GetRepository()) if err != nil { return nil, err } diff --git a/internal/gitaly/service/operations/branches_test.go b/internal/gitaly/service/operations/branches_test.go index b99235da7..19854e913 100644 --- a/internal/gitaly/service/operations/branches_test.go +++ b/internal/gitaly/service/operations/branches_test.go @@ -13,7 +13,6 @@ import ( "gitlab.com/gitlab-org/gitaly/v14/internal/gitaly/service" "gitlab.com/gitlab-org/gitaly/v14/internal/gitaly/service/hook" "gitlab.com/gitlab-org/gitaly/v14/internal/helper" - "gitlab.com/gitlab-org/gitaly/v14/internal/metadata/featureflag" "gitlab.com/gitlab-org/gitaly/v14/internal/testhelper" "gitlab.com/gitlab-org/gitaly/v14/internal/testhelper/testassert" "gitlab.com/gitlab-org/gitaly/v14/internal/testhelper/testcfg" @@ -40,12 +39,9 @@ func (s *testTransactionServer) VoteTransaction(ctx context.Context, in *gitalyp func TestSuccessfulCreateBranchRequest(t *testing.T) { t.Parallel() - testhelper.NewFeatureSets([]featureflag.FeatureFlag{ - featureflag.Quarantine, - }).Run(t, testSuccessfulCreateBranchRequest) -} + ctx, cancel := testhelper.Context() + defer cancel() -func testSuccessfulCreateBranchRequest(t *testing.T, ctx context.Context) { ctx, cfg, repoProto, repoPath, client := setupOperationsService(t, ctx) repo := localrepo.NewTestRepo(t, cfg, repoProto) @@ -122,12 +118,9 @@ func testSuccessfulCreateBranchRequest(t *testing.T, ctx context.Context) { func TestUserCreateBranchWithTransaction(t *testing.T) { t.Parallel() - testhelper.NewFeatureSets([]featureflag.FeatureFlag{ - featureflag.Quarantine, - }).Run(t, testUserCreateBranchWithTransaction) -} + ctx, cancel := testhelper.Context() + defer cancel() -func testUserCreateBranchWithTransaction(t *testing.T, ctx context.Context) { cfg, repo, repoPath := testcfg.BuildWithRepo(t) transactionServer := &testTransactionServer{} @@ -200,12 +193,9 @@ func testUserCreateBranchWithTransaction(t *testing.T, ctx context.Context) { func TestSuccessfulGitHooksForUserCreateBranchRequest(t *testing.T) { t.Parallel() - testhelper.NewFeatureSets([]featureflag.FeatureFlag{ - featureflag.Quarantine, - }).Run(t, testSuccessfulGitHooksForUserCreateBranchRequest) -} + ctx, cancel := testhelper.Context() + defer cancel() -func testSuccessfulGitHooksForUserCreateBranchRequest(t *testing.T, ctx context.Context) { ctx, cfg, repo, repoPath, client := setupOperationsService(t, ctx) branchName := "new-branch" @@ -235,12 +225,9 @@ func testSuccessfulGitHooksForUserCreateBranchRequest(t *testing.T, ctx context. func TestSuccessfulCreateBranchRequestWithStartPointRefPrefix(t *testing.T) { t.Parallel() - testhelper.NewFeatureSets([]featureflag.FeatureFlag{ - featureflag.Quarantine, - }).Run(t, testSuccessfulCreateBranchRequestWithStartPointRefPrefix) -} + ctx, cancel := testhelper.Context() + defer cancel() -func testSuccessfulCreateBranchRequestWithStartPointRefPrefix(t *testing.T, ctx context.Context) { ctx, cfg, repoProto, repoPath, client := setupOperationsService(t, ctx) repo := localrepo.NewTestRepo(t, cfg, repoProto) @@ -313,12 +300,9 @@ func testSuccessfulCreateBranchRequestWithStartPointRefPrefix(t *testing.T, ctx func TestFailedUserCreateBranchDueToHooks(t *testing.T) { t.Parallel() - testhelper.NewFeatureSets([]featureflag.FeatureFlag{ - featureflag.Quarantine, - }).Run(t, testFailedUserCreateBranchDueToHooks) -} + ctx, cancel := testhelper.Context() + defer cancel() -func testFailedUserCreateBranchDueToHooks(t *testing.T, ctx context.Context) { ctx, _, repo, repoPath, client := setupOperationsService(t, ctx) request := &gitalypb.UserCreateBranchRequest{ @@ -343,12 +327,9 @@ func testFailedUserCreateBranchDueToHooks(t *testing.T, ctx context.Context) { func TestFailedUserCreateBranchRequest(t *testing.T) { t.Parallel() - testhelper.NewFeatureSets([]featureflag.FeatureFlag{ - featureflag.Quarantine, - }).Run(t, testFailedUserCreateBranchRequest) -} + ctx, cancel := testhelper.Context() + defer cancel() -func testFailedUserCreateBranchRequest(t *testing.T, ctx context.Context) { ctx, _, repo, _, client := setupOperationsService(t, ctx) testCases := []struct { diff --git a/internal/gitaly/service/operations/cherry_pick.go b/internal/gitaly/service/operations/cherry_pick.go index d043f19dc..bdeaa6fd4 100644 --- a/internal/gitaly/service/operations/cherry_pick.go +++ b/internal/gitaly/service/operations/cherry_pick.go @@ -10,7 +10,6 @@ import ( "gitlab.com/gitlab-org/gitaly/v14/internal/git/updateref" "gitlab.com/gitlab-org/gitaly/v14/internal/git2go" "gitlab.com/gitlab-org/gitaly/v14/internal/helper" - "gitlab.com/gitlab-org/gitaly/v14/internal/metadata/featureflag" "gitlab.com/gitlab-org/gitaly/v14/proto/go/gitalypb" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" @@ -21,7 +20,7 @@ func (s *Server) UserCherryPick(ctx context.Context, req *gitalypb.UserCherryPic return nil, status.Errorf(codes.InvalidArgument, "UserCherryPick: %v", err) } - quarantineDir, quarantineRepo, err := s.quarantinedRepo(ctx, req.GetRepository(), featureflag.Quarantine) + quarantineDir, quarantineRepo, err := s.quarantinedRepo(ctx, req.GetRepository()) if err != nil { return nil, err } diff --git a/internal/gitaly/service/operations/cherry_pick_test.go b/internal/gitaly/service/operations/cherry_pick_test.go index e86165cd0..e7e08b5d9 100644 --- a/internal/gitaly/service/operations/cherry_pick_test.go +++ b/internal/gitaly/service/operations/cherry_pick_test.go @@ -1,7 +1,6 @@ package operations import ( - "context" "fmt" "strings" "testing" @@ -10,7 +9,6 @@ import ( "gitlab.com/gitlab-org/gitaly/v14/internal/git" "gitlab.com/gitlab-org/gitaly/v14/internal/git/gittest" "gitlab.com/gitlab-org/gitaly/v14/internal/git/localrepo" - "gitlab.com/gitlab-org/gitaly/v14/internal/metadata/featureflag" "gitlab.com/gitlab-org/gitaly/v14/internal/testhelper" "gitlab.com/gitlab-org/gitaly/v14/internal/testhelper/testassert" "gitlab.com/gitlab-org/gitaly/v14/proto/go/gitalypb" @@ -21,12 +19,9 @@ import ( func TestServer_UserCherryPick_successful(t *testing.T) { t.Parallel() - testhelper.NewFeatureSets([]featureflag.FeatureFlag{ - featureflag.Quarantine, - }).Run(t, testServerUserCherryPickSuccessful) -} + ctx, cancel := testhelper.Context() + defer cancel() -func testServerUserCherryPickSuccessful(t *testing.T, ctx context.Context) { ctx, cfg, repoProto, repoPath, client := setupOperationsService(t, ctx) repo := localrepo.NewTestRepo(t, cfg, repoProto) @@ -180,12 +175,9 @@ func testServerUserCherryPickSuccessful(t *testing.T, ctx context.Context) { func TestServer_UserCherryPick_successfulGitHooks(t *testing.T) { t.Parallel() - testhelper.NewFeatureSets([]featureflag.FeatureFlag{ - featureflag.Quarantine, - }).Run(t, testServerUserCherryPickSuccessfulGitHooks) -} + ctx, cancel := testhelper.Context() + defer cancel() -func testServerUserCherryPickSuccessfulGitHooks(t *testing.T, ctx context.Context) { ctx, cfg, repoProto, repoPath, client := setupOperationsService(t, ctx) repo := localrepo.NewTestRepo(t, cfg, repoProto) @@ -223,12 +215,9 @@ func testServerUserCherryPickSuccessfulGitHooks(t *testing.T, ctx context.Contex func TestServer_UserCherryPick_stableID(t *testing.T) { t.Parallel() - testhelper.NewFeatureSets([]featureflag.FeatureFlag{ - featureflag.Quarantine, - }).Run(t, testServerUserCherryPickStableID) -} + ctx, cancel := testhelper.Context() + defer cancel() -func testServerUserCherryPickStableID(t *testing.T, ctx context.Context) { ctx, cfg, repoProto, repoPath, client := setupOperationsService(t, ctx) repo := localrepo.NewTestRepo(t, cfg, repoProto) @@ -284,12 +273,9 @@ func testServerUserCherryPickStableID(t *testing.T, ctx context.Context) { func TestServer_UserCherryPick_failedValidations(t *testing.T) { t.Parallel() - testhelper.NewFeatureSets([]featureflag.FeatureFlag{ - featureflag.Quarantine, - }).Run(t, testServerUserCherryPickFailedValidations) -} + ctx, cancel := testhelper.Context() + defer cancel() -func testServerUserCherryPickFailedValidations(t *testing.T, ctx context.Context) { ctx, cfg, repoProto, _, client := setupOperationsService(t, ctx) repo := localrepo.NewTestRepo(t, cfg, repoProto) @@ -361,12 +347,9 @@ func testServerUserCherryPickFailedValidations(t *testing.T, ctx context.Context func TestServer_UserCherryPick_failedWithPreReceiveError(t *testing.T) { t.Parallel() - testhelper.NewFeatureSets([]featureflag.FeatureFlag{ - featureflag.Quarantine, - }).Run(t, testServerUserCherryPickFailedWithPreReceiveError) -} + ctx, cancel := testhelper.Context() + defer cancel() -func testServerUserCherryPickFailedWithPreReceiveError(t *testing.T, ctx context.Context) { ctx, cfg, repoProto, repoPath, client := setupOperationsService(t, ctx) repo := localrepo.NewTestRepo(t, cfg, repoProto) @@ -401,12 +384,9 @@ func testServerUserCherryPickFailedWithPreReceiveError(t *testing.T, ctx context func TestServer_UserCherryPick_failedWithCreateTreeError(t *testing.T) { t.Parallel() - testhelper.NewFeatureSets([]featureflag.FeatureFlag{ - featureflag.Quarantine, - }).Run(t, testServerUserCherryPickFailedWithCreateTreeError) -} + ctx, cancel := testhelper.Context() + defer cancel() -func testServerUserCherryPickFailedWithCreateTreeError(t *testing.T, ctx context.Context) { ctx, cfg, repoProto, repoPath, client := setupOperationsService(t, ctx) repo := localrepo.NewTestRepo(t, cfg, repoProto) @@ -435,12 +415,9 @@ func testServerUserCherryPickFailedWithCreateTreeError(t *testing.T, ctx context func TestServer_UserCherryPick_failedWithCommitError(t *testing.T) { t.Parallel() - testhelper.NewFeatureSets([]featureflag.FeatureFlag{ - featureflag.Quarantine, - }).Run(t, testServerUserCherryPickFailedWithCommitError) -} + ctx, cancel := testhelper.Context() + defer cancel() -func testServerUserCherryPickFailedWithCommitError(t *testing.T, ctx context.Context) { ctx, cfg, repoProto, repoPath, client := setupOperationsService(t, ctx) repo := localrepo.NewTestRepo(t, cfg, repoProto) @@ -470,12 +447,9 @@ func testServerUserCherryPickFailedWithCommitError(t *testing.T, ctx context.Con func TestServer_UserCherryPick_failedWithConflict(t *testing.T) { t.Parallel() - testhelper.NewFeatureSets([]featureflag.FeatureFlag{ - featureflag.Quarantine, - }).Run(t, testServerUserCherryPickFailedWithConflict) -} + ctx, cancel := testhelper.Context() + defer cancel() -func testServerUserCherryPickFailedWithConflict(t *testing.T, ctx context.Context) { ctx, cfg, repoProto, repoPath, client := setupOperationsService(t, ctx) repo := localrepo.NewTestRepo(t, cfg, repoProto) @@ -504,12 +478,9 @@ func testServerUserCherryPickFailedWithConflict(t *testing.T, ctx context.Contex func TestServer_UserCherryPick_successfulWithGivenCommits(t *testing.T) { t.Parallel() - testhelper.NewFeatureSets([]featureflag.FeatureFlag{ - featureflag.Quarantine, - }).Run(t, testServerUserCherryPickSuccessfulWithGivenCommits) -} + ctx, cancel := testhelper.Context() + defer cancel() -func testServerUserCherryPickSuccessfulWithGivenCommits(t *testing.T, ctx context.Context) { ctx, cfg, repoProto, repoPath, client := setupOperationsService(t, ctx) repo := localrepo.NewTestRepo(t, cfg, repoProto) @@ -564,12 +535,9 @@ func testServerUserCherryPickSuccessfulWithGivenCommits(t *testing.T, ctx contex func TestServer_UserCherryPick_quarantine(t *testing.T) { t.Parallel() - testhelper.NewFeatureSets([]featureflag.FeatureFlag{ - featureflag.Quarantine, - }).Run(t, testServerUserCherryPickQuarantine) -} + ctx, cancel := testhelper.Context() + defer cancel() -func testServerUserCherryPickQuarantine(t *testing.T, ctx context.Context) { ctx, cfg, repoProto, repoPath, client := setupOperationsService(t, ctx) repo := localrepo.NewTestRepo(t, cfg, repoProto) @@ -598,7 +566,5 @@ func testServerUserCherryPickQuarantine(t *testing.T, ctx context.Context) { exists, err := repo.HasRevision(ctx, oid.Revision()+"^{commit}") require.NoError(t, err) - // The new commit will be in the target repository in case quarantines are disabled. - // Otherwise, it should've been discarded. - require.Equal(t, !featureflag.Quarantine.IsEnabled(ctx), exists) + require.False(t, exists, "quarantined commit should have been discarded") } diff --git a/internal/gitaly/service/operations/commit_files.go b/internal/gitaly/service/operations/commit_files.go index f38955e0c..7a4525ce4 100644 --- a/internal/gitaly/service/operations/commit_files.go +++ b/internal/gitaly/service/operations/commit_files.go @@ -18,7 +18,6 @@ import ( "gitlab.com/gitlab-org/gitaly/v14/internal/git2go" "gitlab.com/gitlab-org/gitaly/v14/internal/gitaly/storage" "gitlab.com/gitlab-org/gitaly/v14/internal/helper" - "gitlab.com/gitlab-org/gitaly/v14/internal/metadata/featureflag" "gitlab.com/gitlab-org/gitaly/v14/proto/go/gitalypb" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" @@ -119,7 +118,7 @@ func validatePath(rootPath, relPath string) (string, error) { } func (s *Server) userCommitFiles(ctx context.Context, header *gitalypb.UserCommitFilesRequestHeader, stream gitalypb.OperationService_UserCommitFilesServer) error { - quarantineDir, quarantineRepo, err := s.quarantinedRepo(ctx, header.GetRepository(), featureflag.Quarantine) + quarantineDir, quarantineRepo, err := s.quarantinedRepo(ctx, header.GetRepository()) if err != nil { return err } diff --git a/internal/gitaly/service/operations/commit_files_test.go b/internal/gitaly/service/operations/commit_files_test.go index 14a8985ed..0613e829a 100644 --- a/internal/gitaly/service/operations/commit_files_test.go +++ b/internal/gitaly/service/operations/commit_files_test.go @@ -16,7 +16,6 @@ import ( "gitlab.com/gitlab-org/gitaly/v14/internal/git/gittest" "gitlab.com/gitlab-org/gitaly/v14/internal/git/localrepo" "gitlab.com/gitlab-org/gitaly/v14/internal/helper/text" - "gitlab.com/gitlab-org/gitaly/v14/internal/metadata/featureflag" "gitlab.com/gitlab-org/gitaly/v14/internal/testhelper" "gitlab.com/gitlab-org/gitaly/v14/internal/testhelper/testassert" "gitlab.com/gitlab-org/gitaly/v14/proto/go/gitalypb" @@ -33,12 +32,9 @@ var ( func TestUserCommitFiles(t *testing.T) { t.Parallel() - testhelper.NewFeatureSets([]featureflag.FeatureFlag{ - featureflag.Quarantine, - }).Run(t, testUserCommitFiles) -} + ctx, cancel := testhelper.Context() + defer cancel() -func testUserCommitFiles(t *testing.T, ctx context.Context) { ctx, cfg, _, _, client := setupOperationsService(t, ctx) const ( @@ -948,12 +944,9 @@ func testUserCommitFiles(t *testing.T, ctx context.Context) { func TestUserCommitFilesStableCommitID(t *testing.T) { t.Parallel() - testhelper.NewFeatureSets([]featureflag.FeatureFlag{ - featureflag.Quarantine, - }).Run(t, testUserCommitFilesStableCommitID) -} + ctx, cancel := testhelper.Context() + defer cancel() -func testUserCommitFilesStableCommitID(t *testing.T, ctx context.Context) { ctx, cfg, _, _, client := setupOperationsService(t, ctx) repoProto, repoPath := gittest.InitRepo(t, cfg, cfg.Storages[0]) @@ -1011,12 +1004,9 @@ func testUserCommitFilesStableCommitID(t *testing.T, ctx context.Context) { func TestUserCommitFilesQuarantine(t *testing.T) { t.Parallel() - testhelper.NewFeatureSets([]featureflag.FeatureFlag{ - featureflag.Quarantine, - }).Run(t, testUserCommitFilesQuarantine) -} + ctx, cancel := testhelper.Context() + defer cancel() -func testUserCommitFilesQuarantine(t *testing.T, ctx context.Context) { ctx, cfg, _, _, client := setupOperationsService(t, ctx) repoProto, repoPath := gittest.InitRepo(t, cfg, cfg.Storages[0]) @@ -1047,20 +1037,15 @@ func testUserCommitFilesQuarantine(t *testing.T, ctx context.Context) { exists, err := repo.HasRevision(ctx, oid.Revision()+"^{commit}") require.NoError(t, err) - // The new commit will be in the target repository in case quarantines are disabled. - // Otherwise, it should've been discarded. - require.Equal(t, !featureflag.Quarantine.IsEnabled(ctx), exists) + require.False(t, exists, "quarantined commit should have been discarded") } func TestSuccessfulUserCommitFilesRequest(t *testing.T) { t.Parallel() - testhelper.NewFeatureSets([]featureflag.FeatureFlag{ - featureflag.Quarantine, - }).Run(t, testSuccessfulUserCommitFilesRequest) -} + ctx, cancel := testhelper.Context() + defer cancel() -func testSuccessfulUserCommitFilesRequest(t *testing.T, ctx context.Context) { ctx, cfg, repo, repoPath, client := setupOperationsService(t, ctx) newRepo, newRepoPath := gittest.InitRepo(t, cfg, cfg.Storages[0]) @@ -1169,12 +1154,9 @@ func testSuccessfulUserCommitFilesRequest(t *testing.T, ctx context.Context) { func TestSuccessfulUserCommitFilesRequestMove(t *testing.T) { t.Parallel() - testhelper.NewFeatureSets([]featureflag.FeatureFlag{ - featureflag.Quarantine, - }).Run(t, testSuccessfulUserCommitFilesRequestMove) -} + ctx, cancel := testhelper.Context() + defer cancel() -func testSuccessfulUserCommitFilesRequestMove(t *testing.T, ctx context.Context) { ctx, cfg, _, _, client := setupOperationsService(t, ctx) branchName := "master" @@ -1230,12 +1212,9 @@ func testSuccessfulUserCommitFilesRequestMove(t *testing.T, ctx context.Context) func TestSuccessfulUserCommitFilesRequestForceCommit(t *testing.T) { t.Parallel() - testhelper.NewFeatureSets([]featureflag.FeatureFlag{ - featureflag.Quarantine, - }).Run(t, testSuccessfulUserCommitFilesRequestForceCommit) -} + ctx, cancel := testhelper.Context() + defer cancel() -func testSuccessfulUserCommitFilesRequestForceCommit(t *testing.T, ctx context.Context) { ctx, cfg, repoProto, repoPath, client := setupOperationsService(t, ctx) repo := localrepo.NewTestRepo(t, cfg, repoProto) @@ -1280,12 +1259,9 @@ func testSuccessfulUserCommitFilesRequestForceCommit(t *testing.T, ctx context.C func TestSuccessfulUserCommitFilesRequestStartSha(t *testing.T) { t.Parallel() - testhelper.NewFeatureSets([]featureflag.FeatureFlag{ - featureflag.Quarantine, - }).Run(t, testSuccessfulUserCommitFilesRequestStartSha) -} + ctx, cancel := testhelper.Context() + defer cancel() -func testSuccessfulUserCommitFilesRequestStartSha(t *testing.T, ctx context.Context) { ctx, cfg, repoProto, _, client := setupOperationsService(t, ctx) repo := localrepo.NewTestRepo(t, cfg, repoProto) @@ -1318,21 +1294,17 @@ func testSuccessfulUserCommitFilesRequestStartSha(t *testing.T, ctx context.Cont func TestSuccessfulUserCommitFilesRequestStartShaRemoteRepository(t *testing.T) { t.Parallel() - testhelper.NewFeatureSets([]featureflag.FeatureFlag{ - featureflag.Quarantine, - }).Run(t, testSuccessfulUserCommitFilesRemoteRepositoryRequest(func(header *gitalypb.UserCommitFilesRequest) { + testSuccessfulUserCommitFilesRemoteRepositoryRequest(func(header *gitalypb.UserCommitFilesRequest) { setStartSha(header, "1e292f8fedd741b75372e19097c76d327140c312") - })) + }) } func TestSuccessfulUserCommitFilesRequestStartBranchRemoteRepository(t *testing.T) { t.Parallel() - testhelper.NewFeatureSets([]featureflag.FeatureFlag{ - featureflag.Quarantine, - }).Run(t, testSuccessfulUserCommitFilesRemoteRepositoryRequest(func(header *gitalypb.UserCommitFilesRequest) { + testSuccessfulUserCommitFilesRemoteRepositoryRequest(func(header *gitalypb.UserCommitFilesRequest) { setStartBranchName(header, []byte("master")) - })) + }) } func testSuccessfulUserCommitFilesRemoteRepositoryRequest(setHeader func(header *gitalypb.UserCommitFilesRequest)) func(*testing.T, context.Context) { @@ -1376,12 +1348,9 @@ func testSuccessfulUserCommitFilesRemoteRepositoryRequest(setHeader func(header func TestSuccessfulUserCommitFilesRequestWithSpecialCharactersInSignature(t *testing.T) { t.Parallel() - testhelper.NewFeatureSets([]featureflag.FeatureFlag{ - featureflag.Quarantine, - }).Run(t, testSuccessfulUserCommitFilesRequestWithSpecialCharactersInSignature) -} + ctx, cancel := testhelper.Context() + defer cancel() -func testSuccessfulUserCommitFilesRequestWithSpecialCharactersInSignature(t *testing.T, ctx context.Context) { ctx, cfg, _, _, client := setupOperationsService(t, ctx) repoProto, _ := gittest.InitRepo(t, cfg, cfg.Storages[0]) @@ -1432,12 +1401,9 @@ func testSuccessfulUserCommitFilesRequestWithSpecialCharactersInSignature(t *tes func TestFailedUserCommitFilesRequestDueToHooks(t *testing.T) { t.Parallel() - testhelper.NewFeatureSets([]featureflag.FeatureFlag{ - featureflag.Quarantine, - }).Run(t, testFailedUserCommitFilesRequestDueToHooks) -} + ctx, cancel := testhelper.Context() + defer cancel() -func testFailedUserCommitFilesRequestDueToHooks(t *testing.T, ctx context.Context) { ctx, _, repoProto, repoPath, client := setupOperationsService(t, ctx) branchName := "feature" @@ -1469,12 +1435,9 @@ func testFailedUserCommitFilesRequestDueToHooks(t *testing.T, ctx context.Contex func TestFailedUserCommitFilesRequestDueToIndexError(t *testing.T) { t.Parallel() - testhelper.NewFeatureSets([]featureflag.FeatureFlag{ - featureflag.Quarantine, - }).Run(t, testFailedUserCommitFilesRequestDueToIndexError) -} + ctx, cancel := testhelper.Context() + defer cancel() -func testFailedUserCommitFilesRequestDueToIndexError(t *testing.T, ctx context.Context) { ctx, _, repo, _, client := setupOperationsService(t, ctx) testCases := []struct { @@ -1537,12 +1500,9 @@ func testFailedUserCommitFilesRequestDueToIndexError(t *testing.T, ctx context.C func TestFailedUserCommitFilesRequest(t *testing.T) { t.Parallel() - testhelper.NewFeatureSets([]featureflag.FeatureFlag{ - featureflag.Quarantine, - }).Run(t, testFailedUserCommitFilesRequest) -} + ctx, cancel := testhelper.Context() + defer cancel() -func testFailedUserCommitFilesRequest(t *testing.T, ctx context.Context) { ctx, _, repo, _, client := setupOperationsService(t, ctx) branchName := "feature" diff --git a/internal/gitaly/service/operations/merge.go b/internal/gitaly/service/operations/merge.go index 7d894fb2b..49ab228e8 100644 --- a/internal/gitaly/service/operations/merge.go +++ b/internal/gitaly/service/operations/merge.go @@ -12,7 +12,6 @@ import ( "gitlab.com/gitlab-org/gitaly/v14/internal/git/updateref" "gitlab.com/gitlab-org/gitaly/v14/internal/git2go" "gitlab.com/gitlab-org/gitaly/v14/internal/helper" - "gitlab.com/gitlab-org/gitaly/v14/internal/metadata/featureflag" "gitlab.com/gitlab-org/gitaly/v14/proto/go/gitalypb" ) @@ -48,7 +47,7 @@ func (s *Server) UserMergeBranch(stream gitalypb.OperationService_UserMergeBranc return helper.ErrInvalidArgument(err) } - quarantineDir, quarantineRepo, err := s.quarantinedRepo(ctx, firstRequest.GetRepository(), featureflag.Quarantine) + quarantineDir, quarantineRepo, err := s.quarantinedRepo(ctx, firstRequest.GetRepository()) if err != nil { return err } @@ -171,7 +170,7 @@ func (s *Server) UserFFBranch(ctx context.Context, in *gitalypb.UserFFBranchRequ // While we're creating a quarantine directory, we know that it won't ever have any new // objects given that we're doing a fast-forward merge. We still want to create one such // that Rails can efficiently compute new objects. - quarantineDir, quarantineRepo, err := s.quarantinedRepo(ctx, in.GetRepository(), featureflag.Quarantine) + quarantineDir, quarantineRepo, err := s.quarantinedRepo(ctx, in.GetRepository()) if err != nil { return nil, err } diff --git a/internal/gitaly/service/operations/merge_test.go b/internal/gitaly/service/operations/merge_test.go index 6392f8f26..7647069d6 100644 --- a/internal/gitaly/service/operations/merge_test.go +++ b/internal/gitaly/service/operations/merge_test.go @@ -1,7 +1,6 @@ package operations import ( - "context" "fmt" "io/ioutil" "os" @@ -18,7 +17,6 @@ import ( "gitlab.com/gitlab-org/gitaly/v14/internal/gitaly/config" "gitlab.com/gitlab-org/gitaly/v14/internal/helper" "gitlab.com/gitlab-org/gitaly/v14/internal/helper/text" - "gitlab.com/gitlab-org/gitaly/v14/internal/metadata/featureflag" "gitlab.com/gitlab-org/gitaly/v14/internal/testhelper" "gitlab.com/gitlab-org/gitaly/v14/internal/testhelper/testassert" "gitlab.com/gitlab-org/gitaly/v14/proto/go/gitalypb" @@ -36,12 +34,9 @@ var ( func TestSuccessfulMerge(t *testing.T) { t.Parallel() - testhelper.NewFeatureSets([]featureflag.FeatureFlag{ - featureflag.Quarantine, - }).Run(t, testSuccessfulMerge) -} + ctx, cancel := testhelper.Context() + defer cancel() -func testSuccessfulMerge(t *testing.T, ctx context.Context) { ctx, cfg, repoProto, repoPath, client := setupOperationsService(t, ctx) repo := localrepo.NewTestRepo(t, cfg, repoProto) @@ -79,14 +74,8 @@ func testSuccessfulMerge(t *testing.T, ctx context.Context) { firstResponse, err := mergeBidi.Recv() require.NoError(t, err, "receive first response") - // If we've got a quarantine directory, then we shouldn't be able to read the commit before - // we have applied the merge. _, err = repo.ReadCommit(ctx, git.Revision(firstResponse.CommitId)) - if featureflag.Quarantine.IsEnabled(ctx) { - require.EqualError(t, err, localrepo.ErrObjectNotFound.Error()) - } else { - require.NoError(t, err, "look up git commit before merge is applied") - } + require.Equal(t, localrepo.ErrObjectNotFound, err, "commit should not exist in the normal repo given that it is quarantined") require.NoError(t, mergeBidi.Send(&gitalypb.UserMergeBranchRequest{Apply: true}), "apply merge") @@ -129,12 +118,9 @@ func testSuccessfulMerge(t *testing.T, ctx context.Context) { func TestUserMergeBranch_quarantine(t *testing.T) { t.Parallel() - testhelper.NewFeatureSets([]featureflag.FeatureFlag{ - featureflag.Quarantine, - }).Run(t, testUserMergeBranchQuarantine) -} + ctx, cancel := testhelper.Context() + defer cancel() -func testUserMergeBranchQuarantine(t *testing.T, ctx context.Context) { ctx, cfg, repoProto, repoPath, client := setupOperationsService(t, ctx) repo := localrepo.NewTestRepo(t, cfg, repoProto) @@ -172,20 +158,15 @@ func testUserMergeBranchQuarantine(t *testing.T, ctx context.Context) { exists, err := repo.HasRevision(ctx, oid.Revision()+"^{commit}") require.NoError(t, err) - // The new commit will be in the target repository in case quarantines are disabled. - // Otherwise, it should've been discarded. - require.Equal(t, !featureflag.Quarantine.IsEnabled(ctx), exists) + require.False(t, exists, "quarantined commit should have been discarded") } func TestSuccessfulMerge_stableMergeIDs(t *testing.T) { t.Parallel() - testhelper.NewFeatureSets([]featureflag.FeatureFlag{ - featureflag.Quarantine, - }).Run(t, testSuccessfulMergeStableMergeIDs) -} + ctx, cancel := testhelper.Context() + defer cancel() -func testSuccessfulMergeStableMergeIDs(t *testing.T, ctx context.Context) { ctx, cfg, repoProto, repoPath, client := setupOperationsService(t, ctx) repo := localrepo.NewTestRepo(t, cfg, repoProto) @@ -254,12 +235,9 @@ func testSuccessfulMergeStableMergeIDs(t *testing.T, ctx context.Context) { func TestAbortedMerge(t *testing.T) { t.Parallel() - testhelper.NewFeatureSets([]featureflag.FeatureFlag{ - featureflag.Quarantine, - }).Run(t, testAbortedMerge) -} + ctx, cancel := testhelper.Context() + defer cancel() -func testAbortedMerge(t *testing.T, ctx context.Context) { ctx, cfg, repoProto, repoPath, client := setupOperationsService(t, ctx) repo := localrepo.NewTestRepo(t, cfg, repoProto) @@ -322,12 +300,9 @@ func testAbortedMerge(t *testing.T, ctx context.Context) { func TestFailedMergeConcurrentUpdate(t *testing.T) { t.Parallel() - testhelper.NewFeatureSets([]featureflag.FeatureFlag{ - featureflag.Quarantine, - }).Run(t, testFailedMergeConcurrentUpdate) -} + ctx, cancel := testhelper.Context() + defer cancel() -func testFailedMergeConcurrentUpdate(t *testing.T, ctx context.Context) { ctx, cfg, repoProto, repoPath, client := setupOperationsService(t, ctx) repo := localrepo.NewTestRepo(t, cfg, repoProto) @@ -370,12 +345,9 @@ func testFailedMergeConcurrentUpdate(t *testing.T, ctx context.Context) { func TestUserMergeBranch_ambiguousReference(t *testing.T) { t.Parallel() - testhelper.NewFeatureSets([]featureflag.FeatureFlag{ - featureflag.Quarantine, - }).Run(t, testUserMergeBranchAmbiguousReference) -} + ctx, cancel := testhelper.Context() + defer cancel() -func testUserMergeBranchAmbiguousReference(t *testing.T, ctx context.Context) { ctx, cfg, repoProto, repoPath, client := setupOperationsService(t, ctx) repo := localrepo.NewTestRepo(t, cfg, repoProto) @@ -438,12 +410,9 @@ func testUserMergeBranchAmbiguousReference(t *testing.T, ctx context.Context) { func TestFailedMergeDueToHooks(t *testing.T) { t.Parallel() - testhelper.NewFeatureSets([]featureflag.FeatureFlag{ - featureflag.Quarantine, - }).Run(t, testFailedMergeDueToHooks) -} + ctx, cancel := testhelper.Context() + defer cancel() -func testFailedMergeDueToHooks(t *testing.T, ctx context.Context) { ctx, cfg, repo, repoPath, client := setupOperationsService(t, ctx) gittest.Exec(t, cfg, "-C", repoPath, "branch", mergeBranchName, mergeBranchHeadBefore) @@ -492,12 +461,9 @@ func testFailedMergeDueToHooks(t *testing.T, ctx context.Context) { func TestUserMergeBranch_conflict(t *testing.T) { t.Parallel() - testhelper.NewFeatureSets([]featureflag.FeatureFlag{ - featureflag.Quarantine, - }).Run(t, testUserMergeBranchConflict) -} + ctx, cancel := testhelper.Context() + defer cancel() -func testUserMergeBranchConflict(t *testing.T, ctx context.Context) { ctx, cfg, repoProto, repoPath, client := setupOperationsService(t, ctx) const mergeIntoBranch = "mergeIntoBranch" @@ -537,12 +503,9 @@ func testUserMergeBranchConflict(t *testing.T, ctx context.Context) { func TestSuccessfulUserFFBranchRequest(t *testing.T) { t.Parallel() - testhelper.NewFeatureSets([]featureflag.FeatureFlag{ - featureflag.Quarantine, - }).Run(t, testSuccessfulUserFFBranchRequest) -} + ctx, cancel := testhelper.Context() + defer cancel() -func testSuccessfulUserFFBranchRequest(t *testing.T, ctx context.Context) { ctx, cfg, repo, repoPath, client := setupOperationsService(t, ctx) commitID := "cfe32cf61b73a0d5e9f13e774abde7ff789b1660" @@ -573,12 +536,9 @@ func testSuccessfulUserFFBranchRequest(t *testing.T, ctx context.Context) { func TestFailedUserFFBranchRequest(t *testing.T) { t.Parallel() - testhelper.NewFeatureSets([]featureflag.FeatureFlag{ - featureflag.Quarantine, - }).Run(t, testFailedUserFFBranchRequest) -} + ctx, cancel := testhelper.Context() + defer cancel() -func testFailedUserFFBranchRequest(t *testing.T, ctx context.Context) { ctx, cfg, repo, repoPath, client := setupOperationsService(t, ctx) commitID := "cfe32cf61b73a0d5e9f13e774abde7ff789b1660" @@ -665,12 +625,9 @@ func testFailedUserFFBranchRequest(t *testing.T, ctx context.Context) { func TestFailedUserFFBranchDueToHooks(t *testing.T) { t.Parallel() - testhelper.NewFeatureSets([]featureflag.FeatureFlag{ - featureflag.Quarantine, - }).Run(t, testFailedUserFFBranchDueToHooks) -} + ctx, cancel := testhelper.Context() + defer cancel() -func testFailedUserFFBranchDueToHooks(t *testing.T, ctx context.Context) { ctx, cfg, repo, repoPath, client := setupOperationsService(t, ctx) commitID := "cfe32cf61b73a0d5e9f13e774abde7ff789b1660" @@ -700,12 +657,9 @@ func testFailedUserFFBranchDueToHooks(t *testing.T, ctx context.Context) { func TestUserFFBranch_ambiguousReference(t *testing.T) { t.Parallel() - testhelper.NewFeatureSets([]featureflag.FeatureFlag{ - featureflag.Quarantine, - }).Run(t, testUserFFBranchAmbiguousReference) -} + ctx, cancel := testhelper.Context() + defer cancel() -func testUserFFBranchAmbiguousReference(t *testing.T, ctx context.Context) { ctx, cfg, repo, repoPath, client := setupOperationsService(t, ctx) branchName := "test-ff-target-branch" @@ -748,8 +702,9 @@ func testUserFFBranchAmbiguousReference(t *testing.T, ctx context.Context) { func TestSuccessfulUserMergeToRefRequest(t *testing.T) { t.Parallel() - ctx, cleanup := testhelper.Context() - defer cleanup() + + ctx, cancel := testhelper.Context() + defer cancel() ctx, cfg, repoProto, repoPath, client := setupOperationsService(t, ctx) @@ -854,6 +809,7 @@ func TestSuccessfulUserMergeToRefRequest(t *testing.T) { func TestConflictsOnUserMergeToRefRequest(t *testing.T) { t.Parallel() + ctx, cleanup := testhelper.Context() defer cleanup() @@ -991,6 +947,7 @@ func buildUserMergeToRefRequest(t testing.TB, cfg config.Cfg, repo *gitalypb.Rep func TestUserMergeToRef_stableMergeID(t *testing.T) { t.Parallel() + ctx, cleanup := testhelper.Context() defer cleanup() @@ -1043,6 +1000,7 @@ func TestUserMergeToRef_stableMergeID(t *testing.T) { func TestFailedUserMergeToRefRequest(t *testing.T) { t.Parallel() + ctx, cleanup := testhelper.Context() defer cleanup() @@ -1139,6 +1097,7 @@ func TestFailedUserMergeToRefRequest(t *testing.T) { func TestUserMergeToRefIgnoreHooksRequest(t *testing.T) { t.Parallel() + ctx, cleanup := testhelper.Context() defer cleanup() diff --git a/internal/gitaly/service/operations/rebase.go b/internal/gitaly/service/operations/rebase.go index 632a5c34d..3e0baad93 100644 --- a/internal/gitaly/service/operations/rebase.go +++ b/internal/gitaly/service/operations/rebase.go @@ -11,7 +11,6 @@ import ( "gitlab.com/gitlab-org/gitaly/v14/internal/git/updateref" "gitlab.com/gitlab-org/gitaly/v14/internal/git2go" "gitlab.com/gitlab-org/gitaly/v14/internal/helper" - "gitlab.com/gitlab-org/gitaly/v14/internal/metadata/featureflag" "gitlab.com/gitlab-org/gitaly/v14/proto/go/gitalypb" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" @@ -34,7 +33,7 @@ func (s *Server) UserRebaseConfirmable(stream gitalypb.OperationService_UserReba ctx := stream.Context() - quarantineDir, quarantineRepo, err := s.quarantinedRepo(ctx, header.GetRepository(), featureflag.Quarantine) + quarantineDir, quarantineRepo, err := s.quarantinedRepo(ctx, header.GetRepository()) if err != nil { return helper.ErrInternalf("creating repo quarantine: %w", err) } diff --git a/internal/gitaly/service/operations/rebase_test.go b/internal/gitaly/service/operations/rebase_test.go index 15d3182ad..31dc79d7c 100644 --- a/internal/gitaly/service/operations/rebase_test.go +++ b/internal/gitaly/service/operations/rebase_test.go @@ -17,7 +17,6 @@ import ( "gitlab.com/gitlab-org/gitaly/v14/internal/gitaly/config" "gitlab.com/gitlab-org/gitaly/v14/internal/gitaly/transaction" "gitlab.com/gitlab-org/gitaly/v14/internal/helper" - "gitlab.com/gitlab-org/gitaly/v14/internal/metadata/featureflag" "gitlab.com/gitlab-org/gitaly/v14/internal/testhelper" "gitlab.com/gitlab-org/gitaly/v14/internal/testhelper/testassert" "gitlab.com/gitlab-org/gitaly/v14/internal/testhelper/testcfg" @@ -37,12 +36,9 @@ var ( func TestSuccessfulUserRebaseConfirmableRequest(t *testing.T) { t.Parallel() - testhelper.NewFeatureSets([]featureflag.FeatureFlag{ - featureflag.Quarantine, - }).Run(t, testSuccessfulUserRebaseConfirmableRequest) -} + ctx, cancel := testhelper.Context() + defer cancel() -func testSuccessfulUserRebaseConfirmableRequest(t *testing.T, ctx context.Context) { ctx, cfg, repoProto, repoPath, client := setupOperationsService(t, ctx) pushOptions := []string{"ci.skip", "test=value"} @@ -68,11 +64,7 @@ func testSuccessfulUserRebaseConfirmableRequest(t *testing.T, ctx context.Contex require.NoError(t, err, "receive first response") _, err = repo.ReadCommit(ctx, git.Revision(firstResponse.GetRebaseSha())) - if featureflag.Quarantine.IsEnabled(ctx) { - require.Equal(t, localrepo.ErrObjectNotFound, err) - } else { - require.NoError(t, err, "look up git commit before rebase is applied") - } + require.Equal(t, localrepo.ErrObjectNotFound, err, "commit should not exist in the normal repo given that it is quarantined") applyRequest := buildApplyRequest(true) require.NoError(t, rebaseStream.Send(applyRequest), "apply rebase") @@ -104,12 +96,9 @@ func testSuccessfulUserRebaseConfirmableRequest(t *testing.T, ctx context.Contex func TestUserRebaseConfirmableTransaction(t *testing.T) { t.Parallel() - testhelper.NewFeatureSets([]featureflag.FeatureFlag{ - featureflag.Quarantine, - }).Run(t, testUserRebaseConfirmableTransaction) -} + ctx, cancel := testhelper.Context() + defer cancel() -func testUserRebaseConfirmableTransaction(t *testing.T, ctx context.Context) { var voteCount int txManager := &transaction.MockManager{ VoteFn: func(context.Context, txinfo.Transaction, voting.Vote) error { @@ -203,12 +192,9 @@ func testUserRebaseConfirmableTransaction(t *testing.T, ctx context.Context) { func TestUserRebaseConfirmableStableCommitIDs(t *testing.T) { t.Parallel() - testhelper.NewFeatureSets([]featureflag.FeatureFlag{ - featureflag.Quarantine, - }).Run(t, testUserRebaseConfirmableStableCommitIDs) -} + ctx, cancel := testhelper.Context() + defer cancel() -func testUserRebaseConfirmableStableCommitIDs(t *testing.T, ctx context.Context) { ctx, cfg, repoProto, repoPath, client := setupOperationsService(t, ctx) cfg.Gitlab.URL = setupAndStartGitlabServer(t, gittest.GlID, "project-1", cfg) @@ -278,12 +264,9 @@ func testUserRebaseConfirmableStableCommitIDs(t *testing.T, ctx context.Context) func TestFailedRebaseUserRebaseConfirmableRequestDueToInvalidHeader(t *testing.T) { t.Parallel() - testhelper.NewFeatureSets([]featureflag.FeatureFlag{ - featureflag.Quarantine, - }).Run(t, testFailedRebaseUserRebaseConfirmableRequestDueToInvalidHeader) -} + ctx, cancel := testhelper.Context() + defer cancel() -func testFailedRebaseUserRebaseConfirmableRequestDueToInvalidHeader(t *testing.T, ctx context.Context) { ctx, cfg, repo, repoPath, client := setupOperationsService(t, ctx) repoCopy, _ := gittest.CloneRepo(t, cfg, cfg.Storages[0]) @@ -342,12 +325,9 @@ func testFailedRebaseUserRebaseConfirmableRequestDueToInvalidHeader(t *testing.T func TestAbortedUserRebaseConfirmable(t *testing.T) { t.Parallel() - testhelper.NewFeatureSets([]featureflag.FeatureFlag{ - featureflag.Quarantine, - }).Run(t, testAbortedUserRebaseConfirmable) -} + ctx, cancel := testhelper.Context() + defer cancel() -func testAbortedUserRebaseConfirmable(t *testing.T, ctx context.Context) { ctx, cfg, _, _, client := setupOperationsService(t, ctx) testCases := []struct { @@ -405,12 +385,9 @@ func testAbortedUserRebaseConfirmable(t *testing.T, ctx context.Context) { func TestFailedUserRebaseConfirmableDueToApplyBeingFalse(t *testing.T) { t.Parallel() - testhelper.NewFeatureSets([]featureflag.FeatureFlag{ - featureflag.Quarantine, - }).Run(t, testFailedUserRebaseConfirmableDueToApplyBeingFalse) -} + ctx, cancel := testhelper.Context() + defer cancel() -func testFailedUserRebaseConfirmableDueToApplyBeingFalse(t *testing.T, ctx context.Context) { ctx, cfg, repoProto, repoPath, client := setupOperationsService(t, ctx) repo := localrepo.NewTestRepo(t, cfg, repoProto) @@ -429,11 +406,7 @@ func testFailedUserRebaseConfirmableDueToApplyBeingFalse(t *testing.T, ctx conte require.NoError(t, err, "receive first response") _, err = repo.ReadCommit(ctx, git.Revision(firstResponse.GetRebaseSha())) - if featureflag.Quarantine.IsEnabled(ctx) { - require.Equal(t, localrepo.ErrObjectNotFound, err) - } else { - require.NoError(t, err, "look up git commit before rebase is applied") - } + require.Equal(t, localrepo.ErrObjectNotFound, err, "commit should not exist in the normal repo given that it is quarantined") applyRequest := buildApplyRequest(false) require.NoError(t, rebaseStream.Send(applyRequest), "apply rebase") @@ -444,11 +417,7 @@ func testFailedUserRebaseConfirmableDueToApplyBeingFalse(t *testing.T, ctx conte require.False(t, secondResponse.GetRebaseApplied(), "the second rebase is not applied") _, err = repo.ReadCommit(ctx, git.Revision(firstResponse.GetRebaseSha())) - if featureflag.Quarantine.IsEnabled(ctx) { - require.Equal(t, localrepo.ErrObjectNotFound, err) - } else { - require.NoError(t, err, "look up git commit before rebase is applied") - } + require.Equal(t, localrepo.ErrObjectNotFound, err, "commit should have been discarded") newBranchSha := getBranchSha(t, cfg, repoPath, rebaseBranchName) require.Equal(t, branchSha, newBranchSha, "branch should not change when the rebase is not applied") @@ -458,12 +427,9 @@ func testFailedUserRebaseConfirmableDueToApplyBeingFalse(t *testing.T, ctx conte func TestFailedUserRebaseConfirmableRequestDueToPreReceiveError(t *testing.T) { t.Parallel() - testhelper.NewFeatureSets([]featureflag.FeatureFlag{ - featureflag.Quarantine, - }).Run(t, testFailedUserRebaseConfirmableRequestDueToPreReceiveError) -} + ctx, cancel := testhelper.Context() + defer cancel() -func testFailedUserRebaseConfirmableRequestDueToPreReceiveError(t *testing.T, ctx context.Context) { ctx, cfg, repoProto, repoPath, client := setupOperationsService(t, ctx) repo := localrepo.NewTestRepo(t, cfg, repoProto) @@ -487,11 +453,7 @@ func testFailedUserRebaseConfirmableRequestDueToPreReceiveError(t *testing.T, ct require.NoError(t, err, "receive first response") _, err = repo.ReadCommit(ctx, git.Revision(firstResponse.GetRebaseSha())) - if featureflag.Quarantine.IsEnabled(ctx) { - require.Equal(t, localrepo.ErrObjectNotFound, err) - } else { - require.NoError(t, err, "look up git commit before rebase is applied") - } + require.Equal(t, localrepo.ErrObjectNotFound, err, "commit should not exist in the normal repo given that it is quarantined") applyRequest := buildApplyRequest(true) require.NoError(t, rebaseStream.Send(applyRequest), "apply rebase") @@ -505,11 +467,7 @@ func testFailedUserRebaseConfirmableRequestDueToPreReceiveError(t *testing.T, ct require.Equal(t, io.EOF, err) _, err = repo.ReadCommit(ctx, git.Revision(firstResponse.GetRebaseSha())) - if featureflag.Quarantine.IsEnabled(ctx) { - require.Equal(t, localrepo.ErrObjectNotFound, err) - } else { - require.NoError(t, err, "look up git commit after rebase is applied") - } + require.Equal(t, localrepo.ErrObjectNotFound, err, "commit should have been discarded") newBranchSha := getBranchSha(t, cfg, repoPath, rebaseBranchName) require.Equal(t, branchSha, newBranchSha, "branch should not change when the rebase fails due to PreReceiveError") @@ -521,12 +479,9 @@ func testFailedUserRebaseConfirmableRequestDueToPreReceiveError(t *testing.T, ct func TestFailedUserRebaseConfirmableDueToGitError(t *testing.T) { t.Parallel() - testhelper.NewFeatureSets([]featureflag.FeatureFlag{ - featureflag.Quarantine, - }).Run(t, testFailedUserRebaseConfirmableDueToGitError) -} + ctx, cancel := testhelper.Context() + defer cancel() -func testFailedUserRebaseConfirmableDueToGitError(t *testing.T, ctx context.Context) { ctx, cfg, repoProto, repoPath, client := setupOperationsService(t, ctx) repoCopyProto, _ := gittest.CloneRepo(t, cfg, cfg.Storages[0]) @@ -559,12 +514,9 @@ func getBranchSha(t *testing.T, cfg config.Cfg, repoPath string, branchName stri func TestRebaseRequestWithDeletedFile(t *testing.T) { t.Parallel() - testhelper.NewFeatureSets([]featureflag.FeatureFlag{ - featureflag.Quarantine, - }).Run(t, testRebaseRequestWithDeletedFile) -} + ctx, cancel := testhelper.Context() + defer cancel() -func testRebaseRequestWithDeletedFile(t *testing.T, ctx context.Context) { ctx, cfg, _, _, client := setupOperationsService(t, ctx) repoProto, repoPath := gittest.CloneRepo(t, cfg, cfg.Storages[0], gittest.CloneRepoOpts{ WithWorktree: true, @@ -594,11 +546,7 @@ func testRebaseRequestWithDeletedFile(t *testing.T, ctx context.Context) { require.NoError(t, err, "receive first response") _, err = repo.ReadCommit(ctx, git.Revision(firstResponse.GetRebaseSha())) - if featureflag.Quarantine.IsEnabled(ctx) { - require.Equal(t, err, localrepo.ErrObjectNotFound) - } else { - require.NoError(t, err, "look up git commit before rebase is applied") - } + require.Equal(t, localrepo.ErrObjectNotFound, err, "commit should not exist in the normal repo given that it is quarantined") applyRequest := buildApplyRequest(true) require.NoError(t, rebaseStream.Send(applyRequest), "apply rebase") @@ -623,12 +571,9 @@ func testRebaseRequestWithDeletedFile(t *testing.T, ctx context.Context) { func TestRebaseOntoRemoteBranch(t *testing.T) { t.Parallel() - testhelper.NewFeatureSets([]featureflag.FeatureFlag{ - featureflag.Quarantine, - }).Run(t, testRebaseOntoRemoteBranch) -} + ctx, cancel := testhelper.Context() + defer cancel() -func testRebaseOntoRemoteBranch(t *testing.T, ctx context.Context) { ctx, cfg, repoProto, repoPath, client := setupOperationsService(t, ctx) repo := localrepo.NewTestRepo(t, cfg, repoProto) @@ -661,11 +606,7 @@ func testRebaseOntoRemoteBranch(t *testing.T, ctx context.Context) { require.NoError(t, err, "receive first response") _, err = repo.ReadCommit(ctx, git.Revision(remoteBranchHash)) - if featureflag.Quarantine.IsEnabled(ctx) { - require.Equal(t, localrepo.ErrObjectNotFound, err) - } else { - require.NoError(t, err, "remote commit does now exist in local repository") - } + require.Equal(t, localrepo.ErrObjectNotFound, err, "commit should not exist in the normal repo given that it is quarantined") applyRequest := buildApplyRequest(true) require.NoError(t, rebaseStream.Send(applyRequest), "apply rebase") @@ -690,12 +631,9 @@ func testRebaseOntoRemoteBranch(t *testing.T, ctx context.Context) { func TestRebaseFailedWithCode(t *testing.T) { t.Parallel() - testhelper.NewFeatureSets([]featureflag.FeatureFlag{ - featureflag.Quarantine, - }).Run(t, testRebaseFailedWithCode) -} + ctx, cancel := testhelper.Context() + defer cancel() -func testRebaseFailedWithCode(t *testing.T, ctx context.Context) { ctx, cfg, repoProto, repoPath, client := setupOperationsService(t, ctx) branchSha := getBranchSha(t, cfg, repoPath, rebaseBranchName) diff --git a/internal/gitaly/service/operations/revert.go b/internal/gitaly/service/operations/revert.go index 04597ef43..d5c1e17f8 100644 --- a/internal/gitaly/service/operations/revert.go +++ b/internal/gitaly/service/operations/revert.go @@ -11,7 +11,6 @@ import ( "gitlab.com/gitlab-org/gitaly/v14/internal/git/updateref" "gitlab.com/gitlab-org/gitaly/v14/internal/git2go" "gitlab.com/gitlab-org/gitaly/v14/internal/helper" - "gitlab.com/gitlab-org/gitaly/v14/internal/metadata/featureflag" "gitlab.com/gitlab-org/gitaly/v14/proto/go/gitalypb" ) @@ -20,7 +19,7 @@ func (s *Server) UserRevert(ctx context.Context, req *gitalypb.UserRevertRequest return nil, helper.ErrInvalidArgument(err) } - quarantineDir, quarantineRepo, err := s.quarantinedRepo(ctx, req.GetRepository(), featureflag.Quarantine) + quarantineDir, quarantineRepo, err := s.quarantinedRepo(ctx, req.GetRepository()) if err != nil { return nil, err } diff --git a/internal/gitaly/service/operations/revert_test.go b/internal/gitaly/service/operations/revert_test.go index de930566d..ab432d818 100644 --- a/internal/gitaly/service/operations/revert_test.go +++ b/internal/gitaly/service/operations/revert_test.go @@ -1,7 +1,6 @@ package operations import ( - "context" "fmt" "strings" "testing" @@ -10,7 +9,6 @@ import ( "gitlab.com/gitlab-org/gitaly/v14/internal/git" "gitlab.com/gitlab-org/gitaly/v14/internal/git/gittest" "gitlab.com/gitlab-org/gitaly/v14/internal/git/localrepo" - "gitlab.com/gitlab-org/gitaly/v14/internal/metadata/featureflag" "gitlab.com/gitlab-org/gitaly/v14/internal/testhelper" "gitlab.com/gitlab-org/gitaly/v14/proto/go/gitalypb" "google.golang.org/grpc/codes" @@ -20,12 +18,9 @@ import ( func TestServer_UserRevert_successful(t *testing.T) { t.Parallel() - testhelper.NewFeatureSets([]featureflag.FeatureFlag{ - featureflag.Quarantine, - }).Run(t, testServerUserRevertSuccessful) -} + ctx, cancel := testhelper.Context() + defer cancel() -func testServerUserRevertSuccessful(t *testing.T, ctx context.Context) { ctx, cfg, repoProto, repoPath, client := setupOperationsService(t, ctx) repo := localrepo.NewTestRepo(t, cfg, repoProto) @@ -182,12 +177,9 @@ func testServerUserRevertSuccessful(t *testing.T, ctx context.Context) { func TestServer_UserRevert_quarantine(t *testing.T) { t.Parallel() - testhelper.NewFeatureSets([]featureflag.FeatureFlag{ - featureflag.Quarantine, - }).Run(t, testServerUserRevertQuarantine) -} + ctx, cancel := testhelper.Context() + defer cancel() -func testServerUserRevertQuarantine(t *testing.T, ctx context.Context) { ctx, cfg, repoProto, repoPath, client := setupOperationsService(t, ctx) repo := localrepo.NewTestRepo(t, cfg, repoProto) @@ -216,20 +208,15 @@ func testServerUserRevertQuarantine(t *testing.T, ctx context.Context) { exists, err := repo.HasRevision(ctx, oid.Revision()+"^{commit}") require.NoError(t, err) - // The new commit will be in the target repository in case quarantines are disabled. - // Otherwise, it should've been discarded. - require.Equal(t, !featureflag.Quarantine.IsEnabled(ctx), exists) + require.False(t, exists, "quarantined commit should have been discarded") } func TestServer_UserRevert_stableID(t *testing.T) { t.Parallel() - testhelper.NewFeatureSets([]featureflag.FeatureFlag{ - featureflag.Quarantine, - }).Run(t, testServerUserRevertStableID) -} + ctx, cancel := testhelper.Context() + defer cancel() -func testServerUserRevertStableID(t *testing.T, ctx context.Context) { ctx, cfg, repoProto, _, client := setupOperationsService(t, ctx) repo := localrepo.NewTestRepo(t, cfg, repoProto) @@ -283,12 +270,9 @@ func testServerUserRevertStableID(t *testing.T, ctx context.Context) { func TestServer_UserRevert_successfulIntoEmptyRepo(t *testing.T) { t.Parallel() - testhelper.NewFeatureSets([]featureflag.FeatureFlag{ - featureflag.Quarantine, - }).Run(t, testServerUserRevertSuccessfulIntoEmptyRepo) -} + ctx, cancel := testhelper.Context() + defer cancel() -func testServerUserRevertSuccessfulIntoEmptyRepo(t *testing.T, ctx context.Context) { ctx, cfg, startRepoProto, _, client := setupOperationsService(t, ctx) startRepo := localrepo.NewTestRepo(t, cfg, startRepoProto) @@ -334,12 +318,9 @@ func testServerUserRevertSuccessfulIntoEmptyRepo(t *testing.T, ctx context.Conte func TestServer_UserRevert_successfulGitHooks(t *testing.T) { t.Parallel() - testhelper.NewFeatureSets([]featureflag.FeatureFlag{ - featureflag.Quarantine, - }).Run(t, testServerUserRevertSuccessfulGitHooks) -} + ctx, cancel := testhelper.Context() + defer cancel() -func testServerUserRevertSuccessfulGitHooks(t *testing.T, ctx context.Context) { ctx, cfg, repoProto, repoPath, client := setupOperationsService(t, ctx) repo := localrepo.NewTestRepo(t, cfg, repoProto) @@ -377,12 +358,9 @@ func testServerUserRevertSuccessfulGitHooks(t *testing.T, ctx context.Context) { func TestServer_UserRevert_failuedDueToValidations(t *testing.T) { t.Parallel() - testhelper.NewFeatureSets([]featureflag.FeatureFlag{ - featureflag.Quarantine, - }).Run(t, testServerUserRevertFailuedDueToValidations) -} + ctx, cancel := testhelper.Context() + defer cancel() -func testServerUserRevertFailuedDueToValidations(t *testing.T, ctx context.Context) { ctx, cfg, repoProto, _, client := setupOperationsService(t, ctx) repo := localrepo.NewTestRepo(t, cfg, repoProto) @@ -454,12 +432,9 @@ func testServerUserRevertFailuedDueToValidations(t *testing.T, ctx context.Conte func TestServer_UserRevert_failedDueToPreReceiveError(t *testing.T) { t.Parallel() - testhelper.NewFeatureSets([]featureflag.FeatureFlag{ - featureflag.Quarantine, - }).Run(t, testServerUserRevertFailedDueToPreReceiveError) -} + ctx, cancel := testhelper.Context() + defer cancel() -func testServerUserRevertFailedDueToPreReceiveError(t *testing.T, ctx context.Context) { ctx, cfg, repoProto, repoPath, client := setupOperationsService(t, ctx) repo := localrepo.NewTestRepo(t, cfg, repoProto) @@ -494,12 +469,9 @@ func testServerUserRevertFailedDueToPreReceiveError(t *testing.T, ctx context.Co func TestServer_UserRevert_failedDueToCreateTreeErrorConflict(t *testing.T) { t.Parallel() - testhelper.NewFeatureSets([]featureflag.FeatureFlag{ - featureflag.Quarantine, - }).Run(t, testServerUserRevertFailedDueToCreateTreeErrorConflict) -} + ctx, cancel := testhelper.Context() + defer cancel() -func testServerUserRevertFailedDueToCreateTreeErrorConflict(t *testing.T, ctx context.Context) { ctx, cfg, repoProto, repoPath, client := setupOperationsService(t, ctx) repo := localrepo.NewTestRepo(t, cfg, repoProto) @@ -528,12 +500,9 @@ func testServerUserRevertFailedDueToCreateTreeErrorConflict(t *testing.T, ctx co func TestServer_UserRevert_failedDueToCreateTreeErrorEmpty(t *testing.T) { t.Parallel() - testhelper.NewFeatureSets([]featureflag.FeatureFlag{ - featureflag.Quarantine, - }).Run(t, testServerUserRevertFailedDueToCreateTreeErrorEmpty) -} + ctx, cancel := testhelper.Context() + defer cancel() -func testServerUserRevertFailedDueToCreateTreeErrorEmpty(t *testing.T, ctx context.Context) { ctx, cfg, repoProto, repoPath, client := setupOperationsService(t, ctx) repo := localrepo.NewTestRepo(t, cfg, repoProto) @@ -566,12 +535,9 @@ func testServerUserRevertFailedDueToCreateTreeErrorEmpty(t *testing.T, ctx conte func TestServer_UserRevert_failedDueToCommitError(t *testing.T) { t.Parallel() - testhelper.NewFeatureSets([]featureflag.FeatureFlag{ - featureflag.Quarantine, - }).Run(t, testServerUserRevertFailedDueToCommitError) -} + ctx, cancel := testhelper.Context() + defer cancel() -func testServerUserRevertFailedDueToCommitError(t *testing.T, ctx context.Context) { ctx, cfg, repoProto, repoPath, client := setupOperationsService(t, ctx) repo := localrepo.NewTestRepo(t, cfg, repoProto) diff --git a/internal/gitaly/service/operations/server.go b/internal/gitaly/service/operations/server.go index 24f959198..7ffe24f2d 100644 --- a/internal/gitaly/service/operations/server.go +++ b/internal/gitaly/service/operations/server.go @@ -16,7 +16,6 @@ import ( "gitlab.com/gitlab-org/gitaly/v14/internal/gitaly/rubyserver" "gitlab.com/gitlab-org/gitaly/v14/internal/gitaly/storage" "gitlab.com/gitlab-org/gitaly/v14/internal/helper" - "gitlab.com/gitlab-org/gitaly/v14/internal/metadata/featureflag" "gitlab.com/gitlab-org/gitaly/v14/proto/go/gitalypb" ) @@ -61,14 +60,8 @@ func (s *Server) localrepo(repo repository.GitRepo) *localrepo.Repo { } func (s *Server) quarantinedRepo( - ctx context.Context, repo *gitalypb.Repository, flags ...featureflag.FeatureFlag, + ctx context.Context, repo *gitalypb.Repository, ) (*quarantine.Dir, *localrepo.Repo, error) { - for _, flag := range flags { - if flag.IsDisabled(ctx) { - return nil, s.localrepo(repo), nil - } - } - quarantineDir, err := quarantine.New(ctx, repo, s.locator) if err != nil { return nil, nil, helper.ErrInternalf("creating object quarantine: %w", err) diff --git a/internal/gitaly/service/operations/squash.go b/internal/gitaly/service/operations/squash.go index 1fbee78b6..0790fa0ce 100644 --- a/internal/gitaly/service/operations/squash.go +++ b/internal/gitaly/service/operations/squash.go @@ -5,7 +5,6 @@ import ( "context" "errors" "fmt" - "strings" "github.com/grpc-ecosystem/go-grpc-middleware/logging/logrus/ctxlogrus" "gitlab.com/gitlab-org/gitaly/v14/internal/git" @@ -25,10 +24,6 @@ func (s *Server) UserSquash(ctx context.Context, req *gitalypb.UserSquashRequest return nil, helper.ErrInvalidArgumentf("UserSquash: %v", err) } - if strings.Contains(req.GetSquashId(), "/") { - return nil, helper.ErrInvalidArgument(errors.New("worktree id can't contain slashes")) - } - sha, err := s.userSquash(ctx, req) if err != nil { var gitErr gitError @@ -63,10 +58,6 @@ func validateUserSquashRequest(req *gitalypb.UserSquashRequest) error { return errors.New("empty user email") } - if req.GetSquashId() == "" { - return errors.New("empty SquashId") - } - if req.GetStartSha() == "" { return errors.New("empty StartSha") } diff --git a/internal/gitaly/service/operations/squash_test.go b/internal/gitaly/service/operations/squash_test.go index b87d348b9..784b905a9 100644 --- a/internal/gitaly/service/operations/squash_test.go +++ b/internal/gitaly/service/operations/squash_test.go @@ -62,7 +62,6 @@ func TestUserSquash_successful(t *testing.T) { request := &gitalypb.UserSquashRequest{ Repository: repoProto, User: gittest.TestUser, - SquashId: "1", Author: author, CommitMessage: commitMessage, StartSha: tc.startOID, @@ -104,7 +103,6 @@ func TestUserSquash_stableID(t *testing.T) { response, err := client.UserSquash(ctx, &gitalypb.UserSquashRequest{ Repository: repoProto, User: gittest.TestUser, - SquashId: "1", Author: author, CommitMessage: []byte("Squashed commit"), StartSha: startSha, @@ -165,7 +163,6 @@ func TestUserSquash_threeWayMerge(t *testing.T) { request := &gitalypb.UserSquashRequest{ Repository: repoProto, User: gittest.TestUser, - SquashId: "1", Author: author, CommitMessage: commitMessage, // The diff between two of these commits results in some changes to files/ruby/popen.rb @@ -202,7 +199,6 @@ func TestUserSquash_splitIndex(t *testing.T) { request := &gitalypb.UserSquashRequest{ Repository: repo, User: gittest.TestUser, - SquashId: "1", Author: author, CommitMessage: commitMessage, StartSha: startSha, @@ -255,7 +251,6 @@ func TestUserSquash_renames(t *testing.T) { request := &gitalypb.UserSquashRequest{ Repository: repoProto, User: gittest.TestUser, - SquashId: "1", Author: author, CommitMessage: commitMessage, StartSha: startCommitID, @@ -291,7 +286,6 @@ func TestUserSquash_missingFileOnTargetBranch(t *testing.T) { request := &gitalypb.UserSquashRequest{ Repository: repo, User: gittest.TestUser, - SquashId: "1", Author: author, CommitMessage: commitMessage, StartSha: conflictingStartSha, @@ -390,7 +384,6 @@ func TestUserSquash_emptyCommit(t *testing.T) { response, err := client.UserSquash(ctx, &gitalypb.UserSquashRequest{ Repository: repoProto, User: gittest.TestUser, - SquashId: "1", Author: author, CommitMessage: []byte("squashed"), StartSha: tc.theirs.String(), @@ -429,7 +422,6 @@ func TestUserSquash_validation(t *testing.T) { request: &gitalypb.UserSquashRequest{ Repository: nil, User: gittest.TestUser, - SquashId: "1", Author: gittest.TestUser, CommitMessage: commitMessage, StartSha: startSha, @@ -442,20 +434,6 @@ func TestUserSquash_validation(t *testing.T) { request: &gitalypb.UserSquashRequest{ Repository: repo, User: nil, - SquashId: "1", - Author: gittest.TestUser, - CommitMessage: commitMessage, - StartSha: startSha, - EndSha: endSha, - }, - code: codes.InvalidArgument, - }, - { - desc: "empty SquashId", - request: &gitalypb.UserSquashRequest{ - Repository: repo, - User: gittest.TestUser, - SquashId: "", Author: gittest.TestUser, CommitMessage: commitMessage, StartSha: startSha, @@ -468,7 +446,6 @@ func TestUserSquash_validation(t *testing.T) { request: &gitalypb.UserSquashRequest{ Repository: repo, User: gittest.TestUser, - SquashId: "1", Author: gittest.TestUser, CommitMessage: commitMessage, StartSha: "", @@ -481,7 +458,6 @@ func TestUserSquash_validation(t *testing.T) { request: &gitalypb.UserSquashRequest{ Repository: repo, User: gittest.TestUser, - SquashId: "1", Author: gittest.TestUser, CommitMessage: commitMessage, StartSha: startSha, @@ -494,7 +470,6 @@ func TestUserSquash_validation(t *testing.T) { request: &gitalypb.UserSquashRequest{ Repository: repo, User: gittest.TestUser, - SquashId: "1", Author: nil, CommitMessage: commitMessage, StartSha: startSha, @@ -507,7 +482,6 @@ func TestUserSquash_validation(t *testing.T) { request: &gitalypb.UserSquashRequest{ Repository: repo, User: gittest.TestUser, - SquashId: "1", Author: gittest.TestUser, CommitMessage: nil, StartSha: startSha, @@ -515,19 +489,6 @@ func TestUserSquash_validation(t *testing.T) { }, code: codes.InvalidArgument, }, - { - desc: "worktree id can't contain slashes", - request: &gitalypb.UserSquashRequest{ - Repository: repo, - User: gittest.TestUser, - SquashId: "1/2", - Author: gittest.TestUser, - CommitMessage: commitMessage, - StartSha: startSha, - EndSha: endSha, - }, - code: codes.InvalidArgument, - }, } for _, testCase := range testCases { @@ -564,7 +525,6 @@ func TestUserSquash_conflicts(t *testing.T) { response, err := client.UserSquash(ctx, &gitalypb.UserSquashRequest{ Repository: repo, - SquashId: "1", User: gittest.TestUser, Author: gittest.TestUser, CommitMessage: commitMessage, @@ -600,7 +560,6 @@ func TestUserSquash_ancestry(t *testing.T) { response, err := client.UserSquash(ctx, &gitalypb.UserSquashRequest{ Repository: repo, - SquashId: "1", User: gittest.TestUser, Author: gittest.TestUser, CommitMessage: commitMessage, @@ -632,7 +591,6 @@ func TestUserSquash_gitError(t *testing.T) { desc: "not existing start SHA", request: &gitalypb.UserSquashRequest{ Repository: repo, - SquashId: "1", User: gittest.TestUser, Author: gittest.TestUser, CommitMessage: commitMessage, @@ -647,7 +605,6 @@ func TestUserSquash_gitError(t *testing.T) { desc: "not existing end SHA", request: &gitalypb.UserSquashRequest{ Repository: repo, - SquashId: "1", User: gittest.TestUser, Author: gittest.TestUser, CommitMessage: commitMessage, @@ -662,7 +619,6 @@ func TestUserSquash_gitError(t *testing.T) { desc: "user has no name set", request: &gitalypb.UserSquashRequest{ Repository: repo, - SquashId: "1", User: &gitalypb.User{Email: gittest.TestUser.Email}, Author: gittest.TestUser, CommitMessage: commitMessage, @@ -675,7 +631,6 @@ func TestUserSquash_gitError(t *testing.T) { desc: "author has no name set", request: &gitalypb.UserSquashRequest{ Repository: repo, - SquashId: "1", User: gittest.TestUser, Author: &gitalypb.User{Email: gittest.TestUser.Email}, CommitMessage: commitMessage, diff --git a/internal/gitaly/service/operations/submodules.go b/internal/gitaly/service/operations/submodules.go index d7ed6f3c1..11aae0f32 100644 --- a/internal/gitaly/service/operations/submodules.go +++ b/internal/gitaly/service/operations/submodules.go @@ -12,7 +12,6 @@ import ( "gitlab.com/gitlab-org/gitaly/v14/internal/git/updateref" "gitlab.com/gitlab-org/gitaly/v14/internal/git2go" "gitlab.com/gitlab-org/gitaly/v14/internal/helper" - "gitlab.com/gitlab-org/gitaly/v14/internal/metadata/featureflag" "gitlab.com/gitlab-org/gitaly/v14/proto/go/gitalypb" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" @@ -61,7 +60,7 @@ func validateUserUpdateSubmoduleRequest(req *gitalypb.UserUpdateSubmoduleRequest } func (s *Server) userUpdateSubmodule(ctx context.Context, req *gitalypb.UserUpdateSubmoduleRequest) (*gitalypb.UserUpdateSubmoduleResponse, error) { - quarantineDir, quarantineRepo, err := s.quarantinedRepo(ctx, req.GetRepository(), featureflag.Quarantine) + quarantineDir, quarantineRepo, err := s.quarantinedRepo(ctx, req.GetRepository()) if err != nil { return nil, err } diff --git a/internal/gitaly/service/operations/submodules_test.go b/internal/gitaly/service/operations/submodules_test.go index 51009204d..9c8c7c7fa 100644 --- a/internal/gitaly/service/operations/submodules_test.go +++ b/internal/gitaly/service/operations/submodules_test.go @@ -2,7 +2,6 @@ package operations import ( "bytes" - "context" "fmt" "strings" "testing" @@ -12,7 +11,6 @@ import ( "gitlab.com/gitlab-org/gitaly/v14/internal/git/gittest" "gitlab.com/gitlab-org/gitaly/v14/internal/git/localrepo" "gitlab.com/gitlab-org/gitaly/v14/internal/git/lstree" - "gitlab.com/gitlab-org/gitaly/v14/internal/metadata/featureflag" "gitlab.com/gitlab-org/gitaly/v14/internal/testhelper" "gitlab.com/gitlab-org/gitaly/v14/proto/go/gitalypb" "google.golang.org/grpc/codes" @@ -22,12 +20,9 @@ import ( func TestSuccessfulUserUpdateSubmoduleRequest(t *testing.T) { t.Parallel() - testhelper.NewFeatureSets([]featureflag.FeatureFlag{ - featureflag.Quarantine, - }).Run(t, testSuccessfulUserUpdateSubmoduleRequest) -} + ctx, cancel := testhelper.Context() + defer cancel() -func testSuccessfulUserUpdateSubmoduleRequest(t *testing.T, ctx context.Context) { ctx, cfg, repoProto, repoPath, client := setupOperationsService(t, ctx) repo := localrepo.NewTestRepo(t, cfg, repoProto) @@ -109,12 +104,9 @@ func testSuccessfulUserUpdateSubmoduleRequest(t *testing.T, ctx context.Context) func TestUserUpdateSubmoduleStableID(t *testing.T) { t.Parallel() - testhelper.NewFeatureSets([]featureflag.FeatureFlag{ - featureflag.Quarantine, - }).Run(t, testUserUpdateSubmoduleStableID) -} + ctx, cancel := testhelper.Context() + defer cancel() -func testUserUpdateSubmoduleStableID(t *testing.T, ctx context.Context) { ctx, cfg, repoProto, _, client := setupOperationsService(t, ctx) repo := localrepo.NewTestRepo(t, cfg, repoProto) @@ -160,12 +152,9 @@ func testUserUpdateSubmoduleStableID(t *testing.T, ctx context.Context) { func TestUserUpdateSubmoduleQuarantine(t *testing.T) { t.Parallel() - testhelper.NewFeatureSets([]featureflag.FeatureFlag{ - featureflag.Quarantine, - }).Run(t, testUserUpdateSubmoduleQuarantine) -} + ctx, cancel := testhelper.Context() + defer cancel() -func testUserUpdateSubmoduleQuarantine(t *testing.T, ctx context.Context) { ctx, cfg, repoProto, repoPath, client := setupOperationsService(t, ctx) repo := localrepo.NewTestRepo(t, cfg, repoProto) @@ -192,20 +181,15 @@ func testUserUpdateSubmoduleQuarantine(t *testing.T, ctx context.Context) { exists, err := repo.HasRevision(ctx, oid.Revision()+"^{commit}") require.NoError(t, err) - // The new commit will be in the target repository in case quarantines are disabled. - // Otherwise, it should've been discarded. - require.Equal(t, !featureflag.Quarantine.IsEnabled(ctx), exists) + require.False(t, exists, "quarantined commit should have been discarded") } func TestFailedUserUpdateSubmoduleRequestDueToValidations(t *testing.T) { t.Parallel() - testhelper.NewFeatureSets([]featureflag.FeatureFlag{ - featureflag.Quarantine, - }).Run(t, testFailedUserUpdateSubmoduleRequestDueToValidations) -} + ctx, cancel := testhelper.Context() + defer cancel() -func testFailedUserUpdateSubmoduleRequestDueToValidations(t *testing.T, ctx context.Context) { ctx, _, repo, _, client := setupOperationsService(t, ctx) testCases := []struct { @@ -323,12 +307,9 @@ func testFailedUserUpdateSubmoduleRequestDueToValidations(t *testing.T, ctx cont func TestFailedUserUpdateSubmoduleRequestDueToInvalidBranch(t *testing.T) { t.Parallel() - testhelper.NewFeatureSets([]featureflag.FeatureFlag{ - featureflag.Quarantine, - }).Run(t, testFailedUserUpdateSubmoduleRequestDueToInvalidBranch) -} + ctx, cancel := testhelper.Context() + defer cancel() -func testFailedUserUpdateSubmoduleRequestDueToInvalidBranch(t *testing.T, ctx context.Context) { ctx, _, repo, _, client := setupOperationsService(t, ctx) request := &gitalypb.UserUpdateSubmoduleRequest{ @@ -348,12 +329,9 @@ func testFailedUserUpdateSubmoduleRequestDueToInvalidBranch(t *testing.T, ctx co func TestFailedUserUpdateSubmoduleRequestDueToInvalidSubmodule(t *testing.T) { t.Parallel() - testhelper.NewFeatureSets([]featureflag.FeatureFlag{ - featureflag.Quarantine, - }).Run(t, testFailedUserUpdateSubmoduleRequestDueToInvalidSubmodule) -} + ctx, cancel := testhelper.Context() + defer cancel() -func testFailedUserUpdateSubmoduleRequestDueToInvalidSubmodule(t *testing.T, ctx context.Context) { ctx, _, repo, _, client := setupOperationsService(t, ctx) request := &gitalypb.UserUpdateSubmoduleRequest{ @@ -373,12 +351,9 @@ func testFailedUserUpdateSubmoduleRequestDueToInvalidSubmodule(t *testing.T, ctx func TestFailedUserUpdateSubmoduleRequestDueToSameReference(t *testing.T) { t.Parallel() - testhelper.NewFeatureSets([]featureflag.FeatureFlag{ - featureflag.Quarantine, - }).Run(t, testFailedUserUpdateSubmoduleRequestDueToSameReference) -} + ctx, cancel := testhelper.Context() + defer cancel() -func testFailedUserUpdateSubmoduleRequestDueToSameReference(t *testing.T, ctx context.Context) { ctx, _, repo, _, client := setupOperationsService(t, ctx) request := &gitalypb.UserUpdateSubmoduleRequest{ @@ -401,12 +376,9 @@ func testFailedUserUpdateSubmoduleRequestDueToSameReference(t *testing.T, ctx co func TestFailedUserUpdateSubmoduleRequestDueToRepositoryEmpty(t *testing.T) { t.Parallel() - testhelper.NewFeatureSets([]featureflag.FeatureFlag{ - featureflag.Quarantine, - }).Run(t, testFailedUserUpdateSubmoduleRequestDueToRepositoryEmpty) -} + ctx, cancel := testhelper.Context() + defer cancel() -func testFailedUserUpdateSubmoduleRequestDueToRepositoryEmpty(t *testing.T, ctx context.Context) { ctx, cfg, _, _, client := setupOperationsService(t, ctx) repo, _ := gittest.InitRepo(t, cfg, cfg.Storages[0]) diff --git a/internal/gitaly/service/operations/update_branches_test.go b/internal/gitaly/service/operations/update_branches_test.go index 48e5be18d..72bc5bd4c 100644 --- a/internal/gitaly/service/operations/update_branches_test.go +++ b/internal/gitaly/service/operations/update_branches_test.go @@ -1,7 +1,6 @@ package operations import ( - "context" "crypto/sha1" "fmt" "testing" @@ -10,7 +9,6 @@ import ( "gitlab.com/gitlab-org/gitaly/v14/internal/git" "gitlab.com/gitlab-org/gitaly/v14/internal/git/gittest" "gitlab.com/gitlab-org/gitaly/v14/internal/git/localrepo" - "gitlab.com/gitlab-org/gitaly/v14/internal/metadata/featureflag" "gitlab.com/gitlab-org/gitaly/v14/internal/testhelper" "gitlab.com/gitlab-org/gitaly/v14/internal/testhelper/testassert" "gitlab.com/gitlab-org/gitaly/v14/proto/go/gitalypb" @@ -27,12 +25,9 @@ var ( func TestSuccessfulUserUpdateBranchRequest(t *testing.T) { t.Parallel() - testhelper.NewFeatureSets([]featureflag.FeatureFlag{ - featureflag.Quarantine, - }).Run(t, testSuccessfulUserUpdateBranchRequest) -} + ctx, cancel := testhelper.Context() + defer cancel() -func testSuccessfulUserUpdateBranchRequest(t *testing.T, ctx context.Context) { ctx, cfg, repoProto, repoPath, client := setupOperationsService(t, ctx) repo := localrepo.NewTestRepo(t, cfg, repoProto) @@ -107,12 +102,9 @@ func testSuccessfulUserUpdateBranchRequest(t *testing.T, ctx context.Context) { func TestSuccessfulUserUpdateBranchRequestToDelete(t *testing.T) { t.Parallel() - testhelper.NewFeatureSets([]featureflag.FeatureFlag{ - featureflag.Quarantine, - }).Run(t, testSuccessfulUserUpdateBranchRequestToDelete) -} + ctx, cancel := testhelper.Context() + defer cancel() -func testSuccessfulUserUpdateBranchRequestToDelete(t *testing.T, ctx context.Context) { ctx, cfg, repoProto, repoPath, client := setupOperationsService(t, ctx) repo := localrepo.NewTestRepo(t, cfg, repoProto) @@ -181,12 +173,9 @@ func testSuccessfulUserUpdateBranchRequestToDelete(t *testing.T, ctx context.Con func TestSuccessfulGitHooksForUserUpdateBranchRequest(t *testing.T) { t.Parallel() - testhelper.NewFeatureSets([]featureflag.FeatureFlag{ - featureflag.Quarantine, - }).Run(t, testSuccessfulGitHooksForUserUpdateBranchRequest) -} + ctx, cancel := testhelper.Context() + defer cancel() -func testSuccessfulGitHooksForUserUpdateBranchRequest(t *testing.T, ctx context.Context) { ctx, cfg, _, _, client := setupOperationsService(t, ctx) for _, hookName := range GitlabHooks { @@ -218,12 +207,9 @@ func testSuccessfulGitHooksForUserUpdateBranchRequest(t *testing.T, ctx context. func TestFailedUserUpdateBranchDueToHooks(t *testing.T) { t.Parallel() - testhelper.NewFeatureSets([]featureflag.FeatureFlag{ - featureflag.Quarantine, - }).Run(t, testFailedUserUpdateBranchDueToHooks) -} + ctx, cancel := testhelper.Context() + defer cancel() -func testFailedUserUpdateBranchDueToHooks(t *testing.T, ctx context.Context) { ctx, _, repoProto, repoPath, client := setupOperationsService(t, ctx) request := &gitalypb.UserUpdateBranchRequest{ @@ -255,12 +241,9 @@ func testFailedUserUpdateBranchDueToHooks(t *testing.T, ctx context.Context) { func TestFailedUserUpdateBranchRequest(t *testing.T) { t.Parallel() - testhelper.NewFeatureSets([]featureflag.FeatureFlag{ - featureflag.Quarantine, - }).Run(t, testFailedUserUpdateBranchRequest) -} + ctx, cancel := testhelper.Context() + defer cancel() -func testFailedUserUpdateBranchRequest(t *testing.T, ctx context.Context) { ctx, cfg, repoProto, _, client := setupOperationsService(t, ctx) revDoesntExist := fmt.Sprintf("%x", sha1.Sum([]byte("we need a non existent sha"))) diff --git a/internal/gitaly/service/ref/refs.go b/internal/gitaly/service/ref/refs.go index 2cb1ca589..91b8c8569 100644 --- a/internal/gitaly/service/ref/refs.go +++ b/internal/gitaly/service/ref/refs.go @@ -19,7 +19,6 @@ import ( "gitlab.com/gitlab-org/gitaly/v14/internal/helper" "gitlab.com/gitlab-org/gitaly/v14/internal/helper/chunk" "gitlab.com/gitlab-org/gitaly/v14/internal/helper/lines" - "gitlab.com/gitlab-org/gitaly/v14/internal/metadata/featureflag" "gitlab.com/gitlab-org/gitaly/v14/proto/go/gitalypb" "google.golang.org/protobuf/proto" ) @@ -89,52 +88,6 @@ func (t *tagSender) Send() error { }) } -func (s *server) parseAndReturnTags(ctx context.Context, repo git.RepositoryExecutor, sortField string, stream gitalypb.RefService_FindAllTagsServer) error { - flags := []git.Option{ - git.ValueFlag{Name: "--format", Value: tagFormat}, - } - if sortField != "" { - flags = append(flags, git.ValueFlag{Name: "--sort", Value: sortField}) - } - tagsCmd, err := repo.Exec(ctx, git.SubCmd{ - Name: "for-each-ref", - Flags: flags, - Args: []string{"refs/tags/"}, - }) - if err != nil { - return fmt.Errorf("for-each-ref error: %v", err) - } - - c, err := s.catfileCache.BatchProcess(ctx, repo) - if err != nil { - return fmt.Errorf("error creating catfile: %v", err) - } - - tagChunker := chunk.New(&tagSender{stream: stream}) - - scanner := bufio.NewScanner(tagsCmd) - for scanner.Scan() { - tag, err := parseTagLine(ctx, c, scanner.Text()) - if err != nil { - return fmt.Errorf("parsing tag: %v", err) - } - - if err := tagChunker.Send(tag); err != nil { - return fmt.Errorf("sending to chunker: %v", err) - } - } - - if err := tagsCmd.Wait(); err != nil { - return fmt.Errorf("tag command: %v", err) - } - - if err := tagChunker.Flush(); err != nil { - return fmt.Errorf("flushing chunker: %v", err) - } - - return nil -} - func (s *server) FindAllTags(in *gitalypb.FindAllTagsRequest, stream gitalypb.RefService_FindAllTagsServer) error { ctx := stream.Context() @@ -149,14 +102,8 @@ func (s *server) FindAllTags(in *gitalypb.FindAllTagsRequest, stream gitalypb.Re repo := s.localrepo(in.GetRepository()) - if featureflag.FindAllTagsPipeline.IsEnabled(ctx) { - if err := s.findAllTags(ctx, repo, sortField, stream); err != nil { - return helper.ErrInternal(err) - } - } else { - if err := s.parseAndReturnTags(ctx, repo, sortField, stream); err != nil { - return helper.ErrInternal(err) - } + if err := s.findAllTags(ctx, repo, sortField, stream); err != nil { + return helper.ErrInternal(err) } return nil diff --git a/internal/gitaly/service/ref/refs_test.go b/internal/gitaly/service/ref/refs_test.go index 31cec9b7a..cddc69ddf 100644 --- a/internal/gitaly/service/ref/refs_test.go +++ b/internal/gitaly/service/ref/refs_test.go @@ -19,7 +19,6 @@ import ( "gitlab.com/gitlab-org/gitaly/v14/internal/git/localrepo" "gitlab.com/gitlab-org/gitaly/v14/internal/git/updateref" "gitlab.com/gitlab-org/gitaly/v14/internal/helper" - "gitlab.com/gitlab-org/gitaly/v14/internal/metadata/featureflag" "gitlab.com/gitlab-org/gitaly/v14/internal/testhelper" "gitlab.com/gitlab-org/gitaly/v14/internal/testhelper/testassert" "gitlab.com/gitlab-org/gitaly/v14/internal/testhelper/testcfg" @@ -422,17 +421,14 @@ func TestInvalidRepoFindDefaultBranchNameRequest(t *testing.T) { } func TestSuccessfulFindAllTagsRequest(t *testing.T) { - testhelper.NewFeatureSets([]featureflag.FeatureFlag{ - featureflag.FindAllTagsPipeline, - }).Run(t, testSuccessfulFindAllTagsRequest) -} - -func testSuccessfulFindAllTagsRequest(t *testing.T, ctx context.Context) { cfg, client := setupRefServiceWithoutRepo(t) repoProto, repoPath := gittest.CloneRepo(t, cfg, cfg.Storages[0]) repo := localrepo.NewTestRepo(t, cfg, repoProto) + ctx, cancel := testhelper.Context() + defer cancel() + // reconstruct the v1.1.2 tag from patches to test truncated tag message // with partial PGP block truncatedPGPTagMsg := testhelper.MustReadFile(t, "testdata/truncated_pgp_msg.patch") @@ -622,14 +618,11 @@ func testSuccessfulFindAllTagsRequest(t *testing.T, ctx context.Context) { } func TestFindAllTagsNestedTags(t *testing.T) { - testhelper.NewFeatureSets([]featureflag.FeatureFlag{ - featureflag.FindAllTagsPipeline, - }).Run(t, testFindAllTagsNestedTags) -} - -func testFindAllTagsNestedTags(t *testing.T, ctx context.Context) { cfg, client := setupRefServiceWithoutRepo(t) + ctx, cancel := testhelper.Context() + defer cancel() + repoProto, repoPath := gittest.InitRepo(t, cfg, cfg.Storages[0]) commitID := gittest.WriteCommit(t, cfg, repoPath, @@ -759,14 +752,11 @@ func TestFindAllTags_duplicateAnnotatedTags(t *testing.T) { } func TestFindAllTagNestedTags(t *testing.T) { - testhelper.NewFeatureSets([]featureflag.FeatureFlag{ - featureflag.FindAllTagsPipeline, - }).Run(t, testFindAllTagNestedTags) -} - -func testFindAllTagNestedTags(t *testing.T, ctx context.Context) { cfg, client := setupRefServiceWithoutRepo(t) + ctx, cancel := testhelper.Context() + defer cancel() + repoProto, repoPath := gittest.CloneRepo(t, cfg, cfg.Storages[0]) repo := localrepo.NewTestRepo(t, cfg, repoProto) @@ -833,13 +823,7 @@ func testFindAllTagNestedTags(t *testing.T, ctx context.Context) { }, } - // With the non-pipeline code, we used to manually peel tags - // recursively until we hit a non-tag object. This was hugely - // expensive: git can do this for us via `^{}`, which - // opportunistically peels any tag objects for us. This is a lot - // more efficient, and thus we don't have the previous limitations - // anymore with the new code which does use this. - if info.Type == "commit" && (depth < catfile.MaxTagReferenceDepth || featureflag.FindAllTagsPipeline.IsEnabled(ctx)) { + if info.Type == "commit" { commit, err := catfile.GetCommit(ctx, batch, git.Revision(tc.originalOid)) require.NoError(t, err) expectedTag.TargetCommit = commit @@ -872,14 +856,11 @@ func testFindAllTagNestedTags(t *testing.T, ctx context.Context) { } func TestInvalidFindAllTagsRequest(t *testing.T) { - testhelper.NewFeatureSets([]featureflag.FeatureFlag{ - featureflag.FindAllTagsPipeline, - }).Run(t, testInvalidFindAllTagsRequest) -} - -func testInvalidFindAllTagsRequest(t *testing.T, ctx context.Context) { _, client := setupRefServiceWithoutRepo(t) + ctx, cancel := testhelper.Context() + defer cancel() + testCases := []struct { desc string request *gitalypb.FindAllTagsRequest @@ -915,14 +896,11 @@ func testInvalidFindAllTagsRequest(t *testing.T, ctx context.Context) { } func TestFindAllTagsSorted(t *testing.T) { - testhelper.NewFeatureSets([]featureflag.FeatureFlag{ - featureflag.FindAllTagsPipeline, - }).Run(t, testFindAllTagsSorted) -} - -func testFindAllTagsSorted(t *testing.T, ctx context.Context) { cfg, client := setupRefServiceWithoutRepo(t) + ctx, cancel := testhelper.Context() + defer cancel() + repoProto, _ := gittest.CloneRepo(t, cfg, cfg.Storages[0]) repo := localrepo.New(git.NewExecCommandFactory(cfg), catfile.NewCache(cfg), repoProto, cfg) diff --git a/internal/gitaly/service/remote/fetch_internal_remote_test.go b/internal/gitaly/service/remote/fetch_internal_remote_test.go index 7d6d2cd7e..999153da7 100644 --- a/internal/gitaly/service/remote/fetch_internal_remote_test.go +++ b/internal/gitaly/service/remote/fetch_internal_remote_test.go @@ -183,7 +183,6 @@ func TestSuccessfulFetchInternalRemote(t *testing.T) { localAddr := testserver.RunGitalyServer(t, localCfg, nil, func(srv *grpc.Server, deps *service.Dependencies) { gitalypb.RegisterRemoteServiceServer(srv, NewServer( deps.GetCfg(), - deps.GetRubyServer(), deps.GetLocator(), deps.GetGitCmdFactory(), deps.GetCatfileCache(), diff --git a/internal/gitaly/service/remote/find_remote_repository.go b/internal/gitaly/service/remote/find_remote_repository.go new file mode 100644 index 000000000..fa78d023a --- /dev/null +++ b/internal/gitaly/service/remote/find_remote_repository.go @@ -0,0 +1,48 @@ +package remote + +import ( + "bytes" + "context" + "io/ioutil" + + "gitlab.com/gitlab-org/gitaly/v14/internal/git" + "gitlab.com/gitlab-org/gitaly/v14/proto/go/gitalypb" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" +) + +func (s *server) FindRemoteRepository(ctx context.Context, req *gitalypb.FindRemoteRepositoryRequest) (*gitalypb.FindRemoteRepositoryResponse, error) { + if req.GetRemote() == "" { + return nil, status.Error(codes.InvalidArgument, "FindRemoteRepository: empty remote can't be checked.") + } + + cmd, err := s.gitCmdFactory.NewWithoutRepo(ctx, + git.SubCmd{ + Name: "ls-remote", + Args: []string{ + req.GetRemote(), + "HEAD", + }, + }, + ) + + if err != nil { + return nil, status.Errorf(codes.Internal, "error executing git command: %s", err) + } + + output, err := ioutil.ReadAll(cmd) + if err != nil { + return nil, status.Errorf(codes.Internal, "unable to read stdout: %s", err) + } + if err := cmd.Wait(); err != nil { + return &gitalypb.FindRemoteRepositoryResponse{Exists: false}, nil + } + + // The output of a successful command is structured like + // Regexp would've read better, but this is faster + // 58fbff2e0d3b620f591a748c158799ead87b51cd HEAD + fields := bytes.Fields(output) + match := len(fields) == 2 && len(fields[0]) == 40 && string(fields[1]) == "HEAD" + + return &gitalypb.FindRemoteRepositoryResponse{Exists: match}, nil +} diff --git a/internal/gitaly/service/remote/find_remote_repository_test.go b/internal/gitaly/service/remote/find_remote_repository_test.go new file mode 100644 index 000000000..d19f6dc4d --- /dev/null +++ b/internal/gitaly/service/remote/find_remote_repository_test.go @@ -0,0 +1,65 @@ +package remote + +import ( + "bytes" + "io" + "net/http" + "net/http/httptest" + "testing" + + "github.com/stretchr/testify/require" + "gitlab.com/gitlab-org/gitaly/v14/internal/testhelper" + "gitlab.com/gitlab-org/gitaly/v14/proto/go/gitalypb" + "google.golang.org/grpc/codes" +) + +func TestFindRemoteRepository(t *testing.T) { + t.Parallel() + _, repo, _, client := setupRemoteService(t) + + ctx, cancel := testhelper.Context() + defer cancel() + + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + infoRefs := testhelper.MustReadFile(t, "testdata/lsremotedata.txt") + w.Header().Set("Content-Type", "application/x-git-upload-pack-advertisement") + _, err := io.Copy(w, bytes.NewReader(infoRefs)) + require.NoError(t, err) + })) + defer ts.Close() + + resp, err := client.FindRemoteRepository(ctx, &gitalypb.FindRemoteRepositoryRequest{Remote: ts.URL, StorageName: repo.GetStorageName()}) + require.NoError(t, err) + + require.True(t, resp.Exists) +} + +func TestFailedFindRemoteRepository(t *testing.T) { + t.Parallel() + _, repo, _, client := setupRemoteService(t) + + ctx, cancel := testhelper.Context() + defer cancel() + + testCases := []struct { + description string + remote string + exists bool + code codes.Code + }{ + {"non existing remote", "http://example.com/test.git", false, codes.OK}, + {"empty remote", "", false, codes.InvalidArgument}, + } + + for _, tc := range testCases { + resp, err := client.FindRemoteRepository(ctx, &gitalypb.FindRemoteRepositoryRequest{Remote: tc.remote, StorageName: repo.GetStorageName()}) + if tc.code == codes.OK { + require.NoError(t, err) + } else { + testhelper.RequireGrpcError(t, err, tc.code) + continue + } + + require.Equal(t, tc.exists, resp.GetExists(), tc.description) + } +} diff --git a/internal/gitaly/service/remote/find_remote_root_ref.go b/internal/gitaly/service/remote/find_remote_root_ref.go index dc4302783..fb2f0adf0 100644 --- a/internal/gitaly/service/remote/find_remote_root_ref.go +++ b/internal/gitaly/service/remote/find_remote_root_ref.go @@ -16,28 +16,22 @@ import ( const headPrefix = "HEAD branch: " func (s *server) findRemoteRootRef(ctx context.Context, request *gitalypb.FindRemoteRootRefRequest) (string, error) { - remoteName := request.Remote // nolint:staticcheck - var config []git.ConfigPair - - if request.RemoteUrl != "" { - remoteName = "inmemory" - config = []git.ConfigPair{ - {Key: "remote.inmemory.url", Value: request.RemoteUrl}, - } + config := []git.ConfigPair{ + {Key: "remote.inmemory.url", Value: request.RemoteUrl}, + } - if authHeader := request.GetHttpAuthorizationHeader(); authHeader != "" { - config = append(config, git.ConfigPair{ - Key: fmt.Sprintf("http.%s.extraHeader", request.RemoteUrl), - Value: "Authorization: " + authHeader, - }) - } + if authHeader := request.GetHttpAuthorizationHeader(); authHeader != "" { + config = append(config, git.ConfigPair{ + Key: fmt.Sprintf("http.%s.extraHeader", request.RemoteUrl), + Value: "Authorization: " + authHeader, + }) } cmd, err := s.gitCmdFactory.New(ctx, request.Repository, git.SubSubCmd{ Name: "remote", Action: "show", - Args: []string{remoteName}, + Args: []string{"inmemory"}, }, git.WithRefTxHook(ctx, request.Repository, s.cfg), git.WithConfigEnv(config...), @@ -72,13 +66,8 @@ func (s *server) findRemoteRootRef(ctx context.Context, request *gitalypb.FindRe // FindRemoteRootRef queries the remote to determine its HEAD func (s *server) FindRemoteRootRef(ctx context.Context, in *gitalypb.FindRemoteRootRefRequest) (*gitalypb.FindRemoteRootRefResponse, error) { - //nolint:staticcheck // GetRemote() is deprecated - if in.GetRemote() == "" && in.GetRemoteUrl() == "" { - return nil, status.Error(codes.InvalidArgument, "got neither remote name nor URL") - } - //nolint:staticcheck // GetRemote() is deprecated - if in.GetRemote() != "" && in.GetRemoteUrl() != "" { - return nil, status.Error(codes.InvalidArgument, "got remote name and URL") + if in.GetRemoteUrl() == "" { + return nil, status.Error(codes.InvalidArgument, "missing remote URL") } if in.Repository == nil { return nil, status.Error(codes.InvalidArgument, "missing repository") diff --git a/internal/gitaly/service/remote/find_remote_root_ref_test.go b/internal/gitaly/service/remote/find_remote_root_ref_test.go index 0e352b85d..fbb080042 100644 --- a/internal/gitaly/service/remote/find_remote_root_ref_test.go +++ b/internal/gitaly/service/remote/find_remote_root_ref_test.go @@ -24,10 +24,6 @@ func TestFindRemoteRootRefSuccess(t *testing.T) { request *gitalypb.FindRemoteRootRefRequest }{ { - desc: "with remote name", - request: &gitalypb.FindRemoteRootRefRequest{Repository: repo, Remote: "origin"}, - }, - { desc: "with remote URL", request: &gitalypb.FindRemoteRootRefRequest{Repository: repo, RemoteUrl: originURL}, }, @@ -66,14 +62,12 @@ func TestFindRemoteRootRefWithUnbornRemoteHead(t *testing.T) { ctx, cancel := testhelper.Context() defer cancel() - for _, request := range []*gitalypb.FindRemoteRootRefRequest{ - &gitalypb.FindRemoteRootRefRequest{Repository: remoteRepo, Remote: "foo"}, - &gitalypb.FindRemoteRootRefRequest{Repository: remoteRepo, RemoteUrl: "file://" + clientRepoPath}, - } { - response, err := client.FindRemoteRootRef(ctx, request) - testassert.GrpcEqualErr(t, status.Error(codes.NotFound, "no remote HEAD found"), err) - require.Nil(t, response) - } + response, err := client.FindRemoteRootRef(ctx, &gitalypb.FindRemoteRootRefRequest{ + Repository: remoteRepo, + RemoteUrl: "file://" + clientRepoPath}, + ) + testassert.GrpcEqualErr(t, status.Error(codes.NotFound, "no remote HEAD found"), err) + require.Nil(t, response) } func TestFindRemoteRootRefFailedDueToValidation(t *testing.T) { @@ -91,7 +85,7 @@ func TestFindRemoteRootRefFailedDueToValidation(t *testing.T) { desc: "Invalid repository", request: &gitalypb.FindRemoteRootRefRequest{ Repository: invalidRepo, - Remote: "remote-name", + RemoteUrl: "remote-url", }, expectedErr: []error{ status.Error(codes.InvalidArgument, "GetStorageByName: no such storage: \"fake\""), @@ -101,7 +95,7 @@ func TestFindRemoteRootRefFailedDueToValidation(t *testing.T) { { desc: "Repository is nil", request: &gitalypb.FindRemoteRootRefRequest{ - Remote: "remote-name", + RemoteUrl: "remote-url", }, expectedErr: []error{ status.Error(codes.InvalidArgument, "missing repository"), @@ -109,23 +103,12 @@ func TestFindRemoteRootRefFailedDueToValidation(t *testing.T) { }, }, { - desc: "Remote name and URL is empty", - request: &gitalypb.FindRemoteRootRefRequest{ - Repository: repo, - }, - expectedErr: []error{ - status.Error(codes.InvalidArgument, "got neither remote name nor URL"), - }, - }, - { - desc: "Remote name and URL is set", + desc: "Remote URL is empty", request: &gitalypb.FindRemoteRootRefRequest{ Repository: repo, - Remote: "remote-name", - RemoteUrl: "remote-url", }, expectedErr: []error{ - status.Error(codes.InvalidArgument, "got remote name and URL"), + status.Error(codes.InvalidArgument, "missing remote URL"), }, }, } @@ -149,15 +132,6 @@ func TestFindRemoteRootRefFailedDueToInvalidRemote(t *testing.T) { t.Parallel() _, repo, _, client := setupRemoteService(t) - t.Run("invalid remote name", func(t *testing.T) { - request := &gitalypb.FindRemoteRootRefRequest{Repository: repo, Remote: "invalid"} - ctx, cancel := testhelper.Context() - defer cancel() - - _, err := client.FindRemoteRootRef(ctx, request) - testhelper.RequireGrpcError(t, err, codes.Internal) - }) - t.Run("invalid remote URL", func(t *testing.T) { fakeRepoDir := testhelper.TempDir(t) diff --git a/internal/gitaly/service/remote/remotes.go b/internal/gitaly/service/remote/remotes.go deleted file mode 100644 index cc2392521..000000000 --- a/internal/gitaly/service/remote/remotes.go +++ /dev/null @@ -1,168 +0,0 @@ -package remote - -import ( - "bytes" - "context" - "fmt" - "io" - "io/ioutil" - "strings" - - "gitlab.com/gitlab-org/gitaly/v14/internal/git" - "gitlab.com/gitlab-org/gitaly/v14/internal/gitaly/rubyserver" - "gitlab.com/gitlab-org/gitaly/v14/internal/gitaly/transaction" - "gitlab.com/gitlab-org/gitaly/v14/internal/helper" - "gitlab.com/gitlab-org/gitaly/v14/internal/transaction/txinfo" - "gitlab.com/gitlab-org/gitaly/v14/internal/transaction/voting" - "gitlab.com/gitlab-org/gitaly/v14/proto/go/gitalypb" - "google.golang.org/grpc/codes" - "google.golang.org/grpc/status" -) - -// AddRemote adds a remote to the repository -func (s *server) AddRemote(ctx context.Context, req *gitalypb.AddRemoteRequest) (*gitalypb.AddRemoteResponse, error) { - if err := validateAddRemoteRequest(req); err != nil { - return nil, status.Errorf(codes.InvalidArgument, "AddRemote: %v", err) - } - - client, err := s.ruby.RemoteServiceClient(ctx) - if err != nil { - return nil, err - } - - clientCtx, err := rubyserver.SetHeaders(ctx, s.locator, req.GetRepository()) - if err != nil { - return nil, err - } - - if err := s.voteOnRemote(ctx, req.GetRepository(), req.GetName()); err != nil { - return nil, helper.ErrInternalf("preimage vote on remote: %v", err) - } - - response, err := client.AddRemote(clientCtx, req) - if err != nil { - return nil, err - } - - if err := s.voteOnRemote(ctx, req.GetRepository(), req.GetName()); err != nil { - return nil, helper.ErrInternalf("postimage vote on remote: %v", err) - } - - return response, nil -} - -func validateAddRemoteRequest(req *gitalypb.AddRemoteRequest) error { - if strings.TrimSpace(req.GetName()) == "" { - return fmt.Errorf("empty remote name") - } - if req.GetUrl() == "" { - return fmt.Errorf("empty remote url") - } - - return nil -} - -// RemoveRemote removes the given remote -func (s *server) RemoveRemote(ctx context.Context, req *gitalypb.RemoveRemoteRequest) (*gitalypb.RemoveRemoteResponse, error) { - if err := validateRemoveRemoteRequest(req); err != nil { - return nil, status.Errorf(codes.InvalidArgument, "RemoveRemote: %v", err) - } - - remote := s.localrepo(req.GetRepository()).Remote() - - hasRemote, err := remote.Exists(ctx, req.Name) - if err != nil { - return nil, err - } - if !hasRemote { - return &gitalypb.RemoveRemoteResponse{Result: false}, nil - } - - if err := s.voteOnRemote(ctx, req.GetRepository(), req.GetName()); err != nil { - return nil, helper.ErrInternalf("preimage vote on remote: %v", err) - } - - if err := remote.Remove(ctx, req.Name); err != nil { - return nil, err - } - - if err := s.voteOnRemote(ctx, req.GetRepository(), req.GetName()); err != nil { - return nil, helper.ErrInternalf("postimage vote on remote: %v", err) - } - - return &gitalypb.RemoveRemoteResponse{Result: true}, nil -} - -func (s *server) FindRemoteRepository(ctx context.Context, req *gitalypb.FindRemoteRepositoryRequest) (*gitalypb.FindRemoteRepositoryResponse, error) { - if req.GetRemote() == "" { - return nil, status.Error(codes.InvalidArgument, "FindRemoteRepository: empty remote can't be checked.") - } - - cmd, err := s.gitCmdFactory.NewWithoutRepo(ctx, - git.SubCmd{ - Name: "ls-remote", - Args: []string{ - req.GetRemote(), - "HEAD", - }, - }, - ) - - if err != nil { - return nil, status.Errorf(codes.Internal, "error executing git command: %s", err) - } - - output, err := ioutil.ReadAll(cmd) - if err != nil { - return nil, status.Errorf(codes.Internal, "unable to read stdout: %s", err) - } - if err := cmd.Wait(); err != nil { - return &gitalypb.FindRemoteRepositoryResponse{Exists: false}, nil - } - - // The output of a successful command is structured like - // Regexp would've read better, but this is faster - // 58fbff2e0d3b620f591a748c158799ead87b51cd HEAD - fields := bytes.Fields(output) - match := len(fields) == 2 && len(fields[0]) == 40 && string(fields[1]) == "HEAD" - - return &gitalypb.FindRemoteRepositoryResponse{Exists: match}, nil -} - -func validateRemoveRemoteRequest(req *gitalypb.RemoveRemoteRequest) error { - if req.GetName() == "" { - return fmt.Errorf("empty remote name") - } - - return nil -} - -func (s *server) voteOnRemote(ctx context.Context, repo *gitalypb.Repository, remoteName string) error { - return transaction.RunOnContext(ctx, func(tx txinfo.Transaction) error { - localrepo := s.localrepo(repo) - - configEntries, err := localrepo.Config().GetRegexp(ctx, "remote\\."+remoteName+"\\.", git.ConfigGetRegexpOpts{}) - if err != nil { - return fmt.Errorf("get remote configuration: %w", err) - } - - hash := voting.NewVoteHash() - for _, configEntry := range configEntries { - config := fmt.Sprintf("%s\t%s\n", configEntry.Key, configEntry.Value) - if _, err := io.WriteString(hash, config); err != nil { - return fmt.Errorf("hash remote config entry: %w", err) - } - } - - vote, err := hash.Vote() - if err != nil { - return fmt.Errorf("compute remote config vote: %w", err) - } - - if err := s.txManager.Vote(ctx, tx, vote); err != nil { - return fmt.Errorf("vote: %w", err) - } - - return nil - }) -} diff --git a/internal/gitaly/service/remote/remotes_test.go b/internal/gitaly/service/remote/remotes_test.go deleted file mode 100644 index 158692729..000000000 --- a/internal/gitaly/service/remote/remotes_test.go +++ /dev/null @@ -1,317 +0,0 @@ -package remote - -import ( - "bytes" - "context" - "fmt" - "io" - "net/http" - "net/http/httptest" - "testing" - - "github.com/stretchr/testify/require" - "gitlab.com/gitlab-org/gitaly/v14/internal/git/gittest" - "gitlab.com/gitlab-org/gitaly/v14/internal/gitaly/config" - "gitlab.com/gitlab-org/gitaly/v14/internal/gitaly/rubyserver" - "gitlab.com/gitlab-org/gitaly/v14/internal/gitaly/transaction" - "gitlab.com/gitlab-org/gitaly/v14/internal/helper" - "gitlab.com/gitlab-org/gitaly/v14/internal/helper/text" - "gitlab.com/gitlab-org/gitaly/v14/internal/testhelper" - "gitlab.com/gitlab-org/gitaly/v14/internal/testhelper/testserver" - "gitlab.com/gitlab-org/gitaly/v14/internal/transaction/txinfo" - "gitlab.com/gitlab-org/gitaly/v14/internal/transaction/voting" - "gitlab.com/gitlab-org/gitaly/v14/proto/go/gitalypb" - "google.golang.org/grpc/codes" -) - -func testSuccessfulAddRemote(t *testing.T, cfg config.Cfg, rubySrv *rubyserver.Server) { - _, repo, repoPath, client := setupRemoteServiceWithRuby(t, cfg, rubySrv) - - ctx, cancel := testhelper.Context() - defer cancel() - - testCases := []struct { - description string - remoteName string - url string - mirrorRefmaps []string - resolvedMirrorRefmaps []string - }{ - { - description: "creates a new remote", - remoteName: "my-remote", - url: "http://my-repo.git", - }, - { - description: "if a remote with the same name exists, it updates it", - remoteName: "my-remote", - url: "johndoe@host:my-new-repo.git", - }, - { - description: "doesn't set the remote as mirror if mirror_refmaps is not `present`", - remoteName: "my-non-mirror-remote", - url: "johndoe@host:my-new-repo.git", - mirrorRefmaps: []string{""}, - }, - { - description: "sets the remote as mirror if a mirror_refmap is present", - remoteName: "my-mirror-remote", - url: "http://my-mirror-repo.git", - mirrorRefmaps: []string{"all_refs"}, - resolvedMirrorRefmaps: []string{"+refs/*:refs/*"}, - }, - { - description: "sets the remote as mirror with multiple mirror_refmaps", - remoteName: "my-other-mirror-remote", - url: "http://my-non-mirror-repo.git", - mirrorRefmaps: []string{"all_refs", "+refs/pull/*/head:refs/merge-requests/*/head"}, - resolvedMirrorRefmaps: []string{"+refs/*:refs/*", "+refs/pull/*/head:refs/merge-requests/*/head"}, - }, - } - - for _, tc := range testCases { - t.Run(tc.description, func(t *testing.T) { - request := &gitalypb.AddRemoteRequest{ - Repository: repo, - Name: tc.remoteName, - Url: tc.url, - MirrorRefmaps: tc.mirrorRefmaps, - } - - _, err := client.AddRemote(ctx, request) - require.NoError(t, err) - - remotes := gittest.Exec(t, cfg, "-C", repoPath, "remote", "-v") - - require.Contains(t, string(remotes), fmt.Sprintf("%s\t%s (fetch)", tc.remoteName, tc.url)) - require.Contains(t, string(remotes), fmt.Sprintf("%s\t%s (push)", tc.remoteName, tc.url)) - - mirrorConfigRegexp := fmt.Sprintf("remote.%s", tc.remoteName) - mirrorConfig := string(gittest.Exec(t, cfg, "-C", repoPath, "config", "--get-regexp", mirrorConfigRegexp)) - if len(tc.resolvedMirrorRefmaps) > 0 { - for _, resolvedMirrorRefmap := range tc.resolvedMirrorRefmaps { - require.Contains(t, mirrorConfig, resolvedMirrorRefmap) - } - require.Contains(t, mirrorConfig, "mirror true") - require.Contains(t, mirrorConfig, "prune true") - } else { - require.NotContains(t, mirrorConfig, "mirror true") - } - }) - } -} - -func testAddRemoteTransactional(t *testing.T, cfg config.Cfg, rubySrv *rubyserver.Server) { - var votes []voting.Vote - txManager := transaction.MockManager{ - VoteFn: func(_ context.Context, _ txinfo.Transaction, vote voting.Vote) error { - votes = append(votes, vote) - return nil - }, - } - - _, repo, repoPath, client := setupRemoteServiceWithRuby(t, cfg, rubySrv, testserver.WithTransactionManager(&txManager)) - - ctx, cancel := testhelper.Context() - defer cancel() - ctx, err := txinfo.InjectTransaction(ctx, 1, "node", true) - require.NoError(t, err) - ctx = helper.IncomingToOutgoing(ctx) - - preimageURL := text.ChompBytes(gittest.Exec(t, cfg, "-C", repoPath, "remote", "get-url", "origin")) - - _, err = client.AddRemote(ctx, &gitalypb.AddRemoteRequest{ - Repository: repo, - Name: "origin", - Url: "foo/bar", - }) - require.NoError(t, err) - - preimageVote := fmt.Sprintf("remote.origin.url\t%s\n", preimageURL) - require.Equal(t, []voting.Vote{ - voting.VoteFromData([]byte(preimageVote)), - voting.VoteFromData([]byte("remote.origin.url\tfoo/bar\n")), - }, votes) -} - -func TestFailedAddRemoteDueToValidation(t *testing.T) { - t.Parallel() - _, repo, _, client := setupRemoteService(t) - - ctx, cancel := testhelper.Context() - defer cancel() - - testCases := []struct { - description string - remoteName string - url string - }{ - { - description: "Remote name empty", - url: "http://my-repo.git", - }, - { - description: "Remote name blank", - remoteName: " ", - url: "http://my-repo.git", - }, - { - description: "URL empty", - remoteName: "my-remote", - }, - } - - for _, tc := range testCases { - t.Run(tc.description, func(t *testing.T) { - request := &gitalypb.AddRemoteRequest{ - Repository: repo, - Name: tc.remoteName, - Url: tc.url, - } - - _, err := client.AddRemote(ctx, request) - testhelper.RequireGrpcError(t, err, codes.InvalidArgument) - }) - } -} - -func TestSuccessfulRemoveRemote(t *testing.T) { - t.Parallel() - cfg, repo, repoPath, client := setupRemoteService(t) - - ctx, cancel := testhelper.Context() - defer cancel() - - gittest.Exec(t, cfg, "-C", repoPath, "remote", "add", "my-remote", "http://my-repo.git") - - testCases := []struct { - description string - remoteName string - result bool - }{ - { - description: "removes the remote", - remoteName: "my-remote", - result: true, - }, - { - description: "returns false if the remote doesn't exist", - remoteName: "not-a-real-remote", - result: false, - }, - } - - for _, tc := range testCases { - t.Run(tc.description, func(t *testing.T) { - request := &gitalypb.RemoveRemoteRequest{ - Repository: repo, - Name: tc.remoteName, - } - - r, err := client.RemoveRemote(ctx, request) - require.NoError(t, err) - require.Equal(t, tc.result, r.GetResult()) - - remotes := gittest.Exec(t, cfg, "-C", repoPath, "remote") - - require.NotContains(t, string(remotes), tc.remoteName) - }) - } -} - -func TestFailedRemoveRemoteDueToValidation(t *testing.T) { - t.Parallel() - _, repo, _, client := setupRemoteService(t) - - ctx, cancel := testhelper.Context() - defer cancel() - - request := &gitalypb.RemoveRemoteRequest{Repository: repo} // Remote name empty - - _, err := client.RemoveRemote(ctx, request) - testhelper.RequireGrpcError(t, err, codes.InvalidArgument) -} - -func TestRemoveRemoteTransactional(t *testing.T) { - t.Parallel() - var votes []voting.Vote - txManager := transaction.MockManager{ - VoteFn: func(_ context.Context, _ txinfo.Transaction, vote voting.Vote) error { - votes = append(votes, vote) - return nil - }, - } - - cfg, repo, repoPath, client := setupRemoteService(t, testserver.WithTransactionManager(&txManager)) - - ctx, cancel := testhelper.Context() - defer cancel() - ctx, err := txinfo.InjectTransaction(ctx, 1, "node", true) - require.NoError(t, err) - ctx = helper.IncomingToOutgoing(ctx) - - preimageURL := text.ChompBytes(gittest.Exec(t, cfg, "-C", repoPath, "remote", "get-url", "origin")) - - _, err = client.RemoveRemote(ctx, &gitalypb.RemoveRemoteRequest{ - Repository: repo, - Name: "origin", - }) - require.NoError(t, err) - - preimageVote := fmt.Sprintf("remote.origin.url\t%s\n", preimageURL) - require.Equal(t, []voting.Vote{ - voting.VoteFromData([]byte(preimageVote)), - voting.VoteFromData([]byte{}), - }, votes) -} - -func TestFindRemoteRepository(t *testing.T) { - t.Parallel() - _, repo, _, client := setupRemoteService(t) - - ctx, cancel := testhelper.Context() - defer cancel() - - ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - infoRefs := testhelper.MustReadFile(t, "testdata/lsremotedata.txt") - w.Header().Set("Content-Type", "application/x-git-upload-pack-advertisement") - _, err := io.Copy(w, bytes.NewReader(infoRefs)) - require.NoError(t, err) - })) - defer ts.Close() - - resp, err := client.FindRemoteRepository(ctx, &gitalypb.FindRemoteRepositoryRequest{Remote: ts.URL, StorageName: repo.GetStorageName()}) - require.NoError(t, err) - - require.True(t, resp.Exists) -} - -func TestFailedFindRemoteRepository(t *testing.T) { - t.Parallel() - _, repo, _, client := setupRemoteService(t) - - ctx, cancel := testhelper.Context() - defer cancel() - - testCases := []struct { - description string - remote string - exists bool - code codes.Code - }{ - {"non existing remote", "http://example.com/test.git", false, codes.OK}, - {"empty remote", "", false, codes.InvalidArgument}, - } - - for _, tc := range testCases { - resp, err := client.FindRemoteRepository(ctx, &gitalypb.FindRemoteRepositoryRequest{Remote: tc.remote, StorageName: repo.GetStorageName()}) - if tc.code == codes.OK { - require.NoError(t, err) - } else { - testhelper.RequireGrpcError(t, err, tc.code) - continue - } - - require.Equal(t, tc.exists, resp.GetExists(), tc.description) - } -} diff --git a/internal/gitaly/service/remote/server.go b/internal/gitaly/service/remote/server.go index 37b43caa3..d466af948 100644 --- a/internal/gitaly/service/remote/server.go +++ b/internal/gitaly/service/remote/server.go @@ -7,7 +7,6 @@ import ( "gitlab.com/gitlab-org/gitaly/v14/internal/git/localrepo" "gitlab.com/gitlab-org/gitaly/v14/internal/git/repository" "gitlab.com/gitlab-org/gitaly/v14/internal/gitaly/config" - "gitlab.com/gitlab-org/gitaly/v14/internal/gitaly/rubyserver" "gitlab.com/gitlab-org/gitaly/v14/internal/gitaly/storage" "gitlab.com/gitlab-org/gitaly/v14/internal/gitaly/transaction" "gitlab.com/gitlab-org/gitaly/v14/proto/go/gitalypb" @@ -16,7 +15,6 @@ import ( type server struct { gitalypb.UnimplementedRemoteServiceServer cfg config.Cfg - ruby *rubyserver.Server locator storage.Locator gitCmdFactory git.CommandFactory catfileCache catfile.Cache @@ -28,7 +26,6 @@ type server struct { // NewServer creates a new instance of a grpc RemoteServiceServer func NewServer( cfg config.Cfg, - rs *rubyserver.Server, locator storage.Locator, gitCmdFactory git.CommandFactory, catfileCache catfile.Cache, @@ -36,7 +33,6 @@ func NewServer( ) gitalypb.RemoteServiceServer { return &server{ cfg: cfg, - ruby: rs, locator: locator, gitCmdFactory: gitCmdFactory, catfileCache: catfileCache, diff --git a/internal/gitaly/service/remote/testhelper_test.go b/internal/gitaly/service/remote/testhelper_test.go index b4ae8265c..35285044f 100644 --- a/internal/gitaly/service/remote/testhelper_test.go +++ b/internal/gitaly/service/remote/testhelper_test.go @@ -2,14 +2,10 @@ package remote import ( "os" - "reflect" - "runtime" "testing" - "github.com/stretchr/testify/require" "gitlab.com/gitlab-org/gitaly/v14/internal/git/gittest" "gitlab.com/gitlab-org/gitaly/v14/internal/gitaly/config" - "gitlab.com/gitlab-org/gitaly/v14/internal/gitaly/rubyserver" "gitlab.com/gitlab-org/gitaly/v14/internal/gitaly/service" "gitlab.com/gitlab-org/gitaly/v14/internal/testhelper" "gitlab.com/gitlab-org/gitaly/v14/internal/testhelper/testcfg" @@ -31,35 +27,16 @@ func testMain(m *testing.M) int { return m.Run() } -func TestWithRubySidecar(t *testing.T) { - t.Parallel() - cfg := testcfg.Build(t) - - rubySrv := rubyserver.New(cfg) - require.NoError(t, rubySrv.Start()) - t.Cleanup(rubySrv.Stop) - - fs := []func(t *testing.T, cfg config.Cfg, rubySrv *rubyserver.Server){ - testSuccessfulAddRemote, - testAddRemoteTransactional, - } - - for _, f := range fs { - t.Run(runtime.FuncForPC(reflect.ValueOf(f).Pointer()).Name(), func(t *testing.T) { - f(t, cfg, rubySrv) - }) - } -} - -func setupRemoteServiceWithRuby(t *testing.T, cfg config.Cfg, rubySrv *rubyserver.Server, opts ...testserver.GitalyServerOpt) (config.Cfg, *gitalypb.Repository, string, gitalypb.RemoteServiceClient) { +func setupRemoteService(t *testing.T, opts ...testserver.GitalyServerOpt) (config.Cfg, *gitalypb.Repository, string, gitalypb.RemoteServiceClient) { t.Helper() + cfg := testcfg.Build(t) + repo, repoPath := gittest.CloneRepo(t, cfg, cfg.Storages[0]) - addr := testserver.RunGitalyServer(t, cfg, rubySrv, func(srv *grpc.Server, deps *service.Dependencies) { + addr := testserver.RunGitalyServer(t, cfg, nil, func(srv *grpc.Server, deps *service.Dependencies) { gitalypb.RegisterRemoteServiceServer(srv, NewServer( deps.GetCfg(), - deps.GetRubyServer(), deps.GetLocator(), deps.GetGitCmdFactory(), deps.GetCatfileCache(), @@ -74,13 +51,6 @@ func setupRemoteServiceWithRuby(t *testing.T, cfg config.Cfg, rubySrv *rubyserve return cfg, repo, repoPath, client } -func setupRemoteService(t *testing.T, opts ...testserver.GitalyServerOpt) (config.Cfg, *gitalypb.Repository, string, gitalypb.RemoteServiceClient) { - t.Helper() - - cfg := testcfg.Build(t) - return setupRemoteServiceWithRuby(t, cfg, nil, opts...) -} - func newRemoteClient(t *testing.T, serverSocketPath string) (gitalypb.RemoteServiceClient, *grpc.ClientConn) { t.Helper() diff --git a/internal/gitaly/service/remote/update_remote_mirror.go b/internal/gitaly/service/remote/update_remote_mirror.go index bc7ed1dd2..7a1b231c6 100644 --- a/internal/gitaly/service/remote/update_remote_mirror.go +++ b/internal/gitaly/service/remote/update_remote_mirror.go @@ -64,26 +64,23 @@ func (s *server) updateRemoteMirror(stream gitalypb.RemoteService_UpdateRemoteMi } repo := s.localrepo(firstRequest.GetRepository()) - remoteName := firstRequest.GetRefName() - var remoteConfig []git.ConfigPair + remote := firstRequest.GetRemote() - if remote := firstRequest.GetRemote(); remote != nil { - remoteSuffix, err := text.RandomHex(8) - if err != nil { - return fmt.Errorf("generating remote suffix: %w", err) - } - remoteName = "inmemory-" + remoteSuffix + remoteSuffix, err := text.RandomHex(8) + if err != nil { + return fmt.Errorf("generating remote suffix: %w", err) + } + remoteName := "inmemory-" + remoteSuffix + + remoteConfig := []git.ConfigPair{ + {Key: fmt.Sprintf("remote.%s.url", remoteName), Value: remote.GetUrl()}, + } + if authHeader := remote.GetHttpAuthorizationHeader(); authHeader != "" { remoteConfig = append(remoteConfig, git.ConfigPair{ - Key: fmt.Sprintf("remote.%s.url", remoteName), Value: remote.GetUrl(), + Key: fmt.Sprintf("http.%s.extraHeader", remote.GetUrl()), + Value: "Authorization: " + authHeader, }) - - if authHeader := remote.GetHttpAuthorizationHeader(); authHeader != "" { - remoteConfig = append(remoteConfig, git.ConfigPair{ - Key: fmt.Sprintf("http.%s.extraHeader", remote.GetUrl()), - Value: "Authorization: " + authHeader, - }) - } } sshCommand, clean, err := git.BuildSSHInvocation(ctx, firstRequest.GetSshKey(), firstRequest.GetKnownHosts()) @@ -250,18 +247,12 @@ func validateUpdateRemoteMirrorRequest(ctx context.Context, req *gitalypb.Update return fmt.Errorf("empty Repository") } - if req.GetRefName() == "" && req.GetRemote() == nil { - return fmt.Errorf("empty RefName") + if req.GetRemote() == nil { + return fmt.Errorf("missing Remote") } - if req.GetRefName() != "" && req.GetRemote() != nil { - return fmt.Errorf("both remote name and remote parameters set") - } - - if remote := req.GetRemote(); remote != nil { - if remote.GetUrl() == "" { - return fmt.Errorf("remote is missing URL") - } + if req.GetRemote().GetUrl() == "" { + return fmt.Errorf("remote is missing URL") } return nil diff --git a/internal/gitaly/service/remote/update_remote_mirror_test.go b/internal/gitaly/service/remote/update_remote_mirror_test.go index be327a06f..c40f44576 100644 --- a/internal/gitaly/service/remote/update_remote_mirror_test.go +++ b/internal/gitaly/service/remote/update_remote_mirror_test.go @@ -315,14 +315,25 @@ func TestUpdateRemoteMirror(t *testing.T) { CommandFactory: original, newFunc: func(ctx context.Context, repo repository.GitRepo, sc git.Cmd, opts ...git.CmdOpt) (*command.Command, error) { if sc.Subcommand() == "push" { + subCmd, ok := sc.(git.SubCmd) + require.True(t, ok) + + // This is really hacky: we extract the + // remote name from the subcommands + // arguments. But honestly, the whole way of + // how we hijack the command factory is kind + // of hacky in the first place. + remoteName := subCmd.Args[0] + require.Contains(t, remoteName, "inmemory-") + // Make the branch diverge on the remote before actually performing the pushes the RPC // is attempting to perform to simulate a ref diverging after the RPC has performed // its checks. cmd, err := original.New(ctx, repo, git.SubCmd{ Name: "push", Flags: []git.Option{git.Flag{Name: "--force"}}, - Args: []string{"mirror", "refs/heads/non-diverging:refs/heads/diverging"}, - }) + Args: []string{remoteName, "refs/heads/non-diverging:refs/heads/diverging"}, + }, opts...) if !assert.NoError(t, err) { return nil, err } @@ -475,9 +486,6 @@ func TestUpdateRemoteMirror(t *testing.T) { sourceRepoPb, sourceRepoPath := gittest.InitRepo(t, cfg, cfg.Storages[0]) - // configure the mirror repository as a remote in the source - gittest.Exec(t, cfg, "-C", sourceRepoPath, "remote", "add", "mirror", mirrorRepoPath) - // create identical commits in both repositories so we can use them for // the references commitSignature := git2go.NewSignature("Test Author", "author@example.com", time.Now()) @@ -534,7 +542,6 @@ func TestUpdateRemoteMirror(t *testing.T) { gitalypb.RegisterRemoteServiceServer(srv, NewServer( deps.GetCfg(), - deps.GetRubyServer(), deps.GetLocator(), cmdFactory, deps.GetCatfileCache(), @@ -549,8 +556,10 @@ func TestUpdateRemoteMirror(t *testing.T) { require.NoError(t, err) require.NoError(t, stream.Send(&gitalypb.UpdateRemoteMirrorRequest{ - Repository: sourceRepoPb, - RefName: "mirror", + Repository: sourceRepoPb, + Remote: &gitalypb.UpdateRemoteMirrorRequest_Remote{ + Url: mirrorRepoPath, + }, KeepDivergentRefs: tc.keepDivergentRefs, })) @@ -601,7 +610,6 @@ func TestSuccessfulUpdateRemoteMirrorRequest(t *testing.T) { serverSocketPath := testserver.RunGitalyServer(t, cfg, nil, func(srv *grpc.Server, deps *service.Dependencies) { gitalypb.RegisterRemoteServiceServer(srv, NewServer( deps.GetCfg(), - deps.GetRubyServer(), deps.GetLocator(), deps.GetGitCmdFactory(), deps.GetCatfileCache(), @@ -615,8 +623,6 @@ func TestSuccessfulUpdateRemoteMirrorRequest(t *testing.T) { testRepo, testRepoPath := gittest.CloneRepo(t, cfg, cfg.Storages[0]) _, mirrorPath := gittest.CloneRepo(t, cfg, cfg.Storages[0]) - remoteName := "remote_mirror_1" - gittest.CreateTag(t, cfg, mirrorPath, "v0.0.1", "master", nil) // I needed another tag for the tests gittest.CreateTag(t, cfg, testRepoPath, "new-tag", "60ecb67744cb56576c30214ff52294f8ce2def98", nil) gittest.CreateTag(t, cfg, testRepoPath, "v1.0.0", "0b4bc9a49b562e85de7cc9e834518ea6828729b9", &gittest.CreateTagOpts{ @@ -629,7 +635,6 @@ func TestSuccessfulUpdateRemoteMirrorRequest(t *testing.T) { setupCommands := [][]string{ // Preconditions {"config", "user.email", "gitalytest@example.com"}, - {"remote", "add", remoteName, mirrorPath}, // Updates {"branch", "new-branch", "60ecb67744cb56576c30214ff52294f8ce2def98"}, // Add branch {"branch", "ignored-branch", "60ecb67744cb56576c30214ff52294f8ce2def98"}, // Add branch not matching branch list @@ -654,8 +659,10 @@ func TestSuccessfulUpdateRemoteMirrorRequest(t *testing.T) { require.NotEqual(t, newTagOid, "f4e6814c3e4e7a0de82a9e7cd20c626cc963a2f8") // Sanity check that the tag did in fact change firstRequest := &gitalypb.UpdateRemoteMirrorRequest{ - Repository: testRepo, - RefName: remoteName, + Repository: testRepo, + Remote: &gitalypb.UpdateRemoteMirrorRequest_Remote{ + Url: mirrorPath, + }, OnlyBranchesMatching: nil, } matchingRequest1 := &gitalypb.UpdateRemoteMirrorRequest{ @@ -704,7 +711,6 @@ func TestSuccessfulUpdateRemoteMirrorRequestWithWildcards(t *testing.T) { serverSocketPath := testserver.RunGitalyServer(t, cfg, nil, func(srv *grpc.Server, deps *service.Dependencies) { gitalypb.RegisterRemoteServiceServer(srv, NewServer( deps.GetCfg(), - deps.GetRubyServer(), deps.GetLocator(), deps.GetGitCmdFactory(), deps.GetCatfileCache(), @@ -719,12 +725,9 @@ func TestSuccessfulUpdateRemoteMirrorRequestWithWildcards(t *testing.T) { _, mirrorPath := gittest.CloneRepo(t, cfg, cfg.Storages[0]) - remoteName := "remote_mirror_2" - setupCommands := [][]string{ // Preconditions {"config", "user.email", "gitalytest@example.com"}, - {"remote", "add", remoteName, mirrorPath}, // Updates {"branch", "11-0-stable", "60ecb67744cb56576c30214ff52294f8ce2def98"}, {"branch", "11-1-stable", "60ecb67744cb56576c30214ff52294f8ce2def98"}, // Add branch @@ -754,8 +757,10 @@ func TestSuccessfulUpdateRemoteMirrorRequestWithWildcards(t *testing.T) { newTagOid = strings.TrimSpace(newTagOid) require.NotEqual(t, newTagOid, "f4e6814c3e4e7a0de82a9e7cd20c626cc963a2f8") // Sanity check that the tag did in fact change firstRequest := &gitalypb.UpdateRemoteMirrorRequest{ - Repository: testRepo, - RefName: remoteName, + Repository: testRepo, + Remote: &gitalypb.UpdateRemoteMirrorRequest_Remote{ + Url: mirrorPath, + }, OnlyBranchesMatching: [][]byte{[]byte("*-stable"), []byte("feature")}, } @@ -789,7 +794,6 @@ func TestUpdateRemoteMirrorInmemory(t *testing.T) { serverSocketPath := testserver.RunGitalyServer(t, cfg, nil, func(srv *grpc.Server, deps *service.Dependencies) { gitalypb.RegisterRemoteServiceServer(srv, NewServer( deps.GetCfg(), - deps.GetRubyServer(), deps.GetLocator(), deps.GetGitCmdFactory(), deps.GetCatfileCache(), @@ -838,7 +842,6 @@ func TestSuccessfulUpdateRemoteMirrorRequestWithKeepDivergentRefs(t *testing.T) serverSocketPath := testserver.RunGitalyServer(t, cfg, nil, func(srv *grpc.Server, deps *service.Dependencies) { gitalypb.RegisterRemoteServiceServer(srv, NewServer( deps.GetCfg(), - deps.GetRubyServer(), deps.GetLocator(), deps.GetGitCmdFactory(), deps.GetCatfileCache(), @@ -852,14 +855,11 @@ func TestSuccessfulUpdateRemoteMirrorRequestWithKeepDivergentRefs(t *testing.T) testRepo, testRepoPath := gittest.CloneRepo(t, cfg, cfg.Storages[0]) _, mirrorPath := gittest.CloneRepo(t, cfg, cfg.Storages[0]) - remoteName := "remote_mirror_1" - gittest.CreateTag(t, cfg, mirrorPath, "v2.0.0", "master", nil) setupCommands := [][]string{ // Preconditions {"config", "user.email", "gitalytest@example.com"}, - {"remote", "add", remoteName, mirrorPath}, // Create a divergence by moving `master` to the HEAD of another branch // ba3faa7d only exists on `after-create-delete-modify-move` @@ -875,8 +875,10 @@ func TestSuccessfulUpdateRemoteMirrorRequestWithKeepDivergentRefs(t *testing.T) gittest.Exec(t, cfg, gitArgs...) } firstRequest := &gitalypb.UpdateRemoteMirrorRequest{ - Repository: testRepo, - RefName: remoteName, + Repository: testRepo, + Remote: &gitalypb.UpdateRemoteMirrorRequest_Remote{ + Url: mirrorPath, + }, KeepDivergentRefs: true, } @@ -927,7 +929,6 @@ func TestFailedUpdateRemoteMirrorRequestDueToValidation(t *testing.T) { serverSocketPath := testserver.RunGitalyServer(t, cfg, nil, func(srv *grpc.Server, deps *service.Dependencies) { gitalypb.RegisterRemoteServiceServer(srv, NewServer( deps.GetCfg(), - deps.GetRubyServer(), deps.GetLocator(), deps.GetGitCmdFactory(), deps.GetCatfileCache(), @@ -948,14 +949,9 @@ func TestFailedUpdateRemoteMirrorRequestDueToValidation(t *testing.T) { desc: "empty Repository", request: &gitalypb.UpdateRemoteMirrorRequest{ Repository: nil, - RefName: "remote_mirror_1", - }, - }, - { - desc: "empty RefName", - request: &gitalypb.UpdateRemoteMirrorRequest{ - Repository: testRepo, - RefName: "", + Remote: &gitalypb.UpdateRemoteMirrorRequest_Remote{ + Url: "something", + }, }, }, { @@ -967,14 +963,6 @@ func TestFailedUpdateRemoteMirrorRequestDueToValidation(t *testing.T) { }, }, }, - { - desc: "both remote name and remote parameters set", - request: &gitalypb.UpdateRemoteMirrorRequest{ - Repository: testRepo, - RefName: "foobar", - Remote: &gitalypb.UpdateRemoteMirrorRequest_Remote{}, - }, - }, } for _, tc := range testCases { diff --git a/internal/gitaly/service/repository/config.go b/internal/gitaly/service/repository/config.go index 452eabb82..2a0bab645 100644 --- a/internal/gitaly/service/repository/config.go +++ b/internal/gitaly/service/repository/config.go @@ -173,6 +173,7 @@ func (s *server) SetConfig(ctx context.Context, req *gitalypb.SetConfigRequest) return nil, helper.ErrInternalf("preimage vote on config: %v", err) } + //nolint:staticcheck response, err := client.SetConfig(clientCtx, req) if err != nil { return nil, err diff --git a/internal/gitaly/service/repository/config_test.go b/internal/gitaly/service/repository/config_test.go index 11aeec5cf..a47f4894c 100644 --- a/internal/gitaly/service/repository/config_test.go +++ b/internal/gitaly/service/repository/config_test.go @@ -113,6 +113,7 @@ func TestDeleteConfig(t *testing.T) { gittest.Exec(t, cfg, "-C", repoPath, "config", k, "blabla") } + //nolint:staticcheck _, err := client.DeleteConfig(ctx, &gitalypb.DeleteConfigRequest{Repository: repo, Keys: tc.reqKeys}) if tc.code == codes.OK { require.NoError(t, err) @@ -156,6 +157,7 @@ func TestDeleteConfigTransactional(t *testing.T) { gittest.Exec(t, cfg, "-C", repoPath, "config", "delete.me", "now") modifiedContents := testhelper.MustReadFile(t, filepath.Join(repoPath, "config")) + //nolint:staticcheck _, err = client.DeleteConfig(ctx, &gitalypb.DeleteConfigRequest{ Repository: repo, Keys: []string{"delete.me"}, @@ -205,6 +207,7 @@ func testSetConfig(t *testing.T, cfg config.Cfg, rubySrv *rubyserver.Server) { testRepo, testRepoPath := gittest.CloneRepo(t, cfg, cfg.Storages[0]) + //nolint:staticcheck _, err := client.SetConfig(ctx, &gitalypb.SetConfigRequest{Repository: testRepo, Entries: tc.entries}) if tc.code != codes.OK { @@ -251,6 +254,7 @@ func testSetConfigTransactional(t *testing.T, cfg config.Cfg, rubySrv *rubyserve unmodifiedContents := testhelper.MustReadFile(t, filepath.Join(repoPath, "config")) + //nolint:staticcheck _, err = client.SetConfig(ctx, &gitalypb.SetConfigRequest{ Repository: repo, Entries: []*gitalypb.SetConfigRequest_Entry{ diff --git a/internal/gitaly/service/repository/fetch_remote.go b/internal/gitaly/service/repository/fetch_remote.go index 4d3a77e3b..34a9c90fa 100644 --- a/internal/gitaly/service/repository/fetch_remote.go +++ b/internal/gitaly/service/repository/fetch_remote.go @@ -5,7 +5,6 @@ import ( "context" "fmt" "io" - "strings" "time" gitalyerrors "gitlab.com/gitlab-org/gitaly/v14/internal/errors" @@ -39,34 +38,28 @@ func (s *server) FetchRemote(ctx context.Context, req *gitalypb.FetchRemoteReque } repo := s.localrepo(req.GetRepository()) - remoteName := req.GetRemote() + remoteName := "inmemory" + remoteURL := req.GetRemoteParams().GetUrl() - if params := req.GetRemoteParams(); params != nil { - remoteName = "inmemory" - - remoteURL := params.GetUrl() - refspecs := s.getRefspecs(params.GetMirrorRefmaps()) - - config := []git.ConfigPair{ - {Key: "remote.inmemory.url", Value: remoteURL}, - } - - for _, refspec := range refspecs { - config = append(config, git.ConfigPair{ - Key: "remote.inmemory.fetch", Value: refspec, - }) - } + config := []git.ConfigPair{ + {Key: "remote.inmemory.url", Value: remoteURL}, + } - if authHeader := params.GetHttpAuthorizationHeader(); authHeader != "" { - config = append(config, git.ConfigPair{ - Key: fmt.Sprintf("http.%s.extraHeader", remoteURL), - Value: "Authorization: " + authHeader, - }) - } + for _, refspec := range s.getRefspecs(req.GetRemoteParams().GetMirrorRefmaps()) { + config = append(config, git.ConfigPair{ + Key: "remote.inmemory.fetch", Value: refspec, + }) + } - opts.CommandOptions = append(opts.CommandOptions, git.WithConfigEnv(config...)) + if authHeader := req.GetRemoteParams().GetHttpAuthorizationHeader(); authHeader != "" { + config = append(config, git.ConfigPair{ + Key: fmt.Sprintf("http.%s.extraHeader", remoteURL), + Value: "Authorization: " + authHeader, + }) } + opts.CommandOptions = append(opts.CommandOptions, git.WithConfigEnv(config...)) + sshCommand, cleanup, err := git.BuildSSHInvocation(ctx, req.GetSshKey(), req.GetKnownHosts()) if err != nil { return nil, err @@ -159,18 +152,12 @@ func (s *server) validateFetchRemoteRequest(req *gitalypb.FetchRemoteRequest) er return helper.ErrInvalidArgument(gitalyerrors.ErrEmptyRepository) } - params := req.GetRemoteParams() - if params == nil { - remote := req.GetRemote() - if strings.TrimSpace(remote) == "" { - return helper.ErrInvalidArgument(fmt.Errorf(`blank or empty "remote": %q`, remote)) - } - return nil + if req.GetRemoteParams() == nil { + return helper.ErrInvalidArgumentf("missing remote params") } - remoteURL := params.GetUrl() - if strings.TrimSpace(remoteURL) == "" { - return helper.ErrInvalidArgumentf("blank or empty remote URL: %q", remoteURL) + if req.GetRemoteParams().GetUrl() == "" { + return helper.ErrInvalidArgumentf("blank or empty remote URL") } return nil diff --git a/internal/gitaly/service/repository/fetch_remote_test.go b/internal/gitaly/service/repository/fetch_remote_test.go index df99b31a5..05618d95d 100644 --- a/internal/gitaly/service/repository/fetch_remote_test.go +++ b/internal/gitaly/service/repository/fetch_remote_test.go @@ -33,7 +33,7 @@ import ( "google.golang.org/grpc/status" ) -func copyRepoWithNewRemote(t *testing.T, cfg config.Cfg, repo *gitalypb.Repository, repoPath string, remote string) (*gitalypb.Repository, string) { +func copyRepo(t *testing.T, cfg config.Cfg, repo *gitalypb.Repository, repoPath string) *gitalypb.Repository { cloneRepo := &gitalypb.Repository{ StorageName: repo.GetStorageName(), RelativePath: filepath.Join(filepath.Dir(repo.GetRelativePath()), "fetch-remote-clone.git"), @@ -44,9 +44,7 @@ func copyRepoWithNewRemote(t *testing.T, cfg config.Cfg, repo *gitalypb.Reposito gittest.Exec(t, cfg, "clone", "--bare", repoPath, clonePath) - gittest.Exec(t, cfg, "-C", clonePath, "remote", "add", remote, repoPath) - - return cloneRepo, clonePath + return cloneRepo } func TestFetchRemoteSuccess(t *testing.T) { @@ -56,15 +54,14 @@ func TestFetchRemoteSuccess(t *testing.T) { ctx, cancel := testhelper.Context() defer cancel() - cloneRepo, cloneRepoPath := copyRepoWithNewRemote(t, cfg, repo, repoPath, "my-remote") - defer func() { - require.NoError(t, os.RemoveAll(cloneRepoPath)) - }() + cloneRepo := copyRepo(t, cfg, repo, repoPath) // Ensure there's a new tag to fetch gittest.CreateTag(t, cfg, repoPath, "testtag", "master", nil) - req := &gitalypb.FetchRemoteRequest{Repository: cloneRepo, Remote: "my-remote", Timeout: 120, CheckTagsChanged: true} + req := &gitalypb.FetchRemoteRequest{Repository: cloneRepo, RemoteParams: &gitalypb.Remote{ + Url: repoPath, + }, Timeout: 120, CheckTagsChanged: true} resp, err := client.FetchRemote(ctx, req) require.NoError(t, err) require.NotNil(t, resp) @@ -119,23 +116,6 @@ func TestFetchRemote_sshCommand(t *testing.T) { expectedOutput string }{ { - desc: "remote name without SSH key", - request: &gitalypb.FetchRemoteRequest{ - Repository: repo, - Remote: "my-remote", - }, - expectedOutput: "ssh\n", - }, - { - desc: "remote name with SSH key", - request: &gitalypb.FetchRemoteRequest{ - Repository: repo, - Remote: "my-remote", - SshKey: "mykey", - }, - expectedOutput: "ssh\n-oIdentitiesOnly=yes\nmykey", - }, - { desc: "remote parameters without SSH key", request: &gitalypb.FetchRemoteRequest{ Repository: repo, @@ -176,10 +156,7 @@ func TestFetchRemote_withDefaultRefmaps(t *testing.T) { sourceRepo := localrepo.NewTestRepo(t, cfg, sourceRepoProto) - targetRepoProto, targetRepoPath := copyRepoWithNewRemote(t, cfg, sourceRepoProto, sourceRepoPath, "my-remote") - defer func() { - require.NoError(t, os.RemoveAll(targetRepoPath)) - }() + targetRepoProto := copyRepo(t, cfg, sourceRepoProto, sourceRepoPath) targetRepo := localrepo.NewTestRepo(t, cfg, targetRepoProto) port, stopGitServer := gittest.GitServer(t, cfg, sourceRepoPath, nil) @@ -276,33 +253,6 @@ func TestFetchRemote_prune(t *testing.T) { shouldExist bool }{ { - desc: "NoPrune=true should not delete reference matching remote's refspec", - request: &gitalypb.FetchRemoteRequest{ - Remote: "my-remote", - NoPrune: true, - }, - ref: "refs/remotes/my-remote/nonexistent", - shouldExist: true, - }, - { - desc: "NoPrune=false should delete reference matching remote's refspec", - request: &gitalypb.FetchRemoteRequest{ - Remote: "my-remote", - NoPrune: false, - }, - ref: "refs/remotes/my-remote/nonexistent", - shouldExist: false, - }, - { - desc: "NoPrune=false should not delete ref outside of remote's refspec", - request: &gitalypb.FetchRemoteRequest{ - Remote: "my-remote", - NoPrune: false, - }, - ref: "refs/heads/nonexistent", - shouldExist: true, - }, - { desc: "NoPrune=true with explicit Remote should not delete reference", request: &gitalypb.FetchRemoteRequest{ RemoteParams: &gitalypb.Remote{ @@ -340,10 +290,7 @@ func TestFetchRemote_prune(t *testing.T) { }, } { t.Run(tc.desc, func(t *testing.T) { - targetRepoProto, targetRepoPath := copyRepoWithNewRemote(t, cfg, sourceRepo, sourceRepoPath, "my-remote") - defer func() { - require.NoError(t, os.RemoveAll(targetRepoPath)) - }() + targetRepoProto := copyRepo(t, cfg, sourceRepo, sourceRepoPath) targetRepo := localrepo.NewTestRepo(t, cfg, targetRepoProto) ctx, cancel := testhelper.Context() @@ -393,31 +340,6 @@ func TestFetchRemote_force(t *testing.T) { expectedRefs map[git.ReferenceName]git.ObjectID }{ { - desc: "remote without force fails with diverging refs", - request: &gitalypb.FetchRemoteRequest{ - Remote: "my-remote", - }, - expectedErr: status.Error(codes.Unknown, "fetch remote: exit status 1"), - expectedRefs: map[git.ReferenceName]git.ObjectID{ - "refs/heads/master": branchOID, - "refs/tags/v1.0.0": tagOID, - }, - }, - { - desc: "remote with force updates diverging refs", - request: &gitalypb.FetchRemoteRequest{ - Remote: "my-remote", - Force: true, - }, - // We're fetching from `my-remote` here, which is set up to have a default - // refspec of "+refs/heads/*:refs/remotes/foobar/*". As such, no normal - // branches would get updated. - expectedRefs: map[git.ReferenceName]git.ObjectID{ - "refs/heads/master": branchOID, - "refs/tags/v1.0.0": divergingTagOID, - }, - }, - { desc: "remote params without force fails with diverging refs", request: &gitalypb.FetchRemoteRequest{ RemoteParams: &gitalypb.Remote{ @@ -496,10 +418,7 @@ func TestFetchRemote_force(t *testing.T) { }, } { t.Run(tc.desc, func(t *testing.T) { - targetRepoProto, targetRepoPath := copyRepoWithNewRemote(t, cfg, sourceRepoProto, sourceRepoPath, "my-remote") - defer func() { - require.NoError(t, os.RemoveAll(targetRepoPath)) - }() + targetRepoProto := copyRepo(t, cfg, sourceRepoProto, sourceRepoPath) targetRepo := localrepo.NewTestRepo(t, cfg, targetRepoProto) @@ -555,8 +474,10 @@ func TestFetchRemoteFailure(t *testing.T) { desc: "no repository", req: &gitalypb.FetchRemoteRequest{ Repository: nil, - Remote: remoteName, - Timeout: 1000, + RemoteParams: &gitalypb.Remote{ + Url: remoteName, + }, + Timeout: 1000, }, code: codes.InvalidArgument, errMsg: "empty Repository", @@ -568,7 +489,9 @@ func TestFetchRemoteFailure(t *testing.T) { StorageName: "invalid", RelativePath: "foobar.git", }, - Remote: remoteName, + RemoteParams: &gitalypb.Remote{ + Url: remoteName, + }, Timeout: 1000, }, // the error text is shortened to only a single word as requests to gitaly done via praefect returns different error messages @@ -576,14 +499,13 @@ func TestFetchRemoteFailure(t *testing.T) { errMsg: "invalid", }, { - desc: "invalid remote", + desc: "missing remote", req: &gitalypb.FetchRemoteRequest{ Repository: repo, - Remote: "", Timeout: 1000, }, code: codes.InvalidArgument, - errMsg: `blank or empty "remote"`, + errMsg: "missing remote params", }, { desc: "invalid remote url", diff --git a/internal/gitaly/service/repository/fork_test.go b/internal/gitaly/service/repository/fork_test.go index 4aece7e27..f91d09f7a 100644 --- a/internal/gitaly/service/repository/fork_test.go +++ b/internal/gitaly/service/repository/fork_test.go @@ -228,7 +228,7 @@ func runSecureServer(t *testing.T, cfg config.Cfg, rubySrv *rubyserver.Server) s gitalypb.RegisterRepositoryServiceServer(server, NewServer(cfg, rubySrv, locator, txManager, gitCmdFactory, catfileCache)) gitalypb.RegisterHookServiceServer(server, hookservice.NewServer(cfg, hookManager, gitCmdFactory, nil)) - gitalypb.RegisterRemoteServiceServer(server, remote.NewServer(cfg, rubySrv, locator, gitCmdFactory, catfileCache, txManager)) + gitalypb.RegisterRemoteServiceServer(server, remote.NewServer(cfg, locator, gitCmdFactory, catfileCache, txManager)) gitalypb.RegisterSSHServiceServer(server, ssh.NewServer(cfg, locator, gitCmdFactory, txManager)) gitalypb.RegisterRefServiceServer(server, ref.NewServer(cfg, locator, gitCmdFactory, txManager, catfileCache)) gitalypb.RegisterCommitServiceServer(server, commit.NewServer(cfg, locator, gitCmdFactory, nil, catfileCache)) diff --git a/internal/gitaly/service/repository/squash_in_progress_test.go b/internal/gitaly/service/repository/squash_in_progress_test.go index 3661d870a..c34ca28c8 100644 --- a/internal/gitaly/service/repository/squash_in_progress_test.go +++ b/internal/gitaly/service/repository/squash_in_progress_test.go @@ -47,6 +47,7 @@ func TestSuccessfulIsSquashInProgressRequest(t *testing.T) { ctx, cancel := testhelper.Context() defer cancel() + //nolint:staticcheck response, err := client.IsSquashInProgress(ctx, testCase.request) require.NoError(t, err) @@ -81,6 +82,7 @@ func TestFailedIsSquashInProgressRequestDueToValidations(t *testing.T) { ctx, cancel := testhelper.Context() defer cancel() + //nolint:staticcheck _, err := client.IsSquashInProgress(ctx, testCase.request) testhelper.RequireGrpcError(t, err, testCase.code) }) diff --git a/internal/gitaly/service/repository/testhelper_test.go b/internal/gitaly/service/repository/testhelper_test.go index e71ca203c..54e8c3d47 100644 --- a/internal/gitaly/service/repository/testhelper_test.go +++ b/internal/gitaly/service/repository/testhelper_test.go @@ -130,7 +130,6 @@ func runRepositoryServerWithConfig(t testing.TB, cfg config.Cfg, rubySrv *rubyse gitalypb.RegisterHookServiceServer(srv, hookservice.NewServer(cfg, deps.GetHookManager(), deps.GetGitCmdFactory(), deps.GetPackObjectsCache())) gitalypb.RegisterRemoteServiceServer(srv, remote.NewServer( cfg, - rubySrv, deps.GetLocator(), deps.GetGitCmdFactory(), deps.GetCatfileCache(), diff --git a/internal/gitaly/service/setup/register.go b/internal/gitaly/service/setup/register.go index 5c5d0a090..09a7210e6 100644 --- a/internal/gitaly/service/setup/register.go +++ b/internal/gitaly/service/setup/register.go @@ -126,7 +126,6 @@ func RegisterAll(srv *grpc.Server, deps *service.Dependencies) { )) gitalypb.RegisterRemoteServiceServer(srv, remote.NewServer( deps.GetCfg(), - deps.GetRubyServer(), deps.GetLocator(), deps.GetGitCmdFactory(), deps.GetCatfileCache(), diff --git a/internal/metadata/featureflag/feature_flags.go b/internal/metadata/featureflag/feature_flags.go index d61ffe366..1f402581a 100644 --- a/internal/metadata/featureflag/feature_flags.go +++ b/internal/metadata/featureflag/feature_flags.go @@ -5,23 +5,15 @@ package featureflag // NOTE: if you add a new feature flag please add it to the `All` list defined below. var ( // GoSetConfig enables git2go implementation of SetConfig. - GoSetConfig = FeatureFlag{Name: "go_set_config", OnByDefault: false} - // FindAllTagsPipeline enables the alternative pipeline implementation for finding - // tags via FindAllTags. - FindAllTagsPipeline = FeatureFlag{Name: "find_all_tags_pipeline", OnByDefault: false} - // QuarantinedResolveCOnflicts enables use of a quarantine object directory for ResolveConflicts. - QuarantinedResolveConflicts = FeatureFlag{Name: "quarantined_resolve_conflicts", OnByDefault: false} + GoSetConfig = FeatureFlag{Name: "go_set_config", OnByDefault: true} // GoUserApplyPatch enables the Go implementation of UserApplyPatch GoUserApplyPatch = FeatureFlag{Name: "go_user_apply_patch", OnByDefault: true} - // Quarantine enables the use of quarantine directories. - Quarantine = FeatureFlag{Name: "quarantine", OnByDefault: false} + // PackObjectsHookWithSidechannel enables Unix socket sidechannels in 'gitaly-hooks git pack-objects'. + PackObjectsHookWithSidechannel = FeatureFlag{Name: "pack_objects_hook_with_sidechannel", OnByDefault: false} ) // All includes all feature flags. var All = []FeatureFlag{ GoSetConfig, - FindAllTagsPipeline, - QuarantinedResolveConflicts, GoUserApplyPatch, - Quarantine, } diff --git a/internal/praefect/coordinator.go b/internal/praefect/coordinator.go index d0c8bcad8..5ebe99fb0 100644 --- a/internal/praefect/coordinator.go +++ b/internal/praefect/coordinator.go @@ -62,9 +62,7 @@ var transactionRPCs = map[string]transactionsCondition{ "/gitaly.OperationService/UserUpdateBranch": transactionsEnabled, "/gitaly.OperationService/UserUpdateSubmodule": transactionsEnabled, "/gitaly.RefService/DeleteRefs": transactionsEnabled, - "/gitaly.RemoteService/AddRemote": transactionsEnabled, "/gitaly.RemoteService/FetchInternalRemote": transactionsEnabled, - "/gitaly.RemoteService/RemoveRemote": transactionsEnabled, "/gitaly.RepositoryService/ApplyGitattributes": transactionsEnabled, "/gitaly.RepositoryService/CloneFromPool": transactionsEnabled, "/gitaly.RepositoryService/CloneFromPoolInternal": transactionsEnabled, diff --git a/internal/praefect/datastore/listener_postgres.go b/internal/praefect/datastore/listener_postgres.go index edaba97d3..9c45f3537 100644 --- a/internal/praefect/datastore/listener_postgres.go +++ b/internal/praefect/datastore/listener_postgres.go @@ -88,6 +88,7 @@ func NewPostgresListener(logger logrus.FieldLogger, opts PostgresListenerOpts, h func (pgl *PostgresListener) connect() error { firstConnectionAttempt := true connectErrChan := make(chan error, 1) + listenerAssignedChan := make(chan struct{}) connectionLifecycle := func(eventType pq.ListenerEventType, err error) { pgl.reconnectTotal.WithLabelValues(listenerEventTypeToString(eventType)).Inc() @@ -107,8 +108,14 @@ func (pgl *PostgresListener) connect() error { // once the connection is established we can be sure that the connection // address is correct and all other errors could be considered as // a temporary, so listener will try to re-connect and proceed. - pgl.async(pgl.ping) - pgl.async(pgl.handleNotifications) + pgl.async(func() { + <-listenerAssignedChan + pgl.ping() + }) + pgl.async(func() { + <-listenerAssignedChan + pgl.handleNotifications() + }) close(connectErrChan) // to signal the connection was established without troubles firstConnectionAttempt = false @@ -123,6 +130,7 @@ func (pgl *PostgresListener) connect() error { } pgl.listener = pq.NewListener(pgl.opts.Addr, pgl.opts.MinReconnectInterval, pgl.opts.MaxReconnectInterval, connectionLifecycle) + close(listenerAssignedChan) listenErrChan := make(chan error, 1) pgl.async(func() { diff --git a/internal/praefect/protoregistry/protoregistry_test.go b/internal/praefect/protoregistry/protoregistry_test.go index 36c90db92..675e3798b 100644 --- a/internal/praefect/protoregistry/protoregistry_test.go +++ b/internal/praefect/protoregistry/protoregistry_test.go @@ -100,9 +100,7 @@ func TestNewProtoRegistry(t *testing.T) { "PackRefs": protoregistry.OpMutator, }, "RemoteService": map[string]protoregistry.OpType{ - "AddRemote": protoregistry.OpMutator, "FetchInternalRemote": protoregistry.OpMutator, - "RemoveRemote": protoregistry.OpMutator, "UpdateRemoteMirror": protoregistry.OpAccessor, "FindRemoteRepository": protoregistry.OpAccessor, "FindRemoteRootRef": protoregistry.OpAccessor, diff --git a/internal/streamrpc/client.go b/internal/streamrpc/client.go deleted file mode 100644 index afe7fc7f2..000000000 --- a/internal/streamrpc/client.go +++ /dev/null @@ -1,149 +0,0 @@ -package streamrpc - -import ( - "context" - "encoding/json" - "fmt" - "net" - "time" - - "google.golang.org/grpc" - "google.golang.org/grpc/credentials" - "google.golang.org/grpc/metadata" - "google.golang.org/protobuf/proto" -) - -// DialFunc is an abstraction that allows Call to transparently handle -// unencrypted connections and TLS connections. -type DialFunc func(time.Duration) (net.Conn, error) - -func doCall(dial DialFunc, request []byte, callback func(net.Conn) error) error { - deadline := time.Now().Add(defaultHandshakeTimeout) - - c, err := dial(time.Until(deadline)) - if err != nil { - return fmt.Errorf("streamrpc client: dial: %w", err) - } - defer c.Close() - - if err := sendFrame(c, request, deadline); err != nil { - return fmt.Errorf("streamrpc client: send handshake: %w", err) - } - - responseBytes, err := recvFrame(c, deadline) - if err != nil { - return fmt.Errorf("streamrpc client: receive handshake: %w", err) - } - - if len(responseBytes) > 0 { - var resp response - if err := json.Unmarshal(responseBytes, &resp); err != nil { - return fmt.Errorf("streamrpc client: unmarshal handshake response: %w", err) - } - - return &RequestRejectedError{resp.Error} - } - - if err := callback(c); err != nil { - return err - } - - return c.Close() -} - -// RequestRejectedError is returned by Call if the server explicitly -// rejected the request (as opposed to e.g. an IO timeout). -type RequestRejectedError struct{ message string } - -func (r *RequestRejectedError) Error() string { return r.message } - -type callOptions struct { - creds credentials.PerRPCCredentials - interceptor grpc.UnaryClientInterceptor -} - -func (opts *callOptions) addCredentials(ctx context.Context) (context.Context, error) { - headers, err := opts.creds.GetRequestMetadata(ctx) - if err != nil { - return nil, err - } - for k, v := range headers { - ctx = metadata.AppendToOutgoingContext(ctx, k, v) - } - return ctx, nil -} - -// CallOption is an abstraction that lets us pass 0 or more options to a call. -type CallOption func(*callOptions) - -type nullCredentials struct{} - -func (nullCredentials) GetRequestMetadata(ctx context.Context, uri ...string) (map[string]string, error) { - return nil, nil -} - -func (nullCredentials) RequireTransportSecurity() bool { return false } - -var _ credentials.PerRPCCredentials = nullCredentials{} - -func nullClientInterceptor(ctx context.Context, method string, req, resp interface{}, cc *grpc.ClientConn, invoker grpc.UnaryInvoker, opts ...grpc.CallOption) error { - return invoker(ctx, method, req, resp, cc, opts...) -} - -func defaultCallOptions() *callOptions { - return &callOptions{ - creds: nullCredentials{}, - interceptor: nullClientInterceptor, - } -} - -// WithCredentials adds gRPC per-request credentials to an outgoing call. -func WithCredentials(creds credentials.PerRPCCredentials) CallOption { - return func(o *callOptions) { o.creds = creds } -} - -// WithClientInterceptor adds a gRPC unary client interceptor to an outgoing call. -func WithClientInterceptor(interceptor grpc.UnaryClientInterceptor) CallOption { - return func(o *callOptions) { o.interceptor = interceptor } -} - -// Call makes a StreamRPC call. The dial function determines the remote -// address. The method argument is the full name of the StreamRPC method -// we are calling (e.g. "/foo.BarService/BazStream"). Msg is the request -// message. If the server accepts the call, callback is called with a -// connection. -func Call(ctx context.Context, dial DialFunc, method string, msg proto.Message, callback func(net.Conn) error, opts ...CallOption) (err error) { - callOpts := defaultCallOptions() - for _, o := range opts { - o(callOpts) - } - - invoke := func(ctx context.Context, method string, msg, _ interface{}, _ *grpc.ClientConn, _ ...grpc.CallOption) error { - ctx, err := callOpts.addCredentials(ctx) - if err != nil { - return fmt.Errorf("streamrpc client: add credentials: %w", err) - } - - msgBytes, err := proto.Marshal(msg.(proto.Message)) - if err != nil { - return fmt.Errorf("streamrpc client: marshal outgoing protobuf message: %w", err) - } - - req := &request{ - Method: method, - Message: msgBytes, - } - if md, ok := metadata.FromOutgoingContext(ctx); ok { - req.Metadata = md - } - - reqBytes, err := json.Marshal(req) - if err != nil { - return fmt.Errorf("streamrpc client: marshal request json: %w", err) - } - - return doCall(dial, reqBytes, callback) - } - - return callOpts.interceptor(ctx, method, msg, nil, nil, invoke) -} diff --git a/internal/streamrpc/common.go b/internal/streamrpc/common.go deleted file mode 100644 index 88c3b6148..000000000 --- a/internal/streamrpc/common.go +++ /dev/null @@ -1,82 +0,0 @@ -package streamrpc - -import ( - "encoding/binary" - "errors" - "io" - "net" - "os" - "time" -) - -type request struct { - Method string - Message []byte - Metadata map[string][]string -} - -type response struct{ Error string } - -const ( - defaultHandshakeTimeout = 10 * time.Second - - // The frames exchanged during the handshake have a uint32 length prefix - // so their theoretical maximum size is 4GB. We don't want to allow that - // so we enforce a lower limit. This number was chosen because it is - // close to the default grpc-go maximum message size. - maxFrameSize = (1 << 20) - 1 -) - -var ( - errFrameTooLarge = errors.New("frame too large") -) - -func sendFrame(c net.Conn, frame []byte, deadline time.Time) error { - if len(frame) > maxFrameSize { - return errFrameTooLarge - } - - header := make([]byte, 4) - binary.BigEndian.PutUint32(header, uint32(len(frame))) - buffers := net.Buffers([][]byte{header, frame}) - - return errAsync(deadline, func() error { _, err := buffers.WriteTo(c); return err }) -} - -func recvFrame(c net.Conn, deadline time.Time) ([]byte, error) { - header := make([]byte, 4) - if err := errAsync(deadline, func() error { _, err := io.ReadFull(c, header); return err }); err != nil { - return nil, err - } - - size := binary.BigEndian.Uint32(header) - if size > maxFrameSize { - return nil, errFrameTooLarge - } - frame := make([]byte, size) - if err := errAsync(deadline, func() error { _, err := io.ReadFull(c, frame); return err }); err != nil { - return nil, err - } - - return frame, nil -} - -// errAsync is a hack to work around the fact that grpc-go calls -// SetDeadline on connections _after_ handing them over to us. Because of -// this race, we cannot use SetDeadline which would have been nicer. -// -// https://github.com/grpc/grpc-go/blob/v1.38.0/server.go#L853 -func errAsync(deadline time.Time, f func() error) error { - tm := time.NewTimer(time.Until(deadline)) - defer tm.Stop() - - errC := make(chan error, 1) - go func() { errC <- f() }() - - select { - case <-tm.C: - return os.ErrDeadlineExceeded - case err := <-errC: - return err - } -} diff --git a/internal/streamrpc/frame_test.go b/internal/streamrpc/frame_test.go deleted file mode 100644 index cb665a47f..000000000 --- a/internal/streamrpc/frame_test.go +++ /dev/null @@ -1,139 +0,0 @@ -package streamrpc - -import ( - "io" - "io/ioutil" - "net" - "os" - "strings" - "syscall" - "testing" - "time" - - "github.com/stretchr/testify/require" -) - -func TestSendFrame(t *testing.T) { - largeString := strings.Repeat("x", 0xfffff) - - testCases := []struct { - desc string - in string - out string - err error - }{ - {desc: "empty", out: "\x00\x00\x00\x00"}, - {desc: "not empty", in: "hello", out: "\x00\x00\x00\x05hello"}, - {desc: "very large", in: largeString, out: "\x00\x0f\xff\xff" + largeString}, - {desc: "too large", in: "z" + largeString, err: errFrameTooLarge}, - } - - type result struct { - data string - err error - } - - for _, tc := range testCases { - t.Run(tc.desc, func(t *testing.T) { - client, server := socketPair(t) - ch := make(chan result, 1) - go func() { - out, err := ioutil.ReadAll(server) - ch <- result{data: string(out), err: err} - }() - - err := sendFrame(client, []byte(tc.in), time.Now().Add(10*time.Second)) - if tc.err != nil { - require.Equal(t, tc.err, err) - return - } - - require.NoError(t, err) - require.NoError(t, client.Close()) - - res := <-ch - require.NoError(t, res.err) - require.Equal(t, tc.out, res.data) - }) - } -} - -func TestSendFrame_timeout(t *testing.T) { - client, _ := socketPair(t) - - // Ensure frame is bigger than write buffer, so that sendFrame will - // block. Otherwise we cannot observe the timeout behavior. - frame := make([]byte, 10*1024) - require.NoError(t, client.(*net.UnixConn).SetWriteBuffer(1024)) - - err := sendFrame(client, frame, time.Now()) - require.ErrorIs(t, err, os.ErrDeadlineExceeded) -} - -func TestRecvFrame(t *testing.T) { - largeString := strings.Repeat("x", 0xfffff) - - testCases := []struct { - desc string - out string - in string - err error - }{ - {desc: "empty", in: "\x00\x00\x00\x00", out: ""}, - {desc: "not empty", in: "\x00\x00\x00\x05hello", out: "hello"}, - {desc: "very large", in: "\x00\x0f\xff\xff" + largeString, out: largeString}, - {desc: "too large", in: "\x00\x10\x00\x00" + "z" + largeString, err: errFrameTooLarge}, - } - - for _, tc := range testCases { - t.Run(tc.desc, func(t *testing.T) { - client, server := socketPair(t) - ch := make(chan error, 1) - go func() { - ch <- func() error { - n, err := server.Write([]byte(tc.in)) - if n != len(tc.in) { - return io.ErrShortWrite - } - return err - }() - }() - - out, err := recvFrame(client, time.Now().Add(10*time.Second)) - if tc.err != nil { - require.Equal(t, tc.err, err) - return - } - - require.NoError(t, err) - require.Equal(t, tc.out, string(out)) - - require.NoError(t, <-ch) - }) - } -} - -func TestRecvFrame_timeout(t *testing.T) { - client, _ := socketPair(t) - _, err := recvFrame(client, time.Now()) - require.ErrorIs(t, err, os.ErrDeadlineExceeded) -} - -func socketPair(t *testing.T) (net.Conn, net.Conn) { - t.Helper() - - fds, err := syscall.Socketpair(syscall.AF_UNIX, syscall.SOCK_STREAM, 0) - require.NoError(t, err) - - conns := make([]net.Conn, 2) - for i, fd := range fds[:] { - f := os.NewFile(uintptr(fd), "socket pair") - c, err := net.FileConn(f) - require.NoError(t, err) - require.NoError(t, f.Close()) - t.Cleanup(func() { c.Close() }) - conns[i] = c - } - - return conns[0], conns[1] -} diff --git a/internal/streamrpc/protocol_test.go b/internal/streamrpc/protocol_test.go deleted file mode 100644 index 5d169c179..000000000 --- a/internal/streamrpc/protocol_test.go +++ /dev/null @@ -1,117 +0,0 @@ -package streamrpc - -import ( - "context" - "fmt" - "io/ioutil" - "sort" - "strings" - "testing" - "time" - - "github.com/stretchr/testify/require" - testpb "gitlab.com/gitlab-org/gitaly/v14/internal/streamrpc/testdata" - "google.golang.org/grpc/metadata" - "google.golang.org/protobuf/types/known/emptypb" -) - -// TestProtocol exclusively uses hard-coded strings to prevent breaking -// changes in the wire protocol. -func TestProtocol(t *testing.T) { - testCases := []struct { - desc string - in string - out string - }{ - { - desc: "successful request", - in: "\x00\x00\x00\x28" + `{"Method":"/test.streamrpc.Test/Stream"}`, - out: strings.Join([]string{ - "\x00\x00\x00\x00", // Server accepts - "\n", // Handler prints request field (empty) followed by newline - }, ""), - }, - { - desc: "unknown method", - in: "\x00\x00\x00\x1b" + `{"Method":"does not exist"}`, - out: strings.Join([]string{ - "\x00\x00\x00\x2c", // Server rejects by sending non-empty error message - `{"Error":"method not found: does not exist"}`, - }, ""), - }, - { - desc: "request with message and metadata", - in: strings.Join([]string{ - "\x00\x00\x00\x73", - `{`, - `"Method":"/test.streamrpc.Test/Stream",`, - `"Message":"EgtoZWxsbyB3b3JsZA==",`, // &testpb.StreamRequest{StringField: "hello world"} - `"Metadata":{"k1":["v1","v2"],"k2":["v3"]}`, - `}`, - }, ""), - out: strings.Join([]string{ - "\x00\x00\x00\x00", // Server accepts - "k1: v1\nk1: v2\nk2: v3\n", // Server echoes metadata key-value pairs - "hello world\n", // Server echoes field from request message - }, ""), - }, - } - - for _, tc := range testCases { - t.Run(tc.desc, func(t *testing.T) { - dial := startServer( - t, - NewServer(), - func(ctx context.Context, in *testpb.StreamRequest) (*emptypb.Empty, error) { - c, err := AcceptConnection(ctx) - if err != nil { - return nil, err - } - - var mdKeys []string - var md metadata.MD - if ctxMD, ok := metadata.FromIncomingContext(ctx); ok { - md = ctxMD - } - - for k := range md { - mdKeys = append(mdKeys, k) - } - - // Direct go map iteration is non-deterministic. Sort the keys to make it - // deterministic. - sort.Strings(mdKeys) - - // Echo back metadata so tests can see it was received correctly - for _, k := range mdKeys { - for _, v := range md[k] { - if _, err := fmt.Fprintf(c, "%s: %s\n", k, v); err != nil { - return nil, err - } - } - } - - // Echo back string field so tests can see request was received correctly - if _, err := fmt.Fprintln(c, in.StringField); err != nil { - return nil, err - } - - return nil, nil - }, - ) - - c, err := dial(10 * time.Second) - require.NoError(t, err) - defer c.Close() - require.NoError(t, c.SetDeadline(time.Now().Add(10*time.Second))) - - n, err := c.Write([]byte(tc.in)) - require.NoError(t, err) - require.Equal(t, len(tc.in), n) - - out, err := ioutil.ReadAll(c) - require.NoError(t, err) - require.Equal(t, tc.out, string(out)) - }) - } -} diff --git a/internal/streamrpc/rpc_test.go b/internal/streamrpc/rpc_test.go deleted file mode 100644 index 850838465..000000000 --- a/internal/streamrpc/rpc_test.go +++ /dev/null @@ -1,312 +0,0 @@ -package streamrpc - -import ( - "bytes" - "context" - "errors" - "io" - "io/ioutil" - "math/rand" - "net" - "strings" - "testing" - "time" - - "github.com/stretchr/testify/require" - testpb "gitlab.com/gitlab-org/gitaly/v14/internal/streamrpc/testdata" - "google.golang.org/grpc" - "google.golang.org/grpc/metadata" - "google.golang.org/protobuf/types/known/emptypb" -) - -func TestCall(t *testing.T) { - const ( - testKey = "test key" - testValue = "test value" - blobSize = 1024 * 1024 - ) - - var receivedValues []string - var receivedField string - - dial := startServer( - t, - NewServer(), - func(ctx context.Context, in *testpb.StreamRequest) (*emptypb.Empty, error) { - receivedField = in.StringField - - if md, ok := metadata.FromIncomingContext(ctx); ok { - receivedValues = md[testKey] - } - - c, err := AcceptConnection(ctx) - if err != nil { - return nil, err - } - - _, err = io.CopyN(c, c, blobSize) - return nil, err - }, - ) - - in := make([]byte, blobSize) - _, err := rand.Read(in) - require.NoError(t, err) - - var out []byte - require.NotEqual(t, in, out) - - ctx := metadata.AppendToOutgoingContext(context.Background(), testKey, testValue) - require.NoError(t, Call( - ctx, - dial, - "/test.streamrpc.Test/Stream", - &testpb.StreamRequest{StringField: "hello world"}, - func(c net.Conn) error { - errC := make(chan error, 1) - go func() { - var err error - out, err = ioutil.ReadAll(c) - errC <- err - }() - - if _, err := io.Copy(c, bytes.NewReader(in)); err != nil { - return err - } - - return <-errC - }, - )) - - require.Equal(t, "hello world", receivedField, "request propagates") - require.Equal(t, []string{testValue}, receivedValues, "grpc metadata stored in client ctx propagates") - require.Equal(t, in, out, "byte stream works") -} - -func TestCall_serverError(t *testing.T) { - dial := startServer( - t, - NewServer(), - func(ctx context.Context, in *testpb.StreamRequest) (*emptypb.Empty, error) { - return nil, errors.New("this is the server error") - }, - ) - - callError := Call( - context.Background(), - dial, - "/test.streamrpc.Test/Stream", - &testpb.StreamRequest{}, - func(c net.Conn) error { panic("never reached") }, - ) - - require.Equal(t, &RequestRejectedError{"this is the server error"}, callError) -} - -func TestCall_clientMiddleware(t *testing.T) { - const ( - testKey = "test key" - testValue = "test value" - ) - - var receivedValues []string - var receivedField string - - dial := startServer( - t, - NewServer(), - func(ctx context.Context, in *testpb.StreamRequest) (*emptypb.Empty, error) { - _, err := AcceptConnection(ctx) - return nil, err - }, - ) - - var middlewareMethod string - ctx := metadata.AppendToOutgoingContext(context.Background(), testKey, testValue) - - const testMethod = "/test.streamrpc.Test/Stream" - require.NoError(t, Call( - ctx, - dial, - testMethod, - &testpb.StreamRequest{StringField: "hello world"}, - func(c net.Conn) error { return nil }, - WithClientInterceptor(func(ctx context.Context, method string, req, _ interface{}, _ *grpc.ClientConn, invoker grpc.UnaryInvoker, _ ...grpc.CallOption) error { - middlewareMethod = method - receivedField = req.(*testpb.StreamRequest).StringField - if md, ok := metadata.FromOutgoingContext(ctx); ok { - receivedValues = md[testKey] - } - return invoker(ctx, method, req, nil, nil) - }), - )) - - require.Equal(t, testMethod, middlewareMethod, "client middleware sees correct method") - require.Equal(t, "hello world", receivedField, "client middleware sees request") - require.Equal(t, []string{testValue}, receivedValues, "client middleware sees context metadata") -} - -func TestCall_clientMiddlewareReject(t *testing.T) { - dial := startServer( - t, - NewServer(), - func(ctx context.Context, in *testpb.StreamRequest) (*emptypb.Empty, error) { - panic("never reached") - }, - ) - - middlewareError := errors.New("middleware says no") - - err := Call( - context.Background(), - dial, - "/test.streamrpc.Test/Stream", - &testpb.StreamRequest{StringField: "hello world"}, - func(c net.Conn) error { return nil }, - WithClientInterceptor(func(ctx context.Context, method string, req, _ interface{}, _ *grpc.ClientConn, invoker grpc.UnaryInvoker, _ ...grpc.CallOption) error { - return middlewareError - }), - ) - - require.Equal(t, middlewareError, err) -} - -func TestCall_serverMiddleware(t *testing.T) { - const ( - testKey = "test key" - testValue = "test value" - testMethod = "/test.streamrpc.Test/Stream" - ) - - var ( - receivedField string - middlewareMethod string - receivedValues []string - ) - - interceptorDone := make(chan struct{}) - - dial := startServer( - t, - NewServer(WithServerInterceptor(func(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (resp interface{}, err error) { - defer close(interceptorDone) - middlewareMethod = info.FullMethod - receivedField = req.(*testpb.StreamRequest).StringField - if md, ok := metadata.FromIncomingContext(ctx); ok { - receivedValues = md[testKey] - } - return handler(ctx, req) - })), - func(ctx context.Context, in *testpb.StreamRequest) (*emptypb.Empty, error) { - _, err := AcceptConnection(ctx) - return nil, err - }, - ) - - ctx := metadata.AppendToOutgoingContext(context.Background(), testKey, testValue) - require.NoError(t, Call( - ctx, - dial, - testMethod, - &testpb.StreamRequest{StringField: "hello world"}, - func(c net.Conn) error { return nil }, - )) - - <-interceptorDone - require.Equal(t, testMethod, middlewareMethod, "server middleware sees correct method") - require.Equal(t, "hello world", receivedField, "server middleware sees request") - require.Equal(t, []string{testValue}, receivedValues, "server middleware sees context metadata") -} - -func TestCall_serverMiddlewareReject(t *testing.T) { - dial := startServer( - t, - NewServer(WithServerInterceptor(func(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (resp interface{}, err error) { - return nil, errors.New("middleware says no") - })), - func(ctx context.Context, in *testpb.StreamRequest) (*emptypb.Empty, error) { - panic("never reached") - }, - ) - - err := Call( - context.Background(), - dial, - "/test.streamrpc.Test/Stream", - &testpb.StreamRequest{}, - func(c net.Conn) error { return nil }, - ) - - require.Equal(t, &RequestRejectedError{message: "middleware says no"}, err) -} - -type testCredentials struct { - values map[string]string -} - -func (tc *testCredentials) GetRequestMetadata(ctx context.Context, uri ...string) (map[string]string, error) { - out := make(map[string]string) - for k, v := range tc.values { - out[k] = v - } - return out, nil -} - -func (*testCredentials) RequireTransportSecurity() bool { return false } - -func TestCall_credentials(t *testing.T) { - receivedValues := make(map[string]string) - interceptorDone := make(chan struct{}) - - dial := startServer( - t, - NewServer(), - func(ctx context.Context, in *testpb.StreamRequest) (*emptypb.Empty, error) { - defer close(interceptorDone) - - if md, ok := metadata.FromIncomingContext(ctx); ok { - receivedValues["key 1"] = strings.Join(md["key 1"], ",") - receivedValues["key 2"] = strings.Join(md["key 2"], ",") - } - - _, err := AcceptConnection(ctx) - return nil, err - }, - ) - - inputs := map[string]string{ - "key 1": "value a", - "key 2": "value b", - } - - require.NoError(t, Call( - context.Background(), - dial, - "/test.streamrpc.Test/Stream", - &testpb.StreamRequest{}, - func(c net.Conn) error { return nil }, - WithCredentials(&testCredentials{inputs}), - )) - - <-interceptorDone - require.Equal(t, inputs, receivedValues) -} - -func startServer(t *testing.T, s *Server, th testHandler) DialFunc { - t.Helper() - testpb.RegisterTestServer(s, &server{testHandler: th}) - client, server := socketPair(t) - go func() { _ = s.Handle(server) }() - return func(time.Duration) (net.Conn, error) { return client, nil } -} - -type testHandler func(ctx context.Context, in *testpb.StreamRequest) (*emptypb.Empty, error) - -type server struct { - testpb.UnimplementedTestServer - testHandler -} - -func (s *server) Stream(ctx context.Context, in *testpb.StreamRequest) (*emptypb.Empty, error) { - return s.testHandler(ctx, in) -} diff --git a/internal/streamrpc/server.go b/internal/streamrpc/server.go deleted file mode 100644 index 365898cae..000000000 --- a/internal/streamrpc/server.go +++ /dev/null @@ -1,166 +0,0 @@ -package streamrpc - -import ( - "context" - "encoding/json" - "errors" - "fmt" - "net" - "time" - - "google.golang.org/grpc" - "google.golang.org/grpc/metadata" - "google.golang.org/protobuf/proto" -) - -var _ grpc.ServiceRegistrar = &Server{} - -// Server handles network connections and routes them to StreamRPC handlers. -type Server struct { - methods map[string]*method - interceptor grpc.UnaryServerInterceptor -} - -type method struct { - *grpc.MethodDesc - implementation interface{} -} - -// ServerOption is an abstraction that lets you pass 0 or more server -// options to NewServer. -type ServerOption func(*Server) - -// WithServerInterceptor adds a unary gRPC server interceptor. -func WithServerInterceptor(interceptor grpc.UnaryServerInterceptor) ServerOption { - return func(s *Server) { s.interceptor = interceptor } -} - -// NewServer returns a new StreamRPC server. You can pass the result to -// grpc-go RegisterFooServer functions. -func NewServer(opts ...ServerOption) *Server { - s := &Server{ - methods: make(map[string]*method), - } - for _, o := range opts { - o(s) - } - return s -} - -// RegisterService implements grpc.ServiceRegistrar. It makes it possible -// to pass a *Server to grpc-go foopb.RegisterFooServer functions as the -// first argument. -func (s *Server) RegisterService(sd *grpc.ServiceDesc, impl interface{}) { - for i := range sd.Methods { - m := &sd.Methods[i] - s.methods["/"+sd.ServiceName+"/"+m.MethodName] = &method{ - MethodDesc: m, - implementation: impl, - } - } -} - -// Handle handles an incoming network connection with the StreamRPC -// protocol. It is intended to be called from a net.Listener.Accept loop -// (or something equivalent). -func (s *Server) Handle(c net.Conn) error { - defer c.Close() - - deadline := time.Now().Add(defaultHandshakeTimeout) - req, err := recvFrame(c, deadline) - if err != nil { - return err - } - - session := &serverSession{ - c: c, - deadline: deadline, - } - if err := s.handleSession(session, req); err != nil { - return session.reject(err) - } - - return nil -} - -func (s *Server) handleSession(session *serverSession, reqBytes []byte) error { - req := &request{} - if err := json.Unmarshal(reqBytes, req); err != nil { - return err - } - - method, ok := s.methods[req.Method] - if !ok { - return fmt.Errorf("method not found: %s", req.Method) - } - - ctx, cancel := serverContext(session, req) - defer cancel() - - if _, err := method.Handler( - method.implementation, - ctx, - func(msg interface{}) error { return proto.Unmarshal(req.Message, msg.(proto.Message)) }, - s.interceptor, - ); err != nil { - return err - } - - return nil -} - -func serverContext(session *serverSession, req *request) (context.Context, func()) { - ctx := context.Background() - ctx = context.WithValue(ctx, sessionKey{}, session) - ctx = metadata.NewIncomingContext(ctx, req.Metadata) - return context.WithCancel(ctx) -} - -type sessionKey struct{} - -// AcceptConnection completes the StreamRPC handshake on the server side. -// It notifies the client that the server has accepted the stream, and -// returns the connection. -func AcceptConnection(ctx context.Context) (net.Conn, error) { - session, ok := ctx.Value(sessionKey{}).(*serverSession) - if !ok { - return nil, errors.New("context has no serverSession") - } - return session.Accept() -} - -// serverSession wraps an incoming connection whose handshake has not -// been completed yet. -type serverSession struct { - c net.Conn - accepted bool - deadline time.Time -} - -// Accept completes the handshake on the connection wrapped by ss and -// unwraps the connection. -func (ss *serverSession) Accept() (net.Conn, error) { - if ss.accepted { - return nil, errors.New("connection already accepted") - } - - ss.accepted = true - if err := sendFrame(ss.c, nil, ss.deadline); err != nil { - return nil, fmt.Errorf("accept session: %w", err) - } - - return ss.c, nil -} - -func (ss *serverSession) reject(err error) error { - if ss.accepted { - return nil - } - - buf, err := json.Marshal(&response{Error: err.Error()}) - if err != nil { - return fmt.Errorf("mashal response: %w", err) - } - - return sendFrame(ss.c, buf, ss.deadline) -} diff --git a/internal/streamrpc/testdata/test.pb.go b/internal/streamrpc/testdata/test.pb.go deleted file mode 100644 index cc267eefd..000000000 --- a/internal/streamrpc/testdata/test.pb.go +++ /dev/null @@ -1,167 +0,0 @@ -// Code generated by protoc-gen-go. DO NOT EDIT. -// versions: -// protoc-gen-go v1.26.0 -// protoc v3.17.3 -// source: streamrpc/testdata/test.proto - -package testdata - -import ( - protoreflect "google.golang.org/protobuf/reflect/protoreflect" - protoimpl "google.golang.org/protobuf/runtime/protoimpl" - emptypb "google.golang.org/protobuf/types/known/emptypb" - reflect "reflect" - sync "sync" -) - -const ( - // Verify that this generated code is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) - // Verify that runtime/protoimpl is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) -) - -type StreamRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Fail bool `protobuf:"varint,1,opt,name=fail,proto3" json:"fail,omitempty"` - StringField string `protobuf:"bytes,2,opt,name=string_field,json=stringField,proto3" json:"string_field,omitempty"` -} - -func (x *StreamRequest) Reset() { - *x = StreamRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_streamrpc_testdata_test_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *StreamRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*StreamRequest) ProtoMessage() {} - -func (x *StreamRequest) ProtoReflect() protoreflect.Message { - mi := &file_streamrpc_testdata_test_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use StreamRequest.ProtoReflect.Descriptor instead. -func (*StreamRequest) Descriptor() ([]byte, []int) { - return file_streamrpc_testdata_test_proto_rawDescGZIP(), []int{0} -} - -func (x *StreamRequest) GetFail() bool { - if x != nil { - return x.Fail - } - return false -} - -func (x *StreamRequest) GetStringField() string { - if x != nil { - return x.StringField - } - return "" -} - -var File_streamrpc_testdata_test_proto protoreflect.FileDescriptor - -var file_streamrpc_testdata_test_proto_rawDesc = []byte{ - 0x0a, 0x1d, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x72, 0x70, 0x63, 0x2f, 0x74, 0x65, 0x73, 0x74, - 0x64, 0x61, 0x74, 0x61, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, - 0x0e, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x72, 0x70, 0x63, 0x1a, - 0x1b, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x46, 0x0a, 0x0d, - 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, - 0x04, 0x66, 0x61, 0x69, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x66, 0x61, 0x69, - 0x6c, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x66, 0x69, 0x65, 0x6c, - 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x46, - 0x69, 0x65, 0x6c, 0x64, 0x32, 0x49, 0x0a, 0x04, 0x54, 0x65, 0x73, 0x74, 0x12, 0x41, 0x0a, 0x06, - 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, 0x1d, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x73, 0x74, - 0x72, 0x65, 0x61, 0x6d, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x42, - 0x3e, 0x5a, 0x3c, 0x67, 0x69, 0x74, 0x6c, 0x61, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x69, - 0x74, 0x6c, 0x61, 0x62, 0x2d, 0x6f, 0x72, 0x67, 0x2f, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2f, - 0x76, 0x31, 0x34, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2f, 0x73, 0x74, 0x72, - 0x65, 0x61, 0x6d, 0x72, 0x70, 0x63, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x64, 0x61, 0x74, 0x61, 0x62, - 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, -} - -var ( - file_streamrpc_testdata_test_proto_rawDescOnce sync.Once - file_streamrpc_testdata_test_proto_rawDescData = file_streamrpc_testdata_test_proto_rawDesc -) - -func file_streamrpc_testdata_test_proto_rawDescGZIP() []byte { - file_streamrpc_testdata_test_proto_rawDescOnce.Do(func() { - file_streamrpc_testdata_test_proto_rawDescData = protoimpl.X.CompressGZIP(file_streamrpc_testdata_test_proto_rawDescData) - }) - return file_streamrpc_testdata_test_proto_rawDescData -} - -var file_streamrpc_testdata_test_proto_msgTypes = make([]protoimpl.MessageInfo, 1) -var file_streamrpc_testdata_test_proto_goTypes = []interface{}{ - (*StreamRequest)(nil), // 0: test.streamrpc.StreamRequest - (*emptypb.Empty)(nil), // 1: google.protobuf.Empty -} -var file_streamrpc_testdata_test_proto_depIdxs = []int32{ - 0, // 0: test.streamrpc.Test.Stream:input_type -> test.streamrpc.StreamRequest - 1, // 1: test.streamrpc.Test.Stream:output_type -> google.protobuf.Empty - 1, // [1:2] is the sub-list for method output_type - 0, // [0:1] is the sub-list for method input_type - 0, // [0:0] is the sub-list for extension type_name - 0, // [0:0] is the sub-list for extension extendee - 0, // [0:0] is the sub-list for field type_name -} - -func init() { file_streamrpc_testdata_test_proto_init() } -func file_streamrpc_testdata_test_proto_init() { - if File_streamrpc_testdata_test_proto != nil { - return - } - if !protoimpl.UnsafeEnabled { - file_streamrpc_testdata_test_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StreamRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - } - type x struct{} - out := protoimpl.TypeBuilder{ - File: protoimpl.DescBuilder{ - GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_streamrpc_testdata_test_proto_rawDesc, - NumEnums: 0, - NumMessages: 1, - NumExtensions: 0, - NumServices: 1, - }, - GoTypes: file_streamrpc_testdata_test_proto_goTypes, - DependencyIndexes: file_streamrpc_testdata_test_proto_depIdxs, - MessageInfos: file_streamrpc_testdata_test_proto_msgTypes, - }.Build() - File_streamrpc_testdata_test_proto = out.File - file_streamrpc_testdata_test_proto_rawDesc = nil - file_streamrpc_testdata_test_proto_goTypes = nil - file_streamrpc_testdata_test_proto_depIdxs = nil -} diff --git a/internal/streamrpc/testdata/test.proto b/internal/streamrpc/testdata/test.proto deleted file mode 100644 index 7614a07a9..000000000 --- a/internal/streamrpc/testdata/test.proto +++ /dev/null @@ -1,16 +0,0 @@ -syntax = "proto3"; - -package test.streamrpc; - -option go_package = "gitlab.com/gitlab-org/gitaly/v14/internal/streamrpc/testdata"; - -import "google/protobuf/empty.proto"; - -service Test { - rpc Stream(StreamRequest) returns (google.protobuf.Empty) {} -} - -message StreamRequest { - bool fail = 1; - string string_field = 2; -} diff --git a/internal/streamrpc/testdata/test_grpc.pb.go b/internal/streamrpc/testdata/test_grpc.pb.go deleted file mode 100644 index 53fb22792..000000000 --- a/internal/streamrpc/testdata/test_grpc.pb.go +++ /dev/null @@ -1,102 +0,0 @@ -// Code generated by protoc-gen-go-grpc. DO NOT EDIT. - -package testdata - -import ( - context "context" - grpc "google.golang.org/grpc" - codes "google.golang.org/grpc/codes" - status "google.golang.org/grpc/status" - emptypb "google.golang.org/protobuf/types/known/emptypb" -) - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the grpc package it is being compiled against. -// Requires gRPC-Go v1.32.0 or later. -const _ = grpc.SupportPackageIsVersion7 - -// TestClient is the client API for Test service. -// -// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. -type TestClient interface { - Stream(ctx context.Context, in *StreamRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) -} - -type testClient struct { - cc grpc.ClientConnInterface -} - -func NewTestClient(cc grpc.ClientConnInterface) TestClient { - return &testClient{cc} -} - -func (c *testClient) Stream(ctx context.Context, in *StreamRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { - out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, "/test.streamrpc.Test/Stream", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -// TestServer is the server API for Test service. -// All implementations must embed UnimplementedTestServer -// for forward compatibility -type TestServer interface { - Stream(context.Context, *StreamRequest) (*emptypb.Empty, error) - mustEmbedUnimplementedTestServer() -} - -// UnimplementedTestServer must be embedded to have forward compatible implementations. -type UnimplementedTestServer struct { -} - -func (UnimplementedTestServer) Stream(context.Context, *StreamRequest) (*emptypb.Empty, error) { - return nil, status.Errorf(codes.Unimplemented, "method Stream not implemented") -} -func (UnimplementedTestServer) mustEmbedUnimplementedTestServer() {} - -// UnsafeTestServer may be embedded to opt out of forward compatibility for this service. -// Use of this interface is not recommended, as added methods to TestServer will -// result in compilation errors. -type UnsafeTestServer interface { - mustEmbedUnimplementedTestServer() -} - -func RegisterTestServer(s grpc.ServiceRegistrar, srv TestServer) { - s.RegisterService(&Test_ServiceDesc, srv) -} - -func _Test_Stream_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(StreamRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(TestServer).Stream(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/test.streamrpc.Test/Stream", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(TestServer).Stream(ctx, req.(*StreamRequest)) - } - return interceptor(ctx, in, info, handler) -} - -// Test_ServiceDesc is the grpc.ServiceDesc for Test service. -// It's only intended for direct use with grpc.RegisterService, -// and not to be introspected or modified (even as a copy) -var Test_ServiceDesc = grpc.ServiceDesc{ - ServiceName: "test.streamrpc.Test", - HandlerType: (*TestServer)(nil), - Methods: []grpc.MethodDesc{ - { - MethodName: "Stream", - Handler: _Test_Stream_Handler, - }, - }, - Streams: []grpc.StreamDesc{}, - Metadata: "streamrpc/testdata/test.proto", -} diff --git a/proto/blob.proto b/proto/blob.proto index f3b16cceb..4d6653bc4 100644 --- a/proto/blob.proto +++ b/proto/blob.proto @@ -132,6 +132,10 @@ message ListBlobsRequest { // to `0`, then no blob data will be sent. If `-1`, then all blob data will // be sent without any limits. int64 bytes_limit = 4; + // WithPaths determines whether paths of blobs should be returned. When + // set to `true`, paths are returned on a best-effort basis: a path will only + // exist if the blob was traversed via a tree. + bool with_paths = 5; } // ListBlobsResponse is a response for the ListBlobs RPC. @@ -147,6 +151,9 @@ message ListBlobsResponse { // Data is the contents of the blob. This field is optional and depends on // the BytesLimit in the original request. bytes data = 3; + // Path is the path of the blob. May be unset depending on how the blob had + // been traversed. + bytes path = 4; } // Blobs is the blobs which have been found. In case blob contents were diff --git a/proto/go/gitalypb/blob.pb.go b/proto/go/gitalypb/blob.pb.go index f26183e1d..5e1e0b406 100644 --- a/proto/go/gitalypb/blob.pb.go +++ b/proto/go/gitalypb/blob.pb.go @@ -342,6 +342,10 @@ type ListBlobsRequest struct { // to `0`, then no blob data will be sent. If `-1`, then all blob data will // be sent without any limits. BytesLimit int64 `protobuf:"varint,4,opt,name=bytes_limit,json=bytesLimit,proto3" json:"bytes_limit,omitempty"` + // WithPaths determines whether paths of blobs should be returned. When + // set to `true`, paths are returned on a best-effort basis: a path will only + // exist if the blob was traversed via a tree. + WithPaths bool `protobuf:"varint,5,opt,name=with_paths,json=withPaths,proto3" json:"with_paths,omitempty"` } func (x *ListBlobsRequest) Reset() { @@ -404,6 +408,13 @@ func (x *ListBlobsRequest) GetBytesLimit() int64 { return 0 } +func (x *ListBlobsRequest) GetWithPaths() bool { + if x != nil { + return x.WithPaths + } + return false +} + // ListBlobsResponse is a response for the ListBlobs RPC. type ListBlobsResponse struct { state protoimpl.MessageState @@ -1117,6 +1128,9 @@ type ListBlobsResponse_Blob struct { // Data is the contents of the blob. This field is optional and depends on // the BytesLimit in the original request. Data []byte `protobuf:"bytes,3,opt,name=data,proto3" json:"data,omitempty"` + // Path is the path of the blob. May be unset depending on how the blob had + // been traversed. + Path []byte `protobuf:"bytes,4,opt,name=path,proto3" json:"path,omitempty"` } func (x *ListBlobsResponse_Blob) Reset() { @@ -1172,6 +1186,13 @@ func (x *ListBlobsResponse_Blob) GetData() []byte { return nil } +func (x *ListBlobsResponse_Blob) GetPath() []byte { + if x != nil { + return x.Path + } + return nil +} + // Blob represents a Git blob object. type ListAllBlobsResponse_Blob struct { state protoimpl.MessageState @@ -1288,7 +1309,7 @@ var file_blob_proto_rawDesc = []byte{ 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x26, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x12, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x4f, 0x62, - 0x6a, 0x65, 0x63, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0xa1, + 0x6a, 0x65, 0x63, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0xc0, 0x01, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x6c, 0x6f, 0x62, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, @@ -1299,122 +1320,125 @@ var file_blob_proto_rawDesc = []byte{ 0x69, 0x6d, 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x62, 0x79, 0x74, 0x65, 0x73, 0x4c, 0x69, 0x6d, - 0x69, 0x74, 0x22, 0x8b, 0x01, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x6c, 0x6f, 0x62, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x34, 0x0a, 0x05, 0x62, 0x6c, 0x6f, 0x62, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, - 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x6c, 0x6f, 0x62, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x69, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x73, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x77, 0x69, 0x74, 0x68, 0x50, 0x61, 0x74, 0x68, + 0x73, 0x22, 0x9f, 0x01, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x6c, 0x6f, 0x62, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x34, 0x0a, 0x05, 0x62, 0x6c, 0x6f, 0x62, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, + 0x4c, 0x69, 0x73, 0x74, 0x42, 0x6c, 0x6f, 0x62, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x2e, 0x42, 0x6c, 0x6f, 0x62, 0x52, 0x05, 0x62, 0x6c, 0x6f, 0x62, 0x73, 0x1a, 0x54, 0x0a, + 0x04, 0x42, 0x6c, 0x6f, 0x62, 0x12, 0x10, 0x0a, 0x03, 0x6f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x6f, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, + 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, + 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x70, + 0x61, 0x74, 0x68, 0x22, 0x86, 0x01, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x42, + 0x6c, 0x6f, 0x62, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0a, 0x72, + 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x12, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, + 0x6f, 0x72, 0x79, 0x42, 0x04, 0x98, 0xc6, 0x2c, 0x01, 0x52, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, + 0x69, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x62, + 0x79, 0x74, 0x65, 0x73, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x0a, 0x62, 0x79, 0x74, 0x65, 0x73, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x22, 0x91, 0x01, 0x0a, + 0x14, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x42, 0x6c, 0x6f, 0x62, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x37, 0x0a, 0x05, 0x62, 0x6c, 0x6f, 0x62, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x4c, 0x69, + 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x42, 0x6c, 0x6f, 0x62, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x42, 0x6c, 0x6f, 0x62, 0x52, 0x05, 0x62, 0x6c, 0x6f, 0x62, 0x73, 0x1a, 0x40, 0x0a, 0x04, 0x42, 0x6c, 0x6f, 0x62, 0x12, 0x10, 0x0a, 0x03, 0x6f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6f, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, - 0x22, 0x86, 0x01, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x42, 0x6c, 0x6f, 0x62, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0a, 0x72, 0x65, 0x70, 0x6f, - 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, - 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, - 0x42, 0x04, 0x98, 0xc6, 0x2c, 0x01, 0x52, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, - 0x72, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x62, 0x79, 0x74, 0x65, - 0x73, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x62, - 0x79, 0x74, 0x65, 0x73, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x22, 0x91, 0x01, 0x0a, 0x14, 0x4c, 0x69, - 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x42, 0x6c, 0x6f, 0x62, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x37, 0x0a, 0x05, 0x62, 0x6c, 0x6f, 0x62, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x21, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, - 0x6c, 0x6c, 0x42, 0x6c, 0x6f, 0x62, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, - 0x42, 0x6c, 0x6f, 0x62, 0x52, 0x05, 0x62, 0x6c, 0x6f, 0x62, 0x73, 0x1a, 0x40, 0x0a, 0x04, 0x42, - 0x6c, 0x6f, 0x62, 0x12, 0x10, 0x0a, 0x03, 0x6f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x6f, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, - 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x46, 0x0a, - 0x0a, 0x4c, 0x46, 0x53, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x73, - 0x69, 0x7a, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, - 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, - 0x61, 0x74, 0x61, 0x12, 0x10, 0x0a, 0x03, 0x6f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x6f, 0x69, 0x64, 0x22, 0x49, 0x0a, 0x0d, 0x4e, 0x65, 0x77, 0x42, 0x6c, 0x6f, 0x62, - 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x6f, 0x69, - 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6f, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, - 0x70, 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, - 0x22, 0x6c, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x4c, 0x46, 0x53, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x65, - 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0a, 0x72, 0x65, 0x70, - 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, - 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, - 0x79, 0x42, 0x04, 0x98, 0xc6, 0x2c, 0x01, 0x52, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, - 0x6f, 0x72, 0x79, 0x12, 0x19, 0x0a, 0x08, 0x62, 0x6c, 0x6f, 0x62, 0x5f, 0x69, 0x64, 0x73, 0x18, - 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x62, 0x6c, 0x6f, 0x62, 0x49, 0x64, 0x73, 0x22, 0x4f, - 0x0a, 0x16, 0x47, 0x65, 0x74, 0x4c, 0x46, 0x53, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x0c, 0x6c, 0x66, 0x73, 0x5f, - 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, - 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x4c, 0x46, 0x53, 0x50, 0x6f, 0x69, 0x6e, 0x74, - 0x65, 0x72, 0x52, 0x0b, 0x6c, 0x66, 0x73, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x22, - 0x86, 0x01, 0x0a, 0x16, 0x4c, 0x69, 0x73, 0x74, 0x4c, 0x46, 0x53, 0x50, 0x6f, 0x69, 0x6e, 0x74, + 0x22, 0x46, 0x0a, 0x0a, 0x4c, 0x46, 0x53, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x12, 0x12, + 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x73, 0x69, + 0x7a, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x10, 0x0a, 0x03, 0x6f, 0x69, 0x64, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x6f, 0x69, 0x64, 0x22, 0x49, 0x0a, 0x0d, 0x4e, 0x65, 0x77, 0x42, + 0x6c, 0x6f, 0x62, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x10, 0x0a, + 0x03, 0x6f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6f, 0x69, 0x64, 0x12, + 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x70, + 0x61, 0x74, 0x68, 0x22, 0x6c, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x4c, 0x46, 0x53, 0x50, 0x6f, 0x69, + 0x6e, 0x74, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0a, + 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x12, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, + 0x74, 0x6f, 0x72, 0x79, 0x42, 0x04, 0x98, 0xc6, 0x2c, 0x01, 0x52, 0x0a, 0x72, 0x65, 0x70, 0x6f, + 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x19, 0x0a, 0x08, 0x62, 0x6c, 0x6f, 0x62, 0x5f, 0x69, + 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x62, 0x6c, 0x6f, 0x62, 0x49, 0x64, + 0x73, 0x22, 0x4f, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x4c, 0x46, 0x53, 0x50, 0x6f, 0x69, 0x6e, 0x74, + 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x0c, 0x6c, + 0x66, 0x73, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x4c, 0x46, 0x53, 0x50, 0x6f, + 0x69, 0x6e, 0x74, 0x65, 0x72, 0x52, 0x0b, 0x6c, 0x66, 0x73, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x65, + 0x72, 0x73, 0x22, 0x86, 0x01, 0x0a, 0x16, 0x4c, 0x69, 0x73, 0x74, 0x4c, 0x46, 0x53, 0x50, 0x6f, + 0x69, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, + 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x73, + 0x69, 0x74, 0x6f, 0x72, 0x79, 0x42, 0x04, 0x98, 0xc6, 0x2c, 0x01, 0x52, 0x0a, 0x72, 0x65, 0x70, + 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x22, 0x50, 0x0a, 0x17, 0x4c, + 0x69, 0x73, 0x74, 0x4c, 0x46, 0x53, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x0c, 0x6c, 0x66, 0x73, 0x5f, 0x70, 0x6f, + 0x69, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, + 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x4c, 0x46, 0x53, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, + 0x52, 0x0b, 0x6c, 0x66, 0x73, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x22, 0x6b, 0x0a, + 0x19, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x4c, 0x46, 0x53, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x42, 0x04, 0x98, 0xc6, 0x2c, 0x01, 0x52, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, - 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, - 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x22, 0x50, 0x0a, 0x17, 0x4c, 0x69, 0x73, 0x74, - 0x4c, 0x46, 0x53, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x0c, 0x6c, 0x66, 0x73, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, - 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x69, 0x74, 0x61, - 0x6c, 0x79, 0x2e, 0x4c, 0x46, 0x53, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x52, 0x0b, 0x6c, - 0x66, 0x73, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x22, 0x6b, 0x0a, 0x19, 0x4c, 0x69, + 0x74, 0x6f, 0x72, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x22, 0x53, 0x0a, 0x1a, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x4c, 0x46, 0x53, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, - 0x69, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x69, - 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x42, - 0x04, 0x98, 0xc6, 0x2c, 0x01, 0x52, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, - 0x79, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x22, 0x53, 0x0a, 0x1a, 0x4c, 0x69, 0x73, 0x74, 0x41, - 0x6c, 0x6c, 0x4c, 0x46, 0x53, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x0c, 0x6c, 0x66, 0x73, 0x5f, 0x70, 0x6f, 0x69, - 0x6e, 0x74, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x69, - 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x4c, 0x46, 0x53, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x52, - 0x0b, 0x6c, 0x66, 0x73, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x32, 0xdd, 0x04, 0x0a, - 0x0b, 0x42, 0x6c, 0x6f, 0x62, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x44, 0x0a, 0x07, - 0x47, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x62, 0x12, 0x16, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, - 0x2e, 0x47, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x17, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x62, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xfa, 0x97, 0x28, 0x02, 0x08, 0x02, - 0x30, 0x01, 0x12, 0x47, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x62, 0x73, 0x12, 0x17, - 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x62, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, - 0x2e, 0x47, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x62, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x06, 0xfa, 0x97, 0x28, 0x02, 0x08, 0x02, 0x30, 0x01, 0x12, 0x4a, 0x0a, 0x09, 0x4c, - 0x69, 0x73, 0x74, 0x42, 0x6c, 0x6f, 0x62, 0x73, 0x12, 0x18, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, - 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x6c, 0x6f, 0x62, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, - 0x42, 0x6c, 0x6f, 0x62, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xfa, - 0x97, 0x28, 0x02, 0x08, 0x02, 0x30, 0x01, 0x12, 0x53, 0x0a, 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x41, - 0x6c, 0x6c, 0x42, 0x6c, 0x6f, 0x62, 0x73, 0x12, 0x1b, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, - 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x42, 0x6c, 0x6f, 0x62, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x4c, 0x69, - 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x42, 0x6c, 0x6f, 0x62, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x06, 0xfa, 0x97, 0x28, 0x02, 0x08, 0x02, 0x30, 0x01, 0x12, 0x59, 0x0a, 0x0e, - 0x47, 0x65, 0x74, 0x4c, 0x46, 0x53, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x12, 0x1d, - 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x4c, 0x46, 0x53, 0x50, 0x6f, - 0x69, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, - 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x4c, 0x46, 0x53, 0x50, 0x6f, 0x69, - 0x6e, 0x74, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xfa, - 0x97, 0x28, 0x02, 0x08, 0x02, 0x30, 0x01, 0x12, 0x5c, 0x0a, 0x0f, 0x4c, 0x69, 0x73, 0x74, 0x4c, - 0x46, 0x53, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x12, 0x1e, 0x2e, 0x67, 0x69, 0x74, - 0x61, 0x6c, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4c, 0x46, 0x53, 0x50, 0x6f, 0x69, 0x6e, 0x74, - 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x67, 0x69, 0x74, - 0x61, 0x6c, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4c, 0x46, 0x53, 0x50, 0x6f, 0x69, 0x6e, 0x74, - 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xfa, 0x97, 0x28, - 0x02, 0x08, 0x02, 0x30, 0x01, 0x12, 0x65, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x6c, 0x6c, - 0x4c, 0x46, 0x53, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x12, 0x21, 0x2e, 0x67, 0x69, - 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x4c, 0x46, 0x53, 0x50, - 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x0c, 0x6c, 0x66, 0x73, 0x5f, + 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, + 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x4c, 0x46, 0x53, 0x50, 0x6f, 0x69, 0x6e, 0x74, + 0x65, 0x72, 0x52, 0x0b, 0x6c, 0x66, 0x73, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x32, + 0xdd, 0x04, 0x0a, 0x0b, 0x42, 0x6c, 0x6f, 0x62, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, + 0x44, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x62, 0x12, 0x16, 0x2e, 0x67, 0x69, 0x74, + 0x61, 0x6c, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x42, + 0x6c, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xfa, 0x97, 0x28, + 0x02, 0x08, 0x02, 0x30, 0x01, 0x12, 0x47, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x62, + 0x73, 0x12, 0x17, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x6c, + 0x6f, 0x62, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x67, 0x69, 0x74, + 0x61, 0x6c, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x62, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xfa, 0x97, 0x28, 0x02, 0x08, 0x02, 0x30, 0x01, 0x12, 0x4a, + 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x6c, 0x6f, 0x62, 0x73, 0x12, 0x18, 0x2e, 0x67, 0x69, + 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x6c, 0x6f, 0x62, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x4c, + 0x69, 0x73, 0x74, 0x42, 0x6c, 0x6f, 0x62, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x06, 0xfa, 0x97, 0x28, 0x02, 0x08, 0x02, 0x30, 0x01, 0x12, 0x53, 0x0a, 0x0c, 0x4c, 0x69, + 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x42, 0x6c, 0x6f, 0x62, 0x73, 0x12, 0x1b, 0x2e, 0x67, 0x69, 0x74, + 0x61, 0x6c, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x42, 0x6c, 0x6f, 0x62, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, + 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x42, 0x6c, 0x6f, 0x62, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xfa, 0x97, 0x28, 0x02, 0x08, 0x02, 0x30, 0x01, 0x12, + 0x59, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x4c, 0x46, 0x53, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, + 0x73, 0x12, 0x1d, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x4c, 0x46, + 0x53, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x1e, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x4c, 0x46, 0x53, + 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x06, 0xfa, 0x97, 0x28, 0x02, 0x08, 0x02, 0x30, 0x01, 0x12, 0x5c, 0x0a, 0x0f, 0x4c, 0x69, + 0x73, 0x74, 0x4c, 0x46, 0x53, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x12, 0x1e, 0x2e, + 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4c, 0x46, 0x53, 0x50, 0x6f, + 0x69, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, + 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4c, 0x46, 0x53, 0x50, 0x6f, + 0x69, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, + 0xfa, 0x97, 0x28, 0x02, 0x08, 0x02, 0x30, 0x01, 0x12, 0x65, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, + 0x41, 0x6c, 0x6c, 0x4c, 0x46, 0x53, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x12, 0x21, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x4c, - 0x46, 0x53, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x06, 0xfa, 0x97, 0x28, 0x02, 0x08, 0x02, 0x30, 0x01, 0x42, 0x34, 0x5a, 0x32, - 0x67, 0x69, 0x74, 0x6c, 0x61, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x69, 0x74, 0x6c, 0x61, - 0x62, 0x2d, 0x6f, 0x72, 0x67, 0x2f, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2f, 0x76, 0x31, 0x34, - 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x2f, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, - 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x46, 0x53, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x22, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, + 0x6c, 0x6c, 0x4c, 0x46, 0x53, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xfa, 0x97, 0x28, 0x02, 0x08, 0x02, 0x30, 0x01, 0x42, + 0x34, 0x5a, 0x32, 0x67, 0x69, 0x74, 0x6c, 0x61, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x69, + 0x74, 0x6c, 0x61, 0x62, 0x2d, 0x6f, 0x72, 0x67, 0x2f, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2f, + 0x76, 0x31, 0x34, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x2f, 0x67, 0x69, 0x74, + 0x61, 0x6c, 0x79, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/proto/go/gitalypb/hook.pb.go b/proto/go/gitalypb/hook.pb.go index a25bf0254..51fbaf539 100644 --- a/proto/go/gitalypb/hook.pb.go +++ b/proto/go/gitalypb/hook.pb.go @@ -735,6 +735,100 @@ func (x *PackObjectsHookResponse) GetStderr() []byte { return nil } +type PackObjectsHookWithSidechannelRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Repository *Repository `protobuf:"bytes,1,opt,name=repository,proto3" json:"repository,omitempty"` + // args contains the arguments passed to the pack-objects hook, without the leading "git" + Args []string `protobuf:"bytes,2,rep,name=args,proto3" json:"args,omitempty"` +} + +func (x *PackObjectsHookWithSidechannelRequest) Reset() { + *x = PackObjectsHookWithSidechannelRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_hook_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PackObjectsHookWithSidechannelRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PackObjectsHookWithSidechannelRequest) ProtoMessage() {} + +func (x *PackObjectsHookWithSidechannelRequest) ProtoReflect() protoreflect.Message { + mi := &file_hook_proto_msgTypes[10] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use PackObjectsHookWithSidechannelRequest.ProtoReflect.Descriptor instead. +func (*PackObjectsHookWithSidechannelRequest) Descriptor() ([]byte, []int) { + return file_hook_proto_rawDescGZIP(), []int{10} +} + +func (x *PackObjectsHookWithSidechannelRequest) GetRepository() *Repository { + if x != nil { + return x.Repository + } + return nil +} + +func (x *PackObjectsHookWithSidechannelRequest) GetArgs() []string { + if x != nil { + return x.Args + } + return nil +} + +type PackObjectsHookWithSidechannelResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *PackObjectsHookWithSidechannelResponse) Reset() { + *x = PackObjectsHookWithSidechannelResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_hook_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PackObjectsHookWithSidechannelResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PackObjectsHookWithSidechannelResponse) ProtoMessage() {} + +func (x *PackObjectsHookWithSidechannelResponse) ProtoReflect() protoreflect.Message { + mi := &file_hook_proto_msgTypes[11] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use PackObjectsHookWithSidechannelResponse.ProtoReflect.Descriptor instead. +func (*PackObjectsHookWithSidechannelResponse) Descriptor() ([]byte, []int) { + return file_hook_proto_rawDescGZIP(), []int{11} +} + var File_hook_proto protoreflect.FileDescriptor var file_hook_proto_rawDesc = []byte{ @@ -842,42 +936,60 @@ var file_hook_proto_rawDesc = []byte{ 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x73, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x64, 0x65, 0x72, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x73, 0x74, 0x64, 0x65, 0x72, 0x72, - 0x32, 0xf4, 0x03, 0x0a, 0x0b, 0x48, 0x6f, 0x6f, 0x6b, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x12, 0x5b, 0x0a, 0x0e, 0x50, 0x72, 0x65, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x48, 0x6f, - 0x6f, 0x6b, 0x12, 0x1d, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x50, 0x72, 0x65, 0x52, + 0x22, 0x75, 0x0a, 0x25, 0x50, 0x61, 0x63, 0x6b, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x48, + 0x6f, 0x6f, 0x6b, 0x57, 0x69, 0x74, 0x68, 0x53, 0x69, 0x64, 0x65, 0x63, 0x68, 0x61, 0x6e, 0x6e, + 0x65, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0a, 0x72, 0x65, 0x70, + 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, + 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, + 0x79, 0x42, 0x04, 0x98, 0xc6, 0x2c, 0x01, 0x52, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, + 0x6f, 0x72, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x72, 0x67, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x04, 0x61, 0x72, 0x67, 0x73, 0x22, 0x28, 0x0a, 0x26, 0x50, 0x61, 0x63, 0x6b, 0x4f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x48, 0x6f, 0x6f, 0x6b, 0x57, 0x69, 0x74, 0x68, 0x53, 0x69, + 0x64, 0x65, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x32, 0xfe, 0x04, 0x0a, 0x0b, 0x48, 0x6f, 0x6f, 0x6b, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x12, 0x5b, 0x0a, 0x0e, 0x50, 0x72, 0x65, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x48, + 0x6f, 0x6f, 0x6b, 0x12, 0x1d, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x50, 0x72, 0x65, + 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x48, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x50, 0x72, 0x65, 0x52, + 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x48, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x06, 0xfa, 0x97, 0x28, 0x02, 0x08, 0x02, 0x28, 0x01, 0x30, 0x01, 0x12, 0x5e, + 0x0a, 0x0f, 0x50, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x48, 0x6f, 0x6f, + 0x6b, 0x12, 0x1e, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x48, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x1e, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x50, 0x72, 0x65, 0x52, 0x65, - 0x63, 0x65, 0x69, 0x76, 0x65, 0x48, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x06, 0xfa, 0x97, 0x28, 0x02, 0x08, 0x02, 0x28, 0x01, 0x30, 0x01, 0x12, 0x5e, 0x0a, - 0x0f, 0x50, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x48, 0x6f, 0x6f, 0x6b, - 0x12, 0x1e, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x52, 0x65, - 0x63, 0x65, 0x69, 0x76, 0x65, 0x48, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x1f, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x52, 0x65, - 0x63, 0x65, 0x69, 0x76, 0x65, 0x48, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x06, 0xfa, 0x97, 0x28, 0x02, 0x08, 0x02, 0x28, 0x01, 0x30, 0x01, 0x12, 0x4d, 0x0a, - 0x0a, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x48, 0x6f, 0x6f, 0x6b, 0x12, 0x19, 0x2e, 0x67, 0x69, - 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x48, 0x6f, 0x6f, 0x6b, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, - 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x48, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x06, 0xfa, 0x97, 0x28, 0x02, 0x08, 0x02, 0x30, 0x01, 0x12, 0x79, 0x0a, 0x18, - 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x6f, 0x6f, 0x6b, 0x12, 0x27, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, - 0x79, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, - 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x28, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, - 0x65, 0x6e, 0x63, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x48, - 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xfa, 0x97, 0x28, - 0x02, 0x08, 0x02, 0x28, 0x01, 0x30, 0x01, 0x12, 0x5e, 0x0a, 0x0f, 0x50, 0x61, 0x63, 0x6b, 0x4f, - 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x48, 0x6f, 0x6f, 0x6b, 0x12, 0x1e, 0x2e, 0x67, 0x69, 0x74, - 0x61, 0x6c, 0x79, 0x2e, 0x50, 0x61, 0x63, 0x6b, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x48, - 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x67, 0x69, 0x74, + 0x74, 0x1a, 0x1f, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x52, + 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x48, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x06, 0xfa, 0x97, 0x28, 0x02, 0x08, 0x02, 0x28, 0x01, 0x30, 0x01, 0x12, 0x4d, + 0x0a, 0x0a, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x48, 0x6f, 0x6f, 0x6b, 0x12, 0x19, 0x2e, 0x67, + 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x48, 0x6f, 0x6f, 0x6b, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, + 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x48, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x06, 0xfa, 0x97, 0x28, 0x02, 0x08, 0x02, 0x30, 0x01, 0x12, 0x79, 0x0a, + 0x18, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x6f, 0x6f, 0x6b, 0x12, 0x27, 0x2e, 0x67, 0x69, 0x74, 0x61, + 0x6c, 0x79, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x54, 0x72, 0x61, 0x6e, + 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x52, 0x65, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x48, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xfa, 0x97, + 0x28, 0x02, 0x08, 0x02, 0x28, 0x01, 0x30, 0x01, 0x12, 0x5e, 0x0a, 0x0f, 0x50, 0x61, 0x63, 0x6b, + 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x48, 0x6f, 0x6f, 0x6b, 0x12, 0x1e, 0x2e, 0x67, 0x69, + 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x50, 0x61, 0x63, 0x6b, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, + 0x48, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x67, 0x69, + 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x50, 0x61, 0x63, 0x6b, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, + 0x48, 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xfa, 0x97, + 0x28, 0x02, 0x08, 0x02, 0x28, 0x01, 0x30, 0x01, 0x12, 0x87, 0x01, 0x0a, 0x1e, 0x50, 0x61, 0x63, + 0x6b, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x48, 0x6f, 0x6f, 0x6b, 0x57, 0x69, 0x74, 0x68, + 0x53, 0x69, 0x64, 0x65, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x12, 0x2d, 0x2e, 0x67, 0x69, + 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x50, 0x61, 0x63, 0x6b, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, + 0x48, 0x6f, 0x6f, 0x6b, 0x57, 0x69, 0x74, 0x68, 0x53, 0x69, 0x64, 0x65, 0x63, 0x68, 0x61, 0x6e, + 0x6e, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x50, 0x61, 0x63, 0x6b, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x48, - 0x6f, 0x6f, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xfa, 0x97, 0x28, - 0x02, 0x08, 0x02, 0x28, 0x01, 0x30, 0x01, 0x42, 0x34, 0x5a, 0x32, 0x67, 0x69, 0x74, 0x6c, 0x61, - 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x69, 0x74, 0x6c, 0x61, 0x62, 0x2d, 0x6f, 0x72, 0x67, - 0x2f, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2f, 0x76, 0x31, 0x34, 0x2f, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x2f, 0x67, 0x6f, 0x2f, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x70, 0x62, 0x62, 0x06, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x6f, 0x6f, 0x6b, 0x57, 0x69, 0x74, 0x68, 0x53, 0x69, 0x64, 0x65, 0x63, 0x68, 0x61, 0x6e, 0x6e, + 0x65, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xfa, 0x97, 0x28, 0x02, + 0x08, 0x02, 0x42, 0x34, 0x5a, 0x32, 0x67, 0x69, 0x74, 0x6c, 0x61, 0x62, 0x2e, 0x63, 0x6f, 0x6d, + 0x2f, 0x67, 0x69, 0x74, 0x6c, 0x61, 0x62, 0x2d, 0x6f, 0x72, 0x67, 0x2f, 0x67, 0x69, 0x74, 0x61, + 0x6c, 0x79, 0x2f, 0x76, 0x31, 0x34, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x2f, + 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -893,48 +1005,53 @@ func file_hook_proto_rawDescGZIP() []byte { } var file_hook_proto_enumTypes = make([]protoimpl.EnumInfo, 1) -var file_hook_proto_msgTypes = make([]protoimpl.MessageInfo, 10) +var file_hook_proto_msgTypes = make([]protoimpl.MessageInfo, 12) var file_hook_proto_goTypes = []interface{}{ - (ReferenceTransactionHookRequest_State)(0), // 0: gitaly.ReferenceTransactionHookRequest.State - (*PreReceiveHookRequest)(nil), // 1: gitaly.PreReceiveHookRequest - (*PreReceiveHookResponse)(nil), // 2: gitaly.PreReceiveHookResponse - (*PostReceiveHookRequest)(nil), // 3: gitaly.PostReceiveHookRequest - (*PostReceiveHookResponse)(nil), // 4: gitaly.PostReceiveHookResponse - (*UpdateHookRequest)(nil), // 5: gitaly.UpdateHookRequest - (*UpdateHookResponse)(nil), // 6: gitaly.UpdateHookResponse - (*ReferenceTransactionHookRequest)(nil), // 7: gitaly.ReferenceTransactionHookRequest - (*ReferenceTransactionHookResponse)(nil), // 8: gitaly.ReferenceTransactionHookResponse - (*PackObjectsHookRequest)(nil), // 9: gitaly.PackObjectsHookRequest - (*PackObjectsHookResponse)(nil), // 10: gitaly.PackObjectsHookResponse - (*Repository)(nil), // 11: gitaly.Repository - (*ExitStatus)(nil), // 12: gitaly.ExitStatus + (ReferenceTransactionHookRequest_State)(0), // 0: gitaly.ReferenceTransactionHookRequest.State + (*PreReceiveHookRequest)(nil), // 1: gitaly.PreReceiveHookRequest + (*PreReceiveHookResponse)(nil), // 2: gitaly.PreReceiveHookResponse + (*PostReceiveHookRequest)(nil), // 3: gitaly.PostReceiveHookRequest + (*PostReceiveHookResponse)(nil), // 4: gitaly.PostReceiveHookResponse + (*UpdateHookRequest)(nil), // 5: gitaly.UpdateHookRequest + (*UpdateHookResponse)(nil), // 6: gitaly.UpdateHookResponse + (*ReferenceTransactionHookRequest)(nil), // 7: gitaly.ReferenceTransactionHookRequest + (*ReferenceTransactionHookResponse)(nil), // 8: gitaly.ReferenceTransactionHookResponse + (*PackObjectsHookRequest)(nil), // 9: gitaly.PackObjectsHookRequest + (*PackObjectsHookResponse)(nil), // 10: gitaly.PackObjectsHookResponse + (*PackObjectsHookWithSidechannelRequest)(nil), // 11: gitaly.PackObjectsHookWithSidechannelRequest + (*PackObjectsHookWithSidechannelResponse)(nil), // 12: gitaly.PackObjectsHookWithSidechannelResponse + (*Repository)(nil), // 13: gitaly.Repository + (*ExitStatus)(nil), // 14: gitaly.ExitStatus } var file_hook_proto_depIdxs = []int32{ - 11, // 0: gitaly.PreReceiveHookRequest.repository:type_name -> gitaly.Repository - 12, // 1: gitaly.PreReceiveHookResponse.exit_status:type_name -> gitaly.ExitStatus - 11, // 2: gitaly.PostReceiveHookRequest.repository:type_name -> gitaly.Repository - 12, // 3: gitaly.PostReceiveHookResponse.exit_status:type_name -> gitaly.ExitStatus - 11, // 4: gitaly.UpdateHookRequest.repository:type_name -> gitaly.Repository - 12, // 5: gitaly.UpdateHookResponse.exit_status:type_name -> gitaly.ExitStatus - 11, // 6: gitaly.ReferenceTransactionHookRequest.repository:type_name -> gitaly.Repository + 13, // 0: gitaly.PreReceiveHookRequest.repository:type_name -> gitaly.Repository + 14, // 1: gitaly.PreReceiveHookResponse.exit_status:type_name -> gitaly.ExitStatus + 13, // 2: gitaly.PostReceiveHookRequest.repository:type_name -> gitaly.Repository + 14, // 3: gitaly.PostReceiveHookResponse.exit_status:type_name -> gitaly.ExitStatus + 13, // 4: gitaly.UpdateHookRequest.repository:type_name -> gitaly.Repository + 14, // 5: gitaly.UpdateHookResponse.exit_status:type_name -> gitaly.ExitStatus + 13, // 6: gitaly.ReferenceTransactionHookRequest.repository:type_name -> gitaly.Repository 0, // 7: gitaly.ReferenceTransactionHookRequest.state:type_name -> gitaly.ReferenceTransactionHookRequest.State - 12, // 8: gitaly.ReferenceTransactionHookResponse.exit_status:type_name -> gitaly.ExitStatus - 11, // 9: gitaly.PackObjectsHookRequest.repository:type_name -> gitaly.Repository - 1, // 10: gitaly.HookService.PreReceiveHook:input_type -> gitaly.PreReceiveHookRequest - 3, // 11: gitaly.HookService.PostReceiveHook:input_type -> gitaly.PostReceiveHookRequest - 5, // 12: gitaly.HookService.UpdateHook:input_type -> gitaly.UpdateHookRequest - 7, // 13: gitaly.HookService.ReferenceTransactionHook:input_type -> gitaly.ReferenceTransactionHookRequest - 9, // 14: gitaly.HookService.PackObjectsHook:input_type -> gitaly.PackObjectsHookRequest - 2, // 15: gitaly.HookService.PreReceiveHook:output_type -> gitaly.PreReceiveHookResponse - 4, // 16: gitaly.HookService.PostReceiveHook:output_type -> gitaly.PostReceiveHookResponse - 6, // 17: gitaly.HookService.UpdateHook:output_type -> gitaly.UpdateHookResponse - 8, // 18: gitaly.HookService.ReferenceTransactionHook:output_type -> gitaly.ReferenceTransactionHookResponse - 10, // 19: gitaly.HookService.PackObjectsHook:output_type -> gitaly.PackObjectsHookResponse - 15, // [15:20] is the sub-list for method output_type - 10, // [10:15] is the sub-list for method input_type - 10, // [10:10] is the sub-list for extension type_name - 10, // [10:10] is the sub-list for extension extendee - 0, // [0:10] is the sub-list for field type_name + 14, // 8: gitaly.ReferenceTransactionHookResponse.exit_status:type_name -> gitaly.ExitStatus + 13, // 9: gitaly.PackObjectsHookRequest.repository:type_name -> gitaly.Repository + 13, // 10: gitaly.PackObjectsHookWithSidechannelRequest.repository:type_name -> gitaly.Repository + 1, // 11: gitaly.HookService.PreReceiveHook:input_type -> gitaly.PreReceiveHookRequest + 3, // 12: gitaly.HookService.PostReceiveHook:input_type -> gitaly.PostReceiveHookRequest + 5, // 13: gitaly.HookService.UpdateHook:input_type -> gitaly.UpdateHookRequest + 7, // 14: gitaly.HookService.ReferenceTransactionHook:input_type -> gitaly.ReferenceTransactionHookRequest + 9, // 15: gitaly.HookService.PackObjectsHook:input_type -> gitaly.PackObjectsHookRequest + 11, // 16: gitaly.HookService.PackObjectsHookWithSidechannel:input_type -> gitaly.PackObjectsHookWithSidechannelRequest + 2, // 17: gitaly.HookService.PreReceiveHook:output_type -> gitaly.PreReceiveHookResponse + 4, // 18: gitaly.HookService.PostReceiveHook:output_type -> gitaly.PostReceiveHookResponse + 6, // 19: gitaly.HookService.UpdateHook:output_type -> gitaly.UpdateHookResponse + 8, // 20: gitaly.HookService.ReferenceTransactionHook:output_type -> gitaly.ReferenceTransactionHookResponse + 10, // 21: gitaly.HookService.PackObjectsHook:output_type -> gitaly.PackObjectsHookResponse + 12, // 22: gitaly.HookService.PackObjectsHookWithSidechannel:output_type -> gitaly.PackObjectsHookWithSidechannelResponse + 17, // [17:23] is the sub-list for method output_type + 11, // [11:17] is the sub-list for method input_type + 11, // [11:11] is the sub-list for extension type_name + 11, // [11:11] is the sub-list for extension extendee + 0, // [0:11] is the sub-list for field type_name } func init() { file_hook_proto_init() } @@ -1065,6 +1182,30 @@ func file_hook_proto_init() { return nil } } + file_hook_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PackObjectsHookWithSidechannelRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_hook_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PackObjectsHookWithSidechannelResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } } type x struct{} out := protoimpl.TypeBuilder{ @@ -1072,7 +1213,7 @@ func file_hook_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_hook_proto_rawDesc, NumEnums: 1, - NumMessages: 10, + NumMessages: 12, NumExtensions: 0, NumServices: 1, }, diff --git a/proto/go/gitalypb/hook_grpc.pb.go b/proto/go/gitalypb/hook_grpc.pb.go index 7efe8249f..16324fac5 100644 --- a/proto/go/gitalypb/hook_grpc.pb.go +++ b/proto/go/gitalypb/hook_grpc.pb.go @@ -26,6 +26,9 @@ type HookServiceClient interface { // uploadpack.packObjectsHook mechanism. It generates a stream of packed // Git objects. PackObjectsHook(ctx context.Context, opts ...grpc.CallOption) (HookService_PackObjectsHookClient, error) + // PackObjectsHookWithSidechannel is an optimized version of PackObjectsHook that uses + // a unix socket side channel. + PackObjectsHookWithSidechannel(ctx context.Context, in *PackObjectsHookWithSidechannelRequest, opts ...grpc.CallOption) (*PackObjectsHookWithSidechannelResponse, error) } type hookServiceClient struct { @@ -192,6 +195,15 @@ func (x *hookServicePackObjectsHookClient) Recv() (*PackObjectsHookResponse, err return m, nil } +func (c *hookServiceClient) PackObjectsHookWithSidechannel(ctx context.Context, in *PackObjectsHookWithSidechannelRequest, opts ...grpc.CallOption) (*PackObjectsHookWithSidechannelResponse, error) { + out := new(PackObjectsHookWithSidechannelResponse) + err := c.cc.Invoke(ctx, "/gitaly.HookService/PackObjectsHookWithSidechannel", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + // HookServiceServer is the server API for HookService service. // All implementations must embed UnimplementedHookServiceServer // for forward compatibility @@ -204,6 +216,9 @@ type HookServiceServer interface { // uploadpack.packObjectsHook mechanism. It generates a stream of packed // Git objects. PackObjectsHook(HookService_PackObjectsHookServer) error + // PackObjectsHookWithSidechannel is an optimized version of PackObjectsHook that uses + // a unix socket side channel. + PackObjectsHookWithSidechannel(context.Context, *PackObjectsHookWithSidechannelRequest) (*PackObjectsHookWithSidechannelResponse, error) mustEmbedUnimplementedHookServiceServer() } @@ -226,6 +241,9 @@ func (UnimplementedHookServiceServer) ReferenceTransactionHook(HookService_Refer func (UnimplementedHookServiceServer) PackObjectsHook(HookService_PackObjectsHookServer) error { return status.Errorf(codes.Unimplemented, "method PackObjectsHook not implemented") } +func (UnimplementedHookServiceServer) PackObjectsHookWithSidechannel(context.Context, *PackObjectsHookWithSidechannelRequest) (*PackObjectsHookWithSidechannelResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method PackObjectsHookWithSidechannel not implemented") +} func (UnimplementedHookServiceServer) mustEmbedUnimplementedHookServiceServer() {} // UnsafeHookServiceServer may be embedded to opt out of forward compatibility for this service. @@ -364,13 +382,36 @@ func (x *hookServicePackObjectsHookServer) Recv() (*PackObjectsHookRequest, erro return m, nil } +func _HookService_PackObjectsHookWithSidechannel_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(PackObjectsHookWithSidechannelRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(HookServiceServer).PackObjectsHookWithSidechannel(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/gitaly.HookService/PackObjectsHookWithSidechannel", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(HookServiceServer).PackObjectsHookWithSidechannel(ctx, req.(*PackObjectsHookWithSidechannelRequest)) + } + return interceptor(ctx, in, info, handler) +} + // HookService_ServiceDesc is the grpc.ServiceDesc for HookService service. // It's only intended for direct use with grpc.RegisterService, // and not to be introspected or modified (even as a copy) var HookService_ServiceDesc = grpc.ServiceDesc{ ServiceName: "gitaly.HookService", HandlerType: (*HookServiceServer)(nil), - Methods: []grpc.MethodDesc{}, + Methods: []grpc.MethodDesc{ + { + MethodName: "PackObjectsHookWithSidechannel", + Handler: _HookService_PackObjectsHookWithSidechannel_Handler, + }, + }, Streams: []grpc.StreamDesc{ { StreamName: "PreReceiveHook", diff --git a/proto/go/gitalypb/operations.pb.go b/proto/go/gitalypb/operations.pb.go index 2b8355807..608977ac4 100644 --- a/proto/go/gitalypb/operations.pb.go +++ b/proto/go/gitalypb/operations.pb.go @@ -2515,9 +2515,11 @@ type UserSquashRequest struct { Repository *Repository `protobuf:"bytes,1,opt,name=repository,proto3" json:"repository,omitempty"` // user is used for authorization checks. User *User `protobuf:"bytes,2,opt,name=user,proto3" json:"user,omitempty"` - // squash_id is used as a unique identifier for the squash. Internally, this - // is used to identify the worktree in which the squash shall be computed. No - // two UserSquash RPCs may run with the same ID. + // SquashId used to identify the path where the worktree was created. Given + // that Gitaly does in-memory squashes now, this is useless and will be + // ignored. There is no replacement for this. + // + // Deprecated: Do not use. SquashId string `protobuf:"bytes,3,opt,name=squash_id,json=squashId,proto3" json:"squash_id,omitempty"` // start_sha is the object ID of the start commit of the range which shall be // squashed. Must be an ancestor of end_sha. @@ -2580,6 +2582,7 @@ func (x *UserSquashRequest) GetUser() *User { return nil } +// Deprecated: Do not use. func (x *UserSquashRequest) GetSquashId() string { if x != nil { return x.SquashId @@ -3605,185 +3608,185 @@ var file_operations_proto_rawDesc = []byte{ 0x45, 0x72, 0x72, 0x6f, 0x72, 0x42, 0x2a, 0x0a, 0x28, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x72, 0x65, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, - 0x64, 0x22, 0xcf, 0x02, 0x0a, 0x11, 0x55, 0x73, 0x65, 0x72, 0x53, 0x71, 0x75, 0x61, 0x73, 0x68, + 0x64, 0x22, 0xd3, 0x02, 0x0a, 0x11, 0x55, 0x73, 0x65, 0x72, 0x53, 0x71, 0x75, 0x61, 0x73, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x42, 0x04, 0x98, 0xc6, 0x2c, 0x01, 0x52, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x20, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x04, 0x75, - 0x73, 0x65, 0x72, 0x12, 0x1b, 0x0a, 0x09, 0x73, 0x71, 0x75, 0x61, 0x73, 0x68, 0x5f, 0x69, 0x64, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x71, 0x75, 0x61, 0x73, 0x68, 0x49, 0x64, - 0x12, 0x1b, 0x0a, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x73, 0x68, 0x61, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x74, 0x61, 0x72, 0x74, 0x53, 0x68, 0x61, 0x12, 0x17, 0x0a, - 0x07, 0x65, 0x6e, 0x64, 0x5f, 0x73, 0x68, 0x61, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x65, 0x6e, 0x64, 0x53, 0x68, 0x61, 0x12, 0x24, 0x0a, 0x06, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, - 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, - 0x55, 0x73, 0x65, 0x72, 0x52, 0x06, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x12, 0x25, 0x0a, 0x0e, - 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x08, - 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0d, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x4d, 0x65, 0x73, 0x73, - 0x61, 0x67, 0x65, 0x12, 0x38, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, - 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x4a, 0x04, 0x08, - 0x04, 0x10, 0x05, 0x22, 0x69, 0x0a, 0x12, 0x55, 0x73, 0x65, 0x72, 0x53, 0x71, 0x75, 0x61, 0x73, - 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x71, 0x75, - 0x61, 0x73, 0x68, 0x5f, 0x73, 0x68, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, - 0x71, 0x75, 0x61, 0x73, 0x68, 0x53, 0x68, 0x61, 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x69, 0x74, 0x5f, - 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x67, 0x69, 0x74, - 0x45, 0x72, 0x72, 0x6f, 0x72, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x52, 0x11, 0x70, 0x72, 0x65, - 0x5f, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xdd, - 0x02, 0x0a, 0x15, 0x55, 0x73, 0x65, 0x72, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x50, 0x61, 0x74, 0x63, - 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3e, 0x0a, 0x06, 0x68, 0x65, 0x61, 0x64, - 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, - 0x79, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x50, 0x61, 0x74, 0x63, 0x68, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x48, 0x00, - 0x52, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x1a, 0x0a, 0x07, 0x70, 0x61, 0x74, 0x63, - 0x68, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x07, 0x70, 0x61, 0x74, - 0x63, 0x68, 0x65, 0x73, 0x1a, 0xc3, 0x01, 0x0a, 0x06, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, + 0x73, 0x65, 0x72, 0x12, 0x1f, 0x0a, 0x09, 0x73, 0x71, 0x75, 0x61, 0x73, 0x68, 0x5f, 0x69, 0x64, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x08, 0x73, 0x71, 0x75, 0x61, + 0x73, 0x68, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x73, 0x68, + 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x74, 0x61, 0x72, 0x74, 0x53, 0x68, + 0x61, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x6e, 0x64, 0x5f, 0x73, 0x68, 0x61, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x06, 0x65, 0x6e, 0x64, 0x53, 0x68, 0x61, 0x12, 0x24, 0x0a, 0x06, 0x61, 0x75, + 0x74, 0x68, 0x6f, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x67, 0x69, 0x74, + 0x61, 0x6c, 0x79, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x06, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, + 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0d, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, + 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x38, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x4a, 0x04, 0x08, 0x04, 0x10, 0x05, 0x22, 0x69, 0x0a, 0x12, 0x55, 0x73, 0x65, 0x72, 0x53, + 0x71, 0x75, 0x61, 0x73, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1d, 0x0a, + 0x0a, 0x73, 0x71, 0x75, 0x61, 0x73, 0x68, 0x5f, 0x73, 0x68, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x73, 0x71, 0x75, 0x61, 0x73, 0x68, 0x53, 0x68, 0x61, 0x12, 0x1b, 0x0a, 0x09, + 0x67, 0x69, 0x74, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x67, 0x69, 0x74, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x52, + 0x11, 0x70, 0x72, 0x65, 0x5f, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x5f, 0x65, 0x72, 0x72, + 0x6f, 0x72, 0x22, 0xdd, 0x02, 0x0a, 0x15, 0x55, 0x73, 0x65, 0x72, 0x41, 0x70, 0x70, 0x6c, 0x79, + 0x50, 0x61, 0x74, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3e, 0x0a, 0x06, + 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, + 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x50, + 0x61, 0x74, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x48, 0x65, 0x61, 0x64, + 0x65, 0x72, 0x48, 0x00, 0x52, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x1a, 0x0a, 0x07, + 0x70, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, + 0x07, 0x70, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x1a, 0xc3, 0x01, 0x0a, 0x06, 0x48, 0x65, 0x61, + 0x64, 0x65, 0x72, 0x12, 0x38, 0x0a, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, + 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x42, 0x04, 0x98, 0xc6, 0x2c, + 0x01, 0x52, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x20, 0x0a, + 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x67, 0x69, + 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, + 0x23, 0x0a, 0x0d, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x42, 0x72, + 0x61, 0x6e, 0x63, 0x68, 0x12, 0x38, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, 0x22, + 0x0a, 0x20, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x70, 0x6c, 0x79, 0x5f, 0x70, 0x61, 0x74, + 0x63, 0x68, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x61, 0x79, 0x6c, 0x6f, + 0x61, 0x64, 0x22, 0x5c, 0x0a, 0x16, 0x55, 0x73, 0x65, 0x72, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x50, + 0x61, 0x74, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x42, 0x0a, 0x0d, + 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x4f, 0x70, 0x65, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x52, 0x0c, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x22, 0xae, 0x02, 0x0a, 0x1a, 0x55, 0x73, 0x65, 0x72, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, + 0x75, 0x62, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x42, 0x04, 0x98, 0xc6, 0x2c, 0x01, 0x52, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x20, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, - 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, 0x23, 0x0a, 0x0d, 0x74, - 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0c, 0x52, 0x0c, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, - 0x12, 0x38, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, - 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, 0x22, 0x0a, 0x20, 0x75, 0x73, - 0x65, 0x72, 0x5f, 0x61, 0x70, 0x70, 0x6c, 0x79, 0x5f, 0x70, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x72, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0x5c, - 0x0a, 0x16, 0x55, 0x73, 0x65, 0x72, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x50, 0x61, 0x74, 0x63, 0x68, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x42, 0x0a, 0x0d, 0x62, 0x72, 0x61, 0x6e, - 0x63, 0x68, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1d, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x0c, - 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x22, 0xae, 0x02, 0x0a, - 0x1a, 0x55, 0x73, 0x65, 0x72, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x75, 0x62, 0x6d, 0x6f, - 0x64, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0a, 0x72, - 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x12, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, - 0x6f, 0x72, 0x79, 0x42, 0x04, 0x98, 0xc6, 0x2c, 0x01, 0x52, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, - 0x69, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x20, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x55, 0x73, 0x65, - 0x72, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6f, 0x6d, 0x6d, 0x69, - 0x74, 0x5f, 0x73, 0x68, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6f, 0x6d, - 0x6d, 0x69, 0x74, 0x53, 0x68, 0x61, 0x12, 0x16, 0x0a, 0x06, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x12, 0x1c, - 0x0a, 0x09, 0x73, 0x75, 0x62, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x09, 0x73, 0x75, 0x62, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x12, 0x25, 0x0a, 0x0e, - 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0d, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x4d, 0x65, 0x73, 0x73, - 0x61, 0x67, 0x65, 0x12, 0x38, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, - 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0xc9, 0x01, - 0x0a, 0x1b, 0x55, 0x73, 0x65, 0x72, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x75, 0x62, 0x6d, - 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x42, 0x0a, - 0x0d, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x4f, 0x70, - 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x55, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x52, 0x0c, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x55, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x12, 0x2a, 0x0a, 0x11, 0x70, 0x72, 0x65, 0x5f, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, - 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x70, 0x72, - 0x65, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x21, 0x0a, - 0x0c, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x45, 0x72, 0x72, 0x6f, 0x72, - 0x4a, 0x04, 0x08, 0x03, 0x10, 0x04, 0x52, 0x11, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x74, - 0x72, 0x65, 0x65, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x32, 0xed, 0x0a, 0x0a, 0x10, 0x4f, 0x70, - 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x5d, - 0x0a, 0x10, 0x55, 0x73, 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x72, 0x61, 0x6e, - 0x63, 0x68, 0x12, 0x1f, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x55, 0x73, 0x65, 0x72, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x55, 0x73, 0x65, - 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xfa, 0x97, 0x28, 0x02, 0x08, 0x01, 0x12, 0x5d, 0x0a, - 0x10, 0x55, 0x73, 0x65, 0x72, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x42, 0x72, 0x61, 0x6e, 0x63, - 0x68, 0x12, 0x1f, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x55, 0x73, 0x65, 0x72, - 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xfa, 0x97, 0x28, 0x02, 0x08, 0x01, 0x12, 0x5d, 0x0a, 0x10, - 0x55, 0x73, 0x65, 0x72, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, - 0x12, 0x1f, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x20, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x06, 0xfa, 0x97, 0x28, 0x02, 0x08, 0x01, 0x12, 0x54, 0x0a, 0x0d, 0x55, - 0x73, 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x61, 0x67, 0x12, 0x1c, 0x2e, 0x67, - 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x54, 0x61, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x67, 0x69, 0x74, - 0x61, 0x6c, 0x79, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x61, - 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xfa, 0x97, 0x28, 0x02, 0x08, - 0x01, 0x12, 0x54, 0x0a, 0x0d, 0x55, 0x73, 0x65, 0x72, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, - 0x61, 0x67, 0x12, 0x1c, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x55, 0x73, 0x65, 0x72, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x61, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x1d, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x54, 0x61, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x06, 0xfa, 0x97, 0x28, 0x02, 0x08, 0x01, 0x12, 0x57, 0x0a, 0x0e, 0x55, 0x73, 0x65, 0x72, 0x4d, - 0x65, 0x72, 0x67, 0x65, 0x54, 0x6f, 0x52, 0x65, 0x66, 0x12, 0x1d, 0x2e, 0x67, 0x69, 0x74, 0x61, - 0x6c, 0x79, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4d, 0x65, 0x72, 0x67, 0x65, 0x54, 0x6f, 0x52, 0x65, - 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, - 0x79, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4d, 0x65, 0x72, 0x67, 0x65, 0x54, 0x6f, 0x52, 0x65, 0x66, + 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, 0x1d, 0x0a, 0x0a, 0x63, + 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x5f, 0x73, 0x68, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x09, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x53, 0x68, 0x61, 0x12, 0x16, 0x0a, 0x06, 0x62, 0x72, + 0x61, 0x6e, 0x63, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x62, 0x72, 0x61, 0x6e, + 0x63, 0x68, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x75, 0x62, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x73, 0x75, 0x62, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, + 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0d, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, + 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x38, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x22, 0xc9, 0x01, 0x0a, 0x1b, 0x55, 0x73, 0x65, 0x72, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x53, 0x75, 0x62, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x42, 0x0a, 0x0d, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x5f, 0x75, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, + 0x79, 0x2e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x72, 0x61, 0x6e, 0x63, + 0x68, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x0c, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x2a, 0x0a, 0x11, 0x70, 0x72, 0x65, 0x5f, 0x72, 0x65, 0x63, + 0x65, 0x69, 0x76, 0x65, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0f, 0x70, 0x72, 0x65, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x45, 0x72, 0x72, 0x6f, + 0x72, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x5f, 0x65, 0x72, 0x72, 0x6f, + 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x45, + 0x72, 0x72, 0x6f, 0x72, 0x4a, 0x04, 0x08, 0x03, 0x10, 0x04, 0x52, 0x11, 0x63, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x5f, 0x74, 0x72, 0x65, 0x65, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x32, 0xed, 0x0a, + 0x0a, 0x10, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x12, 0x5d, 0x0a, 0x10, 0x55, 0x73, 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x12, 0x1f, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, + 0x55, 0x73, 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, + 0x2e, 0x55, 0x73, 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x72, 0x61, 0x6e, 0x63, + 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xfa, 0x97, 0x28, 0x02, 0x08, + 0x01, 0x12, 0x5d, 0x0a, 0x10, 0x55, 0x73, 0x65, 0x72, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x42, + 0x72, 0x61, 0x6e, 0x63, 0x68, 0x12, 0x1f, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x55, + 0x73, 0x65, 0x72, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, + 0x55, 0x73, 0x65, 0x72, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xfa, 0x97, 0x28, 0x02, 0x08, 0x01, + 0x12, 0x5d, 0x0a, 0x10, 0x55, 0x73, 0x65, 0x72, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x72, + 0x61, 0x6e, 0x63, 0x68, 0x12, 0x1f, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x55, 0x73, + 0x65, 0x72, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x55, + 0x73, 0x65, 0x72, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xfa, 0x97, 0x28, 0x02, 0x08, 0x01, 0x12, + 0x54, 0x0a, 0x0d, 0x55, 0x73, 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x61, 0x67, + 0x12, 0x1c, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x54, 0x61, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, + 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x54, 0x61, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xfa, + 0x97, 0x28, 0x02, 0x08, 0x01, 0x12, 0x54, 0x0a, 0x0d, 0x55, 0x73, 0x65, 0x72, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x54, 0x61, 0x67, 0x12, 0x1c, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, + 0x55, 0x73, 0x65, 0x72, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x61, 0x67, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x55, 0x73, + 0x65, 0x72, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x61, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x06, 0xfa, 0x97, 0x28, 0x02, 0x08, 0x01, 0x12, 0x57, 0x0a, 0x0e, 0x55, + 0x73, 0x65, 0x72, 0x4d, 0x65, 0x72, 0x67, 0x65, 0x54, 0x6f, 0x52, 0x65, 0x66, 0x12, 0x1d, 0x2e, + 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4d, 0x65, 0x72, 0x67, 0x65, + 0x54, 0x6f, 0x52, 0x65, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x67, + 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4d, 0x65, 0x72, 0x67, 0x65, 0x54, + 0x6f, 0x52, 0x65, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xfa, 0x97, + 0x28, 0x02, 0x08, 0x01, 0x12, 0x5e, 0x0a, 0x0f, 0x55, 0x73, 0x65, 0x72, 0x4d, 0x65, 0x72, 0x67, + 0x65, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x12, 0x1e, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, + 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4d, 0x65, 0x72, 0x67, 0x65, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, + 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4d, 0x65, 0x72, 0x67, 0x65, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xfa, 0x97, 0x28, 0x02, 0x08, 0x01, - 0x12, 0x5e, 0x0a, 0x0f, 0x55, 0x73, 0x65, 0x72, 0x4d, 0x65, 0x72, 0x67, 0x65, 0x42, 0x72, 0x61, - 0x6e, 0x63, 0x68, 0x12, 0x1e, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x55, 0x73, 0x65, - 0x72, 0x4d, 0x65, 0x72, 0x67, 0x65, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, + 0x28, 0x01, 0x30, 0x01, 0x12, 0x51, 0x0a, 0x0c, 0x55, 0x73, 0x65, 0x72, 0x46, 0x46, 0x42, 0x72, + 0x61, 0x6e, 0x63, 0x68, 0x12, 0x1b, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x55, 0x73, + 0x65, 0x72, 0x46, 0x46, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x1c, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x46, + 0x46, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x06, 0xfa, 0x97, 0x28, 0x02, 0x08, 0x01, 0x12, 0x57, 0x0a, 0x0e, 0x55, 0x73, 0x65, 0x72, 0x43, + 0x68, 0x65, 0x72, 0x72, 0x79, 0x50, 0x69, 0x63, 0x6b, 0x12, 0x1d, 0x2e, 0x67, 0x69, 0x74, 0x61, + 0x6c, 0x79, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x43, 0x68, 0x65, 0x72, 0x72, 0x79, 0x50, 0x69, 0x63, + 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, + 0x79, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x43, 0x68, 0x65, 0x72, 0x72, 0x79, 0x50, 0x69, 0x63, 0x6b, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xfa, 0x97, 0x28, 0x02, 0x08, 0x01, + 0x12, 0x5c, 0x0a, 0x0f, 0x55, 0x73, 0x65, 0x72, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x46, 0x69, + 0x6c, 0x65, 0x73, 0x12, 0x1e, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x55, 0x73, 0x65, + 0x72, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x55, 0x73, 0x65, - 0x72, 0x4d, 0x65, 0x72, 0x67, 0x65, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, + 0x72, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xfa, 0x97, 0x28, 0x02, 0x08, 0x01, 0x28, 0x01, 0x12, 0x70, + 0x0a, 0x15, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x62, 0x61, 0x73, 0x65, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x72, 0x6d, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x24, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, + 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x62, 0x61, 0x73, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x72, 0x6d, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, + 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x62, 0x61, 0x73, + 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xfa, 0x97, 0x28, 0x02, 0x08, 0x01, 0x28, 0x01, 0x30, 0x01, - 0x12, 0x51, 0x0a, 0x0c, 0x55, 0x73, 0x65, 0x72, 0x46, 0x46, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, - 0x12, 0x1b, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x46, 0x46, - 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, - 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x46, 0x46, 0x42, 0x72, 0x61, - 0x6e, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xfa, 0x97, 0x28, - 0x02, 0x08, 0x01, 0x12, 0x57, 0x0a, 0x0e, 0x55, 0x73, 0x65, 0x72, 0x43, 0x68, 0x65, 0x72, 0x72, - 0x79, 0x50, 0x69, 0x63, 0x6b, 0x12, 0x1d, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x55, - 0x73, 0x65, 0x72, 0x43, 0x68, 0x65, 0x72, 0x72, 0x79, 0x50, 0x69, 0x63, 0x6b, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x55, 0x73, - 0x65, 0x72, 0x43, 0x68, 0x65, 0x72, 0x72, 0x79, 0x50, 0x69, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xfa, 0x97, 0x28, 0x02, 0x08, 0x01, 0x12, 0x5c, 0x0a, 0x0f, - 0x55, 0x73, 0x65, 0x72, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, - 0x1e, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x43, 0x6f, 0x6d, - 0x6d, 0x69, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x1f, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x43, 0x6f, 0x6d, - 0x6d, 0x69, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x06, 0xfa, 0x97, 0x28, 0x02, 0x08, 0x01, 0x28, 0x01, 0x12, 0x70, 0x0a, 0x15, 0x55, 0x73, - 0x65, 0x72, 0x52, 0x65, 0x62, 0x61, 0x73, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, - 0x62, 0x6c, 0x65, 0x12, 0x24, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x55, 0x73, 0x65, - 0x72, 0x52, 0x65, 0x62, 0x61, 0x73, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x62, - 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x67, 0x69, 0x74, 0x61, - 0x6c, 0x79, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x62, 0x61, 0x73, 0x65, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x72, 0x6d, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x06, 0xfa, 0x97, 0x28, 0x02, 0x08, 0x01, 0x28, 0x01, 0x30, 0x01, 0x12, 0x4b, 0x0a, 0x0a, - 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x76, 0x65, 0x72, 0x74, 0x12, 0x19, 0x2e, 0x67, 0x69, 0x74, - 0x61, 0x6c, 0x79, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x76, 0x65, 0x72, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x55, - 0x73, 0x65, 0x72, 0x52, 0x65, 0x76, 0x65, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x06, 0xfa, 0x97, 0x28, 0x02, 0x08, 0x01, 0x12, 0x4b, 0x0a, 0x0a, 0x55, 0x73, 0x65, - 0x72, 0x53, 0x71, 0x75, 0x61, 0x73, 0x68, 0x12, 0x19, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, - 0x2e, 0x55, 0x73, 0x65, 0x72, 0x53, 0x71, 0x75, 0x61, 0x73, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x55, 0x73, 0x65, 0x72, - 0x53, 0x71, 0x75, 0x61, 0x73, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, - 0xfa, 0x97, 0x28, 0x02, 0x08, 0x01, 0x12, 0x59, 0x0a, 0x0e, 0x55, 0x73, 0x65, 0x72, 0x41, 0x70, - 0x70, 0x6c, 0x79, 0x50, 0x61, 0x74, 0x63, 0x68, 0x12, 0x1d, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, - 0x79, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x50, 0x61, 0x74, 0x63, 0x68, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, - 0x2e, 0x55, 0x73, 0x65, 0x72, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x50, 0x61, 0x74, 0x63, 0x68, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xfa, 0x97, 0x28, 0x02, 0x08, 0x01, 0x28, - 0x01, 0x12, 0x66, 0x0a, 0x13, 0x55, 0x73, 0x65, 0x72, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, - 0x75, 0x62, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x12, 0x22, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, - 0x79, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x75, 0x62, 0x6d, - 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x67, + 0x12, 0x4b, 0x0a, 0x0a, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x76, 0x65, 0x72, 0x74, 0x12, 0x19, + 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x76, 0x65, + 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x67, 0x69, 0x74, 0x61, + 0x6c, 0x79, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x76, 0x65, 0x72, 0x74, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xfa, 0x97, 0x28, 0x02, 0x08, 0x01, 0x12, 0x4b, 0x0a, + 0x0a, 0x55, 0x73, 0x65, 0x72, 0x53, 0x71, 0x75, 0x61, 0x73, 0x68, 0x12, 0x19, 0x2e, 0x67, 0x69, + 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x53, 0x71, 0x75, 0x61, 0x73, 0x68, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, + 0x55, 0x73, 0x65, 0x72, 0x53, 0x71, 0x75, 0x61, 0x73, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x06, 0xfa, 0x97, 0x28, 0x02, 0x08, 0x01, 0x12, 0x59, 0x0a, 0x0e, 0x55, 0x73, + 0x65, 0x72, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x50, 0x61, 0x74, 0x63, 0x68, 0x12, 0x1d, 0x2e, 0x67, + 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x50, + 0x61, 0x74, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x67, 0x69, + 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x50, 0x61, + 0x74, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xfa, 0x97, 0x28, + 0x02, 0x08, 0x01, 0x28, 0x01, 0x12, 0x66, 0x0a, 0x13, 0x55, 0x73, 0x65, 0x72, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x53, 0x75, 0x62, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x12, 0x22, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x53, 0x75, 0x62, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x06, 0xfa, 0x97, 0x28, 0x02, 0x08, 0x01, 0x42, 0x34, 0x5a, 0x32, 0x67, 0x69, 0x74, - 0x6c, 0x61, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x69, 0x74, 0x6c, 0x61, 0x62, 0x2d, 0x6f, - 0x72, 0x67, 0x2f, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2f, 0x76, 0x31, 0x34, 0x2f, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x2f, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x70, 0x62, 0x62, - 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x53, 0x75, 0x62, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x23, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x53, 0x75, 0x62, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xfa, 0x97, 0x28, 0x02, 0x08, 0x01, 0x42, 0x34, 0x5a, + 0x32, 0x67, 0x69, 0x74, 0x6c, 0x61, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x69, 0x74, 0x6c, + 0x61, 0x62, 0x2d, 0x6f, 0x72, 0x67, 0x2f, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2f, 0x76, 0x31, + 0x34, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x2f, 0x67, 0x69, 0x74, 0x61, 0x6c, + 0x79, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/proto/go/gitalypb/remote.pb.go b/proto/go/gitalypb/remote.pb.go index c6ffeac29..6322b97d2 100644 --- a/proto/go/gitalypb/remote.pb.go +++ b/proto/go/gitalypb/remote.pb.go @@ -20,218 +20,6 @@ const ( _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) -type AddRemoteRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Repository *Repository `protobuf:"bytes,1,opt,name=repository,proto3" json:"repository,omitempty"` - Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` - Url string `protobuf:"bytes,3,opt,name=url,proto3" json:"url,omitempty"` - // If any, the remote is configured as a mirror with those mappings - MirrorRefmaps []string `protobuf:"bytes,5,rep,name=mirror_refmaps,json=mirrorRefmaps,proto3" json:"mirror_refmaps,omitempty"` -} - -func (x *AddRemoteRequest) Reset() { - *x = AddRemoteRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_remote_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *AddRemoteRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*AddRemoteRequest) ProtoMessage() {} - -func (x *AddRemoteRequest) ProtoReflect() protoreflect.Message { - mi := &file_remote_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use AddRemoteRequest.ProtoReflect.Descriptor instead. -func (*AddRemoteRequest) Descriptor() ([]byte, []int) { - return file_remote_proto_rawDescGZIP(), []int{0} -} - -func (x *AddRemoteRequest) GetRepository() *Repository { - if x != nil { - return x.Repository - } - return nil -} - -func (x *AddRemoteRequest) GetName() string { - if x != nil { - return x.Name - } - return "" -} - -func (x *AddRemoteRequest) GetUrl() string { - if x != nil { - return x.Url - } - return "" -} - -func (x *AddRemoteRequest) GetMirrorRefmaps() []string { - if x != nil { - return x.MirrorRefmaps - } - return nil -} - -type AddRemoteResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields -} - -func (x *AddRemoteResponse) Reset() { - *x = AddRemoteResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_remote_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *AddRemoteResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*AddRemoteResponse) ProtoMessage() {} - -func (x *AddRemoteResponse) ProtoReflect() protoreflect.Message { - mi := &file_remote_proto_msgTypes[1] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use AddRemoteResponse.ProtoReflect.Descriptor instead. -func (*AddRemoteResponse) Descriptor() ([]byte, []int) { - return file_remote_proto_rawDescGZIP(), []int{1} -} - -type RemoveRemoteRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Repository *Repository `protobuf:"bytes,1,opt,name=repository,proto3" json:"repository,omitempty"` - Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` -} - -func (x *RemoveRemoteRequest) Reset() { - *x = RemoveRemoteRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_remote_proto_msgTypes[2] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *RemoveRemoteRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*RemoveRemoteRequest) ProtoMessage() {} - -func (x *RemoveRemoteRequest) ProtoReflect() protoreflect.Message { - mi := &file_remote_proto_msgTypes[2] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use RemoveRemoteRequest.ProtoReflect.Descriptor instead. -func (*RemoveRemoteRequest) Descriptor() ([]byte, []int) { - return file_remote_proto_rawDescGZIP(), []int{2} -} - -func (x *RemoveRemoteRequest) GetRepository() *Repository { - if x != nil { - return x.Repository - } - return nil -} - -func (x *RemoveRemoteRequest) GetName() string { - if x != nil { - return x.Name - } - return "" -} - -type RemoveRemoteResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Result bool `protobuf:"varint,1,opt,name=result,proto3" json:"result,omitempty"` -} - -func (x *RemoveRemoteResponse) Reset() { - *x = RemoveRemoteResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_remote_proto_msgTypes[3] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *RemoveRemoteResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*RemoveRemoteResponse) ProtoMessage() {} - -func (x *RemoveRemoteResponse) ProtoReflect() protoreflect.Message { - mi := &file_remote_proto_msgTypes[3] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use RemoveRemoteResponse.ProtoReflect.Descriptor instead. -func (*RemoveRemoteResponse) Descriptor() ([]byte, []int) { - return file_remote_proto_rawDescGZIP(), []int{3} -} - -func (x *RemoveRemoteResponse) GetResult() bool { - if x != nil { - return x.Result - } - return false -} - type FetchInternalRemoteRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -244,7 +32,7 @@ type FetchInternalRemoteRequest struct { func (x *FetchInternalRemoteRequest) Reset() { *x = FetchInternalRemoteRequest{} if protoimpl.UnsafeEnabled { - mi := &file_remote_proto_msgTypes[4] + mi := &file_remote_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -257,7 +45,7 @@ func (x *FetchInternalRemoteRequest) String() string { func (*FetchInternalRemoteRequest) ProtoMessage() {} func (x *FetchInternalRemoteRequest) ProtoReflect() protoreflect.Message { - mi := &file_remote_proto_msgTypes[4] + mi := &file_remote_proto_msgTypes[0] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -270,7 +58,7 @@ func (x *FetchInternalRemoteRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use FetchInternalRemoteRequest.ProtoReflect.Descriptor instead. func (*FetchInternalRemoteRequest) Descriptor() ([]byte, []int) { - return file_remote_proto_rawDescGZIP(), []int{4} + return file_remote_proto_rawDescGZIP(), []int{0} } func (x *FetchInternalRemoteRequest) GetRepository() *Repository { @@ -298,7 +86,7 @@ type FetchInternalRemoteResponse struct { func (x *FetchInternalRemoteResponse) Reset() { *x = FetchInternalRemoteResponse{} if protoimpl.UnsafeEnabled { - mi := &file_remote_proto_msgTypes[5] + mi := &file_remote_proto_msgTypes[1] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -311,7 +99,7 @@ func (x *FetchInternalRemoteResponse) String() string { func (*FetchInternalRemoteResponse) ProtoMessage() {} func (x *FetchInternalRemoteResponse) ProtoReflect() protoreflect.Message { - mi := &file_remote_proto_msgTypes[5] + mi := &file_remote_proto_msgTypes[1] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -324,7 +112,7 @@ func (x *FetchInternalRemoteResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use FetchInternalRemoteResponse.ProtoReflect.Descriptor instead. func (*FetchInternalRemoteResponse) Descriptor() ([]byte, []int) { - return file_remote_proto_rawDescGZIP(), []int{5} + return file_remote_proto_rawDescGZIP(), []int{1} } func (x *FetchInternalRemoteResponse) GetResult() bool { @@ -341,9 +129,6 @@ type UpdateRemoteMirrorRequest struct { // Repository is the repository whose mirror repository to update. Repository *Repository `protobuf:"bytes,1,opt,name=repository,proto3" json:"repository,omitempty"` - // RefName is actually the remote to update. Deprecated in favor of the - // Remote field. - RefName string `protobuf:"bytes,2,opt,name=ref_name,json=refName,proto3" json:"ref_name,omitempty"` // Remote contains parameters required to connect to the remote repository. // This allows Gitaly to use an in-memory remote and does not require any // on-disk remote configuration. @@ -369,7 +154,7 @@ type UpdateRemoteMirrorRequest struct { func (x *UpdateRemoteMirrorRequest) Reset() { *x = UpdateRemoteMirrorRequest{} if protoimpl.UnsafeEnabled { - mi := &file_remote_proto_msgTypes[6] + mi := &file_remote_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -382,7 +167,7 @@ func (x *UpdateRemoteMirrorRequest) String() string { func (*UpdateRemoteMirrorRequest) ProtoMessage() {} func (x *UpdateRemoteMirrorRequest) ProtoReflect() protoreflect.Message { - mi := &file_remote_proto_msgTypes[6] + mi := &file_remote_proto_msgTypes[2] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -395,7 +180,7 @@ func (x *UpdateRemoteMirrorRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateRemoteMirrorRequest.ProtoReflect.Descriptor instead. func (*UpdateRemoteMirrorRequest) Descriptor() ([]byte, []int) { - return file_remote_proto_rawDescGZIP(), []int{6} + return file_remote_proto_rawDescGZIP(), []int{2} } func (x *UpdateRemoteMirrorRequest) GetRepository() *Repository { @@ -405,13 +190,6 @@ func (x *UpdateRemoteMirrorRequest) GetRepository() *Repository { return nil } -func (x *UpdateRemoteMirrorRequest) GetRefName() string { - if x != nil { - return x.RefName - } - return "" -} - func (x *UpdateRemoteMirrorRequest) GetRemote() *UpdateRemoteMirrorRequest_Remote { if x != nil { return x.Remote @@ -460,7 +238,7 @@ type UpdateRemoteMirrorResponse struct { func (x *UpdateRemoteMirrorResponse) Reset() { *x = UpdateRemoteMirrorResponse{} if protoimpl.UnsafeEnabled { - mi := &file_remote_proto_msgTypes[7] + mi := &file_remote_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -473,7 +251,7 @@ func (x *UpdateRemoteMirrorResponse) String() string { func (*UpdateRemoteMirrorResponse) ProtoMessage() {} func (x *UpdateRemoteMirrorResponse) ProtoReflect() protoreflect.Message { - mi := &file_remote_proto_msgTypes[7] + mi := &file_remote_proto_msgTypes[3] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -486,7 +264,7 @@ func (x *UpdateRemoteMirrorResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateRemoteMirrorResponse.ProtoReflect.Descriptor instead. func (*UpdateRemoteMirrorResponse) Descriptor() ([]byte, []int) { - return file_remote_proto_rawDescGZIP(), []int{7} + return file_remote_proto_rawDescGZIP(), []int{3} } func (x *UpdateRemoteMirrorResponse) GetDivergentRefs() [][]byte { @@ -511,7 +289,7 @@ type FindRemoteRepositoryRequest struct { func (x *FindRemoteRepositoryRequest) Reset() { *x = FindRemoteRepositoryRequest{} if protoimpl.UnsafeEnabled { - mi := &file_remote_proto_msgTypes[8] + mi := &file_remote_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -524,7 +302,7 @@ func (x *FindRemoteRepositoryRequest) String() string { func (*FindRemoteRepositoryRequest) ProtoMessage() {} func (x *FindRemoteRepositoryRequest) ProtoReflect() protoreflect.Message { - mi := &file_remote_proto_msgTypes[8] + mi := &file_remote_proto_msgTypes[4] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -537,7 +315,7 @@ func (x *FindRemoteRepositoryRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use FindRemoteRepositoryRequest.ProtoReflect.Descriptor instead. func (*FindRemoteRepositoryRequest) Descriptor() ([]byte, []int) { - return file_remote_proto_rawDescGZIP(), []int{8} + return file_remote_proto_rawDescGZIP(), []int{4} } func (x *FindRemoteRepositoryRequest) GetRemote() string { @@ -567,7 +345,7 @@ type FindRemoteRepositoryResponse struct { func (x *FindRemoteRepositoryResponse) Reset() { *x = FindRemoteRepositoryResponse{} if protoimpl.UnsafeEnabled { - mi := &file_remote_proto_msgTypes[9] + mi := &file_remote_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -580,7 +358,7 @@ func (x *FindRemoteRepositoryResponse) String() string { func (*FindRemoteRepositoryResponse) ProtoMessage() {} func (x *FindRemoteRepositoryResponse) ProtoReflect() protoreflect.Message { - mi := &file_remote_proto_msgTypes[9] + mi := &file_remote_proto_msgTypes[5] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -593,7 +371,7 @@ func (x *FindRemoteRepositoryResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use FindRemoteRepositoryResponse.ProtoReflect.Descriptor instead. func (*FindRemoteRepositoryResponse) Descriptor() ([]byte, []int) { - return file_remote_proto_rawDescGZIP(), []int{9} + return file_remote_proto_rawDescGZIP(), []int{5} } func (x *FindRemoteRepositoryResponse) GetExists() bool { @@ -613,13 +391,6 @@ type FindRemoteRootRefRequest struct { // a remote name is given, then this is the repository in which the remote // will be looked up. Repository *Repository `protobuf:"bytes,1,opt,name=repository,proto3" json:"repository,omitempty"` - // Remote is the name of the remote of which the root reference shall be - // looked up. The remote must have been created before this call. This - // parameter is deprecated in favor of `RemoteUrl`, see - // https://gitlab.com/gitlab-org/gitaly/-/issues/1773. - // - // Deprecated: Do not use. - Remote string `protobuf:"bytes,2,opt,name=remote,proto3" json:"remote,omitempty"` // RemoteUrl specifies the remote repository URL which should be fetched from. RemoteUrl string `protobuf:"bytes,3,opt,name=remote_url,json=remoteUrl,proto3" json:"remote_url,omitempty"` // HttpAuthorizationHeader is the HTTP header which should be added to the @@ -630,7 +401,7 @@ type FindRemoteRootRefRequest struct { func (x *FindRemoteRootRefRequest) Reset() { *x = FindRemoteRootRefRequest{} if protoimpl.UnsafeEnabled { - mi := &file_remote_proto_msgTypes[10] + mi := &file_remote_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -643,7 +414,7 @@ func (x *FindRemoteRootRefRequest) String() string { func (*FindRemoteRootRefRequest) ProtoMessage() {} func (x *FindRemoteRootRefRequest) ProtoReflect() protoreflect.Message { - mi := &file_remote_proto_msgTypes[10] + mi := &file_remote_proto_msgTypes[6] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -656,7 +427,7 @@ func (x *FindRemoteRootRefRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use FindRemoteRootRefRequest.ProtoReflect.Descriptor instead. func (*FindRemoteRootRefRequest) Descriptor() ([]byte, []int) { - return file_remote_proto_rawDescGZIP(), []int{10} + return file_remote_proto_rawDescGZIP(), []int{6} } func (x *FindRemoteRootRefRequest) GetRepository() *Repository { @@ -666,14 +437,6 @@ func (x *FindRemoteRootRefRequest) GetRepository() *Repository { return nil } -// Deprecated: Do not use. -func (x *FindRemoteRootRefRequest) GetRemote() string { - if x != nil { - return x.Remote - } - return "" -} - func (x *FindRemoteRootRefRequest) GetRemoteUrl() string { if x != nil { return x.RemoteUrl @@ -702,7 +465,7 @@ type FindRemoteRootRefResponse struct { func (x *FindRemoteRootRefResponse) Reset() { *x = FindRemoteRootRefResponse{} if protoimpl.UnsafeEnabled { - mi := &file_remote_proto_msgTypes[11] + mi := &file_remote_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -715,7 +478,7 @@ func (x *FindRemoteRootRefResponse) String() string { func (*FindRemoteRootRefResponse) ProtoMessage() {} func (x *FindRemoteRootRefResponse) ProtoReflect() protoreflect.Message { - mi := &file_remote_proto_msgTypes[11] + mi := &file_remote_proto_msgTypes[7] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -728,7 +491,7 @@ func (x *FindRemoteRootRefResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use FindRemoteRootRefResponse.ProtoReflect.Descriptor instead. func (*FindRemoteRootRefResponse) Descriptor() ([]byte, []int) { - return file_remote_proto_rawDescGZIP(), []int{11} + return file_remote_proto_rawDescGZIP(), []int{7} } func (x *FindRemoteRootRefResponse) GetRef() string { @@ -738,100 +501,6 @@ func (x *FindRemoteRootRefResponse) GetRef() string { return "" } -type ListRemotesRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Repository *Repository `protobuf:"bytes,1,opt,name=repository,proto3" json:"repository,omitempty"` -} - -func (x *ListRemotesRequest) Reset() { - *x = ListRemotesRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_remote_proto_msgTypes[12] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *ListRemotesRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ListRemotesRequest) ProtoMessage() {} - -func (x *ListRemotesRequest) ProtoReflect() protoreflect.Message { - mi := &file_remote_proto_msgTypes[12] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ListRemotesRequest.ProtoReflect.Descriptor instead. -func (*ListRemotesRequest) Descriptor() ([]byte, []int) { - return file_remote_proto_rawDescGZIP(), []int{12} -} - -func (x *ListRemotesRequest) GetRepository() *Repository { - if x != nil { - return x.Repository - } - return nil -} - -type ListRemotesResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Remotes []*ListRemotesResponse_Remote `protobuf:"bytes,1,rep,name=remotes,proto3" json:"remotes,omitempty"` -} - -func (x *ListRemotesResponse) Reset() { - *x = ListRemotesResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_remote_proto_msgTypes[13] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *ListRemotesResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ListRemotesResponse) ProtoMessage() {} - -func (x *ListRemotesResponse) ProtoReflect() protoreflect.Message { - mi := &file_remote_proto_msgTypes[13] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ListRemotesResponse.ProtoReflect.Descriptor instead. -func (*ListRemotesResponse) Descriptor() ([]byte, []int) { - return file_remote_proto_rawDescGZIP(), []int{13} -} - -func (x *ListRemotesResponse) GetRemotes() []*ListRemotesResponse_Remote { - if x != nil { - return x.Remotes - } - return nil -} - type UpdateRemoteMirrorRequest_Remote struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -847,7 +516,7 @@ type UpdateRemoteMirrorRequest_Remote struct { func (x *UpdateRemoteMirrorRequest_Remote) Reset() { *x = UpdateRemoteMirrorRequest_Remote{} if protoimpl.UnsafeEnabled { - mi := &file_remote_proto_msgTypes[14] + mi := &file_remote_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -860,7 +529,7 @@ func (x *UpdateRemoteMirrorRequest_Remote) String() string { func (*UpdateRemoteMirrorRequest_Remote) ProtoMessage() {} func (x *UpdateRemoteMirrorRequest_Remote) ProtoReflect() protoreflect.Message { - mi := &file_remote_proto_msgTypes[14] + mi := &file_remote_proto_msgTypes[8] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -873,7 +542,7 @@ func (x *UpdateRemoteMirrorRequest_Remote) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateRemoteMirrorRequest_Remote.ProtoReflect.Descriptor instead. func (*UpdateRemoteMirrorRequest_Remote) Descriptor() ([]byte, []int) { - return file_remote_proto_rawDescGZIP(), []int{6, 0} + return file_remote_proto_rawDescGZIP(), []int{2, 0} } func (x *UpdateRemoteMirrorRequest_Remote) GetUrl() string { @@ -890,223 +559,111 @@ func (x *UpdateRemoteMirrorRequest_Remote) GetHttpAuthorizationHeader() string { return "" } -type ListRemotesResponse_Remote struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - FetchUrl string `protobuf:"bytes,2,opt,name=fetch_url,json=fetchUrl,proto3" json:"fetch_url,omitempty"` - PushUrl string `protobuf:"bytes,3,opt,name=push_url,json=pushUrl,proto3" json:"push_url,omitempty"` -} - -func (x *ListRemotesResponse_Remote) Reset() { - *x = ListRemotesResponse_Remote{} - if protoimpl.UnsafeEnabled { - mi := &file_remote_proto_msgTypes[15] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *ListRemotesResponse_Remote) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ListRemotesResponse_Remote) ProtoMessage() {} - -func (x *ListRemotesResponse_Remote) ProtoReflect() protoreflect.Message { - mi := &file_remote_proto_msgTypes[15] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ListRemotesResponse_Remote.ProtoReflect.Descriptor instead. -func (*ListRemotesResponse_Remote) Descriptor() ([]byte, []int) { - return file_remote_proto_rawDescGZIP(), []int{13, 0} -} - -func (x *ListRemotesResponse_Remote) GetName() string { - if x != nil { - return x.Name - } - return "" -} - -func (x *ListRemotesResponse_Remote) GetFetchUrl() string { - if x != nil { - return x.FetchUrl - } - return "" -} - -func (x *ListRemotesResponse_Remote) GetPushUrl() string { - if x != nil { - return x.PushUrl - } - return "" -} - var File_remote_proto protoreflect.FileDescriptor var file_remote_proto_rawDesc = []byte{ 0x0a, 0x0c, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x06, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x1a, 0x0a, 0x6c, 0x69, 0x6e, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x0c, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x22, 0xae, 0x01, 0x0a, 0x10, 0x41, 0x64, 0x64, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, - 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x69, 0x74, 0x61, - 0x6c, 0x79, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x42, 0x04, 0x98, - 0xc6, 0x2c, 0x01, 0x52, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x12, - 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x75, 0x72, 0x6c, 0x12, 0x25, 0x0a, 0x0e, 0x6d, 0x69, 0x72, 0x72, 0x6f, 0x72, 0x5f, - 0x72, 0x65, 0x66, 0x6d, 0x61, 0x70, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x6d, - 0x69, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x65, 0x66, 0x6d, 0x61, 0x70, 0x73, 0x4a, 0x04, 0x08, 0x04, - 0x10, 0x05, 0x52, 0x0d, 0x6d, 0x69, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x72, 0x65, 0x66, 0x6d, 0x61, - 0x70, 0x22, 0x13, 0x0a, 0x11, 0x41, 0x64, 0x64, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x63, 0x0a, 0x13, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, - 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, + 0x22, 0x97, 0x01, 0x0a, 0x1a, 0x46, 0x65, 0x74, 0x63, 0x68, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, + 0x61, 0x6c, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x38, 0x0a, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x52, 0x65, 0x70, + 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x42, 0x04, 0x98, 0xc6, 0x2c, 0x01, 0x52, 0x0a, 0x72, + 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x3f, 0x0a, 0x11, 0x72, 0x65, 0x6d, + 0x6f, 0x74, 0x65, 0x5f, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x52, 0x65, + 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x10, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, + 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x22, 0x35, 0x0a, 0x1b, 0x46, 0x65, + 0x74, 0x63, 0x68, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x52, 0x65, 0x6d, 0x6f, 0x74, + 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x73, + 0x75, 0x6c, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, + 0x74, 0x22, 0x9f, 0x03, 0x0a, 0x19, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x6d, 0x6f, + 0x74, 0x65, 0x4d, 0x69, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x38, 0x0a, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x52, 0x65, 0x70, + 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x42, 0x04, 0x98, 0xc6, 0x2c, 0x01, 0x52, 0x0a, 0x72, + 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x40, 0x0a, 0x06, 0x72, 0x65, 0x6d, + 0x6f, 0x74, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x67, 0x69, 0x74, 0x61, + 0x6c, 0x79, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x4d, + 0x69, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x52, 0x65, 0x6d, + 0x6f, 0x74, 0x65, 0x52, 0x06, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x12, 0x34, 0x0a, 0x16, 0x6f, + 0x6e, 0x6c, 0x79, 0x5f, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x5f, 0x6d, 0x61, 0x74, + 0x63, 0x68, 0x69, 0x6e, 0x67, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x14, 0x6f, 0x6e, 0x6c, + 0x79, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x69, 0x6e, + 0x67, 0x12, 0x17, 0x0a, 0x07, 0x73, 0x73, 0x68, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x06, 0x73, 0x73, 0x68, 0x4b, 0x65, 0x79, 0x12, 0x1f, 0x0a, 0x0b, 0x6b, 0x6e, + 0x6f, 0x77, 0x6e, 0x5f, 0x68, 0x6f, 0x73, 0x74, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0a, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x48, 0x6f, 0x73, 0x74, 0x73, 0x12, 0x2e, 0x0a, 0x13, 0x6b, + 0x65, 0x65, 0x70, 0x5f, 0x64, 0x69, 0x76, 0x65, 0x72, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x72, 0x65, + 0x66, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x6b, 0x65, 0x65, 0x70, 0x44, 0x69, + 0x76, 0x65, 0x72, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x66, 0x73, 0x1a, 0x56, 0x0a, 0x06, 0x52, + 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x12, 0x3a, 0x0a, 0x19, 0x68, 0x74, 0x74, 0x70, 0x5f, + 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x68, 0x65, + 0x61, 0x64, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x17, 0x68, 0x74, 0x74, 0x70, + 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x65, 0x61, + 0x64, 0x65, 0x72, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x52, 0x08, 0x72, 0x65, 0x66, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x22, 0x43, 0x0a, 0x1a, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x6d, + 0x6f, 0x74, 0x65, 0x4d, 0x69, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x64, 0x69, 0x76, 0x65, 0x72, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x72, + 0x65, 0x66, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x0d, 0x64, 0x69, 0x76, 0x65, 0x72, + 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x66, 0x73, 0x22, 0x5e, 0x0a, 0x1b, 0x46, 0x69, 0x6e, 0x64, + 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x6d, 0x6f, 0x74, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x12, + 0x27, 0x0a, 0x0c, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x04, 0x88, 0xc6, 0x2c, 0x01, 0x52, 0x0b, 0x73, 0x74, 0x6f, + 0x72, 0x61, 0x67, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x36, 0x0a, 0x1c, 0x46, 0x69, 0x6e, 0x64, + 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x65, 0x78, 0x69, 0x73, + 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x65, 0x78, 0x69, 0x73, 0x74, 0x73, + 0x22, 0xbd, 0x01, 0x0a, 0x18, 0x46, 0x69, 0x6e, 0x64, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x52, + 0x6f, 0x6f, 0x74, 0x52, 0x65, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x42, 0x04, 0x98, 0xc6, 0x2c, 0x01, 0x52, 0x0a, 0x72, 0x65, 0x70, - 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x2e, 0x0a, 0x14, 0x52, - 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x97, 0x01, 0x0a, 0x1a, - 0x46, 0x65, 0x74, 0x63, 0x68, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x52, 0x65, 0x6d, - 0x6f, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0a, 0x72, 0x65, - 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, - 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, - 0x72, 0x79, 0x42, 0x04, 0x98, 0xc6, 0x2c, 0x01, 0x52, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, - 0x74, 0x6f, 0x72, 0x79, 0x12, 0x3f, 0x0a, 0x11, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x5f, 0x72, - 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x12, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, - 0x6f, 0x72, 0x79, 0x52, 0x10, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x73, - 0x69, 0x74, 0x6f, 0x72, 0x79, 0x22, 0x35, 0x0a, 0x1b, 0x46, 0x65, 0x74, 0x63, 0x68, 0x49, 0x6e, - 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0xaa, 0x03, 0x0a, - 0x19, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x4d, 0x69, 0x72, - 0x72, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0a, 0x72, 0x65, - 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, - 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, - 0x72, 0x79, 0x42, 0x04, 0x98, 0xc6, 0x2c, 0x01, 0x52, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, - 0x74, 0x6f, 0x72, 0x79, 0x12, 0x19, 0x0a, 0x08, 0x72, 0x65, 0x66, 0x5f, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x72, 0x65, 0x66, 0x4e, 0x61, 0x6d, 0x65, 0x12, - 0x40, 0x0a, 0x06, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x28, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, + 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1d, 0x0a, 0x0a, 0x72, 0x65, 0x6d, 0x6f, 0x74, + 0x65, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x6d, + 0x6f, 0x74, 0x65, 0x55, 0x72, 0x6c, 0x12, 0x3a, 0x0a, 0x19, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x61, + 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x68, 0x65, 0x61, + 0x64, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x17, 0x68, 0x74, 0x74, 0x70, 0x41, + 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x65, 0x61, 0x64, + 0x65, 0x72, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x52, 0x06, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, + 0x22, 0x2d, 0x0a, 0x19, 0x46, 0x69, 0x6e, 0x64, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x52, 0x6f, + 0x6f, 0x74, 0x52, 0x65, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x10, 0x0a, + 0x03, 0x72, 0x65, 0x66, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x72, 0x65, 0x66, 0x32, + 0xad, 0x03, 0x0a, 0x0d, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x12, 0x66, 0x0a, 0x13, 0x46, 0x65, 0x74, 0x63, 0x68, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, + 0x61, 0x6c, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x12, 0x22, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, + 0x79, 0x2e, 0x46, 0x65, 0x74, 0x63, 0x68, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x52, + 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x67, + 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x46, 0x65, 0x74, 0x63, 0x68, 0x49, 0x6e, 0x74, 0x65, 0x72, + 0x6e, 0x61, 0x6c, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x06, 0xfa, 0x97, 0x28, 0x02, 0x08, 0x01, 0x12, 0x65, 0x0a, 0x12, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x4d, 0x69, 0x72, 0x72, 0x6f, 0x72, 0x12, + 0x21, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x4d, 0x69, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x52, 0x06, 0x72, 0x65, 0x6d, 0x6f, 0x74, - 0x65, 0x12, 0x34, 0x0a, 0x16, 0x6f, 0x6e, 0x6c, 0x79, 0x5f, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, - 0x65, 0x73, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x18, 0x03, 0x20, 0x03, 0x28, - 0x0c, 0x52, 0x14, 0x6f, 0x6e, 0x6c, 0x79, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x4d, - 0x61, 0x74, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x12, 0x17, 0x0a, 0x07, 0x73, 0x73, 0x68, 0x5f, 0x6b, - 0x65, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x73, 0x68, 0x4b, 0x65, 0x79, - 0x12, 0x1f, 0x0a, 0x0b, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x5f, 0x68, 0x6f, 0x73, 0x74, 0x73, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x48, 0x6f, 0x73, 0x74, - 0x73, 0x12, 0x2e, 0x0a, 0x13, 0x6b, 0x65, 0x65, 0x70, 0x5f, 0x64, 0x69, 0x76, 0x65, 0x72, 0x67, - 0x65, 0x6e, 0x74, 0x5f, 0x72, 0x65, 0x66, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, - 0x6b, 0x65, 0x65, 0x70, 0x44, 0x69, 0x76, 0x65, 0x72, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x66, - 0x73, 0x1a, 0x56, 0x0a, 0x06, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x75, - 0x72, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x12, 0x3a, 0x0a, - 0x19, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x17, 0x68, 0x74, 0x74, 0x70, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x43, 0x0a, 0x1a, 0x55, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x4d, 0x69, 0x72, 0x72, 0x6f, 0x72, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x64, 0x69, 0x76, 0x65, 0x72, - 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x72, 0x65, 0x66, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0c, 0x52, - 0x0d, 0x64, 0x69, 0x76, 0x65, 0x72, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x66, 0x73, 0x22, 0x5e, - 0x0a, 0x1b, 0x46, 0x69, 0x6e, 0x64, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6f, - 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, - 0x06, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, - 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x12, 0x27, 0x0a, 0x0c, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, - 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x04, 0x88, 0xc6, 0x2c, - 0x01, 0x52, 0x0b, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x36, - 0x0a, 0x1c, 0x46, 0x69, 0x6e, 0x64, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6f, - 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x16, - 0x0a, 0x06, 0x65, 0x78, 0x69, 0x73, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, - 0x65, 0x78, 0x69, 0x73, 0x74, 0x73, 0x22, 0xcb, 0x01, 0x0a, 0x18, 0x46, 0x69, 0x6e, 0x64, 0x52, - 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x52, 0x6f, 0x6f, 0x74, 0x52, 0x65, 0x66, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, - 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, - 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x42, 0x04, 0x98, 0xc6, 0x2c, - 0x01, 0x52, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1a, 0x0a, - 0x06, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, - 0x01, 0x52, 0x06, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x72, 0x65, 0x6d, - 0x6f, 0x74, 0x65, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x72, - 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x55, 0x72, 0x6c, 0x12, 0x3a, 0x0a, 0x19, 0x68, 0x74, 0x74, 0x70, - 0x5f, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x68, - 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x17, 0x68, 0x74, 0x74, - 0x70, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x65, - 0x61, 0x64, 0x65, 0x72, 0x22, 0x2d, 0x0a, 0x19, 0x46, 0x69, 0x6e, 0x64, 0x52, 0x65, 0x6d, 0x6f, - 0x74, 0x65, 0x52, 0x6f, 0x6f, 0x74, 0x52, 0x65, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x10, 0x0a, 0x03, 0x72, 0x65, 0x66, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, - 0x72, 0x65, 0x66, 0x22, 0x4e, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x6d, 0x6f, 0x74, - 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0a, 0x72, 0x65, 0x70, - 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, - 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, - 0x79, 0x42, 0x04, 0x98, 0xc6, 0x2c, 0x01, 0x52, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, - 0x6f, 0x72, 0x79, 0x22, 0xa9, 0x01, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x6d, 0x6f, - 0x74, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3c, 0x0a, 0x07, 0x72, - 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x67, - 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, - 0x52, 0x07, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x73, 0x1a, 0x54, 0x0a, 0x06, 0x52, 0x65, 0x6d, - 0x6f, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x66, 0x65, 0x74, 0x63, 0x68, - 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x65, 0x74, 0x63, - 0x68, 0x55, 0x72, 0x6c, 0x12, 0x19, 0x0a, 0x08, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x75, 0x72, 0x6c, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x75, 0x73, 0x68, 0x55, 0x72, 0x6c, 0x32, - 0xca, 0x04, 0x0a, 0x0d, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x12, 0x48, 0x0a, 0x09, 0x41, 0x64, 0x64, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x12, 0x18, - 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x6d, 0x6f, 0x74, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, - 0x79, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x06, 0xfa, 0x97, 0x28, 0x02, 0x08, 0x01, 0x12, 0x66, 0x0a, 0x13, 0x46, - 0x65, 0x74, 0x63, 0x68, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x52, 0x65, 0x6d, 0x6f, - 0x74, 0x65, 0x12, 0x22, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x46, 0x65, 0x74, 0x63, - 0x68, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, - 0x46, 0x65, 0x74, 0x63, 0x68, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x52, 0x65, 0x6d, - 0x6f, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xfa, 0x97, 0x28, - 0x02, 0x08, 0x01, 0x12, 0x51, 0x0a, 0x0c, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x6d, - 0x6f, 0x74, 0x65, 0x12, 0x1b, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x52, 0x65, 0x6d, - 0x6f, 0x76, 0x65, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x1c, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, - 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, - 0xfa, 0x97, 0x28, 0x02, 0x08, 0x01, 0x12, 0x65, 0x0a, 0x12, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x4d, 0x69, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x21, 0x2e, 0x67, - 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x6d, 0x6f, - 0x74, 0x65, 0x4d, 0x69, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x22, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, - 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x4d, 0x69, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x06, 0xfa, 0x97, 0x28, 0x02, 0x08, 0x02, 0x28, 0x01, 0x12, 0x6b, 0x0a, - 0x14, 0x46, 0x69, 0x6e, 0x64, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x73, - 0x69, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x23, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x46, - 0x69, 0x6e, 0x64, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, - 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x67, 0x69, 0x74, - 0x61, 0x6c, 0x79, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x52, 0x65, - 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x08, 0xfa, 0x97, 0x28, 0x04, 0x08, 0x02, 0x10, 0x02, 0x12, 0x60, 0x0a, 0x11, 0x46, 0x69, - 0x6e, 0x64, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x52, 0x6f, 0x6f, 0x74, 0x52, 0x65, 0x66, 0x12, - 0x20, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x52, 0x65, 0x6d, - 0x6f, 0x74, 0x65, 0x52, 0x6f, 0x6f, 0x74, 0x52, 0x65, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x21, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x52, - 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x52, 0x6f, 0x6f, 0x74, 0x52, 0x65, 0x66, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xfa, 0x97, 0x28, 0x02, 0x08, 0x02, 0x42, 0x34, 0x5a, 0x32, - 0x67, 0x69, 0x74, 0x6c, 0x61, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x69, 0x74, 0x6c, 0x61, - 0x62, 0x2d, 0x6f, 0x72, 0x67, 0x2f, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2f, 0x76, 0x31, 0x34, - 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x2f, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, - 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x4d, 0x69, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xfa, 0x97, 0x28, 0x02, 0x08, 0x02, 0x28, 0x01, + 0x12, 0x6b, 0x0a, 0x14, 0x46, 0x69, 0x6e, 0x64, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x52, 0x65, + 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x23, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, + 0x79, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6f, + 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, + 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x52, 0x65, 0x6d, 0x6f, 0x74, + 0x65, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x08, 0xfa, 0x97, 0x28, 0x04, 0x08, 0x02, 0x10, 0x02, 0x12, 0x60, 0x0a, + 0x11, 0x46, 0x69, 0x6e, 0x64, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x52, 0x6f, 0x6f, 0x74, 0x52, + 0x65, 0x66, 0x12, 0x20, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x46, 0x69, 0x6e, 0x64, + 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x52, 0x6f, 0x6f, 0x74, 0x52, 0x65, 0x66, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x46, 0x69, + 0x6e, 0x64, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x52, 0x6f, 0x6f, 0x74, 0x52, 0x65, 0x66, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xfa, 0x97, 0x28, 0x02, 0x08, 0x02, 0x42, + 0x34, 0x5a, 0x32, 0x67, 0x69, 0x74, 0x6c, 0x61, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x69, + 0x74, 0x6c, 0x61, 0x62, 0x2d, 0x6f, 0x72, 0x67, 0x2f, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2f, + 0x76, 0x31, 0x34, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x2f, 0x67, 0x69, 0x74, + 0x61, 0x6c, 0x79, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -1121,53 +678,38 @@ func file_remote_proto_rawDescGZIP() []byte { return file_remote_proto_rawDescData } -var file_remote_proto_msgTypes = make([]protoimpl.MessageInfo, 16) +var file_remote_proto_msgTypes = make([]protoimpl.MessageInfo, 9) var file_remote_proto_goTypes = []interface{}{ - (*AddRemoteRequest)(nil), // 0: gitaly.AddRemoteRequest - (*AddRemoteResponse)(nil), // 1: gitaly.AddRemoteResponse - (*RemoveRemoteRequest)(nil), // 2: gitaly.RemoveRemoteRequest - (*RemoveRemoteResponse)(nil), // 3: gitaly.RemoveRemoteResponse - (*FetchInternalRemoteRequest)(nil), // 4: gitaly.FetchInternalRemoteRequest - (*FetchInternalRemoteResponse)(nil), // 5: gitaly.FetchInternalRemoteResponse - (*UpdateRemoteMirrorRequest)(nil), // 6: gitaly.UpdateRemoteMirrorRequest - (*UpdateRemoteMirrorResponse)(nil), // 7: gitaly.UpdateRemoteMirrorResponse - (*FindRemoteRepositoryRequest)(nil), // 8: gitaly.FindRemoteRepositoryRequest - (*FindRemoteRepositoryResponse)(nil), // 9: gitaly.FindRemoteRepositoryResponse - (*FindRemoteRootRefRequest)(nil), // 10: gitaly.FindRemoteRootRefRequest - (*FindRemoteRootRefResponse)(nil), // 11: gitaly.FindRemoteRootRefResponse - (*ListRemotesRequest)(nil), // 12: gitaly.ListRemotesRequest - (*ListRemotesResponse)(nil), // 13: gitaly.ListRemotesResponse - (*UpdateRemoteMirrorRequest_Remote)(nil), // 14: gitaly.UpdateRemoteMirrorRequest.Remote - (*ListRemotesResponse_Remote)(nil), // 15: gitaly.ListRemotesResponse.Remote - (*Repository)(nil), // 16: gitaly.Repository + (*FetchInternalRemoteRequest)(nil), // 0: gitaly.FetchInternalRemoteRequest + (*FetchInternalRemoteResponse)(nil), // 1: gitaly.FetchInternalRemoteResponse + (*UpdateRemoteMirrorRequest)(nil), // 2: gitaly.UpdateRemoteMirrorRequest + (*UpdateRemoteMirrorResponse)(nil), // 3: gitaly.UpdateRemoteMirrorResponse + (*FindRemoteRepositoryRequest)(nil), // 4: gitaly.FindRemoteRepositoryRequest + (*FindRemoteRepositoryResponse)(nil), // 5: gitaly.FindRemoteRepositoryResponse + (*FindRemoteRootRefRequest)(nil), // 6: gitaly.FindRemoteRootRefRequest + (*FindRemoteRootRefResponse)(nil), // 7: gitaly.FindRemoteRootRefResponse + (*UpdateRemoteMirrorRequest_Remote)(nil), // 8: gitaly.UpdateRemoteMirrorRequest.Remote + (*Repository)(nil), // 9: gitaly.Repository } var file_remote_proto_depIdxs = []int32{ - 16, // 0: gitaly.AddRemoteRequest.repository:type_name -> gitaly.Repository - 16, // 1: gitaly.RemoveRemoteRequest.repository:type_name -> gitaly.Repository - 16, // 2: gitaly.FetchInternalRemoteRequest.repository:type_name -> gitaly.Repository - 16, // 3: gitaly.FetchInternalRemoteRequest.remote_repository:type_name -> gitaly.Repository - 16, // 4: gitaly.UpdateRemoteMirrorRequest.repository:type_name -> gitaly.Repository - 14, // 5: gitaly.UpdateRemoteMirrorRequest.remote:type_name -> gitaly.UpdateRemoteMirrorRequest.Remote - 16, // 6: gitaly.FindRemoteRootRefRequest.repository:type_name -> gitaly.Repository - 16, // 7: gitaly.ListRemotesRequest.repository:type_name -> gitaly.Repository - 15, // 8: gitaly.ListRemotesResponse.remotes:type_name -> gitaly.ListRemotesResponse.Remote - 0, // 9: gitaly.RemoteService.AddRemote:input_type -> gitaly.AddRemoteRequest - 4, // 10: gitaly.RemoteService.FetchInternalRemote:input_type -> gitaly.FetchInternalRemoteRequest - 2, // 11: gitaly.RemoteService.RemoveRemote:input_type -> gitaly.RemoveRemoteRequest - 6, // 12: gitaly.RemoteService.UpdateRemoteMirror:input_type -> gitaly.UpdateRemoteMirrorRequest - 8, // 13: gitaly.RemoteService.FindRemoteRepository:input_type -> gitaly.FindRemoteRepositoryRequest - 10, // 14: gitaly.RemoteService.FindRemoteRootRef:input_type -> gitaly.FindRemoteRootRefRequest - 1, // 15: gitaly.RemoteService.AddRemote:output_type -> gitaly.AddRemoteResponse - 5, // 16: gitaly.RemoteService.FetchInternalRemote:output_type -> gitaly.FetchInternalRemoteResponse - 3, // 17: gitaly.RemoteService.RemoveRemote:output_type -> gitaly.RemoveRemoteResponse - 7, // 18: gitaly.RemoteService.UpdateRemoteMirror:output_type -> gitaly.UpdateRemoteMirrorResponse - 9, // 19: gitaly.RemoteService.FindRemoteRepository:output_type -> gitaly.FindRemoteRepositoryResponse - 11, // 20: gitaly.RemoteService.FindRemoteRootRef:output_type -> gitaly.FindRemoteRootRefResponse - 15, // [15:21] is the sub-list for method output_type - 9, // [9:15] is the sub-list for method input_type - 9, // [9:9] is the sub-list for extension type_name - 9, // [9:9] is the sub-list for extension extendee - 0, // [0:9] is the sub-list for field type_name + 9, // 0: gitaly.FetchInternalRemoteRequest.repository:type_name -> gitaly.Repository + 9, // 1: gitaly.FetchInternalRemoteRequest.remote_repository:type_name -> gitaly.Repository + 9, // 2: gitaly.UpdateRemoteMirrorRequest.repository:type_name -> gitaly.Repository + 8, // 3: gitaly.UpdateRemoteMirrorRequest.remote:type_name -> gitaly.UpdateRemoteMirrorRequest.Remote + 9, // 4: gitaly.FindRemoteRootRefRequest.repository:type_name -> gitaly.Repository + 0, // 5: gitaly.RemoteService.FetchInternalRemote:input_type -> gitaly.FetchInternalRemoteRequest + 2, // 6: gitaly.RemoteService.UpdateRemoteMirror:input_type -> gitaly.UpdateRemoteMirrorRequest + 4, // 7: gitaly.RemoteService.FindRemoteRepository:input_type -> gitaly.FindRemoteRepositoryRequest + 6, // 8: gitaly.RemoteService.FindRemoteRootRef:input_type -> gitaly.FindRemoteRootRefRequest + 1, // 9: gitaly.RemoteService.FetchInternalRemote:output_type -> gitaly.FetchInternalRemoteResponse + 3, // 10: gitaly.RemoteService.UpdateRemoteMirror:output_type -> gitaly.UpdateRemoteMirrorResponse + 5, // 11: gitaly.RemoteService.FindRemoteRepository:output_type -> gitaly.FindRemoteRepositoryResponse + 7, // 12: gitaly.RemoteService.FindRemoteRootRef:output_type -> gitaly.FindRemoteRootRefResponse + 9, // [9:13] is the sub-list for method output_type + 5, // [5:9] is the sub-list for method input_type + 5, // [5:5] is the sub-list for extension type_name + 5, // [5:5] is the sub-list for extension extendee + 0, // [0:5] is the sub-list for field type_name } func init() { file_remote_proto_init() } @@ -1179,54 +721,6 @@ func file_remote_proto_init() { file_shared_proto_init() if !protoimpl.UnsafeEnabled { file_remote_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AddRemoteRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_remote_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AddRemoteResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_remote_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RemoveRemoteRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_remote_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RemoveRemoteResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_remote_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*FetchInternalRemoteRequest); i { case 0: return &v.state @@ -1238,7 +732,7 @@ func file_remote_proto_init() { return nil } } - file_remote_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + file_remote_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*FetchInternalRemoteResponse); i { case 0: return &v.state @@ -1250,7 +744,7 @@ func file_remote_proto_init() { return nil } } - file_remote_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + file_remote_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*UpdateRemoteMirrorRequest); i { case 0: return &v.state @@ -1262,7 +756,7 @@ func file_remote_proto_init() { return nil } } - file_remote_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + file_remote_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*UpdateRemoteMirrorResponse); i { case 0: return &v.state @@ -1274,7 +768,7 @@ func file_remote_proto_init() { return nil } } - file_remote_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + file_remote_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*FindRemoteRepositoryRequest); i { case 0: return &v.state @@ -1286,7 +780,7 @@ func file_remote_proto_init() { return nil } } - file_remote_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { + file_remote_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*FindRemoteRepositoryResponse); i { case 0: return &v.state @@ -1298,7 +792,7 @@ func file_remote_proto_init() { return nil } } - file_remote_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { + file_remote_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*FindRemoteRootRefRequest); i { case 0: return &v.state @@ -1310,7 +804,7 @@ func file_remote_proto_init() { return nil } } - file_remote_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { + file_remote_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*FindRemoteRootRefResponse); i { case 0: return &v.state @@ -1322,31 +816,7 @@ func file_remote_proto_init() { return nil } } - file_remote_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListRemotesRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_remote_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListRemotesResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_remote_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { + file_remote_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*UpdateRemoteMirrorRequest_Remote); i { case 0: return &v.state @@ -1358,18 +828,6 @@ func file_remote_proto_init() { return nil } } - file_remote_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListRemotesResponse_Remote); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } } type x struct{} out := protoimpl.TypeBuilder{ @@ -1377,7 +835,7 @@ func file_remote_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_remote_proto_rawDesc, NumEnums: 0, - NumMessages: 16, + NumMessages: 9, NumExtensions: 0, NumServices: 1, }, diff --git a/proto/go/gitalypb/remote_grpc.pb.go b/proto/go/gitalypb/remote_grpc.pb.go index 4c6efadd9..ac70dfbdf 100644 --- a/proto/go/gitalypb/remote_grpc.pb.go +++ b/proto/go/gitalypb/remote_grpc.pb.go @@ -18,9 +18,7 @@ const _ = grpc.SupportPackageIsVersion7 // // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. type RemoteServiceClient interface { - AddRemote(ctx context.Context, in *AddRemoteRequest, opts ...grpc.CallOption) (*AddRemoteResponse, error) FetchInternalRemote(ctx context.Context, in *FetchInternalRemoteRequest, opts ...grpc.CallOption) (*FetchInternalRemoteResponse, error) - RemoveRemote(ctx context.Context, in *RemoveRemoteRequest, opts ...grpc.CallOption) (*RemoveRemoteResponse, error) // UpdateRemoteMirror compares the references in the target repository and its remote mirror // repository. Any differences in the references are then addressed by pushing the differing // references to the mirror. Created and modified references are updated, removed references are @@ -44,15 +42,6 @@ func NewRemoteServiceClient(cc grpc.ClientConnInterface) RemoteServiceClient { return &remoteServiceClient{cc} } -func (c *remoteServiceClient) AddRemote(ctx context.Context, in *AddRemoteRequest, opts ...grpc.CallOption) (*AddRemoteResponse, error) { - out := new(AddRemoteResponse) - err := c.cc.Invoke(ctx, "/gitaly.RemoteService/AddRemote", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - func (c *remoteServiceClient) FetchInternalRemote(ctx context.Context, in *FetchInternalRemoteRequest, opts ...grpc.CallOption) (*FetchInternalRemoteResponse, error) { out := new(FetchInternalRemoteResponse) err := c.cc.Invoke(ctx, "/gitaly.RemoteService/FetchInternalRemote", in, out, opts...) @@ -62,15 +51,6 @@ func (c *remoteServiceClient) FetchInternalRemote(ctx context.Context, in *Fetch return out, nil } -func (c *remoteServiceClient) RemoveRemote(ctx context.Context, in *RemoveRemoteRequest, opts ...grpc.CallOption) (*RemoveRemoteResponse, error) { - out := new(RemoveRemoteResponse) - err := c.cc.Invoke(ctx, "/gitaly.RemoteService/RemoveRemote", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - func (c *remoteServiceClient) UpdateRemoteMirror(ctx context.Context, opts ...grpc.CallOption) (RemoteService_UpdateRemoteMirrorClient, error) { stream, err := c.cc.NewStream(ctx, &RemoteService_ServiceDesc.Streams[0], "/gitaly.RemoteService/UpdateRemoteMirror", opts...) if err != nil { @@ -127,9 +107,7 @@ func (c *remoteServiceClient) FindRemoteRootRef(ctx context.Context, in *FindRem // All implementations must embed UnimplementedRemoteServiceServer // for forward compatibility type RemoteServiceServer interface { - AddRemote(context.Context, *AddRemoteRequest) (*AddRemoteResponse, error) FetchInternalRemote(context.Context, *FetchInternalRemoteRequest) (*FetchInternalRemoteResponse, error) - RemoveRemote(context.Context, *RemoveRemoteRequest) (*RemoveRemoteResponse, error) // UpdateRemoteMirror compares the references in the target repository and its remote mirror // repository. Any differences in the references are then addressed by pushing the differing // references to the mirror. Created and modified references are updated, removed references are @@ -150,15 +128,9 @@ type RemoteServiceServer interface { type UnimplementedRemoteServiceServer struct { } -func (UnimplementedRemoteServiceServer) AddRemote(context.Context, *AddRemoteRequest) (*AddRemoteResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method AddRemote not implemented") -} func (UnimplementedRemoteServiceServer) FetchInternalRemote(context.Context, *FetchInternalRemoteRequest) (*FetchInternalRemoteResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method FetchInternalRemote not implemented") } -func (UnimplementedRemoteServiceServer) RemoveRemote(context.Context, *RemoveRemoteRequest) (*RemoveRemoteResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method RemoveRemote not implemented") -} func (UnimplementedRemoteServiceServer) UpdateRemoteMirror(RemoteService_UpdateRemoteMirrorServer) error { return status.Errorf(codes.Unimplemented, "method UpdateRemoteMirror not implemented") } @@ -181,24 +153,6 @@ func RegisterRemoteServiceServer(s grpc.ServiceRegistrar, srv RemoteServiceServe s.RegisterService(&RemoteService_ServiceDesc, srv) } -func _RemoteService_AddRemote_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(AddRemoteRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(RemoteServiceServer).AddRemote(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/gitaly.RemoteService/AddRemote", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(RemoteServiceServer).AddRemote(ctx, req.(*AddRemoteRequest)) - } - return interceptor(ctx, in, info, handler) -} - func _RemoteService_FetchInternalRemote_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(FetchInternalRemoteRequest) if err := dec(in); err != nil { @@ -217,24 +171,6 @@ func _RemoteService_FetchInternalRemote_Handler(srv interface{}, ctx context.Con return interceptor(ctx, in, info, handler) } -func _RemoteService_RemoveRemote_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(RemoveRemoteRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(RemoteServiceServer).RemoveRemote(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/gitaly.RemoteService/RemoveRemote", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(RemoteServiceServer).RemoveRemote(ctx, req.(*RemoveRemoteRequest)) - } - return interceptor(ctx, in, info, handler) -} - func _RemoteService_UpdateRemoteMirror_Handler(srv interface{}, stream grpc.ServerStream) error { return srv.(RemoteServiceServer).UpdateRemoteMirror(&remoteServiceUpdateRemoteMirrorServer{stream}) } @@ -305,18 +241,10 @@ var RemoteService_ServiceDesc = grpc.ServiceDesc{ HandlerType: (*RemoteServiceServer)(nil), Methods: []grpc.MethodDesc{ { - MethodName: "AddRemote", - Handler: _RemoteService_AddRemote_Handler, - }, - { MethodName: "FetchInternalRemote", Handler: _RemoteService_FetchInternalRemote_Handler, }, { - MethodName: "RemoveRemote", - Handler: _RemoteService_RemoveRemote_Handler, - }, - { MethodName: "FindRemoteRepository", Handler: _RemoteService_FindRemoteRepository_Handler, }, diff --git a/proto/go/gitalypb/repository-service.pb.go b/proto/go/gitalypb/repository-service.pb.go index fda45adb6..973206e16 100644 --- a/proto/go/gitalypb/repository-service.pb.go +++ b/proto/go/gitalypb/repository-service.pb.go @@ -1015,10 +1015,6 @@ type FetchRemoteRequest struct { unknownFields protoimpl.UnknownFields Repository *Repository `protobuf:"bytes,1,opt,name=repository,proto3" json:"repository,omitempty"` - // remote is the name of the remote that shall be fetched. This remote must - // exist in the repository's configuration already. This parameter is - // deprecated in favor of remote_params. - Remote string `protobuf:"bytes,2,opt,name=remote,proto3" json:"remote,omitempty"` // force determines if references should be force-updated in case they have // diverged. Force bool `protobuf:"varint,3,opt,name=force,proto3" json:"force,omitempty"` @@ -1079,13 +1075,6 @@ func (x *FetchRemoteRequest) GetRepository() *Repository { return nil } -func (x *FetchRemoteRequest) GetRemote() string { - if x != nil { - return x.Remote - } - return "" -} - func (x *FetchRemoteRequest) GetForce() bool { if x != nil { return x.Force @@ -5009,702 +4998,702 @@ var file_repository_service_proto_rawDesc = []byte{ 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x1c, 0x0a, 0x1a, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x47, 0x69, 0x74, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, - 0x74, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xed, 0x02, 0x0a, 0x12, + 0x74, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xe3, 0x02, 0x0a, 0x12, 0x46, 0x65, 0x74, 0x63, 0x68, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x42, 0x04, 0x98, 0xc6, 0x2c, 0x01, - 0x52, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x16, 0x0a, 0x06, - 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, - 0x6d, 0x6f, 0x74, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x12, 0x17, 0x0a, 0x07, 0x6e, 0x6f, - 0x5f, 0x74, 0x61, 0x67, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, 0x54, - 0x61, 0x67, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x17, 0x0a, - 0x07, 0x73, 0x73, 0x68, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x73, 0x73, 0x68, 0x4b, 0x65, 0x79, 0x12, 0x1f, 0x0a, 0x0b, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x5f, - 0x68, 0x6f, 0x73, 0x74, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6b, 0x6e, 0x6f, - 0x77, 0x6e, 0x48, 0x6f, 0x73, 0x74, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x6e, 0x6f, 0x5f, 0x70, 0x72, - 0x75, 0x6e, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x6e, 0x6f, 0x50, 0x72, 0x75, - 0x6e, 0x65, 0x12, 0x33, 0x0a, 0x0d, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x5f, 0x70, 0x61, 0x72, - 0x61, 0x6d, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x67, 0x69, 0x74, 0x61, - 0x6c, 0x79, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x52, 0x0c, 0x72, 0x65, 0x6d, 0x6f, 0x74, - 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x2c, 0x0a, 0x12, 0x63, 0x68, 0x65, 0x63, 0x6b, - 0x5f, 0x74, 0x61, 0x67, 0x73, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x18, 0x0b, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x10, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x54, 0x61, 0x67, 0x73, 0x43, 0x68, - 0x61, 0x6e, 0x67, 0x65, 0x64, 0x4a, 0x04, 0x08, 0x08, 0x10, 0x09, 0x22, 0x38, 0x0a, 0x13, 0x46, - 0x65, 0x74, 0x63, 0x68, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x74, 0x61, 0x67, 0x73, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x67, - 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x74, 0x61, 0x67, 0x73, 0x43, 0x68, - 0x61, 0x6e, 0x67, 0x65, 0x64, 0x22, 0x53, 0x0a, 0x17, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, - 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x38, 0x0a, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x52, 0x65, - 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x42, 0x04, 0x98, 0xc6, 0x2c, 0x01, 0x52, 0x0a, - 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x22, 0x1a, 0x0a, 0x18, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xea, 0x02, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x41, 0x72, - 0x63, 0x68, 0x69, 0x76, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0a, - 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x12, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, - 0x74, 0x6f, 0x72, 0x79, 0x42, 0x04, 0x98, 0xc6, 0x2c, 0x01, 0x52, 0x0a, 0x72, 0x65, 0x70, 0x6f, - 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1b, 0x0a, 0x09, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, - 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x6f, 0x6d, 0x6d, 0x69, - 0x74, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x06, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x12, 0x38, 0x0a, 0x06, 0x66, - 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x67, 0x69, - 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x52, 0x06, 0x66, - 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x0c, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x78, 0x63, - 0x6c, 0x75, 0x64, 0x65, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x07, 0x65, 0x78, 0x63, 0x6c, - 0x75, 0x64, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x65, 0x6c, 0x69, 0x64, 0x65, 0x5f, 0x70, 0x61, 0x74, - 0x68, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x65, 0x6c, 0x69, 0x64, 0x65, 0x50, 0x61, - 0x74, 0x68, 0x12, 0x2a, 0x0a, 0x11, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x6c, 0x66, - 0x73, 0x5f, 0x62, 0x6c, 0x6f, 0x62, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x69, - 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x4c, 0x66, 0x73, 0x42, 0x6c, 0x6f, 0x62, 0x73, 0x22, 0x33, - 0x0a, 0x06, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x07, 0x0a, 0x03, 0x5a, 0x49, 0x50, 0x10, - 0x00, 0x12, 0x07, 0x0a, 0x03, 0x54, 0x41, 0x52, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x54, 0x41, - 0x52, 0x5f, 0x47, 0x5a, 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x54, 0x41, 0x52, 0x5f, 0x42, 0x5a, - 0x32, 0x10, 0x03, 0x22, 0x28, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, - 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, - 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x53, 0x0a, - 0x17, 0x48, 0x61, 0x73, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0a, 0x72, 0x65, 0x70, 0x6f, - 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, - 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, - 0x42, 0x04, 0x98, 0xc6, 0x2c, 0x01, 0x52, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, - 0x72, 0x79, 0x22, 0x30, 0x0a, 0x18, 0x48, 0x61, 0x73, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x42, 0x72, - 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, - 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x22, 0xd9, 0x01, 0x0a, 0x18, 0x46, 0x65, 0x74, 0x63, 0x68, 0x53, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x38, 0x0a, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x52, - 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x42, 0x04, 0x98, 0xc6, 0x2c, 0x01, 0x52, - 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x3f, 0x0a, 0x11, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, - 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x10, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x23, 0x0a, 0x0d, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x42, 0x72, 0x61, 0x6e, 0x63, - 0x68, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x72, 0x65, 0x66, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x66, - 0x22, 0x33, 0x0a, 0x19, 0x46, 0x65, 0x74, 0x63, 0x68, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x42, - 0x72, 0x61, 0x6e, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x16, 0x0a, - 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x72, - 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x47, 0x0a, 0x0b, 0x46, 0x73, 0x63, 0x6b, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, - 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, - 0x79, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x42, 0x04, 0x98, 0xc6, - 0x2c, 0x01, 0x52, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x22, 0x24, - 0x0a, 0x0c, 0x46, 0x73, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, - 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x65, - 0x72, 0x72, 0x6f, 0x72, 0x22, 0xb8, 0x01, 0x0a, 0x0f, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, - 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0a, 0x72, 0x65, 0x70, 0x6f, - 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, + 0x52, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x14, 0x0a, 0x05, + 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, + 0x63, 0x65, 0x12, 0x17, 0x0a, 0x07, 0x6e, 0x6f, 0x5f, 0x74, 0x61, 0x67, 0x73, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x06, 0x6e, 0x6f, 0x54, 0x61, 0x67, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x74, + 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x74, 0x69, + 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x73, 0x73, 0x68, 0x5f, 0x6b, 0x65, 0x79, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x73, 0x68, 0x4b, 0x65, 0x79, 0x12, 0x1f, + 0x0a, 0x0b, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x5f, 0x68, 0x6f, 0x73, 0x74, 0x73, 0x18, 0x07, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x48, 0x6f, 0x73, 0x74, 0x73, 0x12, + 0x19, 0x0a, 0x08, 0x6e, 0x6f, 0x5f, 0x70, 0x72, 0x75, 0x6e, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x07, 0x6e, 0x6f, 0x50, 0x72, 0x75, 0x6e, 0x65, 0x12, 0x33, 0x0a, 0x0d, 0x72, 0x65, + 0x6d, 0x6f, 0x74, 0x65, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x0e, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x74, + 0x65, 0x52, 0x0c, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, + 0x2c, 0x0a, 0x12, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x74, 0x61, 0x67, 0x73, 0x5f, 0x63, 0x68, + 0x61, 0x6e, 0x67, 0x65, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x63, 0x68, 0x65, + 0x63, 0x6b, 0x54, 0x61, 0x67, 0x73, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x4a, 0x04, 0x08, + 0x08, 0x10, 0x09, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x52, 0x06, 0x72, 0x65, 0x6d, 0x6f, 0x74, + 0x65, 0x22, 0x38, 0x0a, 0x13, 0x46, 0x65, 0x74, 0x63, 0x68, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x74, 0x61, 0x67, 0x73, + 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, + 0x74, 0x61, 0x67, 0x73, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x22, 0x53, 0x0a, 0x17, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, + 0x74, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x69, 0x74, + 0x61, 0x6c, 0x79, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x42, 0x04, + 0x98, 0xc6, 0x2c, 0x01, 0x52, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, + 0x22, 0x1a, 0x0a, 0x18, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, + 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xea, 0x02, 0x0a, + 0x11, 0x47, 0x65, 0x74, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, + 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x42, 0x04, 0x98, 0xc6, 0x2c, 0x01, + 0x52, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1b, 0x0a, 0x09, + 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x72, 0x65, + 0x66, 0x69, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x70, 0x72, 0x65, 0x66, 0x69, + 0x78, 0x12, 0x38, 0x0a, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x20, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x72, + 0x63, 0x68, 0x69, 0x76, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x46, 0x6f, 0x72, + 0x6d, 0x61, 0x74, 0x52, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x70, + 0x61, 0x74, 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, + 0x18, 0x0a, 0x07, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0c, + 0x52, 0x07, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x65, 0x6c, 0x69, + 0x64, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x65, + 0x6c, 0x69, 0x64, 0x65, 0x50, 0x61, 0x74, 0x68, 0x12, 0x2a, 0x0a, 0x11, 0x69, 0x6e, 0x63, 0x6c, + 0x75, 0x64, 0x65, 0x5f, 0x6c, 0x66, 0x73, 0x5f, 0x62, 0x6c, 0x6f, 0x62, 0x73, 0x18, 0x08, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x0f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x4c, 0x66, 0x73, 0x42, + 0x6c, 0x6f, 0x62, 0x73, 0x22, 0x33, 0x0a, 0x06, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x07, + 0x0a, 0x03, 0x5a, 0x49, 0x50, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x54, 0x41, 0x52, 0x10, 0x01, + 0x12, 0x0a, 0x0a, 0x06, 0x54, 0x41, 0x52, 0x5f, 0x47, 0x5a, 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, + 0x54, 0x41, 0x52, 0x5f, 0x42, 0x5a, 0x32, 0x10, 0x03, 0x22, 0x28, 0x0a, 0x12, 0x47, 0x65, 0x74, + 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, + 0x61, 0x74, 0x61, 0x22, 0x53, 0x0a, 0x17, 0x48, 0x61, 0x73, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x42, + 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, + 0x0a, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x52, 0x65, 0x70, 0x6f, + 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x42, 0x04, 0x98, 0xc6, 0x2c, 0x01, 0x52, 0x0a, 0x72, 0x65, + 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x22, 0x30, 0x0a, 0x18, 0x48, 0x61, 0x73, 0x4c, + 0x6f, 0x63, 0x61, 0x6c, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xd9, 0x01, 0x0a, 0x18, 0x46, + 0x65, 0x74, 0x63, 0x68, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, + 0x69, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x69, + 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x42, + 0x04, 0x98, 0xc6, 0x2c, 0x01, 0x52, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, + 0x79, 0x12, 0x3f, 0x0a, 0x11, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x72, 0x65, 0x70, 0x6f, + 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, - 0x42, 0x04, 0x98, 0xc6, 0x2c, 0x01, 0x52, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, - 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x72, 0x65, 0x66, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, - 0x03, 0x72, 0x65, 0x66, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, - 0x12, 0x21, 0x0a, 0x0c, 0x6f, 0x6c, 0x64, 0x5f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x6f, 0x6c, 0x64, 0x52, 0x65, 0x76, 0x69, 0x73, - 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x4a, 0x04, 0x08, 0x06, 0x10, 0x07, 0x22, - 0x18, 0x0a, 0x10, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x4a, 0x04, 0x08, 0x01, 0x10, 0x02, 0x22, 0x6e, 0x0a, 0x14, 0x46, 0x69, 0x6e, - 0x64, 0x4d, 0x65, 0x72, 0x67, 0x65, 0x42, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x38, 0x0a, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x52, - 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x42, 0x04, 0x98, 0xc6, 0x2c, 0x01, 0x52, - 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x72, - 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x09, - 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x2b, 0x0a, 0x15, 0x46, 0x69, 0x6e, - 0x64, 0x4d, 0x65, 0x72, 0x67, 0x65, 0x42, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x62, 0x61, 0x73, 0x65, 0x22, 0x8e, 0x01, 0x0a, 0x11, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x46, 0x6f, 0x72, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0a, - 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x12, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, - 0x74, 0x6f, 0x72, 0x79, 0x42, 0x04, 0x98, 0xc6, 0x2c, 0x01, 0x52, 0x0a, 0x72, 0x65, 0x70, 0x6f, - 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x3f, 0x0a, 0x11, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x5f, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x73, - 0x69, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x10, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x70, - 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x22, 0x14, 0x0a, 0x12, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x46, 0x6f, 0x72, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x72, 0x0a, - 0x19, 0x49, 0x73, 0x53, 0x71, 0x75, 0x61, 0x73, 0x68, 0x49, 0x6e, 0x50, 0x72, 0x6f, 0x67, 0x72, - 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0a, 0x72, 0x65, + 0x52, 0x10, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, + 0x72, 0x79, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x62, 0x72, 0x61, + 0x6e, 0x63, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x5f, 0x72, 0x65, 0x66, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x74, 0x61, 0x72, + 0x67, 0x65, 0x74, 0x52, 0x65, 0x66, 0x22, 0x33, 0x0a, 0x19, 0x46, 0x65, 0x74, 0x63, 0x68, 0x53, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x47, 0x0a, 0x0b, 0x46, + 0x73, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x42, 0x04, 0x98, 0xc6, 0x2c, 0x01, 0x52, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, - 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1b, 0x0a, 0x09, 0x73, 0x71, 0x75, 0x61, 0x73, 0x68, 0x5f, 0x69, - 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x71, 0x75, 0x61, 0x73, 0x68, 0x49, - 0x64, 0x22, 0x3d, 0x0a, 0x1a, 0x49, 0x73, 0x53, 0x71, 0x75, 0x61, 0x73, 0x68, 0x49, 0x6e, 0x50, - 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x1f, 0x0a, 0x0b, 0x69, 0x6e, 0x5f, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x69, 0x6e, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, - 0x22, 0x6c, 0x0a, 0x1e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, - 0x74, 0x6f, 0x72, 0x79, 0x46, 0x72, 0x6f, 0x6d, 0x55, 0x52, 0x4c, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x74, 0x6f, 0x72, 0x79, 0x22, 0x24, 0x0a, 0x0c, 0x46, 0x73, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0c, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xb8, 0x01, 0x0a, 0x0f, 0x57, + 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, + 0x0a, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x52, 0x65, 0x70, 0x6f, + 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x42, 0x04, 0x98, 0xc6, 0x2c, 0x01, 0x52, 0x0a, 0x72, 0x65, + 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x72, 0x65, 0x66, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x72, 0x65, 0x66, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x72, 0x65, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x0a, 0x0c, 0x6f, 0x6c, 0x64, 0x5f, 0x72, 0x65, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x6f, 0x6c, + 0x64, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, + 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x4a, + 0x04, 0x08, 0x06, 0x10, 0x07, 0x22, 0x18, 0x0a, 0x10, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, + 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4a, 0x04, 0x08, 0x01, 0x10, 0x02, 0x22, + 0x6e, 0x0a, 0x14, 0x46, 0x69, 0x6e, 0x64, 0x4d, 0x65, 0x72, 0x67, 0x65, 0x42, 0x61, 0x73, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, + 0x69, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x69, + 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x42, + 0x04, 0x98, 0xc6, 0x2c, 0x01, 0x52, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, + 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, + 0x20, 0x03, 0x28, 0x0c, 0x52, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, + 0x2b, 0x0a, 0x15, 0x46, 0x69, 0x6e, 0x64, 0x4d, 0x65, 0x72, 0x67, 0x65, 0x42, 0x61, 0x73, 0x65, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x62, 0x61, 0x73, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x62, 0x61, 0x73, 0x65, 0x22, 0x8e, 0x01, 0x0a, + 0x11, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x46, 0x6f, 0x72, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x42, 0x04, 0x98, 0xc6, 0x2c, 0x01, - 0x52, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, - 0x75, 0x72, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x22, 0x21, - 0x0a, 0x1f, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, - 0x72, 0x79, 0x46, 0x72, 0x6f, 0x6d, 0x55, 0x52, 0x4c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x4f, 0x0a, 0x13, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x75, 0x6e, 0x64, 0x6c, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0a, 0x72, 0x65, 0x70, 0x6f, - 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, - 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, - 0x42, 0x04, 0x98, 0xc6, 0x2c, 0x01, 0x52, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, - 0x72, 0x79, 0x22, 0x2a, 0x0a, 0x14, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x75, 0x6e, 0x64, - 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, - 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x76, - 0x0a, 0x1e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x46, 0x72, - 0x6f, 0x6d, 0x52, 0x65, 0x66, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x52, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x3f, 0x0a, 0x11, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, + 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, + 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x10, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x22, 0x14, 0x0a, + 0x12, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x46, 0x6f, 0x72, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x72, 0x0a, 0x19, 0x49, 0x73, 0x53, 0x71, 0x75, 0x61, 0x73, 0x68, 0x49, + 0x6e, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x42, 0x04, 0x98, 0xc6, 0x2c, 0x01, 0x52, 0x0a, - 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, - 0x74, 0x74, 0x65, 0x72, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x08, 0x70, 0x61, - 0x74, 0x74, 0x65, 0x72, 0x6e, 0x73, 0x22, 0x35, 0x0a, 0x1f, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x46, 0x72, 0x6f, 0x6d, 0x52, 0x65, 0x66, 0x4c, 0x69, 0x73, - 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, - 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x4c, 0x0a, - 0x10, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x38, 0x0a, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x52, - 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x42, 0x04, 0x98, 0xc6, 0x2c, 0x01, 0x52, - 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x22, 0x27, 0x0a, 0x11, 0x47, - 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1b, 0x0a, 0x09, 0x73, 0x71, + 0x75, 0x61, 0x73, 0x68, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, + 0x71, 0x75, 0x61, 0x73, 0x68, 0x49, 0x64, 0x22, 0x3d, 0x0a, 0x1a, 0x49, 0x73, 0x53, 0x71, 0x75, + 0x61, 0x73, 0x68, 0x49, 0x6e, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x69, 0x6e, 0x5f, 0x70, 0x72, 0x6f, 0x67, + 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x69, 0x6e, 0x50, 0x72, + 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x22, 0x6c, 0x0a, 0x1e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x46, 0x72, 0x6f, 0x6d, 0x55, 0x52, + 0x4c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0a, 0x72, 0x65, 0x70, 0x6f, + 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, + 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, + 0x42, 0x04, 0x98, 0xc6, 0x2c, 0x01, 0x52, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, + 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x75, 0x72, 0x6c, 0x22, 0x21, 0x0a, 0x1f, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, + 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x46, 0x72, 0x6f, 0x6d, 0x55, 0x52, 0x4c, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4f, 0x0a, 0x13, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, + 0x0a, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x52, 0x65, 0x70, 0x6f, + 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x42, 0x04, 0x98, 0xc6, 0x2c, 0x01, 0x52, 0x0a, 0x72, 0x65, + 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x22, 0x2a, 0x0a, 0x14, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, - 0x64, 0x61, 0x74, 0x61, 0x22, 0x8e, 0x02, 0x0a, 0x10, 0x53, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0a, 0x72, 0x65, 0x70, - 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, - 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, - 0x79, 0x42, 0x04, 0x98, 0xc6, 0x2c, 0x01, 0x52, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, - 0x6f, 0x72, 0x79, 0x12, 0x38, 0x0a, 0x07, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x02, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x53, 0x65, - 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x1a, 0x85, 0x01, - 0x0a, 0x05, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x1d, 0x0a, 0x09, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x5f, 0x73, 0x74, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x08, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x53, 0x74, 0x72, 0x12, 0x21, 0x0a, 0x0b, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x5f, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x48, 0x00, 0x52, - 0x0a, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x12, 0x1f, 0x0a, 0x0a, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x5f, 0x62, 0x6f, 0x6f, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x48, - 0x00, 0x52, 0x09, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x6f, 0x6f, 0x6c, 0x42, 0x07, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x13, 0x0a, 0x11, 0x53, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x63, 0x0a, 0x13, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x38, 0x0a, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x52, - 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x42, 0x04, 0x98, 0xc6, 0x2c, 0x01, 0x52, - 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x6b, - 0x65, 0x79, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x65, 0x79, 0x73, 0x22, - 0x16, 0x0a, 0x14, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x69, 0x0a, 0x19, 0x52, 0x65, 0x73, 0x74, 0x6f, - 0x72, 0x65, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x48, 0x6f, 0x6f, 0x6b, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, - 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, - 0x79, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x42, 0x04, 0x98, 0xc6, - 0x2c, 0x01, 0x52, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x12, - 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, - 0x74, 0x61, 0x22, 0x1c, 0x0a, 0x1a, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x43, 0x75, 0x73, - 0x74, 0x6f, 0x6d, 0x48, 0x6f, 0x6f, 0x6b, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x54, 0x0a, 0x18, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, - 0x48, 0x6f, 0x6f, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0a, - 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x12, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, - 0x74, 0x6f, 0x72, 0x79, 0x42, 0x04, 0x98, 0xc6, 0x2c, 0x01, 0x52, 0x0a, 0x72, 0x65, 0x70, 0x6f, - 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x22, 0x2f, 0x0a, 0x19, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, - 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x48, 0x6f, 0x6f, 0x6b, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x71, 0x0a, 0x21, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x46, 0x72, 0x6f, 0x6d, 0x42, - 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0a, - 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x12, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, - 0x74, 0x6f, 0x72, 0x79, 0x42, 0x04, 0x98, 0xc6, 0x2c, 0x01, 0x52, 0x0a, 0x72, 0x65, 0x70, 0x6f, - 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x24, 0x0a, 0x22, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x46, 0x72, - 0x6f, 0x6d, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x4e, 0x0a, 0x12, 0x46, 0x69, 0x6e, 0x64, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x52, + 0x64, 0x61, 0x74, 0x61, 0x22, 0x76, 0x0a, 0x1e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x75, + 0x6e, 0x64, 0x6c, 0x65, 0x46, 0x72, 0x6f, 0x6d, 0x52, 0x65, 0x66, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x42, 0x04, 0x98, 0xc6, 0x2c, 0x01, 0x52, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, - 0x22, 0x43, 0x0a, 0x13, 0x46, 0x69, 0x6e, 0x64, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2c, 0x0a, 0x12, 0x6c, 0x69, 0x63, 0x65, 0x6e, - 0x73, 0x65, 0x5f, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x10, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x53, 0x68, 0x6f, 0x72, - 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x54, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, - 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x38, 0x0a, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x52, - 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x42, 0x04, 0x98, 0xc6, 0x2c, 0x01, 0x52, - 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x22, 0x3b, 0x0a, 0x19, 0x47, - 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x61, 0x74, 0x74, 0x72, - 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x61, 0x74, - 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x22, 0x54, 0x0a, 0x18, 0x43, 0x61, 0x6c, 0x63, - 0x75, 0x6c, 0x61, 0x74, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, - 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, - 0x79, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x42, 0x04, 0x98, 0xc6, - 0x2c, 0x01, 0x52, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x22, 0x37, - 0x0a, 0x19, 0x43, 0x61, 0x6c, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, - 0x73, 0x75, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x63, - 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, - 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x22, 0x4e, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x53, 0x6e, - 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, - 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x73, - 0x69, 0x74, 0x6f, 0x72, 0x79, 0x42, 0x04, 0x98, 0xc6, 0x2c, 0x01, 0x52, 0x0a, 0x72, 0x65, 0x70, - 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x22, 0x29, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x53, 0x6e, - 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, - 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, - 0x74, 0x61, 0x22, 0x97, 0x01, 0x0a, 0x23, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x70, - 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x46, 0x72, 0x6f, 0x6d, 0x53, 0x6e, 0x61, 0x70, 0x73, - 0x68, 0x6f, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0a, 0x72, 0x65, - 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, - 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, - 0x72, 0x79, 0x42, 0x04, 0x98, 0xc6, 0x2c, 0x01, 0x52, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, - 0x74, 0x6f, 0x72, 0x79, 0x12, 0x19, 0x0a, 0x08, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x75, 0x72, 0x6c, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x68, 0x74, 0x74, 0x70, 0x55, 0x72, 0x6c, 0x12, - 0x1b, 0x0a, 0x09, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x61, 0x75, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x68, 0x74, 0x74, 0x70, 0x41, 0x75, 0x74, 0x68, 0x22, 0x26, 0x0a, 0x24, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, - 0x46, 0x72, 0x6f, 0x6d, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x96, 0x01, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x52, 0x61, 0x77, 0x43, - 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, - 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x73, - 0x69, 0x74, 0x6f, 0x72, 0x79, 0x42, 0x04, 0x98, 0xc6, 0x2c, 0x01, 0x52, 0x0a, 0x72, 0x65, 0x70, - 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x23, 0x0a, 0x0d, 0x66, 0x72, 0x6f, 0x6d, 0x5f, - 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, - 0x66, 0x72, 0x6f, 0x6d, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x0a, 0x0b, - 0x74, 0x6f, 0x5f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0a, 0x74, 0x6f, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xbd, 0x04, - 0x0a, 0x15, 0x47, 0x65, 0x74, 0x52, 0x61, 0x77, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x48, 0x0a, 0x0b, 0x72, 0x61, 0x77, 0x5f, 0x63, - 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x67, - 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x61, 0x77, 0x43, 0x68, 0x61, 0x6e, - 0x67, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x52, 0x61, 0x77, 0x43, - 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x0a, 0x72, 0x61, 0x77, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, - 0x73, 0x1a, 0xd9, 0x03, 0x0a, 0x09, 0x52, 0x61, 0x77, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x12, - 0x17, 0x0a, 0x07, 0x62, 0x6c, 0x6f, 0x62, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x62, 0x6c, 0x6f, 0x62, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x1d, 0x0a, 0x08, - 0x6e, 0x65, 0x77, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, - 0x18, 0x01, 0x52, 0x07, 0x6e, 0x65, 0x77, 0x50, 0x61, 0x74, 0x68, 0x12, 0x1d, 0x0a, 0x08, 0x6f, - 0x6c, 0x64, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, - 0x01, 0x52, 0x07, 0x6f, 0x6c, 0x64, 0x50, 0x61, 0x74, 0x68, 0x12, 0x4f, 0x0a, 0x09, 0x6f, 0x70, - 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x31, 0x2e, - 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x61, 0x77, 0x43, 0x68, 0x61, - 0x6e, 0x67, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x52, 0x61, 0x77, - 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x2e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x09, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x23, 0x0a, 0x0d, 0x72, - 0x61, 0x77, 0x5f, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0c, 0x72, 0x61, 0x77, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x12, 0x19, 0x0a, 0x08, 0x6f, 0x6c, 0x64, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x07, 0x6f, 0x6c, 0x64, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x6e, - 0x65, 0x77, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x6e, - 0x65, 0x77, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x24, 0x0a, 0x0e, 0x6e, 0x65, 0x77, 0x5f, 0x70, 0x61, - 0x74, 0x68, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, - 0x6e, 0x65, 0x77, 0x50, 0x61, 0x74, 0x68, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x24, 0x0a, 0x0e, - 0x6f, 0x6c, 0x64, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x0a, - 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x6f, 0x6c, 0x64, 0x50, 0x61, 0x74, 0x68, 0x42, 0x79, 0x74, - 0x65, 0x73, 0x22, 0x69, 0x0a, 0x09, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, - 0x41, 0x44, 0x44, 0x45, 0x44, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x43, 0x4f, 0x50, 0x49, 0x45, - 0x44, 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, 0x44, 0x10, 0x03, - 0x12, 0x0c, 0x0a, 0x08, 0x4d, 0x4f, 0x44, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x04, 0x12, 0x0b, - 0x0a, 0x07, 0x52, 0x45, 0x4e, 0x41, 0x4d, 0x45, 0x44, 0x10, 0x05, 0x12, 0x10, 0x0a, 0x0c, 0x54, - 0x59, 0x50, 0x45, 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x44, 0x10, 0x06, 0x22, 0x94, 0x01, - 0x0a, 0x18, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x42, 0x79, 0x4e, - 0x61, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0a, 0x72, 0x65, - 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, - 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, - 0x72, 0x79, 0x42, 0x04, 0x98, 0xc6, 0x2c, 0x01, 0x52, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, - 0x74, 0x6f, 0x72, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x72, 0x65, - 0x66, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x72, 0x65, 0x66, 0x12, 0x16, 0x0a, 0x06, - 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x66, 0x69, - 0x6c, 0x74, 0x65, 0x72, 0x22, 0x31, 0x0a, 0x19, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x46, 0x69, - 0x6c, 0x65, 0x73, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0c, - 0x52, 0x05, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x22, 0xaa, 0x01, 0x0a, 0x1b, 0x53, 0x65, 0x61, 0x72, - 0x63, 0x68, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x42, 0x79, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, + 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x0c, 0x52, 0x08, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x73, 0x22, 0x35, 0x0a, 0x1f, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x46, 0x72, 0x6f, 0x6d, + 0x52, 0x65, 0x66, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, + 0x61, 0x74, 0x61, 0x22, 0x4c, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x42, 0x04, 0x98, 0xc6, 0x2c, 0x01, 0x52, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, - 0x79, 0x12, 0x14, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x72, 0x65, 0x66, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x72, 0x65, 0x66, 0x12, 0x29, 0x0a, 0x10, 0x63, 0x68, 0x75, - 0x6e, 0x6b, 0x65, 0x64, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x0f, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x79, 0x0a, 0x1c, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x46, 0x69, - 0x6c, 0x65, 0x73, 0x42, 0x79, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x07, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x12, 0x1d, - 0x0a, 0x0a, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0c, 0x52, 0x09, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x44, 0x61, 0x74, 0x61, 0x12, 0x20, 0x0a, - 0x0c, 0x65, 0x6e, 0x64, 0x5f, 0x6f, 0x66, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x0a, 0x65, 0x6e, 0x64, 0x4f, 0x66, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x22, - 0x89, 0x01, 0x0a, 0x06, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, - 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x12, 0x3a, 0x0a, 0x19, - 0x68, 0x74, 0x74, 0x70, 0x5f, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x17, 0x68, 0x74, 0x74, 0x70, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x25, 0x0a, 0x0e, 0x6d, 0x69, 0x72, 0x72, - 0x6f, 0x72, 0x5f, 0x72, 0x65, 0x66, 0x6d, 0x61, 0x70, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x0d, 0x6d, 0x69, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x65, 0x66, 0x6d, 0x61, 0x70, 0x73, 0x4a, - 0x04, 0x08, 0x02, 0x10, 0x03, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x59, 0x0a, 0x1d, 0x47, - 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, - 0x79, 0x53, 0x69, 0x7a, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0a, + 0x79, 0x22, 0x27, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x8e, 0x02, 0x0a, 0x10, 0x53, + 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x38, 0x0a, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x52, 0x65, 0x70, + 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x42, 0x04, 0x98, 0xc6, 0x2c, 0x01, 0x52, 0x0a, 0x72, + 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x38, 0x0a, 0x07, 0x65, 0x6e, 0x74, + 0x72, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x67, 0x69, 0x74, + 0x61, 0x6c, 0x79, 0x2e, 0x53, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x65, 0x6e, 0x74, 0x72, + 0x69, 0x65, 0x73, 0x1a, 0x85, 0x01, 0x0a, 0x05, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, + 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, + 0x1d, 0x0a, 0x09, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, 0x73, 0x74, 0x72, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x48, 0x00, 0x52, 0x08, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x53, 0x74, 0x72, 0x12, 0x21, + 0x0a, 0x0b, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x05, 0x48, 0x00, 0x52, 0x0a, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x49, 0x6e, 0x74, 0x33, + 0x32, 0x12, 0x1f, 0x0a, 0x0a, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, 0x62, 0x6f, 0x6f, 0x6c, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x09, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x6f, + 0x6f, 0x6c, 0x42, 0x07, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x13, 0x0a, 0x11, 0x53, + 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x63, 0x0a, 0x13, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, + 0x69, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x69, + 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x42, + 0x04, 0x98, 0xc6, 0x2c, 0x01, 0x52, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, + 0x79, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x04, 0x6b, 0x65, 0x79, 0x73, 0x22, 0x16, 0x0a, 0x14, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x69, 0x0a, + 0x19, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x48, 0x6f, + 0x6f, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0a, 0x72, 0x65, + 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, + 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, + 0x72, 0x79, 0x42, 0x04, 0x98, 0xc6, 0x2c, 0x01, 0x52, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, + 0x74, 0x6f, 0x72, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x1c, 0x0a, 0x1a, 0x52, 0x65, 0x73, 0x74, + 0x6f, 0x72, 0x65, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x48, 0x6f, 0x6f, 0x6b, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x54, 0x0a, 0x18, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, + 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x48, 0x6f, 0x6f, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, + 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x42, 0x04, 0x98, 0xc6, 0x2c, 0x01, + 0x52, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x22, 0x2f, 0x0a, 0x19, + 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x48, 0x6f, 0x6f, 0x6b, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, + 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x71, 0x0a, + 0x21, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, + 0x79, 0x46, 0x72, 0x6f, 0x6d, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, + 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x42, 0x04, 0x98, 0xc6, 0x2c, 0x01, + 0x52, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x12, 0x0a, 0x04, + 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, + 0x22, 0x24, 0x0a, 0x22, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, + 0x74, 0x6f, 0x72, 0x79, 0x46, 0x72, 0x6f, 0x6d, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4e, 0x0a, 0x12, 0x46, 0x69, 0x6e, 0x64, 0x4c, 0x69, + 0x63, 0x65, 0x6e, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x42, 0x04, 0x98, 0xc6, 0x2c, 0x01, 0x52, 0x0a, 0x72, 0x65, 0x70, 0x6f, - 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x22, 0x34, 0x0a, 0x1e, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, - 0x65, 0x63, 0x74, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x53, 0x69, 0x7a, 0x65, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x22, 0xa0, 0x01, 0x0a, - 0x14, 0x43, 0x6c, 0x6f, 0x6e, 0x65, 0x46, 0x72, 0x6f, 0x6d, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, - 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x69, 0x74, 0x61, - 0x6c, 0x79, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x42, 0x04, 0x98, - 0xc6, 0x2c, 0x01, 0x52, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x12, - 0x26, 0x0a, 0x04, 0x70, 0x6f, 0x6f, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, - 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x50, 0x6f, 0x6f, - 0x6c, 0x52, 0x04, 0x70, 0x6f, 0x6f, 0x6c, 0x12, 0x26, 0x0a, 0x06, 0x72, 0x65, 0x6d, 0x6f, 0x74, - 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, - 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x52, 0x06, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x22, - 0x17, 0x0a, 0x15, 0x43, 0x6c, 0x6f, 0x6e, 0x65, 0x46, 0x72, 0x6f, 0x6d, 0x50, 0x6f, 0x6f, 0x6c, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xc1, 0x01, 0x0a, 0x1c, 0x43, 0x6c, 0x6f, - 0x6e, 0x65, 0x46, 0x72, 0x6f, 0x6d, 0x50, 0x6f, 0x6f, 0x6c, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, - 0x61, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0a, 0x72, 0x65, 0x70, - 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, - 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, - 0x79, 0x42, 0x04, 0x98, 0xc6, 0x2c, 0x01, 0x52, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, - 0x6f, 0x72, 0x79, 0x12, 0x26, 0x0a, 0x04, 0x70, 0x6f, 0x6f, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, - 0x74, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x04, 0x70, 0x6f, 0x6f, 0x6c, 0x12, 0x3f, 0x0a, 0x11, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, - 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x10, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x22, 0x1f, 0x0a, 0x1d, - 0x43, 0x6c, 0x6f, 0x6e, 0x65, 0x46, 0x72, 0x6f, 0x6d, 0x50, 0x6f, 0x6f, 0x6c, 0x49, 0x6e, 0x74, - 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x53, 0x0a, - 0x17, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, - 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0a, 0x72, 0x65, 0x70, 0x6f, - 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, - 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, - 0x42, 0x04, 0x98, 0xc6, 0x2c, 0x01, 0x52, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, - 0x72, 0x79, 0x22, 0x1a, 0x0a, 0x18, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, - 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x78, - 0x0a, 0x17, 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, - 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0a, 0x72, 0x65, 0x70, - 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, - 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, - 0x79, 0x42, 0x04, 0x98, 0xc6, 0x2c, 0x01, 0x52, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, - 0x6f, 0x72, 0x79, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, - 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x6c, 0x61, - 0x74, 0x69, 0x76, 0x65, 0x50, 0x61, 0x74, 0x68, 0x22, 0x1a, 0x0a, 0x18, 0x52, 0x65, 0x6e, 0x61, - 0x6d, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x82, 0x01, 0x0a, 0x1a, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, - 0x74, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, + 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x22, 0x43, 0x0a, 0x13, 0x46, 0x69, 0x6e, 0x64, 0x4c, 0x69, + 0x63, 0x65, 0x6e, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2c, 0x0a, + 0x12, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x5f, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x6c, 0x69, 0x63, 0x65, 0x6e, + 0x73, 0x65, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x54, 0x0a, 0x18, 0x47, + 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, + 0x69, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x69, + 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x42, + 0x04, 0x98, 0xc6, 0x2c, 0x01, 0x52, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, + 0x79, 0x22, 0x3b, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x41, 0x74, 0x74, 0x72, + 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1e, + 0x0a, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x22, 0x54, + 0x0a, 0x18, 0x43, 0x61, 0x6c, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, + 0x73, 0x75, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0a, 0x72, 0x65, + 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, + 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, + 0x72, 0x79, 0x42, 0x04, 0x98, 0xc6, 0x2c, 0x01, 0x52, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, + 0x74, 0x6f, 0x72, 0x79, 0x22, 0x37, 0x0a, 0x19, 0x43, 0x61, 0x6c, 0x63, 0x75, 0x6c, 0x61, 0x74, + 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x22, 0x4e, 0x0a, + 0x12, 0x47, 0x65, 0x74, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x42, 0x04, 0x98, 0xc6, 0x2c, - 0x01, 0x52, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x2a, 0x0a, - 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, - 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, - 0x79, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x22, 0x1d, 0x0a, 0x1b, 0x52, 0x65, 0x70, - 0x6c, 0x69, 0x63, 0x61, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x55, 0x0a, 0x19, 0x4f, 0x70, 0x74, 0x69, - 0x6d, 0x69, 0x7a, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, - 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x69, 0x74, 0x61, - 0x6c, 0x79, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x42, 0x04, 0x98, - 0xc6, 0x2c, 0x01, 0x52, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x22, - 0x1c, 0x0a, 0x1a, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x73, - 0x69, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x62, 0x0a, - 0x12, 0x53, 0x65, 0x74, 0x46, 0x75, 0x6c, 0x6c, 0x50, 0x61, 0x74, 0x68, 0x52, 0x65, 0x71, 0x75, + 0x01, 0x52, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x22, 0x29, 0x0a, + 0x13, 0x47, 0x65, 0x74, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x97, 0x01, 0x0a, 0x23, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x46, 0x72, 0x6f, + 0x6d, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x38, 0x0a, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x52, 0x65, + 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x42, 0x04, 0x98, 0xc6, 0x2c, 0x01, 0x52, 0x0a, + 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x19, 0x0a, 0x08, 0x68, 0x74, + 0x74, 0x70, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x68, 0x74, + 0x74, 0x70, 0x55, 0x72, 0x6c, 0x12, 0x1b, 0x0a, 0x09, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x61, 0x75, + 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x74, 0x74, 0x70, 0x41, 0x75, + 0x74, 0x68, 0x22, 0x26, 0x0a, 0x24, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6f, + 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x46, 0x72, 0x6f, 0x6d, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, + 0x6f, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x96, 0x01, 0x0a, 0x14, 0x47, + 0x65, 0x74, 0x52, 0x61, 0x77, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x42, 0x04, 0x98, 0xc6, 0x2c, - 0x01, 0x52, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x12, 0x0a, - 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, - 0x68, 0x22, 0x15, 0x0a, 0x13, 0x53, 0x65, 0x74, 0x46, 0x75, 0x6c, 0x6c, 0x50, 0x61, 0x74, 0x68, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, 0x8a, 0x20, 0x0a, 0x11, 0x52, 0x65, 0x70, - 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x5d, - 0x0a, 0x10, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x45, 0x78, 0x69, 0x73, - 0x74, 0x73, 0x12, 0x1f, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x52, 0x65, 0x70, 0x6f, - 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x45, 0x78, 0x69, 0x73, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x52, 0x65, 0x70, - 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x45, 0x78, 0x69, 0x73, 0x74, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xfa, 0x97, 0x28, 0x02, 0x08, 0x02, 0x12, 0x60, 0x0a, - 0x11, 0x52, 0x65, 0x70, 0x61, 0x63, 0x6b, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, - 0x61, 0x6c, 0x12, 0x20, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x52, 0x65, 0x70, 0x61, - 0x63, 0x6b, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x52, 0x65, - 0x70, 0x61, 0x63, 0x6b, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xfa, 0x97, 0x28, 0x02, 0x08, 0x01, 0x12, - 0x4b, 0x0a, 0x0a, 0x52, 0x65, 0x70, 0x61, 0x63, 0x6b, 0x46, 0x75, 0x6c, 0x6c, 0x12, 0x19, 0x2e, - 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x52, 0x65, 0x70, 0x61, 0x63, 0x6b, 0x46, 0x75, 0x6c, - 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, - 0x79, 0x2e, 0x52, 0x65, 0x70, 0x61, 0x63, 0x6b, 0x46, 0x75, 0x6c, 0x6c, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xfa, 0x97, 0x28, 0x02, 0x08, 0x01, 0x12, 0x4b, 0x0a, 0x0a, - 0x4d, 0x69, 0x64, 0x78, 0x52, 0x65, 0x70, 0x61, 0x63, 0x6b, 0x12, 0x19, 0x2e, 0x67, 0x69, 0x74, - 0x61, 0x6c, 0x79, 0x2e, 0x4d, 0x69, 0x64, 0x78, 0x52, 0x65, 0x70, 0x61, 0x63, 0x6b, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x4d, - 0x69, 0x64, 0x78, 0x52, 0x65, 0x70, 0x61, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x06, 0xfa, 0x97, 0x28, 0x02, 0x08, 0x01, 0x12, 0x57, 0x0a, 0x0e, 0x47, 0x61, 0x72, - 0x62, 0x61, 0x67, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x12, 0x1d, 0x2e, 0x67, 0x69, - 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x47, 0x61, 0x72, 0x62, 0x61, 0x67, 0x65, 0x43, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x67, 0x69, 0x74, - 0x61, 0x6c, 0x79, 0x2e, 0x47, 0x61, 0x72, 0x62, 0x61, 0x67, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xfa, 0x97, 0x28, 0x02, - 0x08, 0x01, 0x12, 0x5d, 0x0a, 0x10, 0x57, 0x72, 0x69, 0x74, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, - 0x74, 0x47, 0x72, 0x61, 0x70, 0x68, 0x12, 0x1f, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, - 0x57, 0x72, 0x69, 0x74, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x47, 0x72, 0x61, 0x70, 0x68, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, - 0x2e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x47, 0x72, 0x61, 0x70, - 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xfa, 0x97, 0x28, 0x02, 0x08, - 0x01, 0x12, 0x57, 0x0a, 0x0e, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x53, - 0x69, 0x7a, 0x65, 0x12, 0x1d, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x52, 0x65, 0x70, - 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x53, 0x69, 0x7a, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x52, 0x65, 0x70, 0x6f, - 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x53, 0x69, 0x7a, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x06, 0xfa, 0x97, 0x28, 0x02, 0x08, 0x02, 0x12, 0x63, 0x0a, 0x12, 0x41, 0x70, - 0x70, 0x6c, 0x79, 0x47, 0x69, 0x74, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, - 0x12, 0x21, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x47, - 0x69, 0x74, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x41, 0x70, 0x70, - 0x6c, 0x79, 0x47, 0x69, 0x74, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xfa, 0x97, 0x28, 0x02, 0x08, 0x01, 0x12, - 0x4e, 0x0a, 0x0b, 0x46, 0x65, 0x74, 0x63, 0x68, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x12, 0x1a, - 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x46, 0x65, 0x74, 0x63, 0x68, 0x52, 0x65, 0x6d, - 0x6f, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x67, 0x69, 0x74, - 0x61, 0x6c, 0x79, 0x2e, 0x46, 0x65, 0x74, 0x63, 0x68, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x52, + 0x01, 0x52, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x23, 0x0a, + 0x0d, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x66, 0x72, 0x6f, 0x6d, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x6f, 0x5f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x74, 0x6f, 0x52, 0x65, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x22, 0xbd, 0x04, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x52, 0x61, 0x77, 0x43, 0x68, + 0x61, 0x6e, 0x67, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x48, 0x0a, + 0x0b, 0x72, 0x61, 0x77, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x52, + 0x61, 0x77, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x2e, 0x52, 0x61, 0x77, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x0a, 0x72, 0x61, 0x77, + 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x1a, 0xd9, 0x03, 0x0a, 0x09, 0x52, 0x61, 0x77, 0x43, + 0x68, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x17, 0x0a, 0x07, 0x62, 0x6c, 0x6f, 0x62, 0x5f, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x62, 0x6c, 0x6f, 0x62, 0x49, 0x64, 0x12, 0x12, + 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x73, 0x69, + 0x7a, 0x65, 0x12, 0x1d, 0x0a, 0x08, 0x6e, 0x65, 0x77, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x07, 0x6e, 0x65, 0x77, 0x50, 0x61, 0x74, + 0x68, 0x12, 0x1d, 0x0a, 0x08, 0x6f, 0x6c, 0x64, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x07, 0x6f, 0x6c, 0x64, 0x50, 0x61, 0x74, 0x68, + 0x12, 0x4f, 0x0a, 0x09, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x31, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x47, 0x65, 0x74, + 0x52, 0x61, 0x77, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x2e, 0x52, 0x61, 0x77, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x2e, 0x4f, 0x70, 0x65, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x61, 0x77, 0x5f, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x61, 0x77, 0x4f, 0x70, 0x65, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x19, 0x0a, 0x08, 0x6f, 0x6c, 0x64, 0x5f, 0x6d, 0x6f, + 0x64, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x6f, 0x6c, 0x64, 0x4d, 0x6f, 0x64, + 0x65, 0x12, 0x19, 0x0a, 0x08, 0x6e, 0x65, 0x77, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x08, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x07, 0x6e, 0x65, 0x77, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x24, 0x0a, 0x0e, + 0x6e, 0x65, 0x77, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x09, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x6e, 0x65, 0x77, 0x50, 0x61, 0x74, 0x68, 0x42, 0x79, 0x74, + 0x65, 0x73, 0x12, 0x24, 0x0a, 0x0e, 0x6f, 0x6c, 0x64, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x62, + 0x79, 0x74, 0x65, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x6f, 0x6c, 0x64, 0x50, + 0x61, 0x74, 0x68, 0x42, 0x79, 0x74, 0x65, 0x73, 0x22, 0x69, 0x0a, 0x09, 0x4f, 0x70, 0x65, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, + 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x41, 0x44, 0x44, 0x45, 0x44, 0x10, 0x01, 0x12, 0x0a, 0x0a, + 0x06, 0x43, 0x4f, 0x50, 0x49, 0x45, 0x44, 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x44, 0x45, 0x4c, + 0x45, 0x54, 0x45, 0x44, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x4d, 0x4f, 0x44, 0x49, 0x46, 0x49, + 0x45, 0x44, 0x10, 0x04, 0x12, 0x0b, 0x0a, 0x07, 0x52, 0x45, 0x4e, 0x41, 0x4d, 0x45, 0x44, 0x10, + 0x05, 0x12, 0x10, 0x0a, 0x0c, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, + 0x44, 0x10, 0x06, 0x22, 0x94, 0x01, 0x0a, 0x18, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x46, 0x69, + 0x6c, 0x65, 0x73, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x38, 0x0a, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x52, 0x65, + 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x42, 0x04, 0x98, 0xc6, 0x2c, 0x01, 0x52, 0x0a, + 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x71, 0x75, + 0x65, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, + 0x12, 0x10, 0x0a, 0x03, 0x72, 0x65, 0x66, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x72, + 0x65, 0x66, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x22, 0x31, 0x0a, 0x19, 0x53, 0x65, + 0x61, 0x72, 0x63, 0x68, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x69, 0x6c, 0x65, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x05, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x22, 0xaa, 0x01, + 0x0a, 0x1b, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x42, 0x79, 0x43, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, + 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x73, + 0x69, 0x74, 0x6f, 0x72, 0x79, 0x42, 0x04, 0x98, 0xc6, 0x2c, 0x01, 0x52, 0x0a, 0x72, 0x65, 0x70, + 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x10, 0x0a, + 0x03, 0x72, 0x65, 0x66, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x72, 0x65, 0x66, 0x12, + 0x29, 0x0a, 0x10, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x65, 0x64, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x63, 0x68, 0x75, 0x6e, 0x6b, + 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x79, 0x0a, 0x1c, 0x53, 0x65, + 0x61, 0x72, 0x63, 0x68, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x42, 0x79, 0x43, 0x6f, 0x6e, 0x74, 0x65, + 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x61, + 0x74, 0x63, 0x68, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x07, 0x6d, 0x61, 0x74, + 0x63, 0x68, 0x65, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x64, 0x61, + 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x44, + 0x61, 0x74, 0x61, 0x12, 0x20, 0x0a, 0x0c, 0x65, 0x6e, 0x64, 0x5f, 0x6f, 0x66, 0x5f, 0x6d, 0x61, + 0x74, 0x63, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x65, 0x6e, 0x64, 0x4f, 0x66, + 0x4d, 0x61, 0x74, 0x63, 0x68, 0x22, 0x89, 0x01, 0x0a, 0x06, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, + 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, + 0x72, 0x6c, 0x12, 0x3a, 0x0a, 0x19, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x61, 0x75, 0x74, 0x68, 0x6f, + 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x17, 0x68, 0x74, 0x74, 0x70, 0x41, 0x75, 0x74, 0x68, 0x6f, + 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x25, + 0x0a, 0x0e, 0x6d, 0x69, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x72, 0x65, 0x66, 0x6d, 0x61, 0x70, 0x73, + 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x6d, 0x69, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x65, + 0x66, 0x6d, 0x61, 0x70, 0x73, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x52, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x22, 0x59, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x44, 0x69, + 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x53, 0x69, 0x7a, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, + 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x42, 0x04, 0x98, 0xc6, 0x2c, 0x01, + 0x52, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x22, 0x34, 0x0a, 0x1e, + 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x79, 0x53, 0x69, 0x7a, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, + 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x73, 0x69, + 0x7a, 0x65, 0x22, 0xa0, 0x01, 0x0a, 0x14, 0x43, 0x6c, 0x6f, 0x6e, 0x65, 0x46, 0x72, 0x6f, 0x6d, + 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0a, 0x72, + 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x12, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, + 0x6f, 0x72, 0x79, 0x42, 0x04, 0x98, 0xc6, 0x2c, 0x01, 0x52, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, + 0x69, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x26, 0x0a, 0x04, 0x70, 0x6f, 0x6f, 0x6c, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x4f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x04, 0x70, 0x6f, 0x6f, 0x6c, 0x12, 0x26, 0x0a, + 0x06, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, + 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x52, 0x06, 0x72, + 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x22, 0x17, 0x0a, 0x15, 0x43, 0x6c, 0x6f, 0x6e, 0x65, 0x46, 0x72, + 0x6f, 0x6d, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xc1, + 0x01, 0x0a, 0x1c, 0x43, 0x6c, 0x6f, 0x6e, 0x65, 0x46, 0x72, 0x6f, 0x6d, 0x50, 0x6f, 0x6f, 0x6c, + 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x38, 0x0a, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x52, 0x65, 0x70, + 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x42, 0x04, 0x98, 0xc6, 0x2c, 0x01, 0x52, 0x0a, 0x72, + 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x26, 0x0a, 0x04, 0x70, 0x6f, 0x6f, + 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, + 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x04, 0x70, 0x6f, 0x6f, + 0x6c, 0x12, 0x3f, 0x0a, 0x11, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x72, 0x65, 0x70, 0x6f, + 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, + 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, + 0x52, 0x10, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, + 0x72, 0x79, 0x22, 0x1f, 0x0a, 0x1d, 0x43, 0x6c, 0x6f, 0x6e, 0x65, 0x46, 0x72, 0x6f, 0x6d, 0x50, + 0x6f, 0x6f, 0x6c, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x53, 0x0a, 0x17, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, + 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, + 0x0a, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x52, 0x65, 0x70, 0x6f, + 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x42, 0x04, 0x98, 0xc6, 0x2c, 0x01, 0x52, 0x0a, 0x72, 0x65, + 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x22, 0x1a, 0x0a, 0x18, 0x52, 0x65, 0x6d, 0x6f, + 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x78, 0x0a, 0x17, 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x52, 0x65, + 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x38, 0x0a, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x52, 0x65, 0x70, + 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x42, 0x04, 0x98, 0xc6, 0x2c, 0x01, 0x52, 0x0a, 0x72, + 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x6c, + 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0c, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x50, 0x61, 0x74, 0x68, 0x22, 0x1a, + 0x0a, 0x18, 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, + 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x82, 0x01, 0x0a, 0x1a, 0x52, + 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, + 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0a, 0x72, 0x65, 0x70, + 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, + 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, + 0x79, 0x42, 0x04, 0x98, 0xc6, 0x2c, 0x01, 0x52, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, + 0x6f, 0x72, 0x79, 0x12, 0x2a, 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x52, 0x65, 0x70, + 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x22, + 0x1d, 0x0a, 0x1b, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6f, + 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x55, + 0x0a, 0x19, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, + 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0a, 0x72, + 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x12, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, + 0x6f, 0x72, 0x79, 0x42, 0x04, 0x98, 0xc6, 0x2c, 0x01, 0x52, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, + 0x69, 0x74, 0x6f, 0x72, 0x79, 0x22, 0x1c, 0x0a, 0x1a, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, + 0x65, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x62, 0x0a, 0x12, 0x53, 0x65, 0x74, 0x46, 0x75, 0x6c, 0x6c, 0x50, 0x61, + 0x74, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0a, 0x72, 0x65, 0x70, + 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, + 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, + 0x79, 0x42, 0x04, 0x98, 0xc6, 0x2c, 0x01, 0x52, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, + 0x6f, 0x72, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x22, 0x15, 0x0a, 0x13, 0x53, 0x65, 0x74, 0x46, 0x75, + 0x6c, 0x6c, 0x50, 0x61, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, 0x93, + 0x20, 0x0a, 0x11, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x12, 0x5d, 0x0a, 0x10, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, + 0x72, 0x79, 0x45, 0x78, 0x69, 0x73, 0x74, 0x73, 0x12, 0x1f, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, + 0x79, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x45, 0x78, 0x69, 0x73, + 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x67, 0x69, 0x74, 0x61, + 0x6c, 0x79, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x45, 0x78, 0x69, + 0x73, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xfa, 0x97, 0x28, + 0x02, 0x08, 0x02, 0x12, 0x60, 0x0a, 0x11, 0x52, 0x65, 0x70, 0x61, 0x63, 0x6b, 0x49, 0x6e, 0x63, + 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x12, 0x20, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, + 0x79, 0x2e, 0x52, 0x65, 0x70, 0x61, 0x63, 0x6b, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0x61, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x67, 0x69, 0x74, + 0x61, 0x6c, 0x79, 0x2e, 0x52, 0x65, 0x70, 0x61, 0x63, 0x6b, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, + 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xfa, + 0x97, 0x28, 0x02, 0x08, 0x01, 0x12, 0x4b, 0x0a, 0x0a, 0x52, 0x65, 0x70, 0x61, 0x63, 0x6b, 0x46, + 0x75, 0x6c, 0x6c, 0x12, 0x19, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x52, 0x65, 0x70, + 0x61, 0x63, 0x6b, 0x46, 0x75, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, + 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x52, 0x65, 0x70, 0x61, 0x63, 0x6b, 0x46, 0x75, + 0x6c, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xfa, 0x97, 0x28, 0x02, + 0x08, 0x01, 0x12, 0x4b, 0x0a, 0x0a, 0x4d, 0x69, 0x64, 0x78, 0x52, 0x65, 0x70, 0x61, 0x63, 0x6b, + 0x12, 0x19, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x4d, 0x69, 0x64, 0x78, 0x52, 0x65, + 0x70, 0x61, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x67, 0x69, + 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x4d, 0x69, 0x64, 0x78, 0x52, 0x65, 0x70, 0x61, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xfa, 0x97, 0x28, 0x02, 0x08, 0x01, 0x12, - 0x5d, 0x0a, 0x10, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, - 0x6f, 0x72, 0x79, 0x12, 0x1f, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xfa, 0x97, 0x28, 0x02, 0x08, 0x01, 0x12, 0x4d, - 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x12, 0x19, 0x2e, 0x67, - 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, - 0x2e, 0x47, 0x65, 0x74, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x06, 0xfa, 0x97, 0x28, 0x02, 0x08, 0x02, 0x30, 0x01, 0x12, 0x5d, 0x0a, - 0x10, 0x48, 0x61, 0x73, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, - 0x73, 0x12, 0x1f, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x48, 0x61, 0x73, 0x4c, 0x6f, - 0x63, 0x61, 0x6c, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x48, 0x61, 0x73, 0x4c, - 0x6f, 0x63, 0x61, 0x6c, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xfa, 0x97, 0x28, 0x02, 0x08, 0x02, 0x12, 0x60, 0x0a, 0x11, - 0x46, 0x65, 0x74, 0x63, 0x68, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x42, 0x72, 0x61, 0x6e, 0x63, - 0x68, 0x12, 0x20, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x46, 0x65, 0x74, 0x63, 0x68, - 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x46, 0x65, 0x74, - 0x63, 0x68, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xfa, 0x97, 0x28, 0x02, 0x08, 0x01, 0x12, 0x39, - 0x0a, 0x04, 0x46, 0x73, 0x63, 0x6b, 0x12, 0x13, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, - 0x46, 0x73, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x67, 0x69, - 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x46, 0x73, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x06, 0xfa, 0x97, 0x28, 0x02, 0x08, 0x02, 0x12, 0x45, 0x0a, 0x08, 0x57, 0x72, 0x69, - 0x74, 0x65, 0x52, 0x65, 0x66, 0x12, 0x17, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x57, - 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, - 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x66, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xfa, 0x97, 0x28, 0x02, 0x08, 0x01, - 0x12, 0x54, 0x0a, 0x0d, 0x46, 0x69, 0x6e, 0x64, 0x4d, 0x65, 0x72, 0x67, 0x65, 0x42, 0x61, 0x73, - 0x65, 0x12, 0x1c, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x4d, - 0x65, 0x72, 0x67, 0x65, 0x42, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x1d, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x4d, 0x65, 0x72, - 0x67, 0x65, 0x42, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, - 0xfa, 0x97, 0x28, 0x02, 0x08, 0x02, 0x12, 0x4b, 0x0a, 0x0a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x46, 0x6f, 0x72, 0x6b, 0x12, 0x19, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x46, 0x6f, 0x72, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x1a, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x46, - 0x6f, 0x72, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xfa, 0x97, 0x28, - 0x02, 0x08, 0x01, 0x12, 0x63, 0x0a, 0x12, 0x49, 0x73, 0x53, 0x71, 0x75, 0x61, 0x73, 0x68, 0x49, - 0x6e, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x12, 0x21, 0x2e, 0x67, 0x69, 0x74, 0x61, - 0x6c, 0x79, 0x2e, 0x49, 0x73, 0x53, 0x71, 0x75, 0x61, 0x73, 0x68, 0x49, 0x6e, 0x50, 0x72, 0x6f, - 0x67, 0x72, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x67, - 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x49, 0x73, 0x53, 0x71, 0x75, 0x61, 0x73, 0x68, 0x49, 0x6e, - 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x06, 0xfa, 0x97, 0x28, 0x02, 0x08, 0x02, 0x12, 0x72, 0x0a, 0x17, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x46, 0x72, 0x6f, 0x6d, - 0x55, 0x52, 0x4c, 0x12, 0x26, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x46, 0x72, 0x6f, - 0x6d, 0x55, 0x52, 0x4c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x67, 0x69, - 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x73, - 0x69, 0x74, 0x6f, 0x72, 0x79, 0x46, 0x72, 0x6f, 0x6d, 0x55, 0x52, 0x4c, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xfa, 0x97, 0x28, 0x02, 0x08, 0x01, 0x12, 0x53, 0x0a, 0x0c, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x12, 0x1b, 0x2e, 0x67, - 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x75, 0x6e, 0x64, - 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x67, 0x69, 0x74, 0x61, - 0x6c, 0x79, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xfa, 0x97, 0x28, 0x02, 0x08, 0x02, 0x30, - 0x01, 0x12, 0x76, 0x0a, 0x17, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x75, 0x6e, 0x64, 0x6c, - 0x65, 0x46, 0x72, 0x6f, 0x6d, 0x52, 0x65, 0x66, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x26, 0x2e, 0x67, - 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x75, 0x6e, 0x64, - 0x6c, 0x65, 0x46, 0x72, 0x6f, 0x6d, 0x52, 0x65, 0x66, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, + 0x57, 0x0a, 0x0e, 0x47, 0x61, 0x72, 0x62, 0x61, 0x67, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x12, 0x1d, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x47, 0x61, 0x72, 0x62, 0x61, + 0x67, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x1e, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x47, 0x61, 0x72, 0x62, 0x61, 0x67, + 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x06, 0xfa, 0x97, 0x28, 0x02, 0x08, 0x01, 0x12, 0x5d, 0x0a, 0x10, 0x57, 0x72, 0x69, 0x74, + 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x47, 0x72, 0x61, 0x70, 0x68, 0x12, 0x1f, 0x2e, 0x67, + 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, + 0x74, 0x47, 0x72, 0x61, 0x70, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, + 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x43, 0x6f, 0x6d, 0x6d, + 0x69, 0x74, 0x47, 0x72, 0x61, 0x70, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x06, 0xfa, 0x97, 0x28, 0x02, 0x08, 0x01, 0x12, 0x57, 0x0a, 0x0e, 0x52, 0x65, 0x70, 0x6f, 0x73, + 0x69, 0x74, 0x6f, 0x72, 0x79, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1d, 0x2e, 0x67, 0x69, 0x74, 0x61, + 0x6c, 0x79, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x53, 0x69, 0x7a, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, + 0x79, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x53, 0x69, 0x7a, 0x65, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xfa, 0x97, 0x28, 0x02, 0x08, 0x02, + 0x12, 0x63, 0x0a, 0x12, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x47, 0x69, 0x74, 0x61, 0x74, 0x74, 0x72, + 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x12, 0x21, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, + 0x41, 0x70, 0x70, 0x6c, 0x79, 0x47, 0x69, 0x74, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, + 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x67, 0x69, 0x74, 0x61, + 0x6c, 0x79, 0x2e, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x47, 0x69, 0x74, 0x61, 0x74, 0x74, 0x72, 0x69, + 0x62, 0x75, 0x74, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xfa, + 0x97, 0x28, 0x02, 0x08, 0x01, 0x12, 0x4e, 0x0a, 0x0b, 0x46, 0x65, 0x74, 0x63, 0x68, 0x52, 0x65, + 0x6d, 0x6f, 0x74, 0x65, 0x12, 0x1a, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x46, 0x65, + 0x74, 0x63, 0x68, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x1b, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x46, 0x65, 0x74, 0x63, 0x68, 0x52, + 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xfa, + 0x97, 0x28, 0x02, 0x08, 0x01, 0x12, 0x5d, 0x0a, 0x10, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, + 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1f, 0x2e, 0x67, 0x69, 0x74, 0x61, + 0x6c, 0x79, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, + 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x67, 0x69, 0x74, + 0x61, 0x6c, 0x79, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, + 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xfa, 0x97, + 0x28, 0x02, 0x08, 0x01, 0x12, 0x4d, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x41, 0x72, 0x63, 0x68, 0x69, + 0x76, 0x65, 0x12, 0x19, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x41, + 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, + 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, + 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xfa, 0x97, 0x28, 0x02, 0x08, + 0x02, 0x30, 0x01, 0x12, 0x5d, 0x0a, 0x10, 0x48, 0x61, 0x73, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x42, + 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x12, 0x1f, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, + 0x2e, 0x48, 0x61, 0x73, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, + 0x79, 0x2e, 0x48, 0x61, 0x73, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, + 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xfa, 0x97, 0x28, 0x02, + 0x08, 0x02, 0x12, 0x60, 0x0a, 0x11, 0x46, 0x65, 0x74, 0x63, 0x68, 0x53, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x12, 0x20, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, + 0x2e, 0x46, 0x65, 0x74, 0x63, 0x68, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x42, 0x72, 0x61, 0x6e, + 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x67, 0x69, 0x74, 0x61, + 0x6c, 0x79, 0x2e, 0x46, 0x65, 0x74, 0x63, 0x68, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x42, 0x72, + 0x61, 0x6e, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xfa, 0x97, + 0x28, 0x02, 0x08, 0x01, 0x12, 0x39, 0x0a, 0x04, 0x46, 0x73, 0x63, 0x6b, 0x12, 0x13, 0x2e, 0x67, + 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x46, 0x73, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x14, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x46, 0x73, 0x63, 0x6b, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xfa, 0x97, 0x28, 0x02, 0x08, 0x02, 0x12, + 0x45, 0x0a, 0x08, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x66, 0x12, 0x17, 0x2e, 0x67, 0x69, + 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x66, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x57, 0x72, + 0x69, 0x74, 0x65, 0x52, 0x65, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, + 0xfa, 0x97, 0x28, 0x02, 0x08, 0x01, 0x12, 0x54, 0x0a, 0x0d, 0x46, 0x69, 0x6e, 0x64, 0x4d, 0x65, + 0x72, 0x67, 0x65, 0x42, 0x61, 0x73, 0x65, 0x12, 0x1c, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, + 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x4d, 0x65, 0x72, 0x67, 0x65, 0x42, 0x61, 0x73, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x46, + 0x69, 0x6e, 0x64, 0x4d, 0x65, 0x72, 0x67, 0x65, 0x42, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xfa, 0x97, 0x28, 0x02, 0x08, 0x02, 0x12, 0x4b, 0x0a, 0x0a, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x46, 0x6f, 0x72, 0x6b, 0x12, 0x19, 0x2e, 0x67, 0x69, 0x74, + 0x61, 0x6c, 0x79, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x46, 0x6f, 0x72, 0x6b, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x46, 0x6f, 0x72, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x06, 0xfa, 0x97, 0x28, 0x02, 0x08, 0x01, 0x12, 0x66, 0x0a, 0x12, 0x49, 0x73, 0x53, + 0x71, 0x75, 0x61, 0x73, 0x68, 0x49, 0x6e, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x12, + 0x21, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x49, 0x73, 0x53, 0x71, 0x75, 0x61, 0x73, + 0x68, 0x49, 0x6e, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x49, 0x73, 0x53, 0x71, + 0x75, 0x61, 0x73, 0x68, 0x49, 0x6e, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x09, 0x88, 0x02, 0x01, 0xfa, 0x97, 0x28, 0x02, 0x08, + 0x02, 0x12, 0x72, 0x0a, 0x17, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x73, + 0x69, 0x74, 0x6f, 0x72, 0x79, 0x46, 0x72, 0x6f, 0x6d, 0x55, 0x52, 0x4c, 0x12, 0x26, 0x2e, 0x67, + 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6f, + 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x46, 0x72, 0x6f, 0x6d, 0x55, 0x52, 0x4c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x46, 0x72, + 0x6f, 0x6d, 0x55, 0x52, 0x4c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xfa, + 0x97, 0x28, 0x02, 0x08, 0x01, 0x12, 0x53, 0x0a, 0x0c, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, + 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x12, 0x1b, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x06, 0xfa, 0x97, 0x28, 0x02, 0x08, 0x02, 0x30, 0x01, 0x12, 0x76, 0x0a, 0x17, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x46, 0x72, 0x6f, 0x6d, 0x52, 0x65, - 0x66, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xfa, - 0x97, 0x28, 0x02, 0x08, 0x02, 0x28, 0x01, 0x30, 0x01, 0x12, 0x7d, 0x0a, 0x1a, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x46, 0x72, 0x6f, - 0x6d, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x12, 0x29, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, - 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, - 0x79, 0x46, 0x72, 0x6f, 0x6d, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x46, 0x72, 0x6f, 0x6d, - 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, - 0xfa, 0x97, 0x28, 0x02, 0x08, 0x01, 0x28, 0x01, 0x12, 0x4a, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x18, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x47, - 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x19, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xfa, 0x97, 0x28, 0x02, - 0x08, 0x02, 0x30, 0x01, 0x12, 0x48, 0x0a, 0x09, 0x53, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x12, 0x18, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x53, 0x65, 0x74, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x67, 0x69, - 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x53, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xfa, 0x97, 0x28, 0x02, 0x08, 0x01, 0x12, 0x51, - 0x0a, 0x0c, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1b, - 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x67, 0x69, - 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xfa, 0x97, 0x28, 0x02, 0x08, - 0x01, 0x12, 0x4e, 0x0a, 0x0b, 0x46, 0x69, 0x6e, 0x64, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, - 0x12, 0x1a, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x4c, 0x69, - 0x63, 0x65, 0x6e, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x67, - 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, - 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xfa, 0x97, 0x28, 0x02, 0x08, - 0x02, 0x12, 0x62, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x41, 0x74, 0x74, 0x72, - 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x12, 0x20, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, - 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, - 0x79, 0x2e, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, - 0x74, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xfa, 0x97, 0x28, - 0x02, 0x08, 0x02, 0x30, 0x01, 0x12, 0x60, 0x0a, 0x11, 0x43, 0x61, 0x6c, 0x63, 0x75, 0x6c, 0x61, - 0x74, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x12, 0x20, 0x2e, 0x67, 0x69, 0x74, - 0x61, 0x6c, 0x79, 0x2e, 0x43, 0x61, 0x6c, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x43, 0x68, 0x65, - 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x67, - 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x43, 0x61, 0x6c, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x43, - 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x06, 0xfa, 0x97, 0x28, 0x02, 0x08, 0x02, 0x12, 0x42, 0x0a, 0x07, 0x43, 0x6c, 0x65, 0x61, 0x6e, - 0x75, 0x70, 0x12, 0x16, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x43, 0x6c, 0x65, 0x61, - 0x6e, 0x75, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x67, 0x69, 0x74, - 0x61, 0x6c, 0x79, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x06, 0xfa, 0x97, 0x28, 0x02, 0x08, 0x01, 0x12, 0x50, 0x0a, 0x0b, 0x47, - 0x65, 0x74, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x12, 0x1a, 0x2e, 0x67, 0x69, 0x74, - 0x61, 0x6c, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, - 0x47, 0x65, 0x74, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x06, 0xfa, 0x97, 0x28, 0x02, 0x08, 0x02, 0x30, 0x01, 0x12, 0x81, 0x01, - 0x0a, 0x1c, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, - 0x72, 0x79, 0x46, 0x72, 0x6f, 0x6d, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x12, 0x2b, - 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, - 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x46, 0x72, 0x6f, 0x6d, 0x53, 0x6e, 0x61, 0x70, - 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x67, 0x69, + 0x66, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x26, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x46, 0x72, 0x6f, 0x6d, 0x52, + 0x65, 0x66, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, + 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x75, 0x6e, + 0x64, 0x6c, 0x65, 0x46, 0x72, 0x6f, 0x6d, 0x52, 0x65, 0x66, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xfa, 0x97, 0x28, 0x02, 0x08, 0x02, 0x28, 0x01, + 0x30, 0x01, 0x12, 0x7d, 0x0a, 0x1a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6f, + 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x46, 0x72, 0x6f, 0x6d, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, + 0x12, 0x29, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x46, 0x72, 0x6f, 0x6d, 0x42, 0x75, + 0x6e, 0x64, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x73, - 0x69, 0x74, 0x6f, 0x72, 0x79, 0x46, 0x72, 0x6f, 0x6d, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, - 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xfa, 0x97, 0x28, 0x02, 0x08, - 0x01, 0x12, 0x56, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x52, 0x61, 0x77, 0x43, 0x68, 0x61, 0x6e, 0x67, - 0x65, 0x73, 0x12, 0x1c, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x52, - 0x61, 0x77, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x1d, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x61, 0x77, - 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x06, 0xfa, 0x97, 0x28, 0x02, 0x08, 0x02, 0x30, 0x01, 0x12, 0x6b, 0x0a, 0x14, 0x53, 0x65, 0x61, - 0x72, 0x63, 0x68, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x42, 0x79, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, - 0x74, 0x12, 0x23, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, - 0x68, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x42, 0x79, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, - 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x42, 0x79, 0x43, 0x6f, 0x6e, - 0x74, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xfa, 0x97, - 0x28, 0x02, 0x08, 0x02, 0x30, 0x01, 0x12, 0x62, 0x0a, 0x11, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, - 0x46, 0x69, 0x6c, 0x65, 0x73, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x2e, 0x67, 0x69, - 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x46, 0x69, 0x6c, 0x65, 0x73, - 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, - 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x46, 0x69, 0x6c, - 0x65, 0x73, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x06, 0xfa, 0x97, 0x28, 0x02, 0x08, 0x02, 0x30, 0x01, 0x12, 0x65, 0x0a, 0x12, 0x52, 0x65, - 0x73, 0x74, 0x6f, 0x72, 0x65, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x48, 0x6f, 0x6f, 0x6b, 0x73, - 0x12, 0x21, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, - 0x65, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x48, 0x6f, 0x6f, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x52, 0x65, 0x73, - 0x74, 0x6f, 0x72, 0x65, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x48, 0x6f, 0x6f, 0x6b, 0x73, 0x52, + 0x69, 0x74, 0x6f, 0x72, 0x79, 0x46, 0x72, 0x6f, 0x6d, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xfa, 0x97, 0x28, 0x02, 0x08, 0x01, 0x28, - 0x01, 0x12, 0x62, 0x0a, 0x11, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x43, 0x75, 0x73, 0x74, 0x6f, - 0x6d, 0x48, 0x6f, 0x6f, 0x6b, 0x73, 0x12, 0x20, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, - 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x48, 0x6f, 0x6f, 0x6b, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, - 0x79, 0x2e, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x48, 0x6f, - 0x6f, 0x6b, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xfa, 0x97, 0x28, - 0x02, 0x08, 0x02, 0x30, 0x01, 0x12, 0x6f, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, - 0x63, 0x74, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x53, 0x69, 0x7a, 0x65, 0x12, - 0x25, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, - 0x63, 0x74, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x53, 0x69, 0x7a, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, - 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, - 0x72, 0x79, 0x53, 0x69, 0x7a, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, - 0xfa, 0x97, 0x28, 0x02, 0x08, 0x02, 0x12, 0x54, 0x0a, 0x0d, 0x43, 0x6c, 0x6f, 0x6e, 0x65, 0x46, - 0x72, 0x6f, 0x6d, 0x50, 0x6f, 0x6f, 0x6c, 0x12, 0x1c, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, - 0x2e, 0x43, 0x6c, 0x6f, 0x6e, 0x65, 0x46, 0x72, 0x6f, 0x6d, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x43, - 0x6c, 0x6f, 0x6e, 0x65, 0x46, 0x72, 0x6f, 0x6d, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xfa, 0x97, 0x28, 0x02, 0x08, 0x01, 0x12, 0x6c, 0x0a, 0x15, - 0x43, 0x6c, 0x6f, 0x6e, 0x65, 0x46, 0x72, 0x6f, 0x6d, 0x50, 0x6f, 0x6f, 0x6c, 0x49, 0x6e, 0x74, - 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x12, 0x24, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x43, + 0x01, 0x12, 0x4a, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x18, + 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, + 0x79, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x06, 0xfa, 0x97, 0x28, 0x02, 0x08, 0x02, 0x30, 0x01, 0x12, 0x4b, 0x0a, + 0x09, 0x53, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x18, 0x2e, 0x67, 0x69, 0x74, + 0x61, 0x6c, 0x79, 0x2e, 0x53, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x53, 0x65, + 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x09, 0x88, 0x02, 0x01, 0xfa, 0x97, 0x28, 0x02, 0x08, 0x01, 0x12, 0x54, 0x0a, 0x0c, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1b, 0x2e, 0x67, 0x69, 0x74, + 0x61, 0x6c, 0x79, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, + 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x09, 0x88, 0x02, 0x01, 0xfa, 0x97, 0x28, 0x02, 0x08, 0x01, + 0x12, 0x4e, 0x0a, 0x0b, 0x46, 0x69, 0x6e, 0x64, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x12, + 0x1a, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x4c, 0x69, 0x63, + 0x65, 0x6e, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x67, 0x69, + 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xfa, 0x97, 0x28, 0x02, 0x08, 0x02, + 0x12, 0x62, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x41, 0x74, 0x74, 0x72, 0x69, + 0x62, 0x75, 0x74, 0x65, 0x73, 0x12, 0x20, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x47, + 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, + 0x2e, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, + 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xfa, 0x97, 0x28, 0x02, + 0x08, 0x02, 0x30, 0x01, 0x12, 0x60, 0x0a, 0x11, 0x43, 0x61, 0x6c, 0x63, 0x75, 0x6c, 0x61, 0x74, + 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x12, 0x20, 0x2e, 0x67, 0x69, 0x74, 0x61, + 0x6c, 0x79, 0x2e, 0x43, 0x61, 0x6c, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x43, 0x68, 0x65, 0x63, + 0x6b, 0x73, 0x75, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x67, 0x69, + 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x43, 0x61, 0x6c, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x43, 0x68, + 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, + 0xfa, 0x97, 0x28, 0x02, 0x08, 0x02, 0x12, 0x42, 0x0a, 0x07, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, + 0x70, 0x12, 0x16, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, + 0x75, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x67, 0x69, 0x74, 0x61, + 0x6c, 0x79, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x06, 0xfa, 0x97, 0x28, 0x02, 0x08, 0x01, 0x12, 0x50, 0x0a, 0x0b, 0x47, 0x65, + 0x74, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x12, 0x1a, 0x2e, 0x67, 0x69, 0x74, 0x61, + 0x6c, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x47, + 0x65, 0x74, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x06, 0xfa, 0x97, 0x28, 0x02, 0x08, 0x02, 0x30, 0x01, 0x12, 0x81, 0x01, 0x0a, + 0x1c, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, + 0x79, 0x46, 0x72, 0x6f, 0x6d, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x12, 0x2b, 0x2e, + 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x70, + 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x46, 0x72, 0x6f, 0x6d, 0x53, 0x6e, 0x61, 0x70, 0x73, + 0x68, 0x6f, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x67, 0x69, 0x74, + 0x61, 0x6c, 0x79, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, + 0x74, 0x6f, 0x72, 0x79, 0x46, 0x72, 0x6f, 0x6d, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xfa, 0x97, 0x28, 0x02, 0x08, 0x01, + 0x12, 0x56, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x52, 0x61, 0x77, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, + 0x73, 0x12, 0x1c, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x61, + 0x77, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x1d, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x61, 0x77, 0x43, + 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, + 0xfa, 0x97, 0x28, 0x02, 0x08, 0x02, 0x30, 0x01, 0x12, 0x6b, 0x0a, 0x14, 0x53, 0x65, 0x61, 0x72, + 0x63, 0x68, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x42, 0x79, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, + 0x12, 0x23, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, + 0x46, 0x69, 0x6c, 0x65, 0x73, 0x42, 0x79, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x53, + 0x65, 0x61, 0x72, 0x63, 0x68, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x42, 0x79, 0x43, 0x6f, 0x6e, 0x74, + 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xfa, 0x97, 0x28, + 0x02, 0x08, 0x02, 0x30, 0x01, 0x12, 0x62, 0x0a, 0x11, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x46, + 0x69, 0x6c, 0x65, 0x73, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x2e, 0x67, 0x69, 0x74, + 0x61, 0x6c, 0x79, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x42, + 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x67, + 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x46, 0x69, 0x6c, 0x65, + 0x73, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x06, 0xfa, 0x97, 0x28, 0x02, 0x08, 0x02, 0x30, 0x01, 0x12, 0x65, 0x0a, 0x12, 0x52, 0x65, 0x73, + 0x74, 0x6f, 0x72, 0x65, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x48, 0x6f, 0x6f, 0x6b, 0x73, 0x12, + 0x21, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, + 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x48, 0x6f, 0x6f, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x52, 0x65, 0x73, 0x74, + 0x6f, 0x72, 0x65, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x48, 0x6f, 0x6f, 0x6b, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xfa, 0x97, 0x28, 0x02, 0x08, 0x01, 0x28, 0x01, + 0x12, 0x62, 0x0a, 0x11, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, + 0x48, 0x6f, 0x6f, 0x6b, 0x73, 0x12, 0x20, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x42, + 0x61, 0x63, 0x6b, 0x75, 0x70, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x48, 0x6f, 0x6f, 0x6b, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, + 0x2e, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x48, 0x6f, 0x6f, + 0x6b, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xfa, 0x97, 0x28, 0x02, + 0x08, 0x02, 0x30, 0x01, 0x12, 0x6f, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x25, + 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x53, 0x69, 0x7a, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x47, + 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, + 0x79, 0x53, 0x69, 0x7a, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xfa, + 0x97, 0x28, 0x02, 0x08, 0x02, 0x12, 0x54, 0x0a, 0x0d, 0x43, 0x6c, 0x6f, 0x6e, 0x65, 0x46, 0x72, + 0x6f, 0x6d, 0x50, 0x6f, 0x6f, 0x6c, 0x12, 0x1c, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, + 0x43, 0x6c, 0x6f, 0x6e, 0x65, 0x46, 0x72, 0x6f, 0x6d, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x43, 0x6c, + 0x6f, 0x6e, 0x65, 0x46, 0x72, 0x6f, 0x6d, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x06, 0xfa, 0x97, 0x28, 0x02, 0x08, 0x01, 0x12, 0x6c, 0x0a, 0x15, 0x43, 0x6c, 0x6f, 0x6e, 0x65, 0x46, 0x72, 0x6f, 0x6d, 0x50, 0x6f, 0x6f, 0x6c, 0x49, 0x6e, 0x74, 0x65, - 0x72, 0x6e, 0x61, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x67, 0x69, - 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x43, 0x6c, 0x6f, 0x6e, 0x65, 0x46, 0x72, 0x6f, 0x6d, 0x50, 0x6f, - 0x6f, 0x6c, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x06, 0xfa, 0x97, 0x28, 0x02, 0x08, 0x01, 0x12, 0x5d, 0x0a, 0x10, 0x52, 0x65, - 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1f, - 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, - 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x20, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, - 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x06, 0xfa, 0x97, 0x28, 0x02, 0x08, 0x01, 0x12, 0x5d, 0x0a, 0x10, 0x52, 0x65, 0x6e, - 0x61, 0x6d, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1f, 0x2e, - 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x52, 0x65, 0x70, + 0x72, 0x6e, 0x61, 0x6c, 0x12, 0x24, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x43, 0x6c, + 0x6f, 0x6e, 0x65, 0x46, 0x72, 0x6f, 0x6d, 0x50, 0x6f, 0x6f, 0x6c, 0x49, 0x6e, 0x74, 0x65, 0x72, + 0x6e, 0x61, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x67, 0x69, 0x74, + 0x61, 0x6c, 0x79, 0x2e, 0x43, 0x6c, 0x6f, 0x6e, 0x65, 0x46, 0x72, 0x6f, 0x6d, 0x50, 0x6f, 0x6f, + 0x6c, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x06, 0xfa, 0x97, 0x28, 0x02, 0x08, 0x01, 0x12, 0x5d, 0x0a, 0x10, 0x52, 0x65, 0x6d, + 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1f, 0x2e, + 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, - 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x52, 0x65, + 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x06, 0xfa, 0x97, 0x28, 0x02, 0x08, 0x01, 0x12, 0x66, 0x0a, 0x13, 0x52, 0x65, 0x70, 0x6c, - 0x69, 0x63, 0x61, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x12, - 0x22, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, - 0x74, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x52, 0x65, 0x70, - 0x6c, 0x69, 0x63, 0x61, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xfa, 0x97, 0x28, 0x02, 0x08, 0x01, - 0x12, 0x63, 0x0a, 0x12, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x52, 0x65, 0x70, 0x6f, - 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x21, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, - 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, - 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x67, 0x69, 0x74, 0x61, - 0x6c, 0x79, 0x2e, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x73, - 0x69, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xfa, - 0x97, 0x28, 0x02, 0x08, 0x01, 0x12, 0x4e, 0x0a, 0x0b, 0x53, 0x65, 0x74, 0x46, 0x75, 0x6c, 0x6c, - 0x50, 0x61, 0x74, 0x68, 0x12, 0x1a, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x53, 0x65, - 0x74, 0x46, 0x75, 0x6c, 0x6c, 0x50, 0x61, 0x74, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x1b, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x53, 0x65, 0x74, 0x46, 0x75, 0x6c, - 0x6c, 0x50, 0x61, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xfa, - 0x97, 0x28, 0x02, 0x08, 0x01, 0x42, 0x34, 0x5a, 0x32, 0x67, 0x69, 0x74, 0x6c, 0x61, 0x62, 0x2e, - 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x69, 0x74, 0x6c, 0x61, 0x62, 0x2d, 0x6f, 0x72, 0x67, 0x2f, 0x67, - 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2f, 0x76, 0x31, 0x34, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, - 0x67, 0x6f, 0x2f, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x33, + 0x22, 0x06, 0xfa, 0x97, 0x28, 0x02, 0x08, 0x01, 0x12, 0x5d, 0x0a, 0x10, 0x52, 0x65, 0x6e, 0x61, + 0x6d, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1f, 0x2e, 0x67, + 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x52, 0x65, 0x70, 0x6f, + 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, + 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x52, 0x65, 0x70, + 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x06, 0xfa, 0x97, 0x28, 0x02, 0x08, 0x01, 0x12, 0x66, 0x0a, 0x13, 0x52, 0x65, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x22, + 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, + 0x65, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x52, 0x65, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xfa, 0x97, 0x28, 0x02, 0x08, 0x01, 0x12, + 0x63, 0x0a, 0x12, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x73, + 0x69, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x21, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x4f, + 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, + 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, + 0x79, 0x2e, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, + 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xfa, 0x97, + 0x28, 0x02, 0x08, 0x01, 0x12, 0x4e, 0x0a, 0x0b, 0x53, 0x65, 0x74, 0x46, 0x75, 0x6c, 0x6c, 0x50, + 0x61, 0x74, 0x68, 0x12, 0x1a, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x53, 0x65, 0x74, + 0x46, 0x75, 0x6c, 0x6c, 0x50, 0x61, 0x74, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x1b, 0x2e, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x2e, 0x53, 0x65, 0x74, 0x46, 0x75, 0x6c, 0x6c, + 0x50, 0x61, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xfa, 0x97, + 0x28, 0x02, 0x08, 0x01, 0x42, 0x34, 0x5a, 0x32, 0x67, 0x69, 0x74, 0x6c, 0x61, 0x62, 0x2e, 0x63, + 0x6f, 0x6d, 0x2f, 0x67, 0x69, 0x74, 0x6c, 0x61, 0x62, 0x2d, 0x6f, 0x72, 0x67, 0x2f, 0x67, 0x69, + 0x74, 0x61, 0x6c, 0x79, 0x2f, 0x76, 0x31, 0x34, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, + 0x6f, 0x2f, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x79, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x33, } var ( diff --git a/proto/go/gitalypb/repository-service_grpc.pb.go b/proto/go/gitalypb/repository-service_grpc.pb.go index f9c019181..dfd6b38b3 100644 --- a/proto/go/gitalypb/repository-service_grpc.pb.go +++ b/proto/go/gitalypb/repository-service_grpc.pb.go @@ -39,6 +39,8 @@ type RepositoryServiceClient interface { WriteRef(ctx context.Context, in *WriteRefRequest, opts ...grpc.CallOption) (*WriteRefResponse, error) FindMergeBase(ctx context.Context, in *FindMergeBaseRequest, opts ...grpc.CallOption) (*FindMergeBaseResponse, error) CreateFork(ctx context.Context, in *CreateForkRequest, opts ...grpc.CallOption) (*CreateForkResponse, error) + // Deprecated: Do not use. + // IsSquashInProgress is deprecated and will always return false. IsSquashInProgress(ctx context.Context, in *IsSquashInProgressRequest, opts ...grpc.CallOption) (*IsSquashInProgressResponse, error) CreateRepositoryFromURL(ctx context.Context, in *CreateRepositoryFromURLRequest, opts ...grpc.CallOption) (*CreateRepositoryFromURLResponse, error) // CreateBundle creates a bundle from all refs @@ -49,7 +51,17 @@ type RepositoryServiceClient interface { // GetConfig reads the target repository's gitconfig and streams its contents // back. Returns a NotFound error in case no gitconfig was found. GetConfig(ctx context.Context, in *GetConfigRequest, opts ...grpc.CallOption) (RepositoryService_GetConfigClient, error) + // Deprecated: Do not use. + // SetConfig writes a set of config entries into the target repository's + // gitconfig. This RPC is deprecated with no general replacement: modifying + // the on-disk gitconfig is not supported anymore. The only usecase that is + // still supported is writing "gitlab.fullpath" via the new `SetFullPath()` + // RPC. SetConfig(ctx context.Context, in *SetConfigRequest, opts ...grpc.CallOption) (*SetConfigResponse, error) + // Deprecated: Do not use. + // DeleteConfig deletes a set of config entries from the target repository's + // gitconfig. This RPC is deprecated with no replacement: modifying the + // on-disk gitconfig is not supported anymore. DeleteConfig(ctx context.Context, in *DeleteConfigRequest, opts ...grpc.CallOption) (*DeleteConfigResponse, error) FindLicense(ctx context.Context, in *FindLicenseRequest, opts ...grpc.CallOption) (*FindLicenseResponse, error) GetInfoAttributes(ctx context.Context, in *GetInfoAttributesRequest, opts ...grpc.CallOption) (RepositoryService_GetInfoAttributesClient, error) @@ -263,6 +275,7 @@ func (c *repositoryServiceClient) CreateFork(ctx context.Context, in *CreateFork return out, nil } +// Deprecated: Do not use. func (c *repositoryServiceClient) IsSquashInProgress(ctx context.Context, in *IsSquashInProgressRequest, opts ...grpc.CallOption) (*IsSquashInProgressResponse, error) { out := new(IsSquashInProgressResponse) err := c.cc.Invoke(ctx, "/gitaly.RepositoryService/IsSquashInProgress", in, out, opts...) @@ -410,6 +423,7 @@ func (x *repositoryServiceGetConfigClient) Recv() (*GetConfigResponse, error) { return m, nil } +// Deprecated: Do not use. func (c *repositoryServiceClient) SetConfig(ctx context.Context, in *SetConfigRequest, opts ...grpc.CallOption) (*SetConfigResponse, error) { out := new(SetConfigResponse) err := c.cc.Invoke(ctx, "/gitaly.RepositoryService/SetConfig", in, out, opts...) @@ -419,6 +433,7 @@ func (c *repositoryServiceClient) SetConfig(ctx context.Context, in *SetConfigRe return out, nil } +// Deprecated: Do not use. func (c *repositoryServiceClient) DeleteConfig(ctx context.Context, in *DeleteConfigRequest, opts ...grpc.CallOption) (*DeleteConfigResponse, error) { out := new(DeleteConfigResponse) err := c.cc.Invoke(ctx, "/gitaly.RepositoryService/DeleteConfig", in, out, opts...) @@ -787,6 +802,8 @@ type RepositoryServiceServer interface { WriteRef(context.Context, *WriteRefRequest) (*WriteRefResponse, error) FindMergeBase(context.Context, *FindMergeBaseRequest) (*FindMergeBaseResponse, error) CreateFork(context.Context, *CreateForkRequest) (*CreateForkResponse, error) + // Deprecated: Do not use. + // IsSquashInProgress is deprecated and will always return false. IsSquashInProgress(context.Context, *IsSquashInProgressRequest) (*IsSquashInProgressResponse, error) CreateRepositoryFromURL(context.Context, *CreateRepositoryFromURLRequest) (*CreateRepositoryFromURLResponse, error) // CreateBundle creates a bundle from all refs @@ -797,7 +814,17 @@ type RepositoryServiceServer interface { // GetConfig reads the target repository's gitconfig and streams its contents // back. Returns a NotFound error in case no gitconfig was found. GetConfig(*GetConfigRequest, RepositoryService_GetConfigServer) error + // Deprecated: Do not use. + // SetConfig writes a set of config entries into the target repository's + // gitconfig. This RPC is deprecated with no general replacement: modifying + // the on-disk gitconfig is not supported anymore. The only usecase that is + // still supported is writing "gitlab.fullpath" via the new `SetFullPath()` + // RPC. SetConfig(context.Context, *SetConfigRequest) (*SetConfigResponse, error) + // Deprecated: Do not use. + // DeleteConfig deletes a set of config entries from the target repository's + // gitconfig. This RPC is deprecated with no replacement: modifying the + // on-disk gitconfig is not supported anymore. DeleteConfig(context.Context, *DeleteConfigRequest) (*DeleteConfigResponse, error) FindLicense(context.Context, *FindLicenseRequest) (*FindLicenseResponse, error) GetInfoAttributes(*GetInfoAttributesRequest, RepositoryService_GetInfoAttributesServer) error diff --git a/proto/hook.proto b/proto/hook.proto index 71dd75cd6..1c8a2001f 100644 --- a/proto/hook.proto +++ b/proto/hook.proto @@ -36,6 +36,13 @@ service HookService { op: ACCESSOR }; } + // PackObjectsHookWithSidechannel is an optimized version of PackObjectsHook that uses + // a unix socket side channel. + rpc PackObjectsHookWithSidechannel(PackObjectsHookWithSidechannelRequest) returns (PackObjectsHookWithSidechannelResponse) { + option (op_type) = { + op: ACCESSOR + }; + } } message PreReceiveHookRequest { @@ -110,3 +117,11 @@ message PackObjectsHookResponse { // stderr contains progress messages (such as "Enumerating objects ...") bytes stderr = 2; } + +message PackObjectsHookWithSidechannelRequest { + Repository repository = 1 [(target_repository)=true]; + // args contains the arguments passed to the pack-objects hook, without the leading "git" + repeated string args = 2; +} + +message PackObjectsHookWithSidechannelResponse {} diff --git a/proto/operations.proto b/proto/operations.proto index 459e4a29e..2414717d0 100644 --- a/proto/operations.proto +++ b/proto/operations.proto @@ -607,10 +607,10 @@ message UserSquashRequest { Repository repository = 1 [(target_repository)=true]; // user is used for authorization checks. User user = 2; - // squash_id is used as a unique identifier for the squash. Internally, this - // is used to identify the worktree in which the squash shall be computed. No - // two UserSquash RPCs may run with the same ID. - string squash_id = 3; + // SquashId used to identify the path where the worktree was created. Given + // that Gitaly does in-memory squashes now, this is useless and will be + // ignored. There is no replacement for this. + string squash_id = 3 [deprecated=true]; reserved 4; // start_sha is the object ID of the start commit of the range which shall be // squashed. Must be an ancestor of end_sha. diff --git a/proto/remote.proto b/proto/remote.proto index 69095e113..c409948af 100644 --- a/proto/remote.proto +++ b/proto/remote.proto @@ -8,21 +8,11 @@ import "lint.proto"; import "shared.proto"; service RemoteService { - rpc AddRemote(AddRemoteRequest) returns (AddRemoteResponse) { - option (op_type) = { - op: MUTATOR - }; - } rpc FetchInternalRemote(FetchInternalRemoteRequest) returns (FetchInternalRemoteResponse) { option (op_type) = { op: MUTATOR }; } - rpc RemoveRemote(RemoveRemoteRequest) returns (RemoveRemoteResponse) { - option (op_type) = { - op: MUTATOR - }; - } // UpdateRemoteMirror compares the references in the target repository and its remote mirror // repository. Any differences in the references are then addressed by pushing the differing @@ -53,28 +43,6 @@ service RemoteService { } } -message AddRemoteRequest { - Repository repository = 1 [(target_repository)=true]; - string name = 2; - string url = 3; - // DEPRECATED: https://gitlab.com/gitlab-org/gitaly/proto/merge_requests/137 - reserved 4; - reserved "mirror_refmap"; - // If any, the remote is configured as a mirror with those mappings - repeated string mirror_refmaps = 5; -} - -message AddRemoteResponse {} - -message RemoveRemoteRequest { - Repository repository = 1 [(target_repository)=true]; - string name = 2; -} - -message RemoveRemoteResponse { - bool result = 1; -} - message FetchInternalRemoteRequest { Repository repository = 1 [(target_repository)=true]; Repository remote_repository = 2; @@ -95,9 +63,6 @@ message UpdateRemoteMirrorRequest { // Repository is the repository whose mirror repository to update. Repository repository = 1 [(target_repository)=true]; - // RefName is actually the remote to update. Deprecated in favor of the - // Remote field. - string ref_name = 2; // Remote contains parameters required to connect to the remote repository. // This allows Gitaly to use an in-memory remote and does not require any // on-disk remote configuration. @@ -118,6 +83,9 @@ message UpdateRemoteMirrorRequest { // KeepDivergentRefs specifies whether or not to update diverged references // in the mirror repository. bool keep_divergent_refs = 6; + + reserved 2; + reserved "ref_name"; } message UpdateRemoteMirrorResponse { @@ -146,16 +114,14 @@ message FindRemoteRootRefRequest { // a remote name is given, then this is the repository in which the remote // will be looked up. Repository repository = 1 [(target_repository)=true]; - // Remote is the name of the remote of which the root reference shall be - // looked up. The remote must have been created before this call. This - // parameter is deprecated in favor of `RemoteUrl`, see - // https://gitlab.com/gitlab-org/gitaly/-/issues/1773. - string remote = 2 [deprecated=true]; // RemoteUrl specifies the remote repository URL which should be fetched from. string remote_url = 3; // HttpAuthorizationHeader is the HTTP header which should be added to the // request in order to authenticate against the repository. string http_authorization_header = 4; + + reserved 2; + reserved "remote"; } // FindRemoteRootRefResponse represents the response for the FindRemoteRootRef @@ -164,17 +130,3 @@ message FindRemoteRootRefResponse { // Ref is the name of the remote root reference. string ref = 1; } - -message ListRemotesRequest { - Repository repository = 1 [(target_repository)=true]; -} - -message ListRemotesResponse { - message Remote { - string name = 1; - string fetch_url = 2; - string push_url = 3; - } - - repeated Remote remotes = 1; -} diff --git a/proto/repository-service.proto b/proto/repository-service.proto index f4ca95264..bc4b6f245 100644 --- a/proto/repository-service.proto +++ b/proto/repository-service.proto @@ -99,7 +99,10 @@ service RepositoryService { op: MUTATOR }; } + + // IsSquashInProgress is deprecated and will always return false. rpc IsSquashInProgress(IsSquashInProgressRequest) returns (IsSquashInProgressResponse) { + option deprecated = true; option (op_type) = { op: ACCESSOR }; @@ -139,13 +142,23 @@ service RepositoryService { }; } + // SetConfig writes a set of config entries into the target repository's + // gitconfig. This RPC is deprecated with no general replacement: modifying + // the on-disk gitconfig is not supported anymore. The only usecase that is + // still supported is writing "gitlab.fullpath" via the new `SetFullPath()` + // RPC. rpc SetConfig(SetConfigRequest) returns (SetConfigResponse) { + option deprecated = true; option (op_type) = { op: MUTATOR }; } + // DeleteConfig deletes a set of config entries from the target repository's + // gitconfig. This RPC is deprecated with no replacement: modifying the + // on-disk gitconfig is not supported anymore. rpc DeleteConfig(DeleteConfigRequest) returns (DeleteConfigResponse) { + option deprecated = true; option (op_type) = { op: MUTATOR }; @@ -334,10 +347,6 @@ message ApplyGitattributesResponse {} message FetchRemoteRequest { Repository repository = 1 [(target_repository)=true]; - // remote is the name of the remote that shall be fetched. This remote must - // exist in the repository's configuration already. This parameter is - // deprecated in favor of remote_params. - string remote = 2; // force determines if references should be force-updated in case they have // diverged. bool force = 3; @@ -358,6 +367,9 @@ message FetchRemoteRequest { // tags were modified, returning the result in the tags_changed field of // FetchRemoteResponse bool check_tags_changed = 11; + + reserved 2; + reserved "remote"; } message FetchRemoteResponse { diff --git a/ruby/lib/gitaly_server.rb b/ruby/lib/gitaly_server.rb index a7526291b..112cc635d 100644 --- a/ruby/lib/gitaly_server.rb +++ b/ruby/lib/gitaly_server.rb @@ -8,7 +8,6 @@ require_relative 'gitaly_server/utils.rb' require_relative 'gitaly_server/operations_service.rb' require_relative 'gitaly_server/repository_service.rb' require_relative 'gitaly_server/wiki_service.rb' -require_relative 'gitaly_server/remote_service.rb' require_relative 'gitaly_server/health_service.rb' require_relative 'gitaly_server/feature_flags.rb' @@ -49,7 +48,6 @@ module GitalyServer server.handle(OperationsService.new) server.handle(RepositoryService.new) server.handle(WikiService.new) - server.handle(RemoteService.new) server.handle(HealthService.new) end end diff --git a/ruby/lib/gitaly_server/remote_service.rb b/ruby/lib/gitaly_server/remote_service.rb deleted file mode 100644 index e19ddd3c3..000000000 --- a/ruby/lib/gitaly_server/remote_service.rb +++ /dev/null @@ -1,40 +0,0 @@ -module GitalyServer - class RemoteService < Gitaly::RemoteService::Service - include Utils - - # Maximum number of divergent refs to return in UpdateRemoteMirrorResponse - DIVERGENT_REF_LIMIT = 100 - - def add_remote(request, call) - repo = Gitlab::Git::Repository.from_gitaly(request.repository, call) - - mirror_refmap = parse_refmaps(request.mirror_refmaps) - - repo.add_remote(request.name, request.url, mirror_refmap: mirror_refmap) - - Gitaly::AddRemoteResponse.new - end - - def update_remote_mirror(call) - request_enum = call.each_remote_read - first_request = request_enum.next - - only_branches_matching = first_request.only_branches_matching.to_a - only_branches_matching += request_enum.flat_map(&:only_branches_matching) - - remote_mirror = Gitlab::Git::RemoteMirror.new( - Gitlab::Git::Repository.from_gitaly(first_request.repository, call), - first_request.ref_name, - ssh_auth: Gitlab::Git::SshAuth.from_gitaly(first_request), - only_branches_matching: only_branches_matching, - keep_divergent_refs: first_request.keep_divergent_refs - ) - - remote_mirror.update - - Gitaly::UpdateRemoteMirrorResponse.new( - divergent_refs: remote_mirror.divergent_refs.take(DIVERGENT_REF_LIMIT) - ) - end - end -end diff --git a/ruby/lib/gitaly_server/utils.rb b/ruby/lib/gitaly_server/utils.rb index ecb78fd9e..8d4e45c90 100644 --- a/ruby/lib/gitaly_server/utils.rb +++ b/ruby/lib/gitaly_server/utils.rb @@ -63,21 +63,5 @@ module GitalyServer def sanitize_url(str) str.gsub(URL_HOST_PATTERN, '\1[FILTERED]@\3\4') end - - def parse_refmaps(refmaps) - return unless refmaps.present? - - parsed_refmaps = refmaps.select(&:present?).map do |refmap| - refmap_spec = refmap.to_sym - - if Gitlab::Git::RepositoryMirroring::REFMAPS.key?(refmap_spec) - refmap_spec - else - refmap - end - end - - parsed_refmaps.presence - end end end diff --git a/ruby/lib/gitlab/git.rb b/ruby/lib/gitlab/git.rb index d010aea6c..5ac9a6e0d 100644 --- a/ruby/lib/gitlab/git.rb +++ b/ruby/lib/gitlab/git.rb @@ -21,10 +21,8 @@ dir = __dir__ # Some later requires are order-sensitive. Manually require whatever we need. require_relative "#{dir}/encoding_helper.rb" require_relative "#{dir}/utils/strong_memoize.rb" -require_relative "#{dir}/ref_matcher.rb" require_relative "#{dir}/git/remote_repository.rb" require_relative "#{dir}/git/popen.rb" -require_relative "#{dir}/git/repository_mirroring.rb" # Require all .rb files we can find in the gitlab lib directory Dir["#{dir}/**/*.rb"].sort.each do |ruby_file| diff --git a/ruby/lib/gitlab/git/gitlab_projects.rb b/ruby/lib/gitlab/git/gitlab_projects.rb index 9c11e4815..d90bf7ae8 100644 --- a/ruby/lib/gitlab/git/gitlab_projects.rb +++ b/ruby/lib/gitlab/git/gitlab_projects.rb @@ -76,22 +76,6 @@ module Gitlab true end - def delete_remote_branches(remote_name, branch_names, env: {}) - branch_names.each_slice(BRANCHES_PER_PUSH) do |branches| - logger.info "Pushing #{branches.count} deleted branches from #{repository_absolute_path} to remote #{remote_name}" - - cmd = %W(#{Gitlab.config.git.bin_path} push -- #{remote_name}) - branches.each { |branch| cmd << ":#{branch}" } - - unless run(cmd, repository_absolute_path, env) - logger.error("Pushing deleted branches to remote #{remote_name} failed.") - return false - end - end - - true - end - protected def run(*args) diff --git a/ruby/lib/gitlab/git/remote_mirror.rb b/ruby/lib/gitlab/git/remote_mirror.rb deleted file mode 100644 index 48f60f28f..000000000 --- a/ruby/lib/gitlab/git/remote_mirror.rb +++ /dev/null @@ -1,146 +0,0 @@ -module Gitlab - module Git - class RemoteMirror - attr_reader :repository, :remote_name, :ssh_auth, :only_branches_matching - - # An Array of local refnames that have diverged on the remote - # - # Only populated when `keep_divergent_refs` is enabled - attr_reader :divergent_refs - - def initialize(repository, remote_name, ssh_auth:, only_branches_matching:, keep_divergent_refs:) - @repository = repository - @remote_name = remote_name - @ssh_auth = ssh_auth - @only_branches_matching = only_branches_matching - @keep_divergent_refs = keep_divergent_refs - - @divergent_refs = [] - end - - def update - ssh_auth.setup do |env| - # Retrieve the remote branches first since they may take a while to load, - # and the local branches may have changed during this time. - remote_branch_list = remote_branches(env: env) - updated_branches = changed_refs(local_branches, remote_branch_list) - push_refs(default_branch_first(updated_branches.keys), env: env) - delete_refs(local_branches, remote_branches(env: env), env: env) - - local_tags = refs_obj(repository.tags) - remote_tags = refs_obj(repository.remote_tags(remote_name, env: env)) - - updated_tags = changed_refs(local_tags, remote_tags) - push_refs(updated_tags.keys, env: env) - delete_refs(local_tags, remote_tags, env: env) - end - end - - private - - def ref_matchers - @ref_matchers ||= only_branches_matching.map do |ref| - GitLab::RefMatcher.new(ref) - end - end - - def local_branches - @local_branches ||= refs_obj( - repository.local_branches, - match_refs: true - ) - end - - def remote_branches(env:) - @remote_branches ||= refs_obj( - repository.remote_branches(remote_name, env: env), - match_refs: true - ) - end - - def refs_obj(refs, match_refs: false) - refs.each_with_object({}) do |ref, refs| - next if match_refs && !include_ref?(ref.name) - - key = ref.is_a?(Gitlab::Git::Tag) ? ref.refname : ref.name - refs[key] = ref - end - end - - def changed_refs(local_refs, remote_refs) - local_refs.select do |ref_name, ref| - remote_ref = remote_refs[ref_name] - - # Ref doesn't exist on the remote, it should be created - next true if remote_ref.nil? - - local_target = ref.dereferenced_target - remote_target = remote_ref.dereferenced_target - - if local_target == remote_target - # Ref is identical on the remote, no point mirroring - false - elsif @keep_divergent_refs - # Mirror the ref if its remote counterpart hasn't diverged - if repository.ancestor?(remote_target&.id, local_target&.id) - true - else - Gitlab::GitLogger.info("Divergent ref `#{ref_name}` in #{repository.path} due to ancestry -- remote: #{remote_target&.id}, local: #{local_target&.id}") - @divergent_refs << ref.refname - false - end - else - # Attempt to overwrite whatever's on the remote; push rules and - # protected branches may still prevent this - true - end - end - end - - # Put the default branch first so it works fine when remote mirror is empty. - def default_branch_first(branches) - return unless branches.present? - - default_branch, branches = branches.partition do |branch| - repository.root_ref == branch - end - - branches.unshift(*default_branch) - end - - def push_refs(refs, env:) - return unless refs.present? - - repository.push_remote_branches(remote_name, refs, env: env) - end - - def delete_refs(local_refs, remote_refs, env:) - return if @keep_divergent_refs - - refs = refs_to_delete(local_refs, remote_refs) - - return unless refs.present? - - repository.delete_remote_branches(remote_name, refs.keys, env: env) - end - - def refs_to_delete(local_refs, remote_refs) - default_branch_id = repository.commit.id - - remote_refs.select do |remote_ref_name, remote_ref| - next false if local_refs[remote_ref_name] # skip if branch or tag exist in local repo - - remote_ref_id = remote_ref.dereferenced_target.try(:id) - - repository.ancestor?(remote_ref_id, default_branch_id) - end - end - - def include_ref?(ref_name) - return true unless ref_matchers.present? - - ref_matchers.any? { |matcher| matcher.matches?(ref_name) } - end - end - end -end diff --git a/ruby/lib/gitlab/git/repository.rb b/ruby/lib/gitlab/git/repository.rb index ae84b5300..02b9e05e9 100644 --- a/ruby/lib/gitlab/git/repository.rb +++ b/ruby/lib/gitlab/git/repository.rb @@ -4,7 +4,6 @@ module Gitlab module Git # These are monkey patches on top of the vendored version of Repository. class Repository - include Gitlab::Git::RepositoryMirroring include Gitlab::Git::Popen include Gitlab::EncodingHelper include Gitlab::Utils::StrongMemoize @@ -126,10 +125,6 @@ module Gitlab branches_filter end - def local_branches(sort_by: nil) - branches_filter(filter: :local, sort_by: sort_by) - end - # Git repository can contains some hidden refs like: # /refs/notes/* # /refs/git-as-svn/* @@ -193,14 +188,6 @@ module Gitlab end end - def ancestor?(from, to) - return false if from.nil? || to.nil? - - merge_base(from, to) == from - rescue Rugged::OdbError - false - end - def diff_exists?(sha1, sha2) rugged.diff(sha1, sha2).size.positive? end @@ -354,24 +341,6 @@ module Gitlab Ref.dereference_object(obj) end - def add_remote(remote_name, url, mirror_refmap: nil) - rugged.remotes.create(remote_name, url) - - set_remote_as_mirror(remote_name, refmap: mirror_refmap) if mirror_refmap - rescue Rugged::ConfigError - remote_update(remote_name, url: url) - end - - # Update the specified remote using the values in the +options+ hash - # - # Example - # repo.update_remote("origin", url: "path/to/repo") - def remote_update(remote_name, url:) - # TODO: Implement other remote options - rugged.remotes.set_url(remote_name, url) - nil - end - def commit(ref = nil) ref ||= root_ref Gitlab::Git::Commit.find(self, ref) diff --git a/ruby/lib/gitlab/git/repository_mirroring.rb b/ruby/lib/gitlab/git/repository_mirroring.rb deleted file mode 100644 index 79073ecb1..000000000 --- a/ruby/lib/gitlab/git/repository_mirroring.rb +++ /dev/null @@ -1,113 +0,0 @@ -module Gitlab - module Git - module RepositoryMirroring - GITLAB_PROJECTS_TIMEOUT = 10800 - - RemoteError = Class.new(StandardError) - - REFMAPS = { - # With `:all_refs`, the repository is equivalent to the result of `git clone --mirror` - all_refs: '+refs/*:refs/*', - heads: '+refs/heads/*:refs/heads/*', - tags: '+refs/tags/*:refs/tags/*' - }.freeze - - def remote_branches(remote_name, env:) - list_remote_refs(remote_name, env: env).map do |line| - target, refname = line.strip.split("\t") - - if target.nil? || refname.nil? - Rails.logger.info("Empty or invalid list of heads for remote: #{remote_name}") - break [] - end - - next unless refname.start_with?('refs/heads/') - - target_commit = Gitlab::Git::Commit.find(self, target) - Gitlab::Git::Branch.new(self, refname, target, target_commit) - end.compact - end - - def push_remote_branches(remote_name, branch_names, forced: true, env: {}) - success = @gitlab_projects.push_branches(remote_name, GITLAB_PROJECTS_TIMEOUT, forced, branch_names, env: env) - - success || gitlab_projects_error - end - - def delete_remote_branches(remote_name, branch_names, env: {}) - success = @gitlab_projects.delete_remote_branches(remote_name, branch_names, env: env) - - success || gitlab_projects_error - end - - def set_remote_as_mirror(remote_name, refmap: :all_refs) - set_remote_refmap(remote_name, refmap) - - rugged.config["remote.#{remote_name}.mirror"] = true - rugged.config["remote.#{remote_name}.prune"] = true - end - - def remote_tags(remote, env: {}) - # Each line has this format: "dc872e9fa6963f8f03da6c8f6f264d0845d6b092\trefs/tags/v1.10.0\n" - # We want to convert it to: [{ 'v1.10.0' => 'dc872e9fa6963f8f03da6c8f6f264d0845d6b092' }, ...] - list_remote_refs(remote, env: env).map do |line| - target, refname = line.strip.split("\t") - - # When the remote repo does not have tags. - if target.nil? || refname.nil? - Rails.logger.info "Empty or invalid list of tags for remote: #{remote}" - break [] - end - - next unless refname.start_with?('refs/tags/') - - # We're only interested in tag references - # See: http://stackoverflow.com/questions/15472107/when-listing-git-ls-remote-why-theres-after-the-tag-name - next if refname.end_with?('^{}') - - target_commit = Gitlab::Git::Commit.find(self, target) - Gitlab::Git::Tag.new(self, - name: refname, - target: target, - target_commit: target_commit) - end.compact - end - - private - - def set_remote_refmap(remote_name, refmap) - Array(refmap).each_with_index do |refspec, i| - refspec = REFMAPS[refspec] || refspec - - # We need multiple `fetch` entries, but Rugged only allows replacing a config, not adding to it. - # To make sure we start from scratch, we set the first using rugged, and use `git` for any others - if i == 0 - rugged.config["remote.#{remote_name}.fetch"] = refspec - else - run_git(%W[config --add remote.#{remote_name}.fetch #{refspec}]) - end - end - end - - def list_remote_refs(remote, env:) - @list_remote_refs ||= {} - @list_remote_refs[remote] ||= begin - ref_list, exit_code, error = nil - - # List heads and tags, ignoring stuff like `refs/merge-requests` and `refs/pull` - cmd = %W[#{Gitlab.config.git.bin_path} --git-dir=#{path} ls-remote --heads --tags #{remote}] - - Open3.popen3(env, *cmd) do |_stdin, stdout, stderr, wait_thr| - ref_list = stdout.read - error = stderr.read - exit_code = wait_thr.value.exitstatus - end - - raise RemoteError, error unless exit_code.zero? - - ref_list.each_line(chomp: true) - end - end - end - end -end diff --git a/ruby/lib/gitlab/ref_matcher.rb b/ruby/lib/gitlab/ref_matcher.rb deleted file mode 100644 index c0bb2163a..000000000 --- a/ruby/lib/gitlab/ref_matcher.rb +++ /dev/null @@ -1,41 +0,0 @@ -# frozen_string_literal: true - -module GitLab - class RefMatcher - def initialize(ref_name_or_pattern) - @ref_name_or_pattern = ref_name_or_pattern - end - - # Checks if the protected ref matches the given ref name. - def matches?(ref_name) - return false if @ref_name_or_pattern.blank? - - exact_match?(ref_name) || wildcard_match?(ref_name) - end - - private - - # Checks if this protected ref contains a wildcard - def wildcard? - @ref_name_or_pattern&.include?('*') - end - - def exact_match?(ref_name) - @ref_name_or_pattern == ref_name - end - - def wildcard_match?(ref_name) - return false unless wildcard? - - ref_name.match(wildcard_regex).present? - end - - def wildcard_regex - @wildcard_regex ||= begin - split = @ref_name_or_pattern.split('*', -1) # Use -1 to correctly handle trailing '*' - quoted_segments = split.map { |segment| Regexp.quote(segment) } - /\A#{quoted_segments.join('.*?')}\z/ - end - end - end -end diff --git a/ruby/proto/gitaly/blob_pb.rb b/ruby/proto/gitaly/blob_pb.rb index 3ade3769c..65cd29dac 100644 --- a/ruby/proto/gitaly/blob_pb.rb +++ b/ruby/proto/gitaly/blob_pb.rb @@ -41,6 +41,7 @@ Google::Protobuf::DescriptorPool.generated_pool.build do repeated :revisions, :string, 2 optional :limit, :uint32, 3 optional :bytes_limit, :int64, 4 + optional :with_paths, :bool, 5 end add_message "gitaly.ListBlobsResponse" do repeated :blobs, :message, 1, "gitaly.ListBlobsResponse.Blob" @@ -49,6 +50,7 @@ Google::Protobuf::DescriptorPool.generated_pool.build do optional :oid, :string, 1 optional :size, :int64, 2 optional :data, :bytes, 3 + optional :path, :bytes, 4 end add_message "gitaly.ListAllBlobsRequest" do optional :repository, :message, 1, "gitaly.Repository" diff --git a/ruby/proto/gitaly/hook_pb.rb b/ruby/proto/gitaly/hook_pb.rb index 20c8cb8b1..6ac768187 100644 --- a/ruby/proto/gitaly/hook_pb.rb +++ b/ruby/proto/gitaly/hook_pb.rb @@ -66,6 +66,12 @@ Google::Protobuf::DescriptorPool.generated_pool.build do optional :stdout, :bytes, 1 optional :stderr, :bytes, 2 end + add_message "gitaly.PackObjectsHookWithSidechannelRequest" do + optional :repository, :message, 1, "gitaly.Repository" + repeated :args, :string, 2 + end + add_message "gitaly.PackObjectsHookWithSidechannelResponse" do + end end end @@ -81,4 +87,6 @@ module Gitaly ReferenceTransactionHookResponse = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("gitaly.ReferenceTransactionHookResponse").msgclass PackObjectsHookRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("gitaly.PackObjectsHookRequest").msgclass PackObjectsHookResponse = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("gitaly.PackObjectsHookResponse").msgclass + PackObjectsHookWithSidechannelRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("gitaly.PackObjectsHookWithSidechannelRequest").msgclass + PackObjectsHookWithSidechannelResponse = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("gitaly.PackObjectsHookWithSidechannelResponse").msgclass end diff --git a/ruby/proto/gitaly/hook_services_pb.rb b/ruby/proto/gitaly/hook_services_pb.rb index de4048201..1059d58bd 100644 --- a/ruby/proto/gitaly/hook_services_pb.rb +++ b/ruby/proto/gitaly/hook_services_pb.rb @@ -22,6 +22,9 @@ module Gitaly # uploadpack.packObjectsHook mechanism. It generates a stream of packed # Git objects. rpc :PackObjectsHook, stream(::Gitaly::PackObjectsHookRequest), stream(::Gitaly::PackObjectsHookResponse) + # PackObjectsHookWithSidechannel is an optimized version of PackObjectsHook that uses + # a unix socket side channel. + rpc :PackObjectsHookWithSidechannel, ::Gitaly::PackObjectsHookWithSidechannelRequest, ::Gitaly::PackObjectsHookWithSidechannelResponse end Stub = Service.rpc_stub_class diff --git a/ruby/proto/gitaly/remote_pb.rb b/ruby/proto/gitaly/remote_pb.rb index b9f415d7c..78272e164 100644 --- a/ruby/proto/gitaly/remote_pb.rb +++ b/ruby/proto/gitaly/remote_pb.rb @@ -7,21 +7,6 @@ require 'lint_pb' require 'shared_pb' Google::Protobuf::DescriptorPool.generated_pool.build do add_file("remote.proto", :syntax => :proto3) do - add_message "gitaly.AddRemoteRequest" do - optional :repository, :message, 1, "gitaly.Repository" - optional :name, :string, 2 - optional :url, :string, 3 - repeated :mirror_refmaps, :string, 5 - end - add_message "gitaly.AddRemoteResponse" do - end - add_message "gitaly.RemoveRemoteRequest" do - optional :repository, :message, 1, "gitaly.Repository" - optional :name, :string, 2 - end - add_message "gitaly.RemoveRemoteResponse" do - optional :result, :bool, 1 - end add_message "gitaly.FetchInternalRemoteRequest" do optional :repository, :message, 1, "gitaly.Repository" optional :remote_repository, :message, 2, "gitaly.Repository" @@ -31,7 +16,6 @@ Google::Protobuf::DescriptorPool.generated_pool.build do end add_message "gitaly.UpdateRemoteMirrorRequest" do optional :repository, :message, 1, "gitaly.Repository" - optional :ref_name, :string, 2 optional :remote, :message, 7, "gitaly.UpdateRemoteMirrorRequest.Remote" repeated :only_branches_matching, :bytes, 3 optional :ssh_key, :string, 4 @@ -54,32 +38,16 @@ Google::Protobuf::DescriptorPool.generated_pool.build do end add_message "gitaly.FindRemoteRootRefRequest" do optional :repository, :message, 1, "gitaly.Repository" - optional :remote, :string, 2 optional :remote_url, :string, 3 optional :http_authorization_header, :string, 4 end add_message "gitaly.FindRemoteRootRefResponse" do optional :ref, :string, 1 end - add_message "gitaly.ListRemotesRequest" do - optional :repository, :message, 1, "gitaly.Repository" - end - add_message "gitaly.ListRemotesResponse" do - repeated :remotes, :message, 1, "gitaly.ListRemotesResponse.Remote" - end - add_message "gitaly.ListRemotesResponse.Remote" do - optional :name, :string, 1 - optional :fetch_url, :string, 2 - optional :push_url, :string, 3 - end end end module Gitaly - AddRemoteRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("gitaly.AddRemoteRequest").msgclass - AddRemoteResponse = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("gitaly.AddRemoteResponse").msgclass - RemoveRemoteRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("gitaly.RemoveRemoteRequest").msgclass - RemoveRemoteResponse = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("gitaly.RemoveRemoteResponse").msgclass FetchInternalRemoteRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("gitaly.FetchInternalRemoteRequest").msgclass FetchInternalRemoteResponse = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("gitaly.FetchInternalRemoteResponse").msgclass UpdateRemoteMirrorRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("gitaly.UpdateRemoteMirrorRequest").msgclass @@ -89,7 +57,4 @@ module Gitaly FindRemoteRepositoryResponse = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("gitaly.FindRemoteRepositoryResponse").msgclass FindRemoteRootRefRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("gitaly.FindRemoteRootRefRequest").msgclass FindRemoteRootRefResponse = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("gitaly.FindRemoteRootRefResponse").msgclass - ListRemotesRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("gitaly.ListRemotesRequest").msgclass - ListRemotesResponse = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("gitaly.ListRemotesResponse").msgclass - ListRemotesResponse::Remote = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("gitaly.ListRemotesResponse.Remote").msgclass end diff --git a/ruby/proto/gitaly/remote_services_pb.rb b/ruby/proto/gitaly/remote_services_pb.rb index f75fc196e..d4be3a3ec 100644 --- a/ruby/proto/gitaly/remote_services_pb.rb +++ b/ruby/proto/gitaly/remote_services_pb.rb @@ -14,9 +14,7 @@ module Gitaly self.unmarshal_class_method = :decode self.service_name = 'gitaly.RemoteService' - rpc :AddRemote, ::Gitaly::AddRemoteRequest, ::Gitaly::AddRemoteResponse rpc :FetchInternalRemote, ::Gitaly::FetchInternalRemoteRequest, ::Gitaly::FetchInternalRemoteResponse - rpc :RemoveRemote, ::Gitaly::RemoveRemoteRequest, ::Gitaly::RemoveRemoteResponse # UpdateRemoteMirror compares the references in the target repository and its remote mirror # repository. Any differences in the references are then addressed by pushing the differing # references to the mirror. Created and modified references are updated, removed references are diff --git a/ruby/proto/gitaly/repository-service_pb.rb b/ruby/proto/gitaly/repository-service_pb.rb index 374b4c74a..f702f902b 100644 --- a/ruby/proto/gitaly/repository-service_pb.rb +++ b/ruby/proto/gitaly/repository-service_pb.rb @@ -64,7 +64,6 @@ Google::Protobuf::DescriptorPool.generated_pool.build do end add_message "gitaly.FetchRemoteRequest" do optional :repository, :message, 1, "gitaly.Repository" - optional :remote, :string, 2 optional :force, :bool, 3 optional :no_tags, :bool, 4 optional :timeout, :int32, 5 diff --git a/ruby/proto/gitaly/repository-service_services_pb.rb b/ruby/proto/gitaly/repository-service_services_pb.rb index 248d7539b..7fc470362 100644 --- a/ruby/proto/gitaly/repository-service_services_pb.rb +++ b/ruby/proto/gitaly/repository-service_services_pb.rb @@ -35,6 +35,7 @@ module Gitaly rpc :WriteRef, ::Gitaly::WriteRefRequest, ::Gitaly::WriteRefResponse rpc :FindMergeBase, ::Gitaly::FindMergeBaseRequest, ::Gitaly::FindMergeBaseResponse rpc :CreateFork, ::Gitaly::CreateForkRequest, ::Gitaly::CreateForkResponse + # IsSquashInProgress is deprecated and will always return false. rpc :IsSquashInProgress, ::Gitaly::IsSquashInProgressRequest, ::Gitaly::IsSquashInProgressResponse rpc :CreateRepositoryFromURL, ::Gitaly::CreateRepositoryFromURLRequest, ::Gitaly::CreateRepositoryFromURLResponse # CreateBundle creates a bundle from all refs @@ -45,7 +46,15 @@ module Gitaly # GetConfig reads the target repository's gitconfig and streams its contents # back. Returns a NotFound error in case no gitconfig was found. rpc :GetConfig, ::Gitaly::GetConfigRequest, stream(::Gitaly::GetConfigResponse) + # SetConfig writes a set of config entries into the target repository's + # gitconfig. This RPC is deprecated with no general replacement: modifying + # the on-disk gitconfig is not supported anymore. The only usecase that is + # still supported is writing "gitlab.fullpath" via the new `SetFullPath()` + # RPC. rpc :SetConfig, ::Gitaly::SetConfigRequest, ::Gitaly::SetConfigResponse + # DeleteConfig deletes a set of config entries from the target repository's + # gitconfig. This RPC is deprecated with no replacement: modifying the + # on-disk gitconfig is not supported anymore. rpc :DeleteConfig, ::Gitaly::DeleteConfigRequest, ::Gitaly::DeleteConfigResponse rpc :FindLicense, ::Gitaly::FindLicenseRequest, ::Gitaly::FindLicenseResponse rpc :GetInfoAttributes, ::Gitaly::GetInfoAttributesRequest, stream(::Gitaly::GetInfoAttributesResponse) diff --git a/ruby/spec/gitaly/remote_service_spec.rb b/ruby/spec/gitaly/remote_service_spec.rb deleted file mode 100644 index 5dac8a6b4..000000000 --- a/ruby/spec/gitaly/remote_service_spec.rb +++ /dev/null @@ -1,45 +0,0 @@ -require 'spec_helper' - -describe Gitaly::RemoteService do - include IntegrationClient - include TestRepo - - subject { gitaly_stub(:RemoteService) } - - describe 'UpdateRemoteMirror' do - let(:call) { double(metadata: { 'gitaly-storage-path' => '/path/to/storage' }) } - let(:repo) { gitaly_repo('default', 'foobar.git') } - let(:remote) { 'my-remote' } - - context 'request does not have ssh_key and known_hosts set' do - it 'performs the mirroring update with an empty environment' do - request = Gitaly::UpdateRemoteMirrorRequest.new(repository: repo, ref_name: remote) - - allow(call).to receive(:each_remote_read).and_return(double(next: request, flat_map: [])) - allow(Gitlab::Git::Repository).to receive(:from_gitaly).and_return(repo) - allow_any_instance_of(Gitlab::Git::RemoteMirror).to receive(:update) - expect(Gitlab::Git::SshAuth).to receive(:new).with('', '') - - GitalyServer::RemoteService.new.update_remote_mirror(call) - end - end - - context 'request has ssh_key and known_hosts set' do - it 'calls GitlabProjects#fetch_remote with a custom GIT_SSH_COMMAND' do - request = Gitaly::UpdateRemoteMirrorRequest.new( - repository: repo, - ref_name: remote, - ssh_key: 'SSH KEY', - known_hosts: 'KNOWN HOSTS' - ) - - allow(call).to receive(:each_remote_read).and_return(double(next: request, flat_map: [])) - allow(Gitlab::Git::Repository).to receive(:from_gitaly).and_return(repo) - allow_any_instance_of(Gitlab::Git::RemoteMirror).to receive(:update) - expect(Gitlab::Git::SshAuth).to receive(:new).with('SSH KEY', 'KNOWN HOSTS') - - GitalyServer::RemoteService.new.update_remote_mirror(call) - end - end - end -end diff --git a/ruby/spec/lib/gitaly_server/remote_service_spec.rb b/ruby/spec/lib/gitaly_server/remote_service_spec.rb deleted file mode 100644 index 511b4f008..000000000 --- a/ruby/spec/lib/gitaly_server/remote_service_spec.rb +++ /dev/null @@ -1,21 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' - -describe GitalyServer::RemoteService do - describe '#update_remote_mirror' do - it 'assigns a limited number of divergent refs' do - stub_const("#{described_class}::DIVERGENT_REF_LIMIT", 2) - - mirror = double( - divergent_refs: %w[refs/heads/master refs/heads/develop refs/heads/stable] - ).as_null_object - stub_const('Gitlab::Git::RemoteMirror', mirror) - - call = double(to_a: [], to_ary: []).as_null_object - response = described_class.new.update_remote_mirror(call) - - expect(response.divergent_refs).to eq(%w[refs/heads/master refs/heads/develop]) - end - end -end diff --git a/ruby/spec/lib/gitlab/git/gitlab_projects_spec.rb b/ruby/spec/lib/gitlab/git/gitlab_projects_spec.rb index ac1ae4d67..9f7cf6dc7 100644 --- a/ruby/spec/lib/gitlab/git/gitlab_projects_spec.rb +++ b/ruby/spec/lib/gitlab/git/gitlab_projects_spec.rb @@ -94,34 +94,4 @@ describe Gitlab::Git::GitlabProjects do end end end - - describe '#delete_remote_branches' do - let(:remote_name) { 'remote-name' } - let(:branch_names) { 20.times.map { |i| "branch#{i}" } } - let(:env) { { 'GIT_SSH_COMMAND' => 'foo-command bar' } } - let(:cmd1) do - %W(#{Gitlab.config.git.bin_path} push -- #{remote_name}) + - branch_names[0, 10].map { |b| ':' + b } - end - let(:cmd2) do - %W(#{Gitlab.config.git.bin_path} push -- #{remote_name}) + - branch_names[10, 10].map { |b| ':' + b } - end - - subject { gl_projects.delete_remote_branches(remote_name, branch_names, env: env) } - - it 'executes the command' do - stub_unlimited_spawn(cmd1, tmp_repo_path, env, success: true) - stub_unlimited_spawn(cmd2, tmp_repo_path, env, success: true) - - is_expected.to be_truthy - end - - it 'fails' do - stub_unlimited_spawn(cmd1, tmp_repo_path, env, success: true) - stub_unlimited_spawn(cmd2, tmp_repo_path, env, success: false) - - is_expected.to be_falsy - end - end end diff --git a/ruby/spec/lib/gitlab/git/remote_mirror_spec.rb b/ruby/spec/lib/gitlab/git/remote_mirror_spec.rb deleted file mode 100644 index 1821a7aa9..000000000 --- a/ruby/spec/lib/gitlab/git/remote_mirror_spec.rb +++ /dev/null @@ -1,121 +0,0 @@ -require 'spec_helper' - -describe Gitlab::Git::RemoteMirror do - include TestRepo - - let(:repository) { gitlab_git_from_gitaly_with_gitlab_projects(new_mutable_test_repo) } - let(:gitlab_projects) { repository.gitlab_projects } - let(:ref_name) { 'remote' } - let(:ssh_key) { 'SSH KEY' } - let(:known_hosts) { 'KNOWN HOSTS' } - let(:ssh_auth) { Gitlab::Git::SshAuth.new(ssh_key, known_hosts) } - let(:gl_projects_timeout) { Gitlab::Git::RepositoryMirroring::GITLAB_PROJECTS_TIMEOUT } - let(:gl_projects_force) { true } - let(:env) { { 'GIT_SSH_COMMAND' => /ssh/ } } - - subject(:remote_mirror) do - described_class.new( - repository, - ref_name, - ssh_auth: ssh_auth, - only_branches_matching: [], - keep_divergent_refs: false - ) - end - - def ref(name) - double("ref-#{name}", name: name, dereferenced_target: double(id: name)) - end - - def tag(name) - Gitlab::Git::Tag.new(nil, name: "refs/tags/#{name}", target_commit: double(id: name)) - end - - describe '#update' do - context 'with wildcard protected branches' do - subject(:remote_mirror) do - described_class.new( - repository, - ref_name, - ssh_auth: ssh_auth, - only_branches_matching: ['master', '*-stable'], - keep_divergent_refs: false - ) - end - - it 'updates the remote repository' do - # Stub this check so we try to delete the obsolete tag - allow(repository).to receive(:ancestor?).and_return(true) - - expect(repository).to receive(:local_branches).and_return([ref('master'), ref('11-5-stable'), ref('unprotected')]) - expect(repository).to receive(:remote_branches) - .with(ref_name, env: env) - .and_return([ref('master'), ref('obsolete-branch')]) - - expect(repository).to receive(:tags).and_return([tag('v1.0.0'), tag('new-tag')]) - expect(repository).to receive(:remote_tags) - .with(ref_name, env: env) - .and_return([tag('v1.0.0'), tag('obsolete-tag')]) - - expect(gitlab_projects) - .to receive(:push_branches) - .with(ref_name, gl_projects_timeout, gl_projects_force, ['master', '11-5-stable'], env: env) - .and_return(true) - - expect(gitlab_projects) - .to receive(:push_branches) - .with(ref_name, gl_projects_timeout, gl_projects_force, ['refs/tags/v1.0.0', 'refs/tags/new-tag'], env: env) - .and_return(true) - - # Leave remote branches that do not match the protected branch filter - expect(gitlab_projects) - .not_to receive(:delete_remote_branches) - .with(ref_name, ['obsolete-branch'], env: env) - - expect(gitlab_projects) - .to receive(:delete_remote_branches) - .with(ref_name, ['refs/tags/obsolete-tag'], env: env) - .and_return(true) - - remote_mirror.update - end - end - - it 'updates the remote repository' do - # Stub this check so we try to delete the obsolete refs - allow(repository).to receive(:ancestor?).and_return(true) - - expect(repository).to receive(:local_branches).and_return([ref('master'), ref('new-branch')]) - expect(repository).to receive(:remote_branches) - .with(ref_name, env: env) - .and_return([ref('master'), ref('obsolete-branch')]) - - expect(repository).to receive(:tags).and_return([tag('v1.0.0'), tag('new-tag')]) - expect(repository).to receive(:remote_tags) - .with(ref_name, env: env) - .and_return([tag('v1.0.0'), tag('obsolete-tag')]) - - expect(gitlab_projects) - .to receive(:push_branches) - .with(ref_name, gl_projects_timeout, gl_projects_force, ['master', 'new-branch'], env: env) - .and_return(true) - - expect(gitlab_projects) - .to receive(:push_branches) - .with(ref_name, gl_projects_timeout, gl_projects_force, ['refs/tags/v1.0.0', 'refs/tags/new-tag'], env: env) - .and_return(true) - - expect(gitlab_projects) - .to receive(:delete_remote_branches) - .with(ref_name, ['obsolete-branch'], env: env) - .and_return(true) - - expect(gitlab_projects) - .to receive(:delete_remote_branches) - .with(ref_name, ['refs/tags/obsolete-tag'], env: env) - .and_return(true) - - remote_mirror.update - end - end -end diff --git a/ruby/spec/lib/gitlab/git/repository_mirroring_spec.rb b/ruby/spec/lib/gitlab/git/repository_mirroring_spec.rb deleted file mode 100644 index ee9512de4..000000000 --- a/ruby/spec/lib/gitlab/git/repository_mirroring_spec.rb +++ /dev/null @@ -1,68 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' - -describe Gitlab::Git::RepositoryMirroring do - class FakeRepository - include Gitlab::Git::RepositoryMirroring - - attr_reader :rugged - - def initialize(projects_stub, rugged_instance = nil) - @gitlab_projects = projects_stub - @rugged = rugged_instance - end - - def gitlab_projects_error - raise Gitlab::Git::CommandError, @gitlab_projects.output - end - end - - describe '#remote_branches' do - let(:projects_stub) { double.as_null_object } - let(:rugged_stub) { double.as_null_object } - - subject(:repository) { FakeRepository.new(projects_stub, rugged_stub) } - - it 'passes environment to `ls-remote`' do - env = { option_a: true, option_b: false } - - expect(repository).to receive(:list_remote_refs) - .with('remote_a', env: env) - .and_return([]) - - repository.remote_branches('remote_a', env: env) - end - end - - describe '#push_remote_branches' do - let(:projects_stub) { double.as_null_object } - - subject(:repository) { FakeRepository.new(projects_stub) } - - context 'with a successful first push' do - it 'returns true' do - expect(projects_stub).to receive(:push_branches) - .with('remote_a', anything, true, %w[master], env: {}) - .once - .and_return(true) - - expect(projects_stub).not_to receive(:output) - - expect(repository.push_remote_branches('remote_a', %w[master])).to eq(true) - end - end - - context 'with a failed push' do - it 'raises an error' do - output = "Oh no, push mirroring failed!" - allow(projects_stub).to receive(:output).and_return(output) - - expect(projects_stub).to receive(:push_branches).and_return(false) - - expect { repository.push_remote_branches('remote_a', %w[master develop]) } - .to raise_error(Gitlab::Git::CommandError, output) - end - end - end -end diff --git a/ruby/spec/lib/gitlab/git/repository_spec.rb b/ruby/spec/lib/gitlab/git/repository_spec.rb index 5061d1f41..03e9147d4 100644 --- a/ruby/spec/lib/gitlab/git/repository_spec.rb +++ b/ruby/spec/lib/gitlab/git/repository_spec.rb @@ -175,20 +175,6 @@ describe Gitlab::Git::Repository do # rubocop:disable Metrics/BlockLength end end - describe '#local_branches' do - let(:repository) { mutable_repository } - - before do - create_remote_branch('joe', 'remote_branch', 'master') - create_branch(repository, 'local_branch', 'master') - end - - it 'returns the local branches' do - expect(repository.local_branches.any? { |branch| branch.name == 'remote_branch' }).to eq(false) - expect(repository.local_branches.any? { |branch| branch.name == 'local_branch' }).to eq(true) - end - end - describe '#with_repo_branch_commit' do let(:start_repository) { Gitlab::Git::RemoteRepository.new(source_repository) } let(:start_commit) { source_repository.commit } @@ -304,30 +290,6 @@ describe Gitlab::Git::Repository do # rubocop:disable Metrics/BlockLength end end - describe 'remotes' do - let(:repository) { mutable_repository } - let(:remote_name) { 'my-remote' } - let(:url) { 'http://my-repo.git' } - - describe '#add_remote' do - let(:mirror_refmap) { '+refs/*:refs/*' } - - it 'added the remote' do - begin - repository_rugged.remotes.delete(remote_name) - rescue Rugged::ConfigError # rubocop:disable Lint/HandleExceptions - end - - repository.add_remote(remote_name, url, mirror_refmap: mirror_refmap) - - expect(repository_rugged.remotes[remote_name]).not_to be_nil - expect(repository_rugged.config["remote.#{remote_name}.mirror"]).to eq('true') - expect(repository_rugged.config["remote.#{remote_name}.prune"]).to eq('true') - expect(repository_rugged.config["remote.#{remote_name}.fetch"]).to eq(mirror_refmap) - end - end - end - describe '#cleanup' do context 'when Rugged has been called' do it 'calls close on Rugged::Repository' do diff --git a/ruby/spec/lib/gitlab/ref_matcher_spec.rb b/ruby/spec/lib/gitlab/ref_matcher_spec.rb deleted file mode 100644 index 71d06a65d..000000000 --- a/ruby/spec/lib/gitlab/ref_matcher_spec.rb +++ /dev/null @@ -1,100 +0,0 @@ -require 'spec_helper' - -describe GitLab::RefMatcher do - subject { described_class.new(pattern) } - - describe "#matches?" do - context "when the ref pattern is not a wildcard" do - let(:pattern) { 'production/some-branch' } - - it "returns true for branch names that are an exact match" do - expect(subject.matches?('production/some-branch')).to be true - end - - it "returns false for branch names that are not an exact match" do - expect(subject.matches?("staging/some-branch")).to be false - end - end - - context "when the ref pattern name contains wildcard(s)" do - context "when there is a single '*'" do - let(:pattern) { 'production/*' } - - it "returns true for branch names matching the wildcard" do - expect(subject.matches?("production/some-branch")).to be true - expect(subject.matches?("production/")).to be true - end - - it "returns false for branch names not matching the wildcard" do - expect(subject.matches?("staging/some-branch")).to be false - expect(subject.matches?("production")).to be false - end - end - - context "when the wildcard begins with a '*'" do - let(:pattern) { '*-stable' } - - it "returns true for branch names matching the wildcard" do - expect(subject.matches?('11-0-stable')).to be true - end - - it "returns false for branch names not matching the wildcard" do - expect(subject.matches?('11-0-stable-test')).to be false - end - end - - context "when the wildcard contains regex symbols other than a '*'" do - let(:pattern) { "pro.duc.tion/*" } - - it "returns true for branch names matching the wildcard" do - expect(subject.matches?("pro.duc.tion/some-branch")).to be true - end - - it "returns false for branch names not matching the wildcard" do - expect(subject.matches?("production/some-branch")).to be false - expect(subject.matches?("proXducYtion/some-branch")).to be false - end - end - - context "when there are '*'s at either end" do - let(:pattern) { "*/production/*" } - - it "returns true for branch names matching the wildcard" do - expect(subject.matches?("gitlab/production/some-branch")).to be true - expect(subject.matches?("/production/some-branch")).to be true - expect(subject.matches?("gitlab/production/")).to be true - expect(subject.matches?("/production/")).to be true - end - - it "returns false for branch names not matching the wildcard" do - expect(subject.matches?("gitlabproductionsome-branch")).to be false - expect(subject.matches?("production/some-branch")).to be false - expect(subject.matches?("gitlab/production")).to be false - expect(subject.matches?("production")).to be false - end - end - - context "when there are arbitrarily placed '*'s" do - let(:pattern) { "pro*duction/*/gitlab/*" } - - it "returns true for branch names matching the wildcard" do - expect(subject.matches?("production/some-branch/gitlab/second-branch")).to be true - expect(subject.matches?("proXYZduction/some-branch/gitlab/second-branch")).to be true - expect(subject.matches?("proXYZduction/gitlab/gitlab/gitlab")).to be true - expect(subject.matches?("proXYZduction//gitlab/")).to be true - expect(subject.matches?("proXYZduction/some-branch/gitlab/")).to be true - expect(subject.matches?("proXYZduction//gitlab/some-branch")).to be true - end - - it "returns false for branch names not matching the wildcard" do - expect(subject.matches?("production/some-branch/not-gitlab/second-branch")).to be false - expect(subject.matches?("prodXYZuction/some-branch/gitlab/second-branch")).to be false - expect(subject.matches?("proXYZduction/gitlab/some-branch/gitlab")).to be false - expect(subject.matches?("proXYZduction/gitlab//")).to be false - expect(subject.matches?("proXYZduction/gitlab/")).to be false - expect(subject.matches?("proXYZduction//some-branch/gitlab")).to be false - end - end - end - end -end |