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 f8ccc81

Browse filesBrowse files
Merge branch '4.4'
* 4.4: (43 commits) [PhpunitBridge] Read environment variable from superglobals [Bridge/PhpUnit] Fix PHP5.5 compat [PhpUnitBridge] More accurate grouping fixed CS [Form] remove comment about to-be-removed method as it is used in master by ButtonBuilder Extract unrecoverable exception to interface [FrameworkBundle] Fix calling Client::getProfile() before sending a request Fix type error [Security/Core] require libsodium >= 1.0.14 [Workflow] re-add workflow.definition tag to workflow services [Security/Core] Don't use ParagonIE_Sodium_Compat revert #30525 due to performance penalty collect called listeners information only once [Lock] fix missing inherit docs in RedisStore [Messenger] fix retrying handlers using DoctrineTransactionMiddleware [Mailgun Mailer] fixed issue when using html body [Messenger] make all stamps final and mark stamp not meant to be sent [HttpClient] fix timing measurements with NativeHttpClient add return type declaration use proper return types in ErrorHandler and ArgumentResolver ...
2 parents f128aee + 55c0b02 commit f8ccc81
Copy full SHA for f8ccc81

File tree

Expand file treeCollapse file tree

92 files changed

+911
-287
lines changed
Filter options

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
Dismiss banner
Expand file treeCollapse file tree

92 files changed

+911
-287
lines changed

‎UPGRADE-4.4.md

Copy file name to clipboardExpand all lines: UPGRADE-4.4.md
+5Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,11 @@ DependencyInjection
4141
arguments: [!tagged_iterator app.handler]
4242
```
4343

44+
Form
45+
----
46+
47+
* Using `int` or `float` as data for the `NumberType` when the `input` option is set to `string` is deprecated.
48+
4449
FrameworkBundle
4550
---------------
4651

‎UPGRADE-5.0.md

Copy file name to clipboardExpand all lines: UPGRADE-5.0.md
+1Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,7 @@ Finder
146146
Form
147147
----
148148

149+
* Removed support for using `int` or `float` as data for the `NumberType` when the `input` option is set to `string`.
149150
* Removed support for using the `format` option of `DateType` and `DateTimeType` when the `html5` option is enabled.
150151
* Using names for buttons that do not start with a letter, a digit, or an underscore leads to an exception.
151152
* Using names for buttons that do not contain only letters, digits, underscores, hyphens, and colons leads to an

‎src/Symfony/Bridge/Doctrine/DataCollector/DoctrineDataCollector.php

Copy file name to clipboardExpand all lines: src/Symfony/Bridge/Doctrine/DataCollector/DoctrineDataCollector.php
+3Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,9 @@ private function sanitizeQuery($connectionName, $query)
138138
if (!\is_array($query['params'])) {
139139
$query['params'] = [$query['params']];
140140
}
141+
if (!\is_array($query['types'])) {
142+
$query['types'] = [];
143+
}
141144
foreach ($query['params'] as $j => $param) {
142145
if (isset($query['types'][$j])) {
143146
// Transform the param according to the type

‎src/Symfony/Bridge/Doctrine/Messenger/DoctrineTransactionMiddleware.php

Copy file name to clipboardExpand all lines: src/Symfony/Bridge/Doctrine/Messenger/DoctrineTransactionMiddleware.php
+8Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,9 @@
1313

1414
use Doctrine\ORM\EntityManagerInterface;
1515
use Symfony\Component\Messenger\Envelope;
16+
use Symfony\Component\Messenger\Exception\HandlerFailedException;
1617
use Symfony\Component\Messenger\Middleware\StackInterface;
18+
use Symfony\Component\Messenger\Stamp\HandledStamp;
1719

1820
/**
1921
* Wraps all handlers in a single doctrine transaction.
@@ -36,6 +38,12 @@ protected function handleForManager(EntityManagerInterface $entityManager, Envel
3638
} catch (\Throwable $exception) {
3739
$entityManager->getConnection()->rollBack();
3840

41+
if ($exception instanceof HandlerFailedException) {
42+
// Remove all HandledStamp from the envelope so the retry will execute all handlers again.
43+
// When a handler fails, the queries of allegedly successful previous handlers just got rolled back.
44+
throw new HandlerFailedException($exception->getEnvelope()->withoutAll(HandledStamp::class), $exception->getNestedExceptions());
45+
}
46+
3947
throw $exception;
4048
}
4149
}

‎src/Symfony/Bridge/Doctrine/Tests/DataCollector/DoctrineDataCollectorTest.php

Copy file name to clipboardExpand all lines: src/Symfony/Bridge/Doctrine/Tests/DataCollector/DoctrineDataCollectorTest.php
+12Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,18 @@ public function testCollectQueryWithNoParams()
102102
$this->assertTrue($collectedQueries['default'][1]['explainable']);
103103
}
104104

105+
public function testCollectQueryWithNoTypes()
106+
{
107+
$queries = [
108+
['sql' => 'SET sql_mode=(SELECT REPLACE(@@sql_mode, \'ONLY_FULL_GROUP_BY\', \'\'))', 'params' => [], 'types' => null, 'executionMS' => 1],
109+
];
110+
$c = $this->createCollector($queries);
111+
$c->collect(new Request(), new Response());
112+
113+
$collectedQueries = $c->getQueries();
114+
$this->assertSame([], $collectedQueries['default'][0]['types']);
115+
}
116+
105117
public function testReset()
106118
{
107119
$queries = [

‎src/Symfony/Bridge/PhpUnit/DeprecationErrorHandler.php

Copy file name to clipboardExpand all lines: src/Symfony/Bridge/PhpUnit/DeprecationErrorHandler.php
+13-4Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -134,10 +134,13 @@ public function handleError($type, $msg, $file, $line, $context = [])
134134
$group = 'unsilenced';
135135
} elseif ($deprecation->isLegacy(self::$utilPrefix)) {
136136
$group = 'legacy';
137-
} elseif (!$deprecation->isSelf()) {
138-
$group = $deprecation->isIndirect() ? 'remaining indirect' : 'remaining direct';
139137
} else {
140-
$group = 'remaining self';
138+
$group = [
139+
Deprecation::TYPE_SELF => 'remaining self',
140+
Deprecation::TYPE_DIRECT => 'remaining direct',
141+
Deprecation::TYPE_INDIRECT => 'remaining indirect',
142+
Deprecation::TYPE_UNDETERMINED => 'other',
143+
][$deprecation->getType()];
141144
}
142145

143146
if ($this->getConfiguration()->shouldDisplayStackTrace($msg)) {
@@ -211,7 +214,13 @@ private function getConfiguration()
211214
return $this->configuration;
212215
}
213216
if (false === $mode = $this->mode) {
214-
$mode = getenv('SYMFONY_DEPRECATIONS_HELPER');
217+
if (isset($_SERVER['SYMFONY_DEPRECATIONS_HELPER'])) {
218+
$mode = $_SERVER['SYMFONY_DEPRECATIONS_HELPER'];
219+
} elseif (isset($_ENV['SYMFONY_DEPRECATIONS_HELPER'])) {
220+
$mode = $_ENV['SYMFONY_DEPRECATIONS_HELPER'];
221+
} else {
222+
$mode = getenv('SYMFONY_DEPRECATIONS_HELPER');
223+
}
215224
}
216225
if ('strict' === $mode) {
217226
return $this->configuration = Configuration::inStrictMode();

‎src/Symfony/Bridge/PhpUnit/DeprecationErrorHandler/Deprecation.php

Copy file name to clipboardExpand all lines: src/Symfony/Bridge/PhpUnit/DeprecationErrorHandler/Deprecation.php
+70-40Lines changed: 70 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,15 @@
1818
*/
1919
class Deprecation
2020
{
21+
const PATH_TYPE_VENDOR = 'path_type_vendor';
22+
const PATH_TYPE_SELF = 'path_type_internal';
23+
const PATH_TYPE_UNDETERMINED = 'path_type_undetermined';
24+
25+
const TYPE_SELF = 'type_self';
26+
const TYPE_DIRECT = 'type_direct';
27+
const TYPE_INDIRECT = 'type_indirect';
28+
const TYPE_UNDETERMINED = 'type_undetermined';
29+
2130
/**
2231
* @var array
2332
*/
@@ -39,13 +48,21 @@ class Deprecation
3948
private $originMethod;
4049

4150
/**
42-
* @var bool
51+
* @var string one of the PATH_TYPE_* constants
4352
*/
44-
private $self;
53+
private $triggeringFilePathType;
4554

4655
/** @var string[] absolute paths to vendor directories */
4756
private static $vendors;
4857

58+
/**
59+
* @var string[] absolute paths to source or tests of the project. This
60+
* excludes cache directories, because it is based on
61+
* autoloading rules and cache systems typically do not use
62+
* those.
63+
*/
64+
private static $internalPaths;
65+
4966
/**
5067
* @param string $message
5168
* @param string $file
@@ -59,7 +76,7 @@ public function __construct($message, array $trace, $file)
5976
// No-op
6077
}
6178
$line = $trace[$i];
62-
$this->self = !$this->pathOriginatesFromVendor($file);
79+
$this->trigerringFilePathType = $this->getPathType($file);
6380
if (isset($line['object']) || isset($line['class'])) {
6481
if (isset($line['class']) && 0 === strpos($line['class'], SymfonyTestsListenerFor::class)) {
6582
$parsedMsg = unserialize($this->message);
@@ -70,8 +87,9 @@ public function __construct($message, array $trace, $file)
7087
// \Symfony\Bridge\PhpUnit\Legacy\SymfonyTestsListenerTrait::endTest()
7188
// then we need to use the serialized information to determine
7289
// if the error has been triggered from vendor code.
73-
$this->self = isset($parsedMsg['triggering_file'])
74-
&& $this->pathOriginatesFromVendor($parsedMsg['triggering_file']);
90+
if (isset($parsedMsg['triggering_file'])) {
91+
$this->trigerringFilePathType = $this->getPathType($parsedMsg['triggering_file']);
92+
}
7593

7694
return;
7795
}
@@ -101,14 +119,6 @@ public function originatesFromAnObject()
101119
return isset($this->originClass);
102120
}
103121

104-
/**
105-
* @return bool
106-
*/
107-
public function isSelf()
108-
{
109-
return $this->self;
110-
}
111-
112122
/**
113123
* @return string
114124
*/
@@ -163,10 +173,16 @@ public function isLegacy($utilPrefix)
163173
* Tells whether both the calling package and the called package are vendor
164174
* packages.
165175
*
166-
* @return bool
176+
* @return string
167177
*/
168-
public function isIndirect()
178+
public function getType()
169179
{
180+
if (self::PATH_TYPE_SELF === $this->trigerringFilePathType) {
181+
return self::TYPE_SELF;
182+
}
183+
if (self::PATH_TYPE_UNDETERMINED === $this->trigerringFilePathType) {
184+
return self::TYPE_UNDETERMINED;
185+
}
170186
$erroringFile = $erroringPackage = null;
171187
foreach ($this->trace as $line) {
172188
if (\in_array($line['function'], ['require', 'require_once', 'include', 'include_once'], true)) {
@@ -179,25 +195,28 @@ public function isIndirect()
179195
if ('-' === $file || 'Standard input code' === $file || !realpath($file)) {
180196
continue;
181197
}
182-
if (!$this->pathOriginatesFromVendor($file)) {
183-
return false;
198+
if (self::PATH_TYPE_SELF === $this->getPathType($file)) {
199+
return self::TYPE_DIRECT;
200+
}
201+
if (self::PATH_TYPE_UNDETERMINED === $this->getPathType($file)) {
202+
return self::TYPE_UNDETERMINED;
184203
}
185204
if (null !== $erroringFile && null !== $erroringPackage) {
186205
$package = $this->getPackage($file);
187206
if ('composer' !== $package && $package !== $erroringPackage) {
188-
return true;
207+
return self::TYPE_INDIRECT;
189208
}
190209
continue;
191210
}
192211
$erroringFile = $file;
193212
$erroringPackage = $this->getPackage($file);
194213
}
195214

196-
return false;
215+
return self::TYPE_DIRECT;
197216
}
198217

199218
/**
200-
* pathOriginatesFromVendor() should always be called prior to calling this method.
219+
* getPathType() should always be called prior to calling this method.
201220
*
202221
* @param string $path
203222
*
@@ -237,6 +256,15 @@ private static function getVendors()
237256
$v = \dirname(\dirname($r->getFileName()));
238257
if (file_exists($v.'/composer/installed.json')) {
239258
self::$vendors[] = $v;
259+
$loader = require $v.'/autoload.php';
260+
$paths = self::getSourcePathsFromPrefixes(array_merge($loader->getPrefixes(), $loader->getPrefixesPsr4()));
261+
}
262+
}
263+
}
264+
foreach ($paths as $path) {
265+
foreach (self::$vendors as $vendor) {
266+
if (0 !== strpos($path, $vendor)) {
267+
self::$internalPaths[] = $path;
240268
}
241269
}
242270
}
@@ -245,24 +273,41 @@ private static function getVendors()
245273
return self::$vendors;
246274
}
247275

276+
private static function getSourcePathsFromPrefixes(array $prefixesByNamespace)
277+
{
278+
foreach ($prefixesByNamespace as $prefixes) {
279+
foreach ($prefixes as $prefix) {
280+
if (false !== realpath($prefix)) {
281+
yield realpath($prefix);
282+
}
283+
}
284+
}
285+
}
286+
248287
/**
249288
* @param string $path
250289
*
251-
* @return bool
290+
* @return string
252291
*/
253-
private function pathOriginatesFromVendor($path)
292+
private function getPathType($path)
254293
{
255294
$realPath = realpath($path);
256295
if (false === $realPath && '-' !== $path && 'Standard input code' !== $path) {
257-
return true;
296+
return self::PATH_TYPE_UNDETERMINED;
258297
}
259298
foreach (self::getVendors() as $vendor) {
260299
if (0 === strpos($realPath, $vendor) && false !== strpbrk(substr($realPath, \strlen($vendor), 1), '/'.\DIRECTORY_SEPARATOR)) {
261-
return true;
300+
return self::PATH_TYPE_VENDOR;
262301
}
263302
}
264303

265-
return false;
304+
foreach (self::$internalPaths as $internalPath) {
305+
if (0 === strpos($realPath, $internalPath)) {
306+
return self::PATH_TYPE_SELF;
307+
}
308+
}
309+
310+
return self::PATH_TYPE_UNDETERMINED;
266311
}
267312

268313
/**
@@ -281,19 +326,4 @@ public function toString()
281326
"\n".str_replace(' '.getcwd().\DIRECTORY_SEPARATOR, ' ', $exception->getTraceAsString()).
282327
"\n";
283328
}
284-
285-
private function getPackageFromLine(array $line)
286-
{
287-
if (!isset($line['file'])) {
288-
return 'internal function';
289-
}
290-
if (!$this->pathOriginatesFromVendor($line['file'])) {
291-
return 'source code';
292-
}
293-
try {
294-
return $this->getPackage($line['file']);
295-
} catch (\RuntimeException $e) {
296-
return 'unknown';
297-
}
298-
}
299329
}

‎src/Symfony/Bridge/PhpUnit/Tests/DeprecationErrorHandler/DeprecationTest.php

Copy file name to clipboardExpand all lines: src/Symfony/Bridge/PhpUnit/Tests/DeprecationErrorHandler/DeprecationTest.php
+2-2Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ public function testItCanDetermineTheClassWhereTheDeprecationHappened()
2727
public function testItCanTellWhetherItIsInternal()
2828
{
2929
$deprecation = new Deprecation('💩', $this->debugBacktrace(), __FILE__);
30-
$this->assertTrue($deprecation->isSelf());
30+
$this->assertSame(Deprecation::TYPE_SELF, $deprecation->getType());
3131
}
3232

3333
public function testLegacyTestMethodIsDetectedAsSuch()
@@ -46,7 +46,7 @@ public function testItCanBeConvertedToAString()
4646
public function testItRulesOutFilesOutsideVendorsAsIndirect()
4747
{
4848
$deprecation = new Deprecation('💩', $this->debugBacktrace(), __FILE__);
49-
$this->assertFalse($deprecation->isIndirect());
49+
$this->assertNotSame(Deprecation::TYPE_INDIRECT, $deprecation->getType());
5050
}
5151

5252
/**

‎src/Symfony/Bridge/PhpUnit/Tests/DeprecationErrorHandler/default.phpt

Copy file name to clipboardExpand all lines: src/Symfony/Bridge/PhpUnit/Tests/DeprecationErrorHandler/default.phpt
+4-6Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -73,15 +73,13 @@ Unsilenced deprecation notices (3)
7373
1x: unsilenced bar deprecation
7474
1x in FooTestCase::testNonLegacyBar
7575

76-
Remaining self deprecation notices (1)
77-
78-
1x: silenced bar deprecation
79-
1x in FooTestCase::testNonLegacyBar
80-
8176
Legacy deprecation notices (1)
8277

83-
Other deprecation notices (1)
78+
Other deprecation notices (2)
8479

8580
1x: root deprecation
8681

82+
1x: silenced bar deprecation
83+
1x in FooTestCase::testNonLegacyBar
84+
8785
I get precedence over any exit statements inside the deprecation error handler.

‎src/Symfony/Bridge/PhpUnit/Tests/DeprecationErrorHandler/disabled.phpt

Copy file name to clipboardExpand all lines: src/Symfony/Bridge/PhpUnit/Tests/DeprecationErrorHandler/disabled.phpt
+2-2Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
--TEST--
2-
Test DeprecationErrorHandler in weak mode
2+
Test DeprecationErrorHandler in disabled mode
33
--FILE--
44
<?php
55

6-
putenv('SYMFONY_DEPRECATIONS_HELPER=disabled');
6+
$_SERVER['SYMFONY_DEPRECATIONS_HELPER'] = 'disabled';
77
putenv('ANSICON');
88
putenv('ConEmuANSI');
99
putenv('TERM');
+24Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
--TEST--
2+
Test DeprecationErrorHandler in disabled mode (via putenv)
3+
--FILE--
4+
<?php
5+
6+
$_ENV['SYMFONY_DEPRECATIONS_HELPER'] = 'disabled';
7+
putenv('ANSICON');
8+
putenv('ConEmuANSI');
9+
putenv('TERM');
10+
11+
$vendor = __DIR__;
12+
while (!file_exists($vendor.'/vendor')) {
13+
$vendor = dirname($vendor);
14+
}
15+
define('PHPUNIT_COMPOSER_INSTALL', $vendor.'/vendor/autoload.php');
16+
require PHPUNIT_COMPOSER_INSTALL;
17+
require_once __DIR__.'/../../bootstrap.php';
18+
19+
echo (int) set_error_handler('var_dump');
20+
echo (int) class_exists('Symfony\Bridge\PhpUnit\DeprecationErrorHandler', false);
21+
22+
?>
23+
--EXPECTF--
24+
00

0 commit comments

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