summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDouwe Maan <douwe@gitlab.com>2016-03-18 19:07:03 +0000
committerRémy Coutable <remy@rymai.me>2016-03-18 21:22:41 +0100
commit17418461ba54fc5e668b888c19194d3d112ccd32 (patch)
tree576ff0ef990218be38f2761fc111de21f314db15
parent5b82e15bbc4b4c4d0c9e7c2597b368d369c13a60 (diff)
downloadgitlab-ce-17418461ba54fc5e668b888c19194d3d112ccd32.tar.gz
Merge branch 'fix/14388' into 'master'
Fix an issue when the target branch of a MR had been deleted Before displaying the "diverged commits" note, we're checking if the MR is open, but we should check if it's mergeable instead because this check ensure the source and target branches exist. This was introduced by !2217 and fixes #14388. See merge request !3294
-rw-r--r--CHANGELOG1
-rw-r--r--app/models/merge_request.rb5
-rw-r--r--spec/models/merge_request_spec.rb22
3 files changed, 27 insertions, 1 deletions
diff --git a/CHANGELOG b/CHANGELOG
index 74217e80bfe..0a7d000e6a0 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -43,6 +43,7 @@ v 8.6.0 (unreleased)
- Increase the notes polling timeout over time (Roberto Dip)
- Add shortcut to toggle markdown preview (Florent Baldino)
- Show labels in dashboard and group milestone views
+ - Fix an issue when the target branch of a MR had been deleted
- Add main language of a project in the list of projects (Tiago Botelho)
- Add #upcoming filter to Milestone filter (Tiago Botelho)
- Add ability to show archived projects on dashboard, explore and group pages
diff --git a/app/models/merge_request.rb b/app/models/merge_request.rb
index 30a7bd47be7..a6140b5b04c 100644
--- a/app/models/merge_request.rb
+++ b/app/models/merge_request.rb
@@ -516,7 +516,7 @@ class MergeRequest < ActiveRecord::Base
end
def target_sha
- @target_sha ||= target_project.repository.commit(target_branch).sha
+ @target_sha ||= target_project.repository.commit(target_branch).try(:sha)
end
def source_sha
@@ -572,8 +572,11 @@ class MergeRequest < ActiveRecord::Base
end
def compute_diverged_commits_count
+ return 0 unless source_sha && target_sha
+
Gitlab::Git::Commit.between(target_project.repository.raw_repository, source_sha, target_sha).size
end
+ private :compute_diverged_commits_count
def diverged_from_target_branch?
diverged_commits_count > 0
diff --git a/spec/models/merge_request_spec.rb b/spec/models/merge_request_spec.rb
index 654c71b6825..2165cfb7a32 100644
--- a/spec/models/merge_request_spec.rb
+++ b/spec/models/merge_request_spec.rb
@@ -86,6 +86,16 @@ describe MergeRequest, models: true do
end
end
+ describe '#target_sha' do
+ context 'when the target branch does not exist anymore' do
+ subject { create(:merge_request).tap { |mr| mr.update_attribute(:target_branch, 'deleted') } }
+
+ it 'returns nil' do
+ expect(subject.target_sha).to be_nil
+ end
+ end
+ end
+
describe '#source_sha' do
let(:last_branch_commit) { subject.source_project.repository.commit(subject.source_branch) }
@@ -310,6 +320,18 @@ describe MergeRequest, models: true do
let(:project) { create(:project) }
let(:fork_project) { create(:project, forked_from_project: project) }
+ context 'when the target branch does not exist anymore' do
+ subject { create(:merge_request).tap { |mr| mr.update_attribute(:target_branch, 'deleted') } }
+
+ it 'does not crash' do
+ expect{ subject.diverged_commits_count }.not_to raise_error
+ end
+
+ it 'returns 0' do
+ expect(subject.diverged_commits_count).to eq(0)
+ end
+ end
+
context 'diverged on same repository' do
subject(:merge_request_with_divergence) { create(:merge_request, :diverged, source_project: project, target_project: project) }