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

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'tooling/danger/helper.rb')
-rw-r--r--tooling/danger/helper.rb99
1 files changed, 94 insertions, 5 deletions
diff --git a/tooling/danger/helper.rb b/tooling/danger/helper.rb
index 60026ee9c70..ef5b2e16bb0 100644
--- a/tooling/danger/helper.rb
+++ b/tooling/danger/helper.rb
@@ -1,5 +1,7 @@
# frozen_string_literal: true
+require 'delegate'
+
require_relative 'teammate'
require_relative 'title_linting'
@@ -86,13 +88,84 @@ module Tooling
end
end
- # @return [Hash<String,Array<String>>]
+ Change = Struct.new(:file, :change_type, :category)
+
+ class Changes < ::SimpleDelegator
+ def added
+ select_by_change_type(:added)
+ end
+
+ def modified
+ select_by_change_type(:modified)
+ end
+
+ def deleted
+ select_by_change_type(:deleted)
+ end
+
+ def renamed_before
+ select_by_change_type(:renamed_before)
+ end
+
+ def renamed_after
+ select_by_change_type(:renamed_after)
+ end
+
+ def has_category?(category)
+ any? { |change| change.category == category }
+ end
+
+ def by_category(category)
+ Changes.new(select { |change| change.category == category })
+ end
+
+ def categories
+ map(&:category).uniq
+ end
+
+ def files
+ map(&:file)
+ end
+
+ private
+
+ def select_by_change_type(change_type)
+ Changes.new(select { |change| change.change_type == change_type })
+ end
+ end
+
+ # @return [Hash<Symbol,Array<String>>]
def changes_by_category
all_changed_files.each_with_object(Hash.new { |h, k| h[k] = [] }) do |file, hash|
categories_for_file(file).each { |category| hash[category] << file }
end
end
+ # @return [Changes]
+ def changes
+ Changes.new([]).tap do |changes|
+ git.added_files.each do |file|
+ categories_for_file(file).each { |category| changes << Change.new(file, :added, category) }
+ end
+
+ git.modified_files.each do |file|
+ categories_for_file(file).each { |category| changes << Change.new(file, :modified, category) }
+ end
+
+ git.deleted_files.each do |file|
+ categories_for_file(file).each { |category| changes << Change.new(file, :deleted, category) }
+ end
+
+ git.renamed_files.map { |x| x[:before] }.each do |file|
+ categories_for_file(file).each { |category| changes << Change.new(file, :renamed_before, category) }
+ end
+
+ git.renamed_files.map { |x| x[:after] }.each do |file|
+ categories_for_file(file).each { |category| changes << Change.new(file, :renamed_after, category) }
+ end
+ end
+ end
+
# Determines the categories a file is in, e.g., `[:frontend]`, `[:backend]`, or `%i[frontend engineering_productivity]`
# using filename regex and specific change regex if given.
#
@@ -130,8 +203,13 @@ module Tooling
CATEGORIES = {
[%r{usage_data\.rb}, %r{^(\+|-).*\s+(count|distinct_count|estimate_batch_distinct_count)\(.*\)(.*)$}] => [:database, :backend],
+ %r{\A(ee/)?config/feature_flags/} => :feature_flag,
+
+ %r{\A(ee/)?(changelogs/unreleased)(-ee)?/} => :changelog,
+
%r{\Adoc/.*(\.(md|png|gif|jpg))\z} => :docs,
%r{\A(CONTRIBUTING|LICENSE|MAINTENANCE|PHILOSOPHY|PROCESS|README)(\.md)?\z} => :docs,
+ %r{\Adata/whats_new/} => :docs,
%r{\A(ee/)?app/(assets|views)/} => :frontend,
%r{\A(ee/)?public/} => :frontend,
@@ -145,7 +223,6 @@ module Tooling
\.nvmrc |
\.prettierignore |
\.prettierrc |
- \.scss-lint.yml |
\.stylelintrc |
\.haml-lint.yml |
\.haml-lint_todo.yml |
@@ -160,6 +237,7 @@ module Tooling
\.gitlab/ci/frontend\.gitlab-ci\.yml
)\z}x => %i[frontend engineering_productivity],
+ %r{\A(ee/)?db/(geo/)?(migrate|post_migrate)/} => [:database, :migration],
%r{\A(ee/)?db/(?!fixtures)[^/]+} => :database,
%r{\A(ee/)?lib/gitlab/(database|background_migration|sql|github_import)(/|\.rb)} => :database,
%r{\A(app/models/project_authorization|app/services/users/refresh_authorized_projects_service)(/|\.rb)} => :database,
@@ -215,6 +293,12 @@ module Tooling
usernames.map { |u| Tooling::Danger::Teammate.new('username' => u) }
end
+ def mr_iid
+ return '' unless gitlab_helper
+
+ gitlab_helper.mr_json['iid']
+ end
+
def mr_title
return '' unless gitlab_helper
@@ -227,6 +311,12 @@ module Tooling
gitlab_helper.mr_json['web_url']
end
+ def mr_labels
+ return [] unless gitlab_helper
+
+ gitlab_helper.mr_labels
+ end
+
def mr_target_branch
return '' unless gitlab_helper
@@ -258,10 +348,9 @@ module Tooling
end
def mr_has_labels?(*labels)
- return false unless gitlab_helper
-
labels = labels.flatten.uniq
- (labels & gitlab_helper.mr_labels) == labels
+
+ (labels & mr_labels) == labels
end
def labels_list(labels, sep: ', ')