Commit 9d3ee1ff authored by Lin Jen-Shin's avatar Lin Jen-Shin

Further break with_repo_branch_commit into parts

So it's more clear what could happen. Also add
more tests about the behaviour.
parent e6630d7f
...@@ -1000,29 +1000,22 @@ class Repository ...@@ -1000,29 +1000,22 @@ class Repository
end end
def with_repo_branch_commit(start_repository, start_branch_name) def with_repo_branch_commit(start_repository, start_branch_name)
tmp_ref = nil
return yield nil if start_repository.empty_repo? return yield nil if start_repository.empty_repo?
branch_commit = if start_repository == self
if start_repository == self yield commit(start_branch_name)
commit(start_branch_name) else
sha = start_repository.commit(start_branch_name).sha
if branch_commit = commit(sha)
yield branch_commit
else else
sha = start_repository.find_branch(start_branch_name).target with_repo_tmp_commit(
commit(sha) || start_repository, start_branch_name, sha) do |tmp_commit|
begin yield tmp_commit
tmp_ref = fetch_ref( end
start_repository.path_to_repo,
"#{Gitlab::Git::BRANCH_REF_PREFIX}#{start_branch_name}",
"refs/tmp/#{SecureRandom.hex}/head"
)
commit(start_repository.commit(start_branch_name).sha)
end
end end
end
yield branch_commit
ensure
rugged.references.delete(tmp_ref) if tmp_ref
end end
def add_remote(name, url) def add_remote(name, url)
...@@ -1231,4 +1224,16 @@ class Repository ...@@ -1231,4 +1224,16 @@ class Repository
.commits_by_message(query, revision: ref, path: path, limit: limit, offset: offset) .commits_by_message(query, revision: ref, path: path, limit: limit, offset: offset)
.map { |c| commit(c) } .map { |c| commit(c) }
end end
def with_repo_tmp_commit(start_repository, start_branch_name, sha)
tmp_ref = fetch_ref(
start_repository.path_to_repo,
"#{Gitlab::Git::BRANCH_REF_PREFIX}#{start_branch_name}",
"refs/tmp/#{SecureRandom.hex}/head"
)
yield commit(sha)
ensure
rugged.references.delete(tmp_ref) if tmp_ref
end
end end
...@@ -923,13 +923,16 @@ describe Repository, models: true do ...@@ -923,13 +923,16 @@ describe Repository, models: true do
describe '#update_branch_with_hooks' do describe '#update_branch_with_hooks' do
let(:old_rev) { '0b4bc9a49b562e85de7cc9e834518ea6828729b9' } # git rev-parse feature let(:old_rev) { '0b4bc9a49b562e85de7cc9e834518ea6828729b9' } # git rev-parse feature
let(:new_rev) { 'a74ae73c1ccde9b974a70e82b901588071dc142a' } # commit whose parent is old_rev let(:new_rev) { 'a74ae73c1ccde9b974a70e82b901588071dc142a' } # commit whose parent is old_rev
let(:updating_ref) { 'refs/heads/feature' }
let(:target_project) { project }
let(:target_repository) { target_project.repository }
context 'when pre hooks were successful' do context 'when pre hooks were successful' do
before do before do
service = Gitlab::Git::HooksService.new service = Gitlab::Git::HooksService.new
expect(Gitlab::Git::HooksService).to receive(:new).and_return(service) expect(Gitlab::Git::HooksService).to receive(:new).and_return(service)
expect(service).to receive(:execute) expect(service).to receive(:execute)
.with(committer, repository, old_rev, new_rev, 'refs/heads/feature') .with(committer, target_repository, old_rev, new_rev, updating_ref)
.and_yield(service).and_return(true) .and_yield(service).and_return(true)
end end
...@@ -960,6 +963,37 @@ describe Repository, models: true do ...@@ -960,6 +963,37 @@ describe Repository, models: true do
expect(repository.find_branch('feature').dereferenced_target.id).to eq(new_rev) expect(repository.find_branch('feature').dereferenced_target.id).to eq(new_rev)
end end
end end
context 'when target project does not have the commit' do
let(:target_project) { create(:project, :empty_repo) }
let(:old_rev) { Gitlab::Git::BLANK_SHA }
let(:new_rev) { project.commit('feature').sha }
let(:updating_ref) { 'refs/heads/master' }
it 'fetch_ref and create the branch' do
expect(target_project.repository).to receive(:fetch_ref)
.and_call_original
GitOperationService.new(committer, target_repository)
.with_branch(
'master',
start_project: project,
start_branch_name: 'feature') { new_rev }
expect(target_repository.branch_names).to contain_exactly('master')
end
end
context 'when target project already has the commit' do
let(:target_project) { create(:project, :repository) }
it 'does not fetch_ref and just pass the commit' do
expect(target_repository).not_to receive(:fetch_ref)
GitOperationService.new(committer, target_repository)
.with_branch('feature', start_project: project) { new_rev }
end
end
end end
context 'when temporary ref failed to be created from other project' do context 'when temporary ref failed to be created from other project' do
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment