diff options
author | James Fargher <proglottis@gmail.com> | 2020-10-20 03:21:02 +0300 |
---|---|---|
committer | James Fargher <proglottis@gmail.com> | 2020-12-03 01:49:09 +0300 |
commit | 35bb5b034e1e80a8aadaf77fb23c26411e6d3ad7 (patch) | |
tree | b1b78c0be128287e08211b4188d9c9fe5fd74cb4 /internal/gitaly/service/operations/merge.go | |
parent | c06b7d8c8d5373294138005db807d61e939dd0bf (diff) |
Port UserRevert to go
Diffstat (limited to 'internal/gitaly/service/operations/merge.go')
-rw-r--r-- | internal/gitaly/service/operations/merge.go | 44 |
1 files changed, 28 insertions, 16 deletions
diff --git a/internal/gitaly/service/operations/merge.go b/internal/gitaly/service/operations/merge.go index 64c6ad276..aa44e1861 100644 --- a/internal/gitaly/service/operations/merge.go +++ b/internal/gitaly/service/operations/merge.go @@ -8,6 +8,7 @@ import ( "gitlab.com/gitlab-org/gitaly/internal/command" "gitlab.com/gitlab-org/gitaly/internal/git" + "gitlab.com/gitlab-org/gitaly/internal/git/repository" "gitlab.com/gitlab-org/gitaly/internal/git2go" "gitlab.com/gitlab-org/gitaly/internal/gitaly/rubyserver" "gitlab.com/gitlab-org/gitaly/internal/helper" @@ -209,24 +210,11 @@ func (s *Server) UserFFBranch(ctx context.Context, in *gitalypb.UserFFBranchRequ return nil, helper.ErrInvalidArgument(err) } - cmd, err := git.SafeCmd(ctx, in.Repository, nil, git.SubCmd{ - Name: "merge-base", - Flags: []git.Option{git.Flag{Name: "--is-ancestor"}}, - Args: []string{revision, in.CommitId}, - }) + ancestor, err := isAncestor(ctx, in.Repository, revision, in.CommitId) if err != nil { - return nil, helper.ErrInternal(err) + return nil, err } - if err := cmd.Wait(); err != nil { - status, ok := command.ExitStatus(err) - if !ok { - return nil, helper.ErrInternal(err) - } - // --is-ancestor errors are signaled by a non-zero status that is not 1. - // https://git-scm.com/docs/git-merge-base#Documentation/git-merge-base.txt---is-ancestor - if status != 1 { - return nil, helper.ErrInvalidArgument(err) - } + if !ancestor { return nil, helper.ErrPreconditionFailedf("not fast forward") } @@ -378,3 +366,27 @@ func (s *Server) UserMergeToRef(ctx context.Context, in *gitalypb.UserMergeToRef return client.UserMergeToRef(clientCtx, in) } + +func isAncestor(ctx context.Context, repo repository.GitRepo, ancestor, descendant string) (bool, error) { + cmd, err := git.SafeCmd(ctx, repo, nil, git.SubCmd{ + Name: "merge-base", + Flags: []git.Option{git.Flag{Name: "--is-ancestor"}}, + Args: []string{ancestor, descendant}, + }) + if err != nil { + return false, helper.ErrInternalf("isAncestor: %w", err) + } + if err := cmd.Wait(); err != nil { + status, ok := command.ExitStatus(err) + if !ok { + return false, helper.ErrInternalf("isAncestor: %w", err) + } + // --is-ancestor errors are signaled by a non-zero status that is not 1. + // https://git-scm.com/docs/git-merge-base#Documentation/git-merge-base.txt---is-ancestor + if status != 1 { + return false, helper.ErrInvalidArgumentf("isAncestor: %w", err) + } + return false, nil + } + return true, nil +} |