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

gitlab.com/gitlab-org/gitaly.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'danger/rules/roulette/Dangerfile')
-rw-r--r--danger/rules/roulette/Dangerfile74
1 files changed, 74 insertions, 0 deletions
diff --git a/danger/rules/roulette/Dangerfile b/danger/rules/roulette/Dangerfile
new file mode 100644
index 000000000..80ee666df
--- /dev/null
+++ b/danger/rules/roulette/Dangerfile
@@ -0,0 +1,74 @@
+# frozen_string_literal: true
+
+MESSAGE = <<MARKDOWN
+## Reviewer roulette
+
+Changes that require review have been detected! A merge request is normally
+reviewed by both a reviewer and a maintainer in its primary category and by a
+maintainer in all other categories.
+MARKDOWN
+
+CATEGORY_TABLE_HEADER = <<MARKDOWN
+
+To spread load more evenly across eligible reviewers, Danger has picked a candidate for each
+review slot. Feel free to
+[override these selections](https://about.gitlab.com/handbook/engineering/projects/#gitaly)
+if you think someone else would be better-suited
+or use the [GitLab Review Workload Dashboard](https://gitlab-org.gitlab.io/gitlab-roulette/) to find other available reviewers.
+
+To read more on how to use the reviewer roulette, please take a look at the
+[Engineering workflow](https://about.gitlab.com/handbook/engineering/workflow/#basics)
+and [code review guidelines](https://docs.gitlab.com/ee/development/code_review.html).
+Please consider assigning a reviewer or maintainer who is a
+[domain expert](https://about.gitlab.com/handbook/engineering/projects/#gitaly) in the area of the merge request.
+
+Once you've decided who will review this merge request, mention them as you
+normally would! Danger does not automatically notify them for you.
+
+| Category | Reviewer | Maintainer |
+| -------- | -------- | ---------- |
+MARKDOWN
+
+OPTIONAL_REVIEW_TEMPLATE = '%{role} review is optional for %{category}'
+NOT_AVAILABLE_TEMPLATE = 'No %{role} available'
+
+def note_for_spins_role(spins, role)
+ spins.each do |spin|
+ note = note_for_spin_role(spin, role)
+
+ return note if note
+ end
+
+ NOT_AVAILABLE_TEMPLATE % { role: role }
+end
+
+def note_for_spin_role(spin, role)
+ if spin.optional_role == role
+ return OPTIONAL_REVIEW_TEMPLATE % { role: role.capitalize, category: helper.label_for_category(spin.category) }
+ end
+
+ spin.public_send(role)&.markdown_name(author: roulette.team_mr_author) # rubocop:disable GitlabSecurity/PublicSend
+end
+
+def markdown_row_for_spins(category, spins_array)
+ reviewer_note = note_for_spins_role(spins_array, :reviewer)
+ maintainer_note = note_for_spins_role(spins_array, :maintainer)
+
+ "| #{helper.label_for_category(category)} | #{reviewer_note} | #{maintainer_note} |"
+end
+
+changes = project_helper.changes_by_category
+
+if changes.any?
+ categories = changes.keys
+ project = project_helper.project_name
+
+ random_roulette_spins = roulette.spin(project, [nil], timezone_experiment: false)
+
+ rows = random_roulette_spins.map do |spin|
+ markdown_row_for_spins(spin.category, [spin])
+ end
+
+ markdown(MESSAGE)
+ markdown(CATEGORY_TABLE_HEADER + rows.join("\n")) unless rows.empty?
+end