145 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			145 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
 | 
						|
/*
 | 
						|
 * This file is part of the Symfony package.
 | 
						|
 *
 | 
						|
 * (c) Fabien Potencier <fabien@symfony.com>
 | 
						|
 *
 | 
						|
 * For the full copyright and license information, please view the LICENSE
 | 
						|
 * file that was distributed with this source code.
 | 
						|
 */
 | 
						|
 | 
						|
namespace Sensio\Bundle\DistributionBundle\Composer;
 | 
						|
 | 
						|
use Symfony\Component\ClassLoader\ClassCollectionLoader;
 | 
						|
use Symfony\Component\Process\Process;
 | 
						|
use Symfony\Component\Process\PhpExecutableFinder;
 | 
						|
 | 
						|
/**
 | 
						|
 * @author Jordi Boggiano <j.boggiano@seld.be>
 | 
						|
 */
 | 
						|
class ScriptHandler
 | 
						|
{
 | 
						|
    public static function buildBootstrap($event)
 | 
						|
    {
 | 
						|
        $options = self::getOptions($event);
 | 
						|
        $appDir = $options['symfony-app-dir'];
 | 
						|
 | 
						|
        if (!is_dir($appDir)) {
 | 
						|
            echo 'The symfony-app-dir ('.$appDir.') specified in composer.json was not found in '.getcwd().', can not build bootstrap file.'.PHP_EOL;
 | 
						|
 | 
						|
            return;
 | 
						|
        }
 | 
						|
 | 
						|
        static::executeBuildBootstrap($appDir);
 | 
						|
    }
 | 
						|
 | 
						|
    public static function clearCache($event)
 | 
						|
    {
 | 
						|
        $options = self::getOptions($event);
 | 
						|
        $appDir = $options['symfony-app-dir'];
 | 
						|
 | 
						|
        if (!is_dir($appDir)) {
 | 
						|
            echo 'The symfony-app-dir ('.$appDir.') specified in composer.json was not found in '.getcwd().', can not clear the cache.'.PHP_EOL;
 | 
						|
 | 
						|
            return;
 | 
						|
        }
 | 
						|
 | 
						|
        static::executeCommand($event, $appDir, 'cache:clear --no-warmup');
 | 
						|
    }
 | 
						|
 | 
						|
    public static function installAssets($event)
 | 
						|
    {
 | 
						|
        $options = self::getOptions($event);
 | 
						|
        $appDir = $options['symfony-app-dir'];
 | 
						|
        $webDir = $options['symfony-web-dir'];
 | 
						|
 | 
						|
        $symlink = '';
 | 
						|
        if ($options['symfony-assets-install'] == 'symlink') {
 | 
						|
            $symlink = '--symlink ';
 | 
						|
        } elseif ($options['symfony-assets-install'] == 'relative') {
 | 
						|
            $symlink = '--symlink --relative ';
 | 
						|
        }
 | 
						|
 | 
						|
        if (!is_dir($webDir)) {
 | 
						|
            echo 'The symfony-web-dir ('.$webDir.') specified in composer.json was not found in '.getcwd().', can not install assets.'.PHP_EOL;
 | 
						|
 | 
						|
            return;
 | 
						|
        }
 | 
						|
 | 
						|
        static::executeCommand($event, $appDir, 'assets:install '.$symlink.escapeshellarg($webDir));
 | 
						|
    }
 | 
						|
 | 
						|
    public static function doBuildBootstrap($appDir)
 | 
						|
    {
 | 
						|
        $file = $appDir.'/bootstrap.php.cache';
 | 
						|
        if (file_exists($file)) {
 | 
						|
            unlink($file);
 | 
						|
        }
 | 
						|
 | 
						|
        ClassCollectionLoader::load(array(
 | 
						|
            'Symfony\\Component\\DependencyInjection\\ContainerAwareInterface',
 | 
						|
            // Cannot be included because annotations will parse the big compiled class file
 | 
						|
            //'Symfony\\Component\\DependencyInjection\\ContainerAware',
 | 
						|
            'Symfony\\Component\\DependencyInjection\\ContainerInterface',
 | 
						|
            'Symfony\\Component\\DependencyInjection\\Container',
 | 
						|
            'Symfony\\Component\\HttpKernel\\HttpKernelInterface',
 | 
						|
            'Symfony\\Component\\HttpKernel\\KernelInterface',
 | 
						|
            'Symfony\\Component\\HttpKernel\\Kernel',
 | 
						|
            'Symfony\\Component\\ClassLoader\\ClassCollectionLoader',
 | 
						|
            'Symfony\\Component\\ClassLoader\\ApcClassLoader',
 | 
						|
            'Symfony\\Component\\HttpKernel\\Bundle\\BundleInterface',
 | 
						|
            'Symfony\\Component\\HttpKernel\\Bundle\\Bundle',
 | 
						|
            'Symfony\\Component\\Config\\ConfigCache',
 | 
						|
            // cannot be included as commands are discovered based on the path to this class via Reflection
 | 
						|
            //'Symfony\\Bundle\\FrameworkBundle\\FrameworkBundle',
 | 
						|
        ), dirname($file), basename($file, '.php.cache'), false, false, '.php.cache');
 | 
						|
 | 
						|
        file_put_contents($file, sprintf("<?php
 | 
						|
 | 
						|
namespace { \$loader = require_once __DIR__.'/autoload.php'; }
 | 
						|
 | 
						|
%s
 | 
						|
 | 
						|
namespace { return \$loader; }
 | 
						|
            ", substr(file_get_contents($file), 5)));
 | 
						|
    }
 | 
						|
 | 
						|
    protected static function executeCommand($event, $appDir, $cmd)
 | 
						|
    {
 | 
						|
        $phpFinder = new PhpExecutableFinder;
 | 
						|
        $php = escapeshellarg($phpFinder->find());
 | 
						|
        $console = escapeshellarg($appDir.'/console');
 | 
						|
        if ($event->getIO()->isDecorated()) {
 | 
						|
            $console.= ' --ansi';
 | 
						|
        }
 | 
						|
 | 
						|
        $process = new Process($php.' '.$console.' '.$cmd);
 | 
						|
        $process->run(function ($type, $buffer) { echo $buffer; });
 | 
						|
    }
 | 
						|
 | 
						|
    protected static function executeBuildBootstrap($appDir)
 | 
						|
    {
 | 
						|
        $phpFinder = new PhpExecutableFinder;
 | 
						|
        $php = escapeshellarg($phpFinder->find());
 | 
						|
        $cmd = escapeshellarg(__DIR__.'/../Resources/bin/build_bootstrap.php');
 | 
						|
        $appDir = escapeshellarg($appDir);
 | 
						|
 | 
						|
        $process = new Process($php.' '.$cmd.' '.$appDir);
 | 
						|
        $process->run(function ($type, $buffer) { echo $buffer; });
 | 
						|
    }
 | 
						|
 | 
						|
    protected static function getOptions($event)
 | 
						|
    {
 | 
						|
        $options = array_merge(array(
 | 
						|
            'symfony-app-dir' => 'app',
 | 
						|
            'symfony-web-dir' => 'web',
 | 
						|
            'symfony-assets-install' => 'hard'
 | 
						|
        ), $event->getComposer()->getPackage()->getExtra());
 | 
						|
 | 
						|
        $options['symfony-assets-install'] = getenv('SYMFONY_ASSETS_INSTALL') ?: $options['symfony-assets-install'];
 | 
						|
 | 
						|
        return $options;
 | 
						|
    }
 | 
						|
}
 |