mirror of
https://github.com/coder/coder.git
synced 2025-07-13 21:36:50 +00:00
feat: Add migration fixer script (for branches) (#6466)
This commit is contained in:
committed by
GitHub
parent
fd02f73708
commit
0c2b432c1b
97
coderd/database/migrations/fix_migration_numbers.sh
Executable file
97
coderd/database/migrations/fix_migration_numbers.sh
Executable file
@ -0,0 +1,97 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
SCRIPT_DIR=$(dirname "${BASH_SOURCE[0]}")
|
||||||
|
|
||||||
|
list_migrations() {
|
||||||
|
branch=$1
|
||||||
|
git ls-tree -r --name-only "${branch}" -- . | grep -E '[0-9]{6}.*' | sort -n
|
||||||
|
}
|
||||||
|
|
||||||
|
main() {
|
||||||
|
cd "${SCRIPT_DIR}"
|
||||||
|
|
||||||
|
origin=$(git remote -v | grep "github.com[:/]coder/coder.*(fetch)" | cut -f1)
|
||||||
|
|
||||||
|
echo "Fetching ${origin}/main..."
|
||||||
|
git fetch -u "${origin}" main
|
||||||
|
|
||||||
|
curr_num=$(
|
||||||
|
set -e
|
||||||
|
list_migrations "${origin}"/main | grep '^[0-9]' | tail -n1
|
||||||
|
)
|
||||||
|
echo "Last migration (main): ${curr_num}"
|
||||||
|
next_num=$(("1${curr_num:0:6}" - 1000000 + 1))
|
||||||
|
curr_num=$(printf "%06d" "${next_num}")
|
||||||
|
echo "Next migration number: ${curr_num}"
|
||||||
|
|
||||||
|
main_files="$(
|
||||||
|
set -e
|
||||||
|
list_migrations "${origin}"/main
|
||||||
|
)"
|
||||||
|
head_files="$(
|
||||||
|
set -e
|
||||||
|
list_migrations HEAD
|
||||||
|
)"
|
||||||
|
|
||||||
|
declare -A prefix_map=()
|
||||||
|
declare -a git_add_files=()
|
||||||
|
|
||||||
|
# Renumber migrations part of this branch (as compared to main)
|
||||||
|
diff_files="$(diff -u <(echo "${main_files}") <(echo "${head_files}") | sed -E -ne 's;^\+(0.*);\1;p' | sort -n || true)"
|
||||||
|
if [[ -z "${diff_files}" ]]; then
|
||||||
|
echo "No migrations to rename, exiting."
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
while read -r file; do
|
||||||
|
old_file="${file}"
|
||||||
|
dir=$(dirname "${file}")
|
||||||
|
file=$(basename "${file}")
|
||||||
|
num="${file:0:6}"
|
||||||
|
set +u
|
||||||
|
new_num="${prefix_map["${num}"]}"
|
||||||
|
set -u
|
||||||
|
if [[ -z "${new_num}" ]]; then
|
||||||
|
new_num="${curr_num}"
|
||||||
|
prefix_map["${num}"]="${new_num}"
|
||||||
|
next_num=$((next_num + 1))
|
||||||
|
curr_num=$(printf "%06d" "${next_num}")
|
||||||
|
fi
|
||||||
|
name="${file:7:-4}"
|
||||||
|
new_file="${new_num}_${name}.sql"
|
||||||
|
echo "Renaming ${old_file} to ${new_file}"
|
||||||
|
mv "${old_file}" "${new_file}"
|
||||||
|
git_add_files+=("${new_file}" "${old_file}")
|
||||||
|
done <<<"${diff_files}"
|
||||||
|
|
||||||
|
# Renumber fixtures if there's a matching migration in this branch (as compared to main).
|
||||||
|
diff_files="$(diff -u <(echo "${main_files}") <(echo "${head_files}") | sed -E -ne 's;^\+(testdata/[^/]*/0.*);\1;p' | sort -n || true)"
|
||||||
|
if [[ -z "${diff_files}" ]]; then
|
||||||
|
echo "No testdata fixtures to rename, skipping."
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
while read -r file; do
|
||||||
|
old_file="${file}"
|
||||||
|
dir=$(dirname "${file}")
|
||||||
|
file=$(basename "${file}")
|
||||||
|
num="${file:0:6}"
|
||||||
|
set +u
|
||||||
|
new_num="${prefix_map["${num}"]}"
|
||||||
|
set -u
|
||||||
|
if [[ -z "${new_num}" ]]; then
|
||||||
|
echo "Skipping ${old_file}, no matching migration in ${SCRIPT_DIR}"
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
name="${file:7:-4}"
|
||||||
|
new_file="${dir}/${new_num}_${name}.sql"
|
||||||
|
echo "Renaming ${old_file} to ${new_file}"
|
||||||
|
mv "${old_file}" "${new_file}"
|
||||||
|
git_add_files+=("${new_file}" "${old_file}")
|
||||||
|
done <<<"${diff_files}"
|
||||||
|
|
||||||
|
git add "${git_add_files[@]}"
|
||||||
|
git status
|
||||||
|
echo "Run 'git commit' to commit the changes."
|
||||||
|
}
|
||||||
|
|
||||||
|
(main "$@")
|
Reference in New Issue
Block a user