Merge branch 'zj-lfs-pointers' into 'master'
LFS changes are detected by Gitaly Closes gitaly#935 See merge request gitlab-org/gitlab-ce!19995
This commit is contained in:
		
						commit
						c67d8c2478
					
				|  | @ -7,67 +7,11 @@ module Gitlab | |||
|       end | ||||
| 
 | ||||
|       def new_pointers(object_limit: nil, not_in: nil) | ||||
|         @repository.gitaly_migrate(:blob_get_new_lfs_pointers) do |is_enabled| | ||||
|           if is_enabled | ||||
|             @repository.gitaly_blob_client.get_new_lfs_pointers(@newrev, object_limit, not_in) | ||||
|           else | ||||
|             git_new_pointers(object_limit, not_in) | ||||
|           end | ||||
|         end | ||||
|         @repository.gitaly_blob_client.get_new_lfs_pointers(@newrev, object_limit, not_in) | ||||
|       end | ||||
| 
 | ||||
|       def all_pointers | ||||
|         @repository.gitaly_migrate(:blob_get_all_lfs_pointers) do |is_enabled| | ||||
|           if is_enabled | ||||
|             @repository.gitaly_blob_client.get_all_lfs_pointers(@newrev) | ||||
|           else | ||||
|             git_all_pointers | ||||
|           end | ||||
|         end | ||||
|       end | ||||
| 
 | ||||
|       private | ||||
| 
 | ||||
|       def git_new_pointers(object_limit, not_in) | ||||
|         @new_pointers ||= begin | ||||
|           rev_list.new_objects(rev_list_params(not_in: not_in)) do |object_ids| | ||||
|             object_ids = object_ids.take(object_limit) if object_limit | ||||
| 
 | ||||
|             Gitlab::Git::Blob.batch_lfs_pointers(@repository, object_ids) | ||||
|           end | ||||
|         end | ||||
|       end | ||||
| 
 | ||||
|       def git_all_pointers | ||||
|         params = {} | ||||
|         if rev_list_supports_new_options? | ||||
|           params[:options] = ["--filter=blob:limit=#{Gitlab::Git::Blob::LFS_POINTER_MAX_SIZE}"] | ||||
|         end | ||||
| 
 | ||||
|         rev_list.all_objects(rev_list_params(params)) do |object_ids| | ||||
|           Gitlab::Git::Blob.batch_lfs_pointers(@repository, object_ids) | ||||
|         end | ||||
|       end | ||||
| 
 | ||||
|       def rev_list | ||||
|         Gitlab::Git::RevList.new(@repository, newrev: @newrev) | ||||
|       end | ||||
| 
 | ||||
|       # We're passing the `--in-commit-order` arg to ensure we don't wait | ||||
|       # for git to traverse all commits before returning pointers. | ||||
|       # This is required in order to improve the performance of LFS integrity check | ||||
|       def rev_list_params(params = {}) | ||||
|         params[:options] ||= [] | ||||
|         params[:options] << "--in-commit-order" if rev_list_supports_new_options? | ||||
|         params[:require_path] = true | ||||
| 
 | ||||
|         params | ||||
|       end | ||||
| 
 | ||||
|       def rev_list_supports_new_options? | ||||
|         return @option_supported if defined?(@option_supported) | ||||
| 
 | ||||
|         @option_supported = Gitlab::Git.version >= Gitlab::VersionInfo.parse('2.16.0') | ||||
|         @repository.gitaly_blob_client.get_all_lfs_pointers(@newrev) | ||||
|       end | ||||
|     end | ||||
|   end | ||||
|  |  | |||
|  | @ -1,50 +1,19 @@ | |||
| require 'spec_helper' | ||||
| 
 | ||||
| describe Gitlab::Git::LfsChanges do | ||||
|   let(:project) { create(:project, :repository) } | ||||
|   set(:project) { create(:project, :repository) } | ||||
|   let(:newrev) { '54fcc214b94e78d7a41a9a8fe6d87a5e59500e51' } | ||||
|   let(:blob_object_id) { '0c304a93cb8430108629bbbcaa27db3343299bc0' } | ||||
| 
 | ||||
|   subject { described_class.new(project.repository, newrev) } | ||||
| 
 | ||||
|   describe '#new_pointers' do | ||||
|     shared_examples 'new pointers' do | ||||
|       it 'filters new objects to find lfs pointers' do | ||||
|         expect(subject.new_pointers(not_in: []).first.id).to eq(blob_object_id) | ||||
|       end | ||||
| 
 | ||||
|       it 'limits new_objects using object_limit' do | ||||
|         expect(subject.new_pointers(object_limit: 1)).to eq([]) | ||||
|       end | ||||
|     it 'filters new objects to find lfs pointers' do | ||||
|       expect(subject.new_pointers(not_in: []).first.id).to eq(blob_object_id) | ||||
|     end | ||||
| 
 | ||||
|     context 'with gitaly enabled' do | ||||
|       it_behaves_like 'new pointers' | ||||
|     end | ||||
| 
 | ||||
|     context 'with gitaly disabled', :skip_gitaly_mock do | ||||
|       it_behaves_like 'new pointers' | ||||
| 
 | ||||
|       it 'uses rev-list to find new objects' do | ||||
|         rev_list = double | ||||
|         allow(Gitlab::Git::RevList).to receive(:new).and_return(rev_list) | ||||
| 
 | ||||
|         expect(rev_list).to receive(:new_objects).and_return([]) | ||||
| 
 | ||||
|         subject.new_pointers | ||||
|       end | ||||
|     end | ||||
|   end | ||||
| 
 | ||||
|   describe '#all_pointers', :skip_gitaly_mock do | ||||
|     it 'uses rev-list to find all objects' do | ||||
|       rev_list = double | ||||
|       allow(Gitlab::Git::RevList).to receive(:new).and_return(rev_list) | ||||
|       allow(rev_list).to receive(:all_objects).and_yield([blob_object_id]) | ||||
| 
 | ||||
|       expect(Gitlab::Git::Blob).to receive(:batch_lfs_pointers).with(project.repository, [blob_object_id]) | ||||
| 
 | ||||
|       subject.all_pointers | ||||
|     it 'limits new_objects using object_limit' do | ||||
|       expect(subject.new_pointers(object_limit: 1)).to eq([]) | ||||
|     end | ||||
|   end | ||||
| end | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue