From 2c0de7aaafd5fb842618bb7fa218e11255363bc8 Mon Sep 17 00:00:00 2001 From: Douwe Maan Date: Fri, 31 Mar 2017 17:49:43 -0600 Subject: [PATCH] Cache MR diffs by diff refs --- app/models/merge_request.rb | 6 +++++- lib/gitlab/diff/diff_refs.rb | 6 ++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/app/models/merge_request.rb b/app/models/merge_request.rb index 1b6e898a7fd..95e41106b49 100644 --- a/app/models/merge_request.rb +++ b/app/models/merge_request.rb @@ -368,7 +368,11 @@ class MergeRequest < ActiveRecord::Base end def merge_request_diff_for(diff_refs) - merge_request_diffs.viewable.select_without_diff.with_diff_refs(diff_refs).take + @merge_request_diffs_by_diff_refs ||= Hash.new do |h, diff_refs| + h[diff_refs] = merge_request_diffs.viewable.select_without_diff.with_diff_refs(diff_refs).take + end + + @merge_request_diffs_by_diff_refs[diff_refs] end def reload_diff_if_branch_changed diff --git a/lib/gitlab/diff/diff_refs.rb b/lib/gitlab/diff/diff_refs.rb index 8406ca4269c..7948782aecc 100644 --- a/lib/gitlab/diff/diff_refs.rb +++ b/lib/gitlab/diff/diff_refs.rb @@ -18,6 +18,12 @@ module Gitlab head_sha == other.head_sha end + alias_method :eql?, :== + + def hash + [base_sha, start_sha, head_sha].hash + end + # There is only one case in which we will have `start_sha` and `head_sha`, # but not `base_sha`, which is when a diff is generated between an # orphaned branch and another branch, which means there _is_ no base, but