Files
keycloak/tests/migration-util/commit-migration.sh
Šimon Vacek 735ce07c47 A script to prepare commits for test migration (#37496)
* Test migration commit script

Closes: #37495

Signed-off-by: Simon Vacek <simonvacky@email.cz>

* fixed prepare-commit util for untracked directories

Signed-off-by: Simon Vacek <simonvacky@email.cz>

* changed prepare-commit to use git stage only

Signed-off-by: Simon Vacek <simonvacky@email.cz>

* renamed commit script

Signed-off-by: Simon Vacek <simonvacky@email.cz>

---------

Signed-off-by: Simon Vacek <simonvacky@email.cz>
2025-03-10 13:08:43 +01:00

157 lines
4.0 KiB
Bash
Executable File

#!/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