diff options
Diffstat (limited to 'spec/models/repository_spec.rb')
-rw-r--r-- | spec/models/repository_spec.rb | 1617 |
1 files changed, 810 insertions, 807 deletions
diff --git a/spec/models/repository_spec.rb b/spec/models/repository_spec.rb index 17201d8b90a..88d72c90088 100644 --- a/spec/models/repository_spec.rb +++ b/spec/models/repository_spec.rb @@ -1,4 +1,4 @@ -require 'spec_helper' +require "spec_helper" describe Repository do include RepoHelpers @@ -12,21 +12,21 @@ describe Repository do let(:user) { create(:user) } let(:git_user) { Gitlab::Git::User.from_gitlab(user) } - let(:message) { 'Test message' } + let(:message) { "Test message" } let(:merge_commit) do - merge_request = create(:merge_request, source_branch: 'feature', target_branch: 'master', source_project: project) + merge_request = create(:merge_request, source_branch: "feature", target_branch: "master", source_project: project) merge_commit_id = repository.merge(user, - merge_request.diff_head_sha, - merge_request, - message) + merge_request.diff_head_sha, + merge_request, + message) repository.commit(merge_commit_id) end - let(:author_email) { 'user@example.org' } - let(:author_name) { 'John Doe' } + let(:author_email) { "user@example.org" } + let(:author_name) { "John Doe" } def expect_to_raise_storage_error expect { yield }.to raise_error do |exception| @@ -37,18 +37,18 @@ describe Repository do end end - describe '#branch_names_contains' do + describe "#branch_names_contains" do set(:project) { create(:project, :repository) } let(:repository) { project.repository } subject { repository.branch_names_contains(sample_commit.id) } - it { is_expected.to include('master') } - it { is_expected.not_to include('feature') } - it { is_expected.not_to include('fix') } + it { is_expected.to include("master") } + it { is_expected.not_to include("feature") } + it { is_expected.not_to include("fix") } - describe 'when storage is broken', :broken_storage do - it 'should raise a storage error' do + describe "when storage is broken", :broken_storage do + it "should raise a storage error" do expect_to_raise_storage_error do broken_repository.branch_names_contains(sample_commit.id) end @@ -56,32 +56,32 @@ describe Repository do end end - describe '#tag_names_contains' do + describe "#tag_names_contains" do subject { repository.tag_names_contains(sample_commit.id) } - it { is_expected.to include('v1.1.0') } - it { is_expected.not_to include('v1.0.0') } + it { is_expected.to include("v1.1.0") } + it { is_expected.not_to include("v1.0.0") } end - describe 'tags_sorted_by' do - context 'name_desc' do - subject { repository.tags_sorted_by('name_desc').map(&:name) } + describe "tags_sorted_by" do + context "name_desc" do + subject { repository.tags_sorted_by("name_desc").map(&:name) } - it { is_expected.to eq(['v1.1.0', 'v1.0.0']) } + it { is_expected.to eq(["v1.1.0", "v1.0.0"]) } end - context 'name_asc' do - subject { repository.tags_sorted_by('name_asc').map(&:name) } + context "name_asc" do + subject { repository.tags_sorted_by("name_asc").map(&:name) } - it { is_expected.to eq(['v1.0.0', 'v1.1.0']) } + it { is_expected.to eq(["v1.0.0", "v1.1.0"]) } end - context 'updated' do - let(:tag_a) { repository.find_tag('v1.0.0') } - let(:tag_b) { repository.find_tag('v1.1.0') } + context "updated" do + let(:tag_a) { repository.find_tag("v1.0.0") } + let(:tag_b) { repository.find_tag("v1.1.0") } - context 'desc' do - subject { repository.tags_sorted_by('updated_desc').map(&:name) } + context "desc" do + subject { repository.tags_sorted_by("updated_desc").map(&:name) } before do double_first = double(committed_date: Time.now) @@ -92,11 +92,11 @@ describe Repository do allow(repository).to receive(:tags).and_return([tag_a, tag_b]) end - it { is_expected.to eq(['v1.0.0', 'v1.1.0']) } + it { is_expected.to eq(["v1.0.0", "v1.1.0"]) } end - context 'asc' do - subject { repository.tags_sorted_by('updated_asc').map(&:name) } + context "asc" do + subject { repository.tags_sorted_by("updated_asc").map(&:name) } before do double_first = double(committed_date: Time.now - 1.second) @@ -107,19 +107,19 @@ describe Repository do allow(repository).to receive(:tags).and_return([tag_a, tag_b]) end - it { is_expected.to eq(['v1.1.0', 'v1.0.0']) } + it { is_expected.to eq(["v1.1.0", "v1.0.0"]) } end - context 'annotated tag pointing to a blob' do - let(:annotated_tag_name) { 'annotated-tag' } + context "annotated tag pointing to a blob" do + let(:annotated_tag_name) { "annotated-tag" } - subject { repository.tags_sorted_by('updated_asc').map(&:name) } + subject { repository.tags_sorted_by("updated_asc").map(&:name) } before do - options = { message: 'test tag message\n', - tagger: { name: 'John Smith', email: 'john@gmail.com' } } + options = {message: 'test tag message\n', + tagger: {name: "John Smith", email: "john@gmail.com"},} - rugged_repo(repository).tags.create(annotated_tag_name, 'a48e4fc218069f68ef2e769dd8dfea3991362175', options) + rugged_repo(repository).tags.create(annotated_tag_name, "a48e4fc218069f68ef2e769dd8dfea3991362175", options) double_first = double(committed_date: Time.now - 1.second) double_last = double(committed_date: Time.now) @@ -128,7 +128,7 @@ describe Repository do allow(tag_b).to receive(:dereferenced_target).and_return(double_first) end - it { is_expected.to eq(['v1.1.0', 'v1.0.0', annotated_tag_name]) } + it { is_expected.to eq(["v1.1.0", "v1.0.0", annotated_tag_name]) } after do rugged_repo(repository).tags.delete(annotated_tag_name) @@ -137,36 +137,36 @@ describe Repository do end end - describe '#ref_name_for_sha' do - it 'returns the ref' do + describe "#ref_name_for_sha" do + it "returns the ref" do allow(repository.raw_repository).to receive(:ref_name_for_sha) - .and_return('refs/environments/production/77') + .and_return("refs/environments/production/77") - expect(repository.ref_name_for_sha('bla', '0' * 40)).to eq 'refs/environments/production/77' + expect(repository.ref_name_for_sha("bla", "0" * 40)).to eq "refs/environments/production/77" end end - describe '#ref_exists?' do - context 'when ref exists' do - it 'returns true' do - expect(repository.ref_exists?('refs/heads/master')).to be true + describe "#ref_exists?" do + context "when ref exists" do + it "returns true" do + expect(repository.ref_exists?("refs/heads/master")).to be true end end - context 'when ref does not exist' do - it 'returns false' do - expect(repository.ref_exists?('refs/heads/non-existent')).to be false + context "when ref does not exist" do + it "returns false" do + expect(repository.ref_exists?("refs/heads/non-existent")).to be false end end - context 'when ref format is incorrect' do - it 'returns false' do - expect(repository.ref_exists?('refs/heads/invalid:master')).to be false + context "when ref format is incorrect" do + it "returns false" do + expect(repository.ref_exists?("refs/heads/invalid:master")).to be false end end end - describe '#list_last_commits_for_tree' do + describe "#list_last_commits_for_tree" do let(:path_to_commit) do { "encoding" => "913c66a37b4a45b9769037c55c2d238bd0942d2e", @@ -182,14 +182,14 @@ describe Repository do "README.md" => "1a0b36b3cdad1d2ee32457c102a8c0b7056fa863", "VERSION" => "913c66a37b4a45b9769037c55c2d238bd0942d2e", "gitlab-shell" => "6f6d7e7ed97bb5f0054f2b1df789b39ca89b6ff9", - "six" => "cfe32cf61b73a0d5e9f13e774abde7ff789b1660" + "six" => "cfe32cf61b73a0d5e9f13e774abde7ff789b1660", } end - subject { repository.list_last_commits_for_tree(sample_commit.id, '.').id } + subject { repository.list_last_commits_for_tree(sample_commit.id, ".").id } - it 'returns the last commits for every entry in the current path' do - result = repository.list_last_commits_for_tree(sample_commit.id, '.') + it "returns the last commits for every entry in the current path" do + result = repository.list_last_commits_for_tree(sample_commit.id, ".") result.each do |key, value| result[key] = value.id @@ -198,170 +198,170 @@ describe Repository do expect(result).to include(path_to_commit) end - it 'returns the last commits for every entry in the current path starting from the offset' do - result = repository.list_last_commits_for_tree(sample_commit.id, '.', offset: path_to_commit.size - 1) + it "returns the last commits for every entry in the current path starting from the offset" do + result = repository.list_last_commits_for_tree(sample_commit.id, ".", offset: path_to_commit.size - 1) expect(result.size).to eq(1) end - it 'returns a limited number of last commits for every entry in the current path starting from the offset' do - result = repository.list_last_commits_for_tree(sample_commit.id, '.', limit: 1) + it "returns a limited number of last commits for every entry in the current path starting from the offset" do + result = repository.list_last_commits_for_tree(sample_commit.id, ".", limit: 1) expect(result.size).to eq(1) end - it 'returns an empty hash when offset is out of bounds' do - result = repository.list_last_commits_for_tree(sample_commit.id, '.', offset: path_to_commit.size) + it "returns an empty hash when offset is out of bounds" do + result = repository.list_last_commits_for_tree(sample_commit.id, ".", offset: path_to_commit.size) expect(result.size).to eq(0) end end - describe '#last_commit_for_path' do - subject { repository.last_commit_for_path(sample_commit.id, '.gitignore').id } + describe "#last_commit_for_path" do + subject { repository.last_commit_for_path(sample_commit.id, ".gitignore").id } - it { is_expected.to eq('c1acaa58bbcbc3eafe538cb8274ba387047b69f8') } + it { is_expected.to eq("c1acaa58bbcbc3eafe538cb8274ba387047b69f8") } - describe 'when storage is broken', :broken_storage do - it 'should raise a storage error' do + describe "when storage is broken", :broken_storage do + it "should raise a storage error" do expect_to_raise_storage_error do - broken_repository.last_commit_id_for_path(sample_commit.id, '.gitignore') + broken_repository.last_commit_id_for_path(sample_commit.id, ".gitignore") end end end end - describe '#last_commit_id_for_path' do - subject { repository.last_commit_id_for_path(sample_commit.id, '.gitignore') } + describe "#last_commit_id_for_path" do + subject { repository.last_commit_id_for_path(sample_commit.id, ".gitignore") } it "returns last commit id for a given path" do - is_expected.to eq('c1acaa58bbcbc3eafe538cb8274ba387047b69f8') + is_expected.to eq("c1acaa58bbcbc3eafe538cb8274ba387047b69f8") end it "caches last commit id for a given path" do cache = repository.send(:cache) - key = "last_commit_id_for_path:#{sample_commit.id}:#{Digest::SHA1.hexdigest('.gitignore')}" + key = "last_commit_id_for_path:#{sample_commit.id}:#{Digest::SHA1.hexdigest(".gitignore")}" - expect(cache).to receive(:fetch).with(key).and_return('c1acaa5') - is_expected.to eq('c1acaa5') + expect(cache).to receive(:fetch).with(key).and_return("c1acaa5") + is_expected.to eq("c1acaa5") end - describe 'when storage is broken', :broken_storage do - it 'should raise a storage error' do + describe "when storage is broken", :broken_storage do + it "should raise a storage error" do expect_to_raise_storage_error do - broken_repository.last_commit_for_path(sample_commit.id, '.gitignore').id + broken_repository.last_commit_for_path(sample_commit.id, ".gitignore").id end end end end - describe '#commits' do - context 'when neither the all flag nor a ref are specified' do - it 'returns every commit from default branch' do + describe "#commits" do + context "when neither the all flag nor a ref are specified" do + it "returns every commit from default branch" do expect(repository.commits(limit: 60).size).to eq(37) end end - context 'when ref is passed' do - it 'returns every commit from the specified ref' do - expect(repository.commits('master', limit: 60).size).to eq(37) + context "when ref is passed" do + it "returns every commit from the specified ref" do + expect(repository.commits("master", limit: 60).size).to eq(37) end - context 'when all' do - it 'returns every commit from the repository' do - expect(repository.commits('master', limit: 60, all: true).size).to eq(60) + context "when all" do + it "returns every commit from the repository" do + expect(repository.commits("master", limit: 60, all: true).size).to eq(60) end end - context 'with path' do - it 'sets follow when it is a single path' do + context "with path" do + it "sets follow when it is a single path" do expect(Gitlab::Git::Commit).to receive(:where).with(a_hash_including(follow: true)).and_call_original.twice - repository.commits('master', limit: 1, path: 'README.md') - repository.commits('master', limit: 1, path: ['README.md']) + repository.commits("master", limit: 1, path: "README.md") + repository.commits("master", limit: 1, path: ["README.md"]) end - it 'does not set follow when it is multiple paths' do + it "does not set follow when it is multiple paths" do expect(Gitlab::Git::Commit).to receive(:where).with(a_hash_including(follow: false)).and_call_original - repository.commits('master', limit: 1, path: ['README.md', 'CHANGELOG']) + repository.commits("master", limit: 1, path: ["README.md", "CHANGELOG"]) end end - context 'without path' do - it 'does not set follow' do + context "without path" do + it "does not set follow" do expect(Gitlab::Git::Commit).to receive(:where).with(a_hash_including(follow: false)).and_call_original - repository.commits('master', limit: 1) + repository.commits("master", limit: 1) end end end context "when 'all' flag is set" do - it 'returns every commit from the repository' do + it "returns every commit from the repository" do expect(repository.commits(all: true, limit: 60).size).to eq(60) end end end - describe '#new_commits' do + describe "#new_commits" do set(:project) { create(:project, :repository) } let(:repository) { project.repository } subject { repository.new_commits(rev) } - context 'when there are no new commits' do + context "when there are no new commits" do let(:rev) { repository.commit.id } - it 'returns an empty array' do + it "returns an empty array" do expect(subject).to eq([]) end end - context 'when new commits are found' do - let(:branch) { 'orphaned-branch' } + context "when new commits are found" do + let(:branch) { "orphaned-branch" } let!(:rev) { repository.commit(branch).id } - it 'returns the commits' do + it "returns the commits" do repository.delete_branch(branch) expect(subject).not_to be_empty - expect(subject).to all( be_a(::Commit) ) + expect(subject).to all(be_a(::Commit)) expect(subject.size).to eq(1) end end end - describe '#commits_by' do + describe "#commits_by" do set(:project) { create(:project, :repository) } let(:oids) { TestEnv::BRANCH_SHA.values } subject { project.repository.commits_by(oids: oids) } - it 'finds each commit' do + it "finds each commit" do expect(subject).not_to include(nil) expect(subject.size).to eq(oids.size) end - it 'returns only Commit instances' do - expect(subject).to all( be_a(Commit) ) + it "returns only Commit instances" do + expect(subject).to all(be_a(Commit)) end - context 'when some commits are not found ' do + context "when some commits are not found " do let(:oids) do - ['deadbeef'] + TestEnv::BRANCH_SHA.values.first(10) + ["deadbeef"] + TestEnv::BRANCH_SHA.values.first(10) end - it 'returns only found commits' do + it "returns only found commits" do expect(subject).not_to include(nil) expect(subject.size).to eq(10) end end - context 'when no oids are passed' do + context "when no oids are passed" do let(:oids) { [] } - it 'does not call #batch_by_oid' do + it "does not call #batch_by_oid" do expect(Gitlab::Git::Commit).not_to receive(:batch_by_oid) subject @@ -369,154 +369,154 @@ describe Repository do end end - describe '#find_commits_by_message' do - it 'returns commits with messages containing a given string' do - commit_ids = repository.find_commits_by_message('submodule').map(&:id) + describe "#find_commits_by_message" do + it "returns commits with messages containing a given string" do + commit_ids = repository.find_commits_by_message("submodule").map(&:id) expect(commit_ids).to include( - '5937ac0a7beb003549fc5fd26fc247adbce4a52e', - '6f6d7e7ed97bb5f0054f2b1df789b39ca89b6ff9', - 'cfe32cf61b73a0d5e9f13e774abde7ff789b1660' + "5937ac0a7beb003549fc5fd26fc247adbce4a52e", + "6f6d7e7ed97bb5f0054f2b1df789b39ca89b6ff9", + "cfe32cf61b73a0d5e9f13e774abde7ff789b1660" ) - expect(commit_ids).not_to include('913c66a37b4a45b9769037c55c2d238bd0942d2e') + expect(commit_ids).not_to include("913c66a37b4a45b9769037c55c2d238bd0942d2e") end - it 'is case insensitive' do - commit_ids = repository.find_commits_by_message('SUBMODULE').map(&:id) + it "is case insensitive" do + commit_ids = repository.find_commits_by_message("SUBMODULE").map(&:id) - expect(commit_ids).to include('5937ac0a7beb003549fc5fd26fc247adbce4a52e') + expect(commit_ids).to include("5937ac0a7beb003549fc5fd26fc247adbce4a52e") end - describe 'when storage is broken', :broken_storage do - it 'should raise a storage error' do - expect_to_raise_storage_error { broken_repository.find_commits_by_message('s') } + describe "when storage is broken", :broken_storage do + it "should raise a storage error" do + expect_to_raise_storage_error { broken_repository.find_commits_by_message("s") } end end end - describe '#blob_at' do - context 'blank sha' do - subject { repository.blob_at(Gitlab::Git::BLANK_SHA, '.gitignore') } + describe "#blob_at" do + context "blank sha" do + subject { repository.blob_at(Gitlab::Git::BLANK_SHA, ".gitignore") } it { is_expected.to be_nil } end - context 'regular blob' do - subject { repository.blob_at(repository.head_commit.sha, '.gitignore') } + context "regular blob" do + subject { repository.blob_at(repository.head_commit.sha, ".gitignore") } it { is_expected.to be_an_instance_of(::Blob) } end - context 'readme blob on HEAD' do - subject { repository.blob_at(repository.head_commit.sha, 'README.md') } + context "readme blob on HEAD" do + subject { repository.blob_at(repository.head_commit.sha, "README.md") } it { is_expected.to be_an_instance_of(::ReadmeBlob) } end - context 'readme blob not on HEAD' do - subject { repository.blob_at(repository.find_branch('feature').target, 'README.md') } + context "readme blob not on HEAD" do + subject { repository.blob_at(repository.find_branch("feature").target, "README.md") } it { is_expected.to be_an_instance_of(::Blob) } end end - describe '#merged_to_root_ref?' do - context 'merged branch without ff' do - subject { repository.merged_to_root_ref?('branch-merged') } + describe "#merged_to_root_ref?" do + context "merged branch without ff" do + subject { repository.merged_to_root_ref?("branch-merged") } it { is_expected.to be_truthy } end # If the HEAD was ff then it will be false - context 'merged with ff' do - subject { repository.merged_to_root_ref?('improve/awesome') } + context "merged with ff" do + subject { repository.merged_to_root_ref?("improve/awesome") } it { is_expected.to be_truthy } end - context 'not merged branch' do - subject { repository.merged_to_root_ref?('not-merged-branch') } + context "not merged branch" do + subject { repository.merged_to_root_ref?("not-merged-branch") } it { is_expected.to be_falsey } end - context 'default branch' do - subject { repository.merged_to_root_ref?('master') } + context "default branch" do + subject { repository.merged_to_root_ref?("master") } it { is_expected.to be_falsey } end - context 'non merged branch' do - subject { repository.merged_to_root_ref?('fix') } + context "non merged branch" do + subject { repository.merged_to_root_ref?("fix") } it { is_expected.to be_falsey } end - context 'non existent branch' do - subject { repository.merged_to_root_ref?('non_existent_branch') } + context "non existent branch" do + subject { repository.merged_to_root_ref?("non_existent_branch") } it { is_expected.to be_nil } end end - describe '#can_be_merged?' do - context 'mergeable branches' do - subject { repository.can_be_merged?('0b4bc9a49b562e85de7cc9e834518ea6828729b9', 'master') } + describe "#can_be_merged?" do + context "mergeable branches" do + subject { repository.can_be_merged?("0b4bc9a49b562e85de7cc9e834518ea6828729b9", "master") } it { is_expected.to be_truthy } end - context 'non-mergeable branches without conflict sides missing' do - subject { repository.can_be_merged?('bb5206fee213d983da88c47f9cf4cc6caf9c66dc', 'feature') } + context "non-mergeable branches without conflict sides missing" do + subject { repository.can_be_merged?("bb5206fee213d983da88c47f9cf4cc6caf9c66dc", "feature") } it { is_expected.to be_falsey } end - context 'non-mergeable branches with conflict sides missing' do - subject { repository.can_be_merged?('conflict-missing-side', 'conflict-start') } + context "non-mergeable branches with conflict sides missing" do + subject { repository.can_be_merged?("conflict-missing-side", "conflict-start") } it { is_expected.to be_falsey } end - context 'submodule changes that confuse rugged' do - subject { repository.can_be_merged?('update-gitlab-shell-v-6-0-1', 'update-gitlab-shell-v-6-0-3') } + context "submodule changes that confuse rugged" do + subject { repository.can_be_merged?("update-gitlab-shell-v-6-0-1", "update-gitlab-shell-v-6-0-3") } it { is_expected.to be_falsey } end end - describe '#commit' do - context 'when ref exists' do - it 'returns commit object' do - expect(repository.commit('master')) + describe "#commit" do + context "when ref exists" do + it "returns commit object" do + expect(repository.commit("master")) .to be_an_instance_of Commit end end - context 'when ref does not exist' do - it 'returns nil' do - expect(repository.commit('non-existent-ref')).to be_nil + context "when ref does not exist" do + it "returns nil" do + expect(repository.commit("non-existent-ref")).to be_nil end end - context 'when ref is not specified' do - it 'is using a root ref' do - expect(repository).to receive(:find_commit).with('master') + context "when ref is not specified" do + it "is using a root ref" do + expect(repository).to receive(:find_commit).with("master") repository.commit end end - context 'when ref is not valid' do - context 'when preceding tree element exists' do - it 'returns nil' do - expect(repository.commit('master:ref')).to be_nil + context "when ref is not valid" do + context "when preceding tree element exists" do + it "returns nil" do + expect(repository.commit("master:ref")).to be_nil end end - context 'when preceding tree element does not exist' do - it 'returns nil' do - expect(repository.commit('non-existent:ref')).to be_nil + context "when preceding tree element does not exist" do + it "returns nil" do + expect(repository.commit("non-existent:ref")).to be_nil end end end @@ -524,41 +524,41 @@ describe Repository do describe "#create_dir" do it "commits a change that creates a new directory" do - expect do - repository.create_dir(user, 'newdir', - message: 'Create newdir', branch_name: 'master') - end.to change { repository.count_commits(ref: 'master') }.by(1) + expect { + repository.create_dir(user, "newdir", + message: "Create newdir", branch_name: "master") + }.to change { repository.count_commits(ref: "master") }.by(1) - newdir = repository.tree('master', 'newdir') - expect(newdir.path).to eq('newdir') + newdir = repository.tree("master", "newdir") + expect(newdir.path).to eq("newdir") end context "when committing to another project" do let(:forked_project) { create(:project, :repository) } it "creates a fork and commit to the forked project" do - expect do - repository.create_dir(user, 'newdir', - message: 'Create newdir', branch_name: 'patch', - start_branch_name: 'master', start_project: forked_project) - end.to change { repository.count_commits(ref: 'master') }.by(0) + expect { + repository.create_dir(user, "newdir", + message: "Create newdir", branch_name: "patch", + start_branch_name: "master", start_project: forked_project) + }.to change { repository.count_commits(ref: "master") }.by(0) - expect(repository.branch_exists?('patch')).to be_truthy - expect(forked_project.repository.branch_exists?('patch')).to be_falsy + expect(repository.branch_exists?("patch")).to be_truthy + expect(forked_project.repository.branch_exists?("patch")).to be_falsy - newdir = repository.tree('patch', 'newdir') - expect(newdir.path).to eq('newdir') + newdir = repository.tree("patch", "newdir") + expect(newdir.path).to eq("newdir") end end context "when an author is specified" do it "uses the given email/name to set the commit's author" do - expect do - repository.create_dir(user, 'newdir', - message: 'Add newdir', - branch_name: 'master', + expect { + repository.create_dir(user, "newdir", + message: "Add newdir", + branch_name: "master", author_email: author_email, author_name: author_name) - end.to change { repository.count_commits(ref: 'master') }.by(1) + }.to change { repository.count_commits(ref: "master") }.by(1) last_commit = repository.commit @@ -569,48 +569,48 @@ describe Repository do end describe "#create_file" do - it 'commits new file successfully' do - expect do - repository.create_file(user, 'NEWCHANGELOG', 'Changelog!', - message: 'Create changelog', - branch_name: 'master') - end.to change { repository.count_commits(ref: 'master') }.by(1) + it "commits new file successfully" do + expect { + repository.create_file(user, "NEWCHANGELOG", "Changelog!", + message: "Create changelog", + branch_name: "master") + }.to change { repository.count_commits(ref: "master") }.by(1) - blob = repository.blob_at('master', 'NEWCHANGELOG') + blob = repository.blob_at("master", "NEWCHANGELOG") - expect(blob.data).to eq('Changelog!') + expect(blob.data).to eq("Changelog!") end - it 'creates new file and dir when file_path has a forward slash' do - expect do - repository.create_file(user, 'new_dir/new_file.txt', 'File!', - message: 'Create new_file with new_dir', - branch_name: 'master') - end.to change { repository.count_commits(ref: 'master') }.by(1) + it "creates new file and dir when file_path has a forward slash" do + expect { + repository.create_file(user, "new_dir/new_file.txt", "File!", + message: "Create new_file with new_dir", + branch_name: "master") + }.to change { repository.count_commits(ref: "master") }.by(1) - expect(repository.tree('master', 'new_dir').path).to eq('new_dir') - expect(repository.blob_at('master', 'new_dir/new_file.txt').data).to eq('File!') + expect(repository.tree("master", "new_dir").path).to eq("new_dir") + expect(repository.blob_at("master", "new_dir/new_file.txt").data).to eq("File!") end - it 'respects the autocrlf setting' do - repository.create_file(user, 'hello.txt', "Hello,\r\nWorld", - message: 'Add hello world', - branch_name: 'master') + it "respects the autocrlf setting" do + repository.create_file(user, "hello.txt", "Hello,\r\nWorld", + message: "Add hello world", + branch_name: "master") - blob = repository.blob_at('master', 'hello.txt') + blob = repository.blob_at("master", "hello.txt") expect(blob.data).to eq("Hello,\nWorld") end context "when an author is specified" do it "uses the given email/name to set the commit's author" do - expect do - repository.create_file(user, 'NEWREADME', 'README!', - message: 'Add README', - branch_name: 'master', - author_email: author_email, - author_name: author_name) - end.to change { repository.count_commits(ref: 'master') }.by(1) + expect { + repository.create_file(user, "NEWREADME", "README!", + message: "Add README", + branch_name: "master", + author_email: author_email, + author_name: author_name) + }.to change { repository.count_commits(ref: "master") }.by(1) last_commit = repository.commit @@ -621,42 +621,42 @@ describe Repository do end describe "#update_file" do - it 'updates file successfully' do - expect do - repository.update_file(user, 'CHANGELOG', 'Changelog!', - message: 'Update changelog', - branch_name: 'master') - end.to change { repository.count_commits(ref: 'master') }.by(1) + it "updates file successfully" do + expect { + repository.update_file(user, "CHANGELOG", "Changelog!", + message: "Update changelog", + branch_name: "master") + }.to change { repository.count_commits(ref: "master") }.by(1) - blob = repository.blob_at('master', 'CHANGELOG') + blob = repository.blob_at("master", "CHANGELOG") - expect(blob.data).to eq('Changelog!') + expect(blob.data).to eq("Changelog!") end - it 'updates filename successfully' do - expect do - repository.update_file(user, 'NEWLICENSE', 'Copyright!', - branch_name: 'master', - previous_path: 'LICENSE', - message: 'Changes filename') - end.to change { repository.count_commits(ref: 'master') }.by(1) + it "updates filename successfully" do + expect { + repository.update_file(user, "NEWLICENSE", "Copyright!", + branch_name: "master", + previous_path: "LICENSE", + message: "Changes filename") + }.to change { repository.count_commits(ref: "master") }.by(1) - files = repository.ls_files('master') + files = repository.ls_files("master") - expect(files).not_to include('LICENSE') - expect(files).to include('NEWLICENSE') + expect(files).not_to include("LICENSE") + expect(files).to include("NEWLICENSE") end context "when an author is specified" do it "uses the given email/name to set the commit's author" do - expect do - repository.update_file(user, 'README', 'Updated README!', - branch_name: 'master', - previous_path: 'README', - message: 'Update README', - author_email: author_email, - author_name: author_name) - end.to change { repository.count_commits(ref: 'master') }.by(1) + expect { + repository.update_file(user, "README", "Updated README!", + branch_name: "master", + previous_path: "README", + message: "Update README", + author_email: author_email, + author_name: author_name) + }.to change { repository.count_commits(ref: "master") }.by(1) last_commit = repository.commit @@ -667,22 +667,22 @@ describe Repository do end describe "#delete_file" do - it 'removes file successfully' do - expect do - repository.delete_file(user, 'README', - message: 'Remove README', branch_name: 'master') - end.to change { repository.count_commits(ref: 'master') }.by(1) + it "removes file successfully" do + expect { + repository.delete_file(user, "README", + message: "Remove README", branch_name: "master") + }.to change { repository.count_commits(ref: "master") }.by(1) - expect(repository.blob_at('master', 'README')).to be_nil + expect(repository.blob_at("master", "README")).to be_nil end context "when an author is specified" do it "uses the given email/name to set the commit's author" do - expect do - repository.delete_file(user, 'README', - message: 'Remove README', branch_name: 'master', + expect { + repository.delete_file(user, "README", + message: "Remove README", branch_name: "master", author_email: author_email, author_name: author_name) - end.to change { repository.count_commits(ref: 'master') }.by(1) + }.to change { repository.count_commits(ref: "master") }.by(1) last_commit = repository.commit @@ -693,45 +693,45 @@ describe Repository do end describe "search_files_by_content" do - let(:results) { repository.search_files_by_content('feature', 'master') } + let(:results) { repository.search_files_by_content("feature", "master") } subject { results } it { is_expected.to be_an Array } - it 'regex-escapes the query string' do - results = repository.search_files_by_content("test\\", 'master') + it "regex-escapes the query string" do + results = repository.search_files_by_content("test\\", "master") - expect(results.first).not_to start_with('fatal:') + expect(results.first).not_to start_with("fatal:") end - it 'properly handles an unmatched parenthesis' do - results = repository.search_files_by_content("test(", 'master') + it "properly handles an unmatched parenthesis" do + results = repository.search_files_by_content("test(", "master") - expect(results.first).not_to start_with('fatal:') + expect(results.first).not_to start_with("fatal:") end - it 'properly handles when query is not present' do - results = repository.search_files_by_content('', 'master') + it "properly handles when query is not present" do + results = repository.search_files_by_content("", "master") expect(results).to match_array([]) end - it 'properly handles query when repo is empty' do + it "properly handles query when repo is empty" do repository = create(:project, :empty_repo).repository - results = repository.search_files_by_content('test', 'master') + results = repository.search_files_by_content("test", "master") expect(results).to match_array([]) end - describe 'when storage is broken', :broken_storage do - it 'should raise a storage error' do + describe "when storage is broken", :broken_storage do + it "should raise a storage error" do expect_to_raise_storage_error do - broken_repository.search_files_by_content('feature', 'master') + broken_repository.search_files_by_content("feature", "master") end end end - describe 'result' do + describe "result" do subject { results.first } it { is_expected.to be_an String } @@ -740,92 +740,92 @@ describe Repository do end describe "search_files_by_name" do - let(:results) { repository.search_files_by_name('files', 'master') } + let(:results) { repository.search_files_by_name("files", "master") } - it 'returns result' do - expect(results.first).to eq('files/html/500.html') + it "returns result" do + expect(results.first).to eq("files/html/500.html") end - it 'ignores leading slashes' do - results = repository.search_files_by_name('/files', 'master') + it "ignores leading slashes" do + results = repository.search_files_by_name("/files", "master") - expect(results.first).to eq('files/html/500.html') + expect(results.first).to eq("files/html/500.html") end - it 'properly handles when query is only slashes' do - results = repository.search_files_by_name('//', 'master') + it "properly handles when query is only slashes" do + results = repository.search_files_by_name("//", "master") expect(results).to match_array([]) end - it 'properly handles when query is not present' do - results = repository.search_files_by_name('', 'master') + it "properly handles when query is not present" do + results = repository.search_files_by_name("", "master") expect(results).to match_array([]) end - it 'properly handles query when repo is empty' do + it "properly handles query when repo is empty" do repository = create(:project, :empty_repo).repository - results = repository.search_files_by_name('test', 'master') + results = repository.search_files_by_name("test", "master") expect(results).to match_array([]) end - describe 'when storage is broken', :broken_storage do - it 'should raise a storage error' do - expect_to_raise_storage_error { broken_repository.search_files_by_name('files', 'master') } + describe "when storage is broken", :broken_storage do + it "should raise a storage error" do + expect_to_raise_storage_error { broken_repository.search_files_by_name("files", "master") } end end end - describe '#async_remove_remote' do + describe "#async_remove_remote" do before do - masterrev = repository.find_branch('master').dereferenced_target - create_remote_branch('joe', 'remote_branch', masterrev) + masterrev = repository.find_branch("master").dereferenced_target + create_remote_branch("joe", "remote_branch", masterrev) end - context 'when worker is scheduled successfully' do + context "when worker is scheduled successfully" do before do - masterrev = repository.find_branch('master').dereferenced_target - create_remote_branch('remote_name', 'remote_branch', masterrev) + masterrev = repository.find_branch("master").dereferenced_target + create_remote_branch("remote_name", "remote_branch", masterrev) - allow(RepositoryRemoveRemoteWorker).to receive(:perform_async).and_return('1234') + allow(RepositoryRemoveRemoteWorker).to receive(:perform_async).and_return("1234") end - it 'returns job_id' do - expect(repository.async_remove_remote('joe')).to eq('1234') + it "returns job_id" do + expect(repository.async_remove_remote("joe")).to eq("1234") end end - context 'when worker does not schedule successfully' do + context "when worker does not schedule successfully" do before do allow(RepositoryRemoveRemoteWorker).to receive(:perform_async).and_return(nil) end - it 'returns nil' do + it "returns nil" do expect(Rails.logger).to receive(:info).with("Remove remote job failed to create for #{project.id} with remote name joe.") - expect(repository.async_remove_remote('joe')).to be_nil + expect(repository.async_remove_remote("joe")).to be_nil end end end - describe '#fetch_ref' do + describe "#fetch_ref" do let(:broken_repository) { create(:project, :broken_storage).repository } - describe 'when storage is broken', :broken_storage do - it 'should raise a storage error' do + describe "when storage is broken", :broken_storage do + it "should raise a storage error" do expect_to_raise_storage_error do - broken_repository.fetch_ref(broken_repository, source_ref: '1', target_ref: '2') + broken_repository.fetch_ref(broken_repository, source_ref: "1", target_ref: "2") end end end end - describe '#create_ref' do - it 'redirects the call to write_ref' do - ref, ref_path = '1', '2' + describe "#create_ref" do + it "redirects the call to write_ref" do + ref, ref_path = "1", "2" expect(repository.raw_repository).to receive(:write_ref).with(ref_path, ref) @@ -834,241 +834,243 @@ describe Repository do end describe "#changelog", :use_clean_rails_memory_store_caching do - it 'accepts changelog' do - expect(repository.tree).to receive(:blobs).and_return([TestBlob.new('changelog')]) + it "accepts changelog" do + expect(repository.tree).to receive(:blobs).and_return([TestBlob.new("changelog")]) - expect(repository.changelog.path).to eq('changelog') + expect(repository.changelog.path).to eq("changelog") end - it 'accepts news instead of changelog' do - expect(repository.tree).to receive(:blobs).and_return([TestBlob.new('news')]) + it "accepts news instead of changelog" do + expect(repository.tree).to receive(:blobs).and_return([TestBlob.new("news")]) - expect(repository.changelog.path).to eq('news') + expect(repository.changelog.path).to eq("news") end - it 'accepts history instead of changelog' do - expect(repository.tree).to receive(:blobs).and_return([TestBlob.new('history')]) + it "accepts history instead of changelog" do + expect(repository.tree).to receive(:blobs).and_return([TestBlob.new("history")]) - expect(repository.changelog.path).to eq('history') + expect(repository.changelog.path).to eq("history") end - it 'accepts changes instead of changelog' do - expect(repository.tree).to receive(:blobs).and_return([TestBlob.new('changes')]) + it "accepts changes instead of changelog" do + expect(repository.tree).to receive(:blobs).and_return([TestBlob.new("changes")]) - expect(repository.changelog.path).to eq('changes') + expect(repository.changelog.path).to eq("changes") end - it 'is case-insensitive' do - expect(repository.tree).to receive(:blobs).and_return([TestBlob.new('CHANGELOG')]) + it "is case-insensitive" do + expect(repository.tree).to receive(:blobs).and_return([TestBlob.new("CHANGELOG")]) - expect(repository.changelog.path).to eq('CHANGELOG') + expect(repository.changelog.path).to eq("CHANGELOG") end end describe "#license_blob", :use_clean_rails_memory_store_caching do before do repository.delete_file( - user, 'LICENSE', message: 'Remove LICENSE', branch_name: 'master') + user, "LICENSE", message: "Remove LICENSE", branch_name: "master" + ) end - it 'handles when HEAD points to non-existent ref' do + it "handles when HEAD points to non-existent ref" do repository.create_file( - user, 'LICENSE', 'Copyright!', - message: 'Add LICENSE', branch_name: 'master') + user, "LICENSE", "Copyright!", + message: "Add LICENSE", branch_name: "master" + ) allow(repository).to receive(:root_ref).and_raise(Gitlab::Git::Repository::NoRepository) expect(repository.license_blob).to be_nil end - it 'looks in the root_ref only' do - repository.delete_file(user, 'LICENSE', - message: 'Remove LICENSE', branch_name: 'markdown') - repository.create_file(user, 'LICENSE', - Licensee::License.new('mit').content, - message: 'Add LICENSE', branch_name: 'markdown') + it "looks in the root_ref only" do + repository.delete_file(user, "LICENSE", + message: "Remove LICENSE", branch_name: "markdown") + repository.create_file(user, "LICENSE", + Licensee::License.new("mit").content, + message: "Add LICENSE", branch_name: "markdown") expect(repository.license_blob).to be_nil end - it 'detects license file with no recognizable open-source license content' do - repository.create_file(user, 'LICENSE', 'Copyright!', - message: 'Add LICENSE', branch_name: 'master') + it "detects license file with no recognizable open-source license content" do + repository.create_file(user, "LICENSE", "Copyright!", + message: "Add LICENSE", branch_name: "master") - expect(repository.license_blob.path).to eq('LICENSE') + expect(repository.license_blob.path).to eq("LICENSE") end %w[LICENSE LICENCE LiCensE LICENSE.md LICENSE.foo COPYING COPYING.md].each do |filename| it "detects '#{filename}'" do repository.create_file(user, filename, - Licensee::License.new('mit').content, - message: "Add #{filename}", branch_name: 'master') + Licensee::License.new("mit").content, + message: "Add #{filename}", branch_name: "master") expect(repository.license_blob.name).to eq(filename) end end end - describe '#license_key', :use_clean_rails_memory_store_caching do + describe "#license_key", :use_clean_rails_memory_store_caching do before do - repository.delete_file(user, 'LICENSE', - message: 'Remove LICENSE', branch_name: 'master') + repository.delete_file(user, "LICENSE", + message: "Remove LICENSE", branch_name: "master") end - it 'returns nil when no license is detected' do + it "returns nil when no license is detected" do expect(repository.license_key).to be_nil end - it 'returns nil when the repository does not exist' do + it "returns nil when the repository does not exist" do expect(repository).to receive(:exists?).and_return(false) expect(repository.license_key).to be_nil end - it 'returns nil when the content is not recognizable' do - repository.create_file(user, 'LICENSE', 'Gitlab B.V.', - message: 'Add LICENSE', branch_name: 'master') + it "returns nil when the content is not recognizable" do + repository.create_file(user, "LICENSE", "Gitlab B.V.", + message: "Add LICENSE", branch_name: "master") expect(repository.license_key).to be_nil end - it 'returns nil when the commit SHA does not exist' do - allow(repository.head_commit).to receive(:sha).and_return('1' * 40) + it "returns nil when the commit SHA does not exist" do + allow(repository.head_commit).to receive(:sha).and_return("1" * 40) expect(repository.license_key).to be_nil end - it 'returns nil when master does not exist' do - repository.rm_branch(user, 'master') + it "returns nil when master does not exist" do + repository.rm_branch(user, "master") expect(repository.license_key).to be_nil end - it 'returns the license key' do - repository.create_file(user, 'LICENSE', - Licensee::License.new('mit').content, - message: 'Add LICENSE', branch_name: 'master') + it "returns the license key" do + repository.create_file(user, "LICENSE", + Licensee::License.new("mit").content, + message: "Add LICENSE", branch_name: "master") - expect(repository.license_key).to eq('mit') + expect(repository.license_key).to eq("mit") end end - describe '#license' do + describe "#license" do before do - repository.delete_file(user, 'LICENSE', - message: 'Remove LICENSE', branch_name: 'master') + repository.delete_file(user, "LICENSE", + message: "Remove LICENSE", branch_name: "master") end - it 'returns nil when no license is detected' do + it "returns nil when no license is detected" do expect(repository.license).to be_nil end - it 'returns nil when the repository does not exist' do + it "returns nil when the repository does not exist" do expect(repository).to receive(:exists?).and_return(false) expect(repository.license).to be_nil end - it 'returns nil when the content is not recognizable' do - repository.create_file(user, 'LICENSE', 'Gitlab B.V.', - message: 'Add LICENSE', branch_name: 'master') + it "returns nil when the content is not recognizable" do + repository.create_file(user, "LICENSE", "Gitlab B.V.", + message: "Add LICENSE", branch_name: "master") expect(repository.license).to be_nil end - it 'returns the license' do - license = Licensee::License.new('mit') - repository.create_file(user, 'LICENSE', + it "returns the license" do + license = Licensee::License.new("mit") + repository.create_file(user, "LICENSE", license.content, - message: 'Add LICENSE', branch_name: 'master') + message: "Add LICENSE", branch_name: "master") expect(repository.license).to eq(license) end end describe "#gitlab_ci_yml", :use_clean_rails_memory_store_caching do - it 'returns valid file' do - files = [TestBlob.new('file'), TestBlob.new('.gitlab-ci.yml'), TestBlob.new('copying')] + it "returns valid file" do + files = [TestBlob.new("file"), TestBlob.new(".gitlab-ci.yml"), TestBlob.new("copying")] expect(repository.tree).to receive(:blobs).and_return(files) - expect(repository.gitlab_ci_yml.path).to eq('.gitlab-ci.yml') + expect(repository.gitlab_ci_yml.path).to eq(".gitlab-ci.yml") end - it 'returns nil if not exists' do + it "returns nil if not exists" do expect(repository.tree).to receive(:blobs).and_return([]) expect(repository.gitlab_ci_yml).to be_nil end - it 'returns nil for empty repository' do + it "returns nil for empty repository" do allow(repository).to receive(:root_ref).and_raise(Gitlab::Git::Repository::NoRepository) expect(repository.gitlab_ci_yml).to be_nil end end - describe '#ambiguous_ref?' do - let(:ref) { 'ref' } + describe "#ambiguous_ref?" do + let(:ref) { "ref" } subject { repository.ambiguous_ref?(ref) } - context 'when ref is ambiguous' do + context "when ref is ambiguous" do before do - repository.add_tag(project.creator, ref, 'master') - repository.add_branch(project.creator, ref, 'master') + repository.add_tag(project.creator, ref, "master") + repository.add_branch(project.creator, ref, "master") end - it 'should be true' do + it "should be true" do is_expected.to eq(true) end end - context 'when ref is not ambiguous' do + context "when ref is not ambiguous" do before do - repository.add_tag(project.creator, ref, 'master') + repository.add_tag(project.creator, ref, "master") end - it 'should be false' do + it "should be false" do is_expected.to eq(false) end end end - describe '#expand_ref' do - let(:ref) { 'ref' } + describe "#expand_ref" do + let(:ref) { "ref" } subject { repository.expand_ref(ref) } - context 'when ref is not tag or branch name' do - let(:ref) { 'refs/heads/master' } + context "when ref is not tag or branch name" do + let(:ref) { "refs/heads/master" } - it 'returns nil' do + it "returns nil" do is_expected.to eq(nil) end end - context 'when ref is tag name' do + context "when ref is tag name" do before do - repository.add_tag(project.creator, ref, 'master') + repository.add_tag(project.creator, ref, "master") end - it 'returns the tag ref' do + it "returns the tag ref" do is_expected.to eq("refs/tags/#{ref}") end end - context 'when ref is branch name' do + context "when ref is branch name" do before do - repository.add_branch(project.creator, ref, 'master') + repository.add_branch(project.creator, ref, "master") end - it 'returns the branch ref' do + it "returns the branch ref" do is_expected.to eq("refs/heads/#{ref}") end end end - describe '#add_branch' do - let(:branch_name) { 'new_feature' } - let(:target) { 'master' } + describe "#add_branch" do + let(:branch_name) { "new_feature" } + let(:target) { "master" } subject { repository.add_branch(user, branch_name, target) } @@ -1080,13 +1082,13 @@ describe Repository do subject end - it 'creates_the_branch' do + it "creates_the_branch" do expect(subject.name).to eq(branch_name) expect(repository.find_branch(branch_name)).not_to be_nil end - context 'with a non-existing target' do - let(:target) { 'fake-target' } + context "with a non-existing target" do + let(:target) { "fake-target" } it "returns false and doesn't create the branch" do expect(subject).to be(false) @@ -1095,66 +1097,66 @@ describe Repository do end end - describe '#exists?' do - it 'returns true when a repository exists' do + describe "#exists?" do + it "returns true when a repository exists" do expect(repository.exists?).to be(true) end - it 'returns false if no full path can be constructed' do + it "returns false if no full path can be constructed" do allow(repository).to receive(:full_path).and_return(nil) expect(repository.exists?).to be(false) end - context 'with broken storage', :broken_storage do - it 'should raise a storage error' do + context "with broken storage", :broken_storage do + it "should raise a storage error" do expect_to_raise_storage_error { broken_repository.exists? } end end - context 'asymmetric caching', :use_clean_rails_memory_store_caching, :request_store do + context "asymmetric caching", :use_clean_rails_memory_store_caching, :request_store do let(:cache) { repository.send(:cache) } let(:request_store_cache) { repository.send(:request_store_cache) } - context 'when it returns true' do + context "when it returns true" do before do expect(repository.raw_repository).to receive(:exists?).once.and_return(true) end - it 'caches the output in RequestStore' do - expect do + it "caches the output in RequestStore" do + expect { repository.exists? - end.to change { request_store_cache.read(:exists?) }.from(nil).to(true) + }.to change { request_store_cache.read(:exists?) }.from(nil).to(true) end - it 'caches the output in RepositoryCache' do - expect do + it "caches the output in RepositoryCache" do + expect { repository.exists? - end.to change { cache.read(:exists?) }.from(nil).to(true) + }.to change { cache.read(:exists?) }.from(nil).to(true) end end - context 'when it returns false' do + context "when it returns false" do before do expect(repository.raw_repository).to receive(:exists?).once.and_return(false) end - it 'caches the output in RequestStore' do - expect do + it "caches the output in RequestStore" do + expect { repository.exists? - end.to change { request_store_cache.read(:exists?) }.from(nil).to(false) + }.to change { request_store_cache.read(:exists?) }.from(nil).to(false) end - it 'does NOT cache the output in RepositoryCache' do - expect do + it "does NOT cache the output in RepositoryCache" do + expect { repository.exists? - end.not_to change { cache.read(:exists?) }.from(nil) + }.not_to change { cache.read(:exists?) }.from(nil) end end end end - describe '#has_visible_content?' do + describe "#has_visible_content?" do before do # If raw_repository.has_visible_content? gets called more than once then # caching is broken. We don't want that. @@ -1163,20 +1165,20 @@ describe Repository do .and_return(result) end - context 'when true' do + context "when true" do let(:result) { true } - it 'returns true and caches it' do + it "returns true and caches it" do expect(repository.has_visible_content?).to eq(true) # Second call hits the cache expect(repository.has_visible_content?).to eq(true) end end - context 'when false' do + context "when false" do let(:result) { false } - it 'returns false and caches it' do + it "returns false and caches it" do expect(repository.has_visible_content?).to eq(false) # Second call hits the cache expect(repository.has_visible_content?).to eq(false) @@ -1184,28 +1186,28 @@ describe Repository do end end - describe '#branch_exists?' do - it 'uses branch_names' do - allow(repository).to receive(:branch_names).and_return(['foobar']) + describe "#branch_exists?" do + it "uses branch_names" do + allow(repository).to receive(:branch_names).and_return(["foobar"]) - expect(repository.branch_exists?('foobar')).to eq(true) - expect(repository.branch_exists?('master')).to eq(false) + expect(repository.branch_exists?("foobar")).to eq(true) + expect(repository.branch_exists?("master")).to eq(false) end end - describe '#tag_exists?' do - it 'uses tag_names' do - allow(repository).to receive(:tag_names).and_return(['foobar']) + describe "#tag_exists?" do + it "uses tag_names" do + allow(repository).to receive(:tag_names).and_return(["foobar"]) - expect(repository.tag_exists?('foobar')).to eq(true) - expect(repository.tag_exists?('master')).to eq(false) + expect(repository.tag_exists?("foobar")).to eq(true) + expect(repository.tag_exists?("master")).to eq(false) end end - describe '#branch_names', :use_clean_rails_memory_store_caching do - let(:fake_branch_names) { ['foobar'] } + describe "#branch_names", :use_clean_rails_memory_store_caching do + let(:fake_branch_names) { ["foobar"] } - it 'gets cached across Repository instances' do + it "gets cached across Repository instances" do allow(repository.raw_repository).to receive(:branch_names).once.and_return(fake_branch_names) expect(repository.branch_names).to eq(fake_branch_names) @@ -1218,18 +1220,18 @@ describe Repository do end end - describe '#empty?' do + describe "#empty?" do let(:empty_repository) { create(:project_empty_repo).repository } - it 'returns true for an empty repository' do + it "returns true for an empty repository" do expect(empty_repository).to be_empty end - it 'returns false for a non-empty repository' do + it "returns false for a non-empty repository" do expect(repository).not_to be_empty end - it 'caches the output' do + it "caches the output" do expect(repository.raw_repository).to receive(:has_visible_content?).once repository.empty? @@ -1237,62 +1239,62 @@ describe Repository do end end - describe '#blobs_at' do + describe "#blobs_at" do let(:empty_repository) { create(:project_empty_repo).repository } - it 'returns empty array for an empty repository' do + it "returns empty array for an empty repository" do # rubocop:disable Style/WordArray - expect(empty_repository.blobs_at(['master', 'foobar'])).to eq([]) + expect(empty_repository.blobs_at(["master", "foobar"])).to eq([]) # rubocop:enable Style/WordArray end - it 'returns blob array for a non-empty repository' do - repository.create_file(User.last, 'foobar', 'CONTENT', message: 'message', branch_name: 'master') + it "returns blob array for a non-empty repository" do + repository.create_file(User.last, "foobar", "CONTENT", message: "message", branch_name: "master") # rubocop:disable Style/WordArray - blobs = repository.blobs_at([['master', 'foobar']]) + blobs = repository.blobs_at([["master", "foobar"]]) # rubocop:enable Style/WordArray - expect(blobs.first.name).to eq('foobar') + expect(blobs.first.name).to eq("foobar") expect(blobs.size).to eq(1) end end - describe '#root_ref' do - it 'returns a branch name' do + describe "#root_ref" do + it "returns a branch name" do expect(repository.root_ref).to be_an_instance_of(String) end - it 'caches the output' do + it "caches the output" do expect(repository.raw_repository).to receive(:root_ref) .once - .and_return('master') + .and_return("master") repository.root_ref repository.root_ref end end - describe '#expire_root_ref_cache' do - it 'expires the root reference cache' do + describe "#expire_root_ref_cache" do + it "expires the root reference cache" do repository.root_ref expect(repository.raw_repository).to receive(:root_ref) .once - .and_return('foo') + .and_return("foo") repository.expire_root_ref_cache - expect(repository.root_ref).to eq('foo') + expect(repository.root_ref).to eq("foo") end end - describe '#expire_branch_cache' do + describe "#expire_branch_cache" do # This method is private but we need it for testing purposes. Sadly there's # no other proper way of testing caching operations. let(:cache) { repository.send(:cache) } - it 'expires the cache for all branches' do + it "expires the cache for all branches" do expect(cache).to receive(:expire) .at_least(repository.branches.length * 2) .times @@ -1300,7 +1302,7 @@ describe Repository do repository.expire_branch_cache end - it 'expires the cache for all branches when the root branch is given' do + it "expires the cache for all branches when the root branch is given" do expect(cache).to receive(:expire) .at_least(repository.branches.length * 2) .times @@ -1308,17 +1310,17 @@ describe Repository do repository.expire_branch_cache(repository.root_ref) end - it 'expires the cache for a specific branch' do + it "expires the cache for a specific branch" do expect(cache).to receive(:expire).twice - repository.expire_branch_cache('foo') + repository.expire_branch_cache("foo") end end - describe '#expire_emptiness_caches' do + describe "#expire_emptiness_caches" do let(:cache) { repository.send(:cache) } - it 'expires the caches for an empty repository' do + it "expires the caches for an empty repository" do allow(repository).to receive(:empty?).and_return(true) expect(cache).to receive(:expire).with(:has_visible_content?) @@ -1326,7 +1328,7 @@ describe Repository do repository.expire_emptiness_caches end - it 'does not expire the cache for a non-empty repository' do + it "does not expire the cache for a non-empty repository" do allow(repository).to receive(:empty?).and_return(false) expect(cache).not_to receive(:expire).with(:has_visible_content?) @@ -1334,35 +1336,35 @@ describe Repository do repository.expire_emptiness_caches end - it 'expires the memoized repository cache' do + it "expires the memoized repository cache" do allow(repository.raw_repository).to receive(:expire_has_local_branches_cache).and_call_original repository.expire_emptiness_caches end end - describe 'skip_merges option' do + describe "skip_merges option" do subject { repository.commits(Gitlab::Git::BRANCH_REF_PREFIX + "'test'", limit: 100, skip_merges: true).map { |k| k.id } } - it { is_expected.not_to include('e56497bb5f03a90a51293fc6d516788730953899') } + it { is_expected.not_to include("e56497bb5f03a90a51293fc6d516788730953899") } end - describe '#merge' do - let(:merge_request) { create(:merge_request, source_branch: 'feature', target_branch: 'master', source_project: project) } + describe "#merge" do + let(:merge_request) { create(:merge_request, source_branch: "feature", target_branch: "master", source_project: project) } let(:message) { 'Test \r\n\r\n message' } - it 'merges the code and returns the commit id' do + it "merges the code and returns the commit id" do expect(merge_commit).to be_present - expect(repository.blob_at(merge_commit.id, 'files/ruby/feature.rb')).to be_present + expect(repository.blob_at(merge_commit.id, "files/ruby/feature.rb")).to be_present end - it 'sets the `in_progress_merge_commit_sha` flag for the given merge request' do + it "sets the `in_progress_merge_commit_sha` flag for the given merge request" do merge_commit_id = merge(repository, user, merge_request, message) expect(merge_request.in_progress_merge_commit_sha).to eq(merge_commit_id) end - it 'removes carriage returns from commit message' do + it "removes carriage returns from commit message" do merge_commit_id = merge(repository, user, merge_request, message) expect(repository.commit(merge_commit_id).message).to eq(message.delete("\r")) @@ -1373,199 +1375,199 @@ describe Repository do end end - describe '#merge_to_ref' do + describe "#merge_to_ref" do let(:merge_request) do - create(:merge_request, source_branch: 'feature', - target_branch: 'master', + create(:merge_request, source_branch: "feature", + target_branch: "master", source_project: project) end - it 'writes merge of source and target to MR merge_ref_path' do + it "writes merge of source and target to MR merge_ref_path" do merge_commit_id = repository.merge_to_ref(user, - merge_request.diff_head_sha, - merge_request, - merge_request.merge_ref_path, - 'Custom message') + merge_request.diff_head_sha, + merge_request, + merge_request.merge_ref_path, + "Custom message") merge_commit = repository.commit(merge_commit_id) - expect(merge_commit.message).to eq('Custom message') + expect(merge_commit.message).to eq("Custom message") expect(merge_commit.author_name).to eq(user.name) expect(merge_commit.author_email).to eq(user.commit_email) - expect(repository.blob_at(merge_commit.id, 'files/ruby/feature.rb')).to be_present + expect(repository.blob_at(merge_commit.id, "files/ruby/feature.rb")).to be_present end end - describe '#ff_merge' do + describe "#ff_merge" do before do - repository.add_branch(user, 'ff-target', 'feature~5') + repository.add_branch(user, "ff-target", "feature~5") end - it 'merges the code and return the commit id' do - merge_request = create(:merge_request, source_branch: 'feature', target_branch: 'ff-target', source_project: project) + it "merges the code and return the commit id" do + merge_request = create(:merge_request, source_branch: "feature", target_branch: "ff-target", source_project: project) merge_commit_id = repository.ff_merge(user, - merge_request.diff_head_sha, - merge_request.target_branch, - merge_request: merge_request) + merge_request.diff_head_sha, + merge_request.target_branch, + merge_request: merge_request) merge_commit = repository.commit(merge_commit_id) expect(merge_commit).to be_present - expect(repository.blob_at(merge_commit.id, 'files/ruby/feature.rb')).to be_present + expect(repository.blob_at(merge_commit.id, "files/ruby/feature.rb")).to be_present end - it 'sets the `in_progress_merge_commit_sha` flag for the given merge request' do - merge_request = create(:merge_request, source_branch: 'feature', target_branch: 'ff-target', source_project: project) + it "sets the `in_progress_merge_commit_sha` flag for the given merge request" do + merge_request = create(:merge_request, source_branch: "feature", target_branch: "ff-target", source_project: project) merge_commit_id = repository.ff_merge(user, - merge_request.diff_head_sha, - merge_request.target_branch, - merge_request: merge_request) + merge_request.diff_head_sha, + merge_request.target_branch, + merge_request: merge_request) expect(merge_request.in_progress_merge_commit_sha).to eq(merge_commit_id) end end - describe '#revert' do - let(:new_image_commit) { repository.commit('33f3729a45c02fc67d00adb1b8bca394b0e761d9') } - let(:update_image_commit) { repository.commit('2f63565e7aac07bcdadb654e253078b727143ec4') } - let(:message) { 'revert message' } + describe "#revert" do + let(:new_image_commit) { repository.commit("33f3729a45c02fc67d00adb1b8bca394b0e761d9") } + let(:update_image_commit) { repository.commit("2f63565e7aac07bcdadb654e253078b727143ec4") } + let(:message) { "revert message" } - context 'when there is a conflict' do - it 'raises an error' do - expect { repository.revert(user, new_image_commit, 'master', message) }.to raise_error(Gitlab::Git::Repository::CreateTreeError) + context "when there is a conflict" do + it "raises an error" do + expect { repository.revert(user, new_image_commit, "master", message) }.to raise_error(Gitlab::Git::Repository::CreateTreeError) end end - context 'when commit was already reverted' do - it 'raises an error' do - repository.revert(user, update_image_commit, 'master', message) + context "when commit was already reverted" do + it "raises an error" do + repository.revert(user, update_image_commit, "master", message) - expect { repository.revert(user, update_image_commit, 'master', message) }.to raise_error(Gitlab::Git::Repository::CreateTreeError) + expect { repository.revert(user, update_image_commit, "master", message) }.to raise_error(Gitlab::Git::Repository::CreateTreeError) end end - context 'when commit can be reverted' do - it 'reverts the changes' do - expect(repository.revert(user, update_image_commit, 'master', message)).to be_truthy + context "when commit can be reverted" do + it "reverts the changes" do + expect(repository.revert(user, update_image_commit, "master", message)).to be_truthy end end - context 'reverting a merge commit' do - it 'reverts the changes' do + context "reverting a merge commit" do + it "reverts the changes" do merge_commit - expect(repository.blob_at_branch('master', 'files/ruby/feature.rb')).to be_present + expect(repository.blob_at_branch("master", "files/ruby/feature.rb")).to be_present - repository.revert(user, merge_commit, 'master', message) - expect(repository.blob_at_branch('master', 'files/ruby/feature.rb')).not_to be_present + repository.revert(user, merge_commit, "master", message) + expect(repository.blob_at_branch("master", "files/ruby/feature.rb")).not_to be_present end end end - describe '#cherry_pick' do - let(:conflict_commit) { repository.commit('c642fe9b8b9f28f9225d7ea953fe14e74748d53b') } - let(:pickable_commit) { repository.commit('7d3b0f7cff5f37573aea97cebfd5692ea1689924') } - let(:pickable_merge) { repository.commit('e56497bb5f03a90a51293fc6d516788730953899') } - let(:message) { 'cherry-pick message' } + describe "#cherry_pick" do + let(:conflict_commit) { repository.commit("c642fe9b8b9f28f9225d7ea953fe14e74748d53b") } + let(:pickable_commit) { repository.commit("7d3b0f7cff5f37573aea97cebfd5692ea1689924") } + let(:pickable_merge) { repository.commit("e56497bb5f03a90a51293fc6d516788730953899") } + let(:message) { "cherry-pick message" } - context 'when there is a conflict' do - it 'raises an error' do - expect { repository.cherry_pick(user, conflict_commit, 'master', message) }.to raise_error(Gitlab::Git::Repository::CreateTreeError) + context "when there is a conflict" do + it "raises an error" do + expect { repository.cherry_pick(user, conflict_commit, "master", message) }.to raise_error(Gitlab::Git::Repository::CreateTreeError) end end - context 'when commit was already cherry-picked' do - it 'raises an error' do - repository.cherry_pick(user, pickable_commit, 'master', message) + context "when commit was already cherry-picked" do + it "raises an error" do + repository.cherry_pick(user, pickable_commit, "master", message) - expect { repository.cherry_pick(user, pickable_commit, 'master', message) }.to raise_error(Gitlab::Git::Repository::CreateTreeError) + expect { repository.cherry_pick(user, pickable_commit, "master", message) }.to raise_error(Gitlab::Git::Repository::CreateTreeError) end end - context 'when commit can be cherry-picked' do - it 'cherry-picks the changes' do - expect(repository.cherry_pick(user, pickable_commit, 'master', message)).to be_truthy + context "when commit can be cherry-picked" do + it "cherry-picks the changes" do + expect(repository.cherry_pick(user, pickable_commit, "master", message)).to be_truthy end end - context 'cherry-picking a merge commit' do - it 'cherry-picks the changes' do - expect(repository.blob_at_branch('improve/awesome', 'foo/bar/.gitkeep')).to be_nil + context "cherry-picking a merge commit" do + it "cherry-picks the changes" do + expect(repository.blob_at_branch("improve/awesome", "foo/bar/.gitkeep")).to be_nil - cherry_pick_commit_sha = repository.cherry_pick(user, pickable_merge, 'improve/awesome', message) + cherry_pick_commit_sha = repository.cherry_pick(user, pickable_merge, "improve/awesome", message) cherry_pick_commit_message = project.commit(cherry_pick_commit_sha).message - expect(repository.blob_at_branch('improve/awesome', 'foo/bar/.gitkeep')).not_to be_nil + expect(repository.blob_at_branch("improve/awesome", "foo/bar/.gitkeep")).not_to be_nil expect(cherry_pick_commit_message).to eq(message) end end end - describe '#before_delete' do - describe 'when a repository does not exist' do + describe "#before_delete" do + describe "when a repository does not exist" do before do allow(repository).to receive(:exists?).and_return(false) end - it 'does not flush caches that depend on repository data' do + it "does not flush caches that depend on repository data" do expect(repository).not_to receive(:expire_cache) repository.before_delete end - it 'flushes the tags cache' do + it "flushes the tags cache" do expect(repository).to receive(:expire_tags_cache) repository.before_delete end - it 'flushes the branches cache' do + it "flushes the branches cache" do expect(repository).to receive(:expire_branches_cache) repository.before_delete end - it 'flushes the root ref cache' do + it "flushes the root ref cache" do expect(repository).to receive(:expire_root_ref_cache) repository.before_delete end - it 'flushes the emptiness caches' do + it "flushes the emptiness caches" do expect(repository).to receive(:expire_emptiness_caches) repository.before_delete end - it 'flushes the exists cache' do + it "flushes the exists cache" do expect(repository).to receive(:expire_exists_cache).twice repository.before_delete end end - describe 'when a repository exists' do + describe "when a repository exists" do before do allow(repository).to receive(:exists?).and_return(true) end - it 'flushes the tags cache' do + it "flushes the tags cache" do expect(repository).to receive(:expire_tags_cache) repository.before_delete end - it 'flushes the branches cache' do + it "flushes the branches cache" do expect(repository).to receive(:expire_branches_cache) repository.before_delete end - it 'flushes the root ref cache' do + it "flushes the root ref cache" do expect(repository).to receive(:expire_root_ref_cache) repository.before_delete end - it 'flushes the emptiness caches' do + it "flushes the emptiness caches" do expect(repository).to receive(:expire_emptiness_caches) repository.before_delete @@ -1573,22 +1575,22 @@ describe Repository do end end - describe '#before_change_head' do - it 'flushes the branch cache' do + describe "#before_change_head" do + it "flushes the branch cache" do expect(repository).to receive(:expire_branch_cache) repository.before_change_head end - it 'flushes the root ref cache' do + it "flushes the root ref cache" do expect(repository).to receive(:expire_root_ref_cache) repository.before_change_head end end - describe '#after_change_head' do - it 'flushes the method caches' do + describe "#after_change_head" do + it "flushes the method caches" do expect(repository).to receive(:expire_method_caches).with([ :size, :commit_count, @@ -1610,15 +1612,15 @@ describe Repository do :has_visible_content?, :issue_template_names, :merge_request_template_names, - :xcode_project? + :xcode_project?, ]) repository.after_change_head end end - describe '#before_push_tag' do - it 'flushes the cache' do + describe "#before_push_tag" do + it "flushes the cache" do expect(repository).to receive(:expire_statistics_caches) expect(repository).to receive(:expire_emptiness_caches) expect(repository).to receive(:expire_tags_cache) @@ -1627,57 +1629,57 @@ describe Repository do end end - describe '#after_import' do - it 'flushes and builds the cache' do + describe "#after_import" do + it "flushes and builds the cache" do expect(repository).to receive(:expire_content_cache) repository.after_import end end - describe '#after_push_commit' do - it 'expires statistics caches' do + describe "#after_push_commit" do + it "expires statistics caches" do expect(repository).to receive(:expire_statistics_caches) .and_call_original expect(repository).to receive(:expire_branch_cache) - .with('master') + .with("master") .and_call_original - repository.after_push_commit('master') + repository.after_push_commit("master") end end - describe '#after_create_branch' do - it 'expires the branch caches' do + describe "#after_create_branch" do + it "expires the branch caches" do expect(repository).to receive(:expire_branches_cache) repository.after_create_branch end end - describe '#after_remove_branch' do - it 'expires the branch caches' do + describe "#after_remove_branch" do + it "expires the branch caches" do expect(repository).to receive(:expire_branches_cache) repository.after_remove_branch end end - describe '#after_create' do - it 'flushes the exists cache' do + describe "#after_create" do + it "flushes the exists cache" do expect(repository).to receive(:expire_exists_cache) repository.after_create end - it 'flushes the root ref cache' do + it "flushes the root ref cache" do expect(repository).to receive(:expire_root_ref_cache) repository.after_create end - it 'flushes the emptiness caches' do + it "flushes the emptiness caches" do expect(repository).to receive(:expire_emptiness_caches) repository.after_create @@ -1685,17 +1687,17 @@ describe Repository do end describe "#copy_gitattributes" do - it 'returns true with a valid ref' do - expect(repository.copy_gitattributes('master')).to be_truthy + it "returns true with a valid ref" do + expect(repository.copy_gitattributes("master")).to be_truthy end - it 'returns false with an invalid ref' do - expect(repository.copy_gitattributes('invalid')).to be_falsey + it "returns false with an invalid ref" do + expect(repository.copy_gitattributes("invalid")).to be_falsey end end - describe '#before_remove_tag' do - it 'flushes the tag cache' do + describe "#before_remove_tag" do + it "flushes the tag cache" do expect(repository).to receive(:expire_tags_cache).and_call_original expect(repository).to receive(:expire_statistics_caches).and_call_original @@ -1703,8 +1705,8 @@ describe Repository do end end - describe '#branch_count' do - it 'returns the number of branches' do + describe "#branch_count" do + it "returns the number of branches" do expect(repository.branch_count).to be_an(Integer) rugged_count = rugged_repo(repository).branches.count @@ -1713,8 +1715,8 @@ describe Repository do end end - describe '#tag_count' do - it 'returns the number of tags' do + describe "#tag_count" do + it "returns the number of tags" do expect(repository.tag_count).to be_an(Integer) rugged_count = rugged_repo(repository).tags.count @@ -1723,154 +1725,154 @@ describe Repository do end end - describe '#expire_branches_cache' do - it 'expires the cache' do + describe "#expire_branches_cache" do + it "expires the cache" do expect(repository).to receive(:expire_method_caches) - .with(%i(branch_names branch_count has_visible_content?)) + .with(%i[branch_names branch_count has_visible_content?]) .and_call_original repository.expire_branches_cache end end - describe '#expire_tags_cache' do - it 'expires the cache' do + describe "#expire_tags_cache" do + it "expires the cache" do expect(repository).to receive(:expire_method_caches) - .with(%i(tag_names tag_count)) + .with(%i[tag_names tag_count]) .and_call_original repository.expire_tags_cache end end - describe '#add_tag' do + describe "#add_tag" do let(:user) { build_stubbed(:user) } - context 'with a valid target' do - it 'creates the tag' do - repository.add_tag(user, '8.5', 'master', 'foo') + context "with a valid target" do + it "creates the tag" do + repository.add_tag(user, "8.5", "master", "foo") - tag = repository.find_tag('8.5') + tag = repository.find_tag("8.5") expect(tag).to be_present - expect(tag.message).to eq('foo') - expect(tag.dereferenced_target.id).to eq(repository.commit('master').id) + expect(tag.message).to eq("foo") + expect(tag.dereferenced_target.id).to eq(repository.commit("master").id) end - it 'returns a Gitlab::Git::Tag object' do - tag = repository.add_tag(user, '8.5', 'master', 'foo') + it "returns a Gitlab::Git::Tag object" do + tag = repository.add_tag(user, "8.5", "master", "foo") expect(tag).to be_a(Gitlab::Git::Tag) end end - context 'with an invalid target' do - it 'returns false' do - expect(repository.add_tag(user, '8.5', 'bar', 'foo')).to be false + context "with an invalid target" do + it "returns false" do + expect(repository.add_tag(user, "8.5", "bar", "foo")).to be false end end end - describe '#rm_branch' do - it 'removes a branch' do + describe "#rm_branch" do + it "removes a branch" do expect(repository).to receive(:before_remove_branch) expect(repository).to receive(:after_remove_branch) - repository.rm_branch(user, 'feature') + repository.rm_branch(user, "feature") end - context 'when pre hooks failed' do + context "when pre hooks failed" do before do allow_any_instance_of(Gitlab::GitalyClient::OperationService) .to receive(:user_delete_branch).and_raise(Gitlab::Git::PreReceiveError) end - it 'gets an error and does not delete the branch' do - expect do - repository.rm_branch(user, 'feature') - end.to raise_error(Gitlab::Git::PreReceiveError) + it "gets an error and does not delete the branch" do + expect { + repository.rm_branch(user, "feature") + }.to raise_error(Gitlab::Git::PreReceiveError) - expect(repository.find_branch('feature')).not_to be_nil + expect(repository.find_branch("feature")).not_to be_nil end end end - describe '#rm_tag' do - it 'removes a tag' do + describe "#rm_tag" do + it "removes a tag" do expect(repository).to receive(:before_remove_tag) - repository.rm_tag(build_stubbed(:user), 'v1.1.0') + repository.rm_tag(build_stubbed(:user), "v1.1.0") - expect(repository.find_tag('v1.1.0')).to be_nil + expect(repository.find_tag("v1.1.0")).to be_nil end end - describe '#avatar' do - it 'returns nil if repo does not exist' do + describe "#avatar" do + it "returns nil if repo does not exist" do allow(repository).to receive(:root_ref).and_raise(Gitlab::Git::Repository::NoRepository) expect(repository.avatar).to eq(nil) end - it 'returns the first avatar file found in the repository' do + it "returns the first avatar file found in the repository" do expect(repository).to receive(:file_on_head) .with(:avatar) - .and_return(double(:tree, path: 'logo.png')) + .and_return(double(:tree, path: "logo.png")) - expect(repository.avatar).to eq('logo.png') + expect(repository.avatar).to eq("logo.png") end - it 'caches the output' do + it "caches the output" do expect(repository).to receive(:file_on_head) .with(:avatar) .once - .and_return(double(:tree, path: 'logo.png')) + .and_return(double(:tree, path: "logo.png")) - 2.times { expect(repository.avatar).to eq('logo.png') } + 2.times { expect(repository.avatar).to eq("logo.png") } end end - describe '#expire_exists_cache' do + describe "#expire_exists_cache" do let(:cache) { repository.send(:cache) } let(:request_store_cache) { repository.send(:request_store_cache) } - it 'expires the cache' do + it "expires the cache" do expect(cache).to receive(:expire).with(:exists?) repository.expire_exists_cache end - it 'expires the request store cache', :request_store do + it "expires the request store cache", :request_store do expect(request_store_cache).to receive(:expire).with(:exists?) repository.expire_exists_cache end end - describe '#xcode_project?' do + describe "#xcode_project?" do before do allow(repository).to receive(:tree).with(:head).and_return(double(:tree, trees: [tree])) end - context 'when the root contains a *.xcodeproj directory' do - let(:tree) { double(:tree, path: 'Foo.xcodeproj') } + context "when the root contains a *.xcodeproj directory" do + let(:tree) { double(:tree, path: "Foo.xcodeproj") } - it 'returns true' do + it "returns true" do expect(repository.xcode_project?).to be_truthy end end - context 'when the root contains a *.xcworkspace directory' do - let(:tree) { double(:tree, path: 'Foo.xcworkspace') } + context "when the root contains a *.xcworkspace directory" do + let(:tree) { double(:tree, path: "Foo.xcworkspace") } - it 'returns true' do + it "returns true" do expect(repository.xcode_project?).to be_truthy end end - context 'when the root contains no Xcode config directory' do - let(:tree) { double(:tree, path: 'Foo') } + context "when the root contains no Xcode config directory" do + let(:tree) { double(:tree, path: "Foo") } - it 'returns false' do + it "returns false" do expect(repository.xcode_project?).to be_falsey end end @@ -1878,7 +1880,7 @@ describe Repository do describe "#keep_around" do it "does not fail if we attempt to reference bad commit" do - expect(repository.kept_around?('abc1234')).to be_falsey + expect(repository.kept_around?("abc1234")).to be_falsey end it "stores a reference to the specified commit sha so it isn't garbage collected" do @@ -1891,9 +1893,9 @@ describe Repository do repository.keep_around(sample_commit.id) ref = repository.send(:keep_around_ref_name, sample_commit.id) - path = Gitlab::GitalyClient::StorageSettings.allow_disk_access do + path = Gitlab::GitalyClient::StorageSettings.allow_disk_access { File.join(repository.path, ref) - end + } # Corrupt the reference File.truncate(path, 0) @@ -1906,14 +1908,14 @@ describe Repository do File.delete(path) end - context 'for multiple SHAs' do - it 'skips non-existent SHAs' do - repository.keep_around('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa', sample_commit.id) + context "for multiple SHAs" do + it "skips non-existent SHAs" do + repository.keep_around("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", sample_commit.id) expect(repository.kept_around?(sample_commit.id)).to be_truthy end - it 'skips already-kept-around SHAs' do + it "skips already-kept-around SHAs" do repository.keep_around(sample_commit.id) expect(repository.raw_repository).to receive(:write_ref).exactly(1).and_call_original @@ -1925,11 +1927,11 @@ describe Repository do end end - describe '#contribution_guide', :use_clean_rails_memory_store_caching do - it 'returns and caches the output' do + describe "#contribution_guide", :use_clean_rails_memory_store_caching do + it "returns and caches the output" do expect(repository).to receive(:file_on_head) .with(:contributing) - .and_return(Gitlab::Git::Tree.new(path: 'CONTRIBUTING.md')) + .and_return(Gitlab::Git::Tree.new(path: "CONTRIBUTING.md")) .once 2.times do @@ -1939,11 +1941,11 @@ describe Repository do end end - describe '#gitignore', :use_clean_rails_memory_store_caching do - it 'returns and caches the output' do + describe "#gitignore", :use_clean_rails_memory_store_caching do + it "returns and caches the output" do expect(repository).to receive(:file_on_head) .with(:gitignore) - .and_return(Gitlab::Git::Tree.new(path: '.gitignore')) + .and_return(Gitlab::Git::Tree.new(path: ".gitignore")) .once 2.times do @@ -1952,60 +1954,60 @@ describe Repository do end end - describe '#readme', :use_clean_rails_memory_store_caching do - context 'with a non-existing repository' do + describe "#readme", :use_clean_rails_memory_store_caching do + context "with a non-existing repository" do let(:project) { create(:project) } - it 'returns nil' do + it "returns nil" do expect(repository.readme).to be_nil end end - context 'with an existing repository' do - context 'when no README exists' do + context "with an existing repository" do + context "when no README exists" do let(:project) { create(:project, :empty_repo) } - it 'returns nil' do + it "returns nil" do expect(repository.readme).to be_nil end end - context 'when a README exists' do + context "when a README exists" do let(:project) { create(:project, :repository) } - it 'returns the README' do + it "returns the README" do expect(repository.readme).to be_an_instance_of(ReadmeBlob) end end end end - describe '#readme_path', :use_clean_rails_memory_store_caching do - context 'with a non-existing repository' do + describe "#readme_path", :use_clean_rails_memory_store_caching do + context "with a non-existing repository" do let(:project) { create(:project) } - it 'returns nil' do + it "returns nil" do expect(repository.readme_path).to be_nil end end - context 'with an existing repository' do - context 'when no README exists' do + context "with an existing repository" do + context "when no README exists" do let(:project) { create(:project, :empty_repo) } - it 'returns nil' do + it "returns nil" do expect(repository.readme_path).to be_nil end end - context 'when a README exists' do + context "when a README exists" do let(:project) { create(:project, :repository) } - it 'returns the README' do + it "returns the README" do expect(repository.readme_path).to eq("README.md") end - it 'caches the response' do + it "caches the response" do expect(repository).to receive(:readme).and_call_original.once 2.times do @@ -2016,67 +2018,67 @@ describe Repository do end end - describe '#expire_statistics_caches' do - it 'expires the caches' do + describe "#expire_statistics_caches" do + it "expires the caches" do expect(repository).to receive(:expire_method_caches) - .with(%i(size commit_count)) + .with(%i[size commit_count]) repository.expire_statistics_caches end end - describe '#expire_all_method_caches' do - it 'expires the caches of all methods' do + describe "#expire_all_method_caches" do + it "expires the caches of all methods" do expect(repository).to receive(:expire_method_caches) .with(Repository::CACHED_METHODS) repository.expire_all_method_caches end - it 'all cache_method definitions are in the lists of method caches' do - methods = repository.methods.map do |method| + it "all cache_method definitions are in the lists of method caches" do + methods = repository.methods.map { |method| match = /^_uncached_(.*)/.match(method) match[1].to_sym if match - end.compact + }.compact expect(Repository::CACHED_METHODS + Repository::MEMOIZED_CACHED_METHODS).to include(*methods) end end - describe '#file_on_head' do - context 'with a non-existing repository' do - it 'returns nil' do + describe "#file_on_head" do + context "with a non-existing repository" do + it "returns nil" do expect(repository).to receive(:tree).with(:head).and_return(nil) expect(repository.file_on_head(:readme)).to be_nil end end - context 'with a repository that has no blobs' do - it 'returns nil' do + context "with a repository that has no blobs" do + it "returns nil" do expect_any_instance_of(Tree).to receive(:blobs).and_return([]) expect(repository.file_on_head(:readme)).to be_nil end end - context 'with an existing repository' do - it 'returns a Gitlab::Git::Tree' do + context "with an existing repository" do + it "returns a Gitlab::Git::Tree" do expect(repository.file_on_head(:readme)) .to be_an_instance_of(Gitlab::Git::Tree) end end end - describe '#head_tree' do - context 'with an existing repository' do - it 'returns a Tree' do + describe "#head_tree" do + context "with an existing repository" do + it "returns a Tree" do expect(repository.head_tree).to be_an_instance_of(Tree) end end - context 'with a non-existing repository' do - it 'returns nil' do + context "with a non-existing repository" do + it "returns nil" do expect(repository).to receive(:head_commit).and_return(nil) expect(repository.head_tree).to be_nil @@ -2084,107 +2086,108 @@ describe Repository do end end - describe '#tree' do - context 'using a non-existing repository' do + describe "#tree" do + context "using a non-existing repository" do before do allow(repository).to receive(:head_commit).and_return(nil) end - it 'returns nil' do + it "returns nil" do expect(repository.tree(:head)).to be_nil end - it 'returns nil when using a path' do - expect(repository.tree(:head, 'README.md')).to be_nil + it "returns nil when using a path" do + expect(repository.tree(:head, "README.md")).to be_nil end end - context 'using an existing repository' do - it 'returns a Tree' do + context "using an existing repository" do + it "returns a Tree" do expect(repository.tree(:head)).to be_an_instance_of(Tree) end end end - describe '#size' do - context 'with a non-existing repository' do - it 'returns 0' do + describe "#size" do + context "with a non-existing repository" do + it "returns 0" do expect(repository).to receive(:exists?).and_return(false) expect(repository.size).to eq(0.0) end end - context 'with an existing repository' do - it 'returns the repository size as a Float' do + context "with an existing repository" do + it "returns the repository size as a Float" do expect(repository.size).to be_an_instance_of(Float) end end end - describe '#local_branches' do - it 'returns the local branches' do - masterrev = repository.find_branch('master').dereferenced_target - create_remote_branch('joe', 'remote_branch', masterrev) - repository.add_branch(user, 'local_branch', masterrev.id) + describe "#local_branches" do + it "returns the local branches" do + masterrev = repository.find_branch("master").dereferenced_target + create_remote_branch("joe", "remote_branch", masterrev) + repository.add_branch(user, "local_branch", masterrev.id) - expect(repository.local_branches.any? { |branch| branch.name == 'remote_branch' }).to eq(false) - expect(repository.local_branches.any? { |branch| branch.name == 'local_branch' }).to eq(true) + expect(repository.local_branches.any? { |branch| branch.name == "remote_branch" }).to eq(false) + expect(repository.local_branches.any? { |branch| branch.name == "local_branch" }).to eq(true) end end - describe '#commit_count' do - context 'with a non-existing repository' do - it 'returns 0' do + describe "#commit_count" do + context "with a non-existing repository" do + it "returns 0" do expect(repository).to receive(:root_ref).and_return(nil) expect(repository.commit_count).to eq(0) end end - context 'with an existing repository' do - it 'returns the commit count' do + context "with an existing repository" do + it "returns the commit count" do expect(repository.commit_count).to be_an(Integer) end end end - describe '#commit_count_for_ref' do + describe "#commit_count_for_ref" do let(:project) { create :project } - context 'with a non-existing repository' do - it 'returns 0' do - expect(project.repository.commit_count_for_ref('master')).to eq(0) + context "with a non-existing repository" do + it "returns 0" do + expect(project.repository.commit_count_for_ref("master")).to eq(0) end end - context 'with empty repository' do - it 'returns 0' do + context "with empty repository" do + it "returns 0" do project.create_repository - expect(project.repository.commit_count_for_ref('master')).to eq(0) + expect(project.repository.commit_count_for_ref("master")).to eq(0) end end - context 'when searching for the root ref' do - it 'returns the same count as #commit_count' do + context "when searching for the root ref" do + it "returns the same count as #commit_count" do expect(repository.commit_count_for_ref(repository.root_ref)).to eq(repository.commit_count) end end end - describe '#diverging_commit_counts' do - it 'returns the commit counts behind and ahead of default branch' do + describe "#diverging_commit_counts" do + it "returns the commit counts behind and ahead of default branch" do result = repository.diverging_commit_counts( - repository.find_branch('fix')) + repository.find_branch("fix") + ) expect(result).to eq(behind: 29, ahead: 2) end end - describe '#refresh_method_caches' do - it 'refreshes the caches of the given types' do + describe "#refresh_method_caches" do + it "refreshes the caches of the given types" do expect(repository).to receive(:expire_method_caches) - .with(%i(rendered_readme readme_path license_blob license_key license)) + .with(%i[rendered_readme readme_path license_blob license_key license]) expect(repository).to receive(:rendered_readme) expect(repository).to receive(:readme_path) @@ -2192,41 +2195,41 @@ describe Repository do expect(repository).to receive(:license_key) expect(repository).to receive(:license) - repository.refresh_method_caches(%i(readme license)) + repository.refresh_method_caches(%i[readme license]) end end - describe '#gitlab_ci_yml_for' do + describe "#gitlab_ci_yml_for" do before do - repository.create_file(User.last, '.gitlab-ci.yml', 'CONTENT', message: 'Add .gitlab-ci.yml', branch_name: 'master') + repository.create_file(User.last, ".gitlab-ci.yml", "CONTENT", message: "Add .gitlab-ci.yml", branch_name: "master") end - context 'when there is a .gitlab-ci.yml at the commit' do - it 'returns the content' do - expect(repository.gitlab_ci_yml_for(repository.commit.sha)).to eq('CONTENT') + context "when there is a .gitlab-ci.yml at the commit" do + it "returns the content" do + expect(repository.gitlab_ci_yml_for(repository.commit.sha)).to eq("CONTENT") end end - context 'when there is no .gitlab-ci.yml at the commit' do - it 'returns nil' do + context "when there is no .gitlab-ci.yml at the commit" do + it "returns nil" do expect(repository.gitlab_ci_yml_for(repository.commit.parent.sha)).to be_nil end end end - describe '#route_map_for' do + describe "#route_map_for" do before do - repository.create_file(User.last, '.gitlab/route-map.yml', 'CONTENT', message: 'Add .gitlab/route-map.yml', branch_name: 'master') + repository.create_file(User.last, ".gitlab/route-map.yml", "CONTENT", message: "Add .gitlab/route-map.yml", branch_name: "master") end - context 'when there is a .gitlab/route-map.yml at the commit' do - it 'returns the content' do - expect(repository.route_map_for(repository.commit.sha)).to eq('CONTENT') + context "when there is a .gitlab/route-map.yml at the commit" do + it "returns the content" do + expect(repository.route_map_for(repository.commit.sha)).to eq("CONTENT") end end - context 'when there is no .gitlab/route-map.yml at the commit' do - it 'returns nil' do + context "when there is no .gitlab/route-map.yml at the commit" do + it "returns nil" do expect(repository.route_map_for(repository.commit.parent.sha)).to be_nil end end @@ -2237,60 +2240,60 @@ describe Repository do rugged.references.create("refs/remotes/#{remote_name}/#{branch_name}", target.id) end - describe '#ancestor?' do + describe "#ancestor?" do let(:commit) { repository.commit } let(:ancestor) { commit.parents.first } - it 'it is an ancestor' do + it "it is an ancestor" do expect(repository.ancestor?(ancestor.id, commit.id)).to eq(true) end - it 'it is not an ancestor' do + it "it is not an ancestor" do expect(repository.ancestor?(commit.id, ancestor.id)).to eq(false) end - it 'returns false on nil-values' do + it "returns false on nil-values" do expect(repository.ancestor?(nil, commit.id)).to eq(false) expect(repository.ancestor?(ancestor.id, nil)).to eq(false) expect(repository.ancestor?(nil, nil)).to eq(false) end - it 'returns false for invalid commit IDs' do + it "returns false for invalid commit IDs" do expect(repository.ancestor?(commit.id, Gitlab::Git::BLANK_SHA)).to eq(false) - expect(repository.ancestor?( Gitlab::Git::BLANK_SHA, commit.id)).to eq(false) + expect(repository.ancestor?(Gitlab::Git::BLANK_SHA, commit.id)).to eq(false) end end - describe '#archive_metadata' do - let(:ref) { 'master' } - let(:storage_path) { '/tmp' } + describe "#archive_metadata" do + let(:ref) { "master" } + let(:storage_path) { "/tmp" } - let(:prefix) { [project.path, ref].join('-') } - let(:filename) { prefix + '.tar.gz' } + let(:prefix) { [project.path, ref].join("-") } + let(:filename) { prefix + ".tar.gz" } subject(:result) { repository.archive_metadata(ref, storage_path, append_sha: false) } - context 'with hashed storage disabled' do + context "with hashed storage disabled" do let(:project) { create(:project, :repository, :legacy_storage) } - it 'uses the project path to generate the filename' do - expect(result['ArchivePrefix']).to eq(prefix) - expect(File.basename(result['ArchivePath'])).to eq(filename) + it "uses the project path to generate the filename" do + expect(result["ArchivePrefix"]).to eq(prefix) + expect(File.basename(result["ArchivePath"])).to eq(filename) end end - context 'with hashed storage enabled' do - it 'uses the project path to generate the filename' do - expect(result['ArchivePrefix']).to eq(prefix) - expect(File.basename(result['ArchivePath'])).to eq(filename) + context "with hashed storage enabled" do + it "uses the project path to generate the filename" do + expect(result["ArchivePrefix"]).to eq(prefix) + expect(File.basename(result["ArchivePath"])).to eq(filename) end end end - describe 'commit cache' do + describe "commit cache" do set(:project) { create(:project, :repository) } - it 'caches based on SHA' do + it "caches based on SHA" do # Gets the commit oid, and warms the cache oid = project.commit.id @@ -2299,47 +2302,47 @@ describe Repository do project.commit_by(oid: oid) end - it 'caches nil values' do + it "caches nil values" do expect(Gitlab::Git::Commit).to receive(:find).once - project.commit_by(oid: '1' * 40) - project.commit_by(oid: '1' * 40) + project.commit_by(oid: "1" * 40) + project.commit_by(oid: "1" * 40) end end - describe '#raw_repository' do + describe "#raw_repository" do subject { repository.raw_repository } - it 'returns a Gitlab::Git::Repository representation of the repository' do + it "returns a Gitlab::Git::Repository representation of the repository" do expect(subject).to be_a(Gitlab::Git::Repository) - expect(subject.relative_path).to eq(project.disk_path + '.git') + expect(subject.relative_path).to eq(project.disk_path + ".git") expect(subject.gl_repository).to eq("project-#{project.id}") expect(subject.gl_project_path).to eq(project.full_path) end - context 'with a wiki repository' do + context "with a wiki repository" do let(:repository) { project.wiki.repository } - it 'creates a Gitlab::Git::Repository with the proper attributes' do + it "creates a Gitlab::Git::Repository with the proper attributes" do expect(subject).to be_a(Gitlab::Git::Repository) - expect(subject.relative_path).to eq(project.disk_path + '.wiki.git') + expect(subject.relative_path).to eq(project.disk_path + ".wiki.git") expect(subject.gl_repository).to eq("wiki-#{project.id}") expect(subject.gl_project_path).to eq(project.full_path) end end end - describe '#contributors' do - let(:author_a) { build(:author, email: 'tiagonbotelho@hotmail.com', name: 'tiagonbotelho') } - let(:author_b) { build(:author, email: 'gitlab@winniehell.de', name: 'Winnie') } - let(:author_c) { build(:author, email: 'douwe@gitlab.com', name: 'Douwe Maan') } + describe "#contributors" do + let(:author_a) { build(:author, email: "tiagonbotelho@hotmail.com", name: "tiagonbotelho") } + let(:author_b) { build(:author, email: "gitlab@winniehell.de", name: "Winnie") } + let(:author_c) { build(:author, email: "douwe@gitlab.com", name: "Douwe Maan") } let(:stubbed_commits) do [build(:commit, author: author_a), build(:commit, author: author_a), build(:commit, author: author_b), build(:commit, author: author_c), build(:commit, author: author_c), - build(:commit, author: author_c)] + build(:commit, author: author_c),] end let(:order_by) { nil } let(:sort) { nil } @@ -2354,96 +2357,96 @@ describe Repository do expect(subject.map(&:email)).to eq(contributors.map(&:email)) end - it 'returns the array of Gitlab::Contributor for the repository' do + it "returns the array of Gitlab::Contributor for the repository" do expect_contributors(author_a, author_b, author_c) end - context 'order_by email' do - let(:order_by) { 'email' } + context "order_by email" do + let(:order_by) { "email" } - context 'asc' do - let(:sort) { 'asc' } + context "asc" do + let(:sort) { "asc" } - it 'returns all the contributors ordered by email asc case insensitive' do + it "returns all the contributors ordered by email asc case insensitive" do expect_contributors(author_c, author_b, author_a) end end - context 'desc' do - let(:sort) { 'desc' } + context "desc" do + let(:sort) { "desc" } - it 'returns all the contributors ordered by email desc case insensitive' do + it "returns all the contributors ordered by email desc case insensitive" do expect_contributors(author_a, author_b, author_c) end end end - context 'order_by name' do - let(:order_by) { 'name' } + context "order_by name" do + let(:order_by) { "name" } - context 'asc' do - let(:sort) { 'asc' } + context "asc" do + let(:sort) { "asc" } - it 'returns all the contributors ordered by name asc case insensitive' do + it "returns all the contributors ordered by name asc case insensitive" do expect_contributors(author_c, author_a, author_b) end end - context 'desc' do - let(:sort) { 'desc' } + context "desc" do + let(:sort) { "desc" } - it 'returns all the contributors ordered by name desc case insensitive' do + it "returns all the contributors ordered by name desc case insensitive" do expect_contributors(author_b, author_a, author_c) end end end - context 'order_by commits' do - let(:order_by) { 'commits' } + context "order_by commits" do + let(:order_by) { "commits" } - context 'asc' do - let(:sort) { 'asc' } + context "asc" do + let(:sort) { "asc" } - it 'returns all the contributors ordered by commits asc' do + it "returns all the contributors ordered by commits asc" do expect_contributors(author_b, author_a, author_c) end end - context 'desc' do - let(:sort) { 'desc' } + context "desc" do + let(:sort) { "desc" } - it 'returns all the contributors ordered by commits desc' do + it "returns all the contributors ordered by commits desc" do expect_contributors(author_c, author_a, author_b) end end end - context 'invalid ordering' do - let(:order_by) { 'unknown' } + context "invalid ordering" do + let(:order_by) { "unknown" } - it 'returns the contributors unsorted' do + it "returns the contributors unsorted" do expect_contributors(author_a, author_b, author_c) end end - context 'invalid sorting' do - let(:order_by) { 'name' } - let(:sort) { 'unknown' } + context "invalid sorting" do + let(:order_by) { "name" } + let(:sort) { "unknown" } - it 'returns the contributors unsorted' do + it "returns the contributors unsorted" do expect_contributors(author_a, author_b, author_c) end end end - describe '#merge_base' do + describe "#merge_base" do set(:project) { create(:project, :repository) } subject(:repository) { project.repository } - it 'only makes one gitaly call' do + it "only makes one gitaly call" do expect(Gitlab::GitalyClient).to receive(:call).once.and_call_original - repository.merge_base('master', 'fix') + repository.merge_base("master", "fix") end end end |