summaryrefslogtreecommitdiff
path: root/app
diff options
context:
space:
mode:
authorPaco Guzman <pacoguzmanp@gmail.com>2016-07-27 13:09:52 +0200
committerPaco Guzman <pacoguzmanp@gmail.com>2016-08-03 07:00:20 +0200
commit1d0c7b74920a94e488e6a2c090abb3e525438053 (patch)
tree746321bd5aa1d580f8df0337389fb92bb64ca1eb /app
parent8f359ea9170b984ad43d126e17628c31ac3a1f14 (diff)
downloadgitlab-ce-1d0c7b74920a94e488e6a2c090abb3e525438053.tar.gz
Introduce Compare model in the codebase.
This object will manage Gitlab::Git::Compare instances
Diffstat (limited to 'app')
-rw-r--r--app/controllers/projects/compare_controller.rb18
-rw-r--r--app/controllers/projects/merge_requests_controller.rb7
-rw-r--r--app/models/commit.rb2
-rw-r--r--app/models/compare.rb47
-rw-r--r--app/models/merge_request.rb8
-rw-r--r--app/services/compare_service.rb7
-rw-r--r--app/services/merge_requests/build_service.rb2
-rw-r--r--app/services/merge_requests/merge_request_diff_cache_service.rb2
-rw-r--r--app/views/projects/commit/show.html.haml2
-rw-r--r--app/views/projects/compare/show.html.haml2
-rw-r--r--app/views/projects/diffs/_diffs.html.haml7
-rw-r--r--app/views/projects/merge_requests/_new_submit.html.haml2
-rw-r--r--app/views/projects/merge_requests/show/_diffs.html.haml2
-rw-r--r--app/workers/emails_on_push_worker.rb20
14 files changed, 82 insertions, 46 deletions
diff --git a/app/controllers/projects/compare_controller.rb b/app/controllers/projects/compare_controller.rb
index 252ddfa429a..7fca5e77f32 100644
--- a/app/controllers/projects/compare_controller.rb
+++ b/app/controllers/projects/compare_controller.rb
@@ -21,7 +21,7 @@ class Projects::CompareController < Projects::ApplicationController
def diff_for_path
return render_404 unless @compare
- render_diff_for_path(Compare.decorate(@compare, @project).diff_file_collection(diff_options: diff_options))
+ render_diff_for_path(@compare.diff_file_collection(diff_options: diff_options))
end
def create
@@ -40,18 +40,12 @@ class Projects::CompareController < Projects::ApplicationController
@compare = CompareService.new.execute(@project, @head_ref, @project, @start_ref)
if @compare
- @commits = Commit.decorate(@compare.commits, @project)
+ @commits = @compare.commits
+ @start_commit = @compare.start_commit
+ @commit = @compare.commit
+ @base_commit = @compare.base_commit
- @start_commit = @project.commit(@start_ref)
- @commit = @project.commit(@head_ref)
- @base_commit = @project.merge_base_commit(@start_ref, @head_ref)
-
- diff_refs = Gitlab::Diff::DiffRefs.new(
- base_sha: @base_commit.try(:sha),
- start_sha: @start_commit.try(:sha),
- head_sha: @commit.try(:sha)
- )
- @diffs = Compare.decorate(@compare, @project).diff_file_collection(diff_options: diff_options, diff_refs: diff_refs)
+ @diffs = @compare.diff_file_collection(diff_options: diff_options)
@diff_notes_disabled = true
@grouped_diff_discussions = {}
diff --git a/app/controllers/projects/merge_requests_controller.rb b/app/controllers/projects/merge_requests_controller.rb
index 39e7d0f6182..20afc6afcb2 100644
--- a/app/controllers/projects/merge_requests_controller.rb
+++ b/app/controllers/projects/merge_requests_controller.rb
@@ -86,7 +86,7 @@ class Projects::MergeRequestsController < Projects::ApplicationController
respond_to do |format|
format.html { define_discussion_vars }
format.json do
- @diffs = @merge_request.diff_file_collection(diff_options) if @merge_request_diff.collected?
+ @diffs = @merge_request.diff_file_collection(diff_options)
render json: { html: view_to_html_string("projects/merge_requests/show/_diffs") }
end
@@ -157,10 +157,7 @@ class Projects::MergeRequestsController < Projects::ApplicationController
@commit = @merge_request.diff_head_commit
@base_commit = @merge_request.diff_base_commit
if @merge_request.compare
- @diffs = Compare.decorate(@merge_request.compare, @project).diff_file_collection(
- diff_options: diff_options,
- diff_refs: @merge_request.diff_refs
- )
+ @diffs = @merge_request.diff_file_collection(diff_options)
end
@diff_notes_disabled = true
diff --git a/app/models/commit.rb b/app/models/commit.rb
index d22ecb222e5..a339d47f5f3 100644
--- a/app/models/commit.rb
+++ b/app/models/commit.rb
@@ -317,7 +317,7 @@ class Commit
nil
end
- def diff_file_collection(diff_options)
+ def diff_file_collection(diff_options = nil)
Gitlab::Diff::FileCollection::Commit.new(self, diff_options: diff_options)
end
diff --git a/app/models/compare.rb b/app/models/compare.rb
index 6672d1bf059..05c8fbbcc36 100644
--- a/app/models/compare.rb
+++ b/app/models/compare.rb
@@ -1,5 +1,5 @@
class Compare
- delegate :commits, :same, :head, :base, to: :@compare
+ delegate :same, :head, :base, to: :@compare
def self.decorate(compare, project)
if compare.is_a?(Compare)
@@ -14,10 +14,53 @@ class Compare
@project = project
end
- def diff_file_collection(diff_options:, diff_refs: nil)
+ def commits
+ @commits ||= Commit.decorate(@compare.commits, @project)
+ end
+
+ def start_commit
+ return @start_commit if defined?(@start_commit)
+
+ commit = @compare.base
+ @start_commit = commit ? ::Commit.new(commit, @project) : nil
+ end
+
+ def commit
+ return @commit if defined?(@commit)
+
+ commit = @compare.head
+ @commit = commit ? ::Commit.new(commit, @project) : nil
+ end
+ alias_method :head_commit, :commit
+
+ # Used only on emails_on_push_worker.rb
+ def base_commit=(commit)
+ @base_commit = commit
+ end
+
+ def base_commit
+ return @base_commit if defined?(@base_commit)
+
+ @base_commit = if start_commit && commit
+ @project.merge_base_commit(start_commit.id, commit.id)
+ else
+ nil
+ end
+ end
+
+ # keyword args until we get ride of diff_refs as argument
+ def diff_file_collection(diff_options:, diff_refs: self.diff_refs)
Gitlab::Diff::FileCollection::Compare.new(@compare,
project: @project,
diff_options: diff_options,
diff_refs: diff_refs)
end
+
+ def diff_refs
+ @diff_refs ||= Gitlab::Diff::DiffRefs.new(
+ base_sha: base_commit.try(:sha),
+ start_sha: start_commit.try(:sha),
+ head_sha: commit.try(:sha)
+ )
+ end
end
diff --git a/app/models/merge_request.rb b/app/models/merge_request.rb
index abc8bacbe59..62e5573dfdc 100644
--- a/app/models/merge_request.rb
+++ b/app/models/merge_request.rb
@@ -168,8 +168,12 @@ class MergeRequest < ActiveRecord::Base
merge_request_diff ? merge_request_diff.diffs(*args) : compare.diffs(*args)
end
- def diff_file_collection(diff_options)
- Gitlab::Diff::FileCollection::MergeRequest.new(self, diff_options: diff_options)
+ def diff_file_collection(diff_options = nil)
+ if self.compare
+ self.compare.diff_file_collection(diff_options: diff_options, diff_refs: diff_refs)
+ else
+ Gitlab::Diff::FileCollection::MergeRequest.new(self, diff_options: diff_options)
+ end
end
def diff_size
diff --git a/app/services/compare_service.rb b/app/services/compare_service.rb
index 149822aa647..bb3aff72b47 100644
--- a/app/services/compare_service.rb
+++ b/app/services/compare_service.rb
@@ -20,10 +20,13 @@ class CompareService
)
end
- Gitlab::Git::Compare.new(
+ raw_compare = Gitlab::Git::Compare.new(
target_project.repository.raw_repository,
target_branch,
- source_sha,
+ source_sha
)
+
+ # REVIEW be sure if it's target_project or source_project
+ Compare.new(raw_compare, target_project)
end
end
diff --git a/app/services/merge_requests/build_service.rb b/app/services/merge_requests/build_service.rb
index 7fe57747265..290742f1506 100644
--- a/app/services/merge_requests/build_service.rb
+++ b/app/services/merge_requests/build_service.rb
@@ -34,7 +34,7 @@ module MergeRequests
# At this point we decide if merge request can be created
# If we have at least one commit to merge -> creation allowed
if commits.present?
- merge_request.compare_commits = Commit.decorate(commits, merge_request.source_project)
+ merge_request.compare_commits = commits
merge_request.can_be_created = true
merge_request.compare = compare
else
diff --git a/app/services/merge_requests/merge_request_diff_cache_service.rb b/app/services/merge_requests/merge_request_diff_cache_service.rb
index 982540ba7f5..8151c24d1b0 100644
--- a/app/services/merge_requests/merge_request_diff_cache_service.rb
+++ b/app/services/merge_requests/merge_request_diff_cache_service.rb
@@ -2,7 +2,7 @@ module MergeRequests
class MergeRequestDiffCacheService
def execute(merge_request)
# Executing the iteration we cache all the highlighted diff information
- merge_request.diff_file_collection(Gitlab::Diff::FileCollection.default_options).diff_files.to_a
+ merge_request.diff_file_collection.diff_files.to_a
end
end
end
diff --git a/app/views/projects/commit/show.html.haml b/app/views/projects/commit/show.html.haml
index 11b2020f99b..ed44d86a687 100644
--- a/app/views/projects/commit/show.html.haml
+++ b/app/views/projects/commit/show.html.haml
@@ -7,7 +7,7 @@
= render "ci_menu"
- else
%div.block-connector
-= render "projects/diffs/diffs", diff_files: @diffs.diff_files, project: @diffs.project, diff_refs: @diffs.diff_refs
+= render "projects/diffs/diffs", diffs: @diffs
= render "projects/notes/notes_with_form"
- if can_collaborate_with_project?
- %w(revert cherry-pick).each do |type|
diff --git a/app/views/projects/compare/show.html.haml b/app/views/projects/compare/show.html.haml
index eb8a1bd5289..819e9bc15ae 100644
--- a/app/views/projects/compare/show.html.haml
+++ b/app/views/projects/compare/show.html.haml
@@ -8,7 +8,7 @@
- if @commits.present?
= render "projects/commits/commit_list"
- = render "projects/diffs/diffs", diff_files: @diffs.diff_files, project: @diffs.project, diff_refs: @diffs.diff_refs
+ = render "projects/diffs/diffs", diffs: @diffs
- else
.light-well
.center
diff --git a/app/views/projects/diffs/_diffs.html.haml b/app/views/projects/diffs/_diffs.html.haml
index 45895a9a3de..35fdf7d5278 100644
--- a/app/views/projects/diffs/_diffs.html.haml
+++ b/app/views/projects/diffs/_diffs.html.haml
@@ -1,4 +1,5 @@
- show_whitespace_toggle = local_assigns.fetch(:show_whitespace_toggle, true)
+- diff_files = diffs.diff_files
- if diff_view == 'parallel'
- fluid_layout true
@@ -26,7 +27,7 @@
- diff_commit = commit_for_diff(diff_file)
- blob = diff_file.blob(diff_commit)
- next unless blob
- - blob.load_all_data!(project.repository) unless blob.only_display_raw?
+ - blob.load_all_data!(@project.repository) unless blob.only_display_raw?
- = render 'projects/diffs/file', i: index, project: project,
- diff_file: diff_file, diff_commit: diff_commit, blob: blob, diff_refs: diff_refs
+ = render 'projects/diffs/file', i: index, project: @project,
+ diff_file: diff_file, diff_commit: diff_commit, blob: blob, diff_refs: diffs.diff_refs
diff --git a/app/views/projects/merge_requests/_new_submit.html.haml b/app/views/projects/merge_requests/_new_submit.html.haml
index cb2b623691c..598bd743676 100644
--- a/app/views/projects/merge_requests/_new_submit.html.haml
+++ b/app/views/projects/merge_requests/_new_submit.html.haml
@@ -42,7 +42,7 @@
%h4 This comparison includes more than #{MergeRequestDiff::COMMITS_SAFE_SIZE} commits.
%p To preserve performance the line changes are not shown.
- else
- = render "projects/diffs/diffs", diff_files: @diffs.diff_files, project: @diffs.project, diff_refs: @merge_request.diff_refs, show_whitespace_toggle: false
+ = render "projects/diffs/diffs", diffs: @diffs, show_whitespace_toggle: false
- if @pipeline
#builds.builds.tab-pane
= render "projects/merge_requests/show/builds"
diff --git a/app/views/projects/merge_requests/show/_diffs.html.haml b/app/views/projects/merge_requests/show/_diffs.html.haml
index 5b842dd9280..c6d2567af35 100644
--- a/app/views/projects/merge_requests/show/_diffs.html.haml
+++ b/app/views/projects/merge_requests/show/_diffs.html.haml
@@ -1,5 +1,5 @@
- if @merge_request_diff.collected?
- = render "projects/diffs/diffs", diff_files: @diffs.diff_files,
+ = render "projects/diffs/diffs", diffs: @diffs,
diff_refs: @diffs.diff_refs, project: @diffs.project
- elsif @merge_request_diff.empty?
.nothing-here-block Nothing to merge from #{@merge_request.source_branch} into #{@merge_request.target_branch}
diff --git a/app/workers/emails_on_push_worker.rb b/app/workers/emails_on_push_worker.rb
index 0b6a01a3200..0b63913cfd1 100644
--- a/app/workers/emails_on_push_worker.rb
+++ b/app/workers/emails_on_push_worker.rb
@@ -33,25 +33,19 @@ class EmailsOnPushWorker
reverse_compare = false
if action == :push
- merge_base_sha = project.merge_base_commit(before_sha, after_sha).try(:sha)
+ base_commit = project.merge_base_commit(before_sha, after_sha)
compare = Gitlab::Git::Compare.new(project.repository.raw_repository, before_sha, after_sha)
-
- diff_refs = Gitlab::Diff::DiffRefs.new(
- base_sha: merge_base_sha,
- start_sha: before_sha,
- head_sha: after_sha
- )
+ compare = Compare.decorate(compare, project)
+ compare.base_commit = base_commit
+ diff_refs = compare.diff_refs
return false if compare.same
if compare.commits.empty?
compare = Gitlab::Git::Compare.new(project.repository.raw_repository, after_sha, before_sha)
-
- diff_refs = Gitlab::Diff::DiffRefs.new(
- base_sha: merge_base_sha,
- start_sha: after_sha,
- head_sha: before_sha
- )
+ compare = Compare.decorate(compare, project)
+ compare.base_commit = base_commit
+ diff_refs = compare.diff_refs
reverse_compare = true