summaryrefslogtreecommitdiff
path: root/tooling/bin/find_changes
diff options
context:
space:
mode:
Diffstat (limited to 'tooling/bin/find_changes')
-rwxr-xr-xtooling/bin/find_changes79
1 files changed, 68 insertions, 11 deletions
diff --git a/tooling/bin/find_changes b/tooling/bin/find_changes
index 20df085879a..c6b8bafbd85 100755
--- a/tooling/bin/find_changes
+++ b/tooling/bin/find_changes
@@ -3,19 +3,76 @@
require 'gitlab'
-gitlab_token = ENV.fetch('PROJECT_TOKEN_FOR_CI_SCRIPTS_API_USAGE', '')
-gitlab_endpoint = ENV.fetch('CI_API_V4_URL')
-mr_project_path = ENV.fetch('CI_MERGE_REQUEST_PROJECT_PATH')
-mr_iid = ENV.fetch('CI_MERGE_REQUEST_IID')
+class FindChanges # rubocop:disable Gitlab/NamespacedClass
+ def initialize(output_file:, matched_tests_file: nil, frontend_fixtures_mapping_path: nil)
+ @gitlab_token = ENV.fetch('PROJECT_TOKEN_FOR_CI_SCRIPTS_API_USAGE', '')
+ @gitlab_endpoint = ENV.fetch('CI_API_V4_URL')
+ @mr_project_path = ENV.fetch('CI_MERGE_REQUEST_PROJECT_PATH')
+ @mr_iid = ENV.fetch('CI_MERGE_REQUEST_IID')
+ @output_file = output_file
+ @matched_tests_file = matched_tests_file
+ @frontend_fixtures_mapping_path = frontend_fixtures_mapping_path
+ end
-output_file = ARGV.shift
+ def execute
+ add_frontend_fixture_files!
+
+ File.write(output_file, file_changes.join(' '))
+ end
+
+ private
+
+ def add_frontend_fixture_files?
+ matched_tests_file && frontend_fixtures_mapping_path
+ end
+
+ def add_frontend_fixture_files!
+ return unless add_frontend_fixture_files?
+
+ # If we have a `test file -> JSON frontend fixture` mapping file, we add the files JSON frontend fixtures
+ # files to the list of changed files so that Jest can automatically run the dependent tests thanks to --findRelatedTests
+ test_files.each do |test_file|
+ file_changes.concat(frontend_fixtures_mapping[test_file]) if frontend_fixtures_mapping.key?(test_file)
+ end
+ end
+
+ def file_changes
+ @file_changes ||=
+ if File.exist?(output_file)
+ File.read(output_file).split(' ')
+ else
+ Gitlab.configure do |config|
+ config.endpoint = gitlab_endpoint
+ config.private_token = gitlab_token
+ end
+
+ mr_changes = Gitlab.merge_request_changes(mr_project_path, mr_iid)
-Gitlab.configure do |config|
- config.endpoint = gitlab_endpoint
- config.private_token = gitlab_token
+ mr_changes.changes.map { |change| change['new_path'] }
+ end
+ end
+
+ def test_files
+ return [] if !matched_tests_file || !File.exist?(matched_tests_file)
+
+ File.read(matched_tests_file).split(' ')
+ end
+
+ def frontend_fixtures_mapping
+ return {} if !frontend_fixtures_mapping_path || !File.exist?(frontend_fixtures_mapping_path)
+
+ JSON.parse(File.read(frontend_fixtures_mapping_path)) # rubocop:disable Gitlab/Json
+ end
+
+ attr_reader :gitlab_token, :gitlab_endpoint, :mr_project_path, :mr_iid, :output_file, :matched_tests_file, :frontend_fixtures_mapping_path
end
-mr_changes = Gitlab.merge_request_changes(mr_project_path, mr_iid)
-file_changes = mr_changes.changes.map { |change| change['new_path'] }
+output_file = ARGV.shift
+raise ArgumentError, "An path to an output file must be given as first argument of #{__FILE__}." if output_file.nil?
+
+matched_tests_file = ARGV.shift
+frontend_fixtures_mapping_path = ARGV.shift
-File.write(output_file, file_changes.join(' '))
+FindChanges
+ .new(output_file: output_file, matched_tests_file: matched_tests_file, frontend_fixtures_mapping_path: frontend_fixtures_mapping_path)
+ .execute