diff options
Diffstat (limited to 'internal/gitaly/service/operations/cherry_pick.go')
-rw-r--r-- | internal/gitaly/service/operations/cherry_pick.go | 149 |
1 files changed, 59 insertions, 90 deletions
diff --git a/internal/gitaly/service/operations/cherry_pick.go b/internal/gitaly/service/operations/cherry_pick.go index 23b0566fd..8732f84cb 100644 --- a/internal/gitaly/service/operations/cherry_pick.go +++ b/internal/gitaly/service/operations/cherry_pick.go @@ -11,7 +11,6 @@ import ( "gitlab.com/gitlab-org/gitaly/v15/internal/git/updateref" "gitlab.com/gitlab-org/gitaly/v15/internal/git2go" "gitlab.com/gitlab-org/gitaly/v15/internal/helper" - "gitlab.com/gitlab-org/gitaly/v15/internal/metadata/featureflag" "gitlab.com/gitlab-org/gitaly/v15/proto/go/gitalypb" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" @@ -64,62 +63,43 @@ func (s *Server) UserCherryPick(ctx context.Context, req *gitalypb.UserCherryPic Mainline: mainline, }) if err != nil { - if featureflag.CherryPickStructuredErrors.IsEnabled(ctx) { - var conflictErr git2go.ConflictingFilesError - var emptyErr git2go.EmptyError - - switch { - case errors.As(err, &conflictErr): - conflictingFiles := make([][]byte, 0, len(conflictErr.ConflictingFiles)) - for _, conflictingFile := range conflictErr.ConflictingFiles { - conflictingFiles = append(conflictingFiles, []byte(conflictingFile)) - } - - detailedErr, errGeneratingDetailedErr := helper.ErrWithDetails( - helper.ErrFailedPreconditionf("cherry pick: %w", err), - &gitalypb.UserCherryPickError{ - Error: &gitalypb.UserCherryPickError_CherryPickConflict{ - CherryPickConflict: &gitalypb.MergeConflictError{ - ConflictingFiles: conflictingFiles, - }, + var conflictErr git2go.ConflictingFilesError + var emptyErr git2go.EmptyError + + switch { + case errors.As(err, &conflictErr): + conflictingFiles := make([][]byte, 0, len(conflictErr.ConflictingFiles)) + for _, conflictingFile := range conflictErr.ConflictingFiles { + conflictingFiles = append(conflictingFiles, []byte(conflictingFile)) + } + + detailedErr, errGeneratingDetailedErr := helper.ErrWithDetails( + helper.ErrFailedPreconditionf("cherry pick: %w", err), + &gitalypb.UserCherryPickError{ + Error: &gitalypb.UserCherryPickError_CherryPickConflict{ + CherryPickConflict: &gitalypb.MergeConflictError{ + ConflictingFiles: conflictingFiles, }, }, - ) - if errGeneratingDetailedErr != nil { - return nil, helper.ErrInternalf("error details: %w", err) - } - - return nil, detailedErr - case errors.As(err, &emptyErr): - detailedErr, errGeneratingDetailedErr := helper.ErrWithDetails( - helper.ErrFailedPrecondition(err), - &gitalypb.UserCherryPickError{ - Error: &gitalypb.UserCherryPickError_ChangesAlreadyApplied{}, - }, - ) - if errGeneratingDetailedErr != nil { - return nil, helper.ErrInternalf("error details: %w", err) - } - - return nil, detailedErr - case errors.Is(err, git2go.ErrInvalidArgument): - return nil, helper.ErrInvalidArgument(err) - default: - return nil, helper.ErrInternalf("cherry-pick command: %w", err) + }, + ) + if errGeneratingDetailedErr != nil { + return nil, helper.ErrInternalf("error details: %w", err) } - } - switch { - case errors.As(err, &git2go.HasConflictsError{}) || errors.As(err, &git2go.ConflictingFilesError{}): - return &gitalypb.UserCherryPickResponse{ - CreateTreeError: err.Error(), - CreateTreeErrorCode: gitalypb.UserCherryPickResponse_CONFLICT, - }, nil - case errors.As(err, &git2go.EmptyError{}): - return &gitalypb.UserCherryPickResponse{ - CreateTreeError: err.Error(), - CreateTreeErrorCode: gitalypb.UserCherryPickResponse_EMPTY, - }, nil + return nil, detailedErr + case errors.As(err, &emptyErr): + detailedErr, errGeneratingDetailedErr := helper.ErrWithDetails( + helper.ErrFailedPrecondition(err), + &gitalypb.UserCherryPickError{ + Error: &gitalypb.UserCherryPickError_ChangesAlreadyApplied{}, + }, + ) + if errGeneratingDetailedErr != nil { + return nil, helper.ErrInternalf("error details: %w", err) + } + + return nil, detailedErr case errors.Is(err, git2go.ErrInvalidArgument): return nil, helper.ErrInvalidArgument(err) default: @@ -148,57 +128,46 @@ func (s *Server) UserCherryPick(ctx context.Context, req *gitalypb.UserCherryPic return nil, err } if !ancestor { - if featureflag.CherryPickStructuredErrors.IsEnabled(ctx) { - detailedErr, errGeneratingDetailedErr := helper.ErrWithDetails( - helper.ErrFailedPrecondition(errors.New("cherry-pick: branch diverged")), - &gitalypb.UserCherryPickError{ - Error: &gitalypb.UserCherryPickError_TargetBranchDiverged{ - TargetBranchDiverged: &gitalypb.NotAncestorError{ - ParentRevision: []byte(oldrev.Revision()), - ChildRevision: []byte(newrev), - }, + detailedErr, errGeneratingDetailedErr := helper.ErrWithDetails( + helper.ErrFailedPrecondition(errors.New("cherry-pick: branch diverged")), + &gitalypb.UserCherryPickError{ + Error: &gitalypb.UserCherryPickError_TargetBranchDiverged{ + TargetBranchDiverged: &gitalypb.NotAncestorError{ + ParentRevision: []byte(oldrev.Revision()), + ChildRevision: []byte(newrev), }, - }) - - if errGeneratingDetailedErr != nil { - return nil, helper.ErrInternalf("error details: %w", err) - } + }, + }) - return nil, detailedErr + if errGeneratingDetailedErr != nil { + return nil, helper.ErrInternalf("error details: %w", err) } - return &gitalypb.UserCherryPickResponse{ - CommitError: "Branch diverged", - }, nil + return nil, detailedErr } } if err := s.updateReferenceWithHooks(ctx, req.GetRepository(), req.User, quarantineDir, referenceName, newrev, oldrev); err != nil { - if featureflag.CherryPickStructuredErrors.IsEnabled(ctx) { - var customHookErr updateref.CustomHookError - - if errors.As(err, &customHookErr) { - detailedErr, errGeneratingDetailedErr := helper.ErrWithDetails( - helper.ErrFailedPrecondition(errors.New("access check failed")), - &gitalypb.UserCherryPickError{ - Error: &gitalypb.UserCherryPickError_AccessCheck{ - AccessCheck: &gitalypb.AccessCheckError{ - ErrorMessage: strings.TrimSuffix(customHookErr.Error(), "\n"), - }, - }, - }) + var customHookErr updateref.CustomHookError - if errGeneratingDetailedErr != nil { - return nil, helper.ErrInternalf("error details: %w", err) - } + if errors.As(err, &customHookErr) { + detailedErr, errGeneratingDetailedErr := helper.ErrWithDetails( + helper.ErrFailedPrecondition(errors.New("access check failed")), + &gitalypb.UserCherryPickError{ + Error: &gitalypb.UserCherryPickError_AccessCheck{ + AccessCheck: &gitalypb.AccessCheckError{ + ErrorMessage: strings.TrimSuffix(customHookErr.Error(), "\n"), + }, + }, + }) - return nil, detailedErr + if errGeneratingDetailedErr != nil { + return nil, helper.ErrInternalf("error details: %w", err) } - return nil, fmt.Errorf("update reference with hooks: %w", err) + return nil, detailedErr } - var customHookErr updateref.CustomHookError if errors.As(err, &customHookErr) { return &gitalypb.UserCherryPickResponse{ PreReceiveError: customHookErr.Error(), |