From 8b072dfd379c11f5e368e4bfa4d71395d4142bb9 Mon Sep 17 00:00:00 2001 From: "John Paul E. Balandan, CPA" Date: Sat, 1 May 2021 22:12:19 +0800 Subject: [PATCH] Refactor ComposerScripts --- system/ComposerScripts.php | 248 ++++++++++++++++--------------------- 1 file changed, 104 insertions(+), 144 deletions(-) diff --git a/system/ComposerScripts.php b/system/ComposerScripts.php index aae11ba030de..612cb8535f28 100644 --- a/system/ComposerScripts.php +++ b/system/ComposerScripts.php @@ -11,210 +11,170 @@ namespace CodeIgniter; -use ReflectionClass; -use ReflectionException; +use FilesystemIterator; +use RecursiveDirectoryIterator; +use RecursiveIteratorIterator; +use SplFileInfo; /** - * ComposerScripts - * - * These scripts are used by Composer during installs and updates + * This class is used by Composer during installs and updates * to move files to locations within the system folder so that end-users * do not need to use Composer to install a package, but can simply - * download + * download. * * @codeCoverageIgnore + * + * @internal */ -class ComposerScripts +final class ComposerScripts { /** - * Base path to use. + * Path to the ThirdParty directory. * * @var string */ - protected static $basePath = 'ThirdParty/'; + private static $path = __DIR__ . '/ThirdParty/'; /** - * After composer install/update, this is called to move - * the bare-minimum required files for our dependencies - * to appropriate locations. + * Direct dependencies of CodeIgniter to copy + * contents to `system/ThirdParty/`. * - * @throws ReflectionException + * @var array> */ - public static function postUpdate() - { - static::moveEscaper(); - static::moveKint(); - } - - //-------------------------------------------------------------------- + private static $dependencies = [ + 'kint-src' => [ + 'from' => __DIR__ . '/../vendor/kint-php/kint/src/', + 'to' => __DIR__ . '/ThirdParty/Kint/', + ], + 'kint-resources' => [ + 'from' => __DIR__ . '/../vendor/kint-php/kint/resources/', + 'to' => __DIR__ . '/ThirdParty/Kint/resources/', + ], + 'escaper' => [ + 'from' => __DIR__ . '/../vendor/laminas/laminas-escaper/src/', + 'to' => __DIR__ . '/ThirdParty/Escaper/', + ], + 'psr-log' => [ + 'from' => __DIR__ . '/../vendor/psr/log/Psr/Log/', + 'to' => __DIR__ . '/ThirdParty/PSR/Log/', + ], + ]; /** - * Move a file. + * This static method is called by Composer after every update event, + * i.e., `composer install`, `composer update`, `composer remove`. * - * @param string $source - * @param string $destination - * - * @return boolean + * @return void */ - protected static function moveFile(string $source, string $destination): bool + public static function postUpdate() { - $source = realpath($source); - - if (empty($source)) - { - // @codeCoverageIgnoreStart - die('Cannot move file. Source path invalid.'); - // @codeCoverageIgnoreEnd - } + self::recursiveDelete(self::$path); - if (! is_file($source)) + foreach (self::$dependencies as $dependency) { - return false; + self::recursiveMirror($dependency['from'], $dependency['to']); } - return copy($source, $destination); + self::copyKintInitFiles(); + self::recursiveDelete(self::$dependencies['psr-log']['to'] . 'Test/'); } - //-------------------------------------------------------------------- - /** - * Determine file path of a class. + * Recursively remove the contents of the previous `system/ThirdParty`. * - * @param string $class + * @param string $directory * - * @return string - * @throws ReflectionException + * @return void */ - protected static function getClassFilePath(string $class) + private static function recursiveDelete(string $directory): void { - $reflector = new ReflectionClass($class); + if (! is_dir($directory)) + { + echo sprintf('Cannot recursively delete "%s" as it does not exist.', $directory); + } - return $reflector->getFileName(); - } + /** @var SplFileInfo $file */ + foreach (new RecursiveIteratorIterator( + new RecursiveDirectoryIterator(rtrim($directory, '\\/'), FilesystemIterator::SKIP_DOTS), + RecursiveIteratorIterator::CHILD_FIRST + ) as $file) + { + $path = $file->getPathname(); - //-------------------------------------------------------------------- + if ($file->isDir()) + { + @rmdir($path); + } + else + { + @unlink($path); + } + } + } /** - * A recursive remove directory method. + * Recursively copy the files and directories of the origin directory + * into the target directory, i.e. "mirror" its contents. + * + * @param string $originDir + * @param string $targetDir * - * @param string $dir + * @return void */ - protected static function removeDir($dir) + private static function recursiveMirror(string $originDir, string $targetDir): void { - if (is_dir($dir)) + $originDir = rtrim($originDir, '\\/'); + $targetDir = rtrim($targetDir, '\\/'); + + if (! is_dir($originDir)) { - $objects = scandir($dir); - foreach ($objects as $object) - { - if ($object !== '.' && $object !== '..') - { - if (filetype($dir . '/' . $object) === 'dir') - { - static::removeDir($dir . '/' . $object); - } - else - { - unlink($dir . '/' . $object); - } - } - } - reset($objects); - rmdir($dir); + echo sprintf('The origin directory "%s" was not found.', $originDir); + exit(1); } - } - protected static function copyDir($source, $dest) - { - $dir = opendir($source); - @mkdir($dest); - - while (false !== ($file = readdir($dir))) + if (is_dir($targetDir)) { - if (($file !== '.') && ($file !== '..')) - { - if (is_dir($source . '/' . $file)) - { - static::copyDir($source . '/' . $file, $dest . '/' . $file); - } - else - { - copy($source . '/' . $file, $dest . '/' . $file); - } - } + echo sprintf('The target directory "%s" is existing. Run %s::recursiveDelete(\'%s\') first.', $targetDir, self::class, $targetDir); + exit(1); } - closedir($dir); - } + @mkdir($targetDir, 0755, true); - /** - * Moves the Laminas Escaper files into our base repo so that it's - * available for packaged releases where the users don't user Composer. - * - * @throws ReflectionException - */ - public static function moveEscaper() - { - if (class_exists('\\Laminas\\Escaper\\Escaper') && is_file(static::getClassFilePath('\\Laminas\\Escaper\\Escaper'))) + $dirLen = strlen($originDir); + + /** @var SplFileInfo $file */ + foreach (new RecursiveIteratorIterator( + new RecursiveDirectoryIterator($originDir, FilesystemIterator::SKIP_DOTS), + RecursiveIteratorIterator::SELF_FIRST + ) as $file) { - $base = basename(__DIR__) . '/' . static::$basePath . 'Escaper'; + $origin = $file->getPathname(); + $target = $targetDir . substr($origin, $dirLen); - foreach ([$base, $base . '/Exception'] as $path) + if ($file->isDir()) { - if (! is_dir($path)) - { - mkdir($path, 0755); - } + @mkdir($target, 0755); } - - $files = [ - static::getClassFilePath('\\Laminas\\Escaper\\Exception\\ExceptionInterface') => $base . '/Exception/ExceptionInterface.php', - static::getClassFilePath('\\Laminas\\Escaper\\Exception\\InvalidArgumentException') => $base . '/Exception/InvalidArgumentException.php', - static::getClassFilePath('\\Laminas\\Escaper\\Exception\\RuntimeException') => $base . '/Exception/RuntimeException.php', - static::getClassFilePath('\\Laminas\\Escaper\\Escaper') => $base . '/Escaper.php', - ]; - - foreach ($files as $source => $dest) + else { - if (! static::moveFile($source, $dest)) - { - // @codeCoverageIgnoreStart - die('Error moving: ' . $source); - // @codeCoverageIgnoreEnd - } + @copy($origin, $target); } } } - //-------------------------------------------------------------------- - /** - * Moves the Kint file into our base repo so that it's - * available for packaged releases where the users don't user Composer. + * Copy Kint's init files into `system/ThirdParty/Kint/` + * + * @return void */ - public static function moveKint() + private static function copyKintInitFiles(): void { - $dir = 'vendor/kint-php/kint/src'; + $originDir = self::$dependencies['kint-src']['from'] . '../'; + $targetDir = self::$dependencies['kint-src']['to']; - if (is_dir($dir)) + foreach (['init.php', 'init_helpers.php'] as $kintInit) { - $base = basename(__DIR__) . '/' . static::$basePath . 'Kint'; - - // Remove the contents of the previous Kint folder, if any. - if (is_dir($base)) - { - static::removeDir($base); - } - - // Create Kint if it doesn't exist already - if (! is_dir($base)) - { - mkdir($base, 0755); - } - - static::copyDir($dir, $base); - static::copyDir($dir . '/../resources', $base . '/resources'); - copy($dir . '/../init.php', $base . '/init.php'); - copy($dir . '/../init_helpers.php', $base . '/init_helpers.php'); + @copy($originDir . $kintInit, $targetDir . $kintInit); } } }