2019-07-07 11:18:12 +05:30
# frozen_string_literal: true
2019-07-31 22:56:46 +05:30
require 'digest/md5'
2021-09-04 01:27:46 +05:30
REVIEW_ROULETTE_SECTION = <<MARKDOWN
2019-07-07 11:18:12 +05:30
## Reviewer roulette
2021-09-04 01:27:46 +05:30
MARKDOWN
CATEGORY_TABLE = <<MARKDOWN
Changes that require review have been detected!
2019-07-07 11:18:12 +05:30
2021-09-04 01:27:46 +05:30
Please refer to the table below for assigning reviewers and maintainers suggested by Danger in the specified category :
| Category | Reviewer | Maintainer |
| - - - - - - - - | - - - - - - - - | - - - - - - - - - - |
2019-07-07 11:18:12 +05:30
MARKDOWN
2021-09-04 01:27:46 +05:30
POST_TABLE_MESSAGE = <<MARKDOWN
2019-07-07 11:18:12 +05:30
2020-07-28 23:09:34 +05:30
To spread load more evenly across eligible reviewers , Danger has picked a candidate for each
review slot , based on their timezone . Feel free to
2020-05-24 23:13:21 +05:30
[ override these selections ] ( https : / / about . gitlab . com / handbook / engineering / projects / #gitlab)
2021-03-08 18:12:59 +05:30
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 .
2019-07-07 11:18:12 +05:30
2020-03-13 15:44:24 +05:30
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 ) .
2020-07-28 23:09:34 +05:30
Please consider assigning a reviewer or maintainer who is a
[ domain expert ] ( https : / / about . gitlab . com / handbook / engineering / projects / #gitlab) in the area of the merge request.
2020-03-13 15:44:24 +05:30
2021-03-11 19:13:27 +05:30
Once you ' ve decided who will review this merge request , assign them as a reviewer!
Danger does not automatically notify them for you .
2021-09-04 01:27:46 +05:30
MARKDOWN
2019-07-07 11:18:12 +05:30
2021-09-04 01:27:46 +05:30
NO_SUGGESTIONS = <<MARKDOWN
There are no reviewer and maintainer suggestions for the changes in this MR .
2019-07-07 11:18:12 +05:30
MARKDOWN
UNKNOWN_FILES_MESSAGE = <<MARKDOWN
2021-10-27 15:23:28 +05:30
### Uncategorized files
2019-07-07 11:18:12 +05:30
2021-10-27 15:23:28 +05:30
These files couldn ' t be categorized , so Danger was unable to suggest a reviewer .
2019-07-07 11:18:12 +05:30
Please consider creating a merge request to
2021-04-17 20:07:23 +05:30
[ add support ] ( https : / / gitlab . com / gitlab - org / gitlab / blob / master / tooling / danger / project_helper . rb )
2019-07-07 11:18:12 +05:30
for them .
MARKDOWN
2021-12-11 22:18:48 +05:30
def group_not_available_template ( slack_channel , gitlab_group )
2022-01-26 12:08:38 +05:30
<< ~ TEMPLATE . strip
No engineer is available for automated assignment , please reach out to the ` #{ slack_channel } ` Slack channel or mention ` #{ gitlab_group } ` for assistance .
2021-12-11 22:18:48 +05:30
TEMPLATE
end
2021-03-08 18:12:59 +05:30
OPTIONAL_REVIEW_TEMPLATE = '%{role} review is optional for %{category}'
2021-04-29 21:17:54 +05:30
NOT_AVAILABLE_TEMPLATES = {
default : 'No %{role} available' ,
2021-12-11 22:18:48 +05:30
product_intelligence : group_not_available_template ( '#g_product_intelligence' , '@gitlab-org/growth/product-intelligence/engineers' ) ,
integrations_be : group_not_available_template ( '#g_ecosystem_integrations' , '@gitlab-org/ecosystem-stage/integrations' ) ,
integrations_fe : group_not_available_template ( '#g_ecosystem_integrations' , '@gitlab-org/ecosystem-stage/integrations' )
2021-04-29 21:17:54 +05:30
} . freeze
def note_for_spins_role ( spins , role , category )
template = NOT_AVAILABLE_TEMPLATES [ category ] || NOT_AVAILABLE_TEMPLATES [ :default ]
2020-07-28 23:09:34 +05:30
2020-10-24 23:57:45 +05:30
spins . each do | spin |
note = note_for_spin_role ( spin , role )
return note if note
end
2021-04-29 21:17:54 +05:30
template % { role : role }
2020-07-28 23:09:34 +05:30
end
2019-07-31 22:56:46 +05:30
2020-10-24 23:57:45 +05:30
def note_for_spin_role ( spin , role )
2020-06-23 00:09:42 +05:30
if spin . optional_role == role
return OPTIONAL_REVIEW_TEMPLATE % { role : role . capitalize , category : helper . label_for_category ( spin . category ) }
2020-04-22 19:07:51 +05:30
end
2019-07-07 11:18:12 +05:30
2020-11-24 15:15:51 +05:30
spin . public_send ( role ) & . markdown_name ( author : roulette . team_mr_author ) # rubocop:disable GitlabSecurity/PublicSend
2020-04-22 19:07:51 +05:30
end
2020-10-24 23:57:45 +05:30
def markdown_row_for_spins ( category , spins_array )
2021-04-29 21:17:54 +05:30
maintainer_note = note_for_spins_role ( spins_array , :maintainer , category )
reviewer_note = note_for_spins_role ( spins_array , :reviewer , category )
2020-06-23 00:09:42 +05:30
2020-10-24 23:57:45 +05:30
" | #{ helper . label_for_category ( category ) } | #{ reviewer_note } | #{ maintainer_note } | "
2019-07-31 22:56:46 +05:30
end
2022-01-26 12:08:38 +05:30
changes = helper . changes_by_category
2019-07-07 11:18:12 +05:30
2019-07-31 22:56:46 +05:30
# Ignore any files that are known but uncategorized. Prompt for any unknown files
2019-07-07 11:18:12 +05:30
changes . delete ( :none )
2020-07-28 23:09:34 +05:30
# To reinstate roulette for documentation, remove this line.
changes . delete ( :docs )
2021-04-29 21:17:54 +05:30
# No special review for changelog needed and changelog was never a label.
changes . delete ( :changelog )
# No special review for feature flags needed.
changes . delete ( :feature_flag )
categories = Set . new ( changes . keys - [ :unknown ] )
2019-07-07 11:18:12 +05:30
2019-10-12 21:52:04 +05:30
# Ensure to spin for database reviewer/maintainer when ~database is applied (e.g. to review SQL queries)
2021-04-29 21:17:54 +05:30
categories << :database if helper . mr_labels . include? ( 'database' )
2022-07-16 23:28:13 +05:30
# Ensure to spin for UX reviewer when ~UX is applied (e.g. to review changes to the UI) except when it's from wider community contribution where we want to assign from the corresponding group
categories << :ux if helper . mr_labels . include? ( 'UX' ) && ! helper . mr_labels . include? ( 'Community contribution' )
2021-12-11 22:18:48 +05:30
2021-04-29 21:17:54 +05:30
# Ensure to spin for Product Intelligence reviewer when ~"product intelligence::review pending" is applied
categories << :product_intelligence if helper . mr_labels . include? ( " product intelligence::review pending " )
2019-10-12 21:52:04 +05:30
2021-11-18 22:05:49 +05:30
# Skip Product intelligence reviews for growth experiment MRs
2022-01-26 12:08:38 +05:30
categories . delete ( :product_intelligence ) if helper . mr_labels . include? ( " growth experiment " )
2021-11-18 22:05:49 +05:30
2020-05-24 23:13:21 +05:30
if changes . any?
2022-01-26 12:08:38 +05:30
random_roulette_spins = roulette . spin ( nil , categories , timezone_experiment : false )
2020-06-23 00:09:42 +05:30
2020-10-24 23:57:45 +05:30
rows = random_roulette_spins . map do | spin |
markdown_row_for_spins ( spin . category , [ spin ] )
2020-07-28 23:09:34 +05:30
end
2019-07-07 11:18:12 +05:30
2021-09-04 01:27:46 +05:30
markdown ( REVIEW_ROULETTE_SECTION )
if rows . empty?
markdown ( NO_SUGGESTIONS )
else
markdown ( CATEGORY_TABLE + rows . join ( " \n " ) )
markdown ( POST_TABLE_MESSAGE )
end
2020-07-28 23:09:34 +05:30
unknown = changes . fetch ( :unknown , [ ] )
2019-10-12 21:52:04 +05:30
markdown ( UNKNOWN_FILES_MESSAGE + helper . markdown_list ( unknown ) ) unless unknown . empty?
2019-07-07 11:18:12 +05:30
end