diff options
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.rb | 38 |
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 |