# frozen_string_literal: true emoji_checker_path = File.expand_path('emoji_checker', __dir__) defined?(Rails) ? require_dependency(emoji_checker_path) : require_relative(emoji_checker_path) module Gitlab module Danger class CommitLinter MIN_SUBJECT_WORDS_COUNT = 3 MAX_LINE_LENGTH = 72 MAX_CHANGED_FILES_IN_COMMIT = 3 MAX_CHANGED_LINES_IN_COMMIT = 30 SHORT_REFERENCE_REGEX = %r{([\w\-\/]+)?(? MAX_CHANGED_FILES_IN_COMMIT && lines_changed > MAX_CHANGED_LINES_IN_COMMIT end def subject message_parts[0].delete_prefix(WIP_PREFIX) end def separator message_parts[1] end def details message_parts[2]&.gsub(/^Signed-off-by.*$/, '') end def line_too_long?(line) case line when String line.length > MAX_LINE_LENGTH when Integer line > MAX_LINE_LENGTH else raise ArgumentError, "The line argument (#{line}) should be a String or an Integer! #{line.class} given." end end def subject_too_short? subject.split(' ').length < MIN_SUBJECT_WORDS_COUNT end def subject_too_long? line_too_long?(subject) end def subject_starts_with_lowercase? first_char = subject.sub(/\A\[.+\]\s/, '')[0] first_char_downcased = first_char.downcase return true unless ('a'..'z').cover?(first_char_downcased) first_char.downcase == first_char end def subject_ends_with_a_period? subject.end_with?('.') end def message_contains_text_emoji? emoji_checker.includes_text_emoji?(commit.message) end def message_contains_unicode_emoji? emoji_checker.includes_unicode_emoji?(commit.message) end def message_contains_short_reference? commit.message.match?(SHORT_REFERENCE_REGEX) end def emoji_checker @emoji_checker ||= Gitlab::Danger::EmojiChecker.new end def message_parts @message_parts ||= commit.message.split("\n", 3) end end end end