diff options
author | Oswaldo Ferreira <oswaldo@gitlab.com> | 2018-03-07 22:29:12 -0300 |
---|---|---|
committer | Oswaldo Ferreira <oswaldo@gitlab.com> | 2018-03-07 22:46:29 -0300 |
commit | c6273ec50c019a115b11a8ef1032a64710f0a46a (patch) | |
tree | ce1a808bafc98f2181a621b75e293c4c27d1899e /app | |
parent | 7734e85bc6592c5ad3330c611c5f83a051b680b0 (diff) | |
download | gitlab-ce-c6273ec50c019a115b11a8ef1032a64710f0a46a.tar.gz |
Avoid re-fetching merge-base SHA from Gitaly unnecessarily
Diffstat (limited to 'app')
-rw-r--r-- | app/models/compare.rb | 36 | ||||
-rw-r--r-- | app/services/compare_service.rb | 9 |
2 files changed, 27 insertions, 18 deletions
diff --git a/app/models/compare.rb b/app/models/compare.rb index 3a8bbcb1acd..19ea2bc3065 100644 --- a/app/models/compare.rb +++ b/app/models/compare.rb @@ -1,4 +1,6 @@ class Compare + include Gitlab::Utils::StrongMemoize + delegate :same, :head, :base, to: :@compare attr_reader :project @@ -11,9 +13,10 @@ class Compare end end - def initialize(compare, project, straight: false) + def initialize(compare, project, base_sha: nil, straight: false) @compare = compare @project = project + @base_sha = base_sha @straight = straight end @@ -22,40 +25,41 @@ class Compare end def start_commit - return @start_commit if defined?(@start_commit) + strong_memoize(:start_commit) do + commit = @compare.base - commit = @compare.base - @start_commit = commit ? ::Commit.new(commit, project) : nil + ::Commit.new(commit, project) if commit + end end def head_commit - return @head_commit if defined?(@head_commit) + strong_memoize(:head_commit) do + commit = @compare.head - commit = @compare.head - @head_commit = commit ? ::Commit.new(commit, project) : nil + ::Commit.new(commit, project) if commit + end end alias_method :commit, :head_commit def base_commit - return @base_commit if defined?(@base_commit) + strong_memoize(:base_commit) do + return unless start_commit && head_commit + return OpenStruct.new(sha: @base_sha) if @base_sha - @base_commit = if start_commit && head_commit - project.merge_base_commit(start_commit.id, head_commit.id) - else - nil - end + project.merge_base_commit(start_commit.id, head_commit.id) + end end def start_commit_sha - start_commit.try(:sha) + start_commit&.sha end def base_commit_sha - base_commit.try(:sha) + base_commit&.sha end def head_commit_sha - commit.try(:sha) + commit&.sha end def raw_diffs(*args) diff --git a/app/services/compare_service.rb b/app/services/compare_service.rb index 1db91c3c90c..2a69a205629 100644 --- a/app/services/compare_service.rb +++ b/app/services/compare_service.rb @@ -10,9 +10,14 @@ class CompareService @start_ref_name = new_start_ref_name end - def execute(target_project, target_ref, straight: false) + def execute(target_project, target_ref, base_sha: nil, straight: false) raw_compare = target_project.repository.compare_source_branch(target_ref, start_project.repository, start_ref_name, straight: straight) - Compare.new(raw_compare, target_project, straight: straight) if raw_compare + return unless raw_compare + + Compare.new(raw_compare, + target_project, + base_sha: base_sha, + straight: straight) end end |