Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'lib/gitlab/checks/file_size_check/allow_existing_oversized_blobs.rb')
-rw-r--r--lib/gitlab/checks/file_size_check/allow_existing_oversized_blobs.rb38
1 files changed, 38 insertions, 0 deletions
diff --git a/lib/gitlab/checks/file_size_check/allow_existing_oversized_blobs.rb b/lib/gitlab/checks/file_size_check/allow_existing_oversized_blobs.rb
new file mode 100644
index 00000000000..78f1716274e
--- /dev/null
+++ b/lib/gitlab/checks/file_size_check/allow_existing_oversized_blobs.rb
@@ -0,0 +1,38 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Checks
+ module FileSizeCheck
+ class AllowExistingOversizedBlobs
+ def initialize(project:, changes:, file_size_limit_megabytes:)
+ @project = project
+ @changes = changes
+ @oldrevs = changes.pluck(:oldrev).compact # rubocop:disable CodeReuse/ActiveRecord just plucking from an array
+ @file_size_limit_megabytes = file_size_limit_megabytes
+ end
+
+ def find(timeout: nil)
+ oversize_blobs = any_oversize_blobs.find(timeout: timeout)
+
+ return oversize_blobs unless oldrevs.present?
+
+ revs_paths = oldrevs.product(oversize_blobs.map(&:path))
+ existing_blobs = project.repository.blobs_at(revs_paths, blob_size_limit: 1)
+ map_existing_path_to_size = existing_blobs.group_by(&:path).transform_values { |blobs| blobs.map(&:size).max }
+
+ # return blobs that are going to be over the limit that were previously within the limit
+ oversize_blobs.select { |blob| map_existing_path_to_size.fetch(blob.path, 0) <= file_size_limit_megabytes }
+ end
+
+ private
+
+ attr_reader :project, :changes, :newrevs, :oldrevs, :file_size_limit_megabytes
+
+ def any_oversize_blobs
+ AnyOversizedBlobs.new(project: project, changes: changes,
+ file_size_limit_megabytes: file_size_limit_megabytes)
+ end
+ end
+ end
+ end
+end