summaryrefslogtreecommitdiff
path: root/danger/frozen_string/Dangerfile
blob: bc598b16463770cb1dfaedf2323cca11a6f028be (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
39
40
41
42
43
44
45
46
47
# frozen_string_literal: true

FILE_EXTENSION = ".rb"
FROZEN_STRING_MAGIC_COMMENT = "# frozen_string_literal: true"
SHEBANG_COMMENT = "#!"

def get_files_with_no_magic_comment(files)
  files.select do |path|
    path.end_with?(FILE_EXTENSION) &&
      !file_has_frozen_string_magic_comment?(path)
  end
end

def file_has_frozen_string_magic_comment?(path)
  File.open(path) do |file|
    first_line = file.gets

    line_has_frozen_string_magic_comment?(first_line) ||
      (line_has_shebang?(first_line) &&
        line_has_frozen_string_magic_comment?(file.gets))
  end
end

def line_has_frozen_string_magic_comment?(line)
  line&.start_with?(FROZEN_STRING_MAGIC_COMMENT)
end

def line_has_shebang?(line)
  line&.start_with?(SHEBANG_COMMENT)
end

files_to_fix = get_files_with_no_magic_comment(git.added_files)

if files_to_fix.any?
  warn 'This merge request adds files that do not enforce frozen string literal. ' \
    'See https://gitlab.com/gitlab-org/gitlab-foss/issues/47424 for more information.'

  if GitlabDanger.new(helper.gitlab_helper).ci?
    markdown(<<~MARKDOWN)
      ## Enable Frozen String Literal

      The following files should have `#{FROZEN_STRING_MAGIC_COMMENT}` on the first line:

      * #{files_to_fix.map { |path| "`#{path}`" }.join("\n* ")}
    MARKDOWN
  end
end