vimwiki

Personal wiki for vim
git clone https://github.com/vimwiki/vimwiki.git
Log | Files | Refs | README | LICENSE

commit 57107c7c560580a4f6a28f65ac85ea9ee70fd3e8
parent 72d02207b021b968a185ed68b949c7a15f82c3d4
Author: Tinmarino <tinmarino@gmail.com>
Date:   Wed, 22 Mar 2023 01:17:20 -0300

CI: Lint run_test: all in function

Diffstat:
Mtest/run_tests.sh | 342++++++++++++++++++++++++++++++++++++++++++++-----------------------------------
1 file changed, 191 insertions(+), 151 deletions(-)

diff --git a/test/run_tests.sh b/test/run_tests.sh @@ -1,22 +1,20 @@ #!/usr/bin/env bash +# shellcheck disable=SC2155 # Declare and assign separately to avoid masking return values -# credit to https://github.com/w0rp/ale for script ideas and the color vader -# output function. +: ' +Vimwiki vader test script -# Say Hi -echo -en "Starting $(basename "$0") for VimWiki\n" -start_time=$(date +%s) +Credit: https://github.com/w0rp/ale for script ideas and the color vader output function. +' -red='\033[0;31m' -green='\033[0;32m' -nc='\033[0m' +# Capture start time now +declare -g start_time=$(date +%s) + +# Declare color helper +declare -g red='\033[0;31m' +declare -g green='\033[0;32m' +declare -g nc='\033[0m' -# For windows: Cmder bash is appending busybox to the path and -# and a smlll vim is included, so that override the windows path vim -if [[ -v OLD_PATH ]]; then - echo "Setting path from OLD_PATH : $OLD_PATH" - export PATH="$OLD_PATH" -fi printHelp() { cat << ' EOF' | sed -e 's/^ //' @@ -67,31 +65,34 @@ print_versions() { run_vader() { # Run Vader tests echo -e "\nStarting Vader tests." - local err=0 + local -i res=0 + local opt='' current_test='' + echo "Tin 1 $g_file_test" # Parse tests files to execute - if [[ -z $file_test ]]; then - res="test/*" + if [[ -z "$g_file_test" ]]; then + opt="test/*" else - read -ra TEST <<< "$file_test" - for i in "${TEST[@]}"; do + read -ra TEST <<< "$g_file_test" + for current_test in "${TEST[@]}"; do # Remove quotes - i=${i#\'} - i=${i%\'} - if [[ "$i" == *"*"* ]]; then - res="$res test/${i}" - elif [[ -f "$i" ]]; then - res="$res test/${i}" - elif [[ -f "${i}.vader" ]]; then - res="$res test/${i}.vader" + current_test=${current_test#\'} + current_test=${current_test%\'} + if [[ "$current_test" == *"*"* ]]; then + opt+=" test/${current_test}" + elif [[ -f "$current_test" ]]; then + opt+=" test/${current_test}" + elif [[ -f "${current_test}.vader" ]]; then + opt+=" test/${current_test}.vader" else - printf "WARNING: Test \"%s\" not found.\n", "$i" + printf "WARNING: Test \"%s\" not found.\n", "$current_test" fi done fi + echo "Tin 2 $opt" # Run tests for each specified version - for v in $vers; do + for v in $g_vers; do echo -e "\n\nRunning version: $v" echo -e "=============================" @@ -101,14 +102,14 @@ run_vader() { home_save="$HOME" # Create temporary root - mkdir -p "$tmp_dir/vader_wiki" - mkdir -p "$tmp_dir/vader_wiki/home" - mkdir -p "$tmp_dir/vader_wiki/home/test" - mkdir -p "$tmp_dir/vader_wiki/testplugin" + mkdir -p "$g_tmp_dir/vader_wiki" + mkdir -p "$g_tmp_dir/vader_wiki/home" + mkdir -p "$g_tmp_dir/vader_wiki/home/test" + mkdir -p "$g_tmp_dir/vader_wiki/testplugin" # Set vars - export ROOT="$tmp_dir/vader_wiki/" - export HOME="$tmp_dir/vader_wiki/home" + export ROOT="$g_tmp_dir/vader_wiki/" + export HOME="$g_tmp_dir/vader_wiki/home" vim="vim" vim_opt="-u ~/test/vimrc" else @@ -134,11 +135,11 @@ run_vader() { # flags=(--rm -v "$PWD/../:/testplugin" -v "$PWD/../test:/home" -w /testplugin vimwiki) echo -e "\nCopying resources to $ROOT" # Copy testplugin - cp -rf "$wiki_path/"* "$ROOT/testplugin/" + cp -rf "$g_wiki_path/"* "$ROOT/testplugin/" # Copy home - cp -rf "$script_path/"* "$HOME/test/" + cp -rf "$g_script_path/"* "$HOME/test/" # Copy rtp.vim - cp -rf "$script_path/resources/rtp_local.vim" "$ROOT/rtp.vim" + cp -rf "$g_script_path/resources/rtp_local.vim" "$ROOT/rtp.vim" # Copy vader <- internet echo 'Cloning Vader (git, do not care the fatal)' git clone --depth 10 https://github.com/junegunn/vader.vim /tmp/vader_wiki/vader 2>&1 @@ -146,77 +147,80 @@ run_vader() { # Run batch of tests # shellcheck disable=SC2086,SC2206 - if [[ "$res" != "" ]]; then + if [[ "$opt" != "" ]]; then if [[ "$v" == "local" ]]; then - pushd "$tmp_dir/vader_wiki/testplugin" \ + pushd "$g_tmp_dir/vader_wiki/testplugin" \ || echo 'Warning pushd testplugin failed' # Run the tests fcmd(){ - $vim $vim_opt "+Vader! ${res}" 2>&1 \ + $vim $vim_opt "+Vader! ${opt}" 2>&1 \ | vader_filter | vader_color return ${PIPESTATUS[1]} } - echo -e "\nStarting Batch Vim/Vader:\n<- $res\n" + echo -e "\nStarting Batch Vim/Vader:\n<- $opt\n" type fcmd | sed -n '/^ /{s/^ //p}' | sed '$s/.*/&;/' ; shift ; fcmd; ret=$? - err=$(( err + ret )) echo -e "\nReturned Batch Vim/Vader -> $ret" + (( res |= ret )) - popd \ - || echo 'Warning popd also failed' + popd || echo 'Warning popd failed' else # In docker fcmd() { docker run -a stderr -e "VADER_OUTPUT_FILE=/dev/stderr" \ - "${flags[@]}" "$v" $vim_opt "+Vader! ${res}" 2>&1 \ + "${flags[@]}" "$v" $vim_opt "+Vader! ${opt}" 2>&1 \ | vader_filter | vader_color return ${PIPESTATUS[1]} } - echo -e "\nStarting Batch Vim/Vader:\n<- $res\n" + echo -e "\nStarting Batch Vim/Vader with: $opt\n" type fcmd | sed -n '/^ /{s/^ //p}' | sed '$s/.*/&;/' ; shift ; fcmd; ret=$? - err=$(( err + ret )) echo -e "\nReturned Batch Docker/Vim/Vader -> $ret : ${PIPESTATUS[*]}" + (( res |= ret )) fi fi #set +o pipefail # Restore what must (I know it should be refactored in a while) - if [[ "$v" == "local" ]]; then + if [[ "$v" == local ]]; then export HOME=$home_save fi done - return $err + return "$res" } run_vint() { - local err=0 - cmd="vint -s . && vint -s test/vimrc" - if echo "$vers" | grep "local" > /dev/null; then - echo -e "\nRunning Vint: $cmd : in $wiki_path" - pushd "$wiki_path" > /dev/null \ + local -i res=0 + + local cmd="vint -s . && vint -s test/vimrc" + + if echo "$g_vers" | grep "local" > /dev/null; then + echo -e "\nRunning Vint: $cmd : in $g_wiki_path" + pushd "$g_wiki_path" > /dev/null \ || echo 'Warning pushd wiki_path failed' $cmd - err=$(( err | $? )) + res=$(( res | $? )) popd > /dev/null \ || echo 'Warning popd also failed' else echo -e "\nStarting Docker container and running Vint: $cmd" docker run -a stdout "${flags[@]}" bash -c "$cmd" - err=$(( err | $? )) + res=$(( res | $? )) fi - return $err + + return "$res" } vader_filter() { # Filter Vader Stdout - local err=0 + local -i res=0 # Keep indentation local IFS='' + while read -r REPLY; do # Print only possible error cases if [[ "$REPLY" = *'docker:'* ]] || \ @@ -228,27 +232,28 @@ vader_filter() { [[ "$REPLY" = *'[ DO] (X)'* ]] || \ [[ "$REPLY" = *'[ EXPECT] (X)'* ]]; then echo -e "$red$REPLY$nc" - err=1 + res=1 elif [[ "$REPLY" = *'Success/Total:'* ]]; then success="$(echo -n "$REPLY" | grep -o '[0-9]\+/' | head -n1 | cut -d/ -f1)" total="$(echo -n "$REPLY" | grep -o '/[0-9]\+' | head -n1 | cut -d/ -f2)" if [ "$success" -lt "$total" ]; then - err=1 + res=1 fi echo "$REPLY" - elif [[ "$verbose" != 0 ]]; then + elif [[ "$g_verbose" != 0 ]]; then # just print everything echo "$REPLY" fi done - if [[ "$err" == 1 ]]; then + if (( res == 1 )); then echo -e "\033[0;31m" echo -e "!---------Failed tests detected---------!" echo -e "Run with the '-v' flag for verbose output" echo -e "\033[0m" fi - return $err + + return "$res" } @@ -283,103 +288,138 @@ vader_color() { echo -en "$nc" } -# path of the script, supposing no spaces -script_file="$(dirname "$0")" -script_path="$( realpath "$script_file" )" -wiki_path="$( realpath "$script_path/.." )" -tmp_dir="$(dirname "$(mktemp -u)")" - -# list of vim/nvim versions -vers="$(print_versions)" - -# type of tests to run - vader/vint/all -type="all" -# verbose output flag -verbose=0 - -# only run these tests -file_test="" +parse_argument(){ + : 'Parse user argument' + + # Declare: Path of the script, supposing no spaces + declare -g g_script_file=$(dirname "$0") + declare -g g_script_path=$(realpath "$g_script_file") + declare -g g_wiki_path=$(realpath "$g_script_path/..") + declare -g g_tmp_dir=$(dirname "$(mktemp -u)") + + # Declare: list of vim/nvim versions + declare -g g_vers="$(print_versions)" + + # Declare: type of tests to run - vader/vint/all + declare -g g_type="all" + + # Declare: verbose output flag + declare -g g_verbose=0 + + # Declare: only run these tests + declare -g g_file_test="" + + # Declare: docker flags + declare -g flags=(--rm -v "$PWD/../:/testplugin" -v "$PWD/../test:/home" -w /testplugin vimwiki) + + # Parse all argument options + while getopts ":hvn:lt:f:" opt; do + case ${opt} in + h) + printHelp + ;; + n) + g_vers="$OPTARG" + ;; + v) + g_verbose=1 + ;; + l) + print_versions + ;; + t) + g_type="$OPTARG" + ;; + f) + g_file_test="$OPTARG" + ;; + \?) + echo "Invalid option: $OPTARG" 1>&2 + exit 1 + ;; + :) + echo "Invalid option: $OPTARG requires an argument" 1>&2 + exit 1 + ;; + esac + done + + # Shift out parameters already processed + shift $((OPTIND -1)) + + # Handle error for non-option arguments + if [[ $# -ne 0 ]]; then + echo "Error: Got $# non-option arguments." 1>&2 + exit 1 + fi +} -# docker flags -flags=(--rm -v "$PWD/../:/testplugin" -v "$PWD/../test:/home" -w /testplugin vimwiki) -while getopts ":hvn:lt:f:" opt; do - case ${opt} in - h) - printHelp - ;; - n) - vers="$OPTARG" +execute_test_argument(){ + : 'Execute test according to global variable' + # Global error return of the script + local -i res=0 ret=0 + + # Select and run tests + case $g_type in + vader) + run_vader; ret=$? + echo "Main Vader: returned $ret" + ((res |= ret)) ;; - v) - verbose=1 + vint) + run_vint; ret=$? + echo "Main Vint: returned $ret" + ((res |= ret)) ;; - l) - print_versions + all) + run_vint; ret=$? + echo "Main Vint: returned $ret" + ((res |= ret)) + run_vader; ret=$? + echo "Main Vader: returned $ret" + ((res |= ret)) ;; - t) - type="$OPTARG" - ;; - f) - file_test="$OPTARG" - ;; - \?) - echo "Invalid option: $OPTARG" 1>&2 - exit 1 - ;; - :) - echo "Invalid option: $OPTARG requires an argument" 1>&2 + *) + echo "Error: invalid type - '$g_type'" 1>&2 exit 1 - ;; esac -done + + return "$res" +} -# shift out processed parameters -shift $((OPTIND -1)) -# error handling for non-option arguments -if [[ $# -ne 0 ]]; then - echo "Error: Got $# non-option arguments." 1>&2 - exit 1 -fi +run_test(){ + local -i res=0 -# stop tests on ctrl-c or ctrl-z -trap exit 1 SIGINT SIGTERM - -# Global error return of the script -o_error=0 - -# Select which tests should run -case $type in - vader) - run_vader ; err=$? - echo "Main Vader: returned $err" - o_error=$(( err | o_error )) - ;; - vint) - run_vint ; err=$? - echo "Main Vint: returned $err" - o_error=$(( err | o_error )) - ;; - all) - run_vint ; err=$? - echo "Main Vint: returned $err" - o_error=$(( err | o_error )) - run_vader ; err=$? - echo "Main Vader: returned $err" - o_error=$(( err | o_error )) - ;; - *) - echo "Error: invalid type - '$type'" 1>&2 - exit 1 -esac + # Hi + echo -en "Starting $(basename "$0") for VimWiki\n" + + # Hook ctrl-c or ctrl-z to stop tests + trap exit 1 SIGINT SIGTERM + + # For windows: Cmder bash is appending busybox to the path and + # and a smlll vim is included, so that override the windows path vim + if [[ -v OLD_PATH ]]; then + echo "Setting path from OLD_PATH : $OLD_PATH" + export PATH="$OLD_PATH" + fi + + # WORK + parse_argument "$@"; ((res |= $?)) + execute_test_argument; ((res |= $?)) + + # Print ellapsed time (after calculate it) + end_time=$(date +%s) + sec_time=$((end_time - start_time)) + printf -v script_time '%dh:%dm:%ds' $((sec_time/3600)) $((sec_time%3600/60)) $((sec_time%60)) + echo -ne "Script $(basename "$0"), in $script_time, Returned -> $res\n\n" + + return "$res" +} -# Calcultate time -end_time=$(date +%s) -sec_time=$((end_time - start_time)) -printf -v script_time '%dh:%dm:%ds' $((sec_time/3600)) $((sec_time%3600/60)) $((sec_time%60)) -# Exit -echo -ne "Script $(basename "$0"), in $script_time, Returned -> $o_error\n\n" -exit $o_error +if ! (return 0 2>/dev/null); then + run_test "$@"; exit $? +fi