diff --git a/tools/packaging/obs-packaging/wait-obs.sh b/tools/packaging/obs-packaging/wait-obs.sh index 717a3dd6a..fe55e8264 100755 --- a/tools/packaging/obs-packaging/wait-obs.sh +++ b/tools/packaging/obs-packaging/wait-obs.sh @@ -35,41 +35,179 @@ run_in_docker() { fi } +# project information +project="" + +# repo information +repo="" +repo_state="" +repo_code="" + +# package information +package="" +package_code="" +package_details="" + +# packages still building +packages_building=0 + +fail=0 +return=0 +continue=0 + +result_handler() { + # reset project information + project="" + + # reset repo information + repo="" + repo_state="" + repo_code="" + + local IFS=' ' + for i in $1; do + case $(echo $i | cut -d= -f1) in + project) + project=$(echo $i | cut -d= -f2 | tr -d '"') + ;; + + repository) + repo=$(echo $i | cut -d= -f2 | tr -d '"') + ;; + + code) + repo_code=$(echo $i | cut -d= -f2 | tr -d '"') + ;; + + state) + repo_state=$(echo $i | cut -d= -f2 | tr -d '"') + ;; + esac + done + + case "${repo_code}" in + blocked) + continue=1 + ;; + + unresolvable) + fail=1 + ;; + + excluded) + return=1 + ;; + esac +} + +status_handler() { + # reset package information + package="" + package_code="" + package_details="" + + local IFS=' ' + for i in $1; do + case $(echo $i | cut -d= -f1) in + package) + package=$(echo $i | cut -d= -f2 | tr -d '"') + ;; + + code) + package_code=$(echo $i | cut -d= -f2 | tr -d '"') + ;; + esac + done + + case "${package_code}" in + blocked) + continue=1 + ;; + + unresolvable) + fail=1 + ;; + + excluded) + return=1 + ;; + esac +} + +details_handler() { + # reset package details + package_details="$(echo $1 | cut -d\> -f2 | cut -d\< -f1)" + + if [ "$package_details" == "failed" ]; then + fail=1 + osc pr + return + fi + + if [ "$package_details" == "broken" ]; then + fail=1 + return + fi + + if [ "${package_details}" != "succeeded" ] || [ "${package_code}" != "finished" ]; then + packages_building=$((packages_building+1)) + fi +} + +check_repo() { + if [ -z "${repo}" ]; then + return + fi +} + +dump_info() { + echo "package: $package, code: $package_code, details: $package_details" + echo "repository: $repo, state: $repo_state, code: $repo_code" + echo "For more information go to https://build.opensuse.org/package/live_build_log/${project}/${package}/${repo}/$(uname -m)" +} + # Check all project has finshed the build wait_finish_building() { local out while true; do - sleep 10 + sleep 30 out=$(osc api "/build/${project}/_result") - if echo "${out}" | grep '
failed
'; then - echo "Project ${project} has failed packages" - osc pr - exit 1 - fi - if echo "${out}" | grep '
broken
'; then - echo "Project ${project} has broken packages" - exit 1 - fi - if echo "${out}" | grep 'code="blocked"'; then - echo "Project ${project} has blocked packages, waiting" + continue=0 + packages_building=0 + + local IFS=$'\n' + for i in ${out[*]}; do + i="$(echo $i | sed -e 's/^[[:space:]]*//' -e 's/^$//')" + if echo "$i" | egrep -q "^result"; then + result_handler "$i" + elif echo "$i" | egrep -q "^status"; then + status_handler "$i" + elif echo "$i" | egrep -q "^details"; then + details_handler "$i" + fi + + if [ $fail -eq 1 ]; then + echo -n "FAILED: " + dump_info + exit 1 + elif [ $return -eq 1 ]; then + return + elif [ $packages_building -gt 0 ]; then + break + fi + done + + if [ $continue -eq 1 ]; then continue fi - if echo "${out}" | grep 'code="unresolvable"'; then - echo "Project ${project} has unresolvable packages" - exit 1 - fi - if echo "${out}" | grep 'state="building"'; then - echo "Project ${project} is still building, waiting" - continue - fi - if echo "${out}" | grep 'code="excluded"'; then - echo "Project ${project} has excluded packages left, quit waiting" - break - fi - echo "No jobs with building status were found" - echo "${out}" - break + if [ $packages_building -gt 0 ]; then + echo -n "BULDING: " + dump_info + else + echo "FINISHED: SUCCEEDED!" + break + fi done }