Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitaly.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPatrick Steinhardt <psteinhardt@gitlab.com>2020-09-07 10:29:19 +0300
committerPatrick Steinhardt <psteinhardt@gitlab.com>2020-09-07 11:16:11 +0300
commit86c5d708df567f605fe44f48389c504b9f170b3d (patch)
tree33274ea1d9cc584cce18df4763294c2582ab0960 /internal/gitaly/service/operations/merge.go
parent8a0d83b496eaff459d55bc6825428f648059e8d9 (diff)
gitaly: Move Gitaly-specific code into `internal/gitaly`
Since the introduction of Praefect, our code layout started to become confusing: while Praefect code lives in `internal/praefect`, Gitaly-specific code is all over the place and not neatly singled out. This makes it hard at times to tell apart Praefect- and Gitaly-specific from generic code. To improve the situation, this commit thus moves most of the server specific code into a new `internal/gitaly` package. Currently, this is the `internal/config`, `internal/server`, `internal/service` and `internal/rubyserver` packages, which are all main components of Gitaly. The move was realized with the following script: #!/bin/sh mkdir -p internal/gitaly git mv internal/{config,server,service,rubyserver} internal/gitaly/ find . -name '*.go' -exec sed -i \ -e 's|gitlab-org/gitaly/internal/rubyserver|gitlab-org/gitaly/internal/gitaly/rubyserver|' \ -e 's|gitlab-org/gitaly/internal/server|gitlab-org/gitaly/internal/gitaly/server|' \ -e 's|gitlab-org/gitaly/internal/service|gitlab-org/gitaly/internal/gitaly/service|' \ -e 's|gitlab-org/gitaly/internal/config|gitlab-org/gitaly/internal/gitaly/config|' {} \; In addition to that, some minor adjustments were needed for tests which used relative paths.
Diffstat (limited to 'internal/gitaly/service/operations/merge.go')
-rw-r--r--internal/gitaly/service/operations/merge.go134
1 files changed, 134 insertions, 0 deletions
diff --git a/internal/gitaly/service/operations/merge.go b/internal/gitaly/service/operations/merge.go
new file mode 100644
index 000000000..4cdc43d5d
--- /dev/null
+++ b/internal/gitaly/service/operations/merge.go
@@ -0,0 +1,134 @@
+package operations
+
+import (
+ "context"
+ "fmt"
+ "strings"
+
+ "gitlab.com/gitlab-org/gitaly/internal/gitaly/rubyserver"
+ "gitlab.com/gitlab-org/gitaly/internal/helper"
+ "gitlab.com/gitlab-org/gitaly/proto/go/gitalypb"
+)
+
+func (s *server) UserMergeBranch(bidi gitalypb.OperationService_UserMergeBranchServer) error {
+ firstRequest, err := bidi.Recv()
+ if err != nil {
+ return err
+ }
+
+ ctx := bidi.Context()
+ client, err := s.ruby.OperationServiceClient(ctx)
+ if err != nil {
+ return err
+ }
+
+ clientCtx, err := rubyserver.SetHeaders(ctx, firstRequest.GetRepository())
+ if err != nil {
+ return err
+ }
+
+ rubyBidi, err := client.UserMergeBranch(clientCtx)
+ if err != nil {
+ return err
+ }
+
+ if err := rubyBidi.Send(firstRequest); err != nil {
+ return err
+ }
+
+ return rubyserver.ProxyBidi(
+ func() error {
+ request, err := bidi.Recv()
+ if err != nil {
+ return err
+ }
+
+ return rubyBidi.Send(request)
+ },
+ rubyBidi,
+ func() error {
+ response, err := rubyBidi.Recv()
+ if err != nil {
+ return err
+ }
+
+ return bidi.Send(response)
+ },
+ )
+}
+
+func validateFFRequest(in *gitalypb.UserFFBranchRequest) error {
+ if len(in.Branch) == 0 {
+ return fmt.Errorf("empty branch name")
+ }
+
+ if in.User == nil {
+ return fmt.Errorf("empty user")
+ }
+
+ if in.CommitId == "" {
+ return fmt.Errorf("empty commit id")
+ }
+
+ return nil
+}
+
+func (s *server) UserFFBranch(ctx context.Context, in *gitalypb.UserFFBranchRequest) (*gitalypb.UserFFBranchResponse, error) {
+ if err := validateFFRequest(in); err != nil {
+ return nil, helper.ErrInvalidArgument(err)
+ }
+
+ client, err := s.ruby.OperationServiceClient(ctx)
+ if err != nil {
+ return nil, err
+ }
+
+ clientCtx, err := rubyserver.SetHeaders(ctx, in.GetRepository())
+ if err != nil {
+ return nil, err
+ }
+
+ return client.UserFFBranch(clientCtx, in)
+}
+
+func validateUserMergeToRefRequest(in *gitalypb.UserMergeToRefRequest) error {
+ if len(in.FirstParentRef) == 0 && len(in.Branch) == 0 {
+ return fmt.Errorf("empty first parent ref and branch name")
+ }
+
+ if in.User == nil {
+ return fmt.Errorf("empty user")
+ }
+
+ if in.SourceSha == "" {
+ return fmt.Errorf("empty source SHA")
+ }
+
+ if len(in.TargetRef) == 0 {
+ return fmt.Errorf("empty target ref")
+ }
+
+ if !strings.HasPrefix(string(in.TargetRef), "refs/merge-requests") {
+ return fmt.Errorf("invalid target ref")
+ }
+
+ return nil
+}
+
+func (s *server) UserMergeToRef(ctx context.Context, in *gitalypb.UserMergeToRefRequest) (*gitalypb.UserMergeToRefResponse, error) {
+ if err := validateUserMergeToRefRequest(in); err != nil {
+ return nil, helper.ErrInvalidArgument(err)
+ }
+
+ client, err := s.ruby.OperationServiceClient(ctx)
+ if err != nil {
+ return nil, helper.ErrInternal(err)
+ }
+
+ clientCtx, err := rubyserver.SetHeaders(ctx, in.GetRepository())
+ if err != nil {
+ return nil, err
+ }
+
+ return client.UserMergeToRef(clientCtx, in)
+}