diff options
author | Ævar Arnfjörð Bjarmason <avarab@gmail.com> | 2020-11-23 16:33:01 +0300 |
---|---|---|
committer | Ævar Arnfjörð Bjarmason <avarab@gmail.com> | 2020-11-23 16:33:01 +0300 |
commit | 47de124c7a8614928d1dff5f055b5b5a956adcb9 (patch) | |
tree | f4598c086c22530b3dd9186627e6236e89ce6cd3 | |
parent | 8b08635084240888b5a06efbb56ebca836a13dbf (diff) |
made it this far
-rw-r--r-- | internal/gitaly/service/operations/tags.go | 101 | ||||
-rw-r--r-- | internal/gitaly/service/operations/tags_test.go | 1 | ||||
-rw-r--r-- | internal/gitaly/service/ref/refs.go | 4 |
3 files changed, 103 insertions, 3 deletions
diff --git a/internal/gitaly/service/operations/tags.go b/internal/gitaly/service/operations/tags.go index f17d15ea2..d4c61608c 100644 --- a/internal/gitaly/service/operations/tags.go +++ b/internal/gitaly/service/operations/tags.go @@ -7,6 +7,7 @@ import ( "gitlab.com/gitlab-org/gitaly/internal/git" "gitlab.com/gitlab-org/gitaly/internal/gitaly/rubyserver" + "gitlab.com/gitlab-org/gitaly/internal/gitaly/service/ref" "gitlab.com/gitlab-org/gitaly/internal/helper" "gitlab.com/gitlab-org/gitaly/internal/metadata/featureflag" "gitlab.com/gitlab-org/gitaly/proto/go/gitalypb" @@ -78,7 +79,7 @@ func (s *server) UserCreateTag(ctx context.Context, req *gitalypb.UserCreateTagR return s.UserCreateTagRuby(ctx, req) } // TODO: Implement GoUserCreateTag - return s.UserCreateTagRuby(ctx, req) + return s.UserCreateTagGo(ctx, req) } func (s *server) UserCreateTagRuby(ctx context.Context, req *gitalypb.UserCreateTagRequest) (*gitalypb.UserCreateTagResponse, error) { @@ -94,3 +95,101 @@ func (s *server) UserCreateTagRuby(ctx context.Context, req *gitalypb.UserCreate return client.UserCreateTag(clientCtx, req) } + +// Relvant Ruby code: + +// repository: @gitaly_repo, +// user: Gitlab::Git::User.from_gitlab(user).to_gitaly, +// tag_name: encode_binary(tag_name), +// target_revision: encode_binary(target), +// message: encode_binary(message.to_s) + +// def user_create_tag(request, call) +// repo = Gitlab::Git::Repository.from_gitaly(request.repository, call) +// transaction = Praefect::Transaction.from_metadata(call.metadata) + +// gitaly_user = get_param!(request, :user) +// user = Gitlab::Git::User.from_gitaly(gitaly_user) + +// tag_name = get_param!(request, :tag_name) + +// target_revision = get_param!(request, :target_revision) + +// created_tag = repo.add_tag(tag_name, user: user, target: target_revision, message: request.message.presence, transaction: transaction) +// Gitaly::UserCreateTagResponse.new unless created_tag + +// rugged_commit = created_tag.dereferenced_target.rugged_commit +// commit = gitaly_commit_from_rugged(rugged_commit) +// tag = gitaly_tag_from_gitlab_tag(created_tag, commit) + +// Gitaly::UserCreateTagResponse.new(tag: tag) +// rescue Gitlab::Git::Repository::InvalidRef => e +// raise GRPC::FailedPrecondition.new(e.message) +// rescue Gitlab::Git::Repository::TagExistsError +// Gitaly::UserCreateTagResponse.new(exists: true) +// rescue Gitlab::Git::PreReceiveError => e +// Gitaly::UserCreateTagResponse.new(pre_receive_error: set_utf8!(e.message)) +// end + + +func (s *server) UserCreateTagGo(ctx context.Context, req *gitalypb.UserCreateTagRequest) (*gitalypb.UserCreateTagResponse, error) { + if len(req.TagName) == 0 { + return nil, status.Errorf(codes.InvalidArgument, "Bad Request (empty tag name)") + } + + if req.User == nil { + return nil, status.Errorf(codes.InvalidArgument, "Bad Request (empty user)") + } + + // Note that "TargetRevision" isn't just a "type commit", we + // also accept any other SHA-1 (tree, blob) when creating + // tags. + if len(req.TargetRevision) == 0 { + return nil, status.Errorf(codes.InvalidArgument, "Bad Request (empty target revision)") + } + + targetOid, err := git.NewRepository(req.Repository).ResolveRefish(ctx, string(req.TargetRevision)) + if err != nil { + return nil, status.Errorf(codes.FailedPrecondition, "Bad Request (target does not exist)") + } + + tag := fmt.Sprintf("refs/tags/%s", req.TagName) + + if req.Message != nil { + return nil, status.Errorf(codes.InvalidArgument, "Bad Request (we don't handle annotated yet)") + } + + if err := s.updateReferenceWithHooks(ctx, req.Repository, req.User, tag, targetOid, git.NullSHA); err != nil { + var preReceiveError preReceiveError + if errors.As(err, &preReceiveError) { + return &gitalypb.UserCreateTagResponse{ + PreReceiveError: preReceiveError.message, + }, nil + } + + var updateRefError updateRefError + if errors.As(err, &updateRefError) { + return &gitalypb.UserCreateTagResponse{ + Exists: true, + }, nil + } + + + return nil, err + } + + // rpcRequest := &gitalypb.FindTagRequest{ + // Repository: req.Repository, + // TagName: []byte(tag), + // } + + // resp, err := client.FindTag(ctx, rpcRequest) + + var tagObj *gitalypb.Tag + if tagObj, err = ref.RawFindTag(ctx, req.Repository, []byte(tag)); err != nil { + return nil, helper.ErrInternal(err) + } + return &gitalypb.UserCreateTagResponse{ + Tag: tagObj, + }, nil +} diff --git a/internal/gitaly/service/operations/tags_test.go b/internal/gitaly/service/operations/tags_test.go index 0e73f07d3..61a9ac873 100644 --- a/internal/gitaly/service/operations/tags_test.go +++ b/internal/gitaly/service/operations/tags_test.go @@ -490,6 +490,7 @@ func testFailedUserCreateTagRequestDueToValidation(t *testing.T, ctx context.Con user: testhelper.TestUser, code: codes.FailedPrecondition, }, + // TODO: Test for TagExistsError } for _, testCase := range testCases { diff --git a/internal/gitaly/service/ref/refs.go b/internal/gitaly/service/ref/refs.go index e649869c2..5aecb1a70 100644 --- a/internal/gitaly/service/ref/refs.go +++ b/internal/gitaly/service/ref/refs.go @@ -371,7 +371,7 @@ func (s *server) FindTag(ctx context.Context, in *gitalypb.FindTagRequest) (*git var tag *gitalypb.Tag - if tag, err = findTag(ctx, in.GetRepository(), in.GetTagName()); err != nil { + if tag, err = RawFindTag(ctx, in.GetRepository(), in.GetTagName()); err != nil { return nil, helper.ErrInternal(err) } @@ -412,7 +412,7 @@ func parseTagLine(c *catfile.Batch, tagLine string) (*gitalypb.Tag, error) { } } -func findTag(ctx context.Context, repository *gitalypb.Repository, tagName []byte) (*gitalypb.Tag, error) { +func RawFindTag(ctx context.Context, repository *gitalypb.Repository, tagName []byte) (*gitalypb.Tag, error) { tagCmd, err := git.SafeCmd(ctx, repository, nil, git.SubCmd{ Name: "tag", |