89 lines
2.3 KiB
Ruby
89 lines
2.3 KiB
Ruby
module Gitlab
|
|
module Git
|
|
class Tag < Ref
|
|
extend Gitlab::EncodingHelper
|
|
|
|
attr_reader :object_sha, :repository
|
|
|
|
MAX_TAG_MESSAGE_DISPLAY_SIZE = 10.megabytes
|
|
SERIALIZE_KEYS = %i[name target target_commit message].freeze
|
|
|
|
attr_accessor *SERIALIZE_KEYS # rubocop:disable Lint/AmbiguousOperator
|
|
|
|
class << self
|
|
def get_message(repository, tag_id)
|
|
BatchLoader.for({ repository: repository, tag_id: tag_id }).batch do |items, loader|
|
|
items_by_repo = items.group_by { |i| i[:repository] }
|
|
|
|
items_by_repo.each do |repo, items|
|
|
tag_ids = items.map { |i| i[:tag_id] }
|
|
|
|
messages = get_messages(repository, tag_ids)
|
|
|
|
messages.each do |id, message|
|
|
loader.call({ repository: repository, tag_id: id }, message)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
def get_messages(repository, tag_ids)
|
|
repository.gitaly_ref_client.get_tag_messages(tag_ids)
|
|
end
|
|
end
|
|
|
|
def initialize(repository, raw_tag)
|
|
@repository = repository
|
|
@raw_tag = raw_tag
|
|
|
|
case raw_tag
|
|
when Hash
|
|
init_from_hash
|
|
when Gitaly::Tag
|
|
init_from_gitaly
|
|
end
|
|
|
|
super(repository, name, target, target_commit)
|
|
end
|
|
|
|
def init_from_hash
|
|
raw_tag = @raw_tag.symbolize_keys
|
|
|
|
SERIALIZE_KEYS.each do |key|
|
|
send("#{key}=", raw_tag[key]) # rubocop:disable GitlabSecurity/PublicSend
|
|
end
|
|
end
|
|
|
|
def init_from_gitaly
|
|
@name = encode!(@raw_tag.name.dup)
|
|
@target = @raw_tag.id
|
|
@message = message_from_gitaly_tag
|
|
|
|
if @raw_tag.target_commit.present?
|
|
@target_commit = Gitlab::Git::Commit.decorate(repository, @raw_tag.target_commit)
|
|
end
|
|
end
|
|
|
|
def message
|
|
encode! @message
|
|
end
|
|
|
|
private
|
|
|
|
def message_from_gitaly_tag
|
|
return @raw_tag.message.dup if full_message_fetched_from_gitaly?
|
|
|
|
if @raw_tag.message_size > MAX_TAG_MESSAGE_DISPLAY_SIZE
|
|
'--tag message is too big'
|
|
else
|
|
self.class.get_message(@repository, target)
|
|
end
|
|
end
|
|
|
|
def full_message_fetched_from_gitaly?
|
|
@raw_tag.message.bytesize == @raw_tag.message_size
|
|
end
|
|
end
|
|
end
|
|
end
|