42 lines
1.7 KiB
Bash
42 lines
1.7 KiB
Bash
#!/bin/sh
|
|
|
|
printf "\e[0Ksection_start:`date +%s`:branch_check[collapsed=false]\r\e[0KChecking for dead branches\n"
|
|
git branch -r | grep -v 'origin/HEAD' | grep -v "origin/$CI_DEFAULT_BRANCH" | while IFS= read remote_branch; do
|
|
remote_branch=$(printf "%s\n" "$remote_branch" | sed 's/^ *//;s/ *$//')
|
|
branch_name=$(printf "%s\n" "$remote_branch" | sed 's|origin/||')
|
|
|
|
# NOT CHECKING
|
|
## Skip old stable branches
|
|
if echo "$branch_name" | grep -q "^gimp-[0-9]-" || [ "$branch_name" = "gnome-2-2" ] || [ "$branch_name" = "gnome-2-4" ]; then
|
|
printf "\033[33m(SKIP)\033[0m: $branch_name is a snapshot of $CI_DEFAULT_BRANCH but no problem\n"
|
|
continue
|
|
fi
|
|
## Skip recently created branches
|
|
if [ "$(git rev-parse "$remote_branch")" = "$(git rev-parse "$CI_COMMIT_SHA")" ]; then
|
|
printf "\033[33m(SKIP)\033[0m: $branch_name is identical to $CI_DEFAULT_BRANCH but no problem\n"
|
|
continue
|
|
fi
|
|
|
|
# CHECKING
|
|
## Check: merge-base
|
|
if git merge-base --is-ancestor "$remote_branch" "$CI_COMMIT_SHA"; then
|
|
printf "\033[31m(ERROR)\033[0m: $branch_name is fully merged into $CI_DEFAULT_BRANCH (via git merge-base)\n"
|
|
touch 'dead_branch'
|
|
continue
|
|
fi
|
|
## Fallback check: cherry
|
|
cherry_output=$(git cherry "$CI_COMMIT_SHA" "$remote_branch")
|
|
if [ -z "$(printf "%s\n" "$cherry_output" | grep '^+')" ]; then
|
|
printf "\033[31m(ERROR)\033[0m: $branch_name is fully merged into $CI_DEFAULT_BRANCH (via git cherry)\n"
|
|
touch 'dead_branch'
|
|
continue
|
|
fi
|
|
done
|
|
|
|
if [ -f "dead_branch" ]; then
|
|
printf " Please delete the merged branches\n"
|
|
exit 1
|
|
else
|
|
printf '(INFO): All branches are organized.\n'
|
|
fi
|
|
printf "\e[0Ksection_end:`date +%s`:branch_check\r\e[0K\n"
|