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