38 lines
1,015 B
Ruby
38 lines
1,015 B
Ruby
|
# frozen_string_literal: true
|
||
|
|
||
|
module Gitlab
|
||
|
module Checks
|
||
|
class PushFileCountCheck < BaseChecker
|
||
|
attr_reader :repository, :newrev, :limit, :logger
|
||
|
|
||
|
LOG_MESSAGES = {
|
||
|
diff_content_check: "Validating diff contents being single file..."
|
||
|
}.freeze
|
||
|
|
||
|
ERROR_MESSAGES = {
|
||
|
upper_limit: "The repository can contain at most %{limit} file(s).",
|
||
|
lower_limit: "The repository must contain at least 1 file."
|
||
|
}.freeze
|
||
|
|
||
|
def initialize(change, repository:, limit:, logger:)
|
||
|
@repository = repository
|
||
|
@newrev = change[:newrev]
|
||
|
@limit = limit
|
||
|
@logger = logger
|
||
|
end
|
||
|
|
||
|
def validate!
|
||
|
file_count = repository.ls_files(newrev).size
|
||
|
|
||
|
if file_count > limit
|
||
|
raise ::Gitlab::GitAccess::ForbiddenError, ERROR_MESSAGES[:upper_limit] % { limit: limit }
|
||
|
end
|
||
|
|
||
|
if file_count == 0
|
||
|
raise ::Gitlab::GitAccess::ForbiddenError, ERROR_MESSAGES[:lower_limit]
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|