summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDouglas Barbosa Alexandre <dbalexandre@gmail.com>2018-04-05 16:10:09 -0300
committerDouglas Barbosa Alexandre <dbalexandre@gmail.com>2018-04-06 13:23:23 -0300
commit13992ac92e20d74c6b393f71a2775d8c1cd0837c (patch)
treea1863445c568efad7f0be6634bb24e6a71b54eb4
parente892eeb5460078d127070f51c31bd5fc41a2c876 (diff)
downloadgitlab-ce-13992ac92e20d74c6b393f71a2775d8c1cd0837c.tar.gz
Checksum calculation is handled by Gitaly when feature is enabled
-rw-r--r--lib/gitlab/git/checksum.rb23
-rw-r--r--spec/lib/gitlab/git/checksum_spec.rb51
2 files changed, 50 insertions, 24 deletions
diff --git a/lib/gitlab/git/checksum.rb b/lib/gitlab/git/checksum.rb
index 3ef0f0a8854..218651906bf 100644
--- a/lib/gitlab/git/checksum.rb
+++ b/lib/gitlab/git/checksum.rb
@@ -7,13 +7,14 @@ module Gitlab
Failure = Class.new(StandardError)
- attr_reader :path, :relative_path, :storage, :storage_path
+ attr_reader :path, :relative_path, :storage, :storage_path, :gl_repository
- def initialize(storage, relative_path)
+ def initialize(storage, relative_path, gl_repository)
@storage = storage
@storage_path = Gitlab.config.repositories.storages[storage].legacy_disk_path
@relative_path = "#{relative_path}.git"
@path = File.join(storage_path, @relative_path)
+ @gl_repository = gl_repository
end
def calculate
@@ -21,7 +22,13 @@ module Gitlab
failure!(Gitlab::Git::Repository::NoRepository, 'No repository for such path')
end
- calculate_checksum_by_shelling_out
+ raw_repository.gitaly_migrate(:calculate_checksum) do |is_enabled|
+ if is_enabled
+ calculate_checksum_gitaly
+ else
+ calculate_checksum_by_shelling_out
+ end
+ end
end
private
@@ -30,6 +37,10 @@ module Gitlab
raw_repository.exists?
end
+ def calculate_checksum_gitaly
+ gitaly_repository_client.calculate_checksum
+ end
+
def calculate_checksum_by_shelling_out
args = %W(--git-dir=#{path} show-ref --heads --tags)
output, status = run_git(args)
@@ -69,7 +80,11 @@ module Gitlab
end
def raw_repository
- Gitlab::Git::Repository.new(storage, relative_path, nil)
+ @raw_repository ||= Gitlab::Git::Repository.new(storage, relative_path, gl_repository)
+ end
+
+ def gitaly_repository_client
+ raw_repository.gitaly_repository_client
end
def run_git(args)
diff --git a/spec/lib/gitlab/git/checksum_spec.rb b/spec/lib/gitlab/git/checksum_spec.rb
index 8ff310905bf..a500b52cf20 100644
--- a/spec/lib/gitlab/git/checksum_spec.rb
+++ b/spec/lib/gitlab/git/checksum_spec.rb
@@ -2,37 +2,48 @@ require 'spec_helper'
describe Gitlab::Git::Checksum, seed_helper: true do
let(:storage) { 'default' }
+ let(:gl_repository) { 'project-123' }
- it 'raises Gitlab::Git::Repository::NoRepository when there is no repo' do
- checksum = described_class.new(storage, 'nonexistent-repo')
+ shared_examples 'calculating checksum' do
+ it 'raises Gitlab::Git::Repository::NoRepository when there is no repo' do
+ checksum = described_class.new(storage, 'nonexistent-repo', gl_repository)
- expect { checksum.calculate }.to raise_error Gitlab::Git::Repository::NoRepository
- end
+ expect { checksum.calculate }.to raise_error Gitlab::Git::Repository::NoRepository
+ end
- it 'pretends that checksum is 000000... when the repo is empty' do
- FileUtils.rm_rf(File.join(SEED_STORAGE_PATH, 'empty-repo.git'))
+ it 'pretends that checksum is 000000... when the repo is empty' do
+ FileUtils.rm_rf(File.join(SEED_STORAGE_PATH, 'empty-repo.git'))
- system(git_env, *%W(#{Gitlab.config.git.bin_path} init --bare empty-repo.git),
- chdir: SEED_STORAGE_PATH,
- out: '/dev/null',
- err: '/dev/null')
+ system(git_env, *%W(#{Gitlab.config.git.bin_path} init --bare empty-repo.git),
+ chdir: SEED_STORAGE_PATH,
+ out: '/dev/null',
+ err: '/dev/null')
- checksum = described_class.new(storage, 'empty-repo')
+ checksum = described_class.new(storage, 'empty-repo', gl_repository)
- expect(checksum.calculate).to eq '0000000000000000000000000000000000000000'
- end
+ expect(checksum.calculate).to eq '0000000000000000000000000000000000000000'
+ end
- it 'raises Gitlab::Git::Repository::Failure when shelling out to git return non-zero status' do
- checksum = described_class.new(storage, 'gitlab-git-test')
+ it 'calculates the checksum when there is a repo' do
+ checksum = described_class.new(storage, 'gitlab-git-test', gl_repository)
- allow(checksum).to receive(:popen).and_return(['output', nil])
+ expect(checksum.calculate).to eq '54f21be4c32c02f6788d72207fa03ad3bce725e4'
+ end
+ end
- expect { checksum.calculate }.to raise_error Gitlab::Git::Checksum::Failure
+ context 'when calculate_checksum Gitaly feature is enabled' do
+ it_behaves_like 'calculating checksum'
end
- it 'calculates the checksum when there is a repo' do
- checksum = described_class.new(storage, 'gitlab-git-test')
+ context 'when calculate_checksum Gitaly feature is disabled', :disable_gitaly do
+ it_behaves_like 'calculating checksum'
+
+ it "raises a Gitlab::Git::Repository::Failure error if the `popen` call to git returns a non-zero exit code" do
+ checksum = described_class.new(storage, 'gitlab-git-test', gl_repository)
+
+ allow(checksum).to receive(:popen).and_return(['output', nil])
- expect(checksum.calculate).to eq '54f21be4c32c02f6788d72207fa03ad3bce725e4'
+ expect { checksum.calculate }.to raise_error Gitlab::Git::Checksum::Failure
+ end
end
end