From 65caf2ffcdd34318c83122bb8795c6665bfd9617 Mon Sep 17 00:00:00 2001 From: linsui <2873532-linsui@users.noreply.gitlab.com> Date: Fri, 19 Sep 2025 22:56:16 +0800 Subject: [PATCH] tools/auto-merge.sh: improve --- tools/auto-merge.sh | 25 ++++++++++++------------- tools/merge-autoupdate.sh | 2 +- 2 files changed, 13 insertions(+), 14 deletions(-) diff --git a/tools/auto-merge.sh b/tools/auto-merge.sh index f49739bd89..a9dafbeec6 100755 --- a/tools/auto-merge.sh +++ b/tools/auto-merge.sh @@ -7,26 +7,25 @@ cd "$(dirname "$(dirname "${BASH_SOURCE[0]}")")" mr=$1 glab="glab --repo fdroid/fdroiddata" function retry { + msg=$1 + shift while output=$("$@" 2>&1); [[ $? != 0 ]]; do - echo $output | grep -q "Source branch does not exist" && exit 0 - echo $output | grep -q "this merge request has already been merged" && exit 0 - continue + # Return 1 if there is an error needed to be handled + [[ "$msg" ]] && echo "$output" | grep -qE "$msg" && echo "$output" && return 1 done - echo $output + echo "$output" } echo "Merging..." -while status=$(glab api projects/:id/merge_requests/$mr | jq -r '.detailed_merge_status'); do +while status=$(retry "" glab api projects/:id/merge_requests/$mr | jq -r '.detailed_merge_status'); do if [[ $status = "approvals_syncing" || $status = "checking" ]]; then continue elif [[ $status = "need_rebase" ]]; then echo "Rebasing..." - retry $glab mr rebase $mr --skip-ci + retry "Source branch does not exist|Cannot push to source branch" $glab mr rebase $mr --skip-ci || exit 0 + sleep 2 elif [[ $status = "mergeable" ]]; then - glab api --method PUT projects/:id/merge_requests/$mr/merge 2>&1 > /dev/null - if [[ $? = 0 ]]; then - break - fi + retry "HTTP" glab api --method PUT projects/:id/merge_requests/$mr/merge > /dev/null && break else echo "Failed to merge $mr: $status" exit 0 @@ -34,10 +33,10 @@ while status=$(glab api projects/:id/merge_requests/$mr | jq -r '.detailed_merge done echo "Canceling pipelines..." -merged_commit=$(retry $glab mr view $mr -F json | jq -r 'if .squash then .squash_commit_sha else .sha end') -head_pipelines=$(retry $glab ci list -F json | jq -r 'map(select(.sha == "'$merged_commit'" and (.source == "push" or .source == "merge_request_event")) | .id)[]') +merged_commit=$(retry "" $glab mr view $mr -F json | jq -r 'if .squash then .squash_commit_sha else .sha end') +head_pipelines=$(retry "" $glab ci list -F json | jq -r 'map(select(.sha == "'$merged_commit'" and (.source == "push" or .source == "merge_request_event")) | .id)[]') for pipeline in $head_pipelines; do - retry glab api --method POST --silent projects/:id/pipelines/$pipeline/cancel + retry "" glab api --method POST --silent projects/:id/pipelines/$pipeline/cancel done echo "Done!" diff --git a/tools/merge-autoupdate.sh b/tools/merge-autoupdate.sh index e9d0c13b8f..8b0a719d73 100755 --- a/tools/merge-autoupdate.sh +++ b/tools/merge-autoupdate.sh @@ -13,7 +13,7 @@ function retry { } echo "Fecthing MR list..." -mr_list=$(retry $glab mr list --author checkupdates-bot --per-page 100 -F json | jq -r 'map(.iid)[]') +mr_list=$(retry $glab mr list --author checkupdates-bot --per-page 100 -F json | jq -r 'map(select(.labels | map(. != "waiting-for-upstream") | all) | .iid)[]') for mr in $mr_list; do mr_stat=$(retry $glab mr view $mr -F json) if [[ $(echo $mr_stat | jq -r '.labels | map(. == "fdroid-bot") | any') == "false" ]]; then