gitlab-dangerfiles 4.9.2 → 4.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Gemfile.lock +1 -1
- data/README.md +22 -0
- data/lib/danger/plugins/internal/helper.rb +3 -1
- data/lib/danger/plugins/roulette.rb +65 -0
- data/lib/danger/rules/simple_roulette/Dangerfile +10 -5
- data/lib/gitlab/dangerfiles/config.rb +10 -0
- data/lib/gitlab/dangerfiles/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: dc6047699d31bc320127f651d567ddf984b6189eeeb7646eb4f0d46b4185e9fd
|
4
|
+
data.tar.gz: 655da17704203a02f6f138b8493bb8cf2002c2121d1015a63da0677ebf23b48d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 02613c71246a09f46d15e0117e3f304ae626618c5736ff9b02f5e15bfbeccaa4921cefa694c97548dc5af2f4611866b58eb29f9eb5e0305d7412461097980a2c
|
7
|
+
data.tar.gz: 6703f6fe3502ad2336c33a4296a67d3e7d77d0dd9e46db97f510f0bd4c17a729f1bb20afcbb4ab6a0d5b24da477e4e50378e76cb943b9fc474fbed29320e619b
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -202,6 +202,28 @@ project. To use it in your project, perform the following steps:
|
|
202
202
|
dangerfiles.import_dangerfiles(only: %w[simple_roulette])
|
203
203
|
end
|
204
204
|
```
|
205
|
+
|
206
|
+
##### Auto-assignment
|
207
|
+
|
208
|
+
By default, the simple roulette only suggests reviewers in a comment. You can, optionally, configure it to automatically assign reviewers from the roulette to your merge requests.
|
209
|
+
|
210
|
+
Configure `auto_assign_for_roulette_roles` to specify which roles to assign (`:reviewer`, `:maintainer`, or both). If empty (default), no auto-assignment occurs.
|
211
|
+
|
212
|
+
Optionally, configure `auto_assign_for_roulette_labels` to only auto-assign for Merge Requests with specific labels. If empty (default), auto-assignment applies to all MRs.
|
213
|
+
|
214
|
+
###### Examples
|
215
|
+
|
216
|
+
``` ruby
|
217
|
+
# Auto-assign reviewers for all MRs
|
218
|
+
helper.config.auto_assign_for_roulette_roles = [:reviewer]
|
219
|
+
|
220
|
+
# Auto-assign both reviewer and maintainer for all MRs
|
221
|
+
helper.config.auto_assign_for_roulette_roles = [:reviewer, :maintainer]
|
222
|
+
|
223
|
+
# Auto-assign reviewers only for a specific MR label
|
224
|
+
helper.config.auto_assign_for_roulette_roles = [:reviewer]
|
225
|
+
helper.config.auto_assign_for_roulette_labels = ["maintenance::dependency"]
|
226
|
+
```
|
205
227
|
|
206
228
|
##### Available configurations
|
207
229
|
|
@@ -185,7 +185,9 @@ module Danger
|
|
185
185
|
# @return [{Symbol => Array<String>}] a hash of the type +{ category1: ["file1", "file2"], category2: ["file3", "file4"] }+
|
186
186
|
# using filename regex (+filename_regex+) and specific change regex (+changes_regex+) from the given +categories+ hash.
|
187
187
|
def changes_by_category(categories = [])
|
188
|
-
|
188
|
+
changed_and_deleted_files = all_changed_files + changes.deleted.files
|
189
|
+
|
190
|
+
changed_and_deleted_files.each_with_object(Hash.new { |h, k| h[k] = [] }) do |file, hash|
|
189
191
|
categories_for_file(file, categories).each { |category| hash[category] << file }
|
190
192
|
end
|
191
193
|
end
|
@@ -87,6 +87,35 @@ module Danger
|
|
87
87
|
Gitlab::Dangerfiles::Teammate.warnings
|
88
88
|
end
|
89
89
|
|
90
|
+
# Automatically assigns reviewers from roulette spins if configured to do so
|
91
|
+
#
|
92
|
+
# @param spins [Array<Spin>] The roulette spins to potentially assign from
|
93
|
+
def assign_reviewers_from_roulette(spins)
|
94
|
+
return if helper.mr_reviewers.any?
|
95
|
+
|
96
|
+
reviewers_to_assign = find_reviewers_to_assign(spins)
|
97
|
+
|
98
|
+
if reviewers_to_assign.any?
|
99
|
+
post_assignment_message(reviewers_to_assign)
|
100
|
+
else
|
101
|
+
warn("No reviewers available for assignment")
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
# Determines if auto-assignment should happen based on configuration
|
106
|
+
#
|
107
|
+
# @return [Boolean]
|
108
|
+
def auto_assign_reviewers?
|
109
|
+
return false if helper.config.auto_assign_for_roulette_roles.empty?
|
110
|
+
|
111
|
+
configured_labels = helper.config.auto_assign_for_roulette_labels
|
112
|
+
|
113
|
+
return true if configured_labels.empty?
|
114
|
+
|
115
|
+
mr_labels = helper.mr_labels
|
116
|
+
configured_labels.any? { |label| mr_labels.include?(label) }
|
117
|
+
end
|
118
|
+
|
90
119
|
private
|
91
120
|
|
92
121
|
def ux_fallback_reviewer
|
@@ -158,5 +187,41 @@ module Danger
|
|
158
187
|
def labels
|
159
188
|
@labels ||= helper.mr_labels
|
160
189
|
end
|
190
|
+
|
191
|
+
# Find reviewers to assign based on configured roles
|
192
|
+
#
|
193
|
+
# @param spins [Array<Spin>] The roulette spins
|
194
|
+
# @return [Array<String>] Array of usernames to assign
|
195
|
+
def find_reviewers_to_assign(spins)
|
196
|
+
roles_to_assign = helper.config.auto_assign_for_roulette_roles
|
197
|
+
reviewers_to_assign = []
|
198
|
+
|
199
|
+
spins.each do |spin|
|
200
|
+
if roles_to_assign.include?(:reviewer) && spin.reviewer&.username
|
201
|
+
reviewers_to_assign << spin.reviewer.username
|
202
|
+
end
|
203
|
+
|
204
|
+
if roles_to_assign.include?(:maintainer) && spin.maintainer&.username
|
205
|
+
reviewers_to_assign << spin.maintainer.username
|
206
|
+
end
|
207
|
+
|
208
|
+
if reviewers_to_assign.any?
|
209
|
+
break
|
210
|
+
end
|
211
|
+
end
|
212
|
+
|
213
|
+
reviewers_to_assign
|
214
|
+
end
|
215
|
+
|
216
|
+
# Posts the assignment message with the selected reviewers
|
217
|
+
#
|
218
|
+
# @param reviewers_to_assign [Array<String>] Array of usernames to assign
|
219
|
+
def post_assignment_message(reviewers_to_assign)
|
220
|
+
role_text = helper.config.auto_assign_for_roulette_roles.map(&:to_s).join(' and ')
|
221
|
+
message = "🎲 Assigned #{role_text}s based on reviewer roulette.\n/assign_reviewer #{reviewers_to_assign.map { |u| "@#{u}" }.join(' ')}"
|
222
|
+
markdown(message)
|
223
|
+
rescue StandardError => e
|
224
|
+
warn("Failed to assign reviewers: #{e.message}")
|
225
|
+
end
|
161
226
|
end
|
162
227
|
end
|
@@ -8,9 +8,6 @@ MESSAGE = <<MARKDOWN
|
|
8
8
|
Changes that require review have been detected! A merge request is normally
|
9
9
|
reviewed by both a reviewer and a maintainer in its primary category and by a
|
10
10
|
maintainer in all other categories.
|
11
|
-
MARKDOWN
|
12
|
-
|
13
|
-
TABLE_MARKDOWN = <<MARKDOWN
|
14
11
|
|
15
12
|
To spread load more evenly across eligible reviewers, Danger has picked a candidate for each
|
16
13
|
review slot. Feel free to
|
@@ -26,9 +23,11 @@ Please consider assigning a reviewer or maintainer who is a
|
|
26
23
|
[domain expert](https://about.gitlab.com/handbook/engineering/projects/##{PROJECT_NAME})
|
27
24
|
in the area of the merge request.
|
28
25
|
|
26
|
+
MARKDOWN
|
27
|
+
|
28
|
+
NO_AUTO_ASSIGN = <<MARKDOWN
|
29
29
|
Once you've decided who will review this merge request, mention them as you
|
30
30
|
normally would! Danger does not automatically notify them for you.
|
31
|
-
|
32
31
|
MARKDOWN
|
33
32
|
|
34
33
|
TABLE_HEADER_WITH_CATEGORIES = <<MARKDOWN
|
@@ -101,5 +100,11 @@ if changes.any?
|
|
101
100
|
|
102
101
|
markdown(format(WARNING_MESSAGE, warnings: warnings)) if warnings
|
103
102
|
|
104
|
-
markdown(
|
103
|
+
markdown(table_header + rows.join("\n")) unless rows.empty?
|
104
|
+
|
105
|
+
if roulette.auto_assign_reviewers?
|
106
|
+
roulette.assign_reviewers_from_roulette(random_roulette_spins)
|
107
|
+
else
|
108
|
+
markdown(NO_AUTO_ASSIGN)
|
109
|
+
end
|
105
110
|
end
|
@@ -55,6 +55,14 @@ module Gitlab
|
|
55
55
|
# @return [Array] indicating which required codeowners sections should be excluded from roulette. Default to `[]`.
|
56
56
|
attr_accessor :excluded_required_codeowners_sections_for_roulette
|
57
57
|
|
58
|
+
# @!attribute auto_assign_for_roulette_roles
|
59
|
+
# @return [Array<Symbol>] which roles to auto assign as reviewers, given roulette recommendations (:reviewer, :maintainer, or both). If empty, auto-assignment is disabled. Default to `[]`.
|
60
|
+
attr_accessor :auto_assign_for_roulette_roles
|
61
|
+
|
62
|
+
# @!attribute auto_assign_for_roulette_labels
|
63
|
+
# @return [Array<String>] MR labels that allow auto reviewer assignment. If empty, applies to all MRs, provided :auto_assign_for_roulette_roles is not empty. Default to `[]`.
|
64
|
+
attr_accessor :auto_assign_for_roulette_labels
|
65
|
+
|
58
66
|
DEFAULT_CHANGES_SIZE_THRESHOLDS = { high: 2_000, medium: 500 }.freeze
|
59
67
|
DEFAULT_COMMIT_MESSAGES_MAX_COMMITS_COUNT = 10
|
60
68
|
|
@@ -69,6 +77,8 @@ module Gitlab
|
|
69
77
|
@disabled_roulette_categories = []
|
70
78
|
@included_optional_codeowners_sections_for_roulette = []
|
71
79
|
@excluded_required_codeowners_sections_for_roulette = []
|
80
|
+
@auto_assign_for_roulette_roles = []
|
81
|
+
@auto_assign_for_roulette_labels = []
|
72
82
|
@duo_code_review = :optional
|
73
83
|
end
|
74
84
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gitlab-dangerfiles
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 4.
|
4
|
+
version: 4.10.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- GitLab
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2025-
|
11
|
+
date: 2025-07-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|