diff options
Diffstat (limited to 'lib/gitlab/diff/file_collection')
-rw-r--r-- | lib/gitlab/diff/file_collection/base.rb | 18 | ||||
-rw-r--r-- | lib/gitlab/diff/file_collection/merge_request_diff_base.rb | 8 | ||||
-rw-r--r-- | lib/gitlab/diff/file_collection/merge_request_diff_batch.rb | 21 |
3 files changed, 37 insertions, 10 deletions
diff --git a/lib/gitlab/diff/file_collection/base.rb b/lib/gitlab/diff/file_collection/base.rb index cf0611e44da..8f4f8febec0 100644 --- a/lib/gitlab/diff/file_collection/base.rb +++ b/lib/gitlab/diff/file_collection/base.rb @@ -30,12 +30,16 @@ module Gitlab @diffs ||= diffable.raw_diffs(diff_options) end - def diff_files - raw_diff_files + def diff_files(sorted: false) + raw_diff_files(sorted: sorted) end - def raw_diff_files - @raw_diff_files ||= diffs.decorate! { |diff| decorate_diff!(diff) } + def raw_diff_files(sorted: false) + strong_memoize(:"raw_diff_files_#{sorted}") do + collection = diffs.decorate! { |diff| decorate_diff!(diff) } + collection = sort_diffs(collection) if sorted + collection + end end def diff_file_paths @@ -111,6 +115,12 @@ module Gitlab fallback_diff_refs: fallback_diff_refs, stats: stats) end + + def sort_diffs(diffs) + return diffs unless Feature.enabled?(:sort_diffs, project, default_enabled: false) + + Gitlab::Diff::FileCollectionSorter.new(diffs).sort + end end end end diff --git a/lib/gitlab/diff/file_collection/merge_request_diff_base.rb b/lib/gitlab/diff/file_collection/merge_request_diff_base.rb index 16257bb5ff5..d2ca86fdfe7 100644 --- a/lib/gitlab/diff/file_collection/merge_request_diff_base.rb +++ b/lib/gitlab/diff/file_collection/merge_request_diff_base.rb @@ -16,7 +16,7 @@ module Gitlab fallback_diff_refs: merge_request_diff.fallback_diff_refs) end - def diff_files + def diff_files(sorted: false) strong_memoize(:diff_files) do diff_files = super @@ -26,6 +26,12 @@ module Gitlab end end + def raw_diff_files(sorted: false) + # We force `sorted` to `false` as we don't need to sort the diffs when + # dealing with `MergeRequestDiff` since we sort its files on create. + super(sorted: false) + end + override :write_cache def write_cache highlight_cache.write_if_empty diff --git a/lib/gitlab/diff/file_collection/merge_request_diff_batch.rb b/lib/gitlab/diff/file_collection/merge_request_diff_batch.rb index 9af66318b89..64523f3b730 100644 --- a/lib/gitlab/diff/file_collection/merge_request_diff_batch.rb +++ b/lib/gitlab/diff/file_collection/merge_request_diff_batch.rb @@ -11,7 +11,7 @@ module Gitlab # class MergeRequestDiffBatch < MergeRequestDiffBase DEFAULT_BATCH_PAGE = 1 - DEFAULT_BATCH_SIZE = 20 + DEFAULT_BATCH_SIZE = 30 attr_reader :pagination_data @@ -21,9 +21,9 @@ module Gitlab @paginated_collection = load_paginated_collection(batch_page, batch_size, diff_options) @pagination_data = { - current_page: @paginated_collection.current_page, - next_page: @paginated_collection.next_page, - total_pages: @paginated_collection.total_pages + current_page: batch_gradual_load? ? nil : @paginated_collection.current_page, + next_page: batch_gradual_load? ? nil : @paginated_collection.next_page, + total_pages: batch_gradual_load? ? relation.size : @paginated_collection.total_pages } end @@ -62,17 +62,28 @@ module Gitlab @merge_request_diff.merge_request_diff_files end + # rubocop: disable CodeReuse/ActiveRecord def load_paginated_collection(batch_page, batch_size, diff_options) batch_page ||= DEFAULT_BATCH_PAGE batch_size ||= DEFAULT_BATCH_SIZE paths = diff_options&.fetch(:paths, nil) - paginated_collection = relation.page(batch_page).per(batch_size) + paginated_collection = if batch_gradual_load? + relation.offset(batch_page).limit([batch_size.to_i, DEFAULT_BATCH_SIZE].min) + else + relation.page(batch_page).per(batch_size) + end + paginated_collection = paginated_collection.by_paths(paths) if paths paginated_collection end + # rubocop: enable CodeReuse/ActiveRecord + + def batch_gradual_load? + Feature.enabled?(:diffs_gradual_load, @merge_request_diff.project, default_enabled: true) + end end end end |