Merge branch '2.3' into 2.7
* 2.3: fixed CS fixed CS documented the $url parameter better register commands from kernel when accessing list Update FileSystem
This commit is contained in:
commit
653428af76
@ -69,12 +69,6 @@ class Application extends BaseApplication
|
|||||||
{
|
{
|
||||||
$this->kernel->boot();
|
$this->kernel->boot();
|
||||||
|
|
||||||
if (!$this->commandsRegistered) {
|
|
||||||
$this->registerCommands();
|
|
||||||
|
|
||||||
$this->commandsRegistered = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
$container = $this->kernel->getContainer();
|
$container = $this->kernel->getContainer();
|
||||||
|
|
||||||
foreach ($this->all() as $command) {
|
foreach ($this->all() as $command) {
|
||||||
@ -96,8 +90,36 @@ class Application extends BaseApplication
|
|||||||
return parent::doRun($input, $output);
|
return parent::doRun($input, $output);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
public function get($name)
|
||||||
|
{
|
||||||
|
$this->registerCommands();
|
||||||
|
|
||||||
|
return parent::get($name);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
public function all($namespace = null)
|
||||||
|
{
|
||||||
|
$this->registerCommands();
|
||||||
|
|
||||||
|
return parent::all($namespace);
|
||||||
|
}
|
||||||
|
|
||||||
protected function registerCommands()
|
protected function registerCommands()
|
||||||
{
|
{
|
||||||
|
if ($this->commandsRegistered) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->commandsRegistered = true;
|
||||||
|
|
||||||
|
$this->kernel->boot();
|
||||||
|
|
||||||
$container = $this->kernel->getContainer();
|
$container = $this->kernel->getContainer();
|
||||||
|
|
||||||
foreach ($this->kernel->getBundles() as $bundle) {
|
foreach ($this->kernel->getBundles() as $bundle) {
|
||||||
|
@ -11,8 +11,9 @@
|
|||||||
|
|
||||||
namespace Symfony\Bundle\FrameworkBundle\Tests\Console;
|
namespace Symfony\Bundle\FrameworkBundle\Tests\Console;
|
||||||
|
|
||||||
use Symfony\Bundle\FrameworkBundle\Tests\TestCase;
|
|
||||||
use Symfony\Bundle\FrameworkBundle\Console\Application;
|
use Symfony\Bundle\FrameworkBundle\Console\Application;
|
||||||
|
use Symfony\Bundle\FrameworkBundle\Tests\TestCase;
|
||||||
|
use Symfony\Component\Console\Command\Command;
|
||||||
use Symfony\Component\Console\Input\ArrayInput;
|
use Symfony\Component\Console\Input\ArrayInput;
|
||||||
use Symfony\Component\Console\Output\NullOutput;
|
use Symfony\Component\Console\Output\NullOutput;
|
||||||
use Symfony\Component\Console\Tester\ApplicationTester;
|
use Symfony\Component\Console\Tester\ApplicationTester;
|
||||||
@ -38,6 +39,89 @@ class ApplicationTest extends TestCase
|
|||||||
|
|
||||||
$application = new Application($kernel);
|
$application = new Application($kernel);
|
||||||
$application->doRun(new ArrayInput(array('list')), new NullOutput());
|
$application->doRun(new ArrayInput(array('list')), new NullOutput());
|
||||||
|
|
||||||
|
// Calling twice: registration should only be done once.
|
||||||
|
$application->doRun(new ArrayInput(array('list')), new NullOutput());
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testBundleCommandsAreRetrievable()
|
||||||
|
{
|
||||||
|
$bundle = $this->getMock('Symfony\Component\HttpKernel\Bundle\Bundle');
|
||||||
|
$bundle->expects($this->once())->method('registerCommands');
|
||||||
|
|
||||||
|
$kernel = $this->getMock('Symfony\Component\HttpKernel\KernelInterface');
|
||||||
|
$kernel
|
||||||
|
->expects($this->any())
|
||||||
|
->method('getBundles')
|
||||||
|
->will($this->returnValue(array($bundle)))
|
||||||
|
;
|
||||||
|
|
||||||
|
$application = new Application($kernel);
|
||||||
|
$application->all();
|
||||||
|
|
||||||
|
// Calling twice: registration should only be done once.
|
||||||
|
$application->all();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testBundleSingleCommandIsRetrievable()
|
||||||
|
{
|
||||||
|
$bundle = $this->getMock('Symfony\Component\HttpKernel\Bundle\Bundle');
|
||||||
|
$bundle->expects($this->once())->method('registerCommands');
|
||||||
|
|
||||||
|
$kernel = $this->getMock('Symfony\Component\HttpKernel\KernelInterface');
|
||||||
|
$kernel
|
||||||
|
->expects($this->any())
|
||||||
|
->method('getBundles')
|
||||||
|
->will($this->returnValue(array($bundle)))
|
||||||
|
;
|
||||||
|
|
||||||
|
$application = new Application($kernel);
|
||||||
|
|
||||||
|
$command = new Command('example');
|
||||||
|
$application->add($command);
|
||||||
|
|
||||||
|
$this->assertSame($command, $application->get('example'));
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testBundleCommandCanBeFound()
|
||||||
|
{
|
||||||
|
$bundle = $this->getMock('Symfony\Component\HttpKernel\Bundle\Bundle');
|
||||||
|
$bundle->expects($this->once())->method('registerCommands');
|
||||||
|
|
||||||
|
$kernel = $this->getMock('Symfony\Component\HttpKernel\KernelInterface');
|
||||||
|
$kernel
|
||||||
|
->expects($this->any())
|
||||||
|
->method('getBundles')
|
||||||
|
->will($this->returnValue(array($bundle)))
|
||||||
|
;
|
||||||
|
|
||||||
|
$application = new Application($kernel);
|
||||||
|
|
||||||
|
$command = new Command('example');
|
||||||
|
$application->add($command);
|
||||||
|
|
||||||
|
$this->assertSame($command, $application->find('example'));
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testBundleCommandCanBeFoundByAlias()
|
||||||
|
{
|
||||||
|
$bundle = $this->getMock('Symfony\Component\HttpKernel\Bundle\Bundle');
|
||||||
|
$bundle->expects($this->once())->method('registerCommands');
|
||||||
|
|
||||||
|
$kernel = $this->getMock('Symfony\Component\HttpKernel\KernelInterface');
|
||||||
|
$kernel
|
||||||
|
->expects($this->any())
|
||||||
|
->method('getBundles')
|
||||||
|
->will($this->returnValue(array($bundle)))
|
||||||
|
;
|
||||||
|
|
||||||
|
$application = new Application($kernel);
|
||||||
|
|
||||||
|
$command = new Command('example');
|
||||||
|
$command->setAliases(array('alias'));
|
||||||
|
$application->add($command);
|
||||||
|
|
||||||
|
$this->assertSame($command, $application->find('alias'));
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testBundleCommandsHaveRightContainer()
|
public function testBundleCommandsHaveRightContainer()
|
||||||
|
@ -427,7 +427,7 @@ class Application
|
|||||||
public function getNamespaces()
|
public function getNamespaces()
|
||||||
{
|
{
|
||||||
$namespaces = array();
|
$namespaces = array();
|
||||||
foreach ($this->commands as $command) {
|
foreach ($this->all() as $command) {
|
||||||
$namespaces = array_merge($namespaces, $this->extractAllNamespaces($command->getName()));
|
$namespaces = array_merge($namespaces, $this->extractAllNamespaces($command->getName()));
|
||||||
|
|
||||||
foreach ($command->getAliases() as $alias) {
|
foreach ($command->getAliases() as $alias) {
|
||||||
|
@ -115,6 +115,10 @@ class Filesystem
|
|||||||
public function exists($files)
|
public function exists($files)
|
||||||
{
|
{
|
||||||
foreach ($this->toIterator($files) as $file) {
|
foreach ($this->toIterator($files) as $file) {
|
||||||
|
if ('\\' === DIRECTORY_SEPARATOR && strlen($file) > 258) {
|
||||||
|
throw new IOException('Could not check if file exist because path length exceeds 258 characters.', 0, null, $file);
|
||||||
|
}
|
||||||
|
|
||||||
if (!file_exists($file)) {
|
if (!file_exists($file)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -154,7 +158,7 @@ class Filesystem
|
|||||||
$files = iterator_to_array($this->toIterator($files));
|
$files = iterator_to_array($this->toIterator($files));
|
||||||
$files = array_reverse($files);
|
$files = array_reverse($files);
|
||||||
foreach ($files as $file) {
|
foreach ($files as $file) {
|
||||||
if (!file_exists($file) && !is_link($file)) {
|
if (!$this->exists($file) && !is_link($file)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -268,7 +272,7 @@ class Filesystem
|
|||||||
public function rename($origin, $target, $overwrite = false)
|
public function rename($origin, $target, $overwrite = false)
|
||||||
{
|
{
|
||||||
// we check that target does not exist
|
// we check that target does not exist
|
||||||
if (!$overwrite && is_readable($target)) {
|
if (!$overwrite && $this->isReadable($target)) {
|
||||||
throw new IOException(sprintf('Cannot rename because the target "%s" already exists.', $target), 0, null, $target);
|
throw new IOException(sprintf('Cannot rename because the target "%s" already exists.', $target), 0, null, $target);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -277,6 +281,22 @@ class Filesystem
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tells whether a file exists and is readable.
|
||||||
|
*
|
||||||
|
* @param string $filename Path to the file.
|
||||||
|
*
|
||||||
|
* @throws IOException When windows path is longer than 258 characters
|
||||||
|
*/
|
||||||
|
private function isReadable($filename)
|
||||||
|
{
|
||||||
|
if ('\\' === DIRECTORY_SEPARATOR && strlen($filename) > 258) {
|
||||||
|
throw new IOException('Could not check if file is readable because path length exceeds 258 characters.', 0, null, $filename);
|
||||||
|
}
|
||||||
|
|
||||||
|
return is_readable($filename);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a symbolic link or copy a directory.
|
* Creates a symbolic link or copy a directory.
|
||||||
*
|
*
|
||||||
|
@ -358,6 +358,28 @@ class FilesystemTest extends FilesystemTestCase
|
|||||||
$this->assertTrue($this->filesystem->exists($basePath.'folder'));
|
$this->assertTrue($this->filesystem->exists($basePath.'folder'));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @expectedException \Symfony\Component\Filesystem\Exception\IOException
|
||||||
|
*/
|
||||||
|
public function testFilesExistsFails()
|
||||||
|
{
|
||||||
|
if ('\\' !== DIRECTORY_SEPARATOR) {
|
||||||
|
$this->markTestSkipped('Test covers edge case on Windows only.');
|
||||||
|
}
|
||||||
|
|
||||||
|
$basePath = $this->workspace.'\\directory\\';
|
||||||
|
|
||||||
|
$oldPath = getcwd();
|
||||||
|
mkdir($basePath);
|
||||||
|
chdir($basePath);
|
||||||
|
$file = str_repeat('T', 259 - strlen($basePath));
|
||||||
|
$path = $basePath.$file;
|
||||||
|
exec('TYPE NUL >>'.$file); // equivalent of touch, we can not use the php touch() here because it suffers from the same limitation
|
||||||
|
self::$longPathNamesWindows[] = $path; // save this so we can clean up later
|
||||||
|
chdir($oldPath);
|
||||||
|
$this->filesystem->exists($path);
|
||||||
|
}
|
||||||
|
|
||||||
public function testFilesExistsTraversableObjectOfFilesAndDirectories()
|
public function testFilesExistsTraversableObjectOfFilesAndDirectories()
|
||||||
{
|
{
|
||||||
$basePath = $this->workspace.DIRECTORY_SEPARATOR;
|
$basePath = $this->workspace.DIRECTORY_SEPARATOR;
|
||||||
|
@ -17,6 +17,8 @@ class FilesystemTestCase extends \PHPUnit_Framework_TestCase
|
|||||||
{
|
{
|
||||||
private $umask;
|
private $umask;
|
||||||
|
|
||||||
|
static protected $longPathNamesWindows = array();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @var \Symfony\Component\Filesystem\Filesystem
|
* @var \Symfony\Component\Filesystem\Filesystem
|
||||||
*/
|
*/
|
||||||
@ -31,6 +33,12 @@ class FilesystemTestCase extends \PHPUnit_Framework_TestCase
|
|||||||
|
|
||||||
public static function setUpBeforeClass()
|
public static function setUpBeforeClass()
|
||||||
{
|
{
|
||||||
|
if (!empty(self::$longPathNamesWindows)) {
|
||||||
|
foreach (self::$longPathNamesWindows as $path) {
|
||||||
|
exec('DEL '.$path);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if ('\\' === DIRECTORY_SEPARATOR && null === self::$symlinkOnWindows) {
|
if ('\\' === DIRECTORY_SEPARATOR && null === self::$symlinkOnWindows) {
|
||||||
$target = tempnam(sys_get_temp_dir(), 'sl');
|
$target = tempnam(sys_get_temp_dir(), 'sl');
|
||||||
$link = sys_get_temp_dir().'/sl'.microtime(true).mt_rand();
|
$link = sys_get_temp_dir().'/sl'.microtime(true).mt_rand();
|
||||||
|
@ -23,7 +23,8 @@ class RedirectResponse extends Response
|
|||||||
/**
|
/**
|
||||||
* Creates a redirect response so that it conforms to the rules defined for a redirect status code.
|
* Creates a redirect response so that it conforms to the rules defined for a redirect status code.
|
||||||
*
|
*
|
||||||
* @param string $url The URL to redirect to
|
* @param string $url The URL to redirect to. The URL should be a full URL, with schema etc.,
|
||||||
|
* but practically every browser redirects on paths only as well
|
||||||
* @param int $status The status code (302 by default)
|
* @param int $status The status code (302 by default)
|
||||||
* @param array $headers The headers (Location is always set to the given URL)
|
* @param array $headers The headers (Location is always set to the given URL)
|
||||||
*
|
*
|
||||||
|
Reference in New Issue
Block a user