File: groups.rb

package info (click to toggle)
gitlab 17.6.5-19
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 629,368 kB
  • sloc: ruby: 1,915,304; javascript: 557,307; sql: 60,639; xml: 6,509; sh: 4,567; makefile: 1,239; python: 406
file content (70 lines) | stat: -rw-r--r-- 2,030 bytes parent folder | download
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
# frozen_string_literal: true

module Keeps
  module Helpers
    class Groups
      GROUPS_JSON_URL = "https://about.gitlab.com/groups.json"
      Error = Class.new(StandardError)

      def group_for_feature_category(category)
        return unless category

        groups.find do |_, group|
          group['categories'].present? && group['categories'].include?(category)
        end&.last
      end

      def group_for_group_label(group_label)
        groups.find do |_, group|
          group['label'] == group_label
        end&.last
      end

      def pick_reviewer(group, identifiers)
        return unless group
        return if group['backend_engineers'].empty?

        # Use the change identifiers as a stable way to pick the same reviewer. Otherwise we'd assign a new reviewer
        # every time we re-ran housekeeper.
        random_engineer = Digest::SHA256.hexdigest(identifiers.join).to_i(16) % group['backend_engineers'].size

        group['backend_engineers'][random_engineer]
      end

      def pick_reviewer_for_feature_category(category, identifiers, fallback_feature_category: nil)
        pick_reviewer(
          group_for_feature_category(category),
          identifiers
        ) || pick_reviewer(
          group_for_feature_category(fallback_feature_category),
          identifiers
        )
      end

      def labels_for_feature_category(category)
        Array(
          group_for_feature_category(category)&.dig('label')
        )
      end

      private

      def groups
        @groups ||= fetch_groups
      end

      def fetch_groups
        @groups_json ||= begin
          response = Gitlab::HTTP_V2.get(GROUPS_JSON_URL)

          unless (200..299).cover?(response.code)
            raise Error,
              "Failed to get group information with response code: #{response.code} and body:\n#{response.body}"
          end

          JSON.parse(response.body) # rubocop:disable Gitlab/Json -- We don't rely on GitLab internal classes
        end
      end
    end
  end
end