4343
4444# Process each Python version's test results
4545# Handle both direct artifact structure and nested structure
46+ # Use nullglob to handle case where no directories match
47+ shopt -s nullglob
4648for artifact_dir in " $ARTIFACTS_DIR " /* /; do
4749if [! -d " $artifact_dir " ]; then
4850continue
@@ -62,30 +64,47 @@ for artifact_dir in "$ARTIFACTS_DIR"/*/; do
6264continue
6365fi
6466
67+ # Initialize variables with defaults
68+ total_tests=0
69+ passed_tests=0
70+ failed_tests=0
71+ total_assertions=0
72+ passed_assertions=0
73+ python_ver=" unknown"
74+ vim_ver=" unknown"
75+ failed_test_names=" "
76+
6577# Parse JSON (using jq if available, otherwise use basic parsing)
6678if command -v jq& > /dev/null; then
67- total_tests=$( jq -r' .total_tests // 0' " $results_file " )
68- passed_tests=$( jq -r' .passed_tests // 0' " $results_file " )
69- failed_tests=$( jq -r' .failed_tests // 0' " $results_file " )
70- total_assertions=$( jq -r' .total_assertions // 0' " $results_file " )
71- passed_assertions=$( jq -r' .passed_assertions // 0' " $results_file " )
72- python_ver=$( jq -r' .python_version // "unknown"' " $results_file " )
73- vim_ver=$( jq -r' .vim_version // "unknown"' " $results_file " )
79+ total_tests=$( jq -r' .total_tests // 0' " $results_file " 2> /dev/null || echo " 0 " )
80+ passed_tests=$( jq -r' .passed_tests // 0' " $results_file " 2> /dev/null || echo " 0 " )
81+ failed_tests=$( jq -r' .failed_tests // 0' " $results_file " 2> /dev/null || echo " 0 " )
82+ total_assertions=$( jq -r' .total_assertions // 0' " $results_file " 2> /dev/null || echo " 0 " )
83+ passed_assertions=$( jq -r' .passed_assertions // 0' " $results_file " 2> /dev/null || echo " 0 " )
84+ python_ver=$( jq -r' .python_version // "unknown"' " $results_file " 2> /dev/null || echo " unknown " )
85+ vim_ver=$( jq -r' .vim_version // "unknown"' " $results_file " 2> /dev/null || echo " unknown " )
7486
7587# Get failed test names
7688 failed_test_names=$( jq -r' .results.failed[]?' " $results_file " 2> /dev/null| tr' \n' ' ,' | sed' s/,$//' || echo " " )
7789else
7890# Fallback: basic parsing without jq
79- total_tests=$( grep -o' "total_tests":[0-9]*' " $results_file " | grep -o' [0-9]*' || echo " 0" )
80- passed_tests=$( grep -o' "passed_tests":[0-9]*' " $results_file " | grep -o' [0-9]*' || echo " 0" )
81- failed_tests=$( grep -o' "failed_tests":[0-9]*' " $results_file " | grep -o' [0-9]*' || echo " 0" )
82- total_assertions=$( grep -o' "total_assertions":[0-9]*' " $results_file " | grep -o' [0-9]*' || echo " 0" )
83- passed_assertions=$( grep -o' "passed_assertions":[0-9]*' " $results_file " | grep -o' [0-9]*' || echo " 0" )
91+ total_tests=$( grep -o' "total_tests":[0-9]*' " $results_file " 2> /dev/null | grep -o' [0-9]*' | head -1 || echo " 0" )
92+ passed_tests=$( grep -o' "passed_tests":[0-9]*' " $results_file " 2> /dev/null | grep -o' [0-9]*' | head -1 || echo " 0" )
93+ failed_tests=$( grep -o' "failed_tests":[0-9]*' " $results_file " 2> /dev/null | grep -o' [0-9]*' | head -1 || echo " 0" )
94+ total_assertions=$( grep -o' "total_assertions":[0-9]*' " $results_file " 2> /dev/null | grep -o' [0-9]*' | head -1 || echo " 0" )
95+ passed_assertions=$( grep -o' "passed_assertions":[0-9]*' " $results_file " 2> /dev/null | grep -o' [0-9]*' | head -1 || echo " 0" )
8496 python_ver=" Python$python_version "
8597 vim_ver=" unknown"
8698 failed_test_names=" "
8799fi
88100
101+ # Ensure variables are numeric
102+ total_tests=$(( total_tests+ 0 ))
103+ passed_tests=$(( passed_tests+ 0 ))
104+ failed_tests=$(( failed_tests+ 0 ))
105+ total_assertions=$(( total_assertions+ 0 ))
106+ passed_assertions=$(( passed_assertions+ 0 ))
107+
89108 TOTAL_PYTHON_VERSIONS=$(( TOTAL_PYTHON_VERSIONS+ 1 ))
90109 TOTAL_TESTS=$(( TOTAL_TESTS+ total_tests))
91110 TOTAL_PASSED=$(( TOTAL_PASSED+ passed_tests))
@@ -106,6 +125,17 @@ for artifact_dir in "$ARTIFACTS_DIR"/*/; do
106125fi
107126
108127# Add version summary to markdown
128+ # Ensure all variables are set before using them in heredoc
129+ python_version=" ${python_version:- unknown} "
130+ status_icon=" ${status_icon:- ❓} "
131+ status_text=" ${status_text:- UNKNOWN} "
132+ python_ver=" ${python_ver:- unknown} "
133+ vim_ver=" ${vim_ver:- unknown} "
134+ passed_tests=" ${passed_tests:- 0} "
135+ total_tests=" ${total_tests:- 0} "
136+ passed_assertions=" ${passed_assertions:- 0} "
137+ total_assertions=" ${total_assertions:- 0} "
138+
109139 cat>> " $OUTPUT_FILE " << EOF
110140
111141### Python$python_version $status_icon
133163fi
134164done
135165
166+ # Check if we processed any artifacts
167+ if [" $TOTAL_PYTHON_VERSIONS " -eq 0 ]; then
168+ echo " " >> " $OUTPUT_FILE "
169+ echo " ⚠️ **Warning**: No test artifacts were processed." >> " $OUTPUT_FILE "
170+ echo " This may indicate that test jobs haven't completed yet or artifacts failed to upload." >> " $OUTPUT_FILE "
171+ echo " " >> " $OUTPUT_FILE "
172+ echo " Debug information:" >> " $OUTPUT_FILE "
173+ echo " - Artifacts directory:\` $ARTIFACTS_DIR \` " >> " $OUTPUT_FILE "
174+ echo " - Directory exists:$( [-d " $ARTIFACTS_DIR " ]&& echo " yes" || echo " no" ) " >> " $OUTPUT_FILE "
175+ if [-d " $ARTIFACTS_DIR " ]; then
176+ echo " - Contents:" >> " $OUTPUT_FILE "
177+ ls -la" $ARTIFACTS_DIR " >> " $OUTPUT_FILE " 2>&1 || true
178+ fi
179+ fi
180+
136181# Add overall summary
182+ # Ensure all summary variables are set
183+ TOTAL_PYTHON_VERSIONS=" ${TOTAL_PYTHON_VERSIONS:- 0} "
184+ TOTAL_TESTS=" ${TOTAL_TESTS:- 0} "
185+ TOTAL_PASSED=" ${TOTAL_PASSED:- 0} "
186+ TOTAL_FAILED=" ${TOTAL_FAILED:- 0} "
187+ TOTAL_ASSERTIONS=" ${TOTAL_ASSERTIONS:- 0} "
188+ PASSED_ASSERTIONS=" ${PASSED_ASSERTIONS:- 0} "
189+ ALL_PASSED=" ${ALL_PASSED:- true} "
190+
137191cat>> " $OUTPUT_FILE " << EOF
138192
139193---