diff --git a/src/Plugins/Tia.php b/src/Plugins/Tia.php index 9300a494..1fbed909 100644 --- a/src/Plugins/Tia.php +++ b/src/Plugins/Tia.php @@ -57,7 +57,7 @@ final class Tia implements AddsOutput, HandlesArguments, Terminable /** Sentinel dropped by a recording worker without a usable coverage driver. */ private const string KEY_WORKER_NO_DRIVER_PREFIX = 'worker-no-driver-'; - public const string KEY_COVERAGE_CACHE = 'coverage.bin'; + public const string KEY_COVERAGE_CACHE = 'coverage.bin.gz'; public const string KEY_COVERAGE_MARKER = 'coverage.marker'; diff --git a/src/Plugins/Tia/CoverageMerger.php b/src/Plugins/Tia/CoverageMerger.php index 1f2c2748..6efc5a17 100644 --- a/src/Plugins/Tia/CoverageMerger.php +++ b/src/Plugins/Tia/CoverageMerger.php @@ -34,13 +34,21 @@ final class CoverageMerger $current = self::requireCoverage($reportPath); if ($current instanceof CodeCoverage) { - $state->write(Tia::KEY_COVERAGE_CACHE, serialize($current)); + $state->write(Tia::KEY_COVERAGE_CACHE, self::compress(serialize($current))); } return; } - $cached = self::unserializeCoverage($cachedBytes); + $decoded = self::decompress($cachedBytes); + + if ($decoded === null) { + $state->delete(Tia::KEY_COVERAGE_CACHE); + + return; + } + + $cached = self::unserializeCoverage($decoded); $current = self::requireCoverage($reportPath); if (! $cached instanceof CodeCoverage || ! $current instanceof CodeCoverage) { @@ -59,7 +67,21 @@ final class CoverageMerger $reportPath, 'write(Tia::KEY_COVERAGE_CACHE, $serialised); + $state->write(Tia::KEY_COVERAGE_CACHE, self::compress($serialised)); + } + + private static function compress(string $bytes): string + { + $compressed = @gzencode($bytes); + + return $compressed === false ? $bytes : $compressed; + } + + private static function decompress(string $bytes): ?string + { + $decoded = @gzdecode($bytes); + + return $decoded === false ? null : $decoded; } /**