Commit c3268a6a authored by Nathan Friend's avatar Nathan Friend

Add Danger rule for EE/CE templates

This commit adds a rule to Danger that warns the developer when their MR
includes changes to a CE .vue file that has a counterpart in the
EE repo or vice-versa.
parent 6fbfa060
# frozen_string_literal: true
danger.import_plugin('danger/plugins/helper.rb')
unless helper.release_automation?
......@@ -16,4 +17,5 @@ unless helper.release_automation?
danger.import_dangerfile(path: 'danger/roulette')
danger.import_dangerfile(path: 'danger/single_codebase')
danger.import_dangerfile(path: 'danger/gitlab_ui_wg')
danger.import_dangerfile(path: 'danger/ce_ee_vue_templates')
end
# frozen_string_literal: true
require 'cgi'
def get_vue_files_with_ce_and_ee_versions(files)
files.select do |file|
if file.end_with?('.vue')
counterpart_path = if file.start_with?('ee/')
file.delete_prefix('ee/')
else
"ee/#{file}"
end
escaped_path = CGI.escape(counterpart_path)
api_endpoint = "https://gitlab.com/api/v4/projects/gitlab-org%2Fgitlab-ee/repository/files/#{escaped_path}?ref=master"
response = HTTParty.get(api_endpoint) # rubocop:disable Gitlab/HTTParty
response.code != 404
else
false
end
end
end
vue_candidates = get_vue_files_with_ce_and_ee_versions(helper.all_changed_files)
return if vue_candidates.empty?
message 'This merge request includes changes to Vue files that have both CE and EE versions.'
markdown(<<~MARKDOWN)
## Vue `<template>` in CE and EE
Some Vue files in CE have a counterpart in EE.
(For example, `path/to/file.vue` and `ee/path/to/file.vue`.)
When run in the context of CE, the `<template>` of the CE Vue file is used.
When run in the context of EE, the `<template>` of the EE Vue file is used.
It's easy to accidentally make a change to a CE `<template>` that _should_
appear in both CE and EE without making the change in both places.
When this happens, the change only takes effect in CE.
The following Vue files were changed as part of this merge request that
include both a CE and EE version of the file:
* #{vue_candidates.map { |path| "`#{path}`" }.join("\n* ")}
If you made a change to the `<template>` of any of these Vue files that
should be visible in both CE and EE, please ensure you have made your
change to both versions of the file.
### A better alternative
An even _better_ alternative is to refactor this component to only use
a single template for both CE and EE. More info on this approach here:
https://docs.gitlab.com/ee/development/ee_features.html#template-tag
MARKDOWN
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment