gitlab-dangerfiles 3.4.0 → 3.4.3
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 +4 -0
- data/README.md +7 -0
- data/lefthook.yml +11 -0
- data/lib/danger/plugins/roulette.rb +38 -2
- data/lib/gitlab/dangerfiles/changes.rb +1 -1
- data/lib/gitlab/dangerfiles/teammate.rb +14 -5
- data/lib/gitlab/dangerfiles/version.rb +1 -1
- data/lib/gitlab/dangerfiles.rb +24 -25
- metadata +3 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: '098225565fa51922d5b158fa2da0a4e3aa7420c3fca45e3acee1c3b3cfaa1ba0'
|
|
4
|
+
data.tar.gz: ca80ccfdc03823eff324d59faff1eac19ed1e93798ff0833feef5d7b414c5e45
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: cae6d044924941d20f295da7b5b01aa77ba848a5a87c3894e5c9d8e0894499bdfd03425be5412960daa3724eba5dad11f3f3be02ee8dff80e83ca3b503a86f5f
|
|
7
|
+
data.tar.gz: 4903888e704177bb13b9ba3d5a207201ae703bebe047fc4f9f27483f36ba4f0aa5af2c5e5a5d72478c67c51a06319046bb1ba6f6bad52ba14cb18642f178972e
|
data/Gemfile
CHANGED
data/README.md
CHANGED
|
@@ -215,12 +215,19 @@ Latest documentation can be found at <https://www.rubydoc.info/gems/gitlab-dange
|
|
|
215
215
|
|
|
216
216
|
## Development
|
|
217
217
|
|
|
218
|
+
### Initial setup
|
|
219
|
+
|
|
218
220
|
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
|
219
221
|
|
|
220
222
|
To install this gem onto your local machine, run `bundle exec rake install`.
|
|
221
223
|
|
|
222
224
|
To release a new version, update the version number in `version.rb`, and get the MR merged by a maintainer. This will be then be packaged into a gem and pushed to [rubygems.org](https://rubygems.org) by the CI/CD.
|
|
223
225
|
|
|
226
|
+
### Activate lefthook locally
|
|
227
|
+
|
|
228
|
+
```shell
|
|
229
|
+
lefthook install
|
|
230
|
+
```
|
|
224
231
|
## Contributing
|
|
225
232
|
|
|
226
233
|
Bug reports and merge requests are welcome at https://gitlab.com/gitlab-org/gitlab-dangerfiles. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [code of conduct](https://gitlab.com/gitlab-org/gitlab-dangerfiles/blob/master/CODE_OF_CONDUCT.md).
|
data/lefthook.yml
ADDED
|
@@ -162,12 +162,44 @@ module Danger
|
|
|
162
162
|
end
|
|
163
163
|
end
|
|
164
164
|
|
|
165
|
+
# Spin a reviewer for a particular approval rule
|
|
166
|
+
#
|
|
167
|
+
# @param [Hash] rule of approval
|
|
168
|
+
#
|
|
169
|
+
# @return [Gitlab::Dangerfiles::Teammate]
|
|
165
170
|
def spin_for_approver(rule)
|
|
166
|
-
approvers
|
|
171
|
+
# This will filter out approvers who are not even reviewers who
|
|
172
|
+
# don't show up in roulette data we're relying on.
|
|
173
|
+
# That's why `filter_map` is used.
|
|
174
|
+
approvers = rule["eligible_approvers"].filter_map do |approver|
|
|
167
175
|
find_member(approver["username"])
|
|
168
176
|
end
|
|
169
177
|
|
|
170
|
-
spin_for_person(approvers)
|
|
178
|
+
spin_for_person(approvers) || spin_for_approver_fallback(rule)
|
|
179
|
+
end
|
|
180
|
+
|
|
181
|
+
# It can be possible that we don't have a valid reviewer for approval.
|
|
182
|
+
# In this case, we sample again without considering:
|
|
183
|
+
#
|
|
184
|
+
# * If they're available
|
|
185
|
+
# * If they're an actual reviewer from roulette data
|
|
186
|
+
#
|
|
187
|
+
# We do this because we strictly require an approval from the approvers.
|
|
188
|
+
#
|
|
189
|
+
# @param [Hash] rule of approval
|
|
190
|
+
#
|
|
191
|
+
# @return [Gitlab::Dangerfiles::Teammate]
|
|
192
|
+
def spin_for_approver_fallback(rule)
|
|
193
|
+
fallback_approvers = rule["eligible_approvers"].map do |approver|
|
|
194
|
+
find_member(approver["username"]) ||
|
|
195
|
+
Gitlab::Dangerfiles::Teammate.new(approver)
|
|
196
|
+
end
|
|
197
|
+
|
|
198
|
+
# Intentionally not using `spin_for_person` to skip `valid_person?`.
|
|
199
|
+
# This should strictly return someone so we don't filter anything,
|
|
200
|
+
# and it's a fallback mechanism which should not happen often that
|
|
201
|
+
# deserves a complex algorithm.
|
|
202
|
+
fallback_approvers.sample(random: random)
|
|
171
203
|
end
|
|
172
204
|
|
|
173
205
|
def spin_for_category(project, category, timezone_experiment: false)
|
|
@@ -194,6 +226,10 @@ module Danger
|
|
|
194
226
|
def http_get_json(url)
|
|
195
227
|
rsp = Net::HTTP.get_response(URI.parse(url))
|
|
196
228
|
|
|
229
|
+
if rsp.is_a?(Net::HTTPRedirection)
|
|
230
|
+
raise "Redirection detected: #{rsp.header["location"]}"
|
|
231
|
+
end
|
|
232
|
+
|
|
197
233
|
unless rsp.is_a?(Net::HTTPOK)
|
|
198
234
|
raise HTTPError, "Failed to read #{url}: #{rsp.code} #{rsp.message}"
|
|
199
235
|
end
|
|
@@ -10,7 +10,8 @@ module Gitlab
|
|
|
10
10
|
@options = options
|
|
11
11
|
@username = options["username"]
|
|
12
12
|
@name = options["name"]
|
|
13
|
-
@markdown_name = options["markdown_name"]
|
|
13
|
+
@markdown_name = options["markdown_name"] ||
|
|
14
|
+
default_markdown_name(*options.values_at("username", "name"))
|
|
14
15
|
@role = options["role"]
|
|
15
16
|
@projects = process_projects(options["projects"])
|
|
16
17
|
@available = options["available"]
|
|
@@ -66,7 +67,7 @@ module Gitlab
|
|
|
66
67
|
end
|
|
67
68
|
|
|
68
69
|
def markdown_name(author: nil)
|
|
69
|
-
"#{@markdown_name}
|
|
70
|
+
"#{@markdown_name}#{utc_offset_text(author)}"
|
|
70
71
|
end
|
|
71
72
|
|
|
72
73
|
def local_hour
|
|
@@ -83,6 +84,10 @@ module Gitlab
|
|
|
83
84
|
|
|
84
85
|
private
|
|
85
86
|
|
|
87
|
+
def default_markdown_name(username, name)
|
|
88
|
+
"[#{name}](https://gitlab.com/#{username}) (`@#{username}`)"
|
|
89
|
+
end
|
|
90
|
+
|
|
86
91
|
def process_projects(projects)
|
|
87
92
|
return nil unless projects
|
|
88
93
|
|
|
@@ -92,15 +97,19 @@ module Gitlab
|
|
|
92
97
|
end
|
|
93
98
|
|
|
94
99
|
def utc_offset_text(author = nil)
|
|
100
|
+
return unless tz_offset_hours
|
|
101
|
+
|
|
95
102
|
offset_text = if floored_offset_hours >= 0
|
|
96
103
|
"UTC+#{floored_offset_hours}"
|
|
97
104
|
else
|
|
98
105
|
"UTC#{floored_offset_hours}"
|
|
99
106
|
end
|
|
100
107
|
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
108
|
+
if author
|
|
109
|
+
" (#{offset_text}, #{offset_diff_compared_to_author(author)})"
|
|
110
|
+
else
|
|
111
|
+
" (#{offset_text})"
|
|
112
|
+
end
|
|
104
113
|
end
|
|
105
114
|
|
|
106
115
|
def offset_diff_compared_to_author(author)
|
data/lib/gitlab/dangerfiles.rb
CHANGED
|
@@ -58,7 +58,7 @@ module Gitlab
|
|
|
58
58
|
danger_plugin.import_plugin(File.expand_path("../danger/plugins/*.rb", __dir__))
|
|
59
59
|
|
|
60
60
|
Dir.glob(File.expand_path("danger/plugins/*.rb", config.project_root)).sort.each do |path|
|
|
61
|
-
puts "Importing plugin at #{path}" if
|
|
61
|
+
puts "Importing plugin at #{path}" if helper_plugin.ci?
|
|
62
62
|
danger_plugin.import_plugin(path)
|
|
63
63
|
end
|
|
64
64
|
end
|
|
@@ -87,10 +87,9 @@ module Gitlab
|
|
|
87
87
|
return if helper_plugin.release_automation?
|
|
88
88
|
|
|
89
89
|
rules = filtered_rules(only, except)
|
|
90
|
-
puts "Running rules: #{rules}\n" if dangerfile.verbose
|
|
91
90
|
|
|
92
91
|
rules.each do |rule, path|
|
|
93
|
-
puts "Importing rule #{rule} at #{path}" if
|
|
92
|
+
puts "Importing rule #{rule} at #{path}" if helper_plugin.ci?
|
|
94
93
|
danger_plugin.import_dangerfile(path: path)
|
|
95
94
|
end
|
|
96
95
|
end
|
|
@@ -116,45 +115,45 @@ module Gitlab
|
|
|
116
115
|
|
|
117
116
|
attr_reader :dangerfile
|
|
118
117
|
|
|
118
|
+
def filtered_rules(only_rules, except_rules)
|
|
119
|
+
only_rules = Array(only_rules).compact.map(&:to_s)
|
|
120
|
+
|
|
121
|
+
rules = allowed_rules_based_on_context.reject { |rule, _v| except_rules.include?(rule) }
|
|
122
|
+
|
|
123
|
+
if only_rules.any?
|
|
124
|
+
rules.select! { |rule, _v| only_rules.include?(rule) }
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
rules.sort.to_h
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
def allowed_rules_based_on_context
|
|
131
|
+
helper_plugin.ci? ? all_rules : local_rules
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
def all_rules
|
|
135
|
+
all_gem_rules.merge(custom_rules)
|
|
136
|
+
end
|
|
137
|
+
|
|
119
138
|
def all_gem_rules
|
|
120
|
-
@all_gem_rules ||= Dir.glob(File.join(RULES_DIR, "*")).
|
|
139
|
+
@all_gem_rules ||= Dir.glob(File.join(RULES_DIR, "*")).each_with_object({}) do |path, memo|
|
|
121
140
|
rule_name = File.basename(path)
|
|
122
141
|
memo[rule_name] = path if File.directory?(path) && File.exist?(File.join(path, "Dangerfile"))
|
|
123
142
|
end
|
|
124
143
|
end
|
|
125
144
|
|
|
126
145
|
def custom_rules
|
|
127
|
-
@custom_rules ||= Dir.glob(File.expand_path("danger/*", config.project_root)).
|
|
146
|
+
@custom_rules ||= Dir.glob(File.expand_path("danger/*", config.project_root)).each_with_object({}) do |path, memo|
|
|
128
147
|
rule_name = File.basename(path)
|
|
129
148
|
memo[rule_name] = path if File.directory?(path) && File.exist?(File.join(path, "Dangerfile"))
|
|
130
149
|
end
|
|
131
150
|
end
|
|
132
151
|
|
|
133
|
-
def all_rules
|
|
134
|
-
all_gem_rules.merge(custom_rules)
|
|
135
|
-
end
|
|
136
|
-
|
|
137
152
|
def local_rules
|
|
138
153
|
ci_only_rules = CI_ONLY_RULES | config.ci_only_rules
|
|
139
154
|
all_rules.reject { |rule, _v| ci_only_rules.include?(rule) }
|
|
140
155
|
end
|
|
141
156
|
|
|
142
|
-
def allowed_rules_based_on_context
|
|
143
|
-
helper_plugin.ci? ? all_rules : local_rules
|
|
144
|
-
end
|
|
145
|
-
|
|
146
|
-
def filtered_rules(only_rules, except_rules)
|
|
147
|
-
only_rules = Array(only_rules).compact.map(&:to_s)
|
|
148
|
-
|
|
149
|
-
rules = allowed_rules_based_on_context.reject { |rule, _v| except_rules.include?(rule) }
|
|
150
|
-
|
|
151
|
-
if only_rules.any?
|
|
152
|
-
rules.select! { |rule, _v| only_rules.include?(rule) }
|
|
153
|
-
end
|
|
154
|
-
|
|
155
|
-
rules
|
|
156
|
-
end
|
|
157
|
-
|
|
158
157
|
def danger_plugin
|
|
159
158
|
@danger_plugin ||= dangerfile.plugins[Danger::DangerfileDangerPlugin]
|
|
160
159
|
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: 3.4.
|
|
4
|
+
version: 3.4.3
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- GitLab
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: exe
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2022-
|
|
11
|
+
date: 2022-07-07 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: rake
|
|
@@ -163,6 +163,7 @@ files:
|
|
|
163
163
|
- fixtures/emojis/aliases.json
|
|
164
164
|
- fixtures/emojis/digests.json
|
|
165
165
|
- gitlab-dangerfiles.gemspec
|
|
166
|
+
- lefthook.yml
|
|
166
167
|
- lib/danger/plugins/changelog.rb
|
|
167
168
|
- lib/danger/plugins/internal/helper.rb
|
|
168
169
|
- lib/danger/plugins/roulette.rb
|