#!/bin/bash export UNITS_DIR="${1:-examples/}" export FOUND_UNITS=/tmp/found_units trap 'rm -f "$FOUND_UNITS.sortme"' EXIT declare -A dir_totals function initialize_counters() { total_successes=0 total_failures=0 } function analyze_files() { cat /dev/null > $FOUND_UNITS.sortme find "${UNITS_DIR}" -name "*.metta.html" -type f > $FOUND_UNITS while read -r file; do process_file "$file" done < $FOUND_UNITS rm $FOUND_UNITS sort_and_calculate_totals cat $FOUND_UNITS.sortme } function process_file() { local file="$1" local current_successes current_failures relative_path basename github_link directory current_successes=$(get_current_successes "$file") current_failures=$(get_current_failures "$file") [ -z "$current_successes" ] && current_successes=0 [ -z "$current_failures" ] && current_failures=0 relative_path=$(echo "$file" | sed 's/^\.\///' | sed -e 's|examples|reports|g' -e 's|-reports|-examples|g') basename=$(basename $relative_path) basename=${basename%.*} directory=$(dirname $relative_path) github_link="${base_url}${relative_path}" printf "|%-5s|%-5s|%-35s|%-130s|\n" " $current_successes" " $current_failures" " ${basename}" "[$relative_path]($github_link)" >> $FOUND_UNITS.sortme accumulate_totals "$directory" $current_successes $current_failures } function accumulate_totals() { local directory=$1 local current_successes=$2 local current_failures=$3 while [ "$directory" != "." ]; do dir_totals["$directory,success"]=$(( ${dir_totals["$directory,success"]} + current_successes )) dir_totals["$directory,failure"]=$(( ${dir_totals["$directory,failure"]} + current_failures )) if [[ $directory == *""* ]]; then total_successes=$((total_successes + current_successes)) total_failures=$((total_failures + current_failures)) fi directory=$(dirname "$directory") done } function get_current_successes() { local file="$1" # First, try getting the successes count using get_current_successes1 local count_from_successes1=$(get_current_successes1 "$file") # Check if the count from get_current_successes1 is greater than zero if (( count_from_successes1 > 0 )); then echo "$count_from_successes1" return fi # If not, proceed with the original logic relative_path=$(echo "$file" | sed 's/^\.\///' | sed -e 's|examples|reports|g' -e 's|-reports|-examples|g') basename=$(basename "$relative_path") basename=${basename%.*} echo $(grep "$basename" /tmp/SHARED.UNITS | grep -c "| PASS |") } function get_current_failures() { local file="$1" # First, try getting the failures count using get_current_failures1 local count_from_failures1=$(get_current_failures1 "$file") # Check if the count from get_current_failures1 is greater than zero if (( count_from_failures1 > 0 )); then echo "$count_from_failures1" return fi # If not, proceed with the original logic local file="$1" relative_path=$(echo "$file" | sed 's/^\.\///' | sed -e 's|examples|reports|g' -e 's|-reports|-examples|g') basename=$(basename "$relative_path") basename=${basename%.*} echo $(grep "$basename" /tmp/SHARED.UNITS | grep -c "| FAIL |") } function get_current_successes1() { local file="$1" cat "$file" | sed 's/\x1b\[[0-9;]*m//g' | grep 'Successes:' | awk -F: '{sum += $2} END {print sum}' } function get_current_failures1() { local file="$1" cat "$file" | sed 's/\x1b\[[0-9;]*m//g' | grep 'Failures:' | awk -F: '{sum += $2} END {print sum}' } function sort_and_calculate_totals() { sort -t'|' -k3,3nr -k2,2nr -k4,4 -o $FOUND_UNITS.sortme $FOUND_UNITS.sortme awk -F'|' 'NR>1{print ( $3+$2 ) ( $2-$3 >= 0 ? $2-$3 : $3-$2 ) ,$0}' FOUND_UNITS.sortme | sort -n | cut -f3- -d' ' > FOUND_UNITS.sorted mv FOUND_UNITS.sorted FOUND_UNITS.sortme print_report } function print_report() { local percent_successes="$1" echo "# Bugs in MeTTaLog" > PASS_FAIL.md echo "" >> PASS_FAIL.md echo "| Pass | Fail |Percent| Directory |" >> PASS_FAIL.md echo "|------|------|-------|--------------------------------------------------|" >> PASS_FAIL.md ( for key in "${!dir_totals[@]}"; do if [[ $key == *",success" ]]; then directory=${key%,success} success=${dir_totals[$key]} failure=${dir_totals["$directory,failure"]} total=$((success + failure)) if [ $total -ne 0 ]; then percent=$(( 100 * success / total )) else percent=0 fi # Center aligning the numbers field_width=6 # 6 characters wide for Pass and Fail columns percent_width=7 # 7 characters wide for Percent column success_padding=$(( (field_width + ${#success}) / 2 )) failure_padding=$(( (field_width + ${#failure}) / 2 )) percent_padding=$(( (percent_width + ${#percent}) / 2 )) printf "|%${field_width}s|%${field_width}s|%${percent_width}s|%-50s|\n" \ "$success" "$failure" "$percent%" " $directory - " fi done ) | sort -t'_' -k3,3r -k2,2 >> PASS_FAIL.md echo "" >> PASS_FAIL.md cat PASS_FAIL.md echo "
Expand for Core Summaries" >> PASS_FAIL.md echo "" >> PASS_FAIL.md echo "|Pass |Fail |File |GitHub Link |" >> PASS_FAIL.md echo "|-----|-----|-----------------------------------|----------------------------------------------------------------------------------------------------------------------------------|" >> PASS_FAIL.md cat $FOUND_UNITS.sortme >> PASS_FAIL.md echo "" >> PASS_FAIL.md echo "
" >> PASS_FAIL.md } function main() { if [[ ! -d "$UNITS_DIR" ]]; then echo "Error: Provided UNITS_DIR '$UNITS_DIR' is not a directory or does not exist." >&2 exit 1 fi base_url="https://htmlpreview.github.io/?https://raw.githubusercontent.com/logicmoo/hyperon-wam/main/" initialize_counters analyze_files } main