Commit b9ec197c authored by Alessio Caiazza's avatar Alessio Caiazza

Add more tests to pull mirroring

parent 4055c2fe
...@@ -139,42 +139,31 @@ describe Projects::UpdateMirrorService do ...@@ -139,42 +139,31 @@ describe Projects::UpdateMirrorService do
end end
end end
context "updating branches" do context 'updating branches' do
context 'when pull_mirror_branch_prefix is set' do shared_examples 'a working pull mirror' do |branch_prefix|
let(:pull_mirror_branch_prefix) { 'upstream/' } context 'when the mirror has a repository' do
let(:master) { "#{branch_prefix}master"}
before do before do
project.update(pull_mirror_branch_prefix: pull_mirror_branch_prefix)
end
it "creates new branches" do
stub_fetch_mirror(project) stub_fetch_mirror(project)
end
it 'creates new branches' do
service.execute service.execute
expect(project.repository.branch_names).to include("#{pull_mirror_branch_prefix}new-branch") expect(project.repository.branch_names).to include("#{branch_prefix}new-branch")
expect(project.repository.branch_names).not_to include('new-branch')
end
context 'when pull_mirror_branch_prefix feature flag is disabled' do
before do
stub_feature_flags(pull_mirror_branch_prefix: false)
end end
it "creates new branches" do it 'updates existing branches' do
stub_fetch_mirror(project)
service.execute service.execute
expect(project.repository.branch_names).not_to include("#{pull_mirror_branch_prefix}new-branch") expect(project.repository.find_branch("#{branch_prefix}existing-branch").dereferenced_target)
expect(project.repository.branch_names).to include('new-branch') .to eq(project.repository.find_branch(master).dereferenced_target)
end
end
end end
context 'when mirror only protected branches option is set' do context 'when mirror only protected branches option is set' do
let(:new_protected_branch_name) { 'new-branch' } let(:new_protected_branch_name) { "#{branch_prefix}new-branch" }
let(:protected_branch_name) { 'existing-branch' } let(:protected_branch_name) { "#{branch_prefix}existing-branch" }
before do before do
project.update(only_mirror_protected_branches: true) project.update(only_mirror_protected_branches: true)
...@@ -184,16 +173,12 @@ describe Projects::UpdateMirrorService do ...@@ -184,16 +173,12 @@ describe Projects::UpdateMirrorService do
create(:protected_branch, project: project, name: new_protected_branch_name) create(:protected_branch, project: project, name: new_protected_branch_name)
project.reload project.reload
stub_fetch_mirror(project)
service.execute service.execute
expect(project.repository.branch_names).to include(new_protected_branch_name) expect(project.repository.branch_names).to include(new_protected_branch_name)
end end
it 'does not create an unprotected branch' do it 'does not create an unprotected branch' do
stub_fetch_mirror(project)
service.execute service.execute
expect(project.repository.branch_names).not_to include(new_protected_branch_name) expect(project.repository.branch_names).not_to include(new_protected_branch_name)
...@@ -203,45 +188,22 @@ describe Projects::UpdateMirrorService do ...@@ -203,45 +188,22 @@ describe Projects::UpdateMirrorService do
create(:protected_branch, project: project, name: protected_branch_name) create(:protected_branch, project: project, name: protected_branch_name)
project.reload project.reload
stub_fetch_mirror(project)
service.execute service.execute
expect(project.repository.find_branch(protected_branch_name).dereferenced_target) expect(project.repository.find_branch(protected_branch_name).dereferenced_target)
.to eq(project.repository.find_branch('master').dereferenced_target) .to eq(project.repository.find_branch(master).dereferenced_target)
end end
it "does not update unprotected branches" do it 'does not update unprotected branches' do
stub_fetch_mirror(project)
service.execute service.execute
expect(project.repository.find_branch(protected_branch_name).dereferenced_target) expect(project.repository.find_branch(protected_branch_name).dereferenced_target)
.not_to eq(project.repository.find_branch('master').dereferenced_target) .not_to eq(project.repository.find_branch(master).dereferenced_target)
end end
end end
it "creates new branches" do
stub_fetch_mirror(project)
service.execute
expect(project.repository.branch_names).to include('new-branch')
end
it "updates existing branches" do
stub_fetch_mirror(project)
service.execute
expect(project.repository.find_branch('existing-branch').dereferenced_target)
.to eq(project.repository.find_branch('master').dereferenced_target)
end
context 'with diverged branches' do context 'with diverged branches' do
before do let(:diverged_branch) { "#{branch_prefix}markdown"}
stub_fetch_mirror(project)
end
context 'when mirror_overwrites_diverged_branches is true' do context 'when mirror_overwrites_diverged_branches is true' do
it 'update diverged branches' do it 'update diverged branches' do
...@@ -249,8 +211,8 @@ describe Projects::UpdateMirrorService do ...@@ -249,8 +211,8 @@ describe Projects::UpdateMirrorService do
service.execute service.execute
expect(project.repository.find_branch('markdown').dereferenced_target) expect(project.repository.find_branch(diverged_branch).dereferenced_target)
.to eq(project.repository.find_branch('master').dereferenced_target) .to eq(project.repository.find_branch(master).dereferenced_target)
end end
end end
...@@ -260,8 +222,8 @@ describe Projects::UpdateMirrorService do ...@@ -260,8 +222,8 @@ describe Projects::UpdateMirrorService do
service.execute service.execute
expect(project.repository.find_branch('markdown').dereferenced_target) expect(project.repository.find_branch(diverged_branch).dereferenced_target)
.not_to eq(project.repository.find_branch('master').dereferenced_target) .not_to eq(project.repository.find_branch(master).dereferenced_target)
end end
end end
...@@ -271,8 +233,9 @@ describe Projects::UpdateMirrorService do ...@@ -271,8 +233,9 @@ describe Projects::UpdateMirrorService do
service.execute service.execute
expect(project.repository.find_branch('markdown').dereferenced_target) expect(project.repository.find_branch(diverged_branch).dereferenced_target)
.not_to eq(project.repository.find_branch('master').dereferenced_target) .not_to eq(project.repository.find_branch(master).dereferenced_target)
end
end end
end end
end end
...@@ -290,6 +253,43 @@ describe Projects::UpdateMirrorService do ...@@ -290,6 +253,43 @@ describe Projects::UpdateMirrorService do
expect(repository.branch_names).not_to include('master') expect(repository.branch_names).not_to include('master')
end end
end end
end
context 'when pull_mirror_branch_prefix is set' do
let(:pull_mirror_branch_prefix) { 'upstream/' }
before do
project.update(pull_mirror_branch_prefix: pull_mirror_branch_prefix)
end
it "doesn't create unprefixed branches" do
stub_fetch_mirror(project)
service.execute
expect(project.repository.branch_names).not_to include('new-branch')
end
it_behaves_like 'a working pull mirror', 'upstream/'
context 'when pull_mirror_branch_prefix feature flag is disabled' do
before do
stub_feature_flags(pull_mirror_branch_prefix: false)
end
it_behaves_like 'a working pull mirror'
it "doesn't create prefixed branches" do
stub_fetch_mirror(project)
service.execute
expect(project.repository.branch_names).not_to include("#{pull_mirror_branch_prefix}new-branch")
end
end
end
it_behaves_like 'a working pull mirror'
def create_file(repository) def create_file(repository)
repository.create_file( repository.create_file(
...@@ -385,16 +385,42 @@ describe Projects::UpdateMirrorService do ...@@ -385,16 +385,42 @@ describe Projects::UpdateMirrorService do
end end
end end
def rewrite_refs_as_pull_mirror(project)
return unless project.pull_mirror_branch_prefix
return unless Feature.enabled?(:pull_mirror_branch_prefix)
repository = project.repository
old_branches = repository.branches.each_with_object({}) do |branch, branches|
branches[branch.name] = branch.dereferenced_target.id
end
rugged = rugged_repo(repository)
old_branches.each do |name, target|
mirrored_branch_ref = "refs/heads/#{project.pull_mirror_branch_prefix}#{name}"
rugged.references.create(mirrored_branch_ref, target)
rugged.head = mirrored_branch_ref if name == 'master'
rugged.branches.delete(name)
end
repository.expire_branches_cache
repository.branches
end
def stub_fetch_mirror(project, repository: project.repository) def stub_fetch_mirror(project, repository: project.repository)
allow(project).to receive(:fetch_mirror) { fetch_mirror(repository) } branch_prefix = project.pull_mirror_branch_prefix
branch_prefix = '' unless Feature.enabled?(:pull_mirror_branch_prefix)
rewrite_refs_as_pull_mirror(project)
allow(project).to receive(:fetch_mirror) { fetch_mirror(repository, branch_prefix: branch_prefix) }
end end
def fetch_mirror(repository) def fetch_mirror(repository, branch_prefix: '')
rugged = rugged_repo(repository) rugged = rugged_repo(repository)
masterrev = repository.find_branch('master').dereferenced_target.id masterrev = repository.find_branch("#{branch_prefix}master").dereferenced_target.id
parentrev = repository.commit(masterrev).parent_id parentrev = repository.commit(masterrev).parent_id
rugged.references.create('refs/heads/existing-branch', parentrev) rugged.references.create("refs/heads/#{branch_prefix}existing-branch", parentrev)
repository.expire_branches_cache repository.expire_branches_cache
repository.branches repository.branches
......
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