From 735ce07c476a5fddefc575bc62626e8ac5d80e17 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Vacek?= <86605314+vaceksimon@users.noreply.github.com> Date: Mon, 10 Mar 2025 13:08:43 +0100 Subject: [PATCH] A script to prepare commits for test migration (#37496) * Test migration commit script Closes: #37495 Signed-off-by: Simon Vacek * fixed prepare-commit util for untracked directories Signed-off-by: Simon Vacek * changed prepare-commit to use git stage only Signed-off-by: Simon Vacek * renamed commit script Signed-off-by: Simon Vacek --------- Signed-off-by: Simon Vacek --- tests/migration-util/commit-migration.sh | 156 +++++++++++++++++++++++ 1 file changed, 156 insertions(+) create mode 100755 tests/migration-util/commit-migration.sh diff --git a/tests/migration-util/commit-migration.sh b/tests/migration-util/commit-migration.sh new file mode 100755 index 00000000000..ed4f70493e2 --- /dev/null +++ b/tests/migration-util/commit-migration.sh @@ -0,0 +1,156 @@ +#!/bin/bash + +declare -a DELETED_FILES_PATHS +declare -a CREATED_FILES_PATHS +declare COMMIT_MESSAGE="" + +get_deleted_and_created_files() { + local deleted_files_paths + local deleted_file_path + local file_name + local new_file_path + + readarray -t deleted_files_paths < <(git diff --cached --name-status --diff-filter=D | grep -E ".*testsuite/integration-arquillian/.*" | awk '{print $2}') + if [ ${#deleted_files_paths} -eq 0 ]; then + return + fi + + for deleted_file_path in "${deleted_files_paths[@]}"; do + if [ -z "$deleted_file_path" ]; then + continue + fi + + file_name=$(basename "$deleted_file_path") + new_file_path=$(git diff --cached --name-status --diff-filter=A | grep -E ".*\b${file_name}\b" | awk '{print $2}') + + if [ -n "$new_file_path" ]; then + DELETED_FILES_PATHS+=("$deleted_file_path") + CREATED_FILES_PATHS+=("$new_file_path") + fi + done +} + +get_test_names_string() { + local file_names_string="" + local -a test_names + local file_name + readarray -t test_names < <(git diff --cached --name-status --diff-filter=MR | grep -E ".*Test.java" | awk '{print $2}' | xargs -I {} basename {}) + for file_name in "${test_names[@]}"; do + if [ -z "$file_names_string" ]; then + file_names_string="$file_name" + else + file_names_string+=", $file_name" + fi + done + echo "$file_names_string" +} + +get_default_commit_message() { + local test_names + test_names=$(get_test_names_string) + echo "Move $test_names to the new testsuite" +} + +read_commit_message() { + local default_commit_message + default_commit_message=$(get_default_commit_message) + default_commit_message+=$'\n\n'"Part of: #34494" + + echo "" + echo "Provide a different commit message (optional)" + echo "=============================================" + echo "$default_commit_message" + echo "=============================================" + COMMIT_MESSAGE="" + read -r COMMIT_MESSAGE + if [ -n "$COMMIT_MESSAGE" ]; then + COMMIT_MESSAGE+=$'\n' + while IFS= read -r line; do + if [ -z "$line" ]; then + COMMIT_MESSAGE+=$'\n' + else + COMMIT_MESSAGE+="$line"$'\n' + fi + done + else + echo "Default commit message will be used" + COMMIT_MESSAGE="$default_commit_message" + fi +} + +commit_stage() { + echo "The following files will be commited:" + git --no-pager diff --cached --name-status + + read_commit_message + + local confirm + echo "" + read -p "Commit? [y/n]: " -r confirm + if [[ -z "$confirm" || "$confirm" == [yY] || "$confirm" == [yY][eE][sS] ]]; then + git commit --signoff -m "$COMMIT_MESSAGE" + else + exit 1 + fi +} + +backup_staged_files() { + local stage_backup + stage_backup="$(git diff --cached --name-status --diff-filter=ACDMR | awk '{print $2}')" + stage_backup+=$'\n'"$(git diff --cached --name-status --diff-filter=R | awk '{print $3}')" + echo "$stage_backup" +} + +restore_stage() { + local stage_backup + stage_backup="$1" + + if [ -n "$stage_backup" ]; then + echo "$stage_backup" | xargs -I {} git add {} > /dev/null 2>&1 + fi +} + +commit_test_move() { + local stage_backup + stage_backup=$(backup_staged_files) + set -e + git restore --staged . + git restore "${DELETED_FILES_PATHS[@]}" + + for i in "${!CREATED_FILES_PATHS[@]}"; do + mv "${CREATED_FILES_PATHS[i]}" "${CREATED_FILES_PATHS[i]}.new" + mv "${DELETED_FILES_PATHS[i]}" "${CREATED_FILES_PATHS[i]}" + done + + git add "${DELETED_FILES_PATHS[@]}" "${CREATED_FILES_PATHS[@]}" + git commit --signoff -m "Moving files to the new test suite" + + rm "${CREATED_FILES_PATHS[@]}" + for NEW_TEST_PATH in "${CREATED_FILES_PATHS[@]}"; do + mv "$NEW_TEST_PATH.new" "$NEW_TEST_PATH" + done + set +e + restore_stage "$stage_backup" + echo "Move commit created" +} + + +if [ -z "$(git diff --cached)" ]; then + echo "Git stage is empty. Nothing to do." + exit 0 +fi +cd "$(git rev-parse --show-toplevel)" + +get_deleted_and_created_files + +if [ ${#DELETED_FILES_PATHS[@]} -eq 0 ]; then + echo "Migration can be done with a single commit." + commit_stage +else + echo "Git registers some files as deleted and created" + commit_test_move + git add "${CREATED_FILES_PATHS[@]}" + echo "" + echo "Committing stage..." + commit_stage +fi