2019-08-21 17:26:46 +00:00
# frozen_string_literal: true
2018-05-21 16:41:21 +00:00
# rubocop:disable Style/SignalException
require 'yaml'
2020-05-27 12:08:19 +00:00
SEE_DOC = " See the [changelog documentation](https://docs.gitlab.com/ee/development/changelog.html). "
2018-07-10 10:10:54 +00:00
2020-05-27 12:08:19 +00:00
SUGGEST_MR_COMMENT = << ~ SUGGEST_COMMENT
` ` ` suggestion
merge_request : %< mr_iid > s
` ` `
#{SEE_DOC}
SUGGEST_COMMENT
2020-03-23 15:09:36 +00:00
def check_changelog_yaml ( path )
2020-05-27 12:08:19 +00:00
raw_file = File . read ( path )
yaml = YAML . safe_load ( raw_file )
2018-05-21 16:41:21 +00:00
2018-07-10 10:10:54 +00:00
fail " `title` should be set, in #{ gitlab . html_link ( path ) } ! #{ SEE_DOC } " if yaml [ " title " ] . nil?
fail " `type` should be set, in #{ gitlab . html_link ( path ) } ! #{ SEE_DOC } " if yaml [ " type " ] . nil?
2018-05-21 16:41:21 +00:00
2020-07-03 00:09:23 +00:00
return if helper . security_mr?
cherry_pick_against_stable_branch = helper . cherry_pick_mr? && helper . stable_branch?
if yaml [ " merge_request " ] . nil?
2020-05-27 12:08:19 +00:00
mr_line = raw_file . lines . find_index ( " merge_request: \n " )
if mr_line
markdown ( format ( SUGGEST_MR_COMMENT , mr_iid : gitlab . mr_json [ " iid " ] ) , file : path , line : mr_line . succ )
else
message " Consider setting `merge_request` to #{ gitlab . mr_json [ " iid " ] } in #{ gitlab . html_link ( path ) } . #{ SEE_DOC } "
end
2020-07-03 00:09:23 +00:00
elsif yaml [ " merge_request " ] != gitlab . mr_json [ " iid " ] && ! cherry_pick_against_stable_branch
2020-03-24 18:07:55 +00:00
fail " Merge request ID was not set to #{ gitlab . mr_json [ " iid " ] } ! #{ SEE_DOC } "
2018-05-21 16:41:21 +00:00
end
2021-01-26 18:09:30 +00:00
rescue Psych :: Exception
2018-05-21 16:41:21 +00:00
# YAML could not be parsed, fail the build.
2018-07-10 10:10:54 +00:00
fail " #{ gitlab . html_link ( path ) } isn't valid YAML! #{ SEE_DOC } "
2018-07-13 03:08:45 +00:00
rescue StandardError = > e
2020-07-01 09:09:30 +00:00
warn " There was a problem trying to check the Changelog. Exception: #{ e . class . name } - #{ e . message } "
2018-05-21 16:41:21 +00:00
end
2020-03-23 15:09:36 +00:00
def check_changelog_path ( path )
ee_changes = helper . all_ee_changes . dup
ee_changes . delete ( path )
2020-11-24 12:09:17 +00:00
if ee_changes . any? && ! changelog . ee_changelog? && ! changelog . db_changes?
2020-03-23 15:09:36 +00:00
warn " This MR has a Changelog file outside `ee/`, but code changes in `ee/`. Consider moving the Changelog file into `ee/`. "
end
if ee_changes . empty? && changelog . ee_changelog?
warn " This MR has a Changelog file in `ee/`, but no code changes in `ee/`. Consider moving the Changelog file outside `ee/`. "
end
2020-11-24 12:09:17 +00:00
if ee_changes . any? && changelog . ee_changelog? && changelog . db_changes?
warn " This MR has a Changelog file inside `ee/`, but there are database changes which [requires](https://docs.gitlab.com/ee/development/changelog.html # what-warrants-a-changelog-entry) the Changelog placement to be outside of `ee/`. Consider moving the Changelog file outside `ee/`. "
end
2020-03-23 15:09:36 +00:00
end
2018-05-21 16:41:21 +00:00
if git . modified_files . include? ( " CHANGELOG.md " )
2020-08-21 03:10:16 +00:00
fail changelog . modified_text
2018-05-21 16:41:21 +00:00
end
2019-12-12 15:08:41 +00:00
changelog_found = changelog . found
2020-03-23 15:09:36 +00:00
if changelog_found
check_changelog_yaml ( changelog_found )
check_changelog_path ( changelog_found )
2020-08-21 03:10:16 +00:00
elsif changelog . required?
fail changelog . required_text
elsif changelog . optional?
message changelog . optional_text
2018-05-21 16:41:21 +00:00
end