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

allow_existing_oversized_blobs.rb « file_size_check « checks « gitlab « lib - gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 78f1716274e0ddcf0d33f30a5a45e8b05f03132a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
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