From 847ada36c48107442f69338eda4c0b601ab98b48 Mon Sep 17 00:00:00 2001
From: Valery Sizov <valery@gitlab.com>
Date: Wed, 23 Nov 2016 19:18:34 +0200
Subject: [PATCH] Fix: Timeout creating and viewing merge request for binary
 file

---
 .../timeout-merge-request-for-binary-file.yml       |  4 ++++
 .../diff/file_collection/merge_request_diff.rb      |  6 +++---
 .../diff/file_collection/merge_request_diff_spec.rb | 13 +++++++++++++
 .../merge_request_diff_cache_service_spec.rb        |  1 +
 4 files changed, 21 insertions(+), 3 deletions(-)
 create mode 100644 changelogs/unreleased/timeout-merge-request-for-binary-file.yml
 create mode 100644 spec/lib/gitlab/diff/file_collection/merge_request_diff_spec.rb

diff --git a/changelogs/unreleased/timeout-merge-request-for-binary-file.yml b/changelogs/unreleased/timeout-merge-request-for-binary-file.yml
new file mode 100644
index 00000000000..5161265d1bd
--- /dev/null
+++ b/changelogs/unreleased/timeout-merge-request-for-binary-file.yml
@@ -0,0 +1,4 @@
+---
+title: Timeout creating and viewing merge request for binary file
+merge_request: 
+author: 
diff --git a/lib/gitlab/diff/file_collection/merge_request_diff.rb b/lib/gitlab/diff/file_collection/merge_request_diff.rb
index fe7adb7bed6..26bb0bc16f5 100644
--- a/lib/gitlab/diff/file_collection/merge_request_diff.rb
+++ b/lib/gitlab/diff/file_collection/merge_request_diff.rb
@@ -20,7 +20,7 @@ module Gitlab
         # Extracted method to highlight in the same iteration to the diff_collection.
         def decorate_diff!(diff)
           diff_file = super
-          cache_highlight!(diff_file) if cacheable?
+          cache_highlight!(diff_file) if cacheable?(diff_file)
           diff_file
         end
 
@@ -60,8 +60,8 @@ module Gitlab
           Rails.cache.write(cache_key, highlight_cache) if @highlight_cache_was_empty
         end
 
-        def cacheable?
-          @merge_request_diff.present?
+        def cacheable?(diff_file)
+          @merge_request_diff.present? && diff_file.blob.text?
         end
 
         def cache_key
diff --git a/spec/lib/gitlab/diff/file_collection/merge_request_diff_spec.rb b/spec/lib/gitlab/diff/file_collection/merge_request_diff_spec.rb
new file mode 100644
index 00000000000..c863a5f04cc
--- /dev/null
+++ b/spec/lib/gitlab/diff/file_collection/merge_request_diff_spec.rb
@@ -0,0 +1,13 @@
+require 'spec_helper'
+
+describe Gitlab::Diff::FileCollection::MergeRequestDiff do
+  let(:merge_request) { create :merge_request }
+
+  it 'does not hightlight binary files' do
+    allow_any_instance_of(Gitlab::Diff::File).to receive(:blob).and_return(double("text?" => false))
+
+    expect_any_instance_of(Gitlab::Diff::File).not_to receive(:highlighted_diff_lines)
+
+    described_class.new(merge_request.merge_request_diff, diff_options: nil).diff_files
+  end
+end
diff --git a/spec/services/merge_requests/merge_request_diff_cache_service_spec.rb b/spec/services/merge_requests/merge_request_diff_cache_service_spec.rb
index 807f89e80b7..05cdbe5287a 100644
--- a/spec/services/merge_requests/merge_request_diff_cache_service_spec.rb
+++ b/spec/services/merge_requests/merge_request_diff_cache_service_spec.rb
@@ -10,6 +10,7 @@ describe MergeRequests::MergeRequestDiffCacheService do
 
       expect(Rails.cache).to receive(:read).with(cache_key).and_return({})
       expect(Rails.cache).to receive(:write).with(cache_key, anything)
+      allow_any_instance_of(Gitlab::Diff::File).to receive(:blob).and_return(double("text?" => true))
 
       subject.execute(merge_request)
     end
-- 
GitLab