xref: /Universal-ctags/misc/review (revision 95e1755d31c626ac21df6551840ac4b375a571d6)
13231fccaSMasatake YAMATO#!/bin/bash
23132643bSMasatake YAMATO#
33132643bSMasatake YAMATO# review - Review the diff between expected output and actual output in Units
43132643bSMasatake YAMATO#
53132643bSMasatake YAMATO# Copyright (C) 2016 Masatake YAMATO
63132643bSMasatake YAMATO#
73132643bSMasatake YAMATO# This program is free software; you can redistribute it and/or modify
83132643bSMasatake YAMATO# it under the terms of the GNU General Public License as published by
93132643bSMasatake YAMATO# the Free Software Foundation; either version 2 of the License, or
103132643bSMasatake YAMATO# (at your option) any later version.
113132643bSMasatake YAMATO#
123132643bSMasatake YAMATO# This program is distributed in the hope that it will be useful,
133132643bSMasatake YAMATO# but WITHOUT ANY WARRANTY; without even the implied warranty of
143132643bSMasatake YAMATO# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
153132643bSMasatake YAMATO# GNU General Public License for more details.
163132643bSMasatake YAMATO#
173132643bSMasatake YAMATO# You should have received a copy of the GNU General Public License
183132643bSMasatake YAMATO# along with this program.  If not, see <http://www.gnu.org/licenses/>.
193132643bSMasatake YAMATO#
203132643bSMasatake YAMATO
213132643bSMasatake YAMATOprint_help()
223132643bSMasatake YAMATO{
233132643bSMasatake YAMATO    echo Usage:
243132643bSMasatake YAMATO    printf "	%-20s %-30s %s\n" "$0" "help|--help|-h" "show this message"
253d7805faSMasatake YAMATO    printf "	%-20s %-30s %s\n" "$0" "[list] [-b]" "list failed Units and Tmain"
263132643bSMasatake YAMATO    help_list
273132643bSMasatake YAMATO    printf "	%-20s %-30s %s\n" "$0" "inspect [-b]" "inspect difference interactively"
283132643bSMasatake YAMATO    help_inspect
293132643bSMasatake YAMATO    exit $1
303132643bSMasatake YAMATO}
313132643bSMasatake YAMATO
323132643bSMasatake YAMATOis_known_bug()
333132643bSMasatake YAMATO{
343132643bSMasatake YAMATO    [[ $1 == *.b ]]
353132643bSMasatake YAMATO    return $?
363132643bSMasatake YAMATO}
373132643bSMasatake YAMATO
383132643bSMasatake YAMATOdo_list ()
393132643bSMasatake YAMATO{
403132643bSMasatake YAMATO    local d
413132643bSMasatake YAMATO    local n
423132643bSMasatake YAMATO    local a
433132643bSMasatake YAMATO    local including_known_bugs
443132643bSMasatake YAMATO
453132643bSMasatake YAMATO    for a in "$@"; do
463132643bSMasatake YAMATO	case $a in
473132643bSMasatake YAMATO	    (-b)
483132643bSMasatake YAMATO		including_known_bugs=-b
493132643bSMasatake YAMATO		;;
503132643bSMasatake YAMATO	    (-*)
513132643bSMasatake YAMATO		echo "unknown option: ${a}" 1>&2
523132643bSMasatake YAMATO		exit 1
533132643bSMasatake YAMATO		;;
543132643bSMasatake YAMATO	    (*)
553132643bSMasatake YAMATO		echo "unexpected argument ${a}" 1>&2
563132643bSMasatake YAMATO		exit 1
573132643bSMasatake YAMATO		;;
583132643bSMasatake YAMATO	esac
593132643bSMasatake YAMATO    done
603132643bSMasatake YAMATO
613132643bSMasatake YAMATO    for d in $(find Units -name "DIFF.tmp"); do
623132643bSMasatake YAMATO	n=$(dirname "$d")
633132643bSMasatake YAMATO	if (( ! is_known_bug $(basename "$n") ) || [[ -n ${including_known_bugs} ]] ) \
643132643bSMasatake YAMATO	       && [[ -e "$n"/expected.tags ]]; then
653d7805faSMasatake YAMATO	    echo ${n}
663132643bSMasatake YAMATO	fi
673132643bSMasatake YAMATO    done
683d7805faSMasatake YAMATO
6960f5c196SMasatake YAMATO    for d in $(find Tmain -name "*-diff.txt"); do
703d7805faSMasatake YAMATO	n=$(dirname "$d")
713d7805faSMasatake YAMATO	echo ${n}
723d7805faSMasatake YAMATO    done | sort -u
733132643bSMasatake YAMATO}
743132643bSMasatake YAMATO
753132643bSMasatake YAMATOhelp_list()
763132643bSMasatake YAMATO{
773132643bSMasatake YAMATO    printf "	%-20s %-30s %s\n" "" "-b" "list .b (known bug) marked cases"
783132643bSMasatake YAMATO}
793132643bSMasatake YAMATO
803d7805faSMasatake YAMATOunits_inspect_cmd_accept ()
813132643bSMasatake YAMATO{
823132643bSMasatake YAMATO    local from=./Units/$1/FILTERED.tmp
833132643bSMasatake YAMATO    local to=./Units/$1/expected.tags
843132643bSMasatake YAMATO    local r
853132643bSMasatake YAMATO
863132643bSMasatake YAMATO    if [[ ! -e "${from}" ]]; then
873132643bSMasatake YAMATO	echo "./Units/$1/FILTERED.tmp is not found" 1>&2
883132643bSMasatake YAMATO	echo "Remove DIFF.tmp?"
893132643bSMasatake YAMATO	read -p "[Y/n] "
903132643bSMasatake YAMATO	if [[ "$REPLY" == Y ]]; then
913132643bSMasatake YAMATO	    rm ./Units/$t/DIFF.tmp
923132643bSMasatake YAMATO	    echo "Removed: DIFF.tmp"
933132643bSMasatake YAMATO	    r=1
943132643bSMasatake YAMATO	else
953132643bSMasatake YAMATO	    echo "Kept: DIFF.tmp"
963132643bSMasatake YAMATO	    r=0
973132643bSMasatake YAMATO	fi
983132643bSMasatake YAMATO	return $r
993132643bSMasatake YAMATO    fi
1003132643bSMasatake YAMATO
1013132643bSMasatake YAMATO    echo "Do you really want do following shell command?"
1023132643bSMasatake YAMATO    echo
1033132643bSMasatake YAMATO    echo "   mv \"$from\"" '\'
1043132643bSMasatake YAMATO    echo "      \"$to\" "
1053132643bSMasatake YAMATO    echo
1063132643bSMasatake YAMATO    read -p "[Y/n] "
1073132643bSMasatake YAMATO
1083132643bSMasatake YAMATO    if [[ "$REPLY" == Y ]]; then
1093132643bSMasatake YAMATO	mv "$from" "$to"
1103132643bSMasatake YAMATO	echo "Renamed: $from => $to"
1113132643bSMasatake YAMATO	r=0
1123132643bSMasatake YAMATO
1133132643bSMasatake YAMATO	echo "Remove DIFF.tmp, too?"
1143132643bSMasatake YAMATO	read -p "[Y/n] "
1153132643bSMasatake YAMATO	if [[ "$REPLY" == Y ]]; then
1163132643bSMasatake YAMATO	    rm ./Units/$t/DIFF.tmp
1173132643bSMasatake YAMATO	    echo "Removed: DIFF.tmp"
1183132643bSMasatake YAMATO	else
1193132643bSMasatake YAMATO	    echo "Kept: DIFF.tmp"
1203132643bSMasatake YAMATO	fi
1213132643bSMasatake YAMATO    else
1223132643bSMasatake YAMATO	echo "Aborted"
1233132643bSMasatake YAMATO	r=1
1243132643bSMasatake YAMATO    fi
1253132643bSMasatake YAMATO
1263132643bSMasatake YAMATO    return $r
1273132643bSMasatake YAMATO}
1283132643bSMasatake YAMATO
1293d7805faSMasatake YAMATOunits_inspect_cmd_skip ()
1303132643bSMasatake YAMATO{
1313132643bSMasatake YAMATO    echo "SKIPPING $1" 1>&2
1323132643bSMasatake YAMATO}
1333132643bSMasatake YAMATO
13455859611SMasatake YAMATOinspect_cmd_show_generic ()
135235ae073SMasatake YAMATO{
136235ae073SMasatake YAMATO    local tcase=$1
137235ae073SMasatake YAMATO    local file=$2
138207aa9c4SMasatake YAMATO    shift 2
139235ae073SMasatake YAMATO    local f=./Units/${tcase}/${file}
140235ae073SMasatake YAMATO
141235ae073SMasatake YAMATO    if [[ -r "$f" ]]; then
142207aa9c4SMasatake YAMATO	"$@" "$f"
143235ae073SMasatake YAMATO    else
144235ae073SMasatake YAMATO	echo "No ${file}" 1>&2
145235ae073SMasatake YAMATO    fi
146235ae073SMasatake YAMATO    echo '---'
147235ae073SMasatake YAMATO    echo '# ' "$f"
148235ae073SMasatake YAMATO}
149235ae073SMasatake YAMATO
1503d7805faSMasatake YAMATOunits_inspect_cmd_show_diff ()
1513132643bSMasatake YAMATO{
152207aa9c4SMasatake YAMATO    local cmd=cat
153207aa9c4SMasatake YAMATO
154bde63928SMasatake YAMATO    if which colordiff > /dev/null 2>&1; then
155207aa9c4SMasatake YAMATO	cmd=colordiff
15646a81651SMasatake YAMATO    elif which pygmentize > /dev/null 2>&1; then
15746a81651SMasatake YAMATO	cmd="pygmentize -l diff"
158207aa9c4SMasatake YAMATO    fi
159207aa9c4SMasatake YAMATO
160207aa9c4SMasatake YAMATO    inspect_cmd_show_generic $1 DIFF.tmp cat | ${cmd}
161235ae073SMasatake YAMATO}
162235ae073SMasatake YAMATO
1633d7805faSMasatake YAMATOunits_inspect_show_args_ctags ()
164235ae073SMasatake YAMATO{
165207aa9c4SMasatake YAMATO    inspect_cmd_show_generic $1 args.ctags cat
166207aa9c4SMasatake YAMATO}
167207aa9c4SMasatake YAMATO
168207aa9c4SMasatake YAMATOpygmentize_or_cat ()
169207aa9c4SMasatake YAMATO{
170c0b8e967SMasatake YAMATO    # It seems that pygmentize ignores the empty lines at the head of input.
171*95e1755dSMasatake YAMATO    if [ -z "$(head -1 $1)" ]; then
172c0b8e967SMasatake YAMATO	cat -n $1
173c0b8e967SMasatake YAMATO    elif which pygmentize > /dev/null 2>&1; then
174207aa9c4SMasatake YAMATO	pygmentize -O "style=colorful,linenos=1" $1 2>/dev/null || cat -n $1
175207aa9c4SMasatake YAMATO    else
176207aa9c4SMasatake YAMATO	cat -n $1
177207aa9c4SMasatake YAMATO    fi
178207aa9c4SMasatake YAMATO}
179207aa9c4SMasatake YAMATO
1803d7805faSMasatake YAMATOunits_inspect_show_input ()
181207aa9c4SMasatake YAMATO{
182207aa9c4SMasatake YAMATO    local tcase=$1
183207aa9c4SMasatake YAMATO
184207aa9c4SMasatake YAMATO    inspect_cmd_show_generic $tcase $(basename ./Units/${tcase}/input.*) pygmentize_or_cat
1853132643bSMasatake YAMATO}
1863132643bSMasatake YAMATO
18717555e08SMasatake YAMATOunits_inspect_show_expected_tags ()
18817555e08SMasatake YAMATO{
18917555e08SMasatake YAMATO    local tcase=$1
19017555e08SMasatake YAMATO
19117555e08SMasatake YAMATO    (
19217555e08SMasatake YAMATO	shopt -s extglob
19317555e08SMasatake YAMATO	inspect_cmd_show_generic $tcase $(basename ./Units/${tcase}/expected.tags?(-*)) "cat" "-n"
19417555e08SMasatake YAMATO    )
19517555e08SMasatake YAMATO}
19617555e08SMasatake YAMATO
1973132643bSMasatake YAMATOinspect_cmd_quit ()
1983132643bSMasatake YAMATO{
1993132643bSMasatake YAMATO    echo "BYE" 1>&2
2003132643bSMasatake YAMATO    exit 0
2013132643bSMasatake YAMATO}
2023132643bSMasatake YAMATO
2033132643bSMasatake YAMATOinspect_cmd_unknown()
2043132643bSMasatake YAMATO{
2053132643bSMasatake YAMATO    echo "unknown command: $REPLY" 1>&2
2063132643bSMasatake YAMATO    echo "Just return to show menu" 1>&2
2073132643bSMasatake YAMATO}
2083132643bSMasatake YAMATO
2093132643bSMasatake YAMATOhelp_inspect ()
2103132643bSMasatake YAMATO{
2113132643bSMasatake YAMATO    printf "	%-20s %-30s %s\n" "" "-b" "inspect .b (known bug) marked cases"
2123132643bSMasatake YAMATO}
2133132643bSMasatake YAMATO
2143d7805faSMasatake YAMATOdo_units_inspect()
2153d7805faSMasatake YAMATO{
2163d7805faSMasatake YAMATO    local next=0
2173d7805faSMasatake YAMATO    local r
2183d7805faSMasatake YAMATO    local t=$1
2193d7805faSMasatake YAMATO
220e6545656SMasatake YAMATO    select r in '<a>ccept' '<s>kip (or <n>)' '<S>hell' '<d>iff' 'show args.<c>tags' 'show <i>nput' '<e>xpected tags' '<q>uit'; do
2213d7805faSMasatake YAMATO	case $r-$REPLY in
2223d7805faSMasatake YAMATO	    ("<a>ccept"-*|-a)
2233d7805faSMasatake YAMATO		if units_inspect_cmd_accept "$t"; then
2243d7805faSMasatake YAMATO		    next=1
2253d7805faSMasatake YAMATO		fi
2263d7805faSMasatake YAMATO		;;
227e6545656SMasatake YAMATO	    ("<s>kip (or <n>)"-*|-s|-!|-skip|-n|-next)
2283d7805faSMasatake YAMATO		units_inspect_cmd_skip "$t"
2293d7805faSMasatake YAMATO		next=1
2303d7805faSMasatake YAMATO		;;
231da615e85SMasatake YAMATO	    ("<S>hell"-*|-S)
232da615e85SMasatake YAMATO		inspect_cmd_shell Units "$t"
233da615e85SMasatake YAMATO		;;
2343d7805faSMasatake YAMATO	    ("<d>iff"-*|-d|-=|-diff)
2353d7805faSMasatake YAMATO		units_inspect_cmd_show_diff "$t"
2363d7805faSMasatake YAMATO		;;
2373d7805faSMasatake YAMATO	    ("<q>uit"-*|-q|-quit)
2383d7805faSMasatake YAMATO		inspect_cmd_quit
2393d7805faSMasatake YAMATO		;;
2403d7805faSMasatake YAMATO	    ("show args.<c>tags"-*|-c|-A|-args.ctags)
2413d7805faSMasatake YAMATO		units_inspect_show_args_ctags "$t"
2423d7805faSMasatake YAMATO		;;
2433d7805faSMasatake YAMATO	    ("show <i>nput"-*|-i|-input)
2443d7805faSMasatake YAMATO		units_inspect_show_input "$t"
2453d7805faSMasatake YAMATO		;;
24617555e08SMasatake YAMATO	    ("<e>xpected tags"-*|-e|-expected.tags)
24717555e08SMasatake YAMATO		units_inspect_show_expected_tags "$t"
24817555e08SMasatake YAMATO		;;
2493d7805faSMasatake YAMATO	    (*)
2503d7805faSMasatake YAMATO		inspect_cmd_unknown
2513d7805faSMasatake YAMATO		;;
2523d7805faSMasatake YAMATO	esac
2533d7805faSMasatake YAMATO	if [[ $next == 1 ]]; then
2543d7805faSMasatake YAMATO	    break
2553d7805faSMasatake YAMATO	fi
2563d7805faSMasatake YAMATO    done
2573d7805faSMasatake YAMATO}
2583d7805faSMasatake YAMATO
259da615e85SMasatake YAMATOfunction inspect_cmd_shell
2603d7805faSMasatake YAMATO{
261da615e85SMasatake YAMATO    local prefix=$1
262da615e85SMasatake YAMATO    local t=$2
2633d7805faSMasatake YAMATO
2643d7805faSMasatake YAMATO    (
265da615e85SMasatake YAMATO	cd $prefix/$t
2663d7805faSMasatake YAMATO	PS1="review> " bash
2673d7805faSMasatake YAMATO    )
2683d7805faSMasatake YAMATO}
2693d7805faSMasatake YAMATO
27004e38cf4SMasatake YAMATOfunction tmain_inspect_run
27104e38cf4SMasatake YAMATO{
27204e38cf4SMasatake YAMATO    local t=$1
27304e38cf4SMasatake YAMATO    make tmain UNITS=$(basename $t .d)
27404e38cf4SMasatake YAMATO}
27504e38cf4SMasatake YAMATO
2763d7805faSMasatake YAMATOdo_tmain_inspect()
2773d7805faSMasatake YAMATO{
2783d7805faSMasatake YAMATO    local next=0
2793d7805faSMasatake YAMATO    local r
2803d7805faSMasatake YAMATO    local t=$1
2813d7805faSMasatake YAMATO
28204e38cf4SMasatake YAMATO    select r in '<n>ext' '<S>hell' '<R>un' '<q>uit'; do
2833d7805faSMasatake YAMATO	case $r-$REPLY in
2843d7805faSMasatake YAMATO	    ("<n>ext"-*|-n)
2853d7805faSMasatake YAMATO		next=1
2863d7805faSMasatake YAMATO		;;
2873d7805faSMasatake YAMATO	    ("<S>hell"-*|-S)
288da615e85SMasatake YAMATO		inspect_cmd_shell Tmain "$t"
2893d7805faSMasatake YAMATO		;;
29004e38cf4SMasatake YAMATO	    ("<R>un"-*|-R)
29104e38cf4SMasatake YAMATO		tmain_inspect_run "$t"
29204e38cf4SMasatake YAMATO		;;
2933d7805faSMasatake YAMATO	    ("<q>uit"-*|-q|-quit)
2943d7805faSMasatake YAMATO		inspect_cmd_quit
2953d7805faSMasatake YAMATO		;;
2963d7805faSMasatake YAMATO	esac
2973d7805faSMasatake YAMATO	if [[ $next == 1 ]]; then
2983d7805faSMasatake YAMATO	    break
2993d7805faSMasatake YAMATO	fi
3003d7805faSMasatake YAMATO    done
3013d7805faSMasatake YAMATO}
3023d7805faSMasatake YAMATO
303c0f2a596SMasatake YAMATOcount ()
304c0f2a596SMasatake YAMATO{
305c0f2a596SMasatake YAMATO    echo $#
306c0f2a596SMasatake YAMATO}
307c0f2a596SMasatake YAMATO
3083132643bSMasatake YAMATOdo_inspect ()
3093132643bSMasatake YAMATO{
3103132643bSMasatake YAMATO    local a
3113d7805faSMasatake YAMATO    local t0
3123132643bSMasatake YAMATO    local t
3133132643bSMasatake YAMATO    local including_known_bugs
3143132643bSMasatake YAMATO
3153132643bSMasatake YAMATO    for a in "$@"; do
3163132643bSMasatake YAMATO	case $a in
3173132643bSMasatake YAMATO	    (-b)
3183132643bSMasatake YAMATO		including_known_bugs=-b
3193132643bSMasatake YAMATO		;;
3203132643bSMasatake YAMATO	    (-*)
3213132643bSMasatake YAMATO		echo "unknown option: ${a}" 1>&2
3223132643bSMasatake YAMATO		exit 1
3233132643bSMasatake YAMATO		;;
3243132643bSMasatake YAMATO	    (*)
3253132643bSMasatake YAMATO		echo "unexpected argument ${a}" 1>&2
3263132643bSMasatake YAMATO		exit 1
3273132643bSMasatake YAMATO		;;
3283132643bSMasatake YAMATO	esac
3293132643bSMasatake YAMATO    done
3303132643bSMasatake YAMATO
331c0f2a596SMasatake YAMATO    local T=$(do_list ${including_known_bugs});
332c0f2a596SMasatake YAMATO    local total=$(count $T)
333c0f2a596SMasatake YAMATO    local i=1
334c0f2a596SMasatake YAMATO    for t0 in $T; do
335c0f2a596SMasatake YAMATO	PS3="[$i/$total [ $t0 ]]? "
336c0f2a596SMasatake YAMATO	i=$(( i + 1 ))
3373d7805faSMasatake YAMATO	t=${t0#Units/}
3383d7805faSMasatake YAMATO	t=${t#Tmain/}
3393d7805faSMasatake YAMATO
3403d7805faSMasatake YAMATO	if [[ "$t0" =~ ^Units ]]; then
3413d7805faSMasatake YAMATO	    do_units_inspect "$t"
3423d7805faSMasatake YAMATO	else
3433d7805faSMasatake YAMATO	    do_tmain_inspect "$t"
3443132643bSMasatake YAMATO	fi
3453132643bSMasatake YAMATO    done
3463132643bSMasatake YAMATO}
3473132643bSMasatake YAMATO
3483132643bSMasatake YAMATOmain ()
3493132643bSMasatake YAMATO{
3503132643bSMasatake YAMATO    local action
3513132643bSMasatake YAMATO
3523132643bSMasatake YAMATO    while [[ $# -gt 0 ]]; do
3533132643bSMasatake YAMATO	case $1 in
3543132643bSMasatake YAMATO	    (help|--help|-h)
3553132643bSMasatake YAMATO		print_help 0
3563132643bSMasatake YAMATO		;;
3573132643bSMasatake YAMATO	    (list)
3583132643bSMasatake YAMATO		action=$1
3593132643bSMasatake YAMATO		shift
3603132643bSMasatake YAMATO		break
3613132643bSMasatake YAMATO		;;
3623132643bSMasatake YAMATO	    (inspect)
3633132643bSMasatake YAMATO		action=$1
3643132643bSMasatake YAMATO		shift
3653132643bSMasatake YAMATO		break
3663132643bSMasatake YAMATO		;;
3673132643bSMasatake YAMATO	    (*)
3683132643bSMasatake YAMATO		print_help 1 1>&2
3693132643bSMasatake YAMATO		;;
3703132643bSMasatake YAMATO	esac
3713132643bSMasatake YAMATO    done
3723132643bSMasatake YAMATO
3733132643bSMasatake YAMATO    if  [[ -z "$action" ]]; then
37422f1c59bSMasatake YAMATO	action=inspect
3753132643bSMasatake YAMATO    fi
3763132643bSMasatake YAMATO
3773132643bSMasatake YAMATO    if ! [[ -d ./Units ]]; then
3783132643bSMasatake YAMATO	echo "$0: cannot find ./Units directory" 1>&2
3793132643bSMasatake YAMATO	exit 1
3803132643bSMasatake YAMATO    fi
3813132643bSMasatake YAMATO
3823d7805faSMasatake YAMATO    if ! [[ -d ./Tmain ]]; then
3833d7805faSMasatake YAMATO	echo "$0: cannot find ./Tmain directory" 1>&2
3843d7805faSMasatake YAMATO	exit 1
3853d7805faSMasatake YAMATO    fi
3863d7805faSMasatake YAMATO
3873132643bSMasatake YAMATO    do_${action} "$@"
3883132643bSMasatake YAMATO}
3893132643bSMasatake YAMATO
3903132643bSMasatake YAMATOmain "$@"
391