Created
July 3, 2023 19:31
-
-
Save sglessard/38a09e27a7052052608a58344a34baf5 to your computer and use it in GitHub Desktop.
Make phpunit works with symfony 2.7, file at ~/vendor/symfony/symfony/phpunit
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/usr/bin/env php | |
| <?php | |
| /* | |
| * This file is part of the Symfony package. | |
| * | |
| * (c) Fabien Potencier <[email protected]> | |
| * | |
| * For the full copyright and license information, please view the LICENSE | |
| * file that was distributed with this source code. | |
| */ | |
| // Please update when phpunit needs to be reinstalled with fresh deps: | |
| // Cache-Id-Version: 2015-11-28 09:05 UTC | |
| use Symfony\Component\Process\ProcessUtils; | |
| error_reporting(-1); | |
| require __DIR__.'/src/Symfony/Component/Process/ProcessUtils.php'; | |
| // PHPUnit 4.8 does not support PHP 7, while 5.1 requires PHP 5.6+ | |
| $PHPUNIT_VERSION = PHP_VERSION_ID >= 50600 ? '5.1.7' : '4.8'; | |
| $PHPUNIT_DIR = __DIR__.'/.phpunit'; | |
| $PHP = defined('PHP_BINARY') ? PHP_BINARY : 'php'; | |
| $PHP = ProcessUtils::escapeArgument($PHP); | |
| if ('phpdbg' === PHP_SAPI) { | |
| $PHP .= ' -qrr'; | |
| } | |
| $COMPOSER = file_exists($COMPOSER = __DIR__.'/composer.phar') || ($COMPOSER = rtrim('\\' === DIRECTORY_SEPARATOR ? `where.exe composer.phar` : `which composer.phar`)) | |
| ? $PHP.' '.ProcessUtils::escapeArgument($COMPOSER) | |
| : 'composer'; | |
| if (!file_exists("$PHPUNIT_DIR/phpunit-$PHPUNIT_VERSION/phpunit") || md5_file(__FILE__) !== @file_get_contents("$PHPUNIT_DIR/.$PHPUNIT_VERSION.md5")) { | |
| // Build a standalone phpunit without symfony/yaml | |
| $oldPwd = getcwd(); | |
| @mkdir($PHPUNIT_DIR); | |
| chdir($PHPUNIT_DIR); | |
| if (file_exists("phpunit-$PHPUNIT_VERSION")) { | |
| passthru(sprintf('\\' === DIRECTORY_SEPARATOR ? '(del /S /F /Q %s & rmdir %1$s) >nul': 'rm -rf %s', "phpunit-$PHPUNIT_VERSION")); | |
| } | |
| if (extension_loaded('openssl') && ini_get('allow_url_fopen')) { | |
| stream_copy_to_stream(fopen("https://github.com/sebastianbergmann/phpunit/archive/refs/tags/$PHPUNIT_VERSION.zip", 'rb'), fopen("$PHPUNIT_VERSION.zip", 'wb')); | |
| } else { | |
| @unlink("$PHPUNIT_VERSION.zip"); | |
| passthru("wget https://github.com/sebastianbergmann/phpunit/archive/refs/tags/$PHPUNIT_VERSION.zip"); | |
| } | |
| $zip = new ZipArchive(); | |
| $zip->open("$PHPUNIT_VERSION.zip"); | |
| $zip->extractTo(getcwd()); | |
| $zip->close(); | |
| chdir("phpunit-$PHPUNIT_VERSION"); | |
| passthru("$COMPOSER remove --no-update symfony/yaml"); | |
| passthru("$COMPOSER require --dev --no-update symfony/phpunit-bridge \">=2.8@dev\""); | |
| passthru("$COMPOSER install --prefer-dist --no-progress --ansi"); | |
| file_put_contents('phpunit', <<<EOPHP | |
| <?php | |
| define('PHPUNIT_COMPOSER_INSTALL', __DIR__.'/vendor/autoload.php'); | |
| require PHPUNIT_COMPOSER_INSTALL; | |
| Symfony\Bridge\PhpUnit\TextUI\Command::main(); | |
| EOPHP | |
| ); | |
| chdir('..'); | |
| file_put_contents(".$PHPUNIT_VERSION.md5", md5_file(__FILE__)); | |
| chdir($oldPwd); | |
| } | |
| $cmd = array_map('Symfony\Component\Process\ProcessUtils::escapeArgument', $argv); | |
| $exit = 0; | |
| if (isset($argv[1]) && 'symfony' === $argv[1]) { | |
| array_shift($cmd); | |
| } | |
| $cmd[0] = sprintf('%s %s --colors=always', $PHP, ProcessUtils::escapeArgument("$PHPUNIT_DIR/phpunit-$PHPUNIT_VERSION/phpunit")); | |
| $cmd = str_replace('%', '%%', implode(' ', $cmd)).' %1$s'; | |
| if ('\\' === DIRECTORY_SEPARATOR) { | |
| $cmd = 'cmd /v:on /d /c "('.$cmd.')%2$s"'; | |
| } else { | |
| $cmd .= '%2$s'; | |
| } | |
| if (isset($argv[1]) && 'symfony' === $argv[1]) { | |
| // Find Symfony components in plain php for Windows portability | |
| $oldPwd = getcwd(); | |
| chdir(__DIR__); | |
| $finder = new RecursiveDirectoryIterator('src/Symfony', FilesystemIterator::KEY_AS_FILENAME | FilesystemIterator::UNIX_PATHS); | |
| $finder = new RecursiveIteratorIterator($finder); | |
| $finder->setMaxDepth(3); | |
| $skippedTests = isset($_SERVER['SYMFONY_PHPUNIT_SKIPPED_TESTS']) ? $_SERVER['SYMFONY_PHPUNIT_SKIPPED_TESTS'] : false; | |
| $runningProcs = array(); | |
| foreach ($finder as $file => $fileInfo) { | |
| if ('phpunit.xml.dist' === $file) { | |
| $component = dirname($fileInfo->getPathname()); | |
| // Run phpunit tests in parallel | |
| if ($skippedTests) { | |
| putenv("SYMFONY_PHPUNIT_SKIPPED_TESTS=$component/$skippedTests"); | |
| } | |
| $c = ProcessUtils::escapeArgument($component); | |
| if ($proc = proc_open(sprintf($cmd, $c, " > $c/phpunit.stdout 2> $c/phpunit.stderr"), array(), $pipes)) { | |
| $runningProcs[$component] = $proc; | |
| } else { | |
| $exit = 1; | |
| echo "\033[41mKO\033[0m $component\n\n"; | |
| } | |
| } | |
| } | |
| chdir($oldPwd); | |
| // Fixes for colors support on appveyor | |
| // See https://github.com/appveyor/ci/issues/373 | |
| $colorFixes = array( | |
| array("S\033[0m\033[0m\033[36m\033[1mS", "E\033[0m\033[0m\033[31m\033[1mE", "I\033[0m\033[0m\033[33m\033[1mI", "F\033[0m\033[0m\033[41m\033[37mF"), | |
| array("SS", "EE", "II", "FF"), | |
| ); | |
| $colorFixes[0] = array_merge($colorFixes[0], $colorFixes[0]); | |
| $colorFixes[1] = array_merge($colorFixes[1], $colorFixes[1]); | |
| while ($runningProcs) { | |
| usleep(300000); | |
| $terminatedProcs = array(); | |
| foreach ($runningProcs as $component => $proc) { | |
| $procStatus = proc_get_status($proc); | |
| if (!$procStatus['running']) { | |
| $terminatedProcs[$component] = $procStatus['exitcode']; | |
| unset($runningProcs[$component]); | |
| proc_close($proc); | |
| } | |
| } | |
| foreach ($terminatedProcs as $component => $procStatus) { | |
| foreach (array('out', 'err') as $file) { | |
| $file = "$component/phpunit.std$file"; | |
| if ('\\' === DIRECTORY_SEPARATOR) { | |
| $h = fopen($file, 'rb'); | |
| while (false !== $line = fgets($h)) { | |
| echo str_replace($colorFixes[0], $colorFixes[1], preg_replace( | |
| '/(\033\[[0-9]++);([0-9]++m)(?:(.)(\033\[0m))?/', | |
| "$1m\033[$2$3$4$4", | |
| $line | |
| )); | |
| } | |
| fclose($h); | |
| } else { | |
| readfile($file); | |
| } | |
| unlink($file); | |
| } | |
| // Fail on any individual component failures but ignore STATUS_STACK_BUFFER_OVERRUN (-1073740791) on Windows when APCu is enabled | |
| if ($procStatus && ('\\' !== DIRECTORY_SEPARATOR || !extension_loaded('apcu') || !ini_get('apc.enable_cli') || -1073740791 !== $procStatus)) { | |
| $exit = $procStatus; | |
| echo "\033[41mKO\033[0m $component\n\n"; | |
| } else { | |
| echo "\033[32mOK\033[0m $component\n\n"; | |
| } | |
| } | |
| } | |
| } elseif (!isset($argv[1]) || 'install' !== $argv[1]) { | |
| // Run regular phpunit in a subprocess | |
| $errFile = tempnam(sys_get_temp_dir(), 'phpunit.stderr.'); | |
| if ($proc = proc_open(sprintf($cmd, '', ' 2> '.ProcessUtils::escapeArgument($errFile)), array(1 => array('pipe', 'w')), $pipes)) { | |
| stream_copy_to_stream($pipes[1], STDOUT); | |
| fclose($pipes[1]); | |
| $exit = proc_close($proc); | |
| readfile($errFile); | |
| unlink($errFile); | |
| } | |
| if (!file_exists($component = array_pop($argv))) { | |
| $component = basename(getcwd()); | |
| } | |
| if ($exit) { | |
| echo "\033[41mKO\033[0m $component\n\n"; | |
| } else { | |
| echo "\033[32mOK\033[0m $component\n\n"; | |
| } | |
| } | |
| exit($exit); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment