mirror of
https://github.com/pestphp/pest.git
synced 2026-06-08 04:12:12 +02:00
wip
This commit is contained in:
@ -17,6 +17,7 @@ use Pest\Plugins\Tia\Graph;
|
|||||||
use Pest\Plugins\Tia\JsModuleGraph;
|
use Pest\Plugins\Tia\JsModuleGraph;
|
||||||
use Pest\Plugins\Tia\Recorder;
|
use Pest\Plugins\Tia\Recorder;
|
||||||
use Pest\Plugins\Tia\ResultCollector;
|
use Pest\Plugins\Tia\ResultCollector;
|
||||||
|
use Pest\Plugins\Tia\Storage;
|
||||||
use Pest\Plugins\Tia\TableExtractor;
|
use Pest\Plugins\Tia\TableExtractor;
|
||||||
use Pest\Plugins\Tia\WatchPatterns;
|
use Pest\Plugins\Tia\WatchPatterns;
|
||||||
use Pest\Exceptions\NoAffectedTestsFound;
|
use Pest\Exceptions\NoAffectedTestsFound;
|
||||||
@ -558,6 +559,18 @@ final class Tia implements AddsOutput, HandlesArguments, Terminable
|
|||||||
|
|
||||||
$fingerprint = Fingerprint::compute($projectRoot);
|
$fingerprint = Fingerprint::compute($projectRoot);
|
||||||
|
|
||||||
|
// `--fresh` is meant to be a clean slate: nuke the entire per-project
|
||||||
|
// state dir up front (graph, baseline, worker partials, fingerprint,
|
||||||
|
// JS module cache, coverage marker, etc.). Wiping per-key in code
|
||||||
|
// would leave room for stale entries we forgot about — most
|
||||||
|
// recently, status-7/8 result entries with no `file` that survived
|
||||||
|
// a rebuild and kept tripping `hasUnlocatedFailuresOrErrors()` on
|
||||||
|
// subsequent `--filtered` runs. Safe here because `handleParent`
|
||||||
|
// runs in the parent before any worker is spawned.
|
||||||
|
if ($forceRebuild) {
|
||||||
|
Storage::purge($projectRoot);
|
||||||
|
}
|
||||||
|
|
||||||
$graph = $forceRebuild ? null : $this->loadGraph($projectRoot);
|
$graph = $forceRebuild ? null : $this->loadGraph($projectRoot);
|
||||||
|
|
||||||
if ($graph instanceof Graph) {
|
if ($graph instanceof Graph) {
|
||||||
@ -782,7 +795,7 @@ final class Tia implements AddsOutput, HandlesArguments, Terminable
|
|||||||
if ($graph->hasUnlocatedFailuresOrErrors($this->branch)) {
|
if ($graph->hasUnlocatedFailuresOrErrors($this->branch)) {
|
||||||
$this->output->writeln([
|
$this->output->writeln([
|
||||||
'',
|
'',
|
||||||
' <fg=yellow>TIA</> cached failures/errors exist but this baseline cannot map them to files — running full suite.',
|
' <fg=yellow>TIA</> cached failures/errors exist but this baseline cannot map them to files — running full suite. Re-run with <fg=cyan>--fresh</> to rebuild the baseline.',
|
||||||
'',
|
'',
|
||||||
]);
|
]);
|
||||||
|
|
||||||
|
|||||||
@ -51,6 +51,53 @@ final class Storage
|
|||||||
.DIRECTORY_SEPARATOR.self::projectKey($projectRoot);
|
.DIRECTORY_SEPARATOR.self::projectKey($projectRoot);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Wipes the on-disk state directory for `$projectRoot`. Called by
|
||||||
|
* `--fresh` so a rebuild starts from a truly empty cache: no stale
|
||||||
|
* baseline, no leftover worker partials, no fingerprint, no JS
|
||||||
|
* module cache. Subsequent writes recreate the directory on demand.
|
||||||
|
*
|
||||||
|
* Per-project (project key is part of the path) — sibling projects'
|
||||||
|
* caches under `~/.pest/tia/` are untouched.
|
||||||
|
*/
|
||||||
|
public static function purge(string $projectRoot): void
|
||||||
|
{
|
||||||
|
$dir = self::tempDir($projectRoot);
|
||||||
|
|
||||||
|
if (! is_dir($dir)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
self::removeRecursive($dir);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static function removeRecursive(string $dir): void
|
||||||
|
{
|
||||||
|
$entries = @scandir($dir);
|
||||||
|
|
||||||
|
if ($entries === false) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach ($entries as $entry) {
|
||||||
|
if ($entry === '.' || $entry === '..') {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
$path = $dir.DIRECTORY_SEPARATOR.$entry;
|
||||||
|
|
||||||
|
if (is_dir($path) && ! is_link($path)) {
|
||||||
|
self::removeRecursive($path);
|
||||||
|
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
@unlink($path);
|
||||||
|
}
|
||||||
|
|
||||||
|
@rmdir($dir);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* OS-neutral home directory — `HOME` on Unix, `USERPROFILE` on
|
* OS-neutral home directory — `HOME` on Unix, `USERPROFILE` on
|
||||||
* Windows. Returns null if neither resolves to an existing
|
* Windows. Returns null if neither resolves to an existing
|
||||||
|
|||||||
Reference in New Issue
Block a user