|
| 1 | +const core = require('@actions/core'); |
| 2 | +const { execSync } = require('child_process'); |
| 3 | +const fs = require('fs'); |
| 4 | +const path = require('path'); |
| 5 | + |
| 6 | + |
| 7 | +async function main() { |
| 8 | + try { |
| 9 | + // 1) Find all Day*.class files in out/src, sorted by day number |
| 10 | + // We'll do something like "ls out/src/Day*.class" + sort -V |
| 11 | + let out = ''; |
| 12 | + try { |
| 13 | + out = execSync('ls out/src/Day*.class 2>/dev/null | sort -V', { |
| 14 | + encoding: 'utf-8', |
| 15 | + }).trim(); |
| 16 | + } catch (e) { |
| 17 | + // Possibly no matching files |
| 18 | + } |
| 19 | + |
| 20 | + const classFiles = out ? out.split('\n') : []; |
| 21 | + if (classFiles.length === 0) { |
| 22 | + console.log('No compiled classes named Day*.class found.'); |
| 23 | + return; |
| 24 | + } |
| 25 | + |
| 26 | + // 2) Prepare a summary table |
| 27 | + const summaryTable = [ |
| 28 | + [ |
| 29 | + { data: 'Day', header: true }, |
| 30 | + { data: 'Class Name', header: true }, |
| 31 | + { data: 'Status', header: true }, |
| 32 | + ], |
| 33 | + ]; |
| 34 | + |
| 35 | + let currentDay = null; |
| 36 | + |
| 37 | + // 3) For each Day*.class, extract the day number, run it, etc. |
| 38 | + for (const filePath of classFiles) { |
| 39 | + // e.g. out/src/Day10.class → Day10 |
| 40 | + const base = path.basename(filePath, '.class'); |
| 41 | + const className = base; // e.g. Day10 |
| 42 | + |
| 43 | + // Extract the day number from "Day10", "Day10Part2", etc. |
| 44 | + const match = className.match(/^Day(\d+)/); |
| 45 | + if (!match) { |
| 46 | + continue; // skip if it doesn't match "DayNN" |
| 47 | + } |
| 48 | + const dayNum = match[1]; |
| 49 | + |
| 50 | + // If day changed, print a console heading |
| 51 | + if (dayNum !== currentDay) { |
| 52 | + currentDay = dayNum; |
| 53 | + const emoji = '🎄🔹🎄'; |
| 54 | + console.log('========================================'); |
| 55 | + console.log(` Day ${dayNum} ${emoji}`); |
| 56 | + console.log('========================================\n'); |
| 57 | + } |
| 58 | + |
| 59 | + console.log(`Running ${className}...`); |
| 60 | + let exitCode = 0; |
| 61 | + let stdout = ''; |
| 62 | + try { |
| 63 | + // Run the class from out/src |
| 64 | + stdout = execSync(`java -cp out/src ${className}`, { encoding: 'utf-8' }); |
| 65 | + } catch (error) { |
| 66 | + exitCode = error.status || 1; |
| 67 | + stdout = error.stdout?.toString() || ''; |
| 68 | + } |
| 69 | + |
| 70 | + console.log(stdout); |
| 71 | + const statusMsg = exitCode === 0 ? '✅ Success' : '❌ Failed'; |
| 72 | + console.log(statusMsg, '\n'); |
| 73 | + |
| 74 | + // Append to summary |
| 75 | + summaryTable.push([ |
| 76 | + `${dayNum} ${dayEmoji[dayNum] || '🔹'}`, |
| 77 | + `\`${className}\``, |
| 78 | + statusMsg, |
| 79 | + ]); |
| 80 | + } |
| 81 | + |
| 82 | + // 4) Write the summary |
| 83 | + await core.summary |
| 84 | + .addHeading('Build & Run Java Files - Summary', 2) |
| 85 | + .addTable(summaryTable) |
| 86 | + .write(); |
| 87 | + |
| 88 | + } catch (err) { |
| 89 | + core.setFailed(`Script error: ${err.message}`); |
| 90 | + } |
| 91 | +} |
| 92 | + |
| 93 | +main(); |
0 commit comments