2019-02-05 12:16:18 -05:00
# frozen_string_literal: true
2019-04-08 06:44:57 -04:00
require 'digest/md5'
2019-02-05 12:16:18 -05:00
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-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 .
2019-02-05 12:16:18 -05:00
| 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-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-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' ,
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 ]
2019-05-30 06:50:40 -04:00
2020-07-22 17:09:50 -04:00
spins . each do | spin |
note = note_for_spin_role ( spin , role )
return note if note
end
2021-04-01 11:08:54 -04:00
template % { role : role }
2020-07-06 14:09:13 -04:00
end
2020-07-22 17:09:50 -04:00
def note_for_spin_role ( spin , role )
2020-06-15 08:08:44 -04:00
if spin . optional_role == role
return OPTIONAL_REVIEW_TEMPLATE % { role : role . capitalize , category : helper . label_for_category ( spin . category ) }
2020-04-02 23:07:58 -04:00
end
2019-02-05 12:16:18 -05:00
2020-08-25 08:04:30 -04:00
spin . public_send ( role ) & . markdown_name ( author : roulette . team_mr_author ) # rubocop:disable GitlabSecurity/PublicSend
2020-04-02 23:07:58 -04:00
end
2020-07-22 17:09:50 -04:00
def markdown_row_for_spins ( category , spins_array )
2021-04-01 11:08:54 -04:00
maintainer_note = note_for_spins_role ( spins_array , :maintainer , category )
reviewer_note = note_for_spins_role ( spins_array , :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-03-12 07:09:33 -05:00
changes = project_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' )
# 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
2020-05-07 05:09:51 -04:00
if changes . any?
2021-03-12 07:09:33 -05:00
project = project_helper . project_name
2020-04-02 23:07:58 -04:00
2020-07-22 17:09:50 -04:00
random_roulette_spins = roulette . spin ( project , 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 |
markdown_row_for_spins ( spin . category , [ spin ] )
2020-07-06 14:09:13 -04:00
end
2020-06-15 08:08:44 -04:00
2020-07-22 17:09:50 -04:00
markdown ( MESSAGE )
2019-02-05 12:16:18 -05:00
markdown ( CATEGORY_TABLE_HEADER + rows . join ( " \n " ) ) unless rows . empty?
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