116 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			Ruby
		
	
	
	
			
		
		
	
	
			116 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			Ruby
		
	
	
	
| require 'spec_helper'
 | |
| 
 | |
| describe Gitlab::Git::RevList do
 | |
|   let(:project) { create(:project, :repository) }
 | |
|   let(:rev_list) { described_class.new(newrev: 'newrev', path_to_repo: project.repository.path_to_repo) }
 | |
|   let(:env_hash) do
 | |
|     {
 | |
|       'GIT_OBJECT_DIRECTORY' => 'foo',
 | |
|       'GIT_ALTERNATE_OBJECT_DIRECTORIES' => 'bar'
 | |
|     }
 | |
|   end
 | |
| 
 | |
|   before do
 | |
|     allow(Gitlab::Git::Env).to receive(:all).and_return(env_hash.symbolize_keys)
 | |
|   end
 | |
| 
 | |
|   def args_for_popen(args_list)
 | |
|     [
 | |
|       Gitlab.config.git.bin_path,
 | |
|       "--git-dir=#{project.repository.path_to_repo}",
 | |
|       'rev-list',
 | |
|       *args_list
 | |
|     ]
 | |
|   end
 | |
| 
 | |
|   def stub_popen_rev_list(*additional_args, output:)
 | |
|     args = args_for_popen(additional_args)
 | |
| 
 | |
|     expect(rev_list).to receive(:popen).with(args, nil, env_hash)
 | |
|                                        .and_return([output, 0])
 | |
|   end
 | |
| 
 | |
|   def stub_lazy_popen_rev_list(*additional_args, output:)
 | |
|     params = [
 | |
|       args_for_popen(additional_args),
 | |
|       nil,
 | |
|       env_hash,
 | |
|       hash_including(lazy_block: anything)
 | |
|     ]
 | |
| 
 | |
|     expect(rev_list).to receive(:popen).with(*params) do |*_, lazy_block:|
 | |
|       lazy_block.call(output.split("\n").lazy)
 | |
|     end
 | |
|   end
 | |
| 
 | |
|   context "#new_refs" do
 | |
|     it 'calls out to `popen`' do
 | |
|       stub_popen_rev_list('newrev', '--not', '--all', output: "sha1\nsha2")
 | |
| 
 | |
|       expect(rev_list.new_refs).to eq(%w[sha1 sha2])
 | |
|     end
 | |
|   end
 | |
| 
 | |
|   context '#new_objects' do
 | |
|     it 'fetches list of newly pushed objects using rev-list' do
 | |
|       stub_popen_rev_list('newrev', '--not', '--all', '--objects', output: "sha1\nsha2")
 | |
| 
 | |
|       expect(rev_list.new_objects).to eq(%w[sha1 sha2])
 | |
|     end
 | |
| 
 | |
|     it 'can skip pathless objects' do
 | |
|       stub_popen_rev_list('newrev', '--not', '--all', '--objects', output: "sha1\nsha2 path/to/file")
 | |
| 
 | |
|       expect(rev_list.new_objects(require_path: true)).to eq(%w[sha2])
 | |
|     end
 | |
| 
 | |
|     it 'can yield a lazy enumerator' do
 | |
|       stub_lazy_popen_rev_list('newrev', '--not', '--all', '--objects', output: "sha1\nsha2")
 | |
| 
 | |
|       rev_list.new_objects do |object_ids|
 | |
|         expect(object_ids).to be_a Enumerator::Lazy
 | |
|       end
 | |
|     end
 | |
| 
 | |
|     it 'returns the result of the block when given' do
 | |
|       stub_lazy_popen_rev_list('newrev', '--not', '--all', '--objects', output: "sha1\nsha2")
 | |
| 
 | |
|       objects = rev_list.new_objects do |object_ids|
 | |
|         object_ids.first
 | |
|       end
 | |
| 
 | |
|       expect(objects).to eq 'sha1'
 | |
|     end
 | |
| 
 | |
|     it 'can accept list of references to exclude' do
 | |
|       stub_popen_rev_list('newrev', '--not', 'master', '--objects', output: "sha1\nsha2")
 | |
| 
 | |
|       expect(rev_list.new_objects(not_in: ['master'])).to eq(%w[sha1 sha2])
 | |
|     end
 | |
| 
 | |
|     it 'handles empty list of references to exclude as listing all known objects' do
 | |
|       stub_popen_rev_list('newrev', '--objects', output: "sha1\nsha2")
 | |
| 
 | |
|       expect(rev_list.new_objects(not_in: [])).to eq(%w[sha1 sha2])
 | |
|     end
 | |
|   end
 | |
| 
 | |
|   context '#all_objects' do
 | |
|     it 'fetches list of all pushed objects using rev-list' do
 | |
|       stub_popen_rev_list('--all', '--objects', output: "sha1\nsha2")
 | |
| 
 | |
|       expect(rev_list.all_objects).to eq(%w[sha1 sha2])
 | |
|     end
 | |
|   end
 | |
| 
 | |
|   context "#missed_ref" do
 | |
|     let(:rev_list) { described_class.new(oldrev: 'oldrev', newrev: 'newrev', path_to_repo: project.repository.path_to_repo) }
 | |
| 
 | |
|     it 'calls out to `popen`' do
 | |
|       stub_popen_rev_list('--max-count=1', 'oldrev', '^newrev', output: "sha1\nsha2")
 | |
| 
 | |
|       expect(rev_list.missed_ref).to eq(%w[sha1 sha2])
 | |
|     end
 | |
|   end
 | |
| end
 |