Skip to content

feat: lab3 complete - ENE212-0070/2022 #23

feat: lab3 complete - ENE212-0070/2022

feat: lab3 complete - ENE212-0070/2022 #23

name: Check Lab 3 Submission
on:
pull_request:
branches: [main]
workflow_dispatch:
permissions:
contents: read
jobs:
check-submission:
name: Validate submission
runs-on: ubuntu-latest
steps:
- name: Checkout PR branch
uses: actions/checkout@v4
- name: Setup PHP 8.2
uses: shivammathur/setup-php@v2
with:
php-version: '8.2'
coverage: none
- name: Check required files are present
id: files
run: |
MISSING=()
for f in lab3_task1.php lab3_task2.php lab3_task3.php lab3_task4.php; do
if [ ! -f "$f" ] && [ ! -f "starter/$f" ]; then
MISSING+=("$f")
fi
done
if [ ${#MISSING[@]} -gt 0 ]; then
echo "status=fail" >> $GITHUB_OUTPUT
echo "::error::Missing required files: ${MISSING[*]}"
else
echo "status=pass" >> $GITHUB_OUTPUT
echo "::notice::All required files found"
fi
- name: PHP syntax check
id: syntax
run: |
ERRORS=()
for f in lab3_task1.php lab3_task2.php lab3_task3.php lab3_task4.php; do
TARGET=""
[ -f "$f" ] && TARGET="$f"
[ -f "starter/$f" ] && TARGET="starter/$f"
if [ -n "$TARGET" ]; then
if ! php -l "$TARGET" > /dev/null 2>&1; then
ERRORS+=("$TARGET")
php -l "$TARGET" || true
fi
fi
done
if [ ${#ERRORS[@]} -gt 0 ]; then
echo "status=fail" >> $GITHUB_OUTPUT
echo "::error::PHP syntax errors in: ${ERRORS[*]}"
else
echo "status=pass" >> $GITHUB_OUTPUT
echo "::notice::All files pass PHP syntax check"
fi
- name: Check file headers for student info
id: headers
run: |
MISSING_HEADERS=()
for f in lab3_task1.php lab3_task2.php lab3_task3.php lab3_task4.php; do
TARGET=""
[ -f "$f" ] && TARGET="$f"
[ -f "starter/$f" ] && TARGET="starter/$f"
if [ -n "$TARGET" ]; then
if ! grep -qi "@student" "$TARGET"; then
MISSING_HEADERS+=("$TARGET")
fi
if grep -qi "\[Your Reg Number\]" "$TARGET"; then
MISSING_HEADERS+=("$TARGET (placeholder not replaced)")
fi
fi
done
if [ ${#MISSING_HEADERS[@]} -gt 0 ]; then
echo "status=warn" >> $GITHUB_OUTPUT
echo "::warning::Headers missing or incomplete in: ${MISSING_HEADERS[*]}"
else
echo "status=pass" >> $GITHUB_OUTPUT
echo "::notice::File headers look good"
fi
- name: Check commit message convention
id: commits
run: |
LATEST_MSG=$(git log --oneline -1 HEAD | sed 's/^[a-f0-9]* //')
echo "Latest commit: $LATEST_MSG"
if echo "$LATEST_MSG" | grep -Eqi "feat:|fix:|lab3"; then
echo "status=pass" >> $GITHUB_OUTPUT
echo "::notice::Commit message format OK"
else
echo "status=warn" >> $GITHUB_OUTPUT
echo "::warning::Commit message should follow: feat: lab3 complete - REGNO/YEAR"
fi
- name: Check TODO stubs have been worked on
id: stubs
run: |
UNTOUCHED=0
for f in lab3_task1.php lab3_task2.php lab3_task3.php lab3_task4.php; do
TARGET=""
[ -f "$f" ] && TARGET="$f"
[ -f "starter/$f" ] && TARGET="starter/$f"
if [ -n "$TARGET" ]; then
TODO_COUNT=$(grep -c "TODO:.*your code here" "$TARGET" || true)
UNTOUCHED=$((UNTOUCHED + TODO_COUNT))
fi
done
if [ "$UNTOUCHED" -gt 0 ]; then
echo "status=warn" >> $GITHUB_OUTPUT
echo "::warning::$UNTOUCHED untouched TODO stub(s) found"
else
echo "status=pass" >> $GITHUB_OUTPUT
echo "::notice::No blank TODO stubs found"
fi
- name: Write results to Job Summary
if: always()
run: |
F="${{ steps.files.outputs.status }}"
S="${{ steps.syntax.outputs.status }}"
H="${{ steps.headers.outputs.status }}"
C="${{ steps.commits.outputs.status }}"
T="${{ steps.stubs.outputs.status }}"
files_r=$( [ "$F" != "fail" ] && echo "✅" || echo "❌" )
syntax_r=$( [ "$S" != "fail" ] && echo "✅" || echo "❌" )
headers_r=$( [ "$H" = "pass" ] && echo "✅" || echo "⚠️" )
commits_r=$( [ "$C" = "pass" ] && echo "✅" || echo "⚠️" )
stubs_r=$( [ "$T" = "pass" ] && echo "✅" || echo "⚠️" )
if [ "$S" != "fail" ] && [ "$F" != "fail" ]; then
BADGE="🟢 Ready for review"
else
BADGE="🔴 Issues found — student must fix before deadline"
fi
cat >> $GITHUB_STEP_SUMMARY << EOF
## ICS 2371 Lab 3 — Automated Check Results
**$BADGE**
| Check | Result | Marks at stake |
|---|---|---|
| Required files present | $files_r | 2 |
| PHP syntax valid | $syntax_r | 3 |
| File headers with reg number | $headers_r | 1 |
| Commit message format | $commits_r | 1 |
| TODO stubs worked on | $stubs_r | 2 |
| PR template filled | _(check manually)_ | 1 |
> ✅ pass · ⚠️ warning (marks may be deducted) · ❌ fail
>
> Review the Files changed tab and confirm final marks after the deadline.
EOF
- name: Fail job if critical checks failed
if: always()
run: |
F="${{ steps.files.outputs.status }}"
S="${{ steps.syntax.outputs.status }}"
if [ "$F" = "fail" ] || [ "$S" = "fail" ]; then
echo "Critical checks failed — files missing or PHP syntax errors present"
exit 1
fi
echo "All critical checks passed"