Fix gitaly ref encoding bugs

This commit is contained in:
Jacob Vosmaer 2017-06-28 14:20:29 +02:00
parent 4596ab5b6b
commit d3bcf8ac2a
4 changed files with 44 additions and 11 deletions

View file

@ -7,8 +7,10 @@ module Gitlab
CommandError = Class.new(StandardError)
class << self
include Gitlab::EncodingHelper
def ref_name(ref)
ref.sub(/\Arefs\/(tags|heads)\//, '')
encode! ref.sub(/\Arefs\/(tags|heads)\//, '')
end
def branch_name(ref)

View file

@ -113,9 +113,7 @@ module Gitlab
def local_branches(sort_by: nil)
gitaly_migrate(:local_branches) do |is_enabled|
if is_enabled
gitaly_ref_client.local_branches(sort_by: sort_by).map do |gitaly_branch|
Gitlab::Git::Branch.new(self, gitaly_branch.name, gitaly_branch)
end
gitaly_ref_client.local_branches(sort_by: sort_by)
else
branches(filter: :local, sort_by: sort_by)
end

View file

@ -1,8 +1,11 @@
module Gitlab
module GitalyClient
class Ref
include Gitlab::EncodingHelper
# 'repository' is a Gitlab::Git::Repository
def initialize(repository)
@repository = repository
@gitaly_repo = repository.gitaly_repository
@storage = repository.storage
end
@ -16,13 +19,13 @@ module Gitlab
def branch_names
request = Gitaly::FindAllBranchNamesRequest.new(repository: @gitaly_repo)
response = GitalyClient.call(@storage, :ref, :find_all_branch_names, request)
consume_refs_response(response, prefix: 'refs/heads/')
consume_refs_response(response) { |name| Gitlab::Git.branch_name(name) }
end
def tag_names
request = Gitaly::FindAllTagNamesRequest.new(repository: @gitaly_repo)
response = GitalyClient.call(@storage, :ref, :find_all_tag_names, request)
consume_refs_response(response, prefix: 'refs/tags/')
consume_refs_response(response) { |name| Gitlab::Git.tag_name(name) }
end
def find_ref_name(commit_id, ref_prefix)
@ -51,10 +54,8 @@ module Gitlab
private
def consume_refs_response(response, prefix:)
response.flat_map do |r|
r.names.map { |name| name.sub(/\A#{Regexp.escape(prefix)}/, '') }
end
def consume_refs_response(response)
response.flat_map { |message| message.names.map { |name| yield(name) } }
end
def sort_by_param(sort_by)
@ -64,7 +65,15 @@ module Gitlab
end
def consume_branches_response(response)
response.flat_map { |r| r.branches }
response.flat_map do |message|
message.branches.map do |gitaly_branch|
Gitlab::Git::Branch.new(
@repository,
encode!(gitaly_branch.name.dup),
gitaly_branch.commit_id
)
end
end
end
end
end

View file

@ -26,6 +26,10 @@ describe Gitlab::Git::Repository, seed_helper: true do
end
end
it 'returns UTF-8' do
expect(repository.root_ref.encoding).to eq(Encoding.find('UTF-8'))
end
context 'with gitaly enabled' do
before do
stub_gitaly
@ -123,6 +127,11 @@ describe Gitlab::Git::Repository, seed_helper: true do
it 'has SeedRepo::Repo::BRANCHES.size elements' do
expect(subject.size).to eq(SeedRepo::Repo::BRANCHES.size)
end
it 'returns UTF-8' do
expect(subject.first.encoding).to eq(Encoding.find('UTF-8'))
end
it { is_expected.to include("master") }
it { is_expected.not_to include("branch-from-space") }
@ -158,10 +167,15 @@ describe Gitlab::Git::Repository, seed_helper: true do
subject { repository.tag_names }
it { is_expected.to be_kind_of Array }
it 'has SeedRepo::Repo::TAGS.size elements' do
expect(subject.size).to eq(SeedRepo::Repo::TAGS.size)
end
it 'returns UTF-8' do
expect(subject.first.encoding).to eq(Encoding.find('UTF-8'))
end
describe '#last' do
subject { super().last }
it { is_expected.to eq("v1.2.1") }
@ -1276,6 +1290,16 @@ describe Gitlab::Git::Repository, seed_helper: true do
Gitlab::GitalyClient.clear_stubs!
end
it 'returns a Branch with UTF-8 fields' do
branches = @repo.local_branches.to_a
expect(branches.size).to be > 0
utf_8 = Encoding.find('utf-8')
branches.each do |branch|
expect(branch.name.encoding).to eq(utf_8)
expect(branch.target.encoding).to eq(utf_8) unless branch.target.nil?
end
end
it 'gets the branches from GitalyClient' do
expect_any_instance_of(Gitlab::GitalyClient::Ref).to receive(:local_branches)
.and_return([])