#!/bin/bash # # review - Review the diff between expected output and actual output in Units # # Copyright (C) 2016 Masatake YAMATO # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # print_help() { echo Usage: printf " %-20s %-30s %s\n" "$0" "help|--help|-h" "show this message" printf " %-20s %-30s %s\n" "$0" "[list] [-b]" "list failed Units" help_list printf " %-20s %-30s %s\n" "$0" "inspect [-b]" "inspect difference interactively" help_inspect exit $1 } is_known_bug() { [[ $1 == *.b ]] return $? } do_list () { local d local n local a local including_known_bugs for a in "$@"; do case $a in (-b) including_known_bugs=-b ;; (-*) echo "unknown option: ${a}" 1>&2 exit 1 ;; (*) echo "unexpected argument ${a}" 1>&2 exit 1 ;; esac done for d in $(find Units -name "DIFF.tmp"); do n=$(dirname "$d") if (( ! is_known_bug $(basename "$n") ) || [[ -n ${including_known_bugs} ]] ) \ && [[ -e "$n"/expected.tags ]]; then echo ${n#Units/} fi done } help_list() { printf " %-20s %-30s %s\n" "" "-b" "list .b (known bug) marked cases" } inspect_cmd_accept () { local from=./Units/$1/FILTERED.tmp local to=./Units/$1/expected.tags local r if [[ ! -e "${from}" ]]; then echo "./Units/$1/FILTERED.tmp is not found" 1>&2 echo "Remove DIFF.tmp?" read -p "[Y/n] " if [[ "$REPLY" == Y ]]; then rm ./Units/$t/DIFF.tmp echo "Removed: DIFF.tmp" r=1 else echo "Kept: DIFF.tmp" r=0 fi return $r fi echo "Do you really want do following shell command?" echo echo " mv \"$from\"" '\' echo " \"$to\" " echo read -p "[Y/n] " if [[ "$REPLY" == Y ]]; then mv "$from" "$to" echo "Renamed: $from => $to" r=0 echo "Remove DIFF.tmp, too?" read -p "[Y/n] " if [[ "$REPLY" == Y ]]; then rm ./Units/$t/DIFF.tmp echo "Removed: DIFF.tmp" else echo "Kept: DIFF.tmp" fi else echo "Aborted" r=1 fi return $r } inspect_cmd_skip () { echo "SKIPPING $1" 1>&2 } inspect_cmd_show_generic () { local tcase=$1 local file=$2 shift 2 local f=./Units/${tcase}/${file} if [[ -r "$f" ]]; then "$@" "$f" else echo "No ${file}" 1>&2 fi echo '---' echo '# ' "$f" } inspect_cmd_show_diff () { local cmd=cat if which colordiff > /dev/null; then cmd=colordiff fi inspect_cmd_show_generic $1 DIFF.tmp cat | ${cmd} } inspect_show_args_ctags () { inspect_cmd_show_generic $1 args.ctags cat } pygmentize_or_cat () { if which pygmentize > /dev/null; then pygmentize -O "style=colorful,linenos=1" $1 2>/dev/null || cat -n $1 else cat -n $1 fi } inspect_show_input () { local tcase=$1 inspect_cmd_show_generic $tcase $(basename ./Units/${tcase}/input.*) pygmentize_or_cat } inspect_cmd_quit () { echo "BYE" 1>&2 exit 0 } inspect_cmd_unknown() { echo "unknown command: $REPLY" 1>&2 echo "Just return to show menu" 1>&2 } help_inspect () { printf " %-20s %-30s %s\n" "" "-b" "inspect .b (known bug) marked cases" } do_inspect () { local a local t local r local next local including_known_bugs for a in "$@"; do case $a in (-b) including_known_bugs=-b ;; (-*) echo "unknown option: ${a}" 1>&2 exit 1 ;; (*) echo "unexpected argument ${a}" 1>&2 exit 1 ;; esac done for t in $(do_list ${including_known_bugs}); do next=0 PS3="[[ $t ]]? " select r in 'ccept' 'kip' 'iff' 'show args.tags' 'show nput' 'uit'; do case $r in (accept) if inspect_cmd_accept "$t"; then next=1 fi ;; (skip) inspect_cmd_skip "$t" next=1 ;; (diff) inspect_cmd_show_diff "$t" ;; (quit) inspect_cmd_quit ;; ("show args.ctags") inspect_show_args_ctags "$t" ;; ("show input") inspect_show_input "$t" ;; (*) case $REPLY in (a|accept) if inspect_cmd_accept "$t"; then next=1 fi ;; (!|s|skip) inspect_cmd_skip "$t" next=1 ;; (=|d|diff) inspect_cmd_show_diff "$t" ;; (q|quit) inspect_cmd_quit ;; (c|A|args.ctags) inspect_show_args_ctags "$t" ;; (i|input) inspect_show_input "$t" ;; (*) inspect_cmd_unknown ;; esac ;; esac if [[ $next == 1 ]]; then break fi done done } main () { local action while [[ $# -gt 0 ]]; do case $1 in (help|--help|-h) print_help 0 ;; (list) action=$1 shift break ;; (inspect) action=$1 shift break ;; (*) print_help 1 1>&2 ;; esac done if [[ -z "$action" ]]; then action=list fi if ! [[ -d ./Units ]]; then echo "$0: cannot find ./Units directory" 1>&2 exit 1 fi do_${action} "$@" } main "$@"