From 190927a6a2b9a06d17a1cac751e317199b9d586b Mon Sep 17 00:00:00 2001 From: Cees-Jan Kiewiet Date: Sat, 14 Dec 2024 14:51:00 +0100 Subject: [PATCH] Skip unchanged files This feature is key for clients that apply a CS fixer after generation. This can easily save minutes per client generation. --- src/Generator.php | 34 ++++++++++++++++++++++++++-------- 1 file changed, 26 insertions(+), 8 deletions(-) diff --git a/src/Generator.php b/src/Generator.php index 2bbfbbc..b116d36 100644 --- a/src/Generator.php +++ b/src/Generator.php @@ -13,6 +13,7 @@ use PhpParser\PrettyPrinter\Standard; use Safe\Exceptions\FilesystemException; +use function array_filter; use function array_map; use function dirname; use function file_exists; @@ -29,6 +30,7 @@ use function sys_get_temp_dir; use function trim; use function uniqid; +use function usleep; use const DIRECTORY_SEPARATOR; @@ -77,20 +79,36 @@ public static function generate(Configuration $configuration, string $configurat $fileName .= (is_string($file->contents) && strpos($file->contents, 'toString($file); $fileContentsHash = md5($fileContents); - try { - /** @phpstan-ignore-next-line */ - @mkdir(dirname($fileName), 0744, true); - } catch (FilesystemException) { - // @ignoreException + + if ( + ! $state->generatedFiles->has($fileName) || + $state->generatedFiles->get($fileName)->hash !== $fileContentsHash + ) { + try { + /** @phpstan-ignore-next-line */ + @mkdir(dirname($fileName), 0744, true); + } catch (FilesystemException) { + // @ignoreException + } + + file_put_contents($fileName, $fileContents); + $state->generatedFiles->upsert($fileName, $fileContentsHash); + + while (! file_exists($fileName) || $fileContentsHash !== md5(file_get_contents($fileName))) { + usleep(100); + } } - file_put_contents($fileName, $fileContents); - $state->generatedFiles->upsert($fileName, $fileContentsHash); + $existingFiles = array_filter( + $existingFiles, + static fn (string $file): bool => $file !== $fileName, + ); if ($file->loadOnWrite === \OpenAPITools\Utils\File::DO_NOT_LOAD_ON_WRITE) { continue; } + /** @psalm-suppress UnresolvableInclude */ include_once $fileName; } } @@ -104,7 +122,7 @@ public static function generate(Configuration $configuration, string $configurat $state->additionalFiles->remove($file->name); } - foreach ($configuration->state->additionalFiles ?? [] as $additionalFile) { + foreach ($package->state->additionalFiles ?? [] as $additionalFile) { $state->additionalFiles->upsert( $additionalFile, file_exists($configurationLocation . $package->destination->root . DIRECTORY_SEPARATOR . $additionalFile) ? self::hash(file_get_contents($configurationLocation . $package->destination->root . DIRECTORY_SEPARATOR . $additionalFile)) : '',