diff options
Diffstat (limited to 'app/models/merge_request_diff.rb')
-rw-r--r-- | app/models/merge_request_diff.rb | 31 |
1 files changed, 19 insertions, 12 deletions
diff --git a/app/models/merge_request_diff.rb b/app/models/merge_request_diff.rb index 8b5f10ce159..735ad046f22 100644 --- a/app/models/merge_request_diff.rb +++ b/app/models/merge_request_diff.rb @@ -83,7 +83,7 @@ class MergeRequestDiff < ApplicationRecord metrics_join = mr_diffs.join(mr_metrics).on(metrics_join_condition) - condition = MergeRequest.arel_table[:state].eq(:merged) + condition = MergeRequest.arel_table[:state_id].eq(MergeRequest.available_states[:merged]) .and(MergeRequest::Metrics.arel_table[:merged_at].lteq(before)) .and(MergeRequest::Metrics.arel_table[:merged_at].not_eq(nil)) @@ -91,7 +91,7 @@ class MergeRequestDiff < ApplicationRecord end scope :old_closed_diffs, -> (before) do - condition = MergeRequest.arel_table[:state].eq(:closed) + condition = MergeRequest.arel_table[:state_id].eq(MergeRequest.available_states[:closed]) .and(MergeRequest::Metrics.arel_table[:latest_closed_at].lteq(before)) joins(merge_request: :metrics).where(condition) @@ -136,6 +136,7 @@ class MergeRequestDiff < ApplicationRecord # All diff information is collected from repository after object is created. # It allows you to override variables like head_commit_sha before getting diff. after_create :save_git_content, unless: :importing? + after_create_commit :set_as_latest_diff after_save :update_external_diff_store, if: -> { !importing? && saved_change_to_external_diff? } @@ -150,10 +151,6 @@ class MergeRequestDiff < ApplicationRecord # Collect information about commits and diff from repository # and save it to the database as serialized data def save_git_content - MergeRequest - .where('id = ? AND COALESCE(latest_merge_request_diff_id, 0) < ?', self.merge_request_id, self.id) - .update_all(latest_merge_request_diff_id: self.id) - ensure_commit_shas save_commits save_diffs @@ -168,6 +165,12 @@ class MergeRequestDiff < ApplicationRecord keep_around_commits end + def set_as_latest_diff + MergeRequest + .where('id = ? AND COALESCE(latest_merge_request_diff_id, 0) < ?', self.merge_request_id, self.id) + .update_all(latest_merge_request_diff_id: self.id) + end + def ensure_commit_shas self.start_commit_sha ||= merge_request.target_branch_sha self.head_commit_sha ||= merge_request.source_branch_sha @@ -297,6 +300,13 @@ class MergeRequestDiff < ApplicationRecord base_commit_sha? && head_commit_sha? && start_commit_sha? end + def diffs_in_batch(batch_page, batch_size, diff_options:) + Gitlab::Diff::FileCollection::MergeRequestDiffBatch.new(self, + batch_page, + batch_size, + diff_options: diff_options) + end + def diffs(diff_options = nil) if without_files? && comparison = diff_refs&.compare_in(project) # It should fetch the repository when diffs are cleaned by the system. @@ -495,11 +505,6 @@ class MergeRequestDiff < ApplicationRecord merge_request.closed? && merge_request.metrics.latest_closed_at < EXTERNAL_DIFF_CUTOFF.ago end - # We can't rely on `merge_request.latest_merge_request_diff_id` because that - # may have been changed in `save_git_content` without being reflected in - # the association's instance. This query is always subject to races, but - # the worst case is that we *don't* make a diff external when we could. The - # background worker will make it external at a later date. def old_version? latest_id = MergeRequest .where(id: merge_request_id) @@ -507,7 +512,7 @@ class MergeRequestDiff < ApplicationRecord .pluck(:latest_merge_request_diff_id) .first - self.id != latest_id + latest_id && self.id < latest_id end def load_diffs(options) @@ -584,3 +589,5 @@ class MergeRequestDiff < ApplicationRecord end end end + +MergeRequestDiff.prepend_if_ee('EE::MergeRequestDiff') |