2019-02-05 12:16:18 -05:00
# frozen_string_literal: true
2021-06-15 02:10:17 -04:00
REVIEW_ROULETTE_SECTION = <<MARKDOWN
2019-02-05 12:16:18 -05:00
## Reviewer roulette
2021-06-15 02:10:17 -04:00
MARKDOWN
CATEGORY_TABLE = <<MARKDOWN
Changes that require review have been detected!
2019-02-05 12:16:18 -05:00
2021-06-15 02:10:17 -04:00
Please refer to the table below for assigning reviewers and maintainers suggested by Danger in the specified category :
| Category | Reviewer | Maintainer |
| - - - - - - - - | - - - - - - - - | - - - - - - - - - - |
2019-02-05 12:16:18 -05:00
MARKDOWN
2021-06-15 02:10:17 -04:00
POST_TABLE_MESSAGE = <<MARKDOWN
2019-02-05 12:16:18 -05:00
2020-07-07 17:09:13 -04:00
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-04-22 11:09:27 -04:00
[ override these selections ] ( https : / / about . gitlab . com / handbook / engineering / projects / #gitlab)
2021-01-13 10:10:40 -05:00
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-02-05 12:16:18 -05:00
2020-02-03 10:08:45 -05:00
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-07 17:09:13 -04:00
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-02-03 10:08:45 -05:00
2021-02-16 04:09:36 -05:00
Once you ' ve decided who will review this merge request , assign them as a reviewer!
Danger does not automatically notify them for you .
2021-06-15 02:10:17 -04:00
MARKDOWN
2019-02-05 12:16:18 -05:00
2021-06-15 02:10:17 -04:00
NO_SUGGESTIONS = <<MARKDOWN
There are no reviewer and maintainer suggestions for the changes in this MR .
2019-02-05 12:16:18 -05:00
MARKDOWN
UNKNOWN_FILES_MESSAGE = <<MARKDOWN
2021-08-03 14:10:02 -04:00
### Uncategorized files
2019-02-05 12:16:18 -05:00
2021-08-03 14:10:02 -04:00
These files couldn ' t be categorized , so Danger was unable to suggest a reviewer .
2019-02-05 12:16:18 -05:00
Please consider creating a merge request to
2021-03-12 07:09:33 -05:00
[ add support ] ( https : / / gitlab . com / gitlab - org / gitlab / blob / master / tooling / danger / project_helper . rb )
2019-02-05 12:16:18 -05:00
for them .
MARKDOWN
2021-11-16 16:12:05 -05:00
def group_not_available_template ( slack_channel , gitlab_group )
2021-11-22 10:14:13 -05:00
<< ~ 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-11-16 16:12:05 -05:00
TEMPLATE
end
2021-01-07 16:10:18 -05:00
OPTIONAL_REVIEW_TEMPLATE = '%{role} review is optional for %{category}'
2021-04-01 11:08:54 -04:00
NOT_AVAILABLE_TEMPLATES = {
default : 'No %{role} available' ,
2022-07-20 08:08:44 -04:00
product_intelligence : group_not_available_template ( '#g_product_intelligence' , '@gitlab-org/analytics-section/product-intelligence/engineers' ) ,
2022-10-11 20:10:06 -04:00
integrations_be : group_not_available_template ( '#g_manage_integrations' , '@gitlab-org/manage/integrations' ) ,
integrations_fe : group_not_available_template ( '#g_manage_integrations' , '@gitlab-org/manage/integrations' )
2021-04-01 11:08:54 -04:00
} . freeze
2022-06-02 08:09:21 -04:00
def note_for_spin_role ( spin , role , category )
2021-04-01 11:08:54 -04:00
template = NOT_AVAILABLE_TEMPLATES [ category ] || NOT_AVAILABLE_TEMPLATES [ :default ]
2019-05-30 06:50:40 -04:00
2022-06-02 08:09:21 -04:00
note =
if spin . optional_role == role
OPTIONAL_REVIEW_TEMPLATE % { role : role . capitalize , category : helper . label_for_category ( spin . category ) }
else
spin . public_send ( role ) & . markdown_name ( author : roulette . team_mr_author ) # rubocop:disable GitlabSecurity/PublicSend
end
2020-07-22 17:09:50 -04:00
2022-06-02 08:09:21 -04:00
note || template % { role : role }
2020-04-02 23:07:58 -04:00
end
2022-06-02 08:09:21 -04:00
def markdown_row_for_spin ( category , spin )
maintainer_note = note_for_spin_role ( spin , :maintainer , category )
reviewer_note = note_for_spin_role ( spin , :reviewer , category )
2020-06-15 08:08:44 -04:00
2020-07-22 17:09:50 -04:00
" | #{ helper . label_for_category ( category ) } | #{ reviewer_note } | #{ maintainer_note } | "
2019-02-05 12:16:18 -05:00
end
2021-12-03 10:10:36 -05:00
changes = helper . changes_by_category
2019-02-14 11:45:53 -05:00
2019-04-25 20:23:30 -04:00
# Ignore any files that are known but uncategorized. Prompt for any unknown files
2019-02-14 11:45:53 -05:00
changes . delete ( :none )
2020-07-07 05:08:57 -04:00
# To reinstate roulette for documentation, remove this line.
changes . delete ( :docs )
2021-03-22 17:08:59 -04:00
# 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 )
2021-04-01 11:08:54 -04:00
categories = Set . new ( changes . keys - [ :unknown ] )
2019-02-05 12:16:18 -05:00
2019-07-19 13:33:48 -04:00
# Ensure to spin for database reviewer/maintainer when ~database is applied (e.g. to review SQL queries)
2021-04-01 11:08:54 -04:00
categories << :database if helper . mr_labels . include? ( 'database' )
2022-05-02 20:08:25 -04:00
# 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-11-08 22:42:22 -05:00
2021-04-01 11:08:54 -04:00
# 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-07-19 13:33:48 -04:00
2021-09-27 14:12:38 -04:00
# Skip Product intelligence reviews for growth experiment MRs
2021-12-15 10:15:54 -05:00
categories . delete ( :product_intelligence ) if helper . mr_labels . include? ( " growth experiment " )
2021-09-27 14:12:38 -04:00
2020-05-07 05:09:51 -04:00
if changes . any?
2021-12-03 10:10:36 -05:00
random_roulette_spins = roulette . spin ( nil , categories , timezone_experiment : false )
2020-07-07 17:09:13 -04:00
2020-08-19 08:10:17 -04:00
rows = random_roulette_spins . map do | spin |
2022-06-02 08:09:21 -04:00
markdown_row_for_spin ( spin . category , spin )
2020-07-06 14:09:13 -04:00
end
2020-06-15 08:08:44 -04:00
2022-06-23 08:09:30 -04:00
roulette . required_approvals . each do | approval |
rows << markdown_row_for_spin ( approval . category , approval . spin )
end
2021-06-15 02:10:17 -04:00
markdown ( REVIEW_ROULETTE_SECTION )
if rows . empty?
markdown ( NO_SUGGESTIONS )
else
markdown ( CATEGORY_TABLE + rows . join ( " \n " ) )
markdown ( POST_TABLE_MESSAGE )
end
2020-07-07 17:09:13 -04:00
unknown = changes . fetch ( :unknown , [ ] )
2019-07-19 13:33:48 -04:00
markdown ( UNKNOWN_FILES_MESSAGE + helper . markdown_list ( unknown ) ) unless unknown . empty?
2019-02-05 12:16:18 -05:00
end