Client implementation GetRawChanges
Part of https://gitlab.com/gitlab-org/gitaly/issues/1138
This commit is contained in:
parent
40655a48f1
commit
713c7fa9a5
|
@ -6,7 +6,15 @@ module Gitlab
|
|||
attr_reader :blob_id, :blob_size, :old_path, :new_path, :operation
|
||||
|
||||
def initialize(raw_change)
|
||||
parse(raw_change)
|
||||
if raw_change.is_a?(Gitaly::GetRawChangesResponse::RawChange)
|
||||
@blob_id = raw_change.blob_id
|
||||
@blob_size = raw_change.size
|
||||
@old_path = raw_change.old_path.presence
|
||||
@new_path = raw_change.new_path.presence
|
||||
@operation = raw_change.operation&.downcase || :unknown
|
||||
else
|
||||
parse(raw_change)
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
|
|
@ -581,19 +581,30 @@ module Gitlab
|
|||
# old_rev and new_rev are commit ID's
|
||||
# the result of this method is an array of Gitlab::Git::RawDiffChange
|
||||
def raw_changes_between(old_rev, new_rev)
|
||||
result = []
|
||||
|
||||
circuit_breaker.perform do
|
||||
Open3.pipeline_r(git_diff_cmd(old_rev, new_rev), format_git_cat_file_script, git_cat_file_cmd) do |last_stdout, wait_threads|
|
||||
last_stdout.each_line { |line| result << ::Gitlab::Git::RawDiffChange.new(line.chomp!) }
|
||||
|
||||
if wait_threads.any? { |waiter| !waiter.value&.success? }
|
||||
raise ::Gitlab::Git::Repository::GitError, "Unabled to obtain changes between #{old_rev} and #{new_rev}"
|
||||
gitaly_migrate(:raw_changes_between) do |is_enabled|
|
||||
if is_enabled
|
||||
gitaly_repository_client.raw_changes_between(old_rev, new_rev)
|
||||
.each_with_object([]) do |msg, arr|
|
||||
msg.raw_changes.each { |change| arr << ::Gitlab::Git::RawDiffChange.new(change) }
|
||||
end
|
||||
else
|
||||
result = []
|
||||
|
||||
circuit_breaker.perform do
|
||||
Open3.pipeline_r(git_diff_cmd(old_rev, new_rev), format_git_cat_file_script, git_cat_file_cmd) do |last_stdout, wait_threads|
|
||||
last_stdout.each_line { |line| result << ::Gitlab::Git::RawDiffChange.new(line.chomp!) }
|
||||
|
||||
if wait_threads.any? { |waiter| !waiter.value&.success? }
|
||||
raise ::Gitlab::Git::Repository::GitError, "Unabled to obtain changes between #{old_rev} and #{new_rev}"
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
result
|
||||
end
|
||||
end
|
||||
|
||||
result
|
||||
rescue ArgumentError => e
|
||||
raise Gitlab::Git::Repository::GitError.new(e)
|
||||
end
|
||||
|
||||
# Returns the SHA of the most recent common ancestor of +from+ and +to+
|
||||
|
|
|
@ -293,6 +293,12 @@ module Gitlab
|
|||
response = GitalyClient.call(@storage, :repository_service, :calculate_checksum, request)
|
||||
response.checksum.presence
|
||||
end
|
||||
|
||||
def raw_changes_between(from, to)
|
||||
request = Gitaly::GetRawChangesRequest.new(repository: @gitaly_repo, from_revision: from, to_revision: to)
|
||||
|
||||
GitalyClient.call(@storage, :repository_service, :get_raw_changes, request)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -1068,40 +1068,50 @@ describe Gitlab::Git::Repository, seed_helper: true do
|
|||
end
|
||||
|
||||
describe '#raw_changes_between' do
|
||||
let(:old_rev) { }
|
||||
let(:new_rev) { }
|
||||
let(:changes) { repository.raw_changes_between(old_rev, new_rev) }
|
||||
shared_examples 'raw changes' do
|
||||
let(:old_rev) { }
|
||||
let(:new_rev) { }
|
||||
let(:changes) { repository.raw_changes_between(old_rev, new_rev) }
|
||||
|
||||
context 'initial commit' do
|
||||
let(:old_rev) { Gitlab::Git::BLANK_SHA }
|
||||
let(:new_rev) { '1a0b36b3cdad1d2ee32457c102a8c0b7056fa863' }
|
||||
context 'initial commit' do
|
||||
let(:old_rev) { Gitlab::Git::BLANK_SHA }
|
||||
let(:new_rev) { '1a0b36b3cdad1d2ee32457c102a8c0b7056fa863' }
|
||||
|
||||
it 'returns the changes' do
|
||||
expect(changes).to be_present
|
||||
expect(changes.size).to eq(3)
|
||||
it 'returns the changes' do
|
||||
expect(changes).to be_present
|
||||
expect(changes.size).to eq(3)
|
||||
end
|
||||
end
|
||||
|
||||
context 'with an invalid rev' do
|
||||
let(:old_rev) { 'foo' }
|
||||
let(:new_rev) { 'bar' }
|
||||
|
||||
it 'returns an error' do
|
||||
expect { changes }.to raise_error(Gitlab::Git::Repository::GitError)
|
||||
end
|
||||
end
|
||||
|
||||
context 'with valid revs' do
|
||||
let(:old_rev) { 'fa1b1e6c004a68b7d8763b86455da9e6b23e36d6' }
|
||||
let(:new_rev) { '4b4918a572fa86f9771e5ba40fbd48e1eb03e2c6' }
|
||||
|
||||
it 'returns the changes' do
|
||||
expect(changes.size).to eq(9)
|
||||
expect(changes.first.operation).to eq(:modified)
|
||||
expect(changes.first.new_path).to eq('.gitmodules')
|
||||
expect(changes.last.operation).to eq(:added)
|
||||
expect(changes.last.new_path).to eq('files/lfs/picture-invalid.png')
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
context 'with an invalid rev' do
|
||||
let(:old_rev) { 'foo' }
|
||||
let(:new_rev) { 'bar' }
|
||||
|
||||
it 'returns an error' do
|
||||
expect { changes }.to raise_error(Gitlab::Git::Repository::GitError)
|
||||
end
|
||||
context 'when gitaly is enabled' do
|
||||
it_behaves_like 'raw changes'
|
||||
end
|
||||
|
||||
context 'with valid revs' do
|
||||
let(:old_rev) { 'fa1b1e6c004a68b7d8763b86455da9e6b23e36d6' }
|
||||
let(:new_rev) { '4b4918a572fa86f9771e5ba40fbd48e1eb03e2c6' }
|
||||
|
||||
it 'returns the changes' do
|
||||
expect(changes.size).to eq(9)
|
||||
expect(changes.first.operation).to eq(:modified)
|
||||
expect(changes.first.new_path).to eq('.gitmodules')
|
||||
expect(changes.last.operation).to eq(:added)
|
||||
expect(changes.last.new_path).to eq('files/lfs/picture-invalid.png')
|
||||
end
|
||||
context 'when gitaly is disabled', :disable_gitaly do
|
||||
it_behaves_like 'raw changes'
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
@ -167,4 +167,15 @@ describe Gitlab::GitalyClient::RepositoryService do
|
|||
client.create_from_snapshot('http://example.com?wiki=1', 'Custom xyz')
|
||||
end
|
||||
end
|
||||
|
||||
describe '#raw_changes_between' do
|
||||
it 'sends a create_repository_from_snapshot message' do
|
||||
expect_any_instance_of(Gitaly::RepositoryService::Stub)
|
||||
.to receive(:get_raw_changes)
|
||||
.with(gitaly_request_with_path(storage_name, relative_path), kind_of(Hash))
|
||||
.and_return(double)
|
||||
|
||||
client.raw_changes_between('deadbeef', 'deadpork')
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
Loading…
Reference in New Issue