Skip to content

Commit 6782cfa

Browse files
committed
Merge branch '2.8' into 3.0
* 2.8: fixed typo fixed typo Fixed a minor XML issue in a translation file Fix merge Fix merge Fix merge Fix merge Update twig.html.twig PhpUnitNoDedicateAssertFixer results Improve Norwegian translations [2.7] [FrameworkBundle] minor fix tests added by symfony#17569 Fixed the antialiasing of the toolbar text Simplify markdown for PR template fixed CS fixed CS documented the $url parameter better [Form] add test for ArrayChoiceList handling null [Form] fix edge cases with choice placeholder register commands from kernel when accessing list Update FileSystem
2 parents 4e253da + ddc8ece commit 6782cfa

File tree

29 files changed

+464
-84
lines changed

29 files changed

+464
-84
lines changed

.github/PULL_REQUEST_TEMPLATE.md

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
| Q | A
22
| ------------- | ---
3-
| Bug fix? | [yes|no]
4-
| New feature? | [yes|no]
5-
| BC breaks? | [yes|no]
6-
| Deprecations? | [yes|no]
7-
| Tests pass? | [yes|no]
8-
| Fixed tickets | [comma-separated list of tickets fixed by the PR, if any]
3+
| Bug fix? | yes/no
4+
| New feature? | yes/no
5+
| BC breaks? | yes/no
6+
| Deprecations? | yes/no
7+
| Tests pass? | yes/no
8+
| Fixed tickets | comma-separated list of tickets fixed by the PR, if any
99
| License | MIT
10-
| Doc PR | [reference to the documentation PR, if any]
10+
| Doc PR | reference to the documentation PR, if any

src/Symfony/Bridge/Twig/Resources/views/Form/form_div_layout.html.twig

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@
5252
{%- endblock choice_widget_expanded -%}
5353

5454
{%- block choice_widget_collapsed -%}
55-
{%- if required and placeholder is none and not placeholder_in_choices and not multiple -%}
55+
{%- if required and placeholder is none and not placeholder_in_choices and not multiple and (attr.size is not defined or attr.size <= 1) -%}
5656
{% set required = false %}
5757
{%- endif -%}
5858
<select {{ block('widget_attributes') }}{% if multiple %} multiple="multiple"{% endif %}>

src/Symfony/Bundle/FrameworkBundle/Console/Application.php

Lines changed: 28 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -67,12 +67,6 @@ public function doRun(InputInterface $input, OutputInterface $output)
6767
{
6868
$this->kernel->boot();
6969

70-
if (!$this->commandsRegistered) {
71-
$this->registerCommands();
72-
73-
$this->commandsRegistered = true;
74-
}
75-
7670
$container = $this->kernel->getContainer();
7771

7872
foreach ($this->all() as $command) {
@@ -86,8 +80,36 @@ public function doRun(InputInterface $input, OutputInterface $output)
8680
return parent::doRun($input, $output);
8781
}
8882

83+
/**
84+
* {@inheritdoc}
85+
*/
86+
public function get($name)
87+
{
88+
$this->registerCommands();
89+
90+
return parent::get($name);
91+
}
92+
93+
/**
94+
* {@inheritdoc}
95+
*/
96+
public function all($namespace = null)
97+
{
98+
$this->registerCommands();
99+
100+
return parent::all($namespace);
101+
}
102+
89103
protected function registerCommands()
90104
{
105+
if ($this->commandsRegistered) {
106+
return;
107+
}
108+
109+
$this->commandsRegistered = true;
110+
111+
$this->kernel->boot();
112+
91113
$container = $this->kernel->getContainer();
92114

93115
foreach ($this->kernel->getBundles() as $bundle) {

src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/choice_widget_collapsed.html.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<select
2-
<?php if ($required && null === $placeholder && $placeholder_in_choices === false && $multiple === false):
2+
<?php if ($required && null === $placeholder && $placeholder_in_choices === false && $multiple === false && (!isset($attr['size']) || $attr['size'] <= 1)):
33
$required = false;
44
endif; ?>
55
<?php echo $view['form']->block($form, 'widget_attributes', array(

src/Symfony/Bundle/FrameworkBundle/Tests/Console/ApplicationTest.php

Lines changed: 83 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,9 @@
1111

1212
namespace Symfony\Bundle\FrameworkBundle\Tests\Console;
1313

14-
use Symfony\Bundle\FrameworkBundle\Tests\TestCase;
1514
use Symfony\Bundle\FrameworkBundle\Console\Application;
15+
use Symfony\Bundle\FrameworkBundle\Tests\TestCase;
16+
use Symfony\Component\Console\Command\Command;
1617
use Symfony\Component\Console\Input\ArrayInput;
1718
use Symfony\Component\Console\Output\NullOutput;
1819
use Symfony\Component\Console\Tester\ApplicationTester;
@@ -23,7 +24,7 @@ public function testBundleInterfaceImplementation()
2324
{
2425
$bundle = $this->getMock('Symfony\Component\HttpKernel\Bundle\BundleInterface');
2526

26-
$kernel = $this->getKernel(array($bundle));
27+
$kernel = $this->getKernel(array($bundle), true);
2728

2829
$application = new Application($kernel);
2930
$application->doRun(new ArrayInput(array('list')), new NullOutput());
@@ -34,10 +35,73 @@ public function testBundleCommandsAreRegistered()
3435
$bundle = $this->getMock('Symfony\Component\HttpKernel\Bundle\Bundle');
3536
$bundle->expects($this->once())->method('registerCommands');
3637

37-
$kernel = $this->getKernel(array($bundle));
38+
$kernel = $this->getKernel(array($bundle), true);
3839

3940
$application = new Application($kernel);
4041
$application->doRun(new ArrayInput(array('list')), new NullOutput());
42+
43+
// Calling twice: registration should only be done once.
44+
$application->doRun(new ArrayInput(array('list')), new NullOutput());
45+
}
46+
47+
public function testBundleCommandsAreRetrievable()
48+
{
49+
$bundle = $this->getMock('Symfony\Component\HttpKernel\Bundle\Bundle');
50+
$bundle->expects($this->once())->method('registerCommands');
51+
52+
$kernel = $this->getKernel(array($bundle));
53+
54+
$application = new Application($kernel);
55+
$application->all();
56+
57+
// Calling twice: registration should only be done once.
58+
$application->all();
59+
}
60+
61+
public function testBundleSingleCommandIsRetrievable()
62+
{
63+
$bundle = $this->getMock('Symfony\Component\HttpKernel\Bundle\Bundle');
64+
$bundle->expects($this->once())->method('registerCommands');
65+
66+
$kernel = $this->getKernel(array($bundle));
67+
68+
$application = new Application($kernel);
69+
70+
$command = new Command('example');
71+
$application->add($command);
72+
73+
$this->assertSame($command, $application->get('example'));
74+
}
75+
76+
public function testBundleCommandCanBeFound()
77+
{
78+
$bundle = $this->getMock('Symfony\Component\HttpKernel\Bundle\Bundle');
79+
$bundle->expects($this->once())->method('registerCommands');
80+
81+
$kernel = $this->getKernel(array($bundle));
82+
83+
$application = new Application($kernel);
84+
85+
$command = new Command('example');
86+
$application->add($command);
87+
88+
$this->assertSame($command, $application->find('example'));
89+
}
90+
91+
public function testBundleCommandCanBeFoundByAlias()
92+
{
93+
$bundle = $this->getMock('Symfony\Component\HttpKernel\Bundle\Bundle');
94+
$bundle->expects($this->once())->method('registerCommands');
95+
96+
$kernel = $this->getKernel(array($bundle));
97+
98+
$application = new Application($kernel);
99+
100+
$command = new Command('example');
101+
$command->setAliases(array('alias'));
102+
$application->add($command);
103+
104+
$this->assertSame($command, $application->find('alias'));
41105
}
42106

43107
public function testBundleCommandsHaveRightContainer()
@@ -46,7 +110,7 @@ public function testBundleCommandsHaveRightContainer()
46110
$command->setCode(function () {});
47111
$command->expects($this->exactly(2))->method('setContainer');
48112

49-
$application = new Application($this->getKernel(array()));
113+
$application = new Application($this->getKernel(array(), true));
50114
$application->setAutoExit(false);
51115
$application->setCatchExceptions(false);
52116
$application->add($command);
@@ -59,21 +123,23 @@ public function testBundleCommandsHaveRightContainer()
59123
$tester->run(array('command' => 'foo'));
60124
}
61125

62-
private function getKernel(array $bundles)
126+
private function getKernel(array $bundles, $useDispatcher = false)
63127
{
64-
$dispatcher = $this->getMock('Symfony\Component\EventDispatcher\EventDispatcherInterface');
65-
$dispatcher
66-
->expects($this->atLeastOnce())
67-
->method('dispatch')
68-
;
69-
70128
$container = $this->getMock('Symfony\Component\DependencyInjection\ContainerInterface');
71-
$container
72-
->expects($this->atLeastOnce())
73-
->method('get')
74-
->with($this->equalTo('event_dispatcher'))
75-
->will($this->returnValue($dispatcher))
76-
;
129+
130+
if ($useDispatcher) {
131+
$dispatcher = $this->getMock('Symfony\Component\EventDispatcher\EventDispatcherInterface');
132+
$dispatcher
133+
->expects($this->atLeastOnce())
134+
->method('dispatch')
135+
;
136+
$container
137+
->expects($this->atLeastOnce())
138+
->method('get')
139+
->with($this->equalTo('event_dispatcher'))
140+
->will($this->returnValue($dispatcher));
141+
}
142+
77143
$container
78144
->expects($this->once())
79145
->method('hasParameter')

src/Symfony/Bundle/WebProfilerBundle/Resources/views/Profiler/toolbar.css.twig

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,10 @@
4747
text-align: left;
4848
text-transform: none;
4949
z-index: 99999;
50+
51+
/* neutralize the aliasing defined by external CSS styles */
52+
-webkit-font-smoothing: subpixel-antialiased;
53+
-moz-osx-font-smoothing: auto;
5054
}
5155
.sf-toolbarreset abbr {
5256
border: dashed #777;

src/Symfony/Component/Config/Tests/Definition/Builder/TreeBuilderTest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ public function testDefinitionExampleGetsTransferredToNode()
120120
$tree = $builder->buildTree();
121121
$children = $tree->getChildren();
122122

123-
$this->assertTrue(is_array($tree->getExample()));
123+
$this->assertInternalType('array', $tree->getExample());
124124
$this->assertEquals('example', $children['child']->getExample());
125125
}
126126
}

src/Symfony/Component/Console/Application.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -424,7 +424,7 @@ public function has($name)
424424
public function getNamespaces()
425425
{
426426
$namespaces = array();
427-
foreach ($this->commands as $command) {
427+
foreach ($this->all() as $command) {
428428
$namespaces = array_merge($namespaces, $this->extractAllNamespaces($command->getName()));
429429

430430
foreach ($command->getAliases() as $alias) {

src/Symfony/Component/Filesystem/Filesystem.php

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,10 @@ public function mkdir($dirs, $mode = 0777)
115115
public function exists($files)
116116
{
117117
foreach ($this->toIterator($files) as $file) {
118+
if ('\\' === DIRECTORY_SEPARATOR && strlen($file) > 258) {
119+
throw new IOException('Could not check if file exist because path length exceeds 258 characters.', 0, null, $file);
120+
}
121+
118122
if (!file_exists($file)) {
119123
return false;
120124
}
@@ -154,7 +158,7 @@ public function remove($files)
154158
$files = iterator_to_array($this->toIterator($files));
155159
$files = array_reverse($files);
156160
foreach ($files as $file) {
157-
if (!file_exists($file) && !is_link($file)) {
161+
if (!$this->exists($file) && !is_link($file)) {
158162
continue;
159163
}
160164

@@ -268,7 +272,7 @@ public function chgrp($files, $group, $recursive = false)
268272
public function rename($origin, $target, $overwrite = false)
269273
{
270274
// we check that target does not exist
271-
if (!$overwrite && is_readable($target)) {
275+
if (!$overwrite && $this->isReadable($target)) {
272276
throw new IOException(sprintf('Cannot rename because the target "%s" already exists.', $target), 0, null, $target);
273277
}
274278

@@ -277,6 +281,22 @@ public function rename($origin, $target, $overwrite = false)
277281
}
278282
}
279283

284+
/**
285+
* Tells whether a file exists and is readable.
286+
*
287+
* @param string $filename Path to the file.
288+
*
289+
* @throws IOException When windows path is longer than 258 characters
290+
*/
291+
private function isReadable($filename)
292+
{
293+
if ('\\' === DIRECTORY_SEPARATOR && strlen($filename) > 258) {
294+
throw new IOException('Could not check if file is readable because path length exceeds 258 characters.', 0, null, $filename);
295+
}
296+
297+
return is_readable($filename);
298+
}
299+
280300
/**
281301
* Creates a symbolic link or copy a directory.
282302
*

src/Symfony/Component/Filesystem/Tests/FilesystemTest.php

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -358,6 +358,28 @@ public function testFilesExists()
358358
$this->assertTrue($this->filesystem->exists($basePath.'folder'));
359359
}
360360

361+
/**
362+
* @expectedException \Symfony\Component\Filesystem\Exception\IOException
363+
*/
364+
public function testFilesExistsFails()
365+
{
366+
if ('\\' !== DIRECTORY_SEPARATOR) {
367+
$this->markTestSkipped('Test covers edge case on Windows only.');
368+
}
369+
370+
$basePath = $this->workspace.'\\directory\\';
371+
372+
$oldPath = getcwd();
373+
mkdir($basePath);
374+
chdir($basePath);
375+
$file = str_repeat('T', 259 - strlen($basePath));
376+
$path = $basePath.$file;
377+
exec('TYPE NUL >>'.$file); // equivalent of touch, we can not use the php touch() here because it suffers from the same limitation
378+
self::$longPathNamesWindows[] = $path; // save this so we can clean up later
379+
chdir($oldPath);
380+
$this->filesystem->exists($path);
381+
}
382+
361383
public function testFilesExistsTraversableObjectOfFilesAndDirectories()
362384
{
363385
$basePath = $this->workspace.DIRECTORY_SEPARATOR;

0 commit comments

Comments
 (0)