FIX DeploymentPackageTest git fixture újrahasznosítás és temp takarítás

A temp git repó eddig tesztenként épült újra 12 git processzel, ami Windowson
önmagában ~4 mp volt tesztenként. Mostantól futásonként EGYSZER épül fel, a
tesztek pedig másolatot kapnak róla (0,138 mp másolás + 0,177 mp takarítás).
Minden teszt saját, írható példányon dolgozik, így a "working tree elrontása"
és a builder-tesztek továbbra is írhatnak a repóba.

Mérés a teljes fájlon, azonos gépen, 28/28 zölddel: 384,05 mp -> 268,38 mp.

A régi deploymentCleanup a Windows read-only .git/objects fájljain elbukott és
a hibát csendben elnyelte, ezért árva mappákat hagyott a temp-ben (164 gyűlt
össze). Az új, facade nélküli deploymentDeleteDirectory nem hagy maga után
semmit, és az afterAll a booteolt alkalmazáson kívül is tud takarítani.

A minta útvonalában getmypid() van, hogy a tervezett --parallel futásnál is
processzenként külön mintát használjunk.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
E98Developer 2026-08-17 08:45:05 +02:00
parent 2965f231ce
commit 11918b608d

View File

@ -68,13 +68,34 @@ function deploymentGit(string $path, array $arguments): string
}
/**
* Determinisztikus teszt-repó: átnevezés, törlés, ékezetes fájlnév és migráció is van benne.
* A minta-repó útvonala. A PID azért van benne, hogy párhuzamos futásnál (paratest)
* minden processznek saját mintája legyen.
*/
function deploymentTemplatePath(): string
{
return sys_get_temp_dir().DIRECTORY_SEPARATOR.'deployment-package-minta-'.getmypid();
}
/**
* Determinisztikus minta-repó: átnevezés, törlés, ékezetes fájlnév és migráció is van benne.
*
* A 12 git parancs futásonként EGYSZER fut le - Windowson a processzindítás olyan drága,
* hogy tesztenként újraépítve ez önmagában ~4 mp lenne. A tesztek másolatot kapnak.
*
* @return array{path:string, commits:array<int, string>}
*/
function deploymentTestRepository(): array
function deploymentRepositoryTemplate(): array
{
$path = sys_get_temp_dir().DIRECTORY_SEPARATOR.'deployment-package-test-'.uniqid();
static $template = null;
if ($template !== null) {
return $template;
}
$path = deploymentTemplatePath();
// Egy korábbi, megszakadt futás azonos PID-ű maradványa nem szennyezheti a mintát.
deploymentDeleteDirectory($path);
File::makeDirectory($path.'/app', 0777, true);
File::makeDirectory($path.'/database/migrations', 0777, true);
@ -106,26 +127,66 @@ function deploymentTestRepository(): array
$log = trim(deploymentGit($path, ['log', '--reverse', '--pretty=format:%H']));
// A mintából minden teszt másol, tehát tilos beleírni - a sample hookokat viszont
// felesleges körbemásolni, azokra a git nem támaszkodik.
deploymentDeleteDirectory($path.'/.git/hooks');
return $template = ['path' => $path, 'commits' => explode("\n", $log)];
}
/**
* A teszt saját, írható másolata a mintáról: a builder és a "working tree elrontása"
* tesztek beleírnak a repóba, ezért nem oszthatnak közös példányt.
*
* @return array{path:string, commits:array<int, string>}
*/
function deploymentTestRepository(): array
{
$template = deploymentRepositoryTemplate();
$path = sys_get_temp_dir().DIRECTORY_SEPARATOR.'deployment-package-test-'.uniqid();
File::copyDirectory($template['path'], $path);
Config::set('deployment.repo_path', $path);
Config::set('deployment.output_path', $path.DIRECTORY_SEPARATOR.'_kimenet');
return ['path' => $path, 'commits' => explode("\n", $log)];
return ['path' => $path, 'commits' => $template['commits']];
}
/**
* Facade nélküli törlés: az afterAll a booteolt alkalmazáson kívül is fut.
*/
function deploymentDeleteDirectory(string $path): void
{
if (! is_dir($path)) {
return;
}
$items = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator($path, FilesystemIterator::SKIP_DOTS),
RecursiveIteratorIterator::CHILD_FIRST
);
foreach ($items as $item) {
// A .git/objects tartalma Windowson csak olvasható, ezért törlés előtt fel kell oldani.
@chmod($item->getPathname(), 0777);
$item->isDir() ? @rmdir($item->getPathname()) : @unlink($item->getPathname());
}
@rmdir($path);
}
function deploymentCleanup(string $path): void
{
// A .git/objects tartalma Windowson csak olvasható, ezért törlés előtt fel kell oldani.
foreach (File::allFiles($path, true) as $file) {
@chmod($file->getPathname(), 0777);
}
try {
File::deleteDirectory($path);
} catch (Throwable) {
// A takarítás nem futtathat el tesztet - a temp mappa maradványa nem befolyásol semmit.
}
deploymentDeleteDirectory($path);
}
afterAll(function () {
deploymentDeleteDirectory(deploymentTemplatePath());
});
test('a kikapcsolt env kapcsoló mindenkitől elveszi a hozzáférést', function () {
deploymentAllowEnvironment();
Config::set('deployment.enabled', false);