summaryrefslogtreecommitdiff
path: root/lib/gitlab/diff/file_collection
diff options
context:
space:
mode:
authorGitLab Bot <gitlab-bot@gitlab.com>2019-10-09 21:06:24 +0000
committerGitLab Bot <gitlab-bot@gitlab.com>2019-10-09 21:06:24 +0000
commit4b28d5ae770c6bd332283a3f13ceae06329c409b (patch)
treeae4d46e1d017002935fe75dc14cb3c108be12fae /lib/gitlab/diff/file_collection
parent41efffa17c67405ca5f5dac49d72be7872cee339 (diff)
downloadgitlab-ce-4b28d5ae770c6bd332283a3f13ceae06329c409b.tar.gz
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'lib/gitlab/diff/file_collection')
-rw-r--r--lib/gitlab/diff/file_collection/merge_request_diff.rb14
-rw-r--r--lib/gitlab/diff/file_collection/merge_request_diff_base.rb21
-rw-r--r--lib/gitlab/diff/file_collection/merge_request_diff_batch.rb69
3 files changed, 91 insertions, 13 deletions
diff --git a/lib/gitlab/diff/file_collection/merge_request_diff.rb b/lib/gitlab/diff/file_collection/merge_request_diff.rb
index e29bf75f341..c4288ca6408 100644
--- a/lib/gitlab/diff/file_collection/merge_request_diff.rb
+++ b/lib/gitlab/diff/file_collection/merge_request_diff.rb
@@ -3,19 +3,7 @@
module Gitlab
module Diff
module FileCollection
- class MergeRequestDiff < Base
- extend ::Gitlab::Utils::Override
-
- def initialize(merge_request_diff, diff_options:)
- @merge_request_diff = merge_request_diff
-
- super(merge_request_diff,
- project: merge_request_diff.project,
- diff_options: diff_options,
- diff_refs: merge_request_diff.diff_refs,
- fallback_diff_refs: merge_request_diff.fallback_diff_refs)
- end
-
+ class MergeRequestDiff < MergeRequestDiffBase
def diff_files
diff_files = super
diff --git a/lib/gitlab/diff/file_collection/merge_request_diff_base.rb b/lib/gitlab/diff/file_collection/merge_request_diff_base.rb
new file mode 100644
index 00000000000..a747a6ed475
--- /dev/null
+++ b/lib/gitlab/diff/file_collection/merge_request_diff_base.rb
@@ -0,0 +1,21 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Diff
+ module FileCollection
+ class MergeRequestDiffBase < Base
+ extend ::Gitlab::Utils::Override
+
+ def initialize(merge_request_diff, diff_options:)
+ @merge_request_diff = merge_request_diff
+
+ super(merge_request_diff,
+ project: merge_request_diff.project,
+ diff_options: diff_options,
+ diff_refs: merge_request_diff.diff_refs,
+ fallback_diff_refs: merge_request_diff.fallback_diff_refs)
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/diff/file_collection/merge_request_diff_batch.rb b/lib/gitlab/diff/file_collection/merge_request_diff_batch.rb
new file mode 100644
index 00000000000..c6d1e0b93a7
--- /dev/null
+++ b/lib/gitlab/diff/file_collection/merge_request_diff_batch.rb
@@ -0,0 +1,69 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Diff
+ module FileCollection
+ # Builds a paginated diff file collection and collects pagination
+ # metadata.
+ #
+ # It doesn't handle caching yet as we're not prepared to write/read
+ # separate file keys (https://gitlab.com/gitlab-org/gitlab/issues/30550).
+ #
+ class MergeRequestDiffBatch < MergeRequestDiffBase
+ DEFAULT_BATCH_PAGE = 1
+ DEFAULT_BATCH_SIZE = 20
+
+ attr_reader :pagination_data
+
+ def initialize(merge_request_diff, batch_page, batch_size, diff_options:)
+ super(merge_request_diff, diff_options: diff_options)
+
+ batch_page ||= DEFAULT_BATCH_PAGE
+ batch_size ||= DEFAULT_BATCH_SIZE
+
+ @paginated_collection = relation.page(batch_page).per(batch_size)
+ @pagination_data = {
+ current_page: @paginated_collection.current_page,
+ next_page: @paginated_collection.next_page,
+ total_pages: @paginated_collection.total_pages
+ }
+ end
+
+ override :diffs
+ def diffs
+ strong_memoize(:diffs) do
+ @merge_request_diff.opening_external_diff do
+ # Avoiding any extra queries.
+ collection = @paginated_collection.to_a
+
+ # The offset collection and calculation is required so that we
+ # know how much has been loaded in previous batches, collapsing
+ # the current paginated set accordingly (collection limit calculation).
+ # See: https://docs.gitlab.com/ee/development/diffs.html#diff-collection-limits
+ #
+ offset_index = collection.first&.index
+ options = diff_options.dup
+
+ collection =
+ if offset_index && offset_index > 0
+ offset_collection = relation.limit(offset_index) # rubocop:disable CodeReuse/ActiveRecord
+ options[:offset_index] = offset_index
+ offset_collection + collection
+ else
+ collection
+ end
+
+ Gitlab::Git::DiffCollection.new(collection.map(&:to_hash), options)
+ end
+ end
+ end
+
+ private
+
+ def relation
+ @merge_request_diff.merge_request_diff_files
+ end
+ end
+ end
+ end
+end