Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit 6782cfa

Browse filesBrowse 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 #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
Copy full SHA for 6782cfa

File tree

Expand file treeCollapse file tree

29 files changed

+464
-84
lines changed
Filter options
Expand file treeCollapse file tree

29 files changed

+464
-84
lines changed

‎.github/PULL_REQUEST_TEMPLATE.md

Copy file name to clipboard
+7-7Lines 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

Copy file name to clipboardExpand all lines: src/Symfony/Bridge/Twig/Resources/views/Form/form_div_layout.html.twig
+1-1Lines 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

Copy file name to clipboardExpand all lines: src/Symfony/Bundle/FrameworkBundle/Console/Application.php
+28-6Lines 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

Copy file name to clipboardExpand all lines: src/Symfony/Bundle/FrameworkBundle/Resources/views/Form/choice_widget_collapsed.html.php
+1-1Lines 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

Copy file name to clipboardExpand all lines: src/Symfony/Bundle/FrameworkBundle/Tests/Console/ApplicationTest.php
+83-17Lines 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

Copy file name to clipboardExpand all lines: src/Symfony/Bundle/WebProfilerBundle/Resources/views/Profiler/toolbar.css.twig
+4Lines 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

Copy file name to clipboardExpand all lines: src/Symfony/Component/Config/Tests/Definition/Builder/TreeBuilderTest.php
+1-1Lines 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

Copy file name to clipboardExpand all lines: src/Symfony/Component/Console/Application.php
+1-1Lines 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

Copy file name to clipboardExpand all lines: src/Symfony/Component/Filesystem/Filesystem.php
+22-2Lines 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

Copy file name to clipboardExpand all lines: src/Symfony/Component/Filesystem/Tests/FilesystemTest.php
+22Lines 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;

‎src/Symfony/Component/Filesystem/Tests/FilesystemTestCase.php

Copy file name to clipboardExpand all lines: src/Symfony/Component/Filesystem/Tests/FilesystemTestCase.php
+8Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ class FilesystemTestCase extends \PHPUnit_Framework_TestCase
1717
{
1818
private $umask;
1919

20+
static protected $longPathNamesWindows = array();
21+
2022
/**
2123
* @var \Symfony\Component\Filesystem\Filesystem
2224
*/
@@ -31,6 +33,12 @@ class FilesystemTestCase extends \PHPUnit_Framework_TestCase
3133

3234
public static function setUpBeforeClass()
3335
{
36+
if (!empty(self::$longPathNamesWindows)) {
37+
foreach (self::$longPathNamesWindows as $path) {
38+
exec('DEL '.$path);
39+
}
40+
}
41+
3442
if ('\\' === DIRECTORY_SEPARATOR && null === self::$symlinkOnWindows) {
3543
$target = tempnam(sys_get_temp_dir(), 'sl');
3644
$link = sys_get_temp_dir().'/sl'.microtime(true).mt_rand();

‎src/Symfony/Component/Form/ChoiceList/Factory/DefaultChoiceListFactory.php

Copy file name to clipboardExpand all lines: src/Symfony/Component/Form/ChoiceList/Factory/DefaultChoiceListFactory.php
+1-1Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -211,7 +211,7 @@ private static function addChoiceViewGroupedBy($groupBy, $choice, $value, $label
211211

212212
$groupLabel = (string) $groupLabel;
213213

214-
// Initialize the group views if necessary. Unnnecessarily built group
214+
// Initialize the group views if necessary. Unnecessarily built group
215215
// views will be cleaned up at the end of createView()
216216
if (!isset($preferredViews[$groupLabel])) {
217217
$preferredViews[$groupLabel] = new ChoiceGroupView($groupLabel);

‎src/Symfony/Component/Form/ChoiceList/View/ChoiceListView.php

Copy file name to clipboardExpand all lines: src/Symfony/Component/Form/ChoiceList/View/ChoiceListView.php
+20Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,4 +48,24 @@ public function __construct(array $choices = array(), array $preferredChoices =
4848
$this->choices = $choices;
4949
$this->preferredChoices = $preferredChoices;
5050
}
51+
52+
/**
53+
* Returns whether a placeholder is in the choices.
54+
*
55+
* A placeholder must be the first child element, not be in a group and have an empty value.
56+
*
57+
* @return bool
58+
*/
59+
public function hasPlaceholder()
60+
{
61+
if ($this->preferredChoices) {
62+
$firstChoice = reset($this->preferredChoices);
63+
64+
return $firstChoice instanceof ChoiceView && '' === $firstChoice->value;
65+
}
66+
67+
$firstChoice = reset($this->choices);
68+
69+
return $firstChoice instanceof ChoiceView && '' === $firstChoice->value;
70+
}
5171
}

0 commit comments

Comments
0 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.