gitlab-dangerfiles 0.8.0 → 1.1.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f2fca983a5c97d75dbd16b7689b26ed93a12ae5ea1781ce7bac4787f7ed2a6d3
4
- data.tar.gz: f24ee73b3ee86de8ee2f447db04ca4cf46dda59d3711d85fd27fad002a2644f3
3
+ metadata.gz: f5e1069be5416d6980879af3330451834b57881c46101119bfc5917e2057edd7
4
+ data.tar.gz: e911c514f8d32d65e4aecef6ad111c80c808dd273b12775d57438532ba8a05b3
5
5
  SHA512:
6
- metadata.gz: 5a04e545969282bbc1561201db8ba45e1677dedc2ccd5ac35fcd8b069366906d66f79ff8d0b2ecd73e0bca064d5b158cfd40790df28e33df160c8f97f125b1b4
7
- data.tar.gz: bc7f08b1508e130491cc860b96947cf6ccac0e03a0cb577118399f391f7997c5e69e82db4658fd845b039b92cea8c6ab0ada5337f044cc9bea79a2bb66d4e58b
6
+ metadata.gz: b3814724620240a6485ffce4191fb8a2461c267dda5dad2466b6dc5173fbe848b66cae92aaea69ef82a49dd4726db3a7e77c106fdbd73ea58738eaf4613c4cba
7
+ data.tar.gz: 0fcabbe03f856d29951ae2f35e9f6f9784fa22af8d8d6bfa13a41452b4a1c35a454135751443882e6a2762325ef05dd6b8bd1b3dde58c5c7661db65ffef4c5d7
@@ -27,7 +27,7 @@ Gem::Specification.new do |spec|
27
27
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
28
28
  spec.require_paths = ["lib"]
29
29
 
30
- spec.add_dependency "danger"
30
+ spec.add_dependency "danger-gitlab"
31
31
 
32
32
  spec.add_development_dependency "rspec", "~> 3.0"
33
33
  spec.add_development_dependency "rspec-parameterized"
@@ -2,10 +2,10 @@
2
2
 
3
3
  require "net/http"
4
4
  require "json"
5
- require "danger"
6
- require_relative "../gitlab/dangerfiles/changes"
7
- require_relative "../gitlab/dangerfiles/teammate"
8
- require_relative "../gitlab/dangerfiles/title_linting"
5
+
6
+ require_relative "../../gitlab/dangerfiles/changes"
7
+ require_relative "../../gitlab/dangerfiles/teammate"
8
+ require_relative "../../gitlab/dangerfiles/title_linting"
9
9
 
10
10
  module Danger
11
11
  # Common helper functions for our danger scripts.
@@ -19,6 +19,7 @@ module Danger
19
19
  test: "~test ~Quality for `spec/features/*`",
20
20
  engineering_productivity: '~"Engineering Productivity" for CI, Danger',
21
21
  ci_template: '~"ci::templates"',
22
+ product_intelligence: '~"product intelligence"',
22
23
  }.freeze
23
24
 
24
25
  HTTPError = Class.new(StandardError)
@@ -51,8 +52,62 @@ module Danger
51
52
  JSON.parse(rsp.body)
52
53
  end
53
54
 
55
+ def added_files
56
+ @added_files ||= if changes_from_api
57
+ changes_from_api.select { |file| file["new_file"] }.map { |file| file["new_path"] }
58
+ else
59
+ git.added_files.to_a
60
+ end
61
+ end
62
+
63
+ def modified_files
64
+ @modified_files ||= if changes_from_api
65
+ changes_from_api.select { |file| !file["new_file"] && !file["deleted_file"] && !file["renamed_file"] }.map { |file| file["new_path"] }
66
+ else
67
+ git.modified_files.to_a
68
+ end
69
+ end
70
+
71
+ def renamed_files
72
+ @renamed_files ||= if changes_from_api
73
+ changes_from_api.select { |file| file["renamed_file"] }.each_with_object([]) do |file, memo|
74
+ memo << { before: file["old_path"], after: file["new_path"] }
75
+ end
76
+ else
77
+ git.renamed_files.to_a
78
+ end
79
+ end
80
+
81
+ def deleted_files
82
+ @deleted_files ||= if changes_from_api
83
+ changes_from_api.select { |file| file["deleted_file"] }.map { |file| file["new_path"] }
84
+ else
85
+ git.deleted_files.to_a
86
+ end
87
+ end
88
+
89
+ def diff_for_file(filename)
90
+ if changes_from_api
91
+ changes_hash = changes_from_api.find { |file| file["new_path"] == filename }
92
+ changes_hash["diff"] if changes_hash
93
+ else
94
+ git.diff_for_file(filename)&.patch
95
+ end
96
+ end
97
+
98
+ def changes_from_api
99
+ return nil unless ci?
100
+ return nil if defined?(@force_changes_from_git)
101
+
102
+ @changes_from_api ||= gitlab_helper.mr_changes.to_h["changes"]
103
+ rescue
104
+ # Fallback to the Git strategy in any case
105
+ @force_changes_from_git = true
106
+ nil
107
+ end
108
+
54
109
  # Returns a list of all files that have been added, modified or renamed.
55
- # `git.modified_files` might contain paths that already have been renamed,
110
+ # `modified_files` might contain paths that already have been renamed,
56
111
  # so we need to remove them from the list.
57
112
  #
58
113
  # Considering these changes:
@@ -70,10 +125,10 @@ module Danger
70
125
  # @return [Array<String>]
71
126
  def all_changed_files
72
127
  Set.new
73
- .merge(git.added_files.to_a)
74
- .merge(git.modified_files.to_a)
75
- .merge(git.renamed_files.map { |x| x[:after] })
76
- .subtract(git.renamed_files.map { |x| x[:before] })
128
+ .merge(added_files)
129
+ .merge(modified_files)
130
+ .merge(renamed_files.map { |x| x[:after] })
131
+ .subtract(renamed_files.map { |x| x[:before] })
77
132
  .to_a
78
133
  .sort
79
134
  end
@@ -87,10 +142,10 @@ module Danger
87
142
  # "+ # Test change",
88
143
  # "- # Old change" ]
89
144
  def changed_lines(changed_file)
90
- diff = git.diff_for_file(changed_file)
145
+ diff = diff_for_file(changed_file)
91
146
  return [] unless diff
92
147
 
93
- diff.patch.split("\n").select { |line| %r{^[+-]}.match?(line) }
148
+ diff.split("\n").select { |line| %r{^[+-]}.match?(line) }
94
149
  end
95
150
 
96
151
  def release_automation?
@@ -117,23 +172,23 @@ module Danger
117
172
  # @return [Gitlab::Dangerfiles::Changes]
118
173
  def changes(categories)
119
174
  Gitlab::Dangerfiles::Changes.new([]).tap do |changes|
120
- git.added_files.each do |file|
175
+ added_files.each do |file|
121
176
  categories_for_file(file, categories).each { |category| changes << Gitlab::Dangerfiles::Change.new(file, :added, category) }
122
177
  end
123
178
 
124
- git.modified_files.each do |file|
179
+ modified_files.each do |file|
125
180
  categories_for_file(file, categories).each { |category| changes << Gitlab::Dangerfiles::Change.new(file, :modified, category) }
126
181
  end
127
182
 
128
- git.deleted_files.each do |file|
183
+ deleted_files.each do |file|
129
184
  categories_for_file(file, categories).each { |category| changes << Gitlab::Dangerfiles::Change.new(file, :deleted, category) }
130
185
  end
131
186
 
132
- git.renamed_files.map { |x| x[:before] }.each do |file|
187
+ renamed_files.map { |x| x[:before] }.each do |file|
133
188
  categories_for_file(file, categories).each { |category| changes << Gitlab::Dangerfiles::Change.new(file, :renamed_before, category) }
134
189
  end
135
190
 
136
- git.renamed_files.map { |x| x[:after] }.each do |file|
191
+ renamed_files.map { |x| x[:after] }.each do |file|
137
192
  categories_for_file(file, categories).each { |category| changes << Gitlab::Dangerfiles::Change.new(file, :renamed_after, category) }
138
193
  end
139
194
  end
@@ -169,31 +224,43 @@ module Danger
169
224
  end
170
225
 
171
226
  def mr_iid
172
- return "" unless gitlab_helper
227
+ return "" unless ci?
173
228
 
174
229
  gitlab_helper.mr_json["iid"]
175
230
  end
176
231
 
232
+ def mr_author
233
+ return `whoami`.strip unless ci?
234
+
235
+ gitlab_helper.mr_author
236
+ end
237
+
177
238
  def mr_title
178
- return "" unless gitlab_helper
239
+ return "" unless ci?
179
240
 
180
241
  gitlab_helper.mr_json["title"]
181
242
  end
182
243
 
183
244
  def mr_web_url
184
- return "" unless gitlab_helper
245
+ return "" unless ci?
185
246
 
186
247
  gitlab_helper.mr_json["web_url"]
187
248
  end
188
249
 
189
250
  def mr_labels
190
- return [] unless gitlab_helper
251
+ return [] unless ci?
191
252
 
192
253
  gitlab_helper.mr_labels
193
254
  end
194
255
 
256
+ def mr_source_branch
257
+ return `git rev-parse --abbrev-ref HEAD`.strip unless ci?
258
+
259
+ gitlab_helper.mr_json["source_branch"]
260
+ end
261
+
195
262
  def mr_target_branch
196
- return "" unless gitlab_helper
263
+ return "" unless ci?
197
264
 
198
265
  gitlab_helper.mr_json["target_branch"]
199
266
  end
@@ -1,8 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "../gitlab/dangerfiles/teammate"
4
- require_relative "../gitlab/dangerfiles/weightage/maintainers"
5
- require_relative "../gitlab/dangerfiles/weightage/reviewers"
3
+ require_relative "../../gitlab/dangerfiles/teammate"
4
+ require_relative "../../gitlab/dangerfiles/weightage/maintainers"
5
+ require_relative "../../gitlab/dangerfiles/weightage/reviewers"
6
6
 
7
7
  module Danger
8
8
  # Common helper functions for our danger scripts. See Danger::Helper
@@ -18,14 +18,14 @@ module Danger
18
18
  Spin = Struct.new(:category, :reviewer, :maintainer, :optional_role, :timezone_experiment)
19
19
 
20
20
  def team_mr_author
21
- team.find { |person| person.username == mr_author_username }
21
+ team.find { |person| person.username == helper.mr_author }
22
22
  end
23
23
 
24
24
  # Assigns GitLab team members to be reviewer and maintainer
25
25
  # for each change category that a Merge Request contains.
26
26
  #
27
27
  # @return [Array<Spin>]
28
- def spin(project, categories, timezone_experiment: false)
28
+ def spin(project, categories = [nil], timezone_experiment: false)
29
29
  spins = categories.sort.map do |category|
30
30
  including_timezone = INCLUDE_TIMEZONE_FOR_CATEGORY.fetch(category, timezone_experiment)
31
31
 
@@ -59,6 +59,8 @@ module Danger
59
59
  # Fetch an already picked backend maintainer, or pick one otherwise
60
60
  spin.maintainer = backend_spin&.maintainer || spin_for_category(project, :backend, timezone_experiment: including_timezone).maintainer
61
61
  end
62
+ when :product_intelligence
63
+ spin.optional_role = :maintainer
62
64
  end
63
65
  end
64
66
 
@@ -119,21 +121,7 @@ module Danger
119
121
  # @param [Teammate] person
120
122
  # @return [Boolean]
121
123
  def mr_author?(person)
122
- person.username == mr_author_username
123
- end
124
-
125
- def mr_author_username
126
- helper.gitlab_helper&.mr_author || `whoami`
127
- end
128
-
129
- def mr_source_branch
130
- return `git rev-parse --abbrev-ref HEAD` unless helper.gitlab_helper&.mr_json
131
-
132
- helper.gitlab_helper.mr_json["source_branch"]
133
- end
134
-
135
- def mr_labels
136
- helper.gitlab_helper&.mr_labels || []
124
+ person.username == helper.mr_author
137
125
  end
138
126
 
139
127
  def new_random(seed)
@@ -142,7 +130,7 @@ module Danger
142
130
 
143
131
  def spin_role_for_category(team, role, project, category)
144
132
  team.select do |member|
145
- member.public_send("#{role}?", project, category, mr_labels) # rubocop:disable GitlabSecurity/PublicSend
133
+ member.public_send("#{role}?", project, category, helper.mr_labels) # rubocop:disable GitlabSecurity/PublicSend
146
134
  end
147
135
  end
148
136
 
@@ -153,7 +141,7 @@ module Danger
153
141
  spin_role_for_category(team, role, project, category)
154
142
  end
155
143
 
156
- random = new_random(mr_source_branch)
144
+ random = new_random(helper.mr_source_branch)
157
145
 
158
146
  weighted_reviewers = Gitlab::Dangerfiles::Weightage::Reviewers.new(reviewers, traintainers).execute
159
147
  weighted_maintainers = Gitlab::Dangerfiles::Weightage::Maintainers.new(maintainers).execute
@@ -3,7 +3,7 @@ require "gitlab/dangerfiles/version"
3
3
  module Gitlab
4
4
  module Dangerfiles
5
5
  def self.import_plugins(danger)
6
- danger.import_plugin(File.expand_path("../danger/*.rb", __dir__))
6
+ danger.import_plugin(File.expand_path("../danger/plugins/*.rb", __dir__))
7
7
  end
8
8
  end
9
9
  end
@@ -59,7 +59,7 @@ module Gitlab
59
59
  private
60
60
 
61
61
  def subject
62
- TitleLinting.remove_draft_flag(message_parts[0])
62
+ @subject ||= TitleLinting.remove_draft_flag(message_parts[0])
63
63
  end
64
64
 
65
65
  def subject_too_short?
@@ -75,6 +75,7 @@ module Gitlab
75
75
  end
76
76
 
77
77
  def subject_starts_with_lowercase?
78
+ return false if subject.empty?
78
79
  return false if ("A".."Z").cover?(subject[0])
79
80
 
80
81
  first_char = subject.sub(/\A(\[.+\]|\w+:)\s/, "")[0]
@@ -45,17 +45,63 @@ end
45
45
 
46
46
  RSpec.shared_context "with dangerfile" do
47
47
  let(:dangerfile) { DangerSpecHelper.testing_dangerfile }
48
- let(:added_files) { %w[added1] }
49
- let(:modified_files) { %w[modified1] }
50
- let(:deleted_files) { %w[deleted1] }
51
- let(:renamed_before_file) { "renamed_before" }
52
- let(:renamed_after_file) { "renamed_after" }
48
+ let(:added_files) { %w[added-from-git] }
49
+ let(:modified_files) { %w[modified-from-git] }
50
+ let(:deleted_files) { %w[deleted-from-git] }
51
+ let(:renamed_before_file) { "renamed_before-from-git" }
52
+ let(:renamed_after_file) { "renamed_after-from-git" }
53
53
  let(:renamed_files) { [{ before: renamed_before_file, after: renamed_after_file }] }
54
54
  let(:change_class) { Gitlab::Dangerfiles::Change }
55
55
  let(:changes_class) { Gitlab::Dangerfiles::Changes }
56
56
  let(:changes) { changes_class.new([]) }
57
57
  let(:mr_title) { "Fake Title" }
58
58
  let(:mr_labels) { [] }
59
+ let(:mr_changes_from_api) do
60
+ {
61
+ "changes" => [
62
+ {
63
+ "old_path" => "added-from-api",
64
+ "new_path" => "added-from-api",
65
+ "a_mode" => "100644",
66
+ "b_mode" => "100644",
67
+ "new_file" => true,
68
+ "renamed_file" => false,
69
+ "deleted_file" => false,
70
+ "diff" => "@@ -49,6 +49,14 @@\n- vendor/ruby/\n policy: pull\n \n+.danger-review-cache:\n",
71
+ },
72
+ {
73
+ "old_path" => "modified-from-api",
74
+ "new_path" => "modified-from-api",
75
+ "a_mode" => "100644",
76
+ "b_mode" => "100644",
77
+ "new_file" => false,
78
+ "renamed_file" => false,
79
+ "deleted_file" => false,
80
+ "diff" => "@@ -49,6 +49,14 @@\n- vendor/ruby/\n policy: pull\n \n+.danger-review-cache:\n",
81
+ },
82
+ {
83
+ "old_path" => "renamed_before-from-api",
84
+ "new_path" => "renamed_after-from-api",
85
+ "a_mode" => "100644",
86
+ "b_mode" => "100644",
87
+ "new_file" => false,
88
+ "renamed_file" => true,
89
+ "deleted_file" => false,
90
+ "diff" => "@@ -49,6 +49,14 @@\n- vendor/ruby/\n policy: pull\n \n+.danger-review-cache:\n",
91
+ },
92
+ {
93
+ "old_path" => "deleted-from-api",
94
+ "new_path" => "deleted-from-api",
95
+ "a_mode" => "100644",
96
+ "b_mode" => "100644",
97
+ "new_file" => false,
98
+ "renamed_file" => false,
99
+ "deleted_file" => true,
100
+ "diff" => "@@ -49,6 +49,14 @@\n- vendor/ruby/\n policy: pull\n \n+.danger-review-cache:\n",
101
+ },
102
+ ],
103
+ }
104
+ end
59
105
 
60
106
  let(:fake_git) { double("fake-git", added_files: added_files, modified_files: modified_files, deleted_files: deleted_files, renamed_files: renamed_files) }
61
107
  let(:fake_helper) { double("fake-helper", changes: changes, mr_iid: 1234, mr_title: mr_title, mr_labels: mr_labels) }
@@ -101,6 +101,13 @@ module Gitlab
101
101
  return true if capabilities(project).include?("#{kind} engineering_productivity")
102
102
 
103
103
  capabilities(project).include?("#{kind} backend")
104
+ when :product_intelligence
105
+ return false unless role[/Engineer, Product Intelligence/]
106
+
107
+ # any reviewer of project from Product Intelligence team can review MR
108
+ kind == :reviewer && capabilities(project).any?
109
+ when nil
110
+ capabilities(project).include?("#{kind}")
104
111
  else
105
112
  capabilities(project).include?("#{kind} #{category}")
106
113
  end
@@ -1,5 +1,5 @@
1
1
  module Gitlab
2
2
  module Dangerfiles
3
- VERSION = "0.8.0"
3
+ VERSION = "1.1.1"
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,17 +1,17 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gitlab-dangerfiles
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.0
4
+ version: 1.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Rémy Coutable
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-03-09 00:00:00.000000000 Z
11
+ date: 2021-04-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: danger
14
+ name: danger-gitlab
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - ">="
@@ -130,8 +130,8 @@ files:
130
130
  - fixtures/emojis/aliases.json
131
131
  - fixtures/emojis/digests.json
132
132
  - gitlab-dangerfiles.gemspec
133
- - lib/danger/helper.rb
134
- - lib/danger/roulette.rb
133
+ - lib/danger/plugins/helper.rb
134
+ - lib/danger/plugins/roulette.rb
135
135
  - lib/gitlab-dangerfiles.rb
136
136
  - lib/gitlab/Dangerfile
137
137
  - lib/gitlab/dangerfiles.rb