summaryrefslogtreecommitdiff
path: root/lib/tasks/gitlab/tw/codeowners.rake
blob: 6574bfd2549a06c51332d564c181e855984a43ae (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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
# frozen_string_literal: true

require 'yaml'

namespace :tw do
  desc 'Generates a list of codeowners for documentation pages.'
  task :codeowners do
    CodeOwnerRule = Struct.new(:category, :writer)

    CODE_OWNER_RULES = [
      CodeOwnerRule.new('Activation', '@kpaizee'),
      CodeOwnerRule.new("Adoption", '@kpaizee'),
      CodeOwnerRule.new('Activation', '@kpaizee'),
      CodeOwnerRule.new('Adoption', '@kpaizee'),
      CodeOwnerRule.new('Authentication and Authorization', '@eread'),
      CodeOwnerRule.new('Certify', '@msedlakjakubowski'),
      CodeOwnerRule.new('Code Review', '@aqualls'),
      CodeOwnerRule.new('Compliance', '@eread'),
      CodeOwnerRule.new('Composition Analysis', '@rdickenson'),
      CodeOwnerRule.new('Configure', '@sselhorn'),
      CodeOwnerRule.new('Container Security', '@claytoncornell'),
      CodeOwnerRule.new('Contributor Experience', '@eread'),
      CodeOwnerRule.new('Conversion', '@kpaizee'),
      CodeOwnerRule.new('Database', '@aqualls'),
      CodeOwnerRule.new('Development', '@sselhorn'),
      CodeOwnerRule.new('Distribution', '@axil'),
      CodeOwnerRule.new('Distribution (Charts)', '@axil'),
      CodeOwnerRule.new('Distribution (Omnibus)', '@axil'),
      CodeOwnerRule.new('Documentation Guidelines', '@sselhorn'),
      CodeOwnerRule.new('Dynamic Analysis', '@rdickenson'),
      CodeOwnerRule.new('Ecosystem', '@kpaizee'),
      CodeOwnerRule.new('Editor', '@aqualls'),
      CodeOwnerRule.new('Expansion', '@kpaizee'),
      CodeOwnerRule.new('Foundations', '@rdickenson'),
      CodeOwnerRule.new('Fuzz Testing', '@rdickenson'),
      CodeOwnerRule.new('Geo', '@axil'),
      CodeOwnerRule.new('Gitaly', '@eread'),
      CodeOwnerRule.new('Global Search', '@sselhorn'),
      CodeOwnerRule.new('Import', '@eread'),
      CodeOwnerRule.new('Infrastructure', '@sselhorn'),
      CodeOwnerRule.new('Integrations', '@kpaizee'),
      CodeOwnerRule.new('Knowledge', '@aqualls'),
      CodeOwnerRule.new('Memory', '@sselhorn'),
      CodeOwnerRule.new('Monitor', '@msedlakjakubowski'),
      CodeOwnerRule.new('Observability', 'msedlakjakubowski'),
      CodeOwnerRule.new('Optimize', '@fneill'),
      CodeOwnerRule.new('Package', '@claytoncornell'),
      CodeOwnerRule.new('Pipeline Authoring', '@marcel.amirault'),
      CodeOwnerRule.new('Pipeline Execution', '@marcel.amirault'),
      CodeOwnerRule.new('Pipeline Insights', '@marcel.amirault'),
      CodeOwnerRule.new('Portfolio Management', '@msedlakjakubowski'),
      CodeOwnerRule.new('Product Intelligence', '@claytoncornell'),
      CodeOwnerRule.new('Product Planning', '@msedlakjakubowski'),
      CodeOwnerRule.new('Project Management', '@msedlakjakubowski'),
      CodeOwnerRule.new('Provision', '@fneill'),
      CodeOwnerRule.new('Purchase', '@fneill'),
      CodeOwnerRule.new('Redirect', 'Redirect'),
      CodeOwnerRule.new('Release', '@rdickenson'),
      CodeOwnerRule.new('Respond', '@msedlakjakubowski'),
      CodeOwnerRule.new('Runner', '@sselhorn'),
      CodeOwnerRule.new('Sharding', '@sselhorn'),
      CodeOwnerRule.new('Source Code', '@aqualls'),
      CodeOwnerRule.new('Static Analysis', '@rdickenson'),
      CodeOwnerRule.new('Static Site Editor', '@aqualls'),
      CodeOwnerRule.new('Style Guide', '@sselhorn'),
      CodeOwnerRule.new('Testing', '@eread'),
      CodeOwnerRule.new('Threat Insights', '@claytoncornell'),
      CodeOwnerRule.new('Utilization', '@fneill'),
      CodeOwnerRule.new('Vulnerability Research', '@claytoncornell'),
      CodeOwnerRule.new('Workspace', '@fneill')
    ].freeze

    Document = Struct.new(:group, :redirect) do
      def has_a_valid_group?
        group && !redirect
      end

      def missing_metadata?
        !group && !redirect
      end
    end

    def self.writer_for_group(category)
      CODE_OWNER_RULES.find { |rule| rule.category == category }&.writer
    end

    errors = []

    path = Rails.root.join("doc/**/*.md")
    Dir.glob(path) do |file|
      yaml_data = YAML.load_file(file)
      document = Document.new(yaml_data['group'], yaml_data['redirect_to'])

      if document.missing_metadata?
        errors << file
        next
      end

      writer = writer_for_group(document.group)
      next unless writer

      puts "#{file.gsub(Dir.pwd, ".")} #{writer}" if document.has_a_valid_group?
    end

    if errors.present?
      puts "-----"
      puts "ERRORS - the following files are missing the correct metadata:"
      errors.map { |file| puts file.gsub(Dir.pwd, ".")}
    end
  end
end