2019-07-07 11:18:12 +05:30
# frozen_string_literal: true
2019-07-31 22:56:46 +05:30
require 'digest/md5'
2019-07-07 11:18:12 +05:30
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 ( e . g .
~ frontend or ~ backend ) , and by a maintainer in all other categories .
MARKDOWN
CATEGORY_TABLE_HEADER = <<MARKDOWN
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 .
2019-07-07 11:18:12 +05:30
| Category | Reviewer | Maintainer |
| - - - - - - - - | - - - - - - - - | - - - - - - - - - - |
MARKDOWN
UNKNOWN_FILES_MESSAGE = <<MARKDOWN
These files couldn ' t be categorised , so Danger was unable to suggest a reviewer .
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-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' ,
product_intelligence : " No engineer is available for automated assignment, please reach out to ` # g_product_intelligence` slack channel or mention `@gitlab-org/growth/product-intelligence/engineers` for assistance. "
} . 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
2021-04-17 20:07:23 +05:30
changes = project_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' )
# 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
2020-05-24 23:13:21 +05:30
if changes . any?
2021-04-17 20:07:23 +05:30
project = project_helper . project_name
2020-04-22 19:07:51 +05:30
2020-10-24 23:57:45 +05:30
random_roulette_spins = roulette . spin ( project , 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
2020-10-24 23:57:45 +05:30
markdown ( MESSAGE )
2019-07-07 11:18:12 +05:30
markdown ( CATEGORY_TABLE_HEADER + rows . join ( " \n " ) ) unless rows . empty?
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