|
| 1 | +<?php |
| 2 | + |
| 3 | +declare(strict_types=1); |
| 4 | + |
| 5 | +/** |
| 6 | + * Checks that coverage.xml meets the minimum coverage threshold (default 100%). |
| 7 | + * Exit code 0 if coverage >= threshold, 1 otherwise. |
| 8 | + * |
| 9 | + * Usage: php scripts/check-coverage.php [coverage.xml] [--min-percent=N] |
| 10 | + */ |
| 11 | +$coverageFile = $argv[1] ?? 'coverage.xml'; |
| 12 | +$minPercent = 100; |
| 13 | +foreach (array_slice($argv, 2) as $arg) { |
| 14 | + if (str_starts_with($arg, '--min-percent=')) { |
| 15 | + $minPercent = (int) substr($arg, strlen('--min-percent=')); |
| 16 | + break; |
| 17 | + } |
| 18 | +} |
| 19 | + |
| 20 | +if (!is_file($coverageFile)) { |
| 21 | + fwrite(\STDERR, "Coverage file not found: {$coverageFile}\n"); |
| 22 | + exit(2); |
| 23 | +} |
| 24 | + |
| 25 | +$xml = @simplexml_load_file($coverageFile); |
| 26 | +if ($xml === false) { |
| 27 | + fwrite(\STDERR, "Invalid XML in {$coverageFile}\n"); |
| 28 | + exit(2); |
| 29 | +} |
| 30 | + |
| 31 | +$projectMetrics = $xml->project->metrics; |
| 32 | +if (!$projectMetrics) { |
| 33 | + fwrite(\STDERR, "No project metrics in {$coverageFile}\n"); |
| 34 | + exit(2); |
| 35 | +} |
| 36 | + |
| 37 | +$statements = (int) (string) $projectMetrics['statements']; |
| 38 | +$coveredStatements = (int) (string) $projectMetrics['coveredstatements']; |
| 39 | +$elements = (int) (string) $projectMetrics['elements']; |
| 40 | +$coveredElements = (int) (string) $projectMetrics['coveredelements']; |
| 41 | + |
| 42 | +$stmtPercent = $statements > 0 ? round($coveredStatements / $statements * 100, 2) : 100.0; |
| 43 | +$elemPercent = $elements > 0 ? round($coveredElements / $elements * 100, 2) : 100.0; |
| 44 | + |
| 45 | +echo sprintf( |
| 46 | + 'Coverage: statements %d/%d (%.2f%%), elements %d/%d (%.2f%%)' . \PHP_EOL, |
| 47 | + $coveredStatements, |
| 48 | + $statements, |
| 49 | + $stmtPercent, |
| 50 | + $coveredElements, |
| 51 | + $elements, |
| 52 | + $elemPercent, |
| 53 | +); |
| 54 | + |
| 55 | +if ($stmtPercent < $minPercent || $elemPercent < $minPercent) { |
| 56 | + fwrite(\STDERR, sprintf("Coverage below %d%% threshold.\n", $minPercent)); |
| 57 | + exit(1); |
| 58 | +} |
| 59 | + |
| 60 | +echo "Coverage threshold {$minPercent}% met.\n"; |
| 61 | +exit(0); |
0 commit comments