Migrate Repository#tags to Gitaly
Closes gitaly#411
This commit is contained in:
parent
86ae883b63
commit
cd5ae5cb2b
6 changed files with 80 additions and 31 deletions
|
@ -1 +1 @@
|
|||
0.23.0
|
||||
0.25.0
|
||||
|
|
2
Gemfile
2
Gemfile
|
@ -391,7 +391,7 @@ gem 'vmstat', '~> 2.3.0'
|
|||
gem 'sys-filesystem', '~> 1.1.6'
|
||||
|
||||
# Gitaly GRPC client
|
||||
gem 'gitaly', '~> 0.18.0'
|
||||
gem 'gitaly', '~> 0.21.0'
|
||||
|
||||
gem 'toml-rb', '~> 0.3.15', require: false
|
||||
|
||||
|
|
|
@ -269,7 +269,7 @@ GEM
|
|||
po_to_json (>= 1.0.0)
|
||||
rails (>= 3.2.0)
|
||||
gherkin-ruby (0.3.2)
|
||||
gitaly (0.18.0)
|
||||
gitaly (0.21.0)
|
||||
google-protobuf (~> 3.1)
|
||||
grpc (~> 1.0)
|
||||
github-linguist (4.7.6)
|
||||
|
@ -976,7 +976,7 @@ DEPENDENCIES
|
|||
gettext (~> 3.2.2)
|
||||
gettext_i18n_rails (~> 1.8.0)
|
||||
gettext_i18n_rails_js (~> 1.2.0)
|
||||
gitaly (~> 0.18.0)
|
||||
gitaly (~> 0.21.0)
|
||||
github-linguist (~> 4.7.0)
|
||||
gitlab-flowdock-git-hook (~> 1.0.1)
|
||||
gitlab-markup (~> 1.5.1)
|
||||
|
|
|
@ -164,20 +164,13 @@ module Gitlab
|
|||
#
|
||||
# Gitaly migration: https://gitlab.com/gitlab-org/gitaly/issues/390
|
||||
def tags
|
||||
rugged.references.each("refs/tags/*").map do |ref|
|
||||
message = nil
|
||||
|
||||
if ref.target.is_a?(Rugged::Tag::Annotation)
|
||||
tag_message = ref.target.message
|
||||
|
||||
if tag_message.respond_to?(:chomp)
|
||||
message = tag_message.chomp
|
||||
end
|
||||
gitaly_migrate(:tags) do |is_enabled|
|
||||
if is_enabled
|
||||
tags_from_gitaly
|
||||
else
|
||||
tags_from_rugged
|
||||
end
|
||||
|
||||
target_commit = Gitlab::Git::Commit.find(self, ref.target)
|
||||
Gitlab::Git::Tag.new(self, ref.name, ref.target, target_commit, message)
|
||||
end.sort_by(&:name)
|
||||
end
|
||||
end
|
||||
|
||||
# Returns true if the given tag exists
|
||||
|
@ -1115,6 +1108,27 @@ module Gitlab
|
|||
end
|
||||
end
|
||||
|
||||
def tags_from_rugged
|
||||
rugged.references.each("refs/tags/*").map do |ref|
|
||||
message = nil
|
||||
|
||||
if ref.target.is_a?(Rugged::Tag::Annotation)
|
||||
tag_message = ref.target.message
|
||||
|
||||
if tag_message.respond_to?(:chomp)
|
||||
message = tag_message.chomp
|
||||
end
|
||||
end
|
||||
|
||||
target_commit = Gitlab::Git::Commit.find(self, ref.target)
|
||||
Gitlab::Git::Tag.new(self, ref.name, ref.target, target_commit, message)
|
||||
end.sort_by(&:name)
|
||||
end
|
||||
|
||||
def tags_from_gitaly
|
||||
gitaly_ref_client.tags
|
||||
end
|
||||
|
||||
def gitaly_migrate(method, &block)
|
||||
Gitlab::GitalyClient.migrate(method, &block)
|
||||
rescue GRPC::NotFound => e
|
||||
|
|
|
@ -52,6 +52,12 @@ module Gitlab
|
|||
consume_branches_response(response)
|
||||
end
|
||||
|
||||
def tags
|
||||
request = Gitaly::FindAllTagsRequest.new(repository: @gitaly_repo)
|
||||
response = GitalyClient.call(@storage, :ref_service, :find_all_tags, request)
|
||||
consume_tags_response(response)
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def consume_refs_response(response)
|
||||
|
@ -79,6 +85,25 @@ module Gitlab
|
|||
end
|
||||
end
|
||||
|
||||
def consume_tags_response(response)
|
||||
response.flat_map do |message|
|
||||
message.tags.map do |gitaly_tag|
|
||||
if gitaly_tag.target_commit.present?
|
||||
commit = GitalyClient::Commit.new(@repository, gitaly_tag.target_commit)
|
||||
gitaly_commit = Gitlab::Git::Commit.new(commit)
|
||||
end
|
||||
|
||||
Gitlab::Git::Tag.new(
|
||||
@repository,
|
||||
encode!(gitaly_tag.name.dup),
|
||||
gitaly_tag.id,
|
||||
gitaly_commit,
|
||||
encode!(gitaly_tag.message.chomp)
|
||||
)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def commit_from_local_branches_response(response)
|
||||
# Git messages have no encoding enforcements. However, in the UI we only
|
||||
# handle UTF-8, so basically we cross our fingers that the message force
|
||||
|
|
|
@ -3,23 +3,33 @@ require "spec_helper"
|
|||
describe Gitlab::Git::Tag, seed_helper: true do
|
||||
let(:repository) { Gitlab::Git::Repository.new('default', TEST_REPO_PATH) }
|
||||
|
||||
describe 'first tag' do
|
||||
let(:tag) { repository.tags.first }
|
||||
shared_examples 'Gitlab::Git::Repository#tags' do
|
||||
describe 'first tag' do
|
||||
let(:tag) { repository.tags.first }
|
||||
|
||||
it { expect(tag.name).to eq("v1.0.0") }
|
||||
it { expect(tag.target).to eq("f4e6814c3e4e7a0de82a9e7cd20c626cc963a2f8") }
|
||||
it { expect(tag.dereferenced_target.sha).to eq("6f6d7e7ed97bb5f0054f2b1df789b39ca89b6ff9") }
|
||||
it { expect(tag.message).to eq("Release") }
|
||||
it { expect(tag.name).to eq("v1.0.0") }
|
||||
it { expect(tag.target).to eq("f4e6814c3e4e7a0de82a9e7cd20c626cc963a2f8") }
|
||||
it { expect(tag.dereferenced_target.sha).to eq("6f6d7e7ed97bb5f0054f2b1df789b39ca89b6ff9") }
|
||||
it { expect(tag.message).to eq("Release") }
|
||||
end
|
||||
|
||||
describe 'last tag' do
|
||||
let(:tag) { repository.tags.last }
|
||||
|
||||
it { expect(tag.name).to eq("v1.2.1") }
|
||||
it { expect(tag.target).to eq("2ac1f24e253e08135507d0830508febaaccf02ee") }
|
||||
it { expect(tag.dereferenced_target.sha).to eq("fa1b1e6c004a68b7d8763b86455da9e6b23e36d6") }
|
||||
it { expect(tag.message).to eq("Version 1.2.1") }
|
||||
end
|
||||
|
||||
it { expect(repository.tags.size).to eq(SeedRepo::Repo::TAGS.size) }
|
||||
end
|
||||
|
||||
describe 'last tag' do
|
||||
let(:tag) { repository.tags.last }
|
||||
|
||||
it { expect(tag.name).to eq("v1.2.1") }
|
||||
it { expect(tag.target).to eq("2ac1f24e253e08135507d0830508febaaccf02ee") }
|
||||
it { expect(tag.dereferenced_target.sha).to eq("fa1b1e6c004a68b7d8763b86455da9e6b23e36d6") }
|
||||
it { expect(tag.message).to eq("Version 1.2.1") }
|
||||
context 'when Gitaly tags feature is enabled' do
|
||||
it_behaves_like 'Gitlab::Git::Repository#tags'
|
||||
end
|
||||
|
||||
it { expect(repository.tags.size).to eq(SeedRepo::Repo::TAGS.size) }
|
||||
context 'when Gitaly tags feature is disabled', skip_gitaly_mock: true do
|
||||
it_behaves_like 'Gitlab::Git::Repository#tags'
|
||||
end
|
||||
end
|
||||
|
|
Loading…
Reference in a new issue