| 
#!/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' : '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/$PHPUNIT_VERSION.zip", 'rb'), fopen("$PHPUNIT_VERSION.zip", 'wb'));
 } else {
 @unlink("$PHPUNIT_VERSION.zip");
 passthru("wget https://github.com/sebastianbergmann/phpunit/archive/$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);
 
 |