diff options
author | Patrick Steinhardt <psteinhardt@gitlab.com> | 2020-09-07 10:29:19 +0300 |
---|---|---|
committer | Patrick Steinhardt <psteinhardt@gitlab.com> | 2020-09-07 11:16:11 +0300 |
commit | 86c5d708df567f605fe44f48389c504b9f170b3d (patch) | |
tree | 33274ea1d9cc584cce18df4763294c2582ab0960 /internal/gitaly/service/operations/merge.go | |
parent | 8a0d83b496eaff459d55bc6825428f648059e8d9 (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.go | 134 |
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) +} |