Welcome to mirror list, hosted at ThFree Co, Russian Federation.

reviewers.rb « weightage « danger « tooling - gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: e74fce37187215e59aaef5be92024d5aa976d369 (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
# frozen_string_literal: true

require_relative '../weightage'

module Tooling
  module Danger
    module Weightage
      # Weights after (current multiplier of 2)
      #
      # +------------------------------+--------------------------------+
      # |        reviewer type         | weight(times in reviewer pool) |
      # +------------------------------+--------------------------------+
      # | reduced capacity reviewer    |                              1 |
      # | reviewer                     |                              2 |
      # | hungry reviewer              |                              4 |
      # | reduced capacity traintainer |                              3 |
      # | traintainer                  |                              6 |
      # | hungry traintainer           |                              8 |
      # +------------------------------+--------------------------------+
      #
      class Reviewers
        DEFAULT_REVIEWER_WEIGHT = CAPACITY_MULTIPLIER * BASE_REVIEWER_WEIGHT
        TRAINTAINER_WEIGHT = 3

        def initialize(reviewers, traintainers)
          @reviewers = reviewers
          @traintainers = traintainers
        end

        def execute
          # TODO: take CODEOWNERS into account?
          # https://gitlab.com/gitlab-org/gitlab/issues/26723

          weighted_reviewers + weighted_traintainers
        end

        private

        attr_reader :reviewers, :traintainers

        def weighted_reviewers
          reviewers.each_with_object([]) do |reviewer, total_reviewers|
            add_weighted_reviewer(total_reviewers, reviewer, BASE_REVIEWER_WEIGHT)
          end
        end

        def weighted_traintainers
          traintainers.each_with_object([]) do |reviewer, total_traintainers|
            add_weighted_reviewer(total_traintainers, reviewer, TRAINTAINER_WEIGHT)
          end
        end

        def add_weighted_reviewer(reviewers, reviewer, weight)
          if reviewer.reduced_capacity
            reviewers.fill(reviewer, reviewers.size, weight)
          elsif reviewer.hungry
            reviewers.fill(reviewer, reviewers.size, weight * CAPACITY_MULTIPLIER + DEFAULT_REVIEWER_WEIGHT)
          else
            reviewers.fill(reviewer, reviewers.size, weight * CAPACITY_MULTIPLIER)
          end
        end
      end
    end
  end
end