#!/bin/bash # SPDX-License-Identifier: MIT # SPDX-FileCopyrightText: Copyright 2023 SUSE LLC set -e # config options PR_SRC_USER= PR_PROJECT= PR_REPO= TOKEN= # command line only verbose=0 cfg_file= ################### requestfile=$(mktemp gitea-pulls.XXXXXX) tmpfile=$(mktemp gitea-pulls.XXXXXX) cleanup() { rm -f "$requestfile" "$tmpfile" } trap cleanup EXIT helpandquit() { cat <<-EOF Usage: $0 [OPTIONS] OPTIONS: --verbsoe verbose -h help screen EOF exit 0 } log_info() { [ "$verbose" -gt 0 ] || return 0 echo "$@" } d(){ local retval=0 # Bash makes it a bit annoying to read the output of a different FD into a variable, it # only supports reading stdout by itself. So redirect 3 to stdout and 1 to the real stdout. exec {stdoutfd}>&1 result="$(dialog --backtitle "Gita Pull requests" --output-fd 3 "$@" 3>&1 1>&${stdoutfd})" || retval=$? # Word splitting makes it necessary to use eval here. eval "exec ${stdoutfd}>&-" return "$retval" } # Given the number of total item pairs, outputs the number of items to display at once menuheight() { local height=$(($1 / 2)) [ "$height" -le "$dh_menu" ] || height="$dh_menu" echo "$height" } stty_size() { set -- $(stty size) LINES="$1" COLUMNS="$2" # stty size can return zero when not ready or # its a serial console if [ "$COLUMNS" = "0" ] || [ "$LINES" = "0" ]; then LINES=24 COLUMNS=80 fi dh_menu=$((LINES-15)) dh_text=$((LINES-5)) } stty_size getopttmp=$(getopt -o hc:v --long help,config:,verbose -n "${0##*/}" -- "$@") eval set -- "$getopttmp" while true ; do case "$1" in -h|--help) helpandquit; shift ;; -v|--verbose) verbose=$((++verbose)); shift ;; -c|--config) cfg_file="$2"; shift 2 ;; --) shift ; break ;; *) echo "Internal error!" ; exit 1 ;; esac done # shellcheck disable=SC1090 . "${cfg_file:-.settings}" needed=(PR_SRC_USER PR_PROJECT PR_REPO TOKEN) for i in "${needed[@]}"; do eval test -n "\"\$$i\"" || { echo "The following settings are mandatory: ${needed[*]}"; exit 1; } done request() { local urlpart="$1" shift curl -s -f "https://gitea.opensuse.org/api/v1/repos/$PR_PROJECT/$PR_REPO$urlpart" \ -H "accept: application/json" \ -H "Authorization: token $TOKEN" \ -H "Content-Type: application/json" "$@" } fetch_requests() { request "/pulls?state=open" > "$requestfile" } fetch_requests while true; do list=() while read -r number _branch _cid owner title; do list+=("$number" "$owner: $title") done < <(jq '.[]|[((.number|tostring)), .head.ref, .head.sha, .head.repo.owner.login, .title]|join(" ")' -r < "$requestfile") if [ "${#list}" = 0 ]; then d --msgbox "No pull requests in $PR_PROJECT/$PR_REPO" 0 0 exit 0 fi d --no-hot-list --menu "$PR_PROJECT/$PR_REPO pull requests" 0 0 "$(menuheight ${#list[@]})" "${list[@]}" || exit 1 prno="$result" while true; do list=(raw raw diff diff merge merge close close) d --no-tags --menu "$PR_PROJECT/$PR_REPO #$prno" 0 0 "$(menuheight ${#list[@]})" "${list[@]}" || break action="$result" case "$action" in raw) jq ".[]|select(.number==$prno)" < "$requestfile" > "$tmpfile" d --textbox "$tmpfile" 0 0 ;; diff) request "/pulls/$prno.diff" > "$tmpfile" d --textbox "$tmpfile" 0 0 ;; merge) request "/pulls/$prno/merge" -d '{ "do": "merge", "delete_branch_after_merge": true}' | jq > "$tmpfile" d --textbox "$tmpfile" 0 0 fetch_requests break ;; close) request "/pulls/$prno" -d '{ "state": "closed"}' -X PATCH | jq > "$tmpfile" d --textbox "$tmpfile" 0 0 fetch_requests break ;; esac done done