diff options
author | Pavlo Strokov <pstrokov@gitlab.com> | 2021-07-29 13:25:12 +0300 |
---|---|---|
committer | Pavlo Strokov <pstrokov@gitlab.com> | 2021-07-29 13:25:12 +0300 |
commit | 4a4ea7c0489b0eb0f7a65c65e5b15c35e3d16f14 (patch) | |
tree | 4f9befc5b812b3d0547930834f1f6a8661d13d4f | |
parent | ed5d96d30be3a4bf15193f5c1291dd9629c1691f (diff) | |
parent | 766e37dc7cc02a61225ee65bbd2ebe16c91e9663 (diff) |
Merge branch 'ps-precondition-fail-on-merge' into 'master'
operations: Make UserMergeBranch return PreconditionFailed on conflicts
Closes #3195
See merge request gitlab-org/gitaly!3700
-rw-r--r-- | internal/gitaly/service/operations/merge.go | 7 | ||||
-rw-r--r-- | internal/gitaly/service/operations/merge_test.go | 42 |
2 files changed, 48 insertions, 1 deletions
diff --git a/internal/gitaly/service/operations/merge.go b/internal/gitaly/service/operations/merge.go index 846c578e5..79e1598e7 100644 --- a/internal/gitaly/service/operations/merge.go +++ b/internal/gitaly/service/operations/merge.go @@ -78,7 +78,12 @@ func (s *Server) UserMergeBranch(stream gitalypb.OperationService_UserMergeBranc if errors.Is(err, git2go.ErrInvalidArgument) { return helper.ErrInvalidArgument(err) } - return err + + if strings.Contains(err.Error(), "could not auto-merge due to conflicts") { + return helper.ErrFailedPreconditionf("Failed to merge for source_sha %s into target_sha %s", + firstRequest.CommitId, revision.String()) + } + return helper.ErrInternal(err) } mergeOID, err := git.NewObjectIDFromHex(merge.CommitID) diff --git a/internal/gitaly/service/operations/merge_test.go b/internal/gitaly/service/operations/merge_test.go index b91846b69..eb7a08cce 100644 --- a/internal/gitaly/service/operations/merge_test.go +++ b/internal/gitaly/service/operations/merge_test.go @@ -15,6 +15,7 @@ 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/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/testhelper" "gitlab.com/gitlab-org/gitaly/v14/internal/testhelper/testassert" @@ -405,6 +406,47 @@ func TestFailedMergeDueToHooks(t *testing.T) { } } +func TestUserMergeBranch_conflict(t *testing.T) { + t.Parallel() + ctx, cancel := testhelper.Context() + defer cancel() + + ctx, cfg, repoProto, repoPath, client := setupOperationsService(t, ctx) + + const mergeIntoBranch = "mergeIntoBranch" + const mergeFromBranch = "mergeFromBranch" + const conflictingFile = "file" + + baseCommit := gittest.WriteCommit(t, cfg, repoPath, gittest.WithBranch(mergeIntoBranch), gittest.WithTreeEntries(gittest.TreeEntry{ + Mode: "100644", Path: conflictingFile, Content: "data", + })) + + gittest.Exec(t, cfg, "-C", repoPath, "branch", mergeFromBranch, baseCommit.String()) + + divergedInto := gittest.WriteCommit(t, cfg, repoPath, gittest.WithBranch(mergeIntoBranch), gittest.WithTreeEntries(gittest.TreeEntry{ + Mode: "100644", Path: conflictingFile, Content: "data-1", + })) + + divergedFrom := gittest.WriteCommit(t, cfg, repoPath, gittest.WithBranch(mergeFromBranch), gittest.WithTreeEntries(gittest.TreeEntry{ + Mode: "100644", Path: conflictingFile, Content: "data-2", + })) + + mergeBidi, err := client.UserMergeBranch(ctx) + require.NoError(t, err) + + require.NoError(t, mergeBidi.Send(&gitalypb.UserMergeBranchRequest{ + Repository: repoProto, + User: gittest.TestUser, + Branch: []byte(mergeIntoBranch), + CommitId: divergedFrom.String(), + Message: []byte("msg"), + }), "send first request") + + firstResponse, err := mergeBidi.Recv() + testassert.GrpcEqualErr(t, helper.ErrFailedPreconditionf("Failed to merge for source_sha %s into target_sha %s", divergedFrom, divergedInto), err) + require.Nil(t, firstResponse) +} + func TestSuccessfulUserFFBranchRequest(t *testing.T) { t.Parallel() ctx, cancel := testhelper.Context() |