gitlab-dangerfiles 2.8.0 → 2.9.0

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: e0819c79b914e2025eecc3b05a52227a9012ceafeac3300032e1abb129706440
4
- data.tar.gz: 117a9710932852cf1845d8a8c3a27f331bbe65da0cccdf13f044858d915ea0c1
3
+ metadata.gz: 6889bf72a8244ec3bed24ab00bf35b61d269396c7c66c34d271c7d97209c4ea0
4
+ data.tar.gz: 9aee55c56805756034412d354aea50d7769bd109748109951ab2d86b812fa5ea
5
5
  SHA512:
6
- metadata.gz: c93c2983a4a0ebba6f3c94d0b81a1da7ba9fad9eb98573a5862e3d6501ff76614501907bb5d492942a47472160d2db5d1a96fcebdad280379cd3e03a43c5f113
7
- data.tar.gz: 734bbb0e6894d8de57f4d48546aca9f085447556662dbc64ba99f7cb39ea166b5a75f3d1099077e09d17f44d3687a9fe733451fa06310e02d906209b6003bcae
6
+ metadata.gz: 8c65bd8b5eb6d7cc11d6f591d14a4fac2212a4edb1cb13c7c4850f87c9b625dd41d4e8cb2b3b2fb2b076a6eba3932545c7d69f009ea3139d164d02baae8235d1
7
+ data.tar.gz: 3447445301d8fee2538ddb992dd4dcd7e10a4395d308e8b86c40e6a6b71b37152e46a30576d7a5e11c88d8be0803e75387313bb1a53d94a0b26f6722c3f3eaac
data/Dangerfile CHANGED
@@ -1,5 +1,3 @@
1
1
  require_relative "lib/gitlab-dangerfiles"
2
2
 
3
- Gitlab::Dangerfiles.for_project(self) do |dangerfiles|
4
- dangerfiles.import_defaults
5
- end
3
+ Gitlab::Dangerfiles.for_project(self, &:import_defaults)
data/Guardfile CHANGED
@@ -67,4 +67,6 @@ guard :rspec, cmd: "bundle exec rspec" do
67
67
  watch(%r{^spec/acceptance/steps/(.+)_steps\.rb$}) do |m|
68
68
  Dir[File.join("**/#{m[1]}.feature")][0] || "spec/acceptance"
69
69
  end
70
+
71
+ watch(%r{^lib/gitlab/dangerfiles/spec_helper.rb$}) { rspec.spec_dir }
70
72
  end
data/README.md CHANGED
@@ -72,6 +72,7 @@ end
72
72
  Danger plugins are located under `lib/danger/plugins`.
73
73
 
74
74
  - `Danger::Helper` available in `Dangerfile`s as `helper`
75
+ - `Danger::Changelog` available in `Dangerfile`s as `changelog`
75
76
  - `Danger::Roulette` available in `Dangerfile`s as `roulette`
76
77
 
77
78
  For the full documentation about the plugins, please see https://www.rubydoc.info/gems/gitlab-dangerfiles.
@@ -94,6 +95,10 @@ Alternatively, you can also get/set configuration on the engine directly via `Gi
94
95
 
95
96
  Danger rules are located under `lib/danger/rules`.
96
97
 
98
+ #### `changelog`
99
+
100
+ This rule ensures the merge request follows our [Changelog guidelines](https://docs.gitlab.com/ee/development/changelog.html#changelog-entries).
101
+
97
102
  #### `changes_size`
98
103
 
99
104
  ##### Available configurations
@@ -109,7 +114,7 @@ Danger rules are located under `lib/danger/rules`.
109
114
  - `max_commits_count`: The maximum number of allowed non-squashed/non-fixup commits for a given MR.
110
115
  A warning is triggered if the MR has more commits.
111
116
 
112
- ### Reviewer Roulette
117
+ #### `simple_roulette`
113
118
 
114
119
  The library includes a simplified default reviewer roulette that you can use in your
115
120
  project. To use it in your project, perform the following steps:
@@ -124,6 +129,10 @@ project. To use it in your project, perform the following steps:
124
129
  end
125
130
  ```
126
131
 
132
+ #### `type_label`
133
+
134
+ This rule ensures the merge request has a proper [type label](https://about.gitlab.com/handbook/engineering/metrics/#work-type-classification) set..
135
+
127
136
  ### CI configuration
128
137
 
129
138
  In order to run `danger` on GitLab CI, perform the following steps:
@@ -140,8 +149,8 @@ include:
140
149
  - '/ci/danger-review.yml'
141
150
  ```
142
151
 
143
- 3. Create a [Project access token](https://docs.gitlab.com/ee/user/project/settings/project_access_tokens.html)
144
- with scope `api` and role `Maintainer`.
152
+ 3. Create a [Project or group access token](https://docs.gitlab.com/ee/user/project/settings/project_access_tokens.html)
153
+ with scope `api` and role `Developer`.
145
154
  4. Add a [CI/CD variable](https://docs.gitlab.com/ee/ci/variables/#add-a-cicd-variable-to-a-project)
146
155
  `DANGER_GITLAB_API_TOKEN` (`Masked` but not `Protected`) and use Project access token as value.
147
156
 
@@ -0,0 +1,234 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Danger
4
+ # Contains method to check the presense and validity of changelogs.
5
+ class Changelog < Danger::Plugin
6
+ NO_CHANGELOG_LABELS = [
7
+ "type::tooling",
8
+ "tooling::pipelines",
9
+ "tooling::workflow",
10
+ "ci-build",
11
+ "meta",
12
+ ].freeze
13
+ NO_CHANGELOG_CATEGORIES = %i[docs none].freeze
14
+ CHANGELOG_TRAILER_REGEX = /^(?<name>Changelog):\s*(?<category>.+)$/i.freeze
15
+ CHANGELOG_EE_TRAILER_REGEX = /^EE: true$/.freeze
16
+ CHANGELOG_MODIFIED_URL_TEXT = "**CHANGELOG.md was edited.** Please remove the additions and follow the [changelog guidelines](https://docs.gitlab.com/ee/development/changelog.html).\n\n"
17
+ CHANGELOG_MISSING_URL_TEXT = "**[CHANGELOG missing](https://docs.gitlab.com/ee/development/changelog.html)**:\n\n"
18
+
19
+ OPTIONAL_CHANGELOG_MESSAGE = {
20
+ local: "If this merge request [doesn't need a CHANGELOG entry](https://docs.gitlab.com/ee/development/changelog.html#what-warrants-a-changelog-entry), feel free to ignore this message.",
21
+ ci: <<~MSG,
22
+ If you want to create a changelog entry for GitLab FOSS, add the `Changelog` trailer to the commit message you want to add to the changelog.
23
+
24
+ If you want to create a changelog entry for GitLab EE, also [add the `EE: true` trailer](https://docs.gitlab.com/ee/development/changelog.html#gitlab-enterprise-changes) to your commit message.
25
+
26
+ If this merge request [doesn't need a CHANGELOG entry](https://docs.gitlab.com/ee/development/changelog.html#what-warrants-a-changelog-entry), feel free to ignore this message.
27
+ MSG
28
+ }.freeze
29
+ SEE_DOC = "See the [changelog documentation](https://docs.gitlab.com/ee/development/changelog.html)."
30
+
31
+ REQUIRED_CHANGELOG_REASONS = {
32
+ db_changes: "introduces a database migration",
33
+ feature_flag_removed: "removes a feature flag",
34
+ }.freeze
35
+ REQUIRED_CHANGELOG_MESSAGE = {
36
+ local: "This merge request requires a changelog entry because it [%<reason>s](https://docs.gitlab.com/ee/development/changelog.html#what-warrants-a-changelog-entry).",
37
+ ci: <<~MSG,
38
+ To create a changelog entry, add the `Changelog` trailer to one of your Git commit messages.
39
+
40
+ This merge request requires a changelog entry because it [%<reason>s](https://docs.gitlab.com/ee/development/changelog.html#what-warrants-a-changelog-entry).
41
+ MSG
42
+ }.freeze
43
+
44
+ def self.categories
45
+ @categories ||= YAML
46
+ .load_file("#{ENV["CI_PROJECT_DIR"]}/.gitlab/changelog_config.yml")
47
+ .fetch("categories")
48
+ .keys
49
+ .freeze rescue []
50
+ end
51
+
52
+ class ChangelogCheckResult
53
+ attr_reader :errors, :warnings, :markdowns, :messages
54
+
55
+ def initialize(errors: [], warnings: [], markdowns: [], messages: [])
56
+ @errors = errors
57
+ @warnings = warnings
58
+ @markdowns = markdowns
59
+ @messages = messages
60
+ end
61
+
62
+ private_class_method :new
63
+
64
+ def self.empty
65
+ new
66
+ end
67
+
68
+ def self.error(error)
69
+ new(errors: [error])
70
+ end
71
+
72
+ def self.warning(warning)
73
+ new(warnings: [warning])
74
+ end
75
+
76
+ def error(error)
77
+ errors << error
78
+ end
79
+
80
+ def warning(warning)
81
+ warnings << warning
82
+ end
83
+
84
+ def markdown(markdown)
85
+ markdowns << markdown
86
+ end
87
+
88
+ def message(message)
89
+ messages << message
90
+ end
91
+ end
92
+
93
+ # rubocop:disable Style/SignalException
94
+ def check!
95
+ if git.modified_files.include?("CHANGELOG.md")
96
+ fail modified_text
97
+ end
98
+
99
+ if exist?
100
+ add_danger_messages(check_changelog_path)
101
+ elsif required?
102
+ required_texts.each { |_, text| fail(text) } # rubocop:disable Lint/UnreachableLoop
103
+ elsif optional?
104
+ message optional_text
105
+ end
106
+
107
+ check_changelog_commit_categories
108
+ end
109
+
110
+ # rubocop:enable Style/SignalException
111
+
112
+ # rubocop:disable Style/SignalException
113
+ def add_danger_messages(check_result)
114
+ check_result.errors.each { |error| fail(error) } # rubocop:disable Lint/UnreachableLoop
115
+ check_result.warnings.each { |warning| warn(warning) }
116
+ check_result.markdowns.each { |markdown_hash| markdown(**markdown_hash) }
117
+ check_result.messages.each { |text| message(text) }
118
+ end
119
+
120
+ # rubocop:enable Style/SignalException
121
+
122
+ def check_changelog_commit_categories
123
+ changelog_commits.each do |commit|
124
+ add_danger_messages(check_changelog_trailer(commit))
125
+ end
126
+ end
127
+
128
+ def check_changelog_trailer(commit)
129
+ trailer = commit.message.match(CHANGELOG_TRAILER_REGEX)
130
+ name = trailer[:name]
131
+ category = trailer[:category]
132
+
133
+ unless name == "Changelog"
134
+ return ChangelogCheckResult.error("The changelog trailer for commit #{commit.sha} must be `Changelog` (starting with a capital C), not `#{name}`")
135
+ end
136
+
137
+ return ChangelogCheckResult.empty if self.class.categories.include?(category)
138
+
139
+ ChangelogCheckResult.error("Commit #{commit.sha} uses an invalid changelog category: #{category}")
140
+ end
141
+
142
+ def check_changelog_path
143
+ check_result = ChangelogCheckResult.empty
144
+ return check_result unless exist?
145
+
146
+ ee_changes = helper.changed_files(%r{\Aee/})
147
+
148
+ if ee_changes.any? && !ee_changelog? && !required?
149
+ check_result.warning("This MR changes code in `ee/`, but its Changelog commit is missing the [`EE: true` trailer](https://docs.gitlab.com/ee/development/changelog.html#gitlab-enterprise-changes). Consider adding it to your Changelog commits.")
150
+ end
151
+
152
+ if ee_changes.empty? && ee_changelog?
153
+ check_result.warning("This MR has a Changelog commit for EE, but no code changes in `ee/`. Consider removing the `EE: true` trailer from your commits.")
154
+ end
155
+
156
+ if ee_changes.any? && ee_changelog? && required_reasons.include?(:db_changes)
157
+ check_result.warning("This MR has a Changelog commit with the `EE: true` trailer, but there are database changes which [requires](https://docs.gitlab.com/ee/development/changelog.html#what-warrants-a-changelog-entry) the Changelog commit to not have the `EE: true` trailer. Consider removing the `EE: true` trailer from your commits.")
158
+ end
159
+
160
+ check_result
161
+ end
162
+
163
+ def required_reasons
164
+ [].tap do |reasons|
165
+ reasons << :db_changes if helper.changes.added.has_category?(:migration)
166
+ reasons << :feature_flag_removed if helper.changes.deleted.has_category?(:feature_flag)
167
+ end
168
+ end
169
+
170
+ def required?
171
+ required_reasons.any?
172
+ end
173
+
174
+ def optional?
175
+ categories_need_changelog? && mr_without_no_changelog_label?
176
+ end
177
+
178
+ def exist?
179
+ valid_changelog_commits.any?
180
+ end
181
+
182
+ def changelog_commits
183
+ git.commits.select do |commit|
184
+ commit.message.match?(CHANGELOG_TRAILER_REGEX)
185
+ end
186
+ end
187
+
188
+ def valid_changelog_commits
189
+ changelog_commits.select do |commit|
190
+ trailer = commit.message.match(CHANGELOG_TRAILER_REGEX)
191
+
192
+ self.class.categories.include?(trailer[:category])
193
+ end
194
+ end
195
+
196
+ def ee_changelog?
197
+ changelog_commits.any? do |commit|
198
+ commit.message.match?(CHANGELOG_EE_TRAILER_REGEX)
199
+ end
200
+ end
201
+
202
+ def modified_text
203
+ CHANGELOG_MODIFIED_URL_TEXT +
204
+ (helper.ci? ? format(OPTIONAL_CHANGELOG_MESSAGE[:ci]) : OPTIONAL_CHANGELOG_MESSAGE[:local])
205
+ end
206
+
207
+ def required_texts
208
+ required_reasons.each_with_object({}) do |required_reason, memo|
209
+ memo[required_reason] =
210
+ CHANGELOG_MISSING_URL_TEXT +
211
+ (helper.ci? ? format(REQUIRED_CHANGELOG_MESSAGE[:ci], reason: REQUIRED_CHANGELOG_REASONS.fetch(required_reason)) : REQUIRED_CHANGELOG_MESSAGE[:local])
212
+ end
213
+ end
214
+
215
+ def optional_text
216
+ CHANGELOG_MISSING_URL_TEXT +
217
+ (helper.ci? ? format(OPTIONAL_CHANGELOG_MESSAGE[:ci]) : OPTIONAL_CHANGELOG_MESSAGE[:local])
218
+ end
219
+
220
+ private
221
+
222
+ def read_file(path)
223
+ File.read(path)
224
+ end
225
+
226
+ def categories_need_changelog?
227
+ (helper.changes.categories - NO_CHANGELOG_CATEGORIES).any?
228
+ end
229
+
230
+ def mr_without_no_changelog_label?
231
+ (helper.mr_labels & NO_CHANGELOG_LABELS).empty?
232
+ end
233
+ end
234
+ end
@@ -120,13 +120,7 @@ module Danger
120
120
  # +modified_files+ might contain paths that already have been renamed,
121
121
  # so we need to remove them from the list.
122
122
  def all_changed_files
123
- Set.new
124
- .merge(added_files)
125
- .merge(modified_files)
126
- .merge(renamed_files.map { |x| x[:after] })
127
- .subtract(renamed_files.map { |x| x[:before] })
128
- .to_a
129
- .sort
123
+ changes.files - changes.renamed_before.files
130
124
  end
131
125
 
132
126
  # @param filename [String] A file name for which we want the diff.
@@ -242,6 +236,20 @@ module Danger
242
236
  CATEGORY_LABELS.fetch(category, "~#{category}")
243
237
  end
244
238
 
239
+ # @return [String] +""+ when not in the CI context, and the MR Source Project ID as a string otherwise.
240
+ def mr_source_project_id
241
+ return "" unless ci?
242
+
243
+ gitlab_helper.mr_json["source_project_id"].to_s
244
+ end
245
+
246
+ # @return [String] +""+ when not in the CI context, and the MR Target Project ID as a string otherwise.
247
+ def mr_target_project_id
248
+ return "" unless ci?
249
+
250
+ gitlab_helper.mr_json["target_project_id"].to_s
251
+ end
252
+
245
253
  # @return [String] +""+ when not in the CI context, and the MR IID as a string otherwise.
246
254
  def mr_iid
247
255
  return "" unless ci?
@@ -274,7 +282,7 @@ module Danger
274
282
  def mr_labels
275
283
  return [] unless ci?
276
284
 
277
- gitlab_helper.mr_labels
285
+ (gitlab_helper.mr_labels + labels_to_add.to_a).uniq
278
286
  end
279
287
 
280
288
  # @return [String] +`git rev-parse --abbrev-ref HEAD`+ when not in the CI context, and the MR source branch otherwise.
@@ -330,11 +338,13 @@ module Danger
330
338
  /\A\d+-\d+-stable-ee/i.match?(mr_target_branch)
331
339
  end
332
340
 
333
- # Whether a MR has any database-scoped labels (i.e. +"database::*"+) set or not.
341
+ # Whether a MR has a scoped label with the given scope set or not.
342
+ #
343
+ # @param scope [String] The scope for which to look for labels, e.g. +type+ would look for any +type::*+ label.
334
344
  #
335
345
  # @return [Boolean]
336
- def has_database_scoped_labels?
337
- mr_labels.any? { |label| label.start_with?("database::") }
346
+ def has_scoped_label_with_scope?(scope)
347
+ mr_labels.any? { |label| label.start_with?("#{scope}::") }
338
348
  end
339
349
 
340
350
  # @return [Boolean] whether a MR has any CI-related changes (i.e. +".gitlab-ci.yml"+ or +".gitlab/ci/*"+) or not.
@@ -393,6 +403,17 @@ module Danger
393
403
  mr_labels.find { |label| label.start_with?("group::") }
394
404
  end
395
405
 
406
+ # Accessor for storing labels to add so that other rules can check if labels will be added after Danger
407
+ # has evaluated all the rules.
408
+ # For instance, a rule might require a specific label to be set, but another rule could add this label
409
+ # itself. Without this method, the first rule wouldn't know that the label would be applied and would ask
410
+ # for it anyway.
411
+ #
412
+ # @return [Set<String>] the list of labels that Danger will add
413
+ def labels_to_add
414
+ @labels_to_add ||= Set.new
415
+ end
416
+
396
417
  private
397
418
 
398
419
  # @return [Danger::RequestSources::GitLab, nil] the +gitlab+ helper, or +nil+ when it's not available.
@@ -0,0 +1,3 @@
1
+ # frozen_string_literal: true
2
+
3
+ changelog.check!
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ if helper.has_scoped_label_with_scope?("type")
4
+ warn "Please add a [merge request type](https://about.gitlab.com/handbook/engineering/metrics/#work-type-classification) to this merge request."
5
+ end
@@ -0,0 +1,21 @@
1
+ # This rule is the last one since we want to add all the labels to add at once,
2
+ # so we let other rules adding to `helper.labels_to_add` before actually adding them via the API here.
3
+
4
+ # Don't try to post anything locally.
5
+ return unless helper.ci?
6
+
7
+ def post_labels(labels)
8
+ gitlab.api.update_merge_request(helper.mr_target_project_id,
9
+ helper.mr_iid,
10
+ add_labels: labels.join(","))
11
+ rescue Gitlab::Error::Forbidden
12
+ warn("This Merge Request needs to be labelled with #{helper.labels_list(labels)}. Please request a reviewer or maintainer to add them.")
13
+ end
14
+
15
+ post_labels(helper.labels_to_add) if helper.labels_to_add.any?
16
+
17
+ anything_to_post = status_report.values.any?(&:any?)
18
+
19
+ if anything_to_post
20
+ markdown("**If needed, you can retry the [`danger-review` job](#{ENV["CI_JOB_URL"]}) that generated this comment.**")
21
+ end
@@ -53,60 +53,16 @@ RSpec.shared_context "with dangerfile" do
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
+ let(:ee_change) { nil }
56
57
  let(:changes) { changes_class.new([]) }
57
58
  let(:mr_title) { "Fake Title" }
58
59
  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
105
60
 
106
61
  let(:fake_git) { double("fake-git", added_files: added_files, modified_files: modified_files, deleted_files: deleted_files, renamed_files: renamed_files) }
107
62
  let(:fake_helper) { double("fake-helper", changes: changes, added_files: added_files, modified_files: modified_files, deleted_files: deleted_files, renamed_files: renamed_files, mr_iid: 1234, mr_title: mr_title, mr_labels: mr_labels) }
108
63
 
109
64
  before do
110
65
  allow(dangerfile).to receive(:git).and_return(fake_git)
66
+ allow(dangerfile.helper).to receive(:changes).and_return(changes)
111
67
  end
112
68
  end
@@ -1,5 +1,5 @@
1
1
  module Gitlab
2
2
  module Dangerfiles
3
- VERSION = "2.8.0"
3
+ VERSION = "2.9.0"
4
4
  end
5
5
  end
@@ -9,11 +9,14 @@ module Gitlab
9
9
  end
10
10
  end
11
11
  LOCAL_RULES = %w[
12
+ changelog
12
13
  changes_size
13
14
  commit_messages
14
15
  ].freeze
15
16
  CI_ONLY_RULES = %w[
16
17
  simple_roulette
18
+ type_label
19
+ z_add_labels
17
20
  ].freeze
18
21
 
19
22
  # Utility method to construct a [Gitlab::Dangerfiles::Engine] instance,
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: 2.8.0
4
+ version: 2.9.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - GitLab
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-01-19 00:00:00.000000000 Z
11
+ date: 2022-02-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: danger-gitlab
@@ -149,11 +149,15 @@ files:
149
149
  - fixtures/emojis/aliases.json
150
150
  - fixtures/emojis/digests.json
151
151
  - gitlab-dangerfiles.gemspec
152
+ - lib/danger/plugins/changelog.rb
152
153
  - lib/danger/plugins/internal/helper.rb
153
154
  - lib/danger/plugins/roulette.rb
155
+ - lib/danger/rules/changelog/Dangerfile
154
156
  - lib/danger/rules/changes_size/Dangerfile
155
157
  - lib/danger/rules/commit_messages/Dangerfile
156
158
  - lib/danger/rules/simple_roulette/Dangerfile
159
+ - lib/danger/rules/type_label/Dangerfile
160
+ - lib/danger/rules/z_add_labels/Dangerfile
157
161
  - lib/gitlab-dangerfiles.rb
158
162
  - lib/gitlab/Dangerfile
159
163
  - lib/gitlab/dangerfiles.rb