#!/bin/bash #### #### Todo: #### - change line color based on the selected radio button #### - support collapsing lines per color/category (show/hide for each) #### - add category "next" and see if the prompt can handle that (eg: d3e379b3) #### - produce multiple lists on output (per category) allowing to save batches #### die() { [ "$#" -eq 0 ] || echo "$*" >&2 exit 1 } err() { echo "$*" >&2 } quit() { [ "$#" -eq 0 ] || echo "$*" exit 0 } #### Main USAGE="Usage: ${0##*/} [ -h ] [ -b 'bkp_list' ] patch..." MYSELF="$0" GITURL="http://git.haproxy.org/?p=haproxy.git;a=commitdiff;h=" ISSUES="https://github.com/haproxy/haproxy/issues/" BKP="" while [ -n "$1" -a -z "${1##-*}" ]; do case "$1" in -h|--help) quit "$USAGE" ;; -b) BKP="$2"; shift 2 ;; *) die "$USAGE" ;; esac done PATCHES=( "$@" ) if [ ${#PATCHES[@]} = 0 ]; then die "$USAGE" fi # BKP is a space-delimited list of 8-char commit IDs, we'll # assign them to the local bkp[] associative array. declare -A bkp for cid in $BKP; do bkp[$cid]=1 done # some colors BG_B="#e0e0e0" BT_N="gray"; BG_N="white" BT_U="#00e000"; BG_U="#e0ffe0" BT_W="#0060ff"; BG_W="#e0e0ff" BT_Y="red"; BG_Y="#ffe0e0" echo "" cat <<- EOF EOF echo "" echo -n "Show:" echo -n " B (${#bkp[*]}) " echo -n " N (0) " echo -n " U (0) " echo -n " W (0) " echo -n " Y (0) " echo -n " (B=show backported, N=no/drop, U=uncertain, W=wait/next, Y=yes/pick" echo ")

" echo "" echo "" seq_num=1; do_check=1; review=0; for patch in "${PATCHES[@]}"; do # try to retrieve the patch's numbering (0001-9999) pnum="${patch##*/}" pnum="${pnum%%[^0-9]*}" id=$(sed -ne 's/^#id: \(.*\)/\1/p' "$patch") resp=$(grep -v ^llama "$patch" | sed -ne '/^Explanation:/,$p' | sed -z 's/\n[\n]*/\n/g' | sed -z 's/\([^. ]\)\n\([A-Z]\)/\1.\n\2/' | tr '\012' ' ') resp="${resp#Explanation:}"; while [ -n "$resp" -a -z "${resp##[ .]*}" ]; do resp="${resp#[ .]}" done respl=$(echo -- "$resp" | tr 'A-Z' 'a-z') if [[ "${respl}" =~ (conclusion|verdict)[:\ ][^.]*yes ]]; then verdict=yes elif [[ "${respl}" =~ (conclusion|verdict)[:\ ][^.]*wait ]]; then verdict=wait elif [[ "${respl}" =~ (conclusion|verdict)[:\ ][^.]*no ]]; then verdict=no elif [[ "${respl}" =~ (conclusion|verdict)[:\ ][^.]*uncertain ]]; then verdict=uncertain elif [[ "${respl}" =~ (\"wait\"|\"yes\"|\"no\"|\"uncertain\")[^\"]*$ ]]; then # last word under quotes in the response, sometimes happens as # in 'thus I would conclude "no"'. verdict=${BASH_REMATCH[1]} else verdict=uncertain fi verdict="${verdict//[\"\',;:. ]}" verdict=$(echo -n "$verdict" | tr '[A-Z]' '[a-z]') # There are two formats for the ID line: # - old: #id: cid subject # - new: #id: cid author date subject # We can detect the 2nd one as the date starts with a series of digits # followed by "-" then an upper case letter (eg: "18-Dec23"). set -- $id cid="$1" author="" date="" if [ -n "$3" ] && [ -z "${3##[1-9]-[A-Z]*}" -o -z "${3##[0-3][0-9]-[A-Z]*}" ]; then author="$2" date="$3" subj="${id#$cid $author $date }" else subj="${id#$cid }" fi if [ -z "$cid" ]; then echo "ERROR: commit ID not found in patch $pnum: $patch" >&2 continue fi echo "" echo -n "" # HTMLify subject and summary subj="${subj//&/&}"; subj="${subj///>}"; resp="${resp//&/&}"; resp="${resp///>}"; # turn "#XXXX" to a link to an issue resp=$(echo "$resp" | sed -e "s|#\([0-9]\{1,5\}\)|#\1|g") # put links to commit IDs resp=$(echo "$resp" | sed -e "s|\([0-9a-f]\{8,40\}\)|\1|g") echo -n "" echo -n "" echo -n "" echo -n "" echo -n "" echo "" echo ((seq_num++)) # if this patch was already backported, make the review start on the next if [ -n "${bkp[$cid]}" ]; then review=$seq_num do_check=1 else do_check= fi done echo "" echo "
All
CIDSubjectVerdict
N U W Y
Reason
$seq_num
" echo -n "
$cid${date:+
$date}
${pnum:+$pnum }$subj${author:+
$author
}
" echo -n "" echo -n "" echo -n "" echo -n "" echo -n "$resp
New
CIDSubjectVerdict
N U W Y
Reason
" echo "

" echo "

Output:

" echo "" echo "

" echo "" echo ""