From 52b07013e7aec539b864299744090e331408a550 Mon Sep 17 00:00:00 2001
From: Douwe Maan <douwe@selenight.nl>
Date: Thu, 25 Aug 2016 14:05:05 -0500
Subject: [PATCH] Merge branch
 '21275-getting-500-error-when-viewing-a-merge-request'

---
 CHANGELOG                         |  5 +++++
 app/models/merge_request.rb       |  8 ++++++--
 lib/gitlab/conflict/file.rb       | 11 +++++++++++
 spec/models/merge_request_spec.rb | 13 +++++++++++++
 4 files changed, 35 insertions(+), 2 deletions(-)

diff --git a/CHANGELOG b/CHANGELOG
index fbb7c8b923f..1ad707cdec2 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -8,6 +8,11 @@ v 8.11.2
   - Does not halt the GitHub import process when an error occurs. !5763
   - Fix file links on project page when default view is Files !5933
   - Fixed enter key in search input not working !5888
+  - Don't show resolve conflicts link before MR status is updated
+  - Don't prevent viewing the MR when git refs for conflicts can't be found on disk
+
+v 8.11.2 (unreleased)
+  - Show "Create Merge Request" widget for push events to fork projects on the source project
 
 v 8.11.1
   - Pulled due to packaging error.
diff --git a/app/models/merge_request.rb b/app/models/merge_request.rb
index 5330a07ee35..19a684d1d0c 100644
--- a/app/models/merge_request.rb
+++ b/app/models/merge_request.rb
@@ -777,8 +777,12 @@ class MergeRequest < ActiveRecord::Base
     return @conflicts_can_be_resolved_in_ui = false unless has_complete_diff_refs?
 
     begin
-      @conflicts_can_be_resolved_in_ui = conflicts.files.each(&:lines)
-    rescue Gitlab::Conflict::Parser::ParserError, Gitlab::Conflict::FileCollection::ConflictSideMissing
+      # Try to parse each conflict. If the MR's mergeable status hasn't been updated,
+      # ensure that we don't say there are conflicts to resolve when there are no conflict
+      # files.
+      conflicts.files.each(&:lines)
+      @conflicts_can_be_resolved_in_ui = conflicts.files.length > 0
+    rescue Rugged::OdbError, Gitlab::Conflict::Parser::ParserError, Gitlab::Conflict::FileCollection::ConflictSideMissing
       @conflicts_can_be_resolved_in_ui = false
     end
   end
diff --git a/lib/gitlab/conflict/file.rb b/lib/gitlab/conflict/file.rb
index 0a1fd27ced5..dff9e29c6a5 100644
--- a/lib/gitlab/conflict/file.rb
+++ b/lib/gitlab/conflict/file.rb
@@ -181,6 +181,17 @@ module Gitlab
           sections: sections
         }
       end
+
+      # Don't try to print merge_request or repository.
+      def inspect
+        instance_variables = [:merge_file_result, :their_path, :our_path, :our_mode].map do |instance_variable|
+          value = instance_variable_get("@#{instance_variable}")
+
+          "#{instance_variable}=\"#{value}\""
+        end
+
+        "#<#{self.class} #{instance_variables.join(' ')}>"
+      end
     end
   end
 end
diff --git a/spec/models/merge_request_spec.rb b/spec/models/merge_request_spec.rb
index 64c56d922ff..c4138c4f3f3 100644
--- a/spec/models/merge_request_spec.rb
+++ b/spec/models/merge_request_spec.rb
@@ -890,6 +890,19 @@ describe MergeRequest, models: true do
       expect(merge_request.conflicts_can_be_resolved_in_ui?).to be_falsey
     end
 
+    it 'returns a falsey value when the MR is marked as having conflicts, but has none' do
+      merge_request = create_merge_request('master')
+
+      expect(merge_request.conflicts_can_be_resolved_in_ui?).to be_falsey
+    end
+
+    it 'returns a falsey value when the MR has a missing ref after a force push' do
+      merge_request = create_merge_request('conflict-resolvable')
+      allow(merge_request.conflicts).to receive(:merge_index).and_raise(Rugged::OdbError)
+
+      expect(merge_request.conflicts_can_be_resolved_in_ui?).to be_falsey
+    end
+
     it 'returns a falsey value when the MR does not support new diff notes' do
       merge_request = create_merge_request('conflict-resolvable')
       merge_request.merge_request_diff.update_attributes(start_commit_sha: nil)
-- 
2.30.9