diff options
Diffstat (limited to 'app/models/merge_request_diff.rb')
-rw-r--r-- | app/models/merge_request_diff.rb | 25 |
1 files changed, 22 insertions, 3 deletions
diff --git a/app/models/merge_request_diff.rb b/app/models/merge_request_diff.rb index 880e3cc1ba5..24809141570 100644 --- a/app/models/merge_request_diff.rb +++ b/app/models/merge_request_diff.rb @@ -106,6 +106,17 @@ class MergeRequestDiff < ApplicationRecord joins(merge_request: :metrics).where(condition) end + scope :latest_diff_for_merge_requests, -> (merge_requests) do + inner_select = MergeRequestDiff + .default_scoped + .distinct + .select("FIRST_VALUE(id) OVER (PARTITION BY merge_request_id ORDER BY created_at DESC) as id") + .where(merge_request: merge_requests) + + joins("INNER JOIN (#{inner_select.to_sql}) latest_diffs ON latest_diffs.id = merge_request_diffs.id") + .includes(:merge_request_diff_commits) + end + class << self def ids_for_external_storage_migration(limit:) return [] unless Gitlab.config.external_diffs.enabled @@ -280,7 +291,13 @@ class MergeRequestDiff < ApplicationRecord end def commit_shas(limit: nil) - merge_request_diff_commits.limit(limit).pluck(:sha) + if association(:merge_request_diff_commits).loaded? + sorted_diff_commits = merge_request_diff_commits.sort_by { |diff_commit| [diff_commit.id, diff_commit.relative_order] } + sorted_diff_commits = sorted_diff_commits.take(limit) if limit + sorted_diff_commits.map(&:sha) + else + merge_request_diff_commits.limit(limit).pluck(:sha) + end end def includes_any_commits?(shas) @@ -509,6 +526,8 @@ class MergeRequestDiff < ApplicationRecord end def encode_in_base64?(diff_text) + return false if diff_text.nil? + (diff_text.encoding == Encoding::BINARY && !diff_text.ascii_only?) || diff_text.include?("\0") end @@ -536,7 +555,7 @@ class MergeRequestDiff < ApplicationRecord rows.each do |row| data = row.delete(:diff) row[:external_diff_offset] = file.pos - row[:external_diff_size] = data.bytesize + row[:external_diff_size] = data&.bytesize || 0 file.write(data) end @@ -651,7 +670,7 @@ class MergeRequestDiff < ApplicationRecord if compare.commits.empty? new_attributes[:state] = :empty else - diff_collection = compare.diffs(Commit.max_diff_options) + diff_collection = compare.diffs(Commit.max_diff_options(project: merge_request.project)) new_attributes[:real_size] = diff_collection.real_size if diff_collection.any? |