Version in base suite: 6.4.41+dfsg-0+deb13u1 Base version: symfony_6.4.41+dfsg-0+deb13u1 Target version: symfony_6.4.49+dfsg-0+deb13u1 Base file: /srv/ftp-master.debian.org/ftp/pool/main/s/symfony/symfony_6.4.41+dfsg-0+deb13u1.dsc Target file: /srv/ftp-master.debian.org/policy/pool/main/s/symfony/symfony_6.4.49+dfsg-0+deb13u1.dsc .agents/skills/bug-triage/SKILL.md | 187 .agents/skills/hardening-rule/SKILL.md | 81 .agents/skills/merge-up/SKILL.md | 361 .agents/skills/pr-authoring/SKILL.md | 59 .agents/skills/pr-merge/SKILL.md | 283 .agents/skills/pr-review-merge-prep/SKILL.md | 83 .agents/skills/security-triage/SKILL.md | 175 .agents/skills/symfony-merge-up/SKILL.md | 207 .agents/skills/symfony-security-review/SKILL.md | 238 .agents/skills/symfony-security-review/hardening-families.md | 214 .agents/skills/sync-translations/SKILL.md | 204 .agents/skills/sync-translations/scripts/add_message.php | 176 .codespellrc | 9 .github/CODEOWNERS | 6 .github/PULL_REQUEST_TEMPLATE.md | 2 .github/dependabot.yml | 55 .github/deprecation-ignore | 19 .github/expected-missing-return-types.diff | 270 .github/sa-tools/.gitignore | 6 .github/sa-tools/check-hardening-tests.php | 259 .github/sa-tools/phpstan-diff.php | 72 .github/sa-tools/phpstan.baseline.neon | 2 .github/sa-tools/rules.neon | 4 .github/sa-tools/rules/HardenedComparisonRule.php | 83 .github/sa-tools/rules/UnserializeMissingAllowedClassesRule.php | 71 .github/sa-tools/rules/UnserializeToStringTrampolineRule.php | 136 .github/sa-tools/rules/bootstrap.php | 19 .github/sync-maintained-versions.php | 153 .github/sync-packages.php | 40 .github/workflows/fabbot.yml | 2 .github/workflows/integration-tests.yml | 23 .github/workflows/intl-data-tests.yml | 6 .github/workflows/package-tests.yml | 28 .github/workflows/phpunit-bridge.yml | 6 .github/workflows/scorecards.yml | 8 .github/workflows/shell-completion-tests.yml | 65 .github/workflows/static-analysis.yml | 81 .github/workflows/unit-tests.yml | 38 .github/workflows/windows.yml | 7 .github/workflows/zizmor.yml | 34 .php-cs-fixer.dist.php | 1 CHANGELOG-6.4.md | 967 ++ CONTRIBUTORS.md | 4174 ---------- composer.json | 6 debian/changelog | 32 debian/licensing/image-checksums.dcf | 8 debian/patches/Adapt-conflict-to-Debian-expectations.patch | 77 debian/patches/Add-more-tests-to-group-tty.patch | 8 debian/patches/Assume-php-async-aws-sqs-2.patch | 4 debian/patches/Cache-Disable-Test-failing-tests-Error-Class-not-found.patch | 37 debian/patches/Config-Partially-revert-4c2c5c9ba76ba8db9e88748ae519605c0.patch | 4 debian/patches/DEP-8/Tests-against-installed-classes.patch | 6 debian/patches/Declare-composer-group-for-tests-failing-outside-a-Compos.patch | 10 debian/patches/DependencyInjection-Don-t-override-final-method-PHPUnit-F.patch | 30 debian/patches/DependencyInjection-Drop-parts-of-expectated-output.patch | 10 debian/patches/Drop-composer-runtime-api-that-confuses-phpabtpl.patch | 8 debian/patches/Drop-listeners-from-phpunit.xml.patch | 4 debian/patches/Drop-test-currently-failing-on-buildd.patch | 4 debian/patches/ErrorHandler-Skip-tests-currently-failing.patch | 6 debian/patches/Filesystem-Drop-currently-failing-tests.patch | 67 debian/patches/Group-jwt-for-tests-depending-on-it.patch | 26 debian/patches/Group-nophpunit11-for-tests-failing-with-PHPUnit-11.patch | 60 debian/patches/HttpClient-Skip-test-currently-failing.patch | 22 debian/patches/HttpClient-Skip-tests-relying-on-amphp-http-client.patch | 27 debian/patches/Increasing-timeout-in-test-AbstractProcessTest-testS.patch | 4 debian/patches/Lock-Drop-test-currently-failing-on-buildd.patch | 4 debian/patches/PhpUnit-Skip-tests-currently-failing.patch | 4 debian/patches/Remove-calls-to-getExpectedException.patch | 12 debian/patches/Revert-ErrorHandler-Skip-same-vendor-method-deprecations-.patch | 2 debian/patches/Revert-Mailer-Notifier-Reject-Mailgun-SendGrid-and-Vonage.patch | 422 + debian/patches/Revert-Mailer-Sendgrid-Verify-the-webhook-signature-befor.patch | 91 debian/patches/Revert-Notifier-Vonage-Verify-the-payload_hash-claim-of-s.patch | 118 debian/patches/Revert-PhpUnitBridge-Honor-stderr-for-listener-output.patch | 117 debian/patches/Use-installed-files-for-CI.patch | 4 debian/patches/VarDumper-Fix-expected-output-for-arm-and-32-bit-arch.patch | 20 debian/patches/Workaround-dh_phpcomposer-limitations.patch | 6 debian/patches/Yaml-Drop-data-set-currently-failing-on-i386.patch | 6 debian/patches/group-network-for-test-failing-without-network.patch | 2 debian/patches/series | 6 debian/rules | 2 debian/tests/phpunit | 1 phpstan.dist.neon | 3 phpunit.xml.dist | 1 src/Symfony/Bridge/Doctrine/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Bridge/Doctrine/.github/workflows/close-pull-request.yml | 20 src/Symfony/Bridge/Doctrine/CacheWarmer/ProxyCacheWarmer.php | 4 src/Symfony/Bridge/Doctrine/ContainerAwareEventManager.php | 76 src/Symfony/Bridge/Doctrine/DataCollector/DoctrineDataCollector.php | 26 src/Symfony/Bridge/Doctrine/DependencyInjection/AbstractDoctrineExtension.php | 7 src/Symfony/Bridge/Doctrine/DependencyInjection/CompilerPass/RegisterMappingsPass.php | 2 src/Symfony/Bridge/Doctrine/Form/ChoiceList/ORMQueryBuilderLoader.php | 9 src/Symfony/Bridge/Doctrine/Middleware/Debug/Query.php | 6 src/Symfony/Bridge/Doctrine/PropertyInfo/DoctrineExtractor.php | 9 src/Symfony/Bridge/Doctrine/SchemaListener/AbstractSchemaListener.php | 155 src/Symfony/Bridge/Doctrine/SchemaListener/DoctrineDbalCacheAdapterSchemaListener.php | 8 src/Symfony/Bridge/Doctrine/SchemaListener/LockStoreSchemaListener.php | 8 src/Symfony/Bridge/Doctrine/SchemaListener/MessengerTransportDoctrineSchemaListener.php | 8 src/Symfony/Bridge/Doctrine/SchemaListener/PdoSessionHandlerSchemaListener.php | 8 src/Symfony/Bridge/Doctrine/SchemaListener/RememberMeTokenProviderDoctrineSchemaListener.php | 9 src/Symfony/Bridge/Doctrine/Security/RememberMe/DoctrineTokenProvider.php | 83 src/Symfony/Bridge/Doctrine/Tests/CacheWarmer/ProxyCacheWarmerTest.php | 63 src/Symfony/Bridge/Doctrine/Tests/ContainerAwareEventManagerTest.php | 98 src/Symfony/Bridge/Doctrine/Tests/DataCollector/DoctrineDataCollectorTest.php | 59 src/Symfony/Bridge/Doctrine/Tests/DataCollector/DoctrineDataCollectorWithDebugStackTest.php | 11 src/Symfony/Bridge/Doctrine/Tests/DependencyInjection/DoctrineExtensionTest.php | 26 src/Symfony/Bridge/Doctrine/Tests/DoctrineTestHelper.php | 27 src/Symfony/Bridge/Doctrine/Tests/Fixtures/DoctrineLoaderParentEntity.php | 4 src/Symfony/Bridge/Doctrine/Tests/Form/ChoiceList/ORMQueryBuilderLoaderTest.php | 44 src/Symfony/Bridge/Doctrine/Tests/PropertyInfo/DoctrineExtractorTest.php | 37 src/Symfony/Bridge/Doctrine/Tests/PropertyInfo/Fixtures/DoctrineDummy.php | 9 src/Symfony/Bridge/Doctrine/Tests/PropertyInfo/Fixtures/DoctrineRelation.php | 3 src/Symfony/Bridge/Doctrine/Tests/SchemaListener/DoctrineDbalCacheAdapterSchemaListenerTest.php | 17 src/Symfony/Bridge/Doctrine/Tests/SchemaListener/LockStoreSchemaListenerTest.php | 20 src/Symfony/Bridge/Doctrine/Tests/SchemaListener/MessengerTransportDoctrineSchemaListenerTest.php | 72 src/Symfony/Bridge/Doctrine/Tests/SchemaListener/PdoSessionHandlerSchemaListenerTest.php | 42 src/Symfony/Bridge/Doctrine/Tests/SchemaListener/RememberMeTokenProviderDoctrineSchemaListenerTest.php | 4 src/Symfony/Bridge/Doctrine/Tests/Security/RememberMe/DoctrineTokenProviderTest.php | 19 src/Symfony/Bridge/Doctrine/Tests/TestRepositoryFactory.php | 2 src/Symfony/Bridge/Doctrine/Tests/Types/UlidTypeTest.php | 12 src/Symfony/Bridge/Doctrine/Tests/Types/UuidTypeTest.php | 12 src/Symfony/Bridge/Doctrine/Tests/Validator/Constraints/UniqueEntityValidatorTest.php | 5 src/Symfony/Bridge/Doctrine/Tests/Validator/DoctrineLoaderTest.php | 6 src/Symfony/Bridge/Doctrine/Validator/Constraints/UniqueEntityValidator.php | 2 src/Symfony/Bridge/Doctrine/composer.json | 2 src/Symfony/Bridge/Monolog/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Bridge/Monolog/.github/workflows/close-pull-request.yml | 20 src/Symfony/Bridge/Monolog/Formatter/ConsoleFormatter.php | 19 src/Symfony/Bridge/Monolog/Handler/NotifierHandler.php | 8 src/Symfony/Bridge/Monolog/Processor/ConsoleCommandProcessor.php | 25 src/Symfony/Bridge/Monolog/Processor/DebugProcessor.php | 2 src/Symfony/Bridge/Monolog/Tests/Formatter/ConsoleFormatterTest.php | 33 src/Symfony/Bridge/Monolog/Tests/Handler/NotifierHandlerTest.php | 121 src/Symfony/Bridge/Monolog/Tests/Processor/ConsoleCommandProcessorTest.php | 114 src/Symfony/Bridge/Monolog/composer.json | 3 src/Symfony/Bridge/PhpUnit/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Bridge/PhpUnit/.github/workflows/close-pull-request.yml | 20 src/Symfony/Bridge/PhpUnit/ClockMock.php | 6 src/Symfony/Bridge/PhpUnit/DeprecationErrorHandler.php | 13 src/Symfony/Bridge/PhpUnit/DeprecationErrorHandler/Deprecation.php | 19 src/Symfony/Bridge/PhpUnit/Legacy/SymfonyTestsListenerTrait.php | 19 src/Symfony/Bridge/PhpUnit/Tests/ClockMockTest.php | 16 src/Symfony/Bridge/PhpUnit/Tests/DeprecationErrorHandler/DeprecationTest.php | 14 src/Symfony/Bridge/PhpUnit/Tests/SimplePhpunitTest.php | 63 src/Symfony/Bridge/PhpUnit/Tests/SymfonyTestsListenerTest.php | 60 src/Symfony/Bridge/PhpUnit/bin/simple-phpunit.php | 18 src/Symfony/Bridge/ProxyManager/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Bridge/ProxyManager/.github/workflows/close-pull-request.yml | 20 src/Symfony/Bridge/PsrHttpMessage/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Bridge/PsrHttpMessage/.github/workflows/close-pull-request.yml | 20 src/Symfony/Bridge/PsrHttpMessage/ArgumentValueResolver/PsrServerRequestResolver.php | 2 src/Symfony/Bridge/PsrHttpMessage/Tests/ArgumentValueResolver/PsrServerRequestResolverTest.php | 8 src/Symfony/Bridge/Twig/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Bridge/Twig/.github/workflows/close-pull-request.yml | 20 src/Symfony/Bridge/Twig/Command/DebugCommand.php | 2 src/Symfony/Bridge/Twig/Form/TwigRendererEngine.php | 116 src/Symfony/Bridge/Twig/Mime/NotificationEmail.php | 4 src/Symfony/Bridge/Twig/Mime/TemplatedEmail.php | 7 src/Symfony/Bridge/Twig/Node/SearchAndRenderBlockNode.php | 12 src/Symfony/Bridge/Twig/Resources/views/Form/bootstrap_3_layout.html.twig | 4 src/Symfony/Bridge/Twig/Resources/views/Form/bootstrap_4_layout.html.twig | 8 src/Symfony/Bridge/Twig/Resources/views/Form/form_div_layout.html.twig | 6 src/Symfony/Bridge/Twig/Resources/views/Form/foundation_5_layout.html.twig | 4 src/Symfony/Bridge/Twig/Test/FormLayoutTestCase.php | 8 src/Symfony/Bridge/Twig/Tests/Extension/AbstractBootstrap4LayoutTestCase.php | 63 src/Symfony/Bridge/Twig/Tests/Extension/AbstractBootstrap5LayoutTestCase.php | 61 src/Symfony/Bridge/Twig/Tests/Extension/FormExtensionDivLayoutTest.php | 27 src/Symfony/Bridge/Twig/Tests/Extension/FormExtensionFoundation6LayoutTest.php | 243 src/Symfony/Bridge/Twig/Tests/Form/TwigRendererEngineTest.php | 96 src/Symfony/Bridge/Twig/Tests/Mime/TemplatedEmailTest.php | 51 src/Symfony/Bridge/Twig/Tests/Node/SearchAndRenderBlockNodeTest.php | 34 src/Symfony/Bridge/Twig/Tests/Node/TransNodeTest.php | 4 src/Symfony/Bridge/Twig/Tests/NodeVisitor/TwigNodeProvider.php | 3 src/Symfony/Bridge/Twig/Tests/Translation/TwigExtractorTest.php | 2 src/Symfony/Bridge/Twig/composer.json | 4 src/Symfony/Bundle/DebugBundle/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Bundle/DebugBundle/.github/workflows/close-pull-request.yml | 20 src/Symfony/Bundle/FrameworkBundle/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Bundle/FrameworkBundle/.github/workflows/close-pull-request.yml | 20 src/Symfony/Bundle/FrameworkBundle/CacheWarmer/AbstractPhpFileCacheWarmer.php | 2 src/Symfony/Bundle/FrameworkBundle/Command/AbstractConfigCommand.php | 6 src/Symfony/Bundle/FrameworkBundle/Command/CacheClearCommand.php | 30 src/Symfony/Bundle/FrameworkBundle/Command/CachePoolClearCommand.php | 6 src/Symfony/Bundle/FrameworkBundle/Command/ContainerLintCommand.php | 5 src/Symfony/Bundle/FrameworkBundle/Command/DebugAutowiringCommand.php | 8 src/Symfony/Bundle/FrameworkBundle/Command/EventDispatcherDebugCommand.php | 2 src/Symfony/Bundle/FrameworkBundle/Command/SecretsGenerateKeysCommand.php | 6 src/Symfony/Bundle/FrameworkBundle/Console/Descriptor/Descriptor.php | 42 src/Symfony/Bundle/FrameworkBundle/Console/Descriptor/JsonDescriptor.php | 6 src/Symfony/Bundle/FrameworkBundle/Console/Descriptor/MarkdownDescriptor.php | 4 src/Symfony/Bundle/FrameworkBundle/Console/Descriptor/TextDescriptor.php | 33 src/Symfony/Bundle/FrameworkBundle/Console/Descriptor/XmlDescriptor.php | 8 src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Compiler/ErrorLoggerCompilerPass.php | 2 src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Compiler/TestServiceContainerRealRefPass.php | 16 src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Configuration.php | 27 src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php | 132 src/Symfony/Bundle/FrameworkBundle/EventListener/ConsoleProfilerListener.php | 13 src/Symfony/Bundle/FrameworkBundle/KernelBrowser.php | 1 src/Symfony/Bundle/FrameworkBundle/Resources/config/asset_mapper.php | 5 src/Symfony/Bundle/FrameworkBundle/Resources/config/cache_debug.php | 10 src/Symfony/Bundle/FrameworkBundle/Resources/config/collectors.php | 6 src/Symfony/Bundle/FrameworkBundle/Resources/config/notifier.php | 1 src/Symfony/Bundle/FrameworkBundle/Resources/config/routing.php | 5 src/Symfony/Bundle/FrameworkBundle/Resources/config/scheduler.php | 1 src/Symfony/Bundle/FrameworkBundle/Resources/config/web.php | 12 src/Symfony/Bundle/FrameworkBundle/Routing/RequestContextResetter.php | 45 src/Symfony/Bundle/FrameworkBundle/Routing/Router.php | 4 src/Symfony/Bundle/FrameworkBundle/Secrets/AbstractVault.php | 24 src/Symfony/Bundle/FrameworkBundle/Secrets/DotenvVault.php | 2 src/Symfony/Bundle/FrameworkBundle/Secrets/SodiumVault.php | 140 src/Symfony/Bundle/FrameworkBundle/Test/HttpClientAssertionsTrait.php | 28 src/Symfony/Bundle/FrameworkBundle/Test/KernelTestCase.php | 3 src/Symfony/Bundle/FrameworkBundle/Test/TestBrowserToken.php | 4 src/Symfony/Bundle/FrameworkBundle/Test/TestContainer.php | 11 src/Symfony/Bundle/FrameworkBundle/Tests/Command/CacheClearCommand/CacheClearCommandTest.php | 67 src/Symfony/Bundle/FrameworkBundle/Tests/Command/CacheClearCommand/Fixture/TestAppKernel.php | 13 src/Symfony/Bundle/FrameworkBundle/Tests/Command/CachePoolClearCommandTest.php | 24 src/Symfony/Bundle/FrameworkBundle/Tests/Command/SecretsGenerateKeysCommandTest.php | 229 src/Symfony/Bundle/FrameworkBundle/Tests/Console/Descriptor/AbstractDescriptorTestCase.php | 26 src/Symfony/Bundle/FrameworkBundle/Tests/Console/Descriptor/ObjectsProvider.php | 38 src/Symfony/Bundle/FrameworkBundle/Tests/Console/Descriptor/TextDescriptorTest.php | 64 src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Compiler/ErrorLoggerCompilerPassTest.php | 55 src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Compiler/UnusedTagsPassUtils.php | 6 src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/ConfigurationTest.php | 61 src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/FrameworkExtensionTestCase.php | 178 src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/PhpFrameworkExtensionTest.php | 11 src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/AbstractDefinitionClass.php | 7 src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Descriptor/builder_tagged_item_priority_tag.json | 97 src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Descriptor/builder_tagged_item_priority_tag.md | 68 src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Descriptor/builder_tagged_item_priority_tag.txt | 12 src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Descriptor/builder_tagged_item_priority_tag.xml | 35 src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Descriptor/deprecated_parameter.txt | 2 src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Descriptor/deprecated_parameters.txt | 2 src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Descriptor/route_1_link.txt | 2 src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Descriptor/route_1_link_raw.txt | 18 src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Descriptor/route_2_link.txt | 2 src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Descriptor/route_2_link_raw.txt | 18 src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Descriptor/route_collection_1_link.txt | 6 src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Descriptor/route_collection_1_link_raw.txt | 6 src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/GcFunctionMock.php | 17 src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/TaggedConsumer.php | 10 src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/TaggedItem.php | 10 src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/gc-function-mock.php | 21 src/Symfony/Bundle/FrameworkBundle/Tests/Functional/Bundle/ServicesInBuildTestBundle/ServicesInBuildTestBundle.php | 25 src/Symfony/Bundle/FrameworkBundle/Tests/Functional/Bundle/TestBundle/Controller/HttpClientController.php | 1 src/Symfony/Bundle/FrameworkBundle/Tests/Functional/ConfigDebugCommandTest.php | 13 src/Symfony/Bundle/FrameworkBundle/Tests/Functional/ConfigDumpReferenceCommandTest.php | 2 src/Symfony/Bundle/FrameworkBundle/Tests/Functional/ConsoleProfilerTest.php | 108 src/Symfony/Bundle/FrameworkBundle/Tests/Functional/ContainerLintCommandTest.php | 15 src/Symfony/Bundle/FrameworkBundle/Tests/Functional/DebugAutowiringCommandTest.php | 28 src/Symfony/Bundle/FrameworkBundle/Tests/Functional/HttpClientTest.php | 48 src/Symfony/Bundle/FrameworkBundle/Tests/Functional/MailerTest.php | 17 src/Symfony/Bundle/FrameworkBundle/Tests/Functional/RoutingConditionServiceTest.php | 59 src/Symfony/Bundle/FrameworkBundle/Tests/Functional/SerializerTest.php | 33 src/Symfony/Bundle/FrameworkBundle/Tests/Functional/TestServiceContainerTest.php | 81 src/Symfony/Bundle/FrameworkBundle/Tests/Functional/app/ConfigDump/bundles.php | 2 src/Symfony/Bundle/FrameworkBundle/Tests/Functional/app/ConsoleProfiler/bundles.php | 16 src/Symfony/Bundle/FrameworkBundle/Tests/Functional/app/ConsoleProfiler/config.yml | 13 src/Symfony/Bundle/FrameworkBundle/Tests/Functional/app/ContainerDebug/config.yml | 9 src/Symfony/Bundle/FrameworkBundle/Tests/Functional/app/ContainerLint/bundles.php | 16 src/Symfony/Bundle/FrameworkBundle/Tests/Functional/app/ContainerLint/config.yml | 13 src/Symfony/Bundle/FrameworkBundle/Tests/Functional/app/TestServiceContainer/services.yml | 12 src/Symfony/Bundle/FrameworkBundle/Tests/KernelBrowserTest.php | 16 src/Symfony/Bundle/FrameworkBundle/Tests/Routing/RouterTest.php | 17 src/Symfony/Bundle/FrameworkBundle/Tests/Secrets/DotenvVaultTest.php | 13 src/Symfony/Bundle/FrameworkBundle/Tests/Secrets/SodiumVaultTest.php | 186 src/Symfony/Bundle/FrameworkBundle/Tests/Test/KernelTestCaseTest.php | 114 src/Symfony/Bundle/FrameworkBundle/composer.json | 10 src/Symfony/Bundle/SecurityBundle/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Bundle/SecurityBundle/.github/workflows/close-pull-request.yml | 20 src/Symfony/Bundle/SecurityBundle/CacheWarmer/ExpressionCacheWarmer.php | 2 src/Symfony/Bundle/SecurityBundle/Command/DebugFirewallCommand.php | 2 src/Symfony/Bundle/SecurityBundle/DependencyInjection/Compiler/AddSessionDomainConstraintPass.php | 5 src/Symfony/Bundle/SecurityBundle/DependencyInjection/MainConfiguration.php | 4 src/Symfony/Bundle/SecurityBundle/DependencyInjection/Security/Factory/LdapFactoryTrait.php | 14 src/Symfony/Bundle/SecurityBundle/DependencyInjection/Security/Factory/LoginThrottlingFactory.php | 13 src/Symfony/Bundle/SecurityBundle/DependencyInjection/Security/Factory/RememberMeFactory.php | 10 src/Symfony/Bundle/SecurityBundle/DependencyInjection/SecurityExtension.php | 28 src/Symfony/Bundle/SecurityBundle/Resources/config/security.php | 4 src/Symfony/Bundle/SecurityBundle/Resources/config/security_authenticator_remember_me.php | 2 src/Symfony/Bundle/SecurityBundle/Tests/CacheWarmer/ExpressionCacheWarmerTest.php | 25 src/Symfony/Bundle/SecurityBundle/Tests/DependencyInjection/Compiler/AddSessionDomainConstraintPassTest.php | 22 src/Symfony/Bundle/SecurityBundle/Tests/DependencyInjection/Security/Factory/LoginThrottlingFactoryTest.php | 113 src/Symfony/Bundle/SecurityBundle/Tests/DependencyInjection/SecurityExtensionTest.php | 199 src/Symfony/Bundle/SecurityBundle/Tests/Functional/AccessTokenTest.php | 3 src/Symfony/Bundle/SecurityBundle/Tests/Functional/LogoutTest.php | 2 src/Symfony/Bundle/SecurityBundle/Tests/Functional/RememberMeTest.php | 51 src/Symfony/Bundle/SecurityBundle/Tests/Functional/SecurityTest.php | 30 src/Symfony/Bundle/SecurityBundle/Tests/Functional/app/Logout/config_cookie_clearing.yml | 2 src/Symfony/Bundle/SecurityBundle/Tests/Functional/app/RememberMe/clear_on_change_explicit_persistent_config.yml | 8 src/Symfony/Bundle/SecurityBundle/Tests/Functional/app/RememberMe/clear_on_change_persistent_config.yml | 9 src/Symfony/Bundle/SecurityBundle/Tests/Functional/app/SecurityHelper/config.yml | 4 src/Symfony/Bundle/SecurityBundle/composer.json | 4 src/Symfony/Bundle/TwigBundle/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Bundle/TwigBundle/.github/workflows/close-pull-request.yml | 20 src/Symfony/Bundle/TwigBundle/DependencyInjection/TwigExtension.php | 18 src/Symfony/Bundle/TwigBundle/TemplateIterator.php | 2 src/Symfony/Bundle/TwigBundle/Tests/DependencyInjection/TwigExtensionTest.php | 31 src/Symfony/Bundle/TwigBundle/Tests/TemplateIteratorTest.php | 19 src/Symfony/Bundle/TwigBundle/composer.json | 2 src/Symfony/Bundle/WebProfilerBundle/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Bundle/WebProfilerBundle/.github/workflows/close-pull-request.yml | 20 src/Symfony/Bundle/WebProfilerBundle/Controller/ProfilerController.php | 6 src/Symfony/Bundle/WebProfilerBundle/Resources/views/Collector/form.html.twig | 2 src/Symfony/Bundle/WebProfilerBundle/Resources/views/Collector/mailer.html.twig | 381 src/Symfony/Bundle/WebProfilerBundle/Resources/views/Collector/messenger.html.twig | 14 src/Symfony/Bundle/WebProfilerBundle/Resources/views/Collector/request.html.twig | 6 src/Symfony/Bundle/WebProfilerBundle/Resources/views/Collector/serializer.html.twig | 10 src/Symfony/Bundle/WebProfilerBundle/Resources/views/Collector/time.html.twig | 2 src/Symfony/Bundle/WebProfilerBundle/Resources/views/Collector/translation.html.twig | 2 src/Symfony/Bundle/WebProfilerBundle/Resources/views/Collector/workflow.html.twig | 4 src/Symfony/Bundle/WebProfilerBundle/Resources/views/Profiler/base_js.html.twig | 6 src/Symfony/Bundle/WebProfilerBundle/Resources/views/Profiler/toolbar.css.twig | 9 src/Symfony/Bundle/WebProfilerBundle/Resources/views/Profiler/toolbar_js.html.twig | 16 src/Symfony/Bundle/WebProfilerBundle/Tests/Controller/ProfilerControllerTest.php | 13 src/Symfony/Bundle/WebProfilerBundle/Tests/Functional/WebProfilerBundleKernel.php | 4 src/Symfony/Bundle/WebProfilerBundle/Tests/Resources/MailerPanelTest.php | 124 src/Symfony/Bundle/WebProfilerBundle/Tests/Resources/MessengerPanelTest.php | 78 src/Symfony/Bundle/WebProfilerBundle/Tests/Resources/PanelMacroCallsTest.php | 109 src/Symfony/Bundle/WebProfilerBundle/Tests/Resources/WorkflowPanelTest.php | 84 src/Symfony/Bundle/WebProfilerBundle/Twig/WebProfilerExtension.php | 30 src/Symfony/Bundle/WebProfilerBundle/composer.json | 2 src/Symfony/Component/Asset/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/Asset/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/Asset/VersionStrategy/JsonManifestVersionStrategy.php | 2 src/Symfony/Component/AssetMapper/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/AssetMapper/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/AssetMapper/Command/ImportMapAuditCommand.php | 2 src/Symfony/Component/AssetMapper/Factory/CachedMappedAssetFactory.php | 18 src/Symfony/Component/AssetMapper/Factory/MappedAssetFactory.php | 63 src/Symfony/Component/AssetMapper/Factory/NonCachingSelfCheckingResourceChecker.php | 37 src/Symfony/Component/AssetMapper/ImportMap/ImportMapGenerator.php | 12 src/Symfony/Component/AssetMapper/ImportMap/ImportMapManager.php | 20 src/Symfony/Component/AssetMapper/ImportMap/ImportMapRenderer.php | 2 src/Symfony/Component/AssetMapper/ImportMap/ImportMapVersionChecker.php | 13 src/Symfony/Component/AssetMapper/ImportMap/Resolver/JsDelivrEsmResolver.php | 4 src/Symfony/Component/AssetMapper/MapperAwareAssetPackage.php | 35 src/Symfony/Component/AssetMapper/Tests/Factory/CachedMappedAssetFactoryTest.php | 79 src/Symfony/Component/AssetMapper/Tests/Factory/MappedAssetFactoryTest.php | 68 src/Symfony/Component/AssetMapper/Tests/ImportMap/ImportMapGeneratorTest.php | 98 src/Symfony/Component/AssetMapper/Tests/ImportMap/ImportMapManagerTest.php | 97 src/Symfony/Component/AssetMapper/Tests/ImportMap/ImportMapRendererTest.php | 15 src/Symfony/Component/AssetMapper/Tests/ImportMap/ImportMapVersionCheckerTest.php | 26 src/Symfony/Component/AssetMapper/Tests/ImportMap/RemotePackageStorageTest.php | 2 src/Symfony/Component/AssetMapper/Tests/MapperAwareAssetPackageTest.php | 200 src/Symfony/Component/BrowserKit/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/BrowserKit/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/BrowserKit/AbstractBrowser.php | 16 src/Symfony/Component/BrowserKit/Cookie.php | 39 src/Symfony/Component/BrowserKit/CookieJar.php | 49 src/Symfony/Component/BrowserKit/History.php | 2 src/Symfony/Component/BrowserKit/HttpBrowser.php | 17 src/Symfony/Component/BrowserKit/Response.php | 2 src/Symfony/Component/BrowserKit/Tests/AbstractBrowserTest.php | 30 src/Symfony/Component/BrowserKit/Tests/CookieJarTest.php | 79 src/Symfony/Component/BrowserKit/Tests/CookieTest.php | 87 src/Symfony/Component/BrowserKit/Tests/HttpBrowserTest.php | 50 src/Symfony/Component/BrowserKit/composer.json | 1 src/Symfony/Component/Cache/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/Cache/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/Cache/Adapter/AbstractTagAwareAdapter.php | 5 src/Symfony/Component/Cache/Adapter/ArrayAdapter.php | 6 src/Symfony/Component/Cache/Adapter/CouchbaseCollectionAdapter.php | 4 src/Symfony/Component/Cache/Adapter/DoctrineDbalAdapter.php | 59 src/Symfony/Component/Cache/Adapter/PhpArrayAdapter.php | 16 src/Symfony/Component/Cache/Adapter/ProxyAdapter.php | 2 src/Symfony/Component/Cache/Adapter/RedisTagAwareAdapter.php | 59 src/Symfony/Component/Cache/Adapter/TagAwareAdapter.php | 20 src/Symfony/Component/Cache/DependencyInjection/CachePoolPass.php | 22 src/Symfony/Component/Cache/LockRegistry.php | 35 src/Symfony/Component/Cache/Marshaller/DefaultMarshaller.php | 2 src/Symfony/Component/Cache/Marshaller/SodiumMarshaller.php | 10 src/Symfony/Component/Cache/Marshaller/TagAwareMarshaller.php | 2 src/Symfony/Component/Cache/Psr16Cache.php | 25 src/Symfony/Component/Cache/Tests/Adapter/AdapterTestCase.php | 7 src/Symfony/Component/Cache/Tests/Adapter/ArrayAdapterTest.php | 16 src/Symfony/Component/Cache/Tests/Adapter/DoctrineDbalAdapterTest.php | 19 src/Symfony/Component/Cache/Tests/Adapter/PhpArrayAdapterTest.php | 40 src/Symfony/Component/Cache/Tests/Adapter/PredisAdapterTest.php | 41 src/Symfony/Component/Cache/Tests/Adapter/RedisAdapterTest.php | 12 src/Symfony/Component/Cache/Tests/Adapter/RedisTagAwareAdapterPolicyTest.php | 70 src/Symfony/Component/Cache/Tests/Adapter/RedisTagAwareRelayAdapterTest.php | 53 src/Symfony/Component/Cache/Tests/Adapter/TagAwareAdapterTest.php | 17 src/Symfony/Component/Cache/Tests/Adapter/TagAwareTestTrait.php | 22 src/Symfony/Component/Cache/Tests/DependencyInjection/CachePoolPassTest.php | 86 src/Symfony/Component/Cache/Tests/LockRegistryTest.php | 196 src/Symfony/Component/Cache/Tests/Marshaller/SodiumMarshallerTest.php | 55 src/Symfony/Component/Cache/Tests/Psr16CacheTest.php | 40 src/Symfony/Component/Cache/Tests/Traits/RedisTraitTcpKeepaliveTest.php | 33 src/Symfony/Component/Cache/Tests/Traits/RedisTraitTest.php | 155 src/Symfony/Component/Cache/Traits/ContractsTrait.php | 2 src/Symfony/Component/Cache/Traits/FilesystemCommonTrait.php | 4 src/Symfony/Component/Cache/Traits/Redis5Proxy.php | 2 src/Symfony/Component/Cache/Traits/Redis6Proxy.php | 2 src/Symfony/Component/Cache/Traits/RedisCluster5Proxy.php | 2 src/Symfony/Component/Cache/Traits/RedisCluster6Proxy.php | 2 src/Symfony/Component/Cache/Traits/RedisTrait.php | 60 src/Symfony/Component/Cache/Traits/Relay/NullableReturnTrait.php | 43 src/Symfony/Component/Cache/Traits/Relay/Relay12Trait.php | 88 src/Symfony/Component/Cache/Traits/Relay/Relay30Trait.php | 46 src/Symfony/Component/Cache/Traits/Relay/Relay40Trait.php | 99 src/Symfony/Component/Cache/Traits/Relay/Relay502Trait.php | 266 src/Symfony/Component/Cache/Traits/Relay/Relay50Trait.php | 32 src/Symfony/Component/Cache/Traits/RelayProxy.php | 133 src/Symfony/Component/Cache/composer.json | 2 src/Symfony/Component/Clock/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/Clock/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/Clock/DatePoint.php | 56 src/Symfony/Component/Clock/MockClock.php | 12 src/Symfony/Component/Clock/Tests/DatePointTest.php | 77 src/Symfony/Component/Clock/Tests/MockClockTest.php | 25 src/Symfony/Component/Clock/Tests/MonotonicClockTest.php | 5 src/Symfony/Component/Config/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/Config/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/Config/Builder/ConfigBuilderGenerator.php | 2 src/Symfony/Component/Config/Definition/ArrayNode.php | 6 src/Symfony/Component/Config/Definition/Builder/ArrayNodeDefinition.php | 8 src/Symfony/Component/Config/Definition/Builder/VariableNodeDefinition.php | 2 src/Symfony/Component/Config/Definition/Dumper/XmlReferenceDumper.php | 12 src/Symfony/Component/Config/Definition/Dumper/YamlReferenceDumper.php | 7 src/Symfony/Component/Config/FileLocator.php | 2 src/Symfony/Component/Config/Resource/ClassExistenceResource.php | 6 src/Symfony/Component/Config/Resource/GlobResource.php | 6 src/Symfony/Component/Config/ResourceCheckerConfigCache.php | 2 src/Symfony/Component/Config/Tests/Builder/Fixtures/NodeWithCommentEnd.php | 35 src/Symfony/Component/Config/Tests/Builder/GeneratedConfigTest.php | 22 src/Symfony/Component/Config/Tests/Definition/Dumper/XmlReferenceDumperTest.php | 31 src/Symfony/Component/Config/Tests/Definition/Dumper/YamlReferenceDumperTest.php | 77 src/Symfony/Component/Config/Util/XmlUtils.php | 2 src/Symfony/Component/Console/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/Console/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/Console/Application.php | 20 src/Symfony/Component/Console/Color.php | 4 src/Symfony/Component/Console/Command/Command.php | 10 src/Symfony/Component/Console/Command/CompleteCommand.php | 51 src/Symfony/Component/Console/Command/LockableTrait.php | 12 src/Symfony/Component/Console/Debug/CliRequest.php | 8 src/Symfony/Component/Console/Descriptor/MarkdownDescriptor.php | 2 src/Symfony/Component/Console/Descriptor/TextDescriptor.php | 2 src/Symfony/Component/Console/Formatter/OutputFormatter.php | 290 src/Symfony/Component/Console/Formatter/OutputFormatterStyle.php | 17 src/Symfony/Component/Console/Helper/OutputWrapper.php | 5 src/Symfony/Component/Console/Helper/ProcessHelper.php | 6 src/Symfony/Component/Console/Helper/ProgressBar.php | 9 src/Symfony/Component/Console/Helper/QuestionHelper.php | 12 src/Symfony/Component/Console/Helper/SymfonyQuestionHelper.php | 4 src/Symfony/Component/Console/Helper/Table.php | 269 src/Symfony/Component/Console/Helper/TerminalInputHelper.php | 18 src/Symfony/Component/Console/Input/ArgvInput.php | 6 src/Symfony/Component/Console/Input/Input.php | 2 src/Symfony/Component/Console/Input/InputDefinition.php | 2 src/Symfony/Component/Console/Input/StringInput.php | 2 src/Symfony/Component/Console/Messenger/RunCommandMessageHandler.php | 3 src/Symfony/Component/Console/Output/ConsoleOutput.php | 20 src/Symfony/Component/Console/Output/ConsoleSectionOutput.php | 98 src/Symfony/Component/Console/Resources/completion.bash | 48 src/Symfony/Component/Console/Resources/completion.fish | 9 src/Symfony/Component/Console/Resources/completion.zsh | 34 src/Symfony/Component/Console/Style/SymfonyStyle.php | 9 src/Symfony/Component/Console/Tests/ApplicationTest.php | 67 src/Symfony/Component/Console/Tests/Command/CompleteCommandTest.php | 60 src/Symfony/Component/Console/Tests/Command/ListCommandTest.php | 15 src/Symfony/Component/Console/Tests/Command/LockableTraitTest.php | 12 src/Symfony/Component/Console/Tests/Descriptor/TextDescriptorTest.php | 10 src/Symfony/Component/Console/Tests/Fixtures/FooLockReleaseFailureCommand.php | 43 src/Symfony/Component/Console/Tests/Fixtures/Style/SymfonyStyle/command/command_21.php | 2 src/Symfony/Component/Console/Tests/Fixtures/Style/SymfonyStyle/output/output_21.txt | 2 src/Symfony/Component/Console/Tests/Fixtures/Style/SymfonyStyle/output/output_8.txt | 2 src/Symfony/Component/Console/Tests/Fixtures/application_nested_signal.php | 61 src/Symfony/Component/Console/Tests/Fixtures/command_mbstring.txt | 2 src/Symfony/Component/Console/Tests/Fixtures/terminal_input_helper_bad_state.php | 21 src/Symfony/Component/Console/Tests/Formatter/OutputFormatterStyleTest.php | 30 src/Symfony/Component/Console/Tests/Formatter/OutputFormatterTest.php | 119 src/Symfony/Component/Console/Tests/Helper/OutputWrapperTest.php | 26 src/Symfony/Component/Console/Tests/Helper/ProcessHelperTest.php | 2 src/Symfony/Component/Console/Tests/Helper/ProgressBarTest.php | 29 src/Symfony/Component/Console/Tests/Helper/QuestionHelperTest.php | 22 src/Symfony/Component/Console/Tests/Helper/SymfonyQuestionHelperTest.php | 47 src/Symfony/Component/Console/Tests/Helper/TableTest.php | 1105 ++ src/Symfony/Component/Console/Tests/Helper/TerminalInputHelperTest.php | 56 src/Symfony/Component/Console/Tests/Input/StringInputTest.php | 4 src/Symfony/Component/Console/Tests/Messenger/RunCommandMessageHandlerTest.php | 26 src/Symfony/Component/Console/Tests/Output/ConsoleOutputTest.php | 12 src/Symfony/Component/Console/Tests/Output/ConsoleSectionOutputTest.php | 187 src/Symfony/Component/Console/Tests/Style/SymfonyStyleTest.php | 53 src/Symfony/Component/Console/Tests/TerminalTest.php | 2 src/Symfony/Component/Console/Tests/shell-completion/Dockerfile | 20 src/Symfony/Component/Console/Tests/shell-completion/README.md | 39 src/Symfony/Component/Console/Tests/shell-completion/app | 90 src/Symfony/Component/Console/Tests/shell-completion/cases.txt | 89 src/Symfony/Component/Console/Tests/shell-completion/docker.sh | 61 src/Symfony/Component/Console/Tests/shell-completion/drivers/bash-completion.sh | 33 src/Symfony/Component/Console/Tests/shell-completion/drivers/bash.sh | 100 src/Symfony/Component/Console/Tests/shell-completion/drivers/fish.fish | 24 src/Symfony/Component/Console/Tests/shell-completion/drivers/zsh.zsh | 72 src/Symfony/Component/Console/Tests/shell-completion/run.sh | 237 src/Symfony/Component/Console/Tests/shell-completion/try.sh | 101 src/Symfony/Component/CssSelector/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/CssSelector/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/CssSelector/Parser/Parser.php | 4 src/Symfony/Component/CssSelector/Parser/Reader.php | 9 src/Symfony/Component/CssSelector/Tests/Parser/ParserTest.php | 6 src/Symfony/Component/CssSelector/Tests/XPath/TranslatorTest.php | 123 src/Symfony/Component/CssSelector/XPath/Extension/CombinationExtension.php | 32 src/Symfony/Component/CssSelector/XPath/Extension/HtmlExtension.php | 18 src/Symfony/Component/CssSelector/XPath/Extension/NodeExtension.php | 67 src/Symfony/Component/CssSelector/XPath/XPathExpr.php | 48 src/Symfony/Component/DependencyInjection/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/DependencyInjection/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/DependencyInjection/Argument/LazyClosure.php | 10 src/Symfony/Component/DependencyInjection/Compiler/AnalyzeServiceReferencesPass.php | 9 src/Symfony/Component/DependencyInjection/Compiler/AutowirePass.php | 24 src/Symfony/Component/DependencyInjection/Compiler/CheckFactoryBuilderCircularReferencePass.php | 29 src/Symfony/Component/DependencyInjection/Compiler/CheckTypeDeclarationsPass.php | 2 src/Symfony/Component/DependencyInjection/Compiler/DecoratorServicePass.php | 47 src/Symfony/Component/DependencyInjection/Compiler/ExtensionCompilerPass.php | 4 src/Symfony/Component/DependencyInjection/Compiler/MergeExtensionConfigurationPass.php | 25 src/Symfony/Component/DependencyInjection/Compiler/PassConfig.php | 2 src/Symfony/Component/DependencyInjection/Compiler/PriorityTaggedServiceTrait.php | 6 src/Symfony/Component/DependencyInjection/Compiler/RegisterServiceSubscribersPass.php | 4 src/Symfony/Component/DependencyInjection/Compiler/ResolveClassPass.php | 18 src/Symfony/Component/DependencyInjection/Compiler/ResolveDecoratorStackPass.php | 2 src/Symfony/Component/DependencyInjection/Compiler/ResolveInstanceofConditionalsPass.php | 2 src/Symfony/Component/DependencyInjection/Compiler/ServiceLocatorTagPass.php | 27 src/Symfony/Component/DependencyInjection/Compiler/ServiceReferenceGraph.php | 4 src/Symfony/Component/DependencyInjection/Compiler/ServiceReferenceGraphEdge.php | 12 src/Symfony/Component/DependencyInjection/Container.php | 23 src/Symfony/Component/DependencyInjection/ContainerBuilder.php | 84 src/Symfony/Component/DependencyInjection/Definition.php | 2 src/Symfony/Component/DependencyInjection/Dumper/PhpDumper.php | 77 src/Symfony/Component/DependencyInjection/LazyProxy/PhpDumper/LazyServiceDumper.php | 13 src/Symfony/Component/DependencyInjection/Loader/Configurator/PrototypeConfigurator.php | 2 src/Symfony/Component/DependencyInjection/Loader/Configurator/ServicesConfigurator.php | 6 src/Symfony/Component/DependencyInjection/Loader/Configurator/Traits/ParentTrait.php | 2 src/Symfony/Component/DependencyInjection/Loader/FileLoader.php | 2 src/Symfony/Component/DependencyInjection/Loader/XmlFileLoader.php | 13 src/Symfony/Component/DependencyInjection/Loader/YamlFileLoader.php | 6 src/Symfony/Component/DependencyInjection/ParameterBag/EnvPlaceholderParameterBag.php | 2 src/Symfony/Component/DependencyInjection/ParameterBag/ParameterBag.php | 10 src/Symfony/Component/DependencyInjection/Tests/Argument/LazyClosureTest.php | 117 src/Symfony/Component/DependencyInjection/Tests/Compiler/AnalyzeServiceReferencesPassTest.php | 26 src/Symfony/Component/DependencyInjection/Tests/Compiler/AutowirePassTest.php | 43 src/Symfony/Component/DependencyInjection/Tests/Compiler/CheckFactoryBuilderCircularReferencePassTest.php | 25 src/Symfony/Component/DependencyInjection/Tests/Compiler/CheckTypeDeclarationsPassTest.php | 13 src/Symfony/Component/DependencyInjection/Tests/Compiler/DecoratorServicePassTest.php | 43 src/Symfony/Component/DependencyInjection/Tests/Compiler/ExtensionCompilerPassTest.php | 35 src/Symfony/Component/DependencyInjection/Tests/Compiler/InlineServiceDefinitionsPassTest.php | 20 src/Symfony/Component/DependencyInjection/Tests/Compiler/IntegrationTest.php | 67 src/Symfony/Component/DependencyInjection/Tests/Compiler/MergeExtensionConfigurationPassTest.php | 90 src/Symfony/Component/DependencyInjection/Tests/Compiler/PriorityTaggedServiceTraitTest.php | 26 src/Symfony/Component/DependencyInjection/Tests/Compiler/ResolveClassPassTest.php | 35 src/Symfony/Component/DependencyInjection/Tests/Compiler/ServiceLocatorTagPassTest.php | 62 src/Symfony/Component/DependencyInjection/Tests/ContainerBuilderTest.php | 265 src/Symfony/Component/DependencyInjection/Tests/ContainerTest.php | 127 src/Symfony/Component/DependencyInjection/Tests/Dumper/PhpDumperTest.php | 592 + src/Symfony/Component/DependencyInjection/Tests/Fixtures/NestedAutowireLocatorConsumer.php | 29 src/Symfony/Component/DependencyInjection/Tests/Fixtures/ServiceSubscriberWithAutowireLocator.php | 32 src/Symfony/Component/DependencyInjection/Tests/Fixtures/WithTargetAndServiceClosure.php | 30 src/Symfony/Component/DependencyInjection/Tests/Fixtures/includes/autowiring_classes.php | 10 src/Symfony/Component/DependencyInjection/Tests/Fixtures/includes/compositetype_classes.php | 15 src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/callable_adapter_consumer.php | 2 src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services10_as_files.txt | 4 src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services19.php | 4 src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services9_as_files.txt | 78 src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services9_compiled.php | 78 src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services9_inlined_factories.txt | 78 src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services_adawson.php | 24 src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services_almost_circular_private.php | 290 src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services_almost_circular_public.php | 390 src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services_array_params.php | 4 src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services_deep_graph.php | 20 src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services_errored_definition.php | 78 src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services_inline_self_ref.php | 4 src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services_locator.php | 8 src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services_service_locator_argument.php | 4 src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services_tsantos.php | 4 src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services_uninitialized_ref.php | 8 src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services_unsupported_characters.php | 2 src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services_wither.php | 4 src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services_wither_annotation.php | 4 src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services_wither_staticreturntype.php | 4 src/Symfony/Component/DependencyInjection/Tests/LazyProxy/PhpDumper/LazyServiceDumperTest.php | 37 src/Symfony/Component/DependencyInjection/Tests/Loader/PhpFileLoaderTest.php | 25 src/Symfony/Component/DependencyInjection/Tests/Loader/XmlFileLoaderTest.php | 52 src/Symfony/Component/DependencyInjection/Tests/Loader/YamlFileLoaderTest.php | 26 src/Symfony/Component/DependencyInjection/Tests/ParameterBag/ParameterBagTest.php | 24 src/Symfony/Component/DomCrawler/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/DomCrawler/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/DomCrawler/Crawler.php | 81 src/Symfony/Component/DomCrawler/Field/ChoiceFormField.php | 117 src/Symfony/Component/DomCrawler/Field/FileFormField.php | 15 src/Symfony/Component/DomCrawler/Field/FormField.php | 36 src/Symfony/Component/DomCrawler/Field/TextareaFormField.php | 5 src/Symfony/Component/DomCrawler/Form.php | 4 src/Symfony/Component/DomCrawler/Tests/AbstractCrawlerTestCase.php | 105 src/Symfony/Component/DomCrawler/Tests/Field/ChoiceFormFieldTest.php | 129 src/Symfony/Component/DomCrawler/Tests/Field/FileFormFieldTest.php | 83 src/Symfony/Component/DomCrawler/Tests/Field/FormFieldTest.php | 23 src/Symfony/Component/DomCrawler/Tests/Field/TextareaFormFieldTest.php | 45 src/Symfony/Component/DomCrawler/Tests/FormTest.php | 163 src/Symfony/Component/DomCrawler/Tests/UriResolverTest.php | 16 src/Symfony/Component/DomCrawler/UriResolver.php | 28 src/Symfony/Component/Dotenv/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/Dotenv/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/Dotenv/Dotenv.php | 167 src/Symfony/Component/Dotenv/Tests/DotenvTest.php | 269 src/Symfony/Component/ErrorHandler/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/ErrorHandler/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/ErrorHandler/DebugClassLoader.php | 31 src/Symfony/Component/ErrorHandler/Error/FatalError.php | 7 src/Symfony/Component/ErrorHandler/ErrorHandler.php | 36 src/Symfony/Component/ErrorHandler/Tests/DebugClassLoaderTest.php | 60 src/Symfony/Component/ErrorHandler/Tests/Error/FatalErrorTest.php | 93 src/Symfony/Component/ErrorHandler/Tests/ErrorHandlerTest.php | 258 src/Symfony/Component/ErrorHandler/Tests/Fixtures/TemplatedReturnTypeInterface.php | 62 src/Symfony/Component/ErrorHandler/Tests/Fixtures/TemplatedReturnTypeParent.php | 32 src/Symfony/Component/ErrorHandler/Tests/phpt/exception_logged_to_syslog.phpt | 57 src/Symfony/Component/ErrorHandler/Tests/phpt/exception_not_logged_to_stderr.phpt | 29 src/Symfony/Component/ErrorHandler/Tests/phpt/fatal_error_backtrace.phpt | 49 src/Symfony/Component/EventDispatcher/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/EventDispatcher/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/EventDispatcher/Debug/TraceableEventDispatcher.php | 58 src/Symfony/Component/EventDispatcher/EventDispatcher.php | 26 src/Symfony/Component/EventDispatcher/Tests/Debug/TraceableEventDispatcherTest.php | 71 src/Symfony/Component/EventDispatcher/Tests/EventDispatcherTest.php | 32 src/Symfony/Component/ExpressionLanguage/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/ExpressionLanguage/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/ExpressionLanguage/ExpressionLanguage.php | 2 src/Symfony/Component/ExpressionLanguage/Node/GetAttrNode.php | 6 src/Symfony/Component/ExpressionLanguage/Node/Node.php | 5 src/Symfony/Component/ExpressionLanguage/Node/UnaryNode.php | 1 src/Symfony/Component/ExpressionLanguage/Parser.php | 88 src/Symfony/Component/ExpressionLanguage/SerializedParsedExpression.php | 2 src/Symfony/Component/ExpressionLanguage/Tests/ExpressionLanguageTest.php | 49 src/Symfony/Component/ExpressionLanguage/Tests/Node/UnaryNodeTest.php | 2 src/Symfony/Component/ExpressionLanguage/Tests/ParserTest.php | 40 src/Symfony/Component/Filesystem/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/Filesystem/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/Filesystem/Filesystem.php | 22 src/Symfony/Component/Filesystem/Path.php | 14 src/Symfony/Component/Filesystem/Tests/FilesystemTest.php | 59 src/Symfony/Component/Filesystem/Tests/FilesystemTestCase.php | 10 src/Symfony/Component/Filesystem/Tests/PathTest.php | 18 src/Symfony/Component/Finder/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/Finder/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/Finder/Finder.php | 12 src/Symfony/Component/Finder/Gitignore.php | 59 src/Symfony/Component/Finder/Glob.php | 83 src/Symfony/Component/Finder/Iterator/ExcludeDirectoryFilterIterator.php | 5 src/Symfony/Component/Finder/Iterator/FileTypeFilterIterator.php | 2 src/Symfony/Component/Finder/Iterator/MultiplePcreFilterIterator.php | 4 src/Symfony/Component/Finder/Iterator/RecursiveDirectoryIterator.php | 11 src/Symfony/Component/Finder/Iterator/VcsIgnoredFilterIterator.php | 141 src/Symfony/Component/Finder/Tests/FinderTest.php | 162 src/Symfony/Component/Finder/Tests/GitignoreTest.php | 97 src/Symfony/Component/Finder/Tests/GlobTest.php | 97 src/Symfony/Component/Finder/Tests/Iterator/FileTypeFilterIteratorTest.php | 25 src/Symfony/Component/Finder/Tests/Iterator/FilecontentFilterIteratorTest.php | 1 src/Symfony/Component/Finder/Tests/Iterator/FilenameFilterIteratorTest.php | 1 src/Symfony/Component/Finder/Tests/Iterator/MultiplePcreFilterIteratorTest.php | 2 src/Symfony/Component/Finder/Tests/Iterator/PathFilterIteratorTest.php | 6 src/Symfony/Component/Finder/Tests/Iterator/VcsIgnoredFilterIteratorTest.php | 391 src/Symfony/Component/Finder/Tests/Iterator/VfsIteratorTestTrait.php | 4 src/Symfony/Component/Form/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/Form/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/Form/AbstractExtension.php | 2 src/Symfony/Component/Form/AbstractRendererEngine.php | 21 src/Symfony/Component/Form/ButtonBuilder.php | 2 src/Symfony/Component/Form/ChoiceList/Factory/CachingFactoryDecorator.php | 4 src/Symfony/Component/Form/ChoiceList/Factory/DefaultChoiceListFactory.php | 8 src/Symfony/Component/Form/Console/Descriptor/Descriptor.php | 8 src/Symfony/Component/Form/Console/Descriptor/TextDescriptor.php | 2 src/Symfony/Component/Form/Extension/Core/DataTransformer/ArrayToPartsTransformer.php | 2 src/Symfony/Component/Form/Extension/Core/DataTransformer/DateIntervalToArrayTransformer.php | 2 src/Symfony/Component/Form/Extension/Core/DataTransformer/DateTimeToArrayTransformer.php | 4 src/Symfony/Component/Form/Extension/Core/DataTransformer/DateTimeToLocalizedStringTransformer.php | 6 src/Symfony/Component/Form/Extension/Core/DataTransformer/NumberToLocalizedStringTransformer.php | 7 src/Symfony/Component/Form/Extension/Core/DataTransformer/PercentToLocalizedStringTransformer.php | 8 src/Symfony/Component/Form/Extension/Core/DataTransformer/ValueToDuplicatesTransformer.php | 2 src/Symfony/Component/Form/Extension/Core/DataTransformer/WeekToArrayTransformer.php | 2 src/Symfony/Component/Form/Extension/Core/EventListener/ResizeFormListener.php | 18 src/Symfony/Component/Form/Extension/Core/Type/BaseType.php | 6 src/Symfony/Component/Form/Extension/Core/Type/ChoiceType.php | 6 src/Symfony/Component/Form/Extension/Core/Type/CollectionType.php | 6 src/Symfony/Component/Form/Extension/Core/Type/DateTimeType.php | 29 src/Symfony/Component/Form/Extension/Core/Type/DateType.php | 29 src/Symfony/Component/Form/Extension/Core/Type/FileType.php | 2 src/Symfony/Component/Form/Extension/Core/Type/FormType.php | 13 src/Symfony/Component/Form/Extension/Core/Type/MoneyType.php | 6 src/Symfony/Component/Form/Extension/Core/Type/TimeType.php | 29 src/Symfony/Component/Form/Extension/DataCollector/FormDataCollector.php | 18 src/Symfony/Component/Form/Extension/DataCollector/FormDataExtractor.php | 2 src/Symfony/Component/Form/Extension/HttpFoundation/HttpFoundationRequestHandler.php | 11 src/Symfony/Component/Form/Extension/Validator/Constraints/FormValidator.php | 2 src/Symfony/Component/Form/Extension/Validator/ViolationMapper/ViolationMapper.php | 120 src/Symfony/Component/Form/FormFactory.php | 41 src/Symfony/Component/Form/FormFactoryBuilder.php | 2 src/Symfony/Component/Form/FormRenderer.php | 54 src/Symfony/Component/Form/FormView.php | 2 src/Symfony/Component/Form/NativeRequestHandler.php | 11 src/Symfony/Component/Form/Resources/translations/validators.af.xlf | 180 src/Symfony/Component/Form/Resources/translations/validators.ar.xlf | 180 src/Symfony/Component/Form/Resources/translations/validators.az.xlf | 180 src/Symfony/Component/Form/Resources/translations/validators.be.xlf | 180 src/Symfony/Component/Form/Resources/translations/validators.bg.xlf | 180 src/Symfony/Component/Form/Resources/translations/validators.bs.xlf | 180 src/Symfony/Component/Form/Resources/translations/validators.ca.xlf | 180 src/Symfony/Component/Form/Resources/translations/validators.ckb.xlf | 147 src/Symfony/Component/Form/Resources/translations/validators.cs.xlf | 180 src/Symfony/Component/Form/Resources/translations/validators.cy.xlf | 180 src/Symfony/Component/Form/Resources/translations/validators.da.xlf | 180 src/Symfony/Component/Form/Resources/translations/validators.de.xlf | 180 src/Symfony/Component/Form/Resources/translations/validators.el.xlf | 180 src/Symfony/Component/Form/Resources/translations/validators.en.xlf | 54 src/Symfony/Component/Form/Resources/translations/validators.es.xlf | 180 src/Symfony/Component/Form/Resources/translations/validators.et.xlf | 180 src/Symfony/Component/Form/Resources/translations/validators.eu.xlf | 180 src/Symfony/Component/Form/Resources/translations/validators.fa.xlf | 200 src/Symfony/Component/Form/Resources/translations/validators.fi.xlf | 180 src/Symfony/Component/Form/Resources/translations/validators.fr.xlf | 180 src/Symfony/Component/Form/Resources/translations/validators.gl.xlf | 180 src/Symfony/Component/Form/Resources/translations/validators.he.xlf | 180 src/Symfony/Component/Form/Resources/translations/validators.hr.xlf | 190 src/Symfony/Component/Form/Resources/translations/validators.hu.xlf | 182 src/Symfony/Component/Form/Resources/translations/validators.hy.xlf | 180 src/Symfony/Component/Form/Resources/translations/validators.id.xlf | 194 src/Symfony/Component/Form/Resources/translations/validators.it.xlf | 180 src/Symfony/Component/Form/Resources/translations/validators.ja.xlf | 180 src/Symfony/Component/Form/Resources/translations/validators.lb.xlf | 180 src/Symfony/Component/Form/Resources/translations/validators.lt.xlf | 180 src/Symfony/Component/Form/Resources/translations/validators.lv.xlf | 180 src/Symfony/Component/Form/Resources/translations/validators.mk.xlf | 180 src/Symfony/Component/Form/Resources/translations/validators.mn.xlf | 180 src/Symfony/Component/Form/Resources/translations/validators.my.xlf | 180 src/Symfony/Component/Form/Resources/translations/validators.nb.xlf | 180 src/Symfony/Component/Form/Resources/translations/validators.nl.xlf | 180 src/Symfony/Component/Form/Resources/translations/validators.nn.xlf | 180 src/Symfony/Component/Form/Resources/translations/validators.no.xlf | 180 src/Symfony/Component/Form/Resources/translations/validators.pl.xlf | 180 src/Symfony/Component/Form/Resources/translations/validators.pt.xlf | 188 src/Symfony/Component/Form/Resources/translations/validators.pt_BR.xlf | 180 src/Symfony/Component/Form/Resources/translations/validators.ro.xlf | 180 src/Symfony/Component/Form/Resources/translations/validators.ru.xlf | 180 src/Symfony/Component/Form/Resources/translations/validators.sk.xlf | 180 src/Symfony/Component/Form/Resources/translations/validators.sl.xlf | 180 src/Symfony/Component/Form/Resources/translations/validators.sq.xlf | 182 src/Symfony/Component/Form/Resources/translations/validators.sr_Cyrl.xlf | 180 src/Symfony/Component/Form/Resources/translations/validators.sr_Latn.xlf | 180 src/Symfony/Component/Form/Resources/translations/validators.sv.xlf | 180 src/Symfony/Component/Form/Resources/translations/validators.th.xlf | 180 src/Symfony/Component/Form/Resources/translations/validators.tl.xlf | 180 src/Symfony/Component/Form/Resources/translations/validators.tr.xlf | 182 src/Symfony/Component/Form/Resources/translations/validators.uk.xlf | 180 src/Symfony/Component/Form/Resources/translations/validators.ur.xlf | 200 src/Symfony/Component/Form/Resources/translations/validators.uz.xlf | 180 src/Symfony/Component/Form/Resources/translations/validators.vi.xlf | 180 src/Symfony/Component/Form/Resources/translations/validators.zh_CN.xlf | 180 src/Symfony/Component/Form/Resources/translations/validators.zh_TW.xlf | 182 src/Symfony/Component/Form/Test/Traits/ValidatorExtensionTrait.php | 4 src/Symfony/Component/Form/Tests/AbstractRequestHandlerTestCase.php | 2 src/Symfony/Component/Form/Tests/Command/DebugCommandTest.php | 24 src/Symfony/Component/Form/Tests/Console/Descriptor/AbstractDescriptorTestCase.php | 56 src/Symfony/Component/Form/Tests/Extension/Core/DataTransformer/DateTimeToLocalizedStringTransformerTest.php | 22 src/Symfony/Component/Form/Tests/Extension/Core/DataTransformer/NumberToLocalizedStringTransformerTest.php | 34 src/Symfony/Component/Form/Tests/Extension/Core/DataTransformer/PercentToLocalizedStringTransformerTest.php | 14 src/Symfony/Component/Form/Tests/Extension/Core/DataTransformer/WeekToArrayTransformerTest.php | 2 src/Symfony/Component/Form/Tests/Extension/Core/Type/CollectionTypeTest.php | 96 src/Symfony/Component/Form/Tests/Extension/Core/Type/DateTimeTypeTest.php | 48 src/Symfony/Component/Form/Tests/Extension/Core/Type/DateTypeTest.php | 67 src/Symfony/Component/Form/Tests/Extension/Core/Type/EnumTypeTest.php | 15 src/Symfony/Component/Form/Tests/Extension/Core/Type/FormTypeTest.php | 46 src/Symfony/Component/Form/Tests/Extension/Core/Type/MoneyTypeTest.php | 20 src/Symfony/Component/Form/Tests/Extension/Core/Type/TextTypeTest.php | 2 src/Symfony/Component/Form/Tests/Extension/Core/Type/TimeTypeTest.php | 54 src/Symfony/Component/Form/Tests/Extension/DataCollector/FormDataCollectorTest.php | 38 src/Symfony/Component/Form/Tests/Extension/DataCollector/FormDataExtractorTest.php | 10 src/Symfony/Component/Form/Tests/Extension/Validator/Type/UploadValidatorExtensionTest.php | 33 src/Symfony/Component/Form/Tests/Extension/Validator/ViolationMapper/ViolationMapperTest.php | 107 src/Symfony/Component/Form/Tests/Fixtures/Descriptor/resolved_form_type_with_normalized_overridden_option.json | 19 src/Symfony/Component/Form/Tests/Fixtures/Descriptor/resolved_form_type_with_normalized_overridden_option.txt | 17 src/Symfony/Component/Form/Tests/Fixtures/Descriptor/resolved_form_type_with_shared_type_extension.json | 27 src/Symfony/Component/Form/Tests/Fixtures/Descriptor/resolved_form_type_with_shared_type_extension.txt | 22 src/Symfony/Component/Form/Tests/FormFactoryTest.php | 61 src/Symfony/Component/Form/Tests/FormRendererTest.php | 187 src/Symfony/Component/Form/Tests/Resources/TranslationFilesTest.php | 21 src/Symfony/Component/Form/Tests/SimpleFormTest.php | 2 src/Symfony/Component/Form/Tests/Util/OptionsResolverWrapperTest.php | 52 src/Symfony/Component/Form/Tests/Util/OrderedHashMapTest.php | 14 src/Symfony/Component/Form/Util/OptionsResolverWrapper.php | 51 src/Symfony/Component/Form/Util/OrderedHashMap.php | 2 src/Symfony/Component/HtmlSanitizer/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/HtmlSanitizer/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/HtmlSanitizer/HtmlSanitizer.php | 9 src/Symfony/Component/HtmlSanitizer/Tests/HtmlSanitizerAllTest.php | 8 src/Symfony/Component/HtmlSanitizer/Tests/HtmlSanitizerCustomTest.php | 30 src/Symfony/Component/HtmlSanitizer/Tests/TextSanitizer/UrlSanitizerTest.php | 183 src/Symfony/Component/HtmlSanitizer/TextSanitizer/UrlSanitizer.php | 62 src/Symfony/Component/HttpClient/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/HttpClient/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/HttpClient/CachingHttpClient.php | 4 src/Symfony/Component/HttpClient/CurlHttpClient.php | 51 src/Symfony/Component/HttpClient/DataCollector/HttpClientDataCollector.php | 32 src/Symfony/Component/HttpClient/EventSourceHttpClient.php | 6 src/Symfony/Component/HttpClient/Exception/HttpExceptionTrait.php | 7 src/Symfony/Component/HttpClient/HttpClientTrait.php | 18 src/Symfony/Component/HttpClient/Internal/CurlClientState.php | 2 src/Symfony/Component/HttpClient/Internal/Dechunker.php | 126 src/Symfony/Component/HttpClient/Internal/OutgoingRequest.php | 30 src/Symfony/Component/HttpClient/NativeHttpClient.php | 10 src/Symfony/Component/HttpClient/NoPrivateNetworkHttpClient.php | 9 src/Symfony/Component/HttpClient/Response/AmpResponse.php | 7 src/Symfony/Component/HttpClient/Response/AsyncContext.php | 19 src/Symfony/Component/HttpClient/Response/AsyncResponse.php | 47 src/Symfony/Component/HttpClient/Response/CommonResponseTrait.php | 40 src/Symfony/Component/HttpClient/Response/CurlResponse.php | 148 src/Symfony/Component/HttpClient/Response/NativeResponse.php | 95 src/Symfony/Component/HttpClient/Response/TransportResponseTrait.php | 21 src/Symfony/Component/HttpClient/RetryableHttpClient.php | 7 src/Symfony/Component/HttpClient/Tests/AmpHttpClientTest.php | 11 src/Symfony/Component/HttpClient/Tests/CachingHttpClientTest.php | 29 src/Symfony/Component/HttpClient/Tests/CurlHttpClientTest.php | 191 src/Symfony/Component/HttpClient/Tests/DataCollector/HttpClientDataCollectorTest.php | 31 src/Symfony/Component/HttpClient/Tests/EventSourceHttpClientTest.php | 36 src/Symfony/Component/HttpClient/Tests/Exception/HttpExceptionTraitTest.php | 63 src/Symfony/Component/HttpClient/Tests/Fixtures/inflate/index.php | 24 src/Symfony/Component/HttpClient/Tests/Fixtures/tls/redirect-server.php | 46 src/Symfony/Component/HttpClient/Tests/HttpClientTestCase.php | 203 src/Symfony/Component/HttpClient/Tests/HttpClientTraitTest.php | 8 src/Symfony/Component/HttpClient/Tests/Internal/DechunkerTest.php | 100 src/Symfony/Component/HttpClient/Tests/MockHttpClientTest.php | 6 src/Symfony/Component/HttpClient/Tests/NoPrivateNetworkHttpClientTest.php | 36 src/Symfony/Component/HttpClient/Tests/Response/AsyncResponseTest.php | 124 src/Symfony/Component/HttpClient/Tests/Response/CurlResponseTest.php | 43 src/Symfony/Component/HttpClient/Tests/Response/TransportResponseTraitTest.php | 87 src/Symfony/Component/HttpClient/Tests/RetryableHttpClientTest.php | 89 src/Symfony/Component/HttpClient/Tests/TestRedirectServer.php | 40 src/Symfony/Component/HttpFoundation/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/HttpFoundation/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/HttpFoundation/AcceptHeaderItem.php | 2 src/Symfony/Component/HttpFoundation/BinaryFileResponse.php | 25 src/Symfony/Component/HttpFoundation/Cookie.php | 83 src/Symfony/Component/HttpFoundation/HeaderBag.php | 4 src/Symfony/Component/HttpFoundation/HeaderUtils.php | 11 src/Symfony/Component/HttpFoundation/InputBag.php | 50 src/Symfony/Component/HttpFoundation/IpUtils.php | 51 src/Symfony/Component/HttpFoundation/ParameterBag.php | 50 src/Symfony/Component/HttpFoundation/RateLimiter/AbstractRequestRateLimiter.php | 2 src/Symfony/Component/HttpFoundation/Request.php | 80 src/Symfony/Component/HttpFoundation/RequestMatcher.php | 2 src/Symfony/Component/HttpFoundation/RequestMatcher/PathRequestMatcher.php | 2 src/Symfony/Component/HttpFoundation/Response.php | 4 src/Symfony/Component/HttpFoundation/Session/Storage/Handler/AbstractSessionHandler.php | 45 src/Symfony/Component/HttpFoundation/Session/Storage/Handler/MarshallingSessionHandler.php | 36 src/Symfony/Component/HttpFoundation/Session/Storage/Handler/MemcachedSessionHandler.php | 15 src/Symfony/Component/HttpFoundation/Session/Storage/Handler/MigratingSessionHandler.php | 20 src/Symfony/Component/HttpFoundation/Session/Storage/Handler/MongoDbSessionHandler.php | 5 src/Symfony/Component/HttpFoundation/Session/Storage/Handler/NullSessionHandler.php | 5 src/Symfony/Component/HttpFoundation/Session/Storage/Handler/PdoSessionHandler.php | 133 src/Symfony/Component/HttpFoundation/Session/Storage/Handler/RedisSessionHandler.php | 11 src/Symfony/Component/HttpFoundation/Session/Storage/Handler/StrictSessionHandler.php | 2 src/Symfony/Component/HttpFoundation/Session/Storage/MockFileSessionStorage.php | 16 src/Symfony/Component/HttpFoundation/Session/Storage/NativeSessionStorage.php | 7 src/Symfony/Component/HttpFoundation/Session/Storage/Proxy/SessionHandlerProxy.php | 8 src/Symfony/Component/HttpFoundation/Tests/BinaryFileResponseTest.php | 86 src/Symfony/Component/HttpFoundation/Tests/CookieTest.php | 281 src/Symfony/Component/HttpFoundation/Tests/Fixtures/BareSessionHandler.php | 28 src/Symfony/Component/HttpFoundation/Tests/Fixtures/response-functional/common.inc | 4 src/Symfony/Component/HttpFoundation/Tests/HeaderUtilsTest.php | 52 src/Symfony/Component/HttpFoundation/Tests/InputBagTest.php | 88 src/Symfony/Component/HttpFoundation/Tests/IpUtilsTest.php | 42 src/Symfony/Component/HttpFoundation/Tests/ParameterBagTest.php | 126 src/Symfony/Component/HttpFoundation/Tests/RequestMatcher/PathRequestMatcherTest.php | 9 src/Symfony/Component/HttpFoundation/Tests/RequestMatcherTest.php | 27 src/Symfony/Component/HttpFoundation/Tests/RequestTest.php | 177 src/Symfony/Component/HttpFoundation/Tests/ServerBagTest.php | 3 src/Symfony/Component/HttpFoundation/Tests/Session/Storage/Handler/AbstractRedisSessionHandlerTestCase.php | 11 src/Symfony/Component/HttpFoundation/Tests/Session/Storage/Handler/Fixtures/migrating_empty_destroys.expected | 22 src/Symfony/Component/HttpFoundation/Tests/Session/Storage/Handler/Fixtures/migrating_empty_destroys.php | 10 src/Symfony/Component/HttpFoundation/Tests/Session/Storage/Handler/Fixtures/migrating_new_empty.expected | 18 src/Symfony/Component/HttpFoundation/Tests/Session/Storage/Handler/Fixtures/migrating_new_empty.php | 11 src/Symfony/Component/HttpFoundation/Tests/Session/Storage/Handler/Fixtures/strict_read_exception.expected | 10 src/Symfony/Component/HttpFoundation/Tests/Session/Storage/Handler/Fixtures/strict_read_exception.php | 68 src/Symfony/Component/HttpFoundation/Tests/Session/Storage/Handler/Fixtures/strict_read_failure.expected | 13 src/Symfony/Component/HttpFoundation/Tests/Session/Storage/Handler/Fixtures/strict_read_failure.php | 65 src/Symfony/Component/HttpFoundation/Tests/Session/Storage/Handler/MarshallingSessionHandlerTest.php | 78 src/Symfony/Component/HttpFoundation/Tests/Session/Storage/Handler/MemcachedSessionHandlerTest.php | 72 src/Symfony/Component/HttpFoundation/Tests/Session/Storage/Handler/MigratingSessionHandlerTest.php | 51 src/Symfony/Component/HttpFoundation/Tests/Session/Storage/Handler/MongoDbSessionHandlerTest.php | 11 src/Symfony/Component/HttpFoundation/Tests/Session/Storage/Handler/NullSessionHandlerTest.php | 23 src/Symfony/Component/HttpFoundation/Tests/Session/Storage/Handler/PdoSessionHandlerTest.php | 59 src/Symfony/Component/HttpFoundation/Tests/Session/Storage/Handler/PredisSessionHandlerTest.php | 18 src/Symfony/Component/HttpFoundation/Tests/Session/Storage/Handler/SessionIdInterfaceTest.php | 43 src/Symfony/Component/HttpFoundation/Tests/Session/Storage/Handler/StrictSessionHandlerTest.php | 66 src/Symfony/Component/HttpFoundation/Tests/Session/Storage/MockFileSessionStorageTest.php | 30 src/Symfony/Component/HttpFoundation/Tests/Session/Storage/NativeSessionStorageTest.php | 11 src/Symfony/Component/HttpFoundation/Tests/Session/Storage/Proxy/SessionHandlerProxyTest.php | 42 src/Symfony/Component/HttpFoundation/Tests/UriSignerTest.php | 49 src/Symfony/Component/HttpFoundation/Tests/UrlHelperTest.php | 3 src/Symfony/Component/HttpFoundation/UriSigner.php | 5 src/Symfony/Component/HttpFoundation/UrlHelper.php | 2 src/Symfony/Component/HttpKernel/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/HttpKernel/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/HttpKernel/CacheWarmer/CacheWarmerAggregate.php | 21 src/Symfony/Component/HttpKernel/Controller/ArgumentResolver/DateTimeValueResolver.php | 41 src/Symfony/Component/HttpKernel/Controller/ControllerResolver.php | 2 src/Symfony/Component/HttpKernel/DataCollector/DumpDataCollector.php | 54 src/Symfony/Component/HttpKernel/DataCollector/EventDataCollector.php | 5 src/Symfony/Component/HttpKernel/DataCollector/LoggerDataCollector.php | 10 src/Symfony/Component/HttpKernel/DependencyInjection/LoggerPass.php | 3 src/Symfony/Component/HttpKernel/DependencyInjection/RegisterControllerArgumentLocatorsPass.php | 2 src/Symfony/Component/HttpKernel/DependencyInjection/ServicesResetter.php | 13 src/Symfony/Component/HttpKernel/EventListener/AbstractSessionListener.php | 9 src/Symfony/Component/HttpKernel/EventListener/ErrorListener.php | 8 src/Symfony/Component/HttpKernel/EventListener/LocaleAwareListener.php | 28 src/Symfony/Component/HttpKernel/Fragment/HIncludeFragmentRenderer.php | 2 src/Symfony/Component/HttpKernel/Fragment/InlineFragmentRenderer.php | 14 src/Symfony/Component/HttpKernel/HttpCache/HttpCache.php | 54 src/Symfony/Component/HttpKernel/HttpCache/Store.php | 47 src/Symfony/Component/HttpKernel/HttpKernelBrowser.php | 41 src/Symfony/Component/HttpKernel/Kernel.php | 154 src/Symfony/Component/HttpKernel/Profiler/FileProfilerStorage.php | 40 src/Symfony/Component/HttpKernel/Profiler/Profiler.php | 2 src/Symfony/Component/HttpKernel/Tests/CacheWarmer/CacheWarmerAggregateTest.php | 37 src/Symfony/Component/HttpKernel/Tests/Controller/ArgumentResolver/DateTimeValueResolverTest.php | 81 src/Symfony/Component/HttpKernel/Tests/DataCollector/DumpDataCollectorTest.php | 37 src/Symfony/Component/HttpKernel/Tests/DataCollector/EventDataCollectorTest.php | 42 src/Symfony/Component/HttpKernel/Tests/DependencyInjection/FragmentRendererPassTest.php | 8 src/Symfony/Component/HttpKernel/Tests/DependencyInjection/LoggerPassTest.php | 34 src/Symfony/Component/HttpKernel/Tests/DependencyInjection/RegisterControllerArgumentLocatorsPassTest.php | 31 src/Symfony/Component/HttpKernel/Tests/DependencyInjection/ServicesResetterTest.php | 67 src/Symfony/Component/HttpKernel/Tests/EventListener/ErrorListenerTest.php | 22 src/Symfony/Component/HttpKernel/Tests/EventListener/LocaleAwareListenerTest.php | 91 src/Symfony/Component/HttpKernel/Tests/EventListener/SessionListenerTest.php | 38 src/Symfony/Component/HttpKernel/Tests/Fragment/InlineFragmentRendererTest.php | 45 src/Symfony/Component/HttpKernel/Tests/HttpCache/HttpCacheTest.php | 318 src/Symfony/Component/HttpKernel/Tests/HttpCache/ResponseCacheStrategyTest.php | 17 src/Symfony/Component/HttpKernel/Tests/HttpCache/StoreTest.php | 51 src/Symfony/Component/HttpKernel/Tests/HttpKernelBrowserTest.php | 53 src/Symfony/Component/HttpKernel/Tests/KernelTest.php | 373 src/Symfony/Component/HttpKernel/Tests/Profiler/FileProfilerStorageTest.php | 124 src/Symfony/Component/HttpKernel/composer.json | 2 src/Symfony/Component/Intl/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/Intl/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/Intl/Data/Bundle/Reader/BundleEntryReader.php | 25 src/Symfony/Component/Intl/Data/Generator/CurrencyDataGenerator.php | 1 src/Symfony/Component/Intl/Data/Generator/LocaleDataGenerator.php | 1 src/Symfony/Component/Intl/Data/Util/LocaleScanner.php | 10 src/Symfony/Component/Intl/Intl.php | 2 src/Symfony/Component/Intl/ResourceBundle.php | 5 src/Symfony/Component/Intl/Resources/bin/common.php | 2 src/Symfony/Component/Intl/Resources/data/currencies/agq.php | 238 src/Symfony/Component/Intl/Resources/data/currencies/ar.php | 2 src/Symfony/Component/Intl/Resources/data/currencies/asa.php | 242 src/Symfony/Component/Intl/Resources/data/currencies/ast.php | 1154 ++ src/Symfony/Component/Intl/Resources/data/currencies/ba.php | 6 src/Symfony/Component/Intl/Resources/data/currencies/bas.php | 242 src/Symfony/Component/Intl/Resources/data/currencies/bem.php | 10 src/Symfony/Component/Intl/Resources/data/currencies/bez.php | 238 src/Symfony/Component/Intl/Resources/data/currencies/blo.php | 642 + src/Symfony/Component/Intl/Resources/data/currencies/bn.php | 18 src/Symfony/Component/Intl/Resources/data/currencies/br.php | 12 src/Symfony/Component/Intl/Resources/data/currencies/brx.php | 1066 ++ src/Symfony/Component/Intl/Resources/data/currencies/bs.php | 4 src/Symfony/Component/Intl/Resources/data/currencies/ccp.php | 1054 ++ src/Symfony/Component/Intl/Resources/data/currencies/ceb.php | 642 + src/Symfony/Component/Intl/Resources/data/currencies/cgg.php | 238 src/Symfony/Component/Intl/Resources/data/currencies/chr.php | 658 + src/Symfony/Component/Intl/Resources/data/currencies/ckb.php | 18 src/Symfony/Component/Intl/Resources/data/currencies/cs.php | 4 src/Symfony/Component/Intl/Resources/data/currencies/csw.php | 10 src/Symfony/Component/Intl/Resources/data/currencies/cv.php | 4 src/Symfony/Component/Intl/Resources/data/currencies/cy.php | 4 src/Symfony/Component/Intl/Resources/data/currencies/da.php | 4 src/Symfony/Component/Intl/Resources/data/currencies/dav.php | 238 src/Symfony/Component/Intl/Resources/data/currencies/de.php | 4 src/Symfony/Component/Intl/Resources/data/currencies/dje.php | 242 src/Symfony/Component/Intl/Resources/data/currencies/doi.php | 38 src/Symfony/Component/Intl/Resources/data/currencies/dsb.php | 770 + src/Symfony/Component/Intl/Resources/data/currencies/dyo.php | 126 src/Symfony/Component/Intl/Resources/data/currencies/ebu.php | 238 src/Symfony/Component/Intl/Resources/data/currencies/ee.php | 4 src/Symfony/Component/Intl/Resources/data/currencies/en.php | 4 src/Symfony/Component/Intl/Resources/data/currencies/en_001.php | 4 src/Symfony/Component/Intl/Resources/data/currencies/en_AU.php | 4 src/Symfony/Component/Intl/Resources/data/currencies/en_IN.php | 6 src/Symfony/Component/Intl/Resources/data/currencies/es_419.php | 4 src/Symfony/Component/Intl/Resources/data/currencies/eu.php | 4 src/Symfony/Component/Intl/Resources/data/currencies/ewo.php | 242 src/Symfony/Component/Intl/Resources/data/currencies/fa.php | 2 src/Symfony/Component/Intl/Resources/data/currencies/fi.php | 4 src/Symfony/Component/Intl/Resources/data/currencies/fil.php | 694 + src/Symfony/Component/Intl/Resources/data/currencies/fo.php | 2 src/Symfony/Component/Intl/Resources/data/currencies/fur.php | 230 src/Symfony/Component/Intl/Resources/data/currencies/gd.php | 4 src/Symfony/Component/Intl/Resources/data/currencies/gsw.php | 1058 ++ src/Symfony/Component/Intl/Resources/data/currencies/guz.php | 238 src/Symfony/Component/Intl/Resources/data/currencies/haw.php | 10 src/Symfony/Component/Intl/Resources/data/currencies/hi.php | 2 src/Symfony/Component/Intl/Resources/data/currencies/hr.php | 4 src/Symfony/Component/Intl/Resources/data/currencies/hsb.php | 770 + src/Symfony/Component/Intl/Resources/data/currencies/hu.php | 2 src/Symfony/Component/Intl/Resources/data/currencies/ig.php | 6 src/Symfony/Component/Intl/Resources/data/currencies/it.php | 2 src/Symfony/Component/Intl/Resources/data/currencies/ja.php | 4 src/Symfony/Component/Intl/Resources/data/currencies/jgo.php | 22 src/Symfony/Component/Intl/Resources/data/currencies/jmc.php | 242 src/Symfony/Component/Intl/Resources/data/currencies/ka.php | 2 src/Symfony/Component/Intl/Resources/data/currencies/kab.php | 238 src/Symfony/Component/Intl/Resources/data/currencies/kam.php | 238 src/Symfony/Component/Intl/Resources/data/currencies/kde.php | 242 src/Symfony/Component/Intl/Resources/data/currencies/kea.php | 294 src/Symfony/Component/Intl/Resources/data/currencies/kgp.php | 1158 ++ src/Symfony/Component/Intl/Resources/data/currencies/khq.php | 242 src/Symfony/Component/Intl/Resources/data/currencies/kkj.php | 10 src/Symfony/Component/Intl/Resources/data/currencies/kln.php | 238 src/Symfony/Component/Intl/Resources/data/currencies/kok.php | 642 + src/Symfony/Component/Intl/Resources/data/currencies/ksb.php | 242 src/Symfony/Component/Intl/Resources/data/currencies/ksf.php | 238 src/Symfony/Component/Intl/Resources/data/currencies/ksh.php | 698 + src/Symfony/Component/Intl/Resources/data/currencies/ku.php | 4 src/Symfony/Component/Intl/Resources/data/currencies/kxv.php | 38 src/Symfony/Component/Intl/Resources/data/currencies/kxv_Deva.php | 34 src/Symfony/Component/Intl/Resources/data/currencies/kxv_Orya.php | 38 src/Symfony/Component/Intl/Resources/data/currencies/kxv_Telu.php | 38 src/Symfony/Component/Intl/Resources/data/currencies/lag.php | 238 src/Symfony/Component/Intl/Resources/data/currencies/lij.php | 78 src/Symfony/Component/Intl/Resources/data/currencies/lkt.php | 10 src/Symfony/Component/Intl/Resources/data/currencies/lrc.php | 38 src/Symfony/Component/Intl/Resources/data/currencies/lt.php | 4 src/Symfony/Component/Intl/Resources/data/currencies/luo.php | 238 src/Symfony/Component/Intl/Resources/data/currencies/luy.php | 238 src/Symfony/Component/Intl/Resources/data/currencies/mai.php | 38 src/Symfony/Component/Intl/Resources/data/currencies/mas.php | 238 src/Symfony/Component/Intl/Resources/data/currencies/mas_TZ.php | 10 src/Symfony/Component/Intl/Resources/data/currencies/mer.php | 238 src/Symfony/Component/Intl/Resources/data/currencies/meta.php | 18 src/Symfony/Component/Intl/Resources/data/currencies/mfe.php | 242 src/Symfony/Component/Intl/Resources/data/currencies/mgh.php | 10 src/Symfony/Component/Intl/Resources/data/currencies/mgo.php | 10 src/Symfony/Component/Intl/Resources/data/currencies/mni.php | 38 src/Symfony/Component/Intl/Resources/data/currencies/mr.php | 4 src/Symfony/Component/Intl/Resources/data/currencies/mua.php | 242 src/Symfony/Component/Intl/Resources/data/currencies/my.php | 2 src/Symfony/Component/Intl/Resources/data/currencies/mzn.php | 606 + src/Symfony/Component/Intl/Resources/data/currencies/naq.php | 242 src/Symfony/Component/Intl/Resources/data/currencies/nl.php | 4 src/Symfony/Component/Intl/Resources/data/currencies/nmg.php | 242 src/Symfony/Component/Intl/Resources/data/currencies/nnh.php | 10 src/Symfony/Component/Intl/Resources/data/currencies/no.php | 4 src/Symfony/Component/Intl/Resources/data/currencies/no_NO.php | 4 src/Symfony/Component/Intl/Resources/data/currencies/nqo.php | 730 + src/Symfony/Component/Intl/Resources/data/currencies/nso.php | 10 src/Symfony/Component/Intl/Resources/data/currencies/nus.php | 14 src/Symfony/Component/Intl/Resources/data/currencies/nyn.php | 242 src/Symfony/Component/Intl/Resources/data/currencies/pcm.php | 642 + src/Symfony/Component/Intl/Resources/data/currencies/pt.php | 4 src/Symfony/Component/Intl/Resources/data/currencies/rof.php | 238 src/Symfony/Component/Intl/Resources/data/currencies/root.php | 4 src/Symfony/Component/Intl/Resources/data/currencies/rwk.php | 242 src/Symfony/Component/Intl/Resources/data/currencies/sah.php | 14 src/Symfony/Component/Intl/Resources/data/currencies/saq.php | 238 src/Symfony/Component/Intl/Resources/data/currencies/sat.php | 38 src/Symfony/Component/Intl/Resources/data/currencies/sbp.php | 238 src/Symfony/Component/Intl/Resources/data/currencies/sc.php | 4 src/Symfony/Component/Intl/Resources/data/currencies/scn.php | 642 + src/Symfony/Component/Intl/Resources/data/currencies/seh.php | 246 src/Symfony/Component/Intl/Resources/data/currencies/ses.php | 242 src/Symfony/Component/Intl/Resources/data/currencies/shi.php | 242 src/Symfony/Component/Intl/Resources/data/currencies/shi_Latn.php | 242 src/Symfony/Component/Intl/Resources/data/currencies/shn.php | 1178 ++ src/Symfony/Component/Intl/Resources/data/currencies/sk.php | 4 src/Symfony/Component/Intl/Resources/data/currencies/smn.php | 38 src/Symfony/Component/Intl/Resources/data/currencies/sv.php | 4 src/Symfony/Component/Intl/Resources/data/currencies/syr.php | 238 src/Symfony/Component/Intl/Resources/data/currencies/szl.php | 10 src/Symfony/Component/Intl/Resources/data/currencies/te.php | 2 src/Symfony/Component/Intl/Resources/data/currencies/teo.php | 238 src/Symfony/Component/Intl/Resources/data/currencies/teo_KE.php | 10 src/Symfony/Component/Intl/Resources/data/currencies/th.php | 2 src/Symfony/Component/Intl/Resources/data/currencies/tk.php | 4 src/Symfony/Component/Intl/Resources/data/currencies/tl.php | 2 src/Symfony/Component/Intl/Resources/data/currencies/tr.php | 4 src/Symfony/Component/Intl/Resources/data/currencies/twq.php | 242 src/Symfony/Component/Intl/Resources/data/currencies/tzm.php | 242 src/Symfony/Component/Intl/Resources/data/currencies/ug.php | 4 src/Symfony/Component/Intl/Resources/data/currencies/ur.php | 10 src/Symfony/Component/Intl/Resources/data/currencies/vai.php | 230 src/Symfony/Component/Intl/Resources/data/currencies/vai_Latn.php | 234 src/Symfony/Component/Intl/Resources/data/currencies/vec.php | 642 + src/Symfony/Component/Intl/Resources/data/currencies/vi.php | 2 src/Symfony/Component/Intl/Resources/data/currencies/vun.php | 242 src/Symfony/Component/Intl/Resources/data/currencies/wae.php | 38 src/Symfony/Component/Intl/Resources/data/currencies/xnr.php | 630 + src/Symfony/Component/Intl/Resources/data/currencies/xog.php | 238 src/Symfony/Component/Intl/Resources/data/currencies/yav.php | 98 src/Symfony/Component/Intl/Resources/data/currencies/yrl.php | 1158 ++ src/Symfony/Component/Intl/Resources/data/currencies/yrl_CO.php | 10 src/Symfony/Component/Intl/Resources/data/currencies/yrl_VE.php | 10 src/Symfony/Component/Intl/Resources/data/currencies/yue.php | 1170 ++ src/Symfony/Component/Intl/Resources/data/currencies/yue_Hans.php | 1170 ++ src/Symfony/Component/Intl/Resources/data/currencies/zgh.php | 246 src/Symfony/Component/Intl/Resources/data/currencies/zh.php | 4 src/Symfony/Component/Intl/Resources/data/currencies/zh_Hant.php | 2 src/Symfony/Component/Intl/Resources/data/currencies/zu.php | 4 src/Symfony/Component/Intl/Resources/data/git-info.txt | 6 src/Symfony/Component/Intl/Resources/data/languages/af.php | 2 src/Symfony/Component/Intl/Resources/data/languages/agq.php | 52 src/Symfony/Component/Intl/Resources/data/languages/ak.php | 14 src/Symfony/Component/Intl/Resources/data/languages/am.php | 3 src/Symfony/Component/Intl/Resources/data/languages/ar.php | 2 src/Symfony/Component/Intl/Resources/data/languages/ars.php | 19 src/Symfony/Component/Intl/Resources/data/languages/as.php | 3 src/Symfony/Component/Intl/Resources/data/languages/asa.php | 52 src/Symfony/Component/Intl/Resources/data/languages/ast.php | 617 + src/Symfony/Component/Intl/Resources/data/languages/az.php | 2 src/Symfony/Component/Intl/Resources/data/languages/ba.php | 11 src/Symfony/Component/Intl/Resources/data/languages/bas.php | 52 src/Symfony/Component/Intl/Resources/data/languages/be.php | 1 src/Symfony/Component/Intl/Resources/data/languages/bem.php | 52 src/Symfony/Component/Intl/Resources/data/languages/bez.php | 52 src/Symfony/Component/Intl/Resources/data/languages/bg.php | 5 src/Symfony/Component/Intl/Resources/data/languages/bgc.php | 9 src/Symfony/Component/Intl/Resources/data/languages/bho.php | 9 src/Symfony/Component/Intl/Resources/data/languages/blo.php | 358 src/Symfony/Component/Intl/Resources/data/languages/bn.php | 37 src/Symfony/Component/Intl/Resources/data/languages/br.php | 9 src/Symfony/Component/Intl/Resources/data/languages/brx.php | 543 + src/Symfony/Component/Intl/Resources/data/languages/bs.php | 1 src/Symfony/Component/Intl/Resources/data/languages/bua.php | 9 src/Symfony/Component/Intl/Resources/data/languages/ccp.php | 520 + src/Symfony/Component/Intl/Resources/data/languages/ceb.php | 38 src/Symfony/Component/Intl/Resources/data/languages/cgg.php | 52 src/Symfony/Component/Intl/Resources/data/languages/chr.php | 457 + src/Symfony/Component/Intl/Resources/data/languages/ckb.php | 391 src/Symfony/Component/Intl/Resources/data/languages/cs.php | 2 src/Symfony/Component/Intl/Resources/data/languages/csw.php | 19 src/Symfony/Component/Intl/Resources/data/languages/cv.php | 17 src/Symfony/Component/Intl/Resources/data/languages/da.php | 1 src/Symfony/Component/Intl/Resources/data/languages/dav.php | 52 src/Symfony/Component/Intl/Resources/data/languages/de.php | 1 src/Symfony/Component/Intl/Resources/data/languages/dje.php | 52 src/Symfony/Component/Intl/Resources/data/languages/doi.php | 32 src/Symfony/Component/Intl/Resources/data/languages/dsb.php | 461 + src/Symfony/Component/Intl/Resources/data/languages/dua.php | 8 src/Symfony/Component/Intl/Resources/data/languages/dyo.php | 52 src/Symfony/Component/Intl/Resources/data/languages/ebu.php | 52 src/Symfony/Component/Intl/Resources/data/languages/el.php | 1 src/Symfony/Component/Intl/Resources/data/languages/en.php | 8 src/Symfony/Component/Intl/Resources/data/languages/eo.php | 5 src/Symfony/Component/Intl/Resources/data/languages/es.php | 1 src/Symfony/Component/Intl/Resources/data/languages/es_419.php | 5 src/Symfony/Component/Intl/Resources/data/languages/es_US.php | 1 src/Symfony/Component/Intl/Resources/data/languages/et.php | 18 src/Symfony/Component/Intl/Resources/data/languages/eu.php | 1 src/Symfony/Component/Intl/Resources/data/languages/ewo.php | 52 src/Symfony/Component/Intl/Resources/data/languages/fa.php | 3 src/Symfony/Component/Intl/Resources/data/languages/fi.php | 4 src/Symfony/Component/Intl/Resources/data/languages/fil.php | 465 + src/Symfony/Component/Intl/Resources/data/languages/fur.php | 190 src/Symfony/Component/Intl/Resources/data/languages/ga.php | 1 src/Symfony/Component/Intl/Resources/data/languages/gaa.php | 9 src/Symfony/Component/Intl/Resources/data/languages/gl.php | 3 src/Symfony/Component/Intl/Resources/data/languages/gsw.php | 443 + src/Symfony/Component/Intl/Resources/data/languages/gu.php | 3 src/Symfony/Component/Intl/Resources/data/languages/guz.php | 52 src/Symfony/Component/Intl/Resources/data/languages/ha.php | 1 src/Symfony/Component/Intl/Resources/data/languages/haw.php | 44 src/Symfony/Component/Intl/Resources/data/languages/he.php | 1 src/Symfony/Component/Intl/Resources/data/languages/hi.php | 3 src/Symfony/Component/Intl/Resources/data/languages/hr.php | 1 src/Symfony/Component/Intl/Resources/data/languages/hsb.php | 461 + src/Symfony/Component/Intl/Resources/data/languages/hu.php | 6 src/Symfony/Component/Intl/Resources/data/languages/id.php | 1 src/Symfony/Component/Intl/Resources/data/languages/ig.php | 188 src/Symfony/Component/Intl/Resources/data/languages/in.php | 1 src/Symfony/Component/Intl/Resources/data/languages/is.php | 1 src/Symfony/Component/Intl/Resources/data/languages/iw.php | 1 src/Symfony/Component/Intl/Resources/data/languages/ja.php | 2 src/Symfony/Component/Intl/Resources/data/languages/jgo.php | 14 src/Symfony/Component/Intl/Resources/data/languages/jmc.php | 52 src/Symfony/Component/Intl/Resources/data/languages/jv.php | 56 src/Symfony/Component/Intl/Resources/data/languages/ka.php | 1 src/Symfony/Component/Intl/Resources/data/languages/kab.php | 52 src/Symfony/Component/Intl/Resources/data/languages/kam.php | 52 src/Symfony/Component/Intl/Resources/data/languages/kde.php | 52 src/Symfony/Component/Intl/Resources/data/languages/kea.php | 219 src/Symfony/Component/Intl/Resources/data/languages/kgp.php | 528 + src/Symfony/Component/Intl/Resources/data/languages/khq.php | 52 src/Symfony/Component/Intl/Resources/data/languages/ki.php | 8 src/Symfony/Component/Intl/Resources/data/languages/kkj.php | 10 src/Symfony/Component/Intl/Resources/data/languages/kln.php | 52 src/Symfony/Component/Intl/Resources/data/languages/km.php | 1 src/Symfony/Component/Intl/Resources/data/languages/kn.php | 1 src/Symfony/Component/Intl/Resources/data/languages/ko.php | 1 src/Symfony/Component/Intl/Resources/data/languages/kok.php | 460 + src/Symfony/Component/Intl/Resources/data/languages/kok_Latn.php | 182 src/Symfony/Component/Intl/Resources/data/languages/ksb.php | 52 src/Symfony/Component/Intl/Resources/data/languages/ksf.php | 52 src/Symfony/Component/Intl/Resources/data/languages/ksh.php | 351 src/Symfony/Component/Intl/Resources/data/languages/kxv.php | 115 src/Symfony/Component/Intl/Resources/data/languages/kxv_Deva.php | 115 src/Symfony/Component/Intl/Resources/data/languages/kxv_Orya.php | 114 src/Symfony/Component/Intl/Resources/data/languages/kxv_Telu.php | 114 src/Symfony/Component/Intl/Resources/data/languages/ky.php | 1 src/Symfony/Component/Intl/Resources/data/languages/lag.php | 52 src/Symfony/Component/Intl/Resources/data/languages/lb.php | 2 src/Symfony/Component/Intl/Resources/data/languages/lij.php | 47 src/Symfony/Component/Intl/Resources/data/languages/lkt.php | 156 src/Symfony/Component/Intl/Resources/data/languages/lmo.php | 9 src/Symfony/Component/Intl/Resources/data/languages/lo.php | 1 src/Symfony/Component/Intl/Resources/data/languages/lrc.php | 237 src/Symfony/Component/Intl/Resources/data/languages/luo.php | 52 src/Symfony/Component/Intl/Resources/data/languages/luy.php | 52 src/Symfony/Component/Intl/Resources/data/languages/lv.php | 1 src/Symfony/Component/Intl/Resources/data/languages/mai.php | 431 + src/Symfony/Component/Intl/Resources/data/languages/mas.php | 52 src/Symfony/Component/Intl/Resources/data/languages/mer.php | 52 src/Symfony/Component/Intl/Resources/data/languages/meta.php | 22 src/Symfony/Component/Intl/Resources/data/languages/mfe.php | 52 src/Symfony/Component/Intl/Resources/data/languages/mgh.php | 51 src/Symfony/Component/Intl/Resources/data/languages/mgo.php | 8 src/Symfony/Component/Intl/Resources/data/languages/mi.php | 6 src/Symfony/Component/Intl/Resources/data/languages/mk.php | 2 src/Symfony/Component/Intl/Resources/data/languages/ml.php | 1 src/Symfony/Component/Intl/Resources/data/languages/mn.php | 1 src/Symfony/Component/Intl/Resources/data/languages/mni.php | 44 src/Symfony/Component/Intl/Resources/data/languages/mo.php | 1 src/Symfony/Component/Intl/Resources/data/languages/mr.php | 1 src/Symfony/Component/Intl/Resources/data/languages/ms.php | 1 src/Symfony/Component/Intl/Resources/data/languages/mua.php | 51 src/Symfony/Component/Intl/Resources/data/languages/my.php | 1 src/Symfony/Component/Intl/Resources/data/languages/mzn.php | 238 src/Symfony/Component/Intl/Resources/data/languages/naq.php | 52 src/Symfony/Component/Intl/Resources/data/languages/nds.php | 9 src/Symfony/Component/Intl/Resources/data/languages/nmg.php | 51 src/Symfony/Component/Intl/Resources/data/languages/nn.php | 1 src/Symfony/Component/Intl/Resources/data/languages/nnh.php | 24 src/Symfony/Component/Intl/Resources/data/languages/nqo.php | 264 src/Symfony/Component/Intl/Resources/data/languages/nso.php | 9 src/Symfony/Component/Intl/Resources/data/languages/nus.php | 52 src/Symfony/Component/Intl/Resources/data/languages/nyn.php | 52 src/Symfony/Component/Intl/Resources/data/languages/or.php | 1 src/Symfony/Component/Intl/Resources/data/languages/pa.php | 1 src/Symfony/Component/Intl/Resources/data/languages/pcm.php | 445 + src/Symfony/Component/Intl/Resources/data/languages/pms.php | 12 src/Symfony/Component/Intl/Resources/data/languages/prg.php | 9 src/Symfony/Component/Intl/Resources/data/languages/ps.php | 25 src/Symfony/Component/Intl/Resources/data/languages/pt.php | 2 src/Symfony/Component/Intl/Resources/data/languages/qu.php | 1 src/Symfony/Component/Intl/Resources/data/languages/raj.php | 9 src/Symfony/Component/Intl/Resources/data/languages/rm.php | 1 src/Symfony/Component/Intl/Resources/data/languages/ro.php | 1 src/Symfony/Component/Intl/Resources/data/languages/rof.php | 52 src/Symfony/Component/Intl/Resources/data/languages/ru.php | 1 src/Symfony/Component/Intl/Resources/data/languages/rwk.php | 52 src/Symfony/Component/Intl/Resources/data/languages/sah.php | 63 src/Symfony/Component/Intl/Resources/data/languages/saq.php | 52 src/Symfony/Component/Intl/Resources/data/languages/sat.php | 52 src/Symfony/Component/Intl/Resources/data/languages/sbp.php | 52 src/Symfony/Component/Intl/Resources/data/languages/scn.php | 276 src/Symfony/Component/Intl/Resources/data/languages/sd.php | 8 src/Symfony/Component/Intl/Resources/data/languages/seh.php | 52 src/Symfony/Component/Intl/Resources/data/languages/ses.php | 52 src/Symfony/Component/Intl/Resources/data/languages/sh.php | 6 src/Symfony/Component/Intl/Resources/data/languages/shi.php | 52 src/Symfony/Component/Intl/Resources/data/languages/shi_Latn.php | 52 src/Symfony/Component/Intl/Resources/data/languages/shn.php | 356 src/Symfony/Component/Intl/Resources/data/languages/si.php | 1 src/Symfony/Component/Intl/Resources/data/languages/sk.php | 1 src/Symfony/Component/Intl/Resources/data/languages/sl.php | 1 src/Symfony/Component/Intl/Resources/data/languages/smn.php | 398 src/Symfony/Component/Intl/Resources/data/languages/so.php | 1 src/Symfony/Component/Intl/Resources/data/languages/sq.php | 1 src/Symfony/Component/Intl/Resources/data/languages/sr.php | 6 src/Symfony/Component/Intl/Resources/data/languages/sr_Latn.php | 6 src/Symfony/Component/Intl/Resources/data/languages/su.php | 2 src/Symfony/Component/Intl/Resources/data/languages/sw.php | 22 src/Symfony/Component/Intl/Resources/data/languages/sw_CD.php | 1 src/Symfony/Component/Intl/Resources/data/languages/sw_KE.php | 8 src/Symfony/Component/Intl/Resources/data/languages/syr.php | 66 src/Symfony/Component/Intl/Resources/data/languages/szl.php | 9 src/Symfony/Component/Intl/Resources/data/languages/ta.php | 2 src/Symfony/Component/Intl/Resources/data/languages/te.php | 9 src/Symfony/Component/Intl/Resources/data/languages/teo.php | 52 src/Symfony/Component/Intl/Resources/data/languages/tk.php | 5 src/Symfony/Component/Intl/Resources/data/languages/tl.php | 18 src/Symfony/Component/Intl/Resources/data/languages/tn.php | 2 src/Symfony/Component/Intl/Resources/data/languages/to.php | 15 src/Symfony/Component/Intl/Resources/data/languages/tok.php | 88 src/Symfony/Component/Intl/Resources/data/languages/twq.php | 52 src/Symfony/Component/Intl/Resources/data/languages/tyv.php | 39 src/Symfony/Component/Intl/Resources/data/languages/tzm.php | 52 src/Symfony/Component/Intl/Resources/data/languages/uk.php | 1 src/Symfony/Component/Intl/Resources/data/languages/ur.php | 7 src/Symfony/Component/Intl/Resources/data/languages/uz.php | 5 src/Symfony/Component/Intl/Resources/data/languages/vai.php | 52 src/Symfony/Component/Intl/Resources/data/languages/vai_Latn.php | 52 src/Symfony/Component/Intl/Resources/data/languages/vec.php | 469 + src/Symfony/Component/Intl/Resources/data/languages/vi.php | 3 src/Symfony/Component/Intl/Resources/data/languages/vmw.php | 9 src/Symfony/Component/Intl/Resources/data/languages/vun.php | 52 src/Symfony/Component/Intl/Resources/data/languages/wae.php | 155 src/Symfony/Component/Intl/Resources/data/languages/xh.php | 65 src/Symfony/Component/Intl/Resources/data/languages/xnr.php | 408 src/Symfony/Component/Intl/Resources/data/languages/xog.php | 52 src/Symfony/Component/Intl/Resources/data/languages/yav.php | 52 src/Symfony/Component/Intl/Resources/data/languages/yo.php | 1 src/Symfony/Component/Intl/Resources/data/languages/yo_BJ.php | 1 src/Symfony/Component/Intl/Resources/data/languages/yrl.php | 528 + src/Symfony/Component/Intl/Resources/data/languages/yrl_CO.php | 23 src/Symfony/Component/Intl/Resources/data/languages/yrl_VE.php | 23 src/Symfony/Component/Intl/Resources/data/languages/yue.php | 646 + src/Symfony/Component/Intl/Resources/data/languages/yue_Hans.php | 646 + src/Symfony/Component/Intl/Resources/data/languages/zgh.php | 52 src/Symfony/Component/Intl/Resources/data/languages/zh.php | 1 src/Symfony/Component/Intl/Resources/data/languages/zh_Hant.php | 1 src/Symfony/Component/Intl/Resources/data/languages/zu.php | 15 src/Symfony/Component/Intl/Resources/data/locales/af.php | 251 src/Symfony/Component/Intl/Resources/data/locales/agq.php | 347 src/Symfony/Component/Intl/Resources/data/locales/ak.php | 118 src/Symfony/Component/Intl/Resources/data/locales/am.php | 257 src/Symfony/Component/Intl/Resources/data/locales/ar.php | 253 src/Symfony/Component/Intl/Resources/data/locales/ar_LY.php | 2 src/Symfony/Component/Intl/Resources/data/locales/ar_SA.php | 3 src/Symfony/Component/Intl/Resources/data/locales/as.php | 257 src/Symfony/Component/Intl/Resources/data/locales/asa.php | 343 src/Symfony/Component/Intl/Resources/data/locales/ast.php | 912 ++ src/Symfony/Component/Intl/Resources/data/locales/az.php | 245 src/Symfony/Component/Intl/Resources/data/locales/az_Cyrl.php | 229 src/Symfony/Component/Intl/Resources/data/locales/ba.php | 252 src/Symfony/Component/Intl/Resources/data/locales/bas.php | 342 src/Symfony/Component/Intl/Resources/data/locales/be.php | 253 src/Symfony/Component/Intl/Resources/data/locales/bem.php | 53 src/Symfony/Component/Intl/Resources/data/locales/bez.php | 347 src/Symfony/Component/Intl/Resources/data/locales/bg.php | 253 src/Symfony/Component/Intl/Resources/data/locales/bgc.php | 10 src/Symfony/Component/Intl/Resources/data/locales/bho.php | 10 src/Symfony/Component/Intl/Resources/data/locales/blo.php | 936 ++ src/Symfony/Component/Intl/Resources/data/locales/bn.php | 387 src/Symfony/Component/Intl/Resources/data/locales/bn_IN.php | 2 src/Symfony/Component/Intl/Resources/data/locales/br.php | 261 src/Symfony/Component/Intl/Resources/data/locales/brx.php | 911 ++ src/Symfony/Component/Intl/Resources/data/locales/bs.php | 245 src/Symfony/Component/Intl/Resources/data/locales/bs_Cyrl.php | 245 src/Symfony/Component/Intl/Resources/data/locales/bua.php | 9 src/Symfony/Component/Intl/Resources/data/locales/ca.php | 285 src/Symfony/Component/Intl/Resources/data/locales/ccp.php | 888 ++ src/Symfony/Component/Intl/Resources/data/locales/ce.php | 199 src/Symfony/Component/Intl/Resources/data/locales/ceb.php | 315 src/Symfony/Component/Intl/Resources/data/locales/cgg.php | 346 src/Symfony/Component/Intl/Resources/data/locales/chr.php | 935 ++ src/Symfony/Component/Intl/Resources/data/locales/ckb.php | 876 ++ src/Symfony/Component/Intl/Resources/data/locales/cs.php | 247 src/Symfony/Component/Intl/Resources/data/locales/csw.php | 17 src/Symfony/Component/Intl/Resources/data/locales/cv.php | 254 src/Symfony/Component/Intl/Resources/data/locales/cy.php | 255 src/Symfony/Component/Intl/Resources/data/locales/da.php | 245 src/Symfony/Component/Intl/Resources/data/locales/dav.php | 347 src/Symfony/Component/Intl/Resources/data/locales/de.php | 253 src/Symfony/Component/Intl/Resources/data/locales/de_AT.php | 6 src/Symfony/Component/Intl/Resources/data/locales/de_CH.php | 3 src/Symfony/Component/Intl/Resources/data/locales/dje.php | 346 src/Symfony/Component/Intl/Resources/data/locales/doi.php | 37 src/Symfony/Component/Intl/Resources/data/locales/dsb.php | 931 ++ src/Symfony/Component/Intl/Resources/data/locales/dua.php | 8 src/Symfony/Component/Intl/Resources/data/locales/dyo.php | 200 src/Symfony/Component/Intl/Resources/data/locales/dz.php | 11 src/Symfony/Component/Intl/Resources/data/locales/ebu.php | 347 src/Symfony/Component/Intl/Resources/data/locales/ee.php | 43 src/Symfony/Component/Intl/Resources/data/locales/el.php | 253 src/Symfony/Component/Intl/Resources/data/locales/en.php | 255 src/Symfony/Component/Intl/Resources/data/locales/en_001.php | 2 src/Symfony/Component/Intl/Resources/data/locales/en_AU.php | 4 src/Symfony/Component/Intl/Resources/data/locales/en_CA.php | 4 src/Symfony/Component/Intl/Resources/data/locales/eo.php | 215 src/Symfony/Component/Intl/Resources/data/locales/es.php | 245 src/Symfony/Component/Intl/Resources/data/locales/es_419.php | 37 src/Symfony/Component/Intl/Resources/data/locales/es_AR.php | 4 src/Symfony/Component/Intl/Resources/data/locales/es_BO.php | 4 src/Symfony/Component/Intl/Resources/data/locales/es_CL.php | 4 src/Symfony/Component/Intl/Resources/data/locales/es_CO.php | 4 src/Symfony/Component/Intl/Resources/data/locales/es_CR.php | 4 src/Symfony/Component/Intl/Resources/data/locales/es_DO.php | 4 src/Symfony/Component/Intl/Resources/data/locales/es_EC.php | 4 src/Symfony/Component/Intl/Resources/data/locales/es_GT.php | 4 src/Symfony/Component/Intl/Resources/data/locales/es_HN.php | 4 src/Symfony/Component/Intl/Resources/data/locales/es_MX.php | 11 src/Symfony/Component/Intl/Resources/data/locales/es_NI.php | 4 src/Symfony/Component/Intl/Resources/data/locales/es_PA.php | 4 src/Symfony/Component/Intl/Resources/data/locales/es_PE.php | 4 src/Symfony/Component/Intl/Resources/data/locales/es_PR.php | 2 src/Symfony/Component/Intl/Resources/data/locales/es_PY.php | 4 src/Symfony/Component/Intl/Resources/data/locales/es_SV.php | 2 src/Symfony/Component/Intl/Resources/data/locales/es_US.php | 18 src/Symfony/Component/Intl/Resources/data/locales/es_VE.php | 4 src/Symfony/Component/Intl/Resources/data/locales/et.php | 243 src/Symfony/Component/Intl/Resources/data/locales/eu.php | 251 src/Symfony/Component/Intl/Resources/data/locales/ewo.php | 347 src/Symfony/Component/Intl/Resources/data/locales/fa.php | 253 src/Symfony/Component/Intl/Resources/data/locales/fa_AF.php | 44 src/Symfony/Component/Intl/Resources/data/locales/ff_Adlm.php | 231 src/Symfony/Component/Intl/Resources/data/locales/fi.php | 247 src/Symfony/Component/Intl/Resources/data/locales/fil.php | 939 ++ src/Symfony/Component/Intl/Resources/data/locales/fo.php | 240 src/Symfony/Component/Intl/Resources/data/locales/fr.php | 251 src/Symfony/Component/Intl/Resources/data/locales/fr_CA.php | 43 src/Symfony/Component/Intl/Resources/data/locales/fur.php | 615 + src/Symfony/Component/Intl/Resources/data/locales/fy.php | 202 src/Symfony/Component/Intl/Resources/data/locales/ga.php | 253 src/Symfony/Component/Intl/Resources/data/locales/gaa.php | 10 src/Symfony/Component/Intl/Resources/data/locales/gd.php | 253 src/Symfony/Component/Intl/Resources/data/locales/gl.php | 255 src/Symfony/Component/Intl/Resources/data/locales/gsw.php | 757 + src/Symfony/Component/Intl/Resources/data/locales/gu.php | 291 src/Symfony/Component/Intl/Resources/data/locales/guz.php | 347 src/Symfony/Component/Intl/Resources/data/locales/ha.php | 251 src/Symfony/Component/Intl/Resources/data/locales/haw.php | 69 src/Symfony/Component/Intl/Resources/data/locales/he.php | 253 src/Symfony/Component/Intl/Resources/data/locales/hi.php | 259 src/Symfony/Component/Intl/Resources/data/locales/hi_Latn.php | 25 src/Symfony/Component/Intl/Resources/data/locales/hr.php | 245 src/Symfony/Component/Intl/Resources/data/locales/hsb.php | 931 ++ src/Symfony/Component/Intl/Resources/data/locales/hu.php | 375 src/Symfony/Component/Intl/Resources/data/locales/hy.php | 253 src/Symfony/Component/Intl/Resources/data/locales/ia.php | 241 src/Symfony/Component/Intl/Resources/data/locales/id.php | 255 src/Symfony/Component/Intl/Resources/data/locales/ie.php | 6 src/Symfony/Component/Intl/Resources/data/locales/ig.php | 877 +- src/Symfony/Component/Intl/Resources/data/locales/ii.php | 2 src/Symfony/Component/Intl/Resources/data/locales/is.php | 253 src/Symfony/Component/Intl/Resources/data/locales/it.php | 245 src/Symfony/Component/Intl/Resources/data/locales/ja.php | 257 src/Symfony/Component/Intl/Resources/data/locales/jgo.php | 97 src/Symfony/Component/Intl/Resources/data/locales/jmc.php | 347 src/Symfony/Component/Intl/Resources/data/locales/jv.php | 833 + src/Symfony/Component/Intl/Resources/data/locales/ka.php | 253 src/Symfony/Component/Intl/Resources/data/locales/kab.php | 347 src/Symfony/Component/Intl/Resources/data/locales/kam.php | 347 src/Symfony/Component/Intl/Resources/data/locales/kde.php | 347 src/Symfony/Component/Intl/Resources/data/locales/kea.php | 755 + src/Symfony/Component/Intl/Resources/data/locales/kgp.php | 895 ++ src/Symfony/Component/Intl/Resources/data/locales/khq.php | 347 src/Symfony/Component/Intl/Resources/data/locales/ki.php | 228 src/Symfony/Component/Intl/Resources/data/locales/kk.php | 253 src/Symfony/Component/Intl/Resources/data/locales/kk_Arab.php | 252 src/Symfony/Component/Intl/Resources/data/locales/kkj.php | 12 src/Symfony/Component/Intl/Resources/data/locales/kln.php | 347 src/Symfony/Component/Intl/Resources/data/locales/km.php | 251 src/Symfony/Component/Intl/Resources/data/locales/kn.php | 253 src/Symfony/Component/Intl/Resources/data/locales/ko.php | 253 src/Symfony/Component/Intl/Resources/data/locales/kok.php | 939 ++ src/Symfony/Component/Intl/Resources/data/locales/kok_Latn.php | 845 ++ src/Symfony/Component/Intl/Resources/data/locales/ks.php | 91 src/Symfony/Component/Intl/Resources/data/locales/ks_Deva.php | 25 src/Symfony/Component/Intl/Resources/data/locales/ksb.php | 343 src/Symfony/Component/Intl/Resources/data/locales/ksf.php | 347 src/Symfony/Component/Intl/Resources/data/locales/ksh.php | 791 + src/Symfony/Component/Intl/Resources/data/locales/ku.php | 253 src/Symfony/Component/Intl/Resources/data/locales/kxv.php | 527 + src/Symfony/Component/Intl/Resources/data/locales/kxv_Deva.php | 530 + src/Symfony/Component/Intl/Resources/data/locales/kxv_Orya.php | 530 + src/Symfony/Component/Intl/Resources/data/locales/kxv_Telu.php | 530 + src/Symfony/Component/Intl/Resources/data/locales/ky.php | 251 src/Symfony/Component/Intl/Resources/data/locales/lag.php | 347 src/Symfony/Component/Intl/Resources/data/locales/lb.php | 222 src/Symfony/Component/Intl/Resources/data/locales/lij.php | 48 src/Symfony/Component/Intl/Resources/data/locales/lkt.php | 142 src/Symfony/Component/Intl/Resources/data/locales/lmo.php | 10 src/Symfony/Component/Intl/Resources/data/locales/lo.php | 253 src/Symfony/Component/Intl/Resources/data/locales/lrc.php | 292 src/Symfony/Component/Intl/Resources/data/locales/lt.php | 245 src/Symfony/Component/Intl/Resources/data/locales/luo.php | 347 src/Symfony/Component/Intl/Resources/data/locales/luy.php | 347 src/Symfony/Component/Intl/Resources/data/locales/lv.php | 251 src/Symfony/Component/Intl/Resources/data/locales/mai.php | 901 ++ src/Symfony/Component/Intl/Resources/data/locales/mas.php | 348 src/Symfony/Component/Intl/Resources/data/locales/mer.php | 347 src/Symfony/Component/Intl/Resources/data/locales/meta.php | 427 + src/Symfony/Component/Intl/Resources/data/locales/mfe.php | 347 src/Symfony/Component/Intl/Resources/data/locales/mgh.php | 243 src/Symfony/Component/Intl/Resources/data/locales/mgo.php | 8 src/Symfony/Component/Intl/Resources/data/locales/mi.php | 269 src/Symfony/Component/Intl/Resources/data/locales/mk.php | 253 src/Symfony/Component/Intl/Resources/data/locales/ml.php | 253 src/Symfony/Component/Intl/Resources/data/locales/mn.php | 251 src/Symfony/Component/Intl/Resources/data/locales/mni.php | 56 src/Symfony/Component/Intl/Resources/data/locales/mr.php | 253 src/Symfony/Component/Intl/Resources/data/locales/ms.php | 253 src/Symfony/Component/Intl/Resources/data/locales/mt.php | 201 src/Symfony/Component/Intl/Resources/data/locales/mua.php | 345 src/Symfony/Component/Intl/Resources/data/locales/my.php | 255 src/Symfony/Component/Intl/Resources/data/locales/mzn.php | 740 + src/Symfony/Component/Intl/Resources/data/locales/naq.php | 347 src/Symfony/Component/Intl/Resources/data/locales/nds.php | 12 src/Symfony/Component/Intl/Resources/data/locales/ne.php | 253 src/Symfony/Component/Intl/Resources/data/locales/nl.php | 253 src/Symfony/Component/Intl/Resources/data/locales/nmg.php | 345 src/Symfony/Component/Intl/Resources/data/locales/nn.php | 18 src/Symfony/Component/Intl/Resources/data/locales/nnh.php | 23 src/Symfony/Component/Intl/Resources/data/locales/no.php | 245 src/Symfony/Component/Intl/Resources/data/locales/nqo.php | 872 ++ src/Symfony/Component/Intl/Resources/data/locales/nso.php | 10 src/Symfony/Component/Intl/Resources/data/locales/nus.php | 110 src/Symfony/Component/Intl/Resources/data/locales/nyn.php | 347 src/Symfony/Component/Intl/Resources/data/locales/om.php | 27 src/Symfony/Component/Intl/Resources/data/locales/or.php | 253 src/Symfony/Component/Intl/Resources/data/locales/os.php | 3 src/Symfony/Component/Intl/Resources/data/locales/pa.php | 251 src/Symfony/Component/Intl/Resources/data/locales/pcm.php | 935 ++ src/Symfony/Component/Intl/Resources/data/locales/pl.php | 251 src/Symfony/Component/Intl/Resources/data/locales/pms.php | 15 src/Symfony/Component/Intl/Resources/data/locales/prg.php | 11 src/Symfony/Component/Intl/Resources/data/locales/ps.php | 277 src/Symfony/Component/Intl/Resources/data/locales/ps_PK.php | 2 src/Symfony/Component/Intl/Resources/data/locales/pt.php | 245 src/Symfony/Component/Intl/Resources/data/locales/pt_PT.php | 55 src/Symfony/Component/Intl/Resources/data/locales/qu.php | 251 src/Symfony/Component/Intl/Resources/data/locales/raj.php | 10 src/Symfony/Component/Intl/Resources/data/locales/rm.php | 250 src/Symfony/Component/Intl/Resources/data/locales/ro.php | 245 src/Symfony/Component/Intl/Resources/data/locales/ro_MD.php | 1 src/Symfony/Component/Intl/Resources/data/locales/rof.php | 347 src/Symfony/Component/Intl/Resources/data/locales/ru.php | 253 src/Symfony/Component/Intl/Resources/data/locales/rw.php | 1 src/Symfony/Component/Intl/Resources/data/locales/rwk.php | 347 src/Symfony/Component/Intl/Resources/data/locales/sah.php | 102 src/Symfony/Component/Intl/Resources/data/locales/saq.php | 347 src/Symfony/Component/Intl/Resources/data/locales/sat.php | 48 src/Symfony/Component/Intl/Resources/data/locales/sbp.php | 347 src/Symfony/Component/Intl/Resources/data/locales/sc.php | 245 src/Symfony/Component/Intl/Resources/data/locales/scn.php | 842 ++ src/Symfony/Component/Intl/Resources/data/locales/sd.php | 259 src/Symfony/Component/Intl/Resources/data/locales/sd_Deva.php | 56 src/Symfony/Component/Intl/Resources/data/locales/se.php | 19 src/Symfony/Component/Intl/Resources/data/locales/se_FI.php | 6 src/Symfony/Component/Intl/Resources/data/locales/seh.php | 346 src/Symfony/Component/Intl/Resources/data/locales/ses.php | 347 src/Symfony/Component/Intl/Resources/data/locales/shi.php | 347 src/Symfony/Component/Intl/Resources/data/locales/shi_Latn.php | 347 src/Symfony/Component/Intl/Resources/data/locales/shn.php | 936 ++ src/Symfony/Component/Intl/Resources/data/locales/si.php | 251 src/Symfony/Component/Intl/Resources/data/locales/sk.php | 245 src/Symfony/Component/Intl/Resources/data/locales/sl.php | 297 src/Symfony/Component/Intl/Resources/data/locales/smn.php | 763 + src/Symfony/Component/Intl/Resources/data/locales/so.php | 251 src/Symfony/Component/Intl/Resources/data/locales/sq.php | 251 src/Symfony/Component/Intl/Resources/data/locales/sr.php | 253 src/Symfony/Component/Intl/Resources/data/locales/sr_Cyrl_BA.php | 19 src/Symfony/Component/Intl/Resources/data/locales/sr_Cyrl_ME.php | 14 src/Symfony/Component/Intl/Resources/data/locales/sr_Cyrl_XK.php | 18 src/Symfony/Component/Intl/Resources/data/locales/sr_Latn.php | 253 src/Symfony/Component/Intl/Resources/data/locales/sr_Latn_BA.php | 19 src/Symfony/Component/Intl/Resources/data/locales/sr_Latn_ME.php | 14 src/Symfony/Component/Intl/Resources/data/locales/sr_Latn_XK.php | 18 src/Symfony/Component/Intl/Resources/data/locales/su.php | 24 src/Symfony/Component/Intl/Resources/data/locales/sv.php | 251 src/Symfony/Component/Intl/Resources/data/locales/sw.php | 323 src/Symfony/Component/Intl/Resources/data/locales/sw_CD.php | 26 src/Symfony/Component/Intl/Resources/data/locales/sw_KE.php | 102 src/Symfony/Component/Intl/Resources/data/locales/syr.php | 408 src/Symfony/Component/Intl/Resources/data/locales/szl.php | 10 src/Symfony/Component/Intl/Resources/data/locales/ta.php | 253 src/Symfony/Component/Intl/Resources/data/locales/te.php | 259 src/Symfony/Component/Intl/Resources/data/locales/teo.php | 348 src/Symfony/Component/Intl/Resources/data/locales/tg.php | 41 src/Symfony/Component/Intl/Resources/data/locales/th.php | 253 src/Symfony/Component/Intl/Resources/data/locales/ti.php | 253 src/Symfony/Component/Intl/Resources/data/locales/tk.php | 255 src/Symfony/Component/Intl/Resources/data/locales/tn.php | 6 src/Symfony/Component/Intl/Resources/data/locales/to.php | 237 src/Symfony/Component/Intl/Resources/data/locales/tok.php | 235 src/Symfony/Component/Intl/Resources/data/locales/tr.php | 253 src/Symfony/Component/Intl/Resources/data/locales/tt.php | 33 src/Symfony/Component/Intl/Resources/data/locales/twq.php | 347 src/Symfony/Component/Intl/Resources/data/locales/tyv.php | 169 src/Symfony/Component/Intl/Resources/data/locales/tzm.php | 347 src/Symfony/Component/Intl/Resources/data/locales/ug.php | 200 src/Symfony/Component/Intl/Resources/data/locales/uk.php | 255 src/Symfony/Component/Intl/Resources/data/locales/ur.php | 275 src/Symfony/Component/Intl/Resources/data/locales/ur_IN.php | 7 src/Symfony/Component/Intl/Resources/data/locales/uz.php | 247 src/Symfony/Component/Intl/Resources/data/locales/uz_Cyrl.php | 224 src/Symfony/Component/Intl/Resources/data/locales/vai.php | 367 src/Symfony/Component/Intl/Resources/data/locales/vai_Latn.php | 367 src/Symfony/Component/Intl/Resources/data/locales/vec.php | 927 ++ src/Symfony/Component/Intl/Resources/data/locales/vi.php | 263 src/Symfony/Component/Intl/Resources/data/locales/vmw.php | 9 src/Symfony/Component/Intl/Resources/data/locales/vun.php | 347 src/Symfony/Component/Intl/Resources/data/locales/wae.php | 592 + src/Symfony/Component/Intl/Resources/data/locales/wo.php | 33 src/Symfony/Component/Intl/Resources/data/locales/xh.php | 206 src/Symfony/Component/Intl/Resources/data/locales/xnr.php | 885 ++ src/Symfony/Component/Intl/Resources/data/locales/xog.php | 346 src/Symfony/Component/Intl/Resources/data/locales/yav.php | 345 src/Symfony/Component/Intl/Resources/data/locales/yi.php | 19 src/Symfony/Component/Intl/Resources/data/locales/yo.php | 245 src/Symfony/Component/Intl/Resources/data/locales/yo_BJ.php | 81 src/Symfony/Component/Intl/Resources/data/locales/yrl.php | 895 ++ src/Symfony/Component/Intl/Resources/data/locales/yrl_CO.php | 51 src/Symfony/Component/Intl/Resources/data/locales/yrl_VE.php | 51 src/Symfony/Component/Intl/Resources/data/locales/yue.php | 941 ++ src/Symfony/Component/Intl/Resources/data/locales/yue_Hans.php | 700 + src/Symfony/Component/Intl/Resources/data/locales/zgh.php | 349 src/Symfony/Component/Intl/Resources/data/locales/zh.php | 253 src/Symfony/Component/Intl/Resources/data/locales/zh_Hant.php | 253 src/Symfony/Component/Intl/Resources/data/locales/zh_Hant_HK.php | 69 src/Symfony/Component/Intl/Resources/data/locales/zu.php | 257 src/Symfony/Component/Intl/Resources/data/regions/agq.php | 229 src/Symfony/Component/Intl/Resources/data/regions/ars.php | 10 src/Symfony/Component/Intl/Resources/data/regions/asa.php | 227 src/Symfony/Component/Intl/Resources/data/regions/ast.php | 256 src/Symfony/Component/Intl/Resources/data/regions/bas.php | 226 src/Symfony/Component/Intl/Resources/data/regions/bem.php | 8 src/Symfony/Component/Intl/Resources/data/regions/bez.php | 229 src/Symfony/Component/Intl/Resources/data/regions/bgc.php | 8 src/Symfony/Component/Intl/Resources/data/regions/bho.php | 8 src/Symfony/Component/Intl/Resources/data/regions/blo.php | 258 src/Symfony/Component/Intl/Resources/data/regions/bn.php | 20 src/Symfony/Component/Intl/Resources/data/regions/brx.php | 258 src/Symfony/Component/Intl/Resources/data/regions/bua.php | 8 src/Symfony/Component/Intl/Resources/data/regions/ca.php | 42 src/Symfony/Component/Intl/Resources/data/regions/ccp.php | 257 src/Symfony/Component/Intl/Resources/data/regions/ceb.php | 258 src/Symfony/Component/Intl/Resources/data/regions/cgg.php | 228 src/Symfony/Component/Intl/Resources/data/regions/chr.php | 258 src/Symfony/Component/Intl/Resources/data/regions/ckb.php | 257 src/Symfony/Component/Intl/Resources/data/regions/csw.php | 9 src/Symfony/Component/Intl/Resources/data/regions/cv.php | 2 src/Symfony/Component/Intl/Resources/data/regions/cy.php | 2 src/Symfony/Component/Intl/Resources/data/regions/dav.php | 229 src/Symfony/Component/Intl/Resources/data/regions/dje.php | 228 src/Symfony/Component/Intl/Resources/data/regions/doi.php | 17 src/Symfony/Component/Intl/Resources/data/regions/dsb.php | 258 src/Symfony/Component/Intl/Resources/data/regions/dua.php | 8 src/Symfony/Component/Intl/Resources/data/regions/dyo.php | 115 src/Symfony/Component/Intl/Resources/data/regions/ebu.php | 229 src/Symfony/Component/Intl/Resources/data/regions/en.php | 6 src/Symfony/Component/Intl/Resources/data/regions/en_001.php | 2 src/Symfony/Component/Intl/Resources/data/regions/en_AU.php | 1 src/Symfony/Component/Intl/Resources/data/regions/en_CA.php | 2 src/Symfony/Component/Intl/Resources/data/regions/en_IN.php | 8 src/Symfony/Component/Intl/Resources/data/regions/eo.php | 4 src/Symfony/Component/Intl/Resources/data/regions/es_419.php | 2 src/Symfony/Component/Intl/Resources/data/regions/ewo.php | 229 src/Symfony/Component/Intl/Resources/data/regions/fi.php | 2 src/Symfony/Component/Intl/Resources/data/regions/fil.php | 258 src/Symfony/Component/Intl/Resources/data/regions/fo.php | 2 src/Symfony/Component/Intl/Resources/data/regions/fur.php | 250 src/Symfony/Component/Intl/Resources/data/regions/gaa.php | 8 src/Symfony/Component/Intl/Resources/data/regions/gsw.php | 250 src/Symfony/Component/Intl/Resources/data/regions/gu.php | 28 src/Symfony/Component/Intl/Resources/data/regions/guz.php | 229 src/Symfony/Component/Intl/Resources/data/regions/haw.php | 27 src/Symfony/Component/Intl/Resources/data/regions/hsb.php | 258 src/Symfony/Component/Intl/Resources/data/regions/hy.php | 2 src/Symfony/Component/Intl/Resources/data/regions/id.php | 2 src/Symfony/Component/Intl/Resources/data/regions/in.php | 2 src/Symfony/Component/Intl/Resources/data/regions/jgo.php | 83 src/Symfony/Component/Intl/Resources/data/regions/jmc.php | 229 src/Symfony/Component/Intl/Resources/data/regions/jv.php | 222 src/Symfony/Component/Intl/Resources/data/regions/kab.php | 229 src/Symfony/Component/Intl/Resources/data/regions/kam.php | 229 src/Symfony/Component/Intl/Resources/data/regions/kde.php | 229 src/Symfony/Component/Intl/Resources/data/regions/kea.php | 258 src/Symfony/Component/Intl/Resources/data/regions/kgp.php | 257 src/Symfony/Component/Intl/Resources/data/regions/khq.php | 229 src/Symfony/Component/Intl/Resources/data/regions/kkj.php | 8 src/Symfony/Component/Intl/Resources/data/regions/kln.php | 229 src/Symfony/Component/Intl/Resources/data/regions/kok.php | 258 src/Symfony/Component/Intl/Resources/data/regions/kok_Latn.php | 258 src/Symfony/Component/Intl/Resources/data/regions/ksb.php | 228 src/Symfony/Component/Intl/Resources/data/regions/ksf.php | 229 src/Symfony/Component/Intl/Resources/data/regions/ksh.php | 256 src/Symfony/Component/Intl/Resources/data/regions/kxv.php | 256 src/Symfony/Component/Intl/Resources/data/regions/kxv_Deva.php | 256 src/Symfony/Component/Intl/Resources/data/regions/kxv_Orya.php | 256 src/Symfony/Component/Intl/Resources/data/regions/kxv_Telu.php | 256 src/Symfony/Component/Intl/Resources/data/regions/lag.php | 229 src/Symfony/Component/Intl/Resources/data/regions/lij.php | 10 src/Symfony/Component/Intl/Resources/data/regions/lkt.php | 14 src/Symfony/Component/Intl/Resources/data/regions/lmo.php | 8 src/Symfony/Component/Intl/Resources/data/regions/lrc.php | 17 src/Symfony/Component/Intl/Resources/data/regions/luo.php | 229 src/Symfony/Component/Intl/Resources/data/regions/luy.php | 229 src/Symfony/Component/Intl/Resources/data/regions/mai.php | 258 src/Symfony/Component/Intl/Resources/data/regions/mas.php | 229 src/Symfony/Component/Intl/Resources/data/regions/mer.php | 229 src/Symfony/Component/Intl/Resources/data/regions/mfe.php | 229 src/Symfony/Component/Intl/Resources/data/regions/mgh.php | 143 src/Symfony/Component/Intl/Resources/data/regions/mgo.php | 8 src/Symfony/Component/Intl/Resources/data/regions/mi.php | 2 src/Symfony/Component/Intl/Resources/data/regions/mni.php | 17 src/Symfony/Component/Intl/Resources/data/regions/mua.php | 229 src/Symfony/Component/Intl/Resources/data/regions/my.php | 6 src/Symfony/Component/Intl/Resources/data/regions/mzn.php | 256 src/Symfony/Component/Intl/Resources/data/regions/naq.php | 229 src/Symfony/Component/Intl/Resources/data/regions/nds.php | 9 src/Symfony/Component/Intl/Resources/data/regions/nmg.php | 229 src/Symfony/Component/Intl/Resources/data/regions/nnh.php | 8 src/Symfony/Component/Intl/Resources/data/regions/nqo.php | 258 src/Symfony/Component/Intl/Resources/data/regions/nso.php | 8 src/Symfony/Component/Intl/Resources/data/regions/nus.php | 57 src/Symfony/Component/Intl/Resources/data/regions/nyn.php | 229 src/Symfony/Component/Intl/Resources/data/regions/pcm.php | 258 src/Symfony/Component/Intl/Resources/data/regions/pms.php | 13 src/Symfony/Component/Intl/Resources/data/regions/prg.php | 8 src/Symfony/Component/Intl/Resources/data/regions/ps.php | 4 src/Symfony/Component/Intl/Resources/data/regions/raj.php | 8 src/Symfony/Component/Intl/Resources/data/regions/rof.php | 229 src/Symfony/Component/Intl/Resources/data/regions/rwk.php | 229 src/Symfony/Component/Intl/Resources/data/regions/sah.php | 28 src/Symfony/Component/Intl/Resources/data/regions/saq.php | 229 src/Symfony/Component/Intl/Resources/data/regions/sat.php | 17 src/Symfony/Component/Intl/Resources/data/regions/sbp.php | 229 src/Symfony/Component/Intl/Resources/data/regions/scn.php | 258 src/Symfony/Component/Intl/Resources/data/regions/sd.php | 2 src/Symfony/Component/Intl/Resources/data/regions/seh.php | 228 src/Symfony/Component/Intl/Resources/data/regions/ses.php | 229 src/Symfony/Component/Intl/Resources/data/regions/shi.php | 229 src/Symfony/Component/Intl/Resources/data/regions/shi_Latn.php | 229 src/Symfony/Component/Intl/Resources/data/regions/shn.php | 258 src/Symfony/Component/Intl/Resources/data/regions/smn.php | 253 src/Symfony/Component/Intl/Resources/data/regions/so.php | 2 src/Symfony/Component/Intl/Resources/data/regions/su.php | 2 src/Symfony/Component/Intl/Resources/data/regions/sw.php | 32 src/Symfony/Component/Intl/Resources/data/regions/sw_CD.php | 7 src/Symfony/Component/Intl/Resources/data/regions/sw_KE.php | 12 src/Symfony/Component/Intl/Resources/data/regions/syr.php | 258 src/Symfony/Component/Intl/Resources/data/regions/szl.php | 8 src/Symfony/Component/Intl/Resources/data/regions/te.php | 2 src/Symfony/Component/Intl/Resources/data/regions/teo.php | 229 src/Symfony/Component/Intl/Resources/data/regions/tok.php | 73 src/Symfony/Component/Intl/Resources/data/regions/twq.php | 229 src/Symfony/Component/Intl/Resources/data/regions/tyv.php | 125 src/Symfony/Component/Intl/Resources/data/regions/tzm.php | 229 src/Symfony/Component/Intl/Resources/data/regions/uk.php | 2 src/Symfony/Component/Intl/Resources/data/regions/ur.php | 4 src/Symfony/Component/Intl/Resources/data/regions/vai.php | 255 src/Symfony/Component/Intl/Resources/data/regions/vai_Latn.php | 228 src/Symfony/Component/Intl/Resources/data/regions/vec.php | 258 src/Symfony/Component/Intl/Resources/data/regions/vmw.php | 8 src/Symfony/Component/Intl/Resources/data/regions/vun.php | 229 src/Symfony/Component/Intl/Resources/data/regions/wae.php | 250 src/Symfony/Component/Intl/Resources/data/regions/xnr.php | 258 src/Symfony/Component/Intl/Resources/data/regions/xog.php | 228 src/Symfony/Component/Intl/Resources/data/regions/yav.php | 228 src/Symfony/Component/Intl/Resources/data/regions/yo.php | 2 src/Symfony/Component/Intl/Resources/data/regions/yrl.php | 257 src/Symfony/Component/Intl/Resources/data/regions/yrl_CO.php | 13 src/Symfony/Component/Intl/Resources/data/regions/yrl_VE.php | 13 src/Symfony/Component/Intl/Resources/data/regions/yue.php | 258 src/Symfony/Component/Intl/Resources/data/regions/yue_Hans.php | 258 src/Symfony/Component/Intl/Resources/data/regions/zgh.php | 232 src/Symfony/Component/Intl/Resources/data/regions/zu.php | 4 src/Symfony/Component/Intl/Resources/data/scripts/ast.php | 180 src/Symfony/Component/Intl/Resources/data/scripts/az.php | 2 src/Symfony/Component/Intl/Resources/data/scripts/bgc.php | 7 src/Symfony/Component/Intl/Resources/data/scripts/bho.php | 7 src/Symfony/Component/Intl/Resources/data/scripts/blo.php | 63 src/Symfony/Component/Intl/Resources/data/scripts/bn.php | 29 src/Symfony/Component/Intl/Resources/data/scripts/br.php | 8 src/Symfony/Component/Intl/Resources/data/scripts/brx.php | 136 src/Symfony/Component/Intl/Resources/data/scripts/bua.php | 7 src/Symfony/Component/Intl/Resources/data/scripts/ccp.php | 138 src/Symfony/Component/Intl/Resources/data/scripts/ceb.php | 14 src/Symfony/Component/Intl/Resources/data/scripts/chr.php | 63 src/Symfony/Component/Intl/Resources/data/scripts/ckb.php | 49 src/Symfony/Component/Intl/Resources/data/scripts/csw.php | 9 src/Symfony/Component/Intl/Resources/data/scripts/cv.php | 4 src/Symfony/Component/Intl/Resources/data/scripts/doi.php | 13 src/Symfony/Component/Intl/Resources/data/scripts/dsb.php | 63 src/Symfony/Component/Intl/Resources/data/scripts/en.php | 2 src/Symfony/Component/Intl/Resources/data/scripts/en_001.php | 7 src/Symfony/Component/Intl/Resources/data/scripts/en_GB.php | 7 src/Symfony/Component/Intl/Resources/data/scripts/eo.php | 1 src/Symfony/Component/Intl/Resources/data/scripts/es_419.php | 2 src/Symfony/Component/Intl/Resources/data/scripts/et.php | 8 src/Symfony/Component/Intl/Resources/data/scripts/fa.php | 2 src/Symfony/Component/Intl/Resources/data/scripts/fi.php | 1 src/Symfony/Component/Intl/Resources/data/scripts/fil.php | 61 src/Symfony/Component/Intl/Resources/data/scripts/fur.php | 67 src/Symfony/Component/Intl/Resources/data/scripts/gaa.php | 7 src/Symfony/Component/Intl/Resources/data/scripts/gsw.php | 125 src/Symfony/Component/Intl/Resources/data/scripts/hsb.php | 63 src/Symfony/Component/Intl/Resources/data/scripts/hu.php | 74 src/Symfony/Component/Intl/Resources/data/scripts/ig.php | 42 src/Symfony/Component/Intl/Resources/data/scripts/it.php | 2 src/Symfony/Component/Intl/Resources/data/scripts/jgo.php | 8 src/Symfony/Component/Intl/Resources/data/scripts/jv.php | 18 src/Symfony/Component/Intl/Resources/data/scripts/ka.php | 2 src/Symfony/Component/Intl/Resources/data/scripts/kea.php | 47 src/Symfony/Component/Intl/Resources/data/scripts/kgp.php | 141 src/Symfony/Component/Intl/Resources/data/scripts/ki.php | 8 src/Symfony/Component/Intl/Resources/data/scripts/kk.php | 2 src/Symfony/Component/Intl/Resources/data/scripts/kok.php | 63 src/Symfony/Component/Intl/Resources/data/scripts/kok_Latn.php | 13 src/Symfony/Component/Intl/Resources/data/scripts/ksh.php | 44 src/Symfony/Component/Intl/Resources/data/scripts/kxv.php | 24 src/Symfony/Component/Intl/Resources/data/scripts/kxv_Deva.php | 24 src/Symfony/Component/Intl/Resources/data/scripts/kxv_Orya.php | 23 src/Symfony/Component/Intl/Resources/data/scripts/kxv_Telu.php | 24 src/Symfony/Component/Intl/Resources/data/scripts/lij.php | 7 src/Symfony/Component/Intl/Resources/data/scripts/lmo.php | 7 src/Symfony/Component/Intl/Resources/data/scripts/lrc.php | 44 src/Symfony/Component/Intl/Resources/data/scripts/mai.php | 63 src/Symfony/Component/Intl/Resources/data/scripts/meta.php | 3 src/Symfony/Component/Intl/Resources/data/scripts/mgo.php | 8 src/Symfony/Component/Intl/Resources/data/scripts/mni.php | 16 src/Symfony/Component/Intl/Resources/data/scripts/mzn.php | 25 src/Symfony/Component/Intl/Resources/data/scripts/nds.php | 7 src/Symfony/Component/Intl/Resources/data/scripts/nqo.php | 180 src/Symfony/Component/Intl/Resources/data/scripts/nso.php | 7 src/Symfony/Component/Intl/Resources/data/scripts/pcm.php | 63 src/Symfony/Component/Intl/Resources/data/scripts/pms.php | 7 src/Symfony/Component/Intl/Resources/data/scripts/prg.php | 7 src/Symfony/Component/Intl/Resources/data/scripts/ps.php | 6 src/Symfony/Component/Intl/Resources/data/scripts/raj.php | 7 src/Symfony/Component/Intl/Resources/data/scripts/sah.php | 16 src/Symfony/Component/Intl/Resources/data/scripts/sat.php | 14 src/Symfony/Component/Intl/Resources/data/scripts/scn.php | 64 src/Symfony/Component/Intl/Resources/data/scripts/shn.php | 202 src/Symfony/Component/Intl/Resources/data/scripts/sl.php | 62 src/Symfony/Component/Intl/Resources/data/scripts/su.php | 2 src/Symfony/Component/Intl/Resources/data/scripts/sw.php | 2 src/Symfony/Component/Intl/Resources/data/scripts/sw_KE.php | 1 src/Symfony/Component/Intl/Resources/data/scripts/syr.php | 22 src/Symfony/Component/Intl/Resources/data/scripts/szl.php | 7 src/Symfony/Component/Intl/Resources/data/scripts/ta.php | 2 src/Symfony/Component/Intl/Resources/data/scripts/tn.php | 2 src/Symfony/Component/Intl/Resources/data/scripts/tok.php | 30 src/Symfony/Component/Intl/Resources/data/scripts/tyv.php | 14 src/Symfony/Component/Intl/Resources/data/scripts/vec.php | 195 src/Symfony/Component/Intl/Resources/data/scripts/vmw.php | 7 src/Symfony/Component/Intl/Resources/data/scripts/wae.php | 33 src/Symfony/Component/Intl/Resources/data/scripts/xh.php | 49 src/Symfony/Component/Intl/Resources/data/scripts/xnr.php | 126 src/Symfony/Component/Intl/Resources/data/scripts/yrl.php | 141 src/Symfony/Component/Intl/Resources/data/scripts/yrl_CO.php | 7 src/Symfony/Component/Intl/Resources/data/scripts/yrl_VE.php | 7 src/Symfony/Component/Intl/Resources/data/scripts/yue.php | 172 src/Symfony/Component/Intl/Resources/data/scripts/yue_Hans.php | 172 src/Symfony/Component/Intl/Resources/data/timezones/af.php | 28 src/Symfony/Component/Intl/Resources/data/timezones/ak.php | 44 src/Symfony/Component/Intl/Resources/data/timezones/am.php | 64 src/Symfony/Component/Intl/Resources/data/timezones/ar.php | 30 src/Symfony/Component/Intl/Resources/data/timezones/as.php | 44 src/Symfony/Component/Intl/Resources/data/timezones/ast.php | 446 + src/Symfony/Component/Intl/Resources/data/timezones/az.php | 60 src/Symfony/Component/Intl/Resources/data/timezones/ba.php | 16 src/Symfony/Component/Intl/Resources/data/timezones/be.php | 42 src/Symfony/Component/Intl/Resources/data/timezones/bg.php | 42 src/Symfony/Component/Intl/Resources/data/timezones/bgc.php | 28 src/Symfony/Component/Intl/Resources/data/timezones/bho.php | 28 src/Symfony/Component/Intl/Resources/data/timezones/blo.php | 448 + src/Symfony/Component/Intl/Resources/data/timezones/bn.php | 54 src/Symfony/Component/Intl/Resources/data/timezones/br.php | 36 src/Symfony/Component/Intl/Resources/data/timezones/brx.php | 448 + src/Symfony/Component/Intl/Resources/data/timezones/bs.php | 24 src/Symfony/Component/Intl/Resources/data/timezones/bs_Cyrl.php | 22 src/Symfony/Component/Intl/Resources/data/timezones/bua.php | 51 src/Symfony/Component/Intl/Resources/data/timezones/ca.php | 38 src/Symfony/Component/Intl/Resources/data/timezones/ccp.php | 448 + src/Symfony/Component/Intl/Resources/data/timezones/ce.php | 14 src/Symfony/Component/Intl/Resources/data/timezones/ceb.php | 448 + src/Symfony/Component/Intl/Resources/data/timezones/chr.php | 446 + src/Symfony/Component/Intl/Resources/data/timezones/ckb.php | 446 + src/Symfony/Component/Intl/Resources/data/timezones/cs.php | 38 src/Symfony/Component/Intl/Resources/data/timezones/csw.php | 80 src/Symfony/Component/Intl/Resources/data/timezones/cv.php | 40 src/Symfony/Component/Intl/Resources/data/timezones/cy.php | 40 src/Symfony/Component/Intl/Resources/data/timezones/da.php | 32 src/Symfony/Component/Intl/Resources/data/timezones/de.php | 24 src/Symfony/Component/Intl/Resources/data/timezones/de_CH.php | 3 src/Symfony/Component/Intl/Resources/data/timezones/doi.php | 238 src/Symfony/Component/Intl/Resources/data/timezones/dsb.php | 446 + src/Symfony/Component/Intl/Resources/data/timezones/dz.php | 10 src/Symfony/Component/Intl/Resources/data/timezones/ee.php | 16 src/Symfony/Component/Intl/Resources/data/timezones/el.php | 32 src/Symfony/Component/Intl/Resources/data/timezones/en.php | 18 src/Symfony/Component/Intl/Resources/data/timezones/eo.php | 78 src/Symfony/Component/Intl/Resources/data/timezones/es.php | 24 src/Symfony/Component/Intl/Resources/data/timezones/es_419.php | 26 src/Symfony/Component/Intl/Resources/data/timezones/es_MX.php | 4 src/Symfony/Component/Intl/Resources/data/timezones/es_US.php | 2 src/Symfony/Component/Intl/Resources/data/timezones/et.php | 24 src/Symfony/Component/Intl/Resources/data/timezones/eu.php | 26 src/Symfony/Component/Intl/Resources/data/timezones/fa.php | 26 src/Symfony/Component/Intl/Resources/data/timezones/ff_Adlm.php | 14 src/Symfony/Component/Intl/Resources/data/timezones/fi.php | 24 src/Symfony/Component/Intl/Resources/data/timezones/fil.php | 446 + src/Symfony/Component/Intl/Resources/data/timezones/fo.php | 30 src/Symfony/Component/Intl/Resources/data/timezones/fr.php | 30 src/Symfony/Component/Intl/Resources/data/timezones/fr_CA.php | 3 src/Symfony/Component/Intl/Resources/data/timezones/fur.php | 439 + src/Symfony/Component/Intl/Resources/data/timezones/fy.php | 17 src/Symfony/Component/Intl/Resources/data/timezones/ga.php | 26 src/Symfony/Component/Intl/Resources/data/timezones/gaa.php | 33 src/Symfony/Component/Intl/Resources/data/timezones/gd.php | 20 src/Symfony/Component/Intl/Resources/data/timezones/gl.php | 30 src/Symfony/Component/Intl/Resources/data/timezones/gsw.php | 440 + src/Symfony/Component/Intl/Resources/data/timezones/gu.php | 24 src/Symfony/Component/Intl/Resources/data/timezones/ha.php | 44 src/Symfony/Component/Intl/Resources/data/timezones/haw.php | 134 src/Symfony/Component/Intl/Resources/data/timezones/he.php | 24 src/Symfony/Component/Intl/Resources/data/timezones/hi.php | 26 src/Symfony/Component/Intl/Resources/data/timezones/hi_Latn.php | 4 src/Symfony/Component/Intl/Resources/data/timezones/hr.php | 32 src/Symfony/Component/Intl/Resources/data/timezones/hsb.php | 446 + src/Symfony/Component/Intl/Resources/data/timezones/hu.php | 28 src/Symfony/Component/Intl/Resources/data/timezones/hy.php | 42 src/Symfony/Component/Intl/Resources/data/timezones/ia.php | 16 src/Symfony/Component/Intl/Resources/data/timezones/id.php | 60 src/Symfony/Component/Intl/Resources/data/timezones/ie.php | 10 src/Symfony/Component/Intl/Resources/data/timezones/ig.php | 68 src/Symfony/Component/Intl/Resources/data/timezones/ii.php | 6 src/Symfony/Component/Intl/Resources/data/timezones/is.php | 38 src/Symfony/Component/Intl/Resources/data/timezones/it.php | 36 src/Symfony/Component/Intl/Resources/data/timezones/ja.php | 24 src/Symfony/Component/Intl/Resources/data/timezones/jv.php | 196 src/Symfony/Component/Intl/Resources/data/timezones/ka.php | 44 src/Symfony/Component/Intl/Resources/data/timezones/kea.php | 446 + src/Symfony/Component/Intl/Resources/data/timezones/kgp.php | 446 + src/Symfony/Component/Intl/Resources/data/timezones/ki.php | 412 src/Symfony/Component/Intl/Resources/data/timezones/kk.php | 34 src/Symfony/Component/Intl/Resources/data/timezones/kk_Arab.php | 68 src/Symfony/Component/Intl/Resources/data/timezones/km.php | 52 src/Symfony/Component/Intl/Resources/data/timezones/kn.php | 34 src/Symfony/Component/Intl/Resources/data/timezones/ko.php | 42 src/Symfony/Component/Intl/Resources/data/timezones/kok.php | 446 + src/Symfony/Component/Intl/Resources/data/timezones/kok_Latn.php | 28 src/Symfony/Component/Intl/Resources/data/timezones/ks.php | 16 src/Symfony/Component/Intl/Resources/data/timezones/ks_Deva.php | 5 src/Symfony/Component/Intl/Resources/data/timezones/ksh.php | 445 + src/Symfony/Component/Intl/Resources/data/timezones/ku.php | 14 src/Symfony/Component/Intl/Resources/data/timezones/kxv.php | 446 + src/Symfony/Component/Intl/Resources/data/timezones/kxv_Deva.php | 445 + src/Symfony/Component/Intl/Resources/data/timezones/kxv_Orya.php | 446 + src/Symfony/Component/Intl/Resources/data/timezones/kxv_Telu.php | 446 + src/Symfony/Component/Intl/Resources/data/timezones/ky.php | 34 src/Symfony/Component/Intl/Resources/data/timezones/lb.php | 16 src/Symfony/Component/Intl/Resources/data/timezones/lij.php | 70 src/Symfony/Component/Intl/Resources/data/timezones/lmo.php | 27 src/Symfony/Component/Intl/Resources/data/timezones/lo.php | 38 src/Symfony/Component/Intl/Resources/data/timezones/lrc.php | 109 src/Symfony/Component/Intl/Resources/data/timezones/lt.php | 28 src/Symfony/Component/Intl/Resources/data/timezones/lv.php | 32 src/Symfony/Component/Intl/Resources/data/timezones/mai.php | 448 + src/Symfony/Component/Intl/Resources/data/timezones/mi.php | 190 src/Symfony/Component/Intl/Resources/data/timezones/mk.php | 36 src/Symfony/Component/Intl/Resources/data/timezones/ml.php | 38 src/Symfony/Component/Intl/Resources/data/timezones/mn.php | 42 src/Symfony/Component/Intl/Resources/data/timezones/mni.php | 236 src/Symfony/Component/Intl/Resources/data/timezones/mr.php | 36 src/Symfony/Component/Intl/Resources/data/timezones/ms.php | 24 src/Symfony/Component/Intl/Resources/data/timezones/mt.php | 10 src/Symfony/Component/Intl/Resources/data/timezones/my.php | 60 src/Symfony/Component/Intl/Resources/data/timezones/nds.php | 32 src/Symfony/Component/Intl/Resources/data/timezones/ne.php | 42 src/Symfony/Component/Intl/Resources/data/timezones/nl.php | 22 src/Symfony/Component/Intl/Resources/data/timezones/nn.php | 192 src/Symfony/Component/Intl/Resources/data/timezones/no.php | 420 - src/Symfony/Component/Intl/Resources/data/timezones/nqo.php | 448 + src/Symfony/Component/Intl/Resources/data/timezones/nso.php | 27 src/Symfony/Component/Intl/Resources/data/timezones/oc.php | 5 src/Symfony/Component/Intl/Resources/data/timezones/om.php | 16 src/Symfony/Component/Intl/Resources/data/timezones/or.php | 22 src/Symfony/Component/Intl/Resources/data/timezones/os.php | 6 src/Symfony/Component/Intl/Resources/data/timezones/pa.php | 34 src/Symfony/Component/Intl/Resources/data/timezones/pcm.php | 446 + src/Symfony/Component/Intl/Resources/data/timezones/pl.php | 34 src/Symfony/Component/Intl/Resources/data/timezones/pms.php | 32 src/Symfony/Component/Intl/Resources/data/timezones/prg.php | 26 src/Symfony/Component/Intl/Resources/data/timezones/ps.php | 80 src/Symfony/Component/Intl/Resources/data/timezones/pt.php | 44 src/Symfony/Component/Intl/Resources/data/timezones/pt_PT.php | 28 src/Symfony/Component/Intl/Resources/data/timezones/qu.php | 42 src/Symfony/Component/Intl/Resources/data/timezones/raj.php | 28 src/Symfony/Component/Intl/Resources/data/timezones/rm.php | 42 src/Symfony/Component/Intl/Resources/data/timezones/ro.php | 36 src/Symfony/Component/Intl/Resources/data/timezones/ru.php | 32 src/Symfony/Component/Intl/Resources/data/timezones/rw.php | 42 src/Symfony/Component/Intl/Resources/data/timezones/sa.php | 6 src/Symfony/Component/Intl/Resources/data/timezones/sah.php | 187 src/Symfony/Component/Intl/Resources/data/timezones/sat.php | 253 src/Symfony/Component/Intl/Resources/data/timezones/sc.php | 16 src/Symfony/Component/Intl/Resources/data/timezones/scn.php | 446 + src/Symfony/Component/Intl/Resources/data/timezones/sd.php | 80 src/Symfony/Component/Intl/Resources/data/timezones/sd_Deva.php | 20 src/Symfony/Component/Intl/Resources/data/timezones/se.php | 10 src/Symfony/Component/Intl/Resources/data/timezones/se_FI.php | 10 src/Symfony/Component/Intl/Resources/data/timezones/shn.php | 446 + src/Symfony/Component/Intl/Resources/data/timezones/si.php | 42 src/Symfony/Component/Intl/Resources/data/timezones/sk.php | 38 src/Symfony/Component/Intl/Resources/data/timezones/sl.php | 36 src/Symfony/Component/Intl/Resources/data/timezones/so.php | 312 src/Symfony/Component/Intl/Resources/data/timezones/sq.php | 28 src/Symfony/Component/Intl/Resources/data/timezones/sr.php | 24 src/Symfony/Component/Intl/Resources/data/timezones/sr_Cyrl_BA.php | 20 src/Symfony/Component/Intl/Resources/data/timezones/sr_Latn.php | 24 src/Symfony/Component/Intl/Resources/data/timezones/sr_Latn_BA.php | 9 src/Symfony/Component/Intl/Resources/data/timezones/st.php | 6 src/Symfony/Component/Intl/Resources/data/timezones/su.php | 14 src/Symfony/Component/Intl/Resources/data/timezones/sv.php | 22 src/Symfony/Component/Intl/Resources/data/timezones/sv_FI.php | 15 src/Symfony/Component/Intl/Resources/data/timezones/sw.php | 30 src/Symfony/Component/Intl/Resources/data/timezones/sw_KE.php | 1 src/Symfony/Component/Intl/Resources/data/timezones/syr.php | 446 + src/Symfony/Component/Intl/Resources/data/timezones/szl.php | 26 src/Symfony/Component/Intl/Resources/data/timezones/ta.php | 32 src/Symfony/Component/Intl/Resources/data/timezones/te.php | 32 src/Symfony/Component/Intl/Resources/data/timezones/tg.php | 16 src/Symfony/Component/Intl/Resources/data/timezones/th.php | 22 src/Symfony/Component/Intl/Resources/data/timezones/ti.php | 38 src/Symfony/Component/Intl/Resources/data/timezones/tk.php | 32 src/Symfony/Component/Intl/Resources/data/timezones/tn.php | 6 src/Symfony/Component/Intl/Resources/data/timezones/to.php | 116 src/Symfony/Component/Intl/Resources/data/timezones/tok.php | 235 src/Symfony/Component/Intl/Resources/data/timezones/tr.php | 20 src/Symfony/Component/Intl/Resources/data/timezones/tt.php | 26 src/Symfony/Component/Intl/Resources/data/timezones/tyv.php | 314 src/Symfony/Component/Intl/Resources/data/timezones/ug.php | 14 src/Symfony/Component/Intl/Resources/data/timezones/uk.php | 152 src/Symfony/Component/Intl/Resources/data/timezones/ur.php | 64 src/Symfony/Component/Intl/Resources/data/timezones/ur_IN.php | 7 src/Symfony/Component/Intl/Resources/data/timezones/uz.php | 48 src/Symfony/Component/Intl/Resources/data/timezones/uz_Cyrl.php | 28 src/Symfony/Component/Intl/Resources/data/timezones/vec.php | 448 + src/Symfony/Component/Intl/Resources/data/timezones/vi.php | 38 src/Symfony/Component/Intl/Resources/data/timezones/vmw.php | 29 src/Symfony/Component/Intl/Resources/data/timezones/wae.php | 442 + src/Symfony/Component/Intl/Resources/data/timezones/wo.php | 42 src/Symfony/Component/Intl/Resources/data/timezones/xh.php | 40 src/Symfony/Component/Intl/Resources/data/timezones/xnr.php | 448 + src/Symfony/Component/Intl/Resources/data/timezones/yo.php | 76 src/Symfony/Component/Intl/Resources/data/timezones/yo_BJ.php | 16 src/Symfony/Component/Intl/Resources/data/timezones/yrl.php | 446 + src/Symfony/Component/Intl/Resources/data/timezones/yrl_CO.php | 10 src/Symfony/Component/Intl/Resources/data/timezones/yrl_VE.php | 10 src/Symfony/Component/Intl/Resources/data/timezones/yue.php | 446 + src/Symfony/Component/Intl/Resources/data/timezones/yue_Hans.php | 446 + src/Symfony/Component/Intl/Resources/data/timezones/za.php | 5 src/Symfony/Component/Intl/Resources/data/timezones/zh.php | 24 src/Symfony/Component/Intl/Resources/data/timezones/zh_Hans_SG.php | 24 src/Symfony/Component/Intl/Resources/data/timezones/zh_Hant.php | 18 src/Symfony/Component/Intl/Resources/data/timezones/zh_Hant_HK.php | 6 src/Symfony/Component/Intl/Resources/data/timezones/zu.php | 36 src/Symfony/Component/Intl/Resources/data/version.txt | 2 src/Symfony/Component/Intl/Resources/emoji/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/Intl/Resources/emoji/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/Intl/Tests/CountriesTest.php | 17 src/Symfony/Component/Intl/Tests/CurrenciesTest.php | 1 src/Symfony/Component/Intl/Tests/Data/Bundle/Reader/BundleEntryReaderTest.php | 56 src/Symfony/Component/Intl/Tests/Data/Util/LocaleScannerTest.php | 4 src/Symfony/Component/Intl/Tests/LanguagesTest.php | 22 src/Symfony/Component/Intl/Tests/LocalesTest.php | 7 src/Symfony/Component/Intl/Tests/ResourceBundleTestCase.php | 261 src/Symfony/Component/Intl/Tests/ScriptsTest.php | 3 src/Symfony/Component/Intl/Tests/TimezonesTest.php | 20 src/Symfony/Component/Intl/Tests/Transliterator/EmojiTransliteratorTest.php | 13 src/Symfony/Component/Intl/Timezones.php | 2 src/Symfony/Component/Intl/Transliterator/EmojiTransliterator.php | 18 src/Symfony/Component/Ldap/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/Ldap/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/Ldap/Adapter/ExtLdap/Connection.php | 2 src/Symfony/Component/Lock/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/Lock/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/Lock/Lock.php | 2 src/Symfony/Component/Lock/PersistingStoreInterface.php | 11 src/Symfony/Component/Lock/Store/DoctrineDbalPostgreSqlStore.php | 23 src/Symfony/Component/Lock/Store/DoctrineDbalStore.php | 43 src/Symfony/Component/Lock/Store/FlockStore.php | 6 src/Symfony/Component/Lock/Store/InMemoryStore.php | 6 src/Symfony/Component/Lock/Store/MongoDbStore.php | 6 src/Symfony/Component/Lock/Store/PostgreSqlStore.php | 23 src/Symfony/Component/Lock/Store/RedisStore.php | 3 src/Symfony/Component/Lock/Tests/LockTest.php | 50 src/Symfony/Component/Lock/Tests/Store/AbstractRedisStoreTestCase.php | 47 src/Symfony/Component/Lock/Tests/Store/DoctrineDbalPostgreSqlStoreTest.php | 84 src/Symfony/Component/Lock/Tests/Store/DoctrineDbalStoreTest.php | 26 src/Symfony/Component/Lock/Tests/Store/ExpiringStoreTestTrait.php | 4 src/Symfony/Component/Lock/Tests/Store/FlockStoreTest.php | 30 src/Symfony/Component/Lock/Tests/Store/MongoDbStoreDsnTest.php | 67 src/Symfony/Component/Lock/Tests/Store/PostgreSqlStoreTest.php | 86 src/Symfony/Component/Lock/Tests/Store/SemaphoreStoreTest.php | 29 src/Symfony/Component/Lock/Tests/Store/SharedLockStoreTestTrait.php | 33 src/Symfony/Component/Lock/composer.json | 4 src/Symfony/Component/Mailer/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/Mailer/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/Mailer/Bridge/Amazon/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/Mailer/Bridge/Amazon/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/Mailer/Bridge/Amazon/Tests/Transport/SesApiAsyncAwsTransportTest.php | 52 src/Symfony/Component/Mailer/Bridge/Amazon/Tests/Transport/SesHttpAsyncAwsTransportTest.php | 19 src/Symfony/Component/Mailer/Bridge/Amazon/Transport/SesApiAsyncAwsTransport.php | 10 src/Symfony/Component/Mailer/Bridge/Amazon/Transport/SesHttpAsyncAwsTransport.php | 37 src/Symfony/Component/Mailer/Bridge/Brevo/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/Mailer/Bridge/Brevo/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/Mailer/Bridge/Brevo/RemoteEvent/BrevoPayloadConverter.php | 10 src/Symfony/Component/Mailer/Bridge/Brevo/Tests/Webhook/BrevoRequestParserTest.php | 15 src/Symfony/Component/Mailer/Bridge/Brevo/Tests/Webhook/Fixtures/marketing_click.json | 14 src/Symfony/Component/Mailer/Bridge/Brevo/Tests/Webhook/Fixtures/marketing_click.php | 9 src/Symfony/Component/Mailer/Bridge/Brevo/Tests/Webhook/Fixtures/marketing_delivered.json | 14 src/Symfony/Component/Mailer/Bridge/Brevo/Tests/Webhook/Fixtures/marketing_delivered.php | 9 src/Symfony/Component/Mailer/Bridge/Brevo/Tests/Webhook/Fixtures/marketing_spam.json | 14 src/Symfony/Component/Mailer/Bridge/Brevo/Tests/Webhook/Fixtures/marketing_spam.php | 9 src/Symfony/Component/Mailer/Bridge/Brevo/Tests/Webhook/Fixtures/marketing_unsubscribe.json | 16 src/Symfony/Component/Mailer/Bridge/Brevo/Tests/Webhook/Fixtures/marketing_unsubscribe.php | 9 src/Symfony/Component/Mailer/Bridge/Brevo/Tests/Webhook/Fixtures/spam.json | 11 src/Symfony/Component/Mailer/Bridge/Brevo/Tests/Webhook/Fixtures/spam.php | 10 src/Symfony/Component/Mailer/Bridge/Brevo/Webhook/BrevoRequestParser.php | 2 src/Symfony/Component/Mailer/Bridge/Google/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/Mailer/Bridge/Google/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/Mailer/Bridge/Infobip/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/Mailer/Bridge/Infobip/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/Mailer/Bridge/MailPace/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/Mailer/Bridge/MailPace/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/Mailer/Bridge/Mailchimp/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/Mailer/Bridge/Mailchimp/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/Mailer/Bridge/Mailchimp/Tests/Transport/MandrillApiTransportTest.php | 49 src/Symfony/Component/Mailer/Bridge/Mailchimp/Transport/MandrillApiTransport.php | 3 src/Symfony/Component/Mailer/Bridge/Mailchimp/composer.json | 3 src/Symfony/Component/Mailer/Bridge/MailerSend/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/Mailer/Bridge/MailerSend/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/Mailer/Bridge/Mailgun/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/Mailer/Bridge/Mailgun/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/Mailer/Bridge/Mailgun/Tests/Transport/MailgunApiTransportTest.php | 40 src/Symfony/Component/Mailer/Bridge/Mailgun/Tests/Webhook/MailgunRequestParserTest.php | 85 src/Symfony/Component/Mailer/Bridge/Mailgun/Transport/MailgunApiTransport.php | 7 src/Symfony/Component/Mailer/Bridge/Mailgun/Webhook/MailgunRequestParser.php | 12 src/Symfony/Component/Mailer/Bridge/Mailjet/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/Mailer/Bridge/Mailjet/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/Mailer/Bridge/Mailjet/Transport/MailjetApiTransport.php | 2 src/Symfony/Component/Mailer/Bridge/OhMySmtp/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/Mailer/Bridge/OhMySmtp/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/Mailer/Bridge/Postmark/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/Mailer/Bridge/Postmark/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/Mailer/Bridge/Postmark/Tests/Webhook/PostmarkRequestParserTest.php | 35 src/Symfony/Component/Mailer/Bridge/Postmark/Webhook/PostmarkRequestParser.php | 4 src/Symfony/Component/Mailer/Bridge/Scaleway/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/Mailer/Bridge/Scaleway/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/Mailer/Bridge/Sendgrid/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/Mailer/Bridge/Sendgrid/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/Mailer/Bridge/Sendgrid/RemoteEvent/SendgridPayloadConverter.php | 3 src/Symfony/Component/Mailer/Bridge/Sendgrid/Tests/RemoteEvent/SendgridPayloadConverterTest.php | 2 src/Symfony/Component/Mailer/Bridge/Sendgrid/Tests/Webhook/SendgridSignedRequestParserTest.php | 44 src/Symfony/Component/Mailer/Bridge/Sendgrid/Tests/Webhook/SendgridStaleTimestampRequestParserTest.php | 58 src/Symfony/Component/Mailer/Bridge/Sendgrid/Tests/Webhook/SendgridWrongSecretRequestParserTest.php | 5 src/Symfony/Component/Mailer/Bridge/Sendgrid/Tests/Webhook/SendgridWrongSignatureRequestParserTest.php | 5 src/Symfony/Component/Mailer/Bridge/Sendgrid/Webhook/SendgridRequestParser.php | 28 src/Symfony/Component/Mailer/Bridge/Sendinblue/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/Mailer/Bridge/Sendinblue/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/Mailer/Event/MessageEvents.php | 16 src/Symfony/Component/Mailer/Test/TransportFactoryTestCase.php | 2 src/Symfony/Component/Mailer/Tests/Event/MessageEventsTest.php | 101 src/Symfony/Component/Mailer/Tests/Transport/AbstractApiTransportTest.php | 47 src/Symfony/Component/Mailer/Tests/Transport/FailoverTransportTest.php | 8 src/Symfony/Component/Mailer/Tests/Transport/SendmailTransportTest.php | 4 src/Symfony/Component/Mailer/Tests/Transport/Smtp/SmtpTransportTest.php | 181 src/Symfony/Component/Mailer/Tests/Transport/Smtp/Stream/AbstractStreamTest.php | 36 src/Symfony/Component/Mailer/Tests/Transport/Smtp/TimeoutBufferStream.php | 109 src/Symfony/Component/Mailer/Tests/Transport/phpt/sendmail_without_proc_open.phpt | 31 src/Symfony/Component/Mailer/Transport/AbstractApiTransport.php | 12 src/Symfony/Component/Mailer/Transport/Smtp/SmtpTransport.php | 42 src/Symfony/Component/Mailer/Transport/Smtp/Stream/AbstractStream.php | 19 src/Symfony/Component/Mailer/Transport/Smtp/Stream/ProcessStream.php | 4 src/Symfony/Component/Messenger/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/Messenger/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/Messenger/Bridge/AmazonSqs/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/Messenger/Bridge/AmazonSqs/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/Messenger/Bridge/AmazonSqs/Tests/Transport/AmazonSqsReceiverTest.php | 70 src/Symfony/Component/Messenger/Bridge/AmazonSqs/Tests/Transport/AmazonSqsSenderTest.php | 21 src/Symfony/Component/Messenger/Bridge/AmazonSqs/Tests/Transport/AmazonSqsTransportFactoryTest.php | 5 src/Symfony/Component/Messenger/Bridge/AmazonSqs/Tests/Transport/AmazonSqsTransportTest.php | 29 src/Symfony/Component/Messenger/Bridge/AmazonSqs/Tests/Transport/ConnectionTest.php | 144 src/Symfony/Component/Messenger/Bridge/AmazonSqs/Transport/AmazonSqsReceiver.php | 10 src/Symfony/Component/Messenger/Bridge/AmazonSqs/Transport/AmazonSqsSender.php | 4 src/Symfony/Component/Messenger/Bridge/AmazonSqs/Transport/AmazonSqsTransport.php | 6 src/Symfony/Component/Messenger/Bridge/AmazonSqs/Transport/AmazonSqsTransportFactory.php | 2 src/Symfony/Component/Messenger/Bridge/AmazonSqs/Transport/Connection.php | 47 src/Symfony/Component/Messenger/Bridge/Amqp/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/Messenger/Bridge/Amqp/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/Messenger/Bridge/Amqp/Tests/Transport/AmqpExtIntegrationTest.php | 243 src/Symfony/Component/Messenger/Bridge/Amqp/Tests/Transport/AmqpReceiverTest.php | 18 src/Symfony/Component/Messenger/Bridge/Amqp/Tests/Transport/AmqpSenderTest.php | 170 src/Symfony/Component/Messenger/Bridge/Amqp/Tests/Transport/AmqpStampTest.php | 47 src/Symfony/Component/Messenger/Bridge/Amqp/Tests/Transport/ConnectionTest.php | 149 src/Symfony/Component/Messenger/Bridge/Amqp/Transport/AmqpReceiver.php | 2 src/Symfony/Component/Messenger/Bridge/Amqp/Transport/AmqpSender.php | 14 src/Symfony/Component/Messenger/Bridge/Amqp/Transport/AmqpStamp.php | 14 src/Symfony/Component/Messenger/Bridge/Amqp/Transport/Connection.php | 37 src/Symfony/Component/Messenger/Bridge/Beanstalkd/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/Messenger/Bridge/Beanstalkd/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/Messenger/Bridge/Beanstalkd/Transport/Connection.php | 4 src/Symfony/Component/Messenger/Bridge/Doctrine/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/Messenger/Bridge/Doctrine/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/Messenger/Bridge/Doctrine/Tests/Fixtures/pgbouncer/pgbouncer.ini | 2 src/Symfony/Component/Messenger/Bridge/Doctrine/Tests/Fixtures/pgbouncer/userlist.txt | 2 src/Symfony/Component/Messenger/Bridge/Doctrine/Tests/Transport/ConnectionTest.php | 186 src/Symfony/Component/Messenger/Bridge/Doctrine/Tests/Transport/DoctrinePostgreSqlFilterIntegrationTest.php | 12 src/Symfony/Component/Messenger/Bridge/Doctrine/Tests/Transport/DoctrineReceiverTest.php | 52 src/Symfony/Component/Messenger/Bridge/Doctrine/Tests/Transport/DoctrineTransportTest.php | 5 src/Symfony/Component/Messenger/Bridge/Doctrine/Tests/Transport/PostgreSqlConnectionTest.php | 73 src/Symfony/Component/Messenger/Bridge/Doctrine/Transport/Connection.php | 137 src/Symfony/Component/Messenger/Bridge/Doctrine/Transport/DoctrineReceiver.php | 9 src/Symfony/Component/Messenger/Bridge/Doctrine/Transport/DoctrineTransport.php | 6 src/Symfony/Component/Messenger/Bridge/Doctrine/Transport/PostgreSqlConnection.php | 14 src/Symfony/Component/Messenger/Bridge/Doctrine/composer.json | 2 src/Symfony/Component/Messenger/Bridge/Redis/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/Messenger/Bridge/Redis/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/Messenger/Bridge/Redis/Tests/Transport/ConnectionTest.php | 142 src/Symfony/Component/Messenger/Bridge/Redis/Tests/Transport/RedisExtIntegrationTest.php | 153 src/Symfony/Component/Messenger/Bridge/Redis/Tests/Transport/RedisReceiverTest.php | 24 src/Symfony/Component/Messenger/Bridge/Redis/Transport/Connection.php | 111 src/Symfony/Component/Messenger/Bridge/Redis/Transport/RedisReceiver.php | 2 src/Symfony/Component/Messenger/Command/ConsumeMessagesCommand.php | 27 src/Symfony/Component/Messenger/Command/DebugCommand.php | 13 src/Symfony/Component/Messenger/Command/FailedMessagesRetryCommand.php | 2 src/Symfony/Component/Messenger/Command/FailedMessagesShowCommand.php | 2 src/Symfony/Component/Messenger/DependencyInjection/MessengerPass.php | 27 src/Symfony/Component/Messenger/Envelope.php | 26 src/Symfony/Component/Messenger/Handler/BatchHandlerTrait.php | 4 src/Symfony/Component/Messenger/Middleware/DispatchAfterCurrentBusMiddleware.php | 22 src/Symfony/Component/Messenger/Middleware/HandleMessageMiddleware.php | 2 src/Symfony/Component/Messenger/Stamp/ErrorDetailsStamp.php | 8 src/Symfony/Component/Messenger/Tests/Command/ConsumeMessagesCommandTest.php | 58 src/Symfony/Component/Messenger/Tests/Command/DebugCommandTest.php | 71 src/Symfony/Component/Messenger/Tests/DependencyInjection/MessengerPassTest.php | 106 src/Symfony/Component/Messenger/Tests/EnvelopeTest.php | 52 src/Symfony/Component/Messenger/Tests/FailureIntegrationTest.php | 264 src/Symfony/Component/Messenger/Tests/Fixtures/DummyCommandWithTagOnlyDocComment.php | 17 src/Symfony/Component/Messenger/Tests/Fixtures/DummyCommandWithTagOnlyDocCommentHandler.php | 20 src/Symfony/Component/Messenger/Tests/Handler/BatchHandlerTest.php | 63 src/Symfony/Component/Messenger/Tests/Handler/HandlerDescriptorTest.php | 7 src/Symfony/Component/Messenger/Tests/Handler/HandlersLocatorTest.php | 12 src/Symfony/Component/Messenger/Tests/Middleware/DispatchAfterCurrentBusMiddlewareTest.php | 118 src/Symfony/Component/Messenger/Tests/Stamp/ErrorDetailsStampTest.php | 47 src/Symfony/Component/Messenger/Tests/TraceableMessageBusTest.php | 40 src/Symfony/Component/Messenger/Tests/Transport/InMemory/InMemoryTransportTest.php | 46 src/Symfony/Component/Messenger/Tests/Transport/Serialization/Normalizer/FlattenExceptionNormalizerTest.php | 19 src/Symfony/Component/Messenger/Tests/Transport/Serialization/PhpSerializerTest.php | 87 src/Symfony/Component/Messenger/Tests/Transport/Serialization/SerializerTest.php | 248 src/Symfony/Component/Messenger/Tests/WorkerTest.php | 88 src/Symfony/Component/Messenger/TraceableMessageBus.php | 8 src/Symfony/Component/Messenger/Transport/InMemory/InMemoryTransport.php | 2 src/Symfony/Component/Messenger/Transport/Serialization/Normalizer/FlattenExceptionNormalizer.php | 23 src/Symfony/Component/Messenger/Transport/Serialization/PhpSerializer.php | 11 src/Symfony/Component/Messenger/Transport/Serialization/Serializer.php | 90 src/Symfony/Component/Messenger/Transport/Serialization/SerializerInterface.php | 2 src/Symfony/Component/Messenger/Worker.php | 15 src/Symfony/Component/Mime/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/Mime/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/Mime/Address.php | 23 src/Symfony/Component/Mime/Email.php | 10 src/Symfony/Component/Mime/Header/AbstractHeader.php | 30 src/Symfony/Component/Mime/Header/Headers.php | 2 src/Symfony/Component/Mime/Header/ParameterizedHeader.php | 11 src/Symfony/Component/Mime/RawMessage.php | 2 src/Symfony/Component/Mime/Tests/AddressTest.php | 79 src/Symfony/Component/Mime/Tests/EmailTest.php | 64 src/Symfony/Component/Mime/Tests/Header/HeadersTest.php | 23 src/Symfony/Component/Mime/Tests/Header/MailboxHeaderTest.php | 15 src/Symfony/Component/Mime/Tests/Header/MailboxListHeaderTest.php | 6 src/Symfony/Component/Mime/Tests/Header/ParameterizedHeaderTest.php | 66 src/Symfony/Component/Mime/Tests/Header/UnstructuredHeaderTest.php | 45 src/Symfony/Component/Mime/Tests/MessageTest.php | 3 src/Symfony/Component/Mime/Tests/Part/MessagePartTest.php | 2 src/Symfony/Component/Mime/Tests/RawMessageTest.php | 9 src/Symfony/Component/Mime/composer.json | 2 src/Symfony/Component/Notifier/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/Notifier/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/Notifier/Bridge/AllMySms/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/Notifier/Bridge/AllMySms/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/Notifier/Bridge/AllMySms/AllMySmsTransport.php | 2 src/Symfony/Component/Notifier/Bridge/AmazonSns/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/Notifier/Bridge/AmazonSns/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/Notifier/Bridge/Bandwidth/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/Notifier/Bridge/Bandwidth/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/Notifier/Bridge/Brevo/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/Notifier/Bridge/Brevo/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/Notifier/Bridge/Brevo/README.md | 2 src/Symfony/Component/Notifier/Bridge/Chatwork/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/Notifier/Bridge/Chatwork/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/Notifier/Bridge/ClickSend/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/Notifier/Bridge/ClickSend/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/Notifier/Bridge/Clickatell/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/Notifier/Bridge/Clickatell/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/Notifier/Bridge/ContactEveryone/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/Notifier/Bridge/ContactEveryone/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/Notifier/Bridge/Discord/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/Notifier/Bridge/Discord/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/Notifier/Bridge/Engagespot/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/Notifier/Bridge/Engagespot/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/Notifier/Bridge/Esendex/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/Notifier/Bridge/Esendex/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/Notifier/Bridge/Expo/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/Notifier/Bridge/Expo/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/Notifier/Bridge/FakeChat/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/Notifier/Bridge/FakeChat/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/Notifier/Bridge/FakeChat/FakeChatEmailTransport.php | 2 src/Symfony/Component/Notifier/Bridge/FakeChat/FakeChatLoggerTransport.php | 2 src/Symfony/Component/Notifier/Bridge/FakeChat/Tests/FakeChatTransportFactoryTest.php | 15 src/Symfony/Component/Notifier/Bridge/FakeSms/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/Notifier/Bridge/FakeSms/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/Notifier/Bridge/Firebase/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/Notifier/Bridge/Firebase/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/Notifier/Bridge/FortySixElks/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/Notifier/Bridge/FortySixElks/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/Notifier/Bridge/FreeMobile/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/Notifier/Bridge/FreeMobile/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/Notifier/Bridge/GatewayApi/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/Notifier/Bridge/GatewayApi/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/Notifier/Bridge/Gitter/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/Notifier/Bridge/Gitter/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/Notifier/Bridge/GoIp/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/Notifier/Bridge/GoIp/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/Notifier/Bridge/GoogleChat/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/Notifier/Bridge/GoogleChat/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/Notifier/Bridge/GoogleChat/Tests/GoogleChatTransportTest.php | 12 src/Symfony/Component/Notifier/Bridge/Infobip/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/Notifier/Bridge/Infobip/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/Notifier/Bridge/Iqsms/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/Notifier/Bridge/Iqsms/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/Notifier/Bridge/Isendpro/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/Notifier/Bridge/Isendpro/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/Notifier/Bridge/KazInfoTeh/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/Notifier/Bridge/KazInfoTeh/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/Notifier/Bridge/LightSms/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/Notifier/Bridge/LightSms/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/Notifier/Bridge/LineNotify/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/Notifier/Bridge/LineNotify/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/Notifier/Bridge/LinkedIn/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/Notifier/Bridge/LinkedIn/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/Notifier/Bridge/Mailjet/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/Notifier/Bridge/Mailjet/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/Notifier/Bridge/Mastodon/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/Notifier/Bridge/Mastodon/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/Notifier/Bridge/Mattermost/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/Notifier/Bridge/Mattermost/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/Notifier/Bridge/Mercure/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/Notifier/Bridge/Mercure/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/Notifier/Bridge/MessageBird/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/Notifier/Bridge/MessageBird/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/Notifier/Bridge/MessageMedia/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/Notifier/Bridge/MessageMedia/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/Notifier/Bridge/MicrosoftTeams/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/Notifier/Bridge/MicrosoftTeams/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/Notifier/Bridge/MicrosoftTeams/MicrosoftTeamsTransport.php | 14 src/Symfony/Component/Notifier/Bridge/MicrosoftTeams/MicrosoftTeamsTransportFactory.php | 3 src/Symfony/Component/Notifier/Bridge/MicrosoftTeams/Tests/MicrosoftTeamsTransportFactoryTest.php | 5 src/Symfony/Component/Notifier/Bridge/MicrosoftTeams/Tests/MicrosoftTeamsTransportTest.php | 23 src/Symfony/Component/Notifier/Bridge/Mobyt/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/Notifier/Bridge/Mobyt/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/Notifier/Bridge/Novu/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/Notifier/Bridge/Novu/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/Notifier/Bridge/Ntfy/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/Notifier/Bridge/Ntfy/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/Notifier/Bridge/Octopush/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/Notifier/Bridge/Octopush/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/Notifier/Bridge/OneSignal/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/Notifier/Bridge/OneSignal/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/Notifier/Bridge/OrangeSms/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/Notifier/Bridge/OrangeSms/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/Notifier/Bridge/OvhCloud/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/Notifier/Bridge/OvhCloud/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/Notifier/Bridge/PagerDuty/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/Notifier/Bridge/PagerDuty/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/Notifier/Bridge/PagerDuty/PagerDutyOptions.php | 8 src/Symfony/Component/Notifier/Bridge/PagerDuty/Tests/PagerDutyOptionsTest.php | 60 src/Symfony/Component/Notifier/Bridge/Plivo/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/Notifier/Bridge/Plivo/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/Notifier/Bridge/Pushover/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/Notifier/Bridge/Pushover/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/Notifier/Bridge/Redlink/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/Notifier/Bridge/Redlink/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/Notifier/Bridge/RingCentral/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/Notifier/Bridge/RingCentral/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/Notifier/Bridge/RocketChat/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/Notifier/Bridge/RocketChat/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/Notifier/Bridge/Sendberry/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/Notifier/Bridge/Sendberry/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/Notifier/Bridge/Sendinblue/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/Notifier/Bridge/Sendinblue/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/Notifier/Bridge/SimpleTextin/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/Notifier/Bridge/SimpleTextin/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/Notifier/Bridge/Sinch/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/Notifier/Bridge/Sinch/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/Notifier/Bridge/Slack/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/Notifier/Bridge/Slack/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/Notifier/Bridge/Sms77/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/Notifier/Bridge/Sms77/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/Notifier/Bridge/SmsBiuras/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/Notifier/Bridge/SmsBiuras/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/Notifier/Bridge/SmsFactor/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/Notifier/Bridge/SmsFactor/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/Notifier/Bridge/Smsapi/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/Notifier/Bridge/Smsapi/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/Notifier/Bridge/Smsc/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/Notifier/Bridge/Smsc/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/Notifier/Bridge/Smsmode/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/Notifier/Bridge/Smsmode/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/Notifier/Bridge/SpotHit/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/Notifier/Bridge/SpotHit/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/Notifier/Bridge/Telegram/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/Notifier/Bridge/Telegram/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/Notifier/Bridge/Telegram/README.md | 22 src/Symfony/Component/Notifier/Bridge/Telegram/TelegramTransport.php | 15 src/Symfony/Component/Notifier/Bridge/Telegram/Tests/TelegramTransportTest.php | 28 src/Symfony/Component/Notifier/Bridge/Telnyx/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/Notifier/Bridge/Telnyx/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/Notifier/Bridge/Termii/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/Notifier/Bridge/Termii/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/Notifier/Bridge/TurboSms/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/Notifier/Bridge/TurboSms/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/Notifier/Bridge/Twilio/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/Notifier/Bridge/Twilio/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/Notifier/Bridge/Twilio/Tests/Webhook/TwilioRequestParserTest.php | 43 src/Symfony/Component/Notifier/Bridge/Twilio/Webhook/TwilioRequestParser.php | 15 src/Symfony/Component/Notifier/Bridge/Twitter/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/Notifier/Bridge/Twitter/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/Notifier/Bridge/Vonage/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/Notifier/Bridge/Vonage/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/Notifier/Bridge/Vonage/Tests/Webhook/VonageRequestParserTest.php | 88 src/Symfony/Component/Notifier/Bridge/Vonage/Webhook/VonageRequestParser.php | 21 src/Symfony/Component/Notifier/Bridge/Yunpian/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/Notifier/Bridge/Yunpian/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/Notifier/Bridge/Zendesk/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/Notifier/Bridge/Zendesk/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/Notifier/Bridge/Zulip/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/Notifier/Bridge/Zulip/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/Notifier/EventListener/SendFailedMessageToNotifierListener.php | 10 src/Symfony/Component/Notifier/Exception/UnsupportedSchemeException.php | 6 src/Symfony/Component/Notifier/Tests/EventListener/SendFailedMessageToNotifierListenerTest.php | 92 src/Symfony/Component/Notifier/Tests/Exception/UnsupportedSchemeExceptionTest.php | 46 src/Symfony/Component/Notifier/Tests/TransportTest.php | 79 src/Symfony/Component/Notifier/Transport.php | 3 src/Symfony/Component/OptionsResolver/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/OptionsResolver/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/OptionsResolver/OptionsResolver.php | 16 src/Symfony/Component/OptionsResolver/Tests/OptionsResolverTest.php | 16 src/Symfony/Component/PasswordHasher/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/PasswordHasher/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/Process/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/Process/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/Process/PhpProcess.php | 7 src/Symfony/Component/Process/PhpSubprocess.php | 7 src/Symfony/Component/Process/Pipes/AbstractPipes.php | 16 src/Symfony/Component/Process/Process.php | 83 src/Symfony/Component/Process/Tests/Fixtures/phpdbg_fork.php | 25 src/Symfony/Component/Process/Tests/PhpProcessTest.php | 18 src/Symfony/Component/Process/Tests/PhpSubprocessTest.php | 32 src/Symfony/Component/Process/Tests/ProcessTest.php | 166 src/Symfony/Component/PropertyAccess/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/PropertyAccess/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/PropertyAccess/PropertyAccessor.php | 55 src/Symfony/Component/PropertyAccess/Tests/Fixtures/CustomPropertyPath.php | 73 src/Symfony/Component/PropertyAccess/Tests/PropertyAccessorTest.php | 264 src/Symfony/Component/PropertyInfo/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/PropertyInfo/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/PropertyInfo/Extractor/PhpDocExtractor.php | 66 src/Symfony/Component/PropertyInfo/Extractor/PhpStanExtractor.php | 69 src/Symfony/Component/PropertyInfo/Extractor/ReflectionExtractor.php | 87 src/Symfony/Component/PropertyInfo/PhpStan/NameScope.php | 16 src/Symfony/Component/PropertyInfo/PhpStan/NameScopeFactory.php | 7 src/Symfony/Component/PropertyInfo/Tests/Extractor/ClassKeywordsResolutionTest.php | 69 src/Symfony/Component/PropertyInfo/Tests/Extractor/PhpDocExtractorTest.php | 66 src/Symfony/Component/PropertyInfo/Tests/Extractor/PhpStanExtractorTest.php | 27 src/Symfony/Component/PropertyInfo/Tests/Extractor/ReflectionExtractorTest.php | 162 src/Symfony/Component/PropertyInfo/Tests/Fixtures/ChildDummyWithSelfReturningAccessor.php | 25 src/Symfony/Component/PropertyInfo/Tests/Fixtures/Dummy.php | 8 src/Symfony/Component/PropertyInfo/Tests/Fixtures/DummyUnionType.php | 10 src/Symfony/Component/PropertyInfo/Tests/Fixtures/DummyWithGetterSetter.php | 27 src/Symfony/Component/PropertyInfo/Tests/Fixtures/DummyWithNonAsciiStaticAccessor.php | 25 src/Symfony/Component/PropertyInfo/Tests/Fixtures/DummyWithSelfReturningAccessor.php | 85 src/Symfony/Component/PropertyInfo/Tests/Fixtures/DummyWithStaticConstructorAndAccessor.php | 41 src/Symfony/Component/PropertyInfo/Tests/Fixtures/DummyWithStaticMutator.php | 42 src/Symfony/Component/PropertyInfo/Tests/Fixtures/Extractor/KeywordsChild.php | 16 src/Symfony/Component/PropertyInfo/Tests/Fixtures/Extractor/KeywordsGrandParent.php | 16 src/Symfony/Component/PropertyInfo/Tests/Fixtures/Extractor/KeywordsParent.php | 46 src/Symfony/Component/PropertyInfo/Tests/Fixtures/Extractor/KeywordsTrait.php | 34 src/Symfony/Component/PropertyInfo/Tests/Fixtures/Extractor/OtherNamespace/KeywordsChild.php | 18 src/Symfony/Component/PropertyInfo/Tests/Fixtures/Extractor/ParentWithSelfDocBlock.php | 14 src/Symfony/Component/PropertyInfo/Tests/Fixtures/MultiParameterAdderDocDummy.php | 25 src/Symfony/Component/PropertyInfo/Tests/Fixtures/MultiParameterAdderDummy.php | 28 src/Symfony/Component/PropertyInfo/Tests/Fixtures/MutatorPrefixesDummy.php | 32 src/Symfony/Component/PropertyInfo/Tests/Fixtures/NotAnAccessorDummy.php | 33 src/Symfony/Component/PropertyInfo/Tests/Fixtures/RejectedCandidateDocDummy.php | 32 src/Symfony/Component/PropertyInfo/Util/PhpDocTypeHelper.php | 3 src/Symfony/Component/PropertyInfo/Util/PhpStanTypeHelper.php | 10 src/Symfony/Component/RateLimiter/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/RateLimiter/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/RateLimiter/Policy/FixedWindowLimiter.php | 20 src/Symfony/Component/RateLimiter/Policy/Rate.php | 15 src/Symfony/Component/RateLimiter/Policy/SlidingWindow.php | 20 src/Symfony/Component/RateLimiter/Policy/SlidingWindowLimiter.php | 15 src/Symfony/Component/RateLimiter/Policy/TokenBucket.php | 17 src/Symfony/Component/RateLimiter/Policy/TokenBucketLimiter.php | 13 src/Symfony/Component/RateLimiter/Policy/Window.php | 14 src/Symfony/Component/RateLimiter/Storage/InMemoryStorage.php | 2 src/Symfony/Component/RateLimiter/Tests/Policy/FixedWindowLimiterTest.php | 107 src/Symfony/Component/RateLimiter/Tests/Policy/RateTest.php | 31 src/Symfony/Component/RateLimiter/Tests/Policy/SlidingWindowLimiterTest.php | 85 src/Symfony/Component/RateLimiter/Tests/Policy/SlidingWindowTest.php | 40 src/Symfony/Component/RateLimiter/Tests/Policy/TokenBucketLimiterTest.php | 94 src/Symfony/Component/RateLimiter/Tests/Policy/TokenBucketTest.php | 18 src/Symfony/Component/RemoteEvent/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/RemoteEvent/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/Routing/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/Routing/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/Routing/Generator/Dumper/CompiledUrlGeneratorDumper.php | 4 src/Symfony/Component/Routing/Generator/UrlGenerator.php | 10 src/Symfony/Component/Routing/Loader/AttributeFileLoader.php | 2 src/Symfony/Component/Routing/Matcher/Dumper/CompiledUrlMatcherDumper.php | 6 src/Symfony/Component/Routing/Matcher/Dumper/CompiledUrlMatcherTrait.php | 22 src/Symfony/Component/Routing/Matcher/RedirectableUrlMatcher.php | 9 src/Symfony/Component/Routing/Matcher/TraceableUrlMatcher.php | 5 src/Symfony/Component/Routing/Matcher/UrlMatcher.php | 17 src/Symfony/Component/Routing/RouteCompiler.php | 2 src/Symfony/Component/Routing/Tests/Generator/Dumper/CompiledUrlGeneratorDumperTest.php | 14 src/Symfony/Component/Routing/Tests/Generator/UrlGeneratorTest.php | 23 src/Symfony/Component/Routing/Tests/Matcher/RedirectableUrlMatcherTest.php | 31 src/Symfony/Component/Routing/Tests/Matcher/UrlMatcherTest.php | 48 src/Symfony/Component/Runtime/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/Runtime/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/Scheduler/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/Scheduler/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/Scheduler/EventListener/DispatchSchedulerEventListener.php | 7 src/Symfony/Component/Scheduler/Exception/RuntimeException.php | 16 src/Symfony/Component/Scheduler/Generator/Checkpoint.php | 38 src/Symfony/Component/Scheduler/Generator/MessageGenerator.php | 5 src/Symfony/Component/Scheduler/RecurringMessage.php | 19 src/Symfony/Component/Scheduler/Tests/EventListener/DispatchSchedulerEventListenerTest.php | 54 src/Symfony/Component/Scheduler/Tests/Generator/CheckpointTest.php | 91 src/Symfony/Component/Scheduler/Tests/Generator/MessageGeneratorTest.php | 149 src/Symfony/Component/Scheduler/Tests/RecurringMessageTest.php | 28 src/Symfony/Component/Scheduler/Tests/Trigger/CallbackTriggerTest.php | 2 src/Symfony/Component/Scheduler/Tests/Trigger/JitterTriggerTest.php | 18 src/Symfony/Component/Scheduler/Tests/Trigger/PeriodicalTriggerTest.php | 25 src/Symfony/Component/Scheduler/Trigger/CallbackTrigger.php | 2 src/Symfony/Component/Scheduler/Trigger/JitterTrigger.php | 19 src/Symfony/Component/Scheduler/Trigger/PeriodicalTrigger.php | 16 src/Symfony/Component/Security/Core/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/Security/Core/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/Security/Core/Authentication/Token/PreAuthenticatedToken.php | 4 src/Symfony/Component/Security/Core/Authentication/Token/RememberMeToken.php | 6 src/Symfony/Component/Security/Core/Authentication/Token/Storage/UsageTrackingTokenStorage.php | 5 src/Symfony/Component/Security/Core/Authentication/Token/SwitchUserToken.php | 4 src/Symfony/Component/Security/Core/Authentication/Token/UsernamePasswordToken.php | 4 src/Symfony/Component/Security/Core/Authorization/TokenAuthorizationChecker.php | 48 src/Symfony/Component/Security/Core/Authorization/Voter/ExpressionVoter.php | 11 src/Symfony/Component/Security/Core/Exception/AuthenticationException.php | 6 src/Symfony/Component/Security/Core/Exception/CustomUserMessageAccountStatusException.php | 4 src/Symfony/Component/Security/Core/Exception/CustomUserMessageAuthenticationException.php | 4 src/Symfony/Component/Security/Core/Exception/UserNotFoundException.php | 4 src/Symfony/Component/Security/Core/Resources/translations/security.ar.xlf | 8 src/Symfony/Component/Security/Core/Resources/translations/security.bs.xlf | 2 src/Symfony/Component/Security/Core/Resources/translations/security.ckb.xlf | 83 src/Symfony/Component/Security/Core/Resources/translations/security.hr.xlf | 26 src/Symfony/Component/Security/Core/Resources/translations/security.hy.xlf | 2 src/Symfony/Component/Security/Core/Resources/translations/security.mk.xlf | 2 src/Symfony/Component/Security/Core/Resources/translations/security.th.xlf | 2 src/Symfony/Component/Security/Core/Resources/translations/security.ur.xlf | 38 src/Symfony/Component/Security/Core/Signature/ExpiredSignatureStorage.php | 16 src/Symfony/Component/Security/Core/Signature/SignatureHasher.php | 8 src/Symfony/Component/Security/Core/Tests/Authentication/Token/Storage/UsageTrackingTokenStorageTest.php | 33 src/Symfony/Component/Security/Core/Tests/Authorization/Voter/ExpressionVoterTest.php | 60 src/Symfony/Component/Security/Core/Tests/Signature/ExpiredSignatureStorageTest.php | 28 src/Symfony/Component/Security/Core/Tests/Signature/SignatureHasherTest.php | 105 src/Symfony/Component/Security/Core/Tests/UnserializeTrampolineTest.php | 81 src/Symfony/Component/Security/Core/User/UserCheckerInterface.php | 10 src/Symfony/Component/Security/Core/composer.json | 1 src/Symfony/Component/Security/Csrf/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/Security/Csrf/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/Security/Http/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/Security/Http/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/Security/Http/AccessToken/Oidc/OidcTokenHandler.php | 20 src/Symfony/Component/Security/Http/AccessToken/Oidc/OidcTrait.php | 12 src/Symfony/Component/Security/Http/AccessToken/Oidc/OidcUserInfoTokenHandler.php | 1 src/Symfony/Component/Security/Http/Authentication/DefaultAuthenticationSuccessHandler.php | 2 src/Symfony/Component/Security/Http/Authenticator/RememberMeAuthenticator.php | 5 src/Symfony/Component/Security/Http/Authenticator/Token/PostAuthenticationToken.php | 4 src/Symfony/Component/Security/Http/EventListener/CsrfProtectionListener.php | 2 src/Symfony/Component/Security/Http/EventListener/LoginThrottlingListener.php | 11 src/Symfony/Component/Security/Http/Firewall.php | 2 src/Symfony/Component/Security/Http/Firewall/ContextListener.php | 12 src/Symfony/Component/Security/Http/HttpUtils.php | 49 src/Symfony/Component/Security/Http/LoginLink/LoginLinkHandler.php | 8 src/Symfony/Component/Security/Http/Logout/LogoutUrlGenerator.php | 9 src/Symfony/Component/Security/Http/RateLimiter/DefaultLoginRateLimiter.php | 25 src/Symfony/Component/Security/Http/RememberMe/PersistentRememberMeHandler.php | 92 src/Symfony/Component/Security/Http/Tests/AccessToken/Oidc/OidcTokenHandlerTest.php | 31 src/Symfony/Component/Security/Http/Tests/AccessToken/Oidc/OidcUserInfoTokenHandlerTest.php | 40 src/Symfony/Component/Security/Http/Tests/Authentication/DefaultAuthenticationFailureHandlerTest.php | 13 src/Symfony/Component/Security/Http/Tests/Authentication/DefaultAuthenticationSuccessHandlerTest.php | 18 src/Symfony/Component/Security/Http/Tests/EventListener/CheckCredentialsListenerTest.php | 8 src/Symfony/Component/Security/Http/Tests/EventListener/LoginThrottlingListenerTest.php | 76 src/Symfony/Component/Security/Http/Tests/Firewall/ContextListenerTest.php | 113 src/Symfony/Component/Security/Http/Tests/FirewallTest.php | 15 src/Symfony/Component/Security/Http/Tests/Fixtures/PasswordlessUser.php | 42 src/Symfony/Component/Security/Http/Tests/HttpUtilsTest.php | 161 src/Symfony/Component/Security/Http/Tests/LoginLink/LoginLinkHandlerTest.php | 33 src/Symfony/Component/Security/Http/Tests/Logout/LogoutUrlGeneratorTest.php | 14 src/Symfony/Component/Security/Http/Tests/RememberMe/PersistentRememberMeHandlerTest.php | 246 src/Symfony/Component/Semaphore/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/Semaphore/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/Semaphore/Tests/Store/AbstractStoreTestCase.php | 16 src/Symfony/Component/Semaphore/Tests/Store/RedisStoreTest.php | 5 src/Symfony/Component/Semaphore/Tests/Store/RelayStoreTest.php | 9 src/Symfony/Component/Serializer/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/Serializer/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/Serializer/Encoder/CsvEncoder.php | 21 src/Symfony/Component/Serializer/Encoder/XmlEncoder.php | 13 src/Symfony/Component/Serializer/Mapping/Loader/AccessorCollisionResolverTrait.php | 5 src/Symfony/Component/Serializer/Mapping/Loader/AttributeLoader.php | 2 src/Symfony/Component/Serializer/NameConverter/MetadataAwareNameConverter.php | 51 src/Symfony/Component/Serializer/Normalizer/AbstractNormalizer.php | 14 src/Symfony/Component/Serializer/Normalizer/AbstractObjectNormalizer.php | 138 src/Symfony/Component/Serializer/Normalizer/ArrayDenormalizer.php | 31 src/Symfony/Component/Serializer/Normalizer/ConstraintViolationListNormalizer.php | 2 src/Symfony/Component/Serializer/Normalizer/DataUriNormalizer.php | 16 src/Symfony/Component/Serializer/Normalizer/GetSetMethodNormalizer.php | 15 src/Symfony/Component/Serializer/Normalizer/MimeMessageNormalizer.php | 38 src/Symfony/Component/Serializer/Normalizer/ObjectNormalizer.php | 35 src/Symfony/Component/Serializer/Normalizer/PropertyNormalizer.php | 4 src/Symfony/Component/Serializer/Tests/DeserializeNestedArrayOfObjectsTest.php | 58 src/Symfony/Component/Serializer/Tests/Encoder/CsvEncoderTest.php | 66 src/Symfony/Component/Serializer/Tests/Encoder/XmlEncoderTest.php | 41 src/Symfony/Component/Serializer/Tests/Fixtures/Attributes/MaxDepthRecursiveDummy.php | 32 src/Symfony/Component/Serializer/Tests/Fixtures/Attributes/MaxDepthRecursiveDummyProxy.php | 16 src/Symfony/Component/Serializer/Tests/Fixtures/OtherSerializedNameDummy.php | 3 src/Symfony/Component/Serializer/Tests/Fixtures/Php74Full.php | 3 src/Symfony/Component/Serializer/Tests/Fixtures/ScalarTraversableDummy.php | 23 src/Symfony/Component/Serializer/Tests/Fixtures/property-path-mapping.yaml | 15 src/Symfony/Component/Serializer/Tests/Fixtures/serialized-name-mapping.yml | 8 src/Symfony/Component/Serializer/Tests/NameConverter/MetadataAwareNameConverterTest.php | 45 src/Symfony/Component/Serializer/Tests/Normalizer/AbstractObjectNormalizerTest.php | 226 src/Symfony/Component/Serializer/Tests/Normalizer/ArrayDenormalizerTest.php | 73 src/Symfony/Component/Serializer/Tests/Normalizer/DataUriNormalizerTest.php | 43 src/Symfony/Component/Serializer/Tests/Normalizer/Features/IgnoredAttributesTestTrait.php | 11 src/Symfony/Component/Serializer/Tests/Normalizer/Features/MaxDepthTestTrait.php | 27 src/Symfony/Component/Serializer/Tests/Normalizer/Features/ObjectOuter.php | 2 src/Symfony/Component/Serializer/Tests/Normalizer/GetSetMethodNormalizerTest.php | 148 src/Symfony/Component/Serializer/Tests/Normalizer/MimeMessageNormalizerTest.php | 142 src/Symfony/Component/Serializer/Tests/Normalizer/ObjectNormalizerTest.php | 456 + src/Symfony/Component/Serializer/Tests/Normalizer/PropertyNormalizerTest.php | 67 src/Symfony/Component/Serializer/Tests/SerializerTest.php | 45 src/Symfony/Component/Serializer/composer.json | 4 src/Symfony/Component/Stopwatch/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/Stopwatch/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/Stopwatch/StopwatchEvent.php | 2 src/Symfony/Component/String/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/String/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/String/AbstractString.php | 4 src/Symfony/Component/String/AbstractUnicodeString.php | 125 src/Symfony/Component/String/ByteString.php | 18 src/Symfony/Component/String/CodePointString.php | 22 src/Symfony/Component/String/Inflector/EnglishInflector.php | 13 src/Symfony/Component/String/Resources/data/wcswidth_table_wide.php | 88 src/Symfony/Component/String/Resources/data/wcswidth_table_zero.php | 56 src/Symfony/Component/String/Slugger/AsciiSlugger.php | 18 src/Symfony/Component/String/Tests/AbstractAsciiTestCase.php | 103 src/Symfony/Component/String/Tests/AbstractUnicodeTestCase.php | 90 src/Symfony/Component/String/Tests/Inflector/EnglishInflectorTest.php | 6 src/Symfony/Component/String/Tests/Slugger/AsciiSluggerTest.php | 72 src/Symfony/Component/String/Tests/UnicodeStringTest.php | 34 src/Symfony/Component/String/UnicodeString.php | 81 src/Symfony/Component/Templating/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/Templating/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/Translation/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/Translation/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/Translation/Bridge/Crowdin/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/Translation/Bridge/Crowdin/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/Translation/Bridge/Crowdin/CrowdinProvider.php | 126 src/Symfony/Component/Translation/Bridge/Crowdin/Tests/CrowdinProviderTest.php | 135 src/Symfony/Component/Translation/Bridge/Loco/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/Translation/Bridge/Loco/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/Translation/Bridge/Lokalise/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/Translation/Bridge/Lokalise/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/Translation/Bridge/Lokalise/LokaliseProvider.php | 29 src/Symfony/Component/Translation/Bridge/Lokalise/Tests/LokaliseProviderTest.php | 187 src/Symfony/Component/Translation/Bridge/Phrase/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/Translation/Bridge/Phrase/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/Translation/Bridge/Phrase/PhraseProvider.php | 32 src/Symfony/Component/Translation/Bridge/Phrase/Tests/PhraseProviderTest.php | 226 src/Symfony/Component/Translation/Catalogue/AbstractOperation.php | 8 src/Symfony/Component/Translation/Command/XliffLintCommand.php | 17 src/Symfony/Component/Translation/Dumper/FileDumper.php | 2 src/Symfony/Component/Translation/Dumper/PoFileDumper.php | 9 src/Symfony/Component/Translation/Dumper/XliffFileDumper.php | 7 src/Symfony/Component/Translation/Extractor/Visitor/TranslatableMessageVisitor.php | 5 src/Symfony/Component/Translation/Loader/CsvFileLoader.php | 24 src/Symfony/Component/Translation/Loader/PoFileLoader.php | 38 src/Symfony/Component/Translation/Loader/XliffFileLoader.php | 6 src/Symfony/Component/Translation/Resources/bin/translation-status.php | 6 src/Symfony/Component/Translation/Resources/data/parents.json | 7 src/Symfony/Component/Translation/Tests/Catalogue/AbstractOperationTestCase.php | 17 src/Symfony/Component/Translation/Tests/Catalogue/MergeOperationTest.php | 2 src/Symfony/Component/Translation/Tests/Catalogue/TargetOperationTest.php | 2 src/Symfony/Component/Translation/Tests/Command/XliffLintCommandTest.php | 56 src/Symfony/Component/Translation/Tests/Dumper/FileDumperTest.php | 33 src/Symfony/Component/Translation/Tests/Dumper/PoFileDumperTest.php | 13 src/Symfony/Component/Translation/Tests/Dumper/XliffFileDumperTest.php | 1 src/Symfony/Component/Translation/Tests/Extractor/PhpAstExtractorTest.php | 14 src/Symfony/Component/Translation/Tests/Fixtures/contexts.po | 10 src/Symfony/Component/Translation/Tests/Fixtures/csv-edge-cases.csv | 8 src/Symfony/Component/Translation/Tests/Fixtures/extractor-ast-other-namespace/translatable-other-namespace.html.php | 16 src/Symfony/Component/Translation/Tests/Fixtures/fuzzy-translations-no-blank-lines.po | 11 src/Symfony/Component/Translation/Tests/Fixtures/resources-2.0-clean.xlf | 7 src/Symfony/Component/Translation/Tests/Fixtures/resources-catalog-meta.xlf | 16 src/Symfony/Component/Translation/Tests/Loader/CsvFileLoaderTest.php | 12 src/Symfony/Component/Translation/Tests/Loader/PoFileLoaderTest.php | 25 src/Symfony/Component/Translation/Tests/Loader/XliffFileLoaderTest.php | 9 src/Symfony/Component/Translation/Tests/Util/XliffUtilsTest.php | 135 src/Symfony/Component/Translation/Util/XliffUtils.php | 25 src/Symfony/Component/Uid/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/Uid/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/Uid/BinaryUtil.php | 18 src/Symfony/Component/Uid/Tests/Factory/UuidFactoryTest.php | 2 src/Symfony/Component/Uid/Tests/UuidTest.php | 24 src/Symfony/Component/Uid/Uuid.php | 9 src/Symfony/Component/Validator/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/Validator/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/Validator/Constraints/Collection.php | 3 src/Symfony/Component/Validator/Constraints/Composite.php | 6 src/Symfony/Component/Validator/Constraints/CountValidator.php | 2 src/Symfony/Component/Validator/Constraints/FileValidator.php | 4 src/Symfony/Component/Validator/Constraints/IbanValidator.php | 16 src/Symfony/Component/Validator/Constraints/IsbnValidator.php | 2 src/Symfony/Component/Validator/Constraints/RangeValidator.php | 43 src/Symfony/Component/Validator/Constraints/UrlValidator.php | 2 src/Symfony/Component/Validator/Context/ExecutionContext.php | 2 src/Symfony/Component/Validator/Mapping/ClassMetadata.php | 4 src/Symfony/Component/Validator/Mapping/Factory/LazyLoadingMetadataFactory.php | 80 src/Symfony/Component/Validator/Resources/bin/sync-iban-formats.php | 23 src/Symfony/Component/Validator/Resources/translations/validators.af.xlf | 94 src/Symfony/Component/Validator/Resources/translations/validators.ar.xlf | 202 src/Symfony/Component/Validator/Resources/translations/validators.az.xlf | 94 src/Symfony/Component/Validator/Resources/translations/validators.be.xlf | 102 src/Symfony/Component/Validator/Resources/translations/validators.bg.xlf | 102 src/Symfony/Component/Validator/Resources/translations/validators.bs.xlf | 168 src/Symfony/Component/Validator/Resources/translations/validators.ca.xlf | 94 src/Symfony/Component/Validator/Resources/translations/validators.ckb.xlf | 651 + src/Symfony/Component/Validator/Resources/translations/validators.cs.xlf | 92 src/Symfony/Component/Validator/Resources/translations/validators.cy.xlf | 96 src/Symfony/Component/Validator/Resources/translations/validators.da.xlf | 116 src/Symfony/Component/Validator/Resources/translations/validators.de.xlf | 92 src/Symfony/Component/Validator/Resources/translations/validators.el.xlf | 98 src/Symfony/Component/Validator/Resources/translations/validators.en.xlf | 92 src/Symfony/Component/Validator/Resources/translations/validators.es.xlf | 92 src/Symfony/Component/Validator/Resources/translations/validators.et.xlf | 104 src/Symfony/Component/Validator/Resources/translations/validators.eu.xlf | 94 src/Symfony/Component/Validator/Resources/translations/validators.fa.xlf | 174 src/Symfony/Component/Validator/Resources/translations/validators.fi.xlf | 96 src/Symfony/Component/Validator/Resources/translations/validators.fr.xlf | 116 src/Symfony/Component/Validator/Resources/translations/validators.gl.xlf | 94 src/Symfony/Component/Validator/Resources/translations/validators.he.xlf | 92 src/Symfony/Component/Validator/Resources/translations/validators.hr.xlf | 234 src/Symfony/Component/Validator/Resources/translations/validators.hu.xlf | 174 src/Symfony/Component/Validator/Resources/translations/validators.hy.xlf | 96 src/Symfony/Component/Validator/Resources/translations/validators.id.xlf | 92 src/Symfony/Component/Validator/Resources/translations/validators.it.xlf | 92 src/Symfony/Component/Validator/Resources/translations/validators.ja.xlf | 92 src/Symfony/Component/Validator/Resources/translations/validators.lb.xlf | 92 src/Symfony/Component/Validator/Resources/translations/validators.lt.xlf | 92 src/Symfony/Component/Validator/Resources/translations/validators.lv.xlf | 92 src/Symfony/Component/Validator/Resources/translations/validators.mk.xlf | 162 src/Symfony/Component/Validator/Resources/translations/validators.mn.xlf | 92 src/Symfony/Component/Validator/Resources/translations/validators.my.xlf | 116 src/Symfony/Component/Validator/Resources/translations/validators.nb.xlf | 92 src/Symfony/Component/Validator/Resources/translations/validators.nl.xlf | 92 src/Symfony/Component/Validator/Resources/translations/validators.nn.xlf | 92 src/Symfony/Component/Validator/Resources/translations/validators.no.xlf | 92 src/Symfony/Component/Validator/Resources/translations/validators.pl.xlf | 92 src/Symfony/Component/Validator/Resources/translations/validators.pt.xlf | 132 src/Symfony/Component/Validator/Resources/translations/validators.pt_BR.xlf | 92 src/Symfony/Component/Validator/Resources/translations/validators.ro.xlf | 92 src/Symfony/Component/Validator/Resources/translations/validators.ru.xlf | 92 src/Symfony/Component/Validator/Resources/translations/validators.sk.xlf | 92 src/Symfony/Component/Validator/Resources/translations/validators.sl.xlf | 92 src/Symfony/Component/Validator/Resources/translations/validators.sq.xlf | 170 src/Symfony/Component/Validator/Resources/translations/validators.sr_Cyrl.xlf | 180 src/Symfony/Component/Validator/Resources/translations/validators.sr_Latn.xlf | 216 src/Symfony/Component/Validator/Resources/translations/validators.sv.xlf | 106 src/Symfony/Component/Validator/Resources/translations/validators.th.xlf | 166 src/Symfony/Component/Validator/Resources/translations/validators.tl.xlf | 138 src/Symfony/Component/Validator/Resources/translations/validators.tr.xlf | 114 src/Symfony/Component/Validator/Resources/translations/validators.uk.xlf | 92 src/Symfony/Component/Validator/Resources/translations/validators.ur.xlf | 366 src/Symfony/Component/Validator/Resources/translations/validators.uz.xlf | 92 src/Symfony/Component/Validator/Resources/translations/validators.vi.xlf | 92 src/Symfony/Component/Validator/Resources/translations/validators.zh_CN.xlf | 92 src/Symfony/Component/Validator/Resources/translations/validators.zh_TW.xlf | 226 src/Symfony/Component/Validator/Tests/Constraints/CollectionTest.php | 31 src/Symfony/Component/Validator/Tests/Constraints/CountValidatorTestCase.php | 22 src/Symfony/Component/Validator/Tests/Constraints/FileValidatorTestCase.php | 26 src/Symfony/Component/Validator/Tests/Constraints/IbanValidatorTest.php | 16 src/Symfony/Component/Validator/Tests/Constraints/IsbnValidatorTest.php | 4 src/Symfony/Component/Validator/Tests/Constraints/RangeValidatorTest.php | 36 src/Symfony/Component/Validator/Tests/Constraints/UrlValidatorTest.php | 3 src/Symfony/Component/Validator/Tests/Fixtures/FakeMetadataFactory.php | 16 src/Symfony/Component/Validator/Tests/Fixtures/PropertyInfoLoaderChildEntity.php | 17 src/Symfony/Component/Validator/Tests/Fixtures/PropertyInfoLoaderParentEntity.php | 20 src/Symfony/Component/Validator/Tests/Mapping/ClassMetadataTest.php | 24 src/Symfony/Component/Validator/Tests/Mapping/Factory/LazyLoadingMetadataFactoryTest.php | 110 src/Symfony/Component/Validator/Tests/Mapping/Loader/PropertyInfoLoaderTest.php | 36 src/Symfony/Component/Validator/Tests/Mapping/Loader/XmlFileLoaderTest.php | 3 src/Symfony/Component/Validator/Tests/Mapping/Loader/YamlFileLoaderTest.php | 3 src/Symfony/Component/Validator/Tests/Resources/TranslationFilesTest.php | 21 src/Symfony/Component/Validator/Tests/Validator/RecursiveValidatorTest.php | 150 src/Symfony/Component/Validator/Validator/RecursiveContextualValidator.php | 31 src/Symfony/Component/VarDumper/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/VarDumper/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/VarDumper/Caster/DateCaster.php | 15 src/Symfony/Component/VarDumper/Caster/ExceptionCaster.php | 13 src/Symfony/Component/VarDumper/Caster/SplCaster.php | 32 src/Symfony/Component/VarDumper/Cloner/Stub.php | 2 src/Symfony/Component/VarDumper/Command/Descriptor/CliDescriptor.php | 18 src/Symfony/Component/VarDumper/Command/Descriptor/HtmlDescriptor.php | 19 src/Symfony/Component/VarDumper/Dumper/CliDumper.php | 23 src/Symfony/Component/VarDumper/Dumper/ContextProvider/SourceContextProvider.php | 2 src/Symfony/Component/VarDumper/Tests/Caster/DateCasterTest.php | 36 src/Symfony/Component/VarDumper/Tests/Caster/ExceptionCasterTest.php | 85 src/Symfony/Component/VarDumper/Tests/Caster/FFICasterTest.php | 5 src/Symfony/Component/VarDumper/Tests/Caster/ReflectionCasterTest.php | 4 src/Symfony/Component/VarDumper/Tests/Command/Descriptor/CliDescriptorTest.php | 79 src/Symfony/Component/VarDumper/Tests/Command/Descriptor/HtmlDescriptorTest.php | 76 src/Symfony/Component/VarDumper/Tests/Dumper/CliDumperTest.php | 25 src/Symfony/Component/VarDumper/Tests/Dumper/ContextProvider/SourceContextProviderTest.php | 53 src/Symfony/Component/VarDumper/Tests/Dumper/HtmlDumperTest.php | 12 src/Symfony/Component/VarDumper/Tests/Dumper/functions/dump_data_collector_with_spl_array.phpt | 3 src/Symfony/Component/VarDumper/Tests/Fixtures/dump_colors.php | 18 src/Symfony/Component/VarDumper/composer.json | 2 src/Symfony/Component/VarExporter/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/VarExporter/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/VarExporter/Instantiator.php | 4 src/Symfony/Component/VarExporter/Internal/Exporter.php | 9 src/Symfony/Component/VarExporter/Internal/Registry.php | 18 src/Symfony/Component/VarExporter/ProxyHelper.php | 111 src/Symfony/Component/VarExporter/Tests/LazyProxyTraitTest.php | 30 src/Symfony/Component/VarExporter/Tests/ProxyHelperTest.php | 156 src/Symfony/Component/VarExporter/Tests/VarExporterTest.php | 30 src/Symfony/Component/WebLink/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/WebLink/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/WebLink/HttpHeaderSerializer.php | 2 src/Symfony/Component/Webhook/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/Webhook/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/Webhook/Client/AbstractRequestParser.php | 7 src/Symfony/Component/Webhook/Test/AbstractRequestParserTestCase.php | 2 src/Symfony/Component/Webhook/Tests/Client/RequestParserTest.php | 26 src/Symfony/Component/Workflow/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/Workflow/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/Workflow/Definition.php | 2 src/Symfony/Component/Workflow/Dumper/MermaidDumper.php | 10 src/Symfony/Component/Workflow/Tests/Dumper/MermaidDumperTest.php | 12 src/Symfony/Component/Yaml/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Component/Yaml/.github/workflows/close-pull-request.yml | 20 src/Symfony/Component/Yaml/Dumper.php | 83 src/Symfony/Component/Yaml/Escaper.php | 2 src/Symfony/Component/Yaml/Exception/ParseException.php | 4 src/Symfony/Component/Yaml/Inline.php | 182 src/Symfony/Component/Yaml/Parser.php | 318 src/Symfony/Component/Yaml/Tests/DumperTest.php | 182 src/Symfony/Component/Yaml/Tests/Fixtures/YtsSpecificationExamples.yml | 10 src/Symfony/Component/Yaml/Tests/InlineTest.php | 186 src/Symfony/Component/Yaml/Tests/ParseExceptionTest.php | 8 src/Symfony/Component/Yaml/Tests/ParserTest.php | 588 + src/Symfony/Contracts/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Contracts/.github/workflows/close-pull-request.yml | 20 src/Symfony/Contracts/Cache/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Contracts/Cache/.github/workflows/close-pull-request.yml | 20 src/Symfony/Contracts/Deprecation/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Contracts/Deprecation/.github/workflows/close-pull-request.yml | 20 src/Symfony/Contracts/EventDispatcher/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Contracts/EventDispatcher/.github/workflows/close-pull-request.yml | 20 src/Symfony/Contracts/HttpClient/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Contracts/HttpClient/.github/workflows/close-pull-request.yml | 20 src/Symfony/Contracts/HttpClient/HttpClientInterface.php | 6 src/Symfony/Contracts/HttpClient/Test/HttpClientTestCase.php | 13 src/Symfony/Contracts/Service/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Contracts/Service/.github/workflows/close-pull-request.yml | 20 src/Symfony/Contracts/Translation/.github/PULL_REQUEST_TEMPLATE.md | 8 src/Symfony/Contracts/Translation/.github/workflows/close-pull-request.yml | 20 src/Symfony/Contracts/splitsh.json | 3 2880 files changed, 228745 insertions(+), 24375 deletions(-) dpkg-source: warning: cannot verify inline signature for /srv/release.debian.org/tmp/tmp6qzlnpkw/symfony_6.4.41+dfsg-0+deb13u1.dsc: no acceptable signature found dpkg-source: warning: cannot verify inline signature for /srv/release.debian.org/tmp/tmp6qzlnpkw/symfony_6.4.49+dfsg-0+deb13u1.dsc: no acceptable signature found diff -Nru symfony-6.4.41+dfsg/.agents/skills/bug-triage/SKILL.md symfony-6.4.49+dfsg/.agents/skills/bug-triage/SKILL.md --- symfony-6.4.41+dfsg/.agents/skills/bug-triage/SKILL.md 1970-01-01 00:00:00.000000000 +0000 +++ symfony-6.4.49+dfsg/.agents/skills/bug-triage/SKILL.md 2026-10-28 18:15:18.000000000 +0000 @@ -0,0 +1,187 @@ +--- +name: bug-triage +description: > + Decide whether open Bug PRs target the correct branch. A bug must be fixed on + the lowest maintained branch where it exists, then merged up. Use when the + user says "triage bug PRs", "which PRs need retargeting", or "retarget triage". +--- + +# Symfony Bug-PR Retarget Triage + +Symfony fixes bugs on the **lowest maintained branch where the bug exists**, then +merges up. This skill produces a retarget recommendation per PR. The final call +belongs to a maintainer; never act without explicit confirmation. + +--- + +## Steps + +### Step 0 — Scope + +**Maintained branches:** +```bash +curl -s https://symfony.com/releases.json +# maintained_versions, e.g. ["6.4","7.4","8.0","8.1","8.2"]; LOWEST = first entry. +# DEV (new-feature target) = first entry AFTER latest_stable_version, not the last +# entry: when X.4 and Y.0 are developed in parallel both are dev, and features go to +# the lower one (they merge up). +``` + +**Resolve the upstream remote** (not always `origin`): +```bash +REMOTE=$(git remote -v | awk '/[:\/]symfony\/symfony(\.git)?[[:space:]]+\(fetch\)/{print $1; exit}') +# Stop and ask the user if empty +``` + +**Fetch all maintained branches**, then collect open Bug PRs: +```bash +git fetch "$REMOTE" + +gh pr list --repo symfony/symfony --label Bug --state open --limit 300 \ + --json number,title,baseRefName,milestone,isDraft +# Skip drafts unless asked. A milestone/base mismatch is itself a signal. +``` + +--- + +### Step 1 — Investigate each PR (one subagent per PR, run concurrently, batches of 8-10) + +Each subagent is read-only and returns a structured verdict. + +**1a. Fetch PR data:** +```bash +gh pr view --repo symfony/symfony \ + --json number,title,baseRefName,milestone,body,files,labels,closingIssuesReferences,url +gh pr diff --repo symfony/symfony +gh pr view --repo symfony/symfony --comments +``` +From the body Q&A table, read `Branch?`, `Bug fix?`, `New feature?`, `Deprecations?`. + +**1b. Bug fix or feature? (objective check)** + +The `Bug fix?` field is self-declared and can be wrong. The real check: does the +production diff **add public/protected API surface**? + +```bash +# Scan only non-Tests/ files for added API +gh pr diff --repo symfony/symfony \ + | awk '/^diff --git /{skip=($0 ~ /\/Tests\//)} !skip' \ + | grep -nE '^\+\s*(public|protected)\s+(function|const|readonly|static|\??[A-Za-z\\]+\s+\$)|^\+\s*(final\s+)?(class|interface|trait|enum)\s' +``` + +If the diff grows the surface → treat as **feature** (target `DEV`, never retarget down). +Two false positives to discount: code merely *moved* also shows as `+` lines, and +adding to an `@internal`/`@experimental` class is not a BC extension. +Exception: implementing a marker interface (e.g. `ResetInterface`) to fix a state +leak is still a bug fix; weigh intent in those cases. + +**1c. Read linked issues:** +```bash +# Also parse the body for "Fix #", "Closes #", "Resolves #" +gh issue view --repo symfony/symfony --json title,body,labels,comments +# The reported Symfony version is the strongest signal for how far back the bug reaches. +``` + +**1d. Probe lower branches** (for each branch below the PR's base, oldest first): +```bash +# 1. Does the file exist? +git cat-file -e "$REMOTE/:" && echo present || echo absent + +# 2. Does the buggy code exist there? +git show "$REMOTE/:" + +# 3. When did the code arrive? (determines the regression floor) +git log -S'' --oneline "$REMOTE/" -- +``` + +**1e. (Optional) Reproduce on the candidate branch:** +```bash +git worktree add --detach ../symfony-sf-triage- "$REMOTE/" +cd ../symfony-sf-triage- && ./phpunit src/Symfony/Component/ +cd - && git worktree remove --force ../symfony-sf-triage- +``` + +**Subagent verdict:** PR number, component, current base, **recommended base**, +confidence (high/medium/low), deciding evidence, whether the fix needs adaptation. + +--- + +### Step 2 — Decision tree (first match wins) + +**Keep on current base if any hold:** +- Not a bug fix (feature, deprecation, or grows the public/protected API surface). +- The touched code does not exist on any lower branch. +- The regression was introduced on the current base or later (lower branches never had it). +- Fixing lower would change frozen/contractual behaviour (flag for maintainer). + +**Retarget DOWN to branch `T` if all hold:** +1. It is a **bug fix** (fixes wrong behaviour, doesn't add capability). +2. `T` is the **oldest maintained branch where the bug exists**, bounded by the + regression floor and never below `LOWEST`. +3. The fix **applies on `T`** (directly or with a documented adaptation). + +**Raise the base (rare):** the PR targets a branch where the code doesn't exist yet, +or an unmaintained branch → recommend the lowest maintained branch that has the code. + +--- + +### Step 3 — Aggregate report + +Collect verdicts into a table ordered by action then component: + +``` +PR Component Base → Recommend Conf Why +#64613 Validator 7.4 6.4 high issue reports 6.4; method present & broken on 6.4 +#64589 ObjectMapper 8.1 8.1 (keep) high component added in 8.1; absent below +#64576 Serializer 8.1 7.4 med regression introduced in 7.4 (commit abc123) +``` + +Routing (each is outward, so **wait for confirmation** before doing anything): +- **Retarget:** draft a short factual comment citing the evidence. +- **Keep:** record the reason so the PR is not re-triaged. +- **Needs human judgement:** low-confidence or behaviour-change cases → state the open question. + +--- + +### Step 4 — Execute (only on explicit user authorization) + +**When to comment-only vs. rebase+push:** +- Comment-only when: `maintainerCanModify` is false; the fix needs real code + adaptation; or the PR is already approved (a force-push dismisses reviews). +- Rebase+push when commits cherry-pick cleanly onto the target. + +**Rebase mechanics:** +```bash +# Cherry-pick PR commits onto a fresh branch off the target (do NOT rebase the whole branch) +git fetch ; OLD=$(git rev-parse FETCH_HEAD) +git checkout -B retarget- $REMOTE/ +git cherry-pick ... + +# Run tests before pushing +./phpunit src/Symfony/Component/ + +# Push with lease, then change base +git push HEAD: --force-with-lease=:$OLD +gh pr edit --repo --base --milestone + +# Clean up +git checkout && git branch -D retarget- +``` + +After retargeting, also update the body's `| Branch? |` value and remove any +labels that contradict the new disposition (e.g. `Feature` on a confirmed bug fix). + +--- + +## Quick reference table + +| PR shape | Recommendation | Deciding factor | +|---|---|---| +| Bug on 8.1; issue reproduced on 6.4; method present & broken on 6.4 | **Retarget to 6.4** | bug reaches the floor | +| Bug on 8.2; offending line introduced in a commit first shipped in 8.0 | **Retarget to 8.0** | regression floor is 8.0 | +| Bug on 8.1 in a component that didn't exist before 8.1 | **Keep on 8.1** | code absent on lower branches | +| `New feature? yes` opened on 8.1 | **Raise to DEV** | features target the dev branch | +| Maintainer commented "please rebase on 7.4" | **Retarget to 7.4 (high)** | explicit instruction overrides inference | +| Early "rebase on 6.4", later "this is a feature" | **Follow the latest: keep on DEV** | most recent instruction wins | +| PR already approved; bug reaches lower branches | **Comment-only, ask author** | force-push dismisses reviews | +| Fix uses 8.x-only API but bug exists on 6.4 | **Retarget to 6.4, adapt the fix** | don't leave 6.4 broken | diff -Nru symfony-6.4.41+dfsg/.agents/skills/hardening-rule/SKILL.md symfony-6.4.49+dfsg/.agents/skills/hardening-rule/SKILL.md --- symfony-6.4.41+dfsg/.agents/skills/hardening-rule/SKILL.md 1970-01-01 00:00:00.000000000 +0000 +++ symfony-6.4.49+dfsg/.agents/skills/hardening-rule/SKILL.md 2026-10-28 18:15:18.000000000 +0000 @@ -0,0 +1,81 @@ +--- +name: hardening-rule +description: > + Decide whether a recurring hardening invariant is worth a CI gate, and add it + without hitting the traps. Covers PHPStan custom rules (implementation-shape + checks) and the check-hardening-tests.php convention (test-presence checks). + Use when the user says "write a PHPStan rule", "add a hardening rule", "gate + this pattern", "catch this in CI", or wants to turn a finding into a durable check. +--- + +# Symfony Hardening Rule + +Turns a recurring hardening invariant into a CI gate. The **mechanics are obvious from the +three shipped rules** (`HardenedComparisonRule`, `UnserializeToStringTrampolineRule`, +`UnserializeMissingAllowedClassesRule`): copy the class shape and the registration. This +skill is the part the example files cannot teach: when a rule is worth building, and the +traps that cost an afternoon. + +## When to build (and when not) + +A PHPStan rule earns its place only if it catches a **broad, recurring shape across many +sites**. The shipped rules each span dozens (every webhook compare; 60+ `__unserialize`; +every `unserialize()`). If your rule effectively targets one class or one call site, it is +**too narrow**: it carries CI weight for almost no coverage. Use a regression test instead. +(A verify-MAC-before-deserialize rule was built and dropped for exactly this reason: it +matched a single serializer.) + +Pick the mechanism by what the invariant is about: + +| Invariant is about... | Use | +|---|---| +| A code **shape** recurring across many sites | a PHPStan rule (this skill) | +| A **test** existing for a boundary class | extend `check-hardening-tests.php` | +| A value being **attacker-controlled** (data-flow) | Psalm taint, or a reviewer note; not a syntactic rule | +| A **curated set** being complete (subnets, attributes) | a unit test next to the data | +| One class / one site | a regression test, not a rule | + +Do not force a taint problem into a syntactic rule: if safe and unsafe look identical at the +sink and differ only by where a value came from, the rule is all false positives. + +## The shape (copy, do not reinvent) + +Model the new rule on the existing `.github/sa-tools/rules/*Rule.php`: global namespace, +Symfony license header, `implements Rule` with `getNodeType()`/`processNode()`, a stable +`identifier('symfony.')`, and the narrowest node type that sees the shape. + +## The traps + +1. **Registration is one line plus the file.** Drop `Rule.php` into + `.github/sa-tools/rules/` and add its class to the `rules:` list in + `.github/sa-tools/rules.neon` (which `phpstan.dist.neon` includes). The folder's autoloader + (`rules/bootstrap.php`, wired once via `--autoload-file` in `static-analysis.yml`) and the + `.gitignore` folder whitelist (`!rules`, `!rules/*`) pick the file up with no further edits. + A rule that needs constructor arguments takes a `services:` entry tagged + `phpstan.rules.rule` in that same `rules.neon` instead of the `rules:` shorthand. (PHPStan + only autoloads a project-local rule class early enough via `--autoload-file` or composer + PSR-4 — a neon `scanDirectories`/`bootstrapFiles` runs too late — hence the stable + bootstrap, which you never touch per rule.) +2. **`phpstan analyse` counts are nondeterministic** (result cache + parallel workers report + 0 then N for the same input). Verify the logic with `PHPStan\Testing\RuleTestCase` in a + throwaway `composer require phpstan/phpstan phpunit/phpunit` project, with fixtures for + the unsafe shape (must fire), the fixed shape (silent), and the nearest safe look-alike + from the decision boundary (silent). Never gate on a local `analyse` count. +3. **The diff-lint only flags new errors.** `phpstan-diff.php` compares the PR against the + base branch and fails only on errors new to the PR, so standing violations are absorbed. + Design target: zero findings on the current tree at introduction (no baseline entry). + +## Convention path + +If the invariant is "this boundary class must ship its regression test", extend +`check-hardening-tests.php` (pure tokenizer, no autoload) instead of writing a rule. Add the +boundary predicate and the required-test predicate in its existing style; accepted gaps go in +the `ALLOWLIST` const as a TODO with a reason, never a permanent waiver. + +## Error handling + +- If the invariant needs data-flow, do not ship a syntactic rule that fakes it. Say it is a + taint or checklist item and **wait for confirmation** on the fallback. +- Do not edit `phpstan-diff.php` or the workflow to make a rule pass. Fix the rule. +- House conventions: Symfony license header, no em-dashes, no Claude/Anthropic credit, + comments sparingly, no issue numbers in code. diff -Nru symfony-6.4.41+dfsg/.agents/skills/merge-up/SKILL.md symfony-6.4.49+dfsg/.agents/skills/merge-up/SKILL.md --- symfony-6.4.41+dfsg/.agents/skills/merge-up/SKILL.md 1970-01-01 00:00:00.000000000 +0000 +++ symfony-6.4.49+dfsg/.agents/skills/merge-up/SKILL.md 2026-10-28 18:15:18.000000000 +0000 @@ -0,0 +1,361 @@ +--- +name: merge-up +description: > + Cascade-merge maintained Symfony branches from oldest to newest (e.g. + 6.4 → 7.4 → 8.0 → 8.1). Use when the user says "merge branches", + "merge up", "cascade merge", "sync branches", or "update branches". +--- + +# Symfony Branch Cascade Merge + +Merges each maintained branch into the next one, from oldest to newest. + +## Progress checklist + +- [ ] Step 0: Pre-flight checks +- [ ] Step 1: Fetch maintained branches and pull them +- [ ] Step 2: Cascade merge loop + +--- + +## Confirmation rule + +Whenever the skill says **"Wait for confirmation"**, treat anything other than an +explicit affirmative as **no**: stop and ask the user how they want to proceed. + +--- + +## Step 0 — Pre-flight checks + +```bash +git status --porcelain --untracked-files=no +``` + +If any output, **stop**: +> "The working tree is not clean. Please commit or stash your changes first." + +--- + +## Step 1 — Fetch maintained branches and pull them + +### 1a. Get the branch list + +```bash +curl -s https://symfony.com/releases.json +``` + +Read `maintained_versions`. It is already sorted oldest → newest (e.g. +`["6.4", "7.4", "8.0", "8.1"]`). Store as `BRANCHES`. + +### 1b. Pull every branch + +For each branch in `BRANCHES`: + +```bash +git checkout +git pull --ff-only origin +``` + +Using `--ff-only` ensures local branches haven't diverged from origin. If the +pull fails, **stop** and report the error. + +--- + +## Step 2 — Cascade merge loop + +For each consecutive pair `(SOURCE, TARGET)` in `BRANCHES`: + +### 2a. Merge + +```bash +git checkout +composer up +``` + +Read the merge-up notes of the incoming pull requests first. The bot copies the whole +pull request description into the merge commit, so the authors' own instructions for +this merge are already in the local history, and many descriptions end with a +"Merge-up to ``" paragraph naming the properties to add, the style the target +branch expects, or the resolved code itself: + +```bash +git log --merges --format=%H .. \ + | xargs -I{} git log -1 --format=%B {} \ + | grep -inE 'merge(d| )?-?up|adapt|on [0-9]+\.[0-9]' +``` + +Prefer the resolution a note gives over an equivalent one of your own: it is what the +author wrote the change for and usually ran on the target branch already, and a merge +commit is the wrong place for a refactor. A note also covers files that merge cleanly, +which is why this runs before the merge and not only when git reports a conflict. + +```bash +git merge +``` + +Three outcomes are possible: + +- **Already up-to-date:** print "✓ `` already up-to-date with ``" + and skip to the next pair. +- **Clean merge (no conflicts):** git creates the merge commit automatically. + Proceed directly to step 2c. +- **Conflicts:** proceed to step 2b. + +### 2b. Resolve conflicts (only when git reports conflicts) + +List conflicts: + +```bash +git diff --name-only --diff-filter=U +``` + +Read each conflicted file, resolve it, then `git add` it. When all are resolved: + +```bash +git commit --no-edit +``` + +#### Conflict resolution rules + +| File pattern | Strategy | +|---|---| +| `CHANGELOG*.md` | Keep entries from both sides; newer branch entries on top | +| Version constants, `composer.json` branch aliases | Keep the TARGET branch value | +| `.github/workflows/*.yml`, CI config | Keep the TARGET value for branch-specific pins. A new job merged from SOURCE may carry SOURCE's `php-version` (its branch minimum); bump it to the TARGET's minimum (see `min_php_requirements` in releases.json) | +| Idiom the TARGET replaced (e.g. `unserialize(serialize())` - a deep-clone helper, logic extracted to a trait, a method/class removed) | Take the TARGET version; the SOURCE change is superseded. `git checkout --ours ` then re-apply any security option (e.g. `allowed_classes`) the TARGET's version happens to drop | +| File the TARGET deleted (modify/delete conflict) | Keep it deleted if the TARGET removed the feature (confirm with `git log -- `); the SOURCE edit is moot. `git rm ` | +| Test using docblock metadata (`@dataProvider`, `@testWith`, `@group legacy`) | Convert to attributes (`#[DataProvider(...)]`, `#[TestWith([...])]`, `#[Group(...)]`) when the TARGET runs PHPUnit 10+ (7.4/8.x here); PHPUnit ignores *all* metadata in doc-comments, so the data sets are never passed and the test errors with "too few arguments" | +| Compat guard added by SOURCE (`class_exists()` / `method_exists()` fallback for a symbol that may be missing from an older sibling package) | Check whether the TARGET dropped it on purpose: `git log -S'' -- `. Symfony removes these in "Remove legacy code paths that rely on feature checks" style commits, so take SOURCE's new structure but leave the guard out | +| Both sides added a member at the same spot (no overlapping content, git just collapsed them onto a shared closing) | Keep both. Give each its own terminator: two `elseif` branches each need their own `return`/closing brace, and two methods each need their own `}`. Private methods go last, after all public ones | +| Code files | Merge logically based on context; when unsure, ask the user | + +#### Structural divergence across major versions + +A newer major may have removed deprecated classes, attributes, or config formats +(e.g. `TaggedLocator`, XML DI config), raised the minimum PHP version, or refactored +shared logic into a trait or a new utility class. When merging across such a boundary: + +- Remove test methods marked `@group legacy` / `#[Group('legacy')]` for deprecations + the new major dropped, **and** any test/fixture/import that references a removed + symbol (otherwise it fatals on the TARGET). +- Each major raises the minimum PHP (min PHP per branch in releases.json + `min_php_requirements`: 6.4=8.1, 7.4=8.2, 8.0=8.4). Code merged from SOURCE that + branches on or polyfills a PHP below the TARGET's minimum (`\PHP_VERSION_ID < ...` + guards, or `function_exists()` / `class_exists()` fallbacks for now-always-available + symbols) is dead on the TARGET and can be collapsed to the modern path. The TARGET + usually dropped it already, so prefer its version; clean up only where SOURCE's + old-PHP code lands somewhere the TARGET had not simplified. +- Prefer the TARGET branch's approach for any refactored idiom. +- Fastest sanity check: look at how the *downstream* branch (one already past this + divergence, e.g. 8.2 while resolving on 8.0) resolved the same files, and match it. + +#### Divergence a clean merge hides + +Most of these produce no conflict at all: the merge succeeds and the tests fail. +All three show up as a merged test that is fine on SOURCE and wrong on TARGET. + +- **A config key the TARGET removed or deprecated.** A merged test builds a config + array (`'annotations' => false`, `'profiler' => ['collect_serializer_data' => true]`) + that the TARGET no longer accepts. The symptom is `Unrecognized option "x" under + "framework"` with the valid list attached, or a deprecation the run reports as an + issue. Drop the key: these are boilerplate, not what the test is about. Grep the + whole merge diff for the key, since several merged tests usually carry it. +- **Registration the TARGET gates.** The TARGET may drop a service unless something + consumes it (profiler or test mode, for instance), so a merged test asserting on it + fails with "You have requested a non-existent service". Do not assert on a stripped + container: rebuild it the way the TARGET's own sibling tests do, keeping the + assertion intact. +- **A default the TARGET flipped.** SOURCE adds a code path behind a flag whose + default the TARGET changed, so the new path becomes the TARGET's default and changes + observable output. Both sides merge cleanly and the assertions SOURCE wrote for the + old path now fail. Confirm with `git log -S' = '`, then adapt + the expectations, capturing the real output from a run rather than guessing at it. + +After resolving, show `git diff HEAD~1` (first parent of the merge commit, i.e. +the previous TARGET state) and wait for the user to confirm the resolution looks +correct before proceeding. + +### 2c. Run tests for affected components + +Extract component, bridge, and bundle names from changed files: + +```bash +git diff --name-only HEAD~1..HEAD +``` + +Paths look like `src/Symfony/{Component,Bridge,Bundle}//...`. Deduplicate, +then run tests for each: + +```bash +./phpunit src/Symfony/Component/ +./phpunit src/Symfony/Bridge/ +./phpunit src/Symfony/Bundle/ +``` + +For files under `src/Symfony/Contracts/`, run the single shared test suite: + +```bash +./phpunit src/Symfony/Contracts +``` + +Ignore files outside these directories (root configs, `.github/`, etc.): they +don't have component-level test suites. + +Read the whole summary line, not just the exit status: a suite can end with +`Tests: N, Failures: 1` or abort on a `Fatal error` well before any `FAILURES!` +banner, and ANSI colour codes sit in front of those words, so a check anchored to +the start of a line reports a red run as green. + +If tests fail or report PHPUnit deprecations (the PHPUnit version may differ +between branches), first check whether the failure is pre-existing. Cheapest test +first: if the merge did not touch the failing area, it did not cause the failure. + +```bash +git diff --name-only HEAD~1..HEAD -- +``` + +Only when that is inconclusive, run the test on the TARGET before the merge +(`git checkout HEAD~1`, run, `git checkout `). Beware a CI baseline as +evidence: a branch tip that has not been pushed in a while keeps an old green run, +and CI installs dependencies fresh on every run, so a release made in between can +turn a suite red with no commit to blame. + +Only fix failures introduced by the merge: +1. Analyze and fix the code, including any PHPUnit deprecation notices. +2. Commit the fix: `[] Fix merge conflict resolution`. +3. Re-run failing tests until green and deprecation-free. + +Report any pre-existing failures to the user without attempting to fix them. + +#### Failures a local run cannot show + +Locally, every sibling `symfony/*` package resolves to the branch you are on, so +cross-component drift is invisible. CI's `high-deps` job installs the newest dev of +the other components and `low-deps` the oldest each `composer.json` allows, which is +where merged tests break even though the merge itself is sound: + +- **An assertion pinned to another component's message.** A newer sibling appends to + an exception message and an expectation that ended at the old last word stops + matching. Assert the part that identifies the failure and leave the tail free + (drop a trailing `.`, or use `expectExceptionMessageMatches()`), and fix it on the + oldest branch that has the test so the cascade carries it up. +- **A test in the wrong component.** A test exercising code that lives in component B + but sitting in component A passes everywhere except `low-deps`, where A's + `composer.json` pulls a B too old to have the feature. Move the test to B rather + than raising A's constraint or skipping the case; `low-deps` is what proves A's + declared constraints are honest. + +### 2c-bis. Run the repo's static-analysis / hardening checks + +If the repo ships custom static analysis (this one has `.github/sa-tools/` with +PHPStan rules and `check-hardening-tests.php`), the merge carries those rules into +the TARGET, where they now apply to the TARGET's **own** code. Newer-branch code +can trip rules the SOURCE introduced but never had to satisfy. Run them: + +```bash +php .github/sa-tools/check-hardening-tests.php +# and the custom PHPStan rules, as wired in .github/workflows/static-analysis.yml +``` + +Fix the branch-specific gaps (e.g. add `['allowed_classes' => …]` to a bare +`unserialize()`, add an `instanceof \Stringable` guard to a string-property +`__unserialize()`, or add the missing regression test). These gaps are not +*introduced* by the merge, but the merge makes the checks apply — so they must be +green before pushing. Confirm scope with the user before a large hardening pass. + +Beware false positives: untracked nested `vendor/` dirs and the local PHP +extension set (a missing extension falls back to a possibly-outdated polyfill) can +produce findings/failures that do not exist on a clean checkout / CI. + +### 2d. Ask for confirmation before pushing + +Show: + +``` +Merge: → +Affected: +Tests: all passing + +Commits since origin/: +git log --oneline origin/.. + +Ready to push? (yes / no) +``` + +**Wait for confirmation.** The user may make changes themselves before confirming. + +### 2e. Push and continue + +```bash +git push origin +``` + +If the push fails, **stop** and report the error. + +Print "✓ `` → `` done." and continue to the next pair. + +--- + +## Final summary + +``` +All merges complete: + 6.4 → 7.4 ✓ + 7.4 → 8.0 ✓ + 8.0 → 8.1 ✓ +``` + +--- + +## Gotchas + +- `CHANGELOG.md` conflicts are the most common; entries must be kept from both + sides, never dropped. +- A merge can introduce test failures even without conflicts, because behavior + from the older branch may be incompatible with newer code. Always run tests. +- A **clean (no-conflict) merge still needs verification**, not just a commit: + auto-merged test metadata (docblock vs attribute), security-guard slot indices, + and CI version pins can each be wrong even when git reports no conflict. +- Some components have slow test suites. Only run tests for components with + changed files, not the entire project. +- When the user states a constraint about the merge as a whole ("8.x stays on + ext-redis 6"), it applies to the entire merge diff, not only to the files git + flagged as conflicting. Grep the whole diff for the concept and check every hit, + including root `composer.json`, static-analysis baselines, and other components' + bridges. Auto-merged hunks are where a constraint like that gets lost silently. +- Resolving only the conflicted hunk of a file leaves the rest of it auto-merged. + When the two sides restructured the same file, read the resolved file end to end + before staging it, otherwise it can end up declaring the same thing twice or + dropping a `return`. + +## Recurring CI failures that are not yours + +These recur across runs and are unrelated to any merge. Re-run the job to confirm +rather than investigating the component: + +- Windows: `AmpHttpClientTest` idle timeouts on `localhost:8057`, and + `RedisException: Redis server went away` in the Redis Messenger integration tests. +- Any job: composer aborting with `curl error 60 ... SSL certificate problem`, and + PHPUnit dying in `RecursiveDirectoryIterator` on a `vendor/composer/` temp + directory that vanished while it was walking the tree. +- Timing assertions that compare an elapsed duration against a bound + (`Failed asserting that 0.0 is greater than 0`). + +Before writing one off, check that the group meant to exclude it is actually +excluded: a marker only takes effect if the job passes the matching +`--exclude-group`, and if the TARGET runs PHPUnit 10+, only if the marker is an +attribute rather than a doc-comment. + +## Error handling + +- **Never** force-push or rewrite history. +- **Never** use `--no-verify` on commits. +- **Never** `git add -A` (or `git add .`) while resolving: it sweeps the user's + untracked working files into the merge commit. Stage the files you resolved, by name. +- **Never** `git reset` in the middle of a merge: it deletes `.git/MERGE_HEAD`, and the + commit that follows records a single parent, silently turning the merge into a squash. +- **Never** auto-recover from a failed `git push` or `git pull`. Stop and hand + control back to the user. +- **Never** parallelize the cascade or run branches concurrently (e.g. via subagents): each + merge depends on the previous one and shares the git working tree. Run strictly oldest to + newest, one at a time. diff -Nru symfony-6.4.41+dfsg/.agents/skills/pr-authoring/SKILL.md symfony-6.4.49+dfsg/.agents/skills/pr-authoring/SKILL.md --- symfony-6.4.41+dfsg/.agents/skills/pr-authoring/SKILL.md 1970-01-01 00:00:00.000000000 +0000 +++ symfony-6.4.49+dfsg/.agents/skills/pr-authoring/SKILL.md 2026-10-28 18:15:18.000000000 +0000 @@ -0,0 +1,59 @@ +--- +name: pr-authoring +description: > + Hold your own work to the review standard of this repository, so that a change + is merge-ready when it is opened. Use when the user asks to fix an issue, to + add a feature, to refactor, or to make any other change to this codebase, and + read it before writing the first line of code. +--- + +# Authoring a pull request + +## Consult the review standard first + +- Read `.agents/skills/pr-review-merge-prep/SKILL.md` in full before writing code. It states what a change must satisfy to be merged here. +- That skill speaks from the reviewer's seat, and every requirement in it applies to the code you write yourself. A reviewer will hold your pull request to it, so hold your work to it first. +- This skill says when to consult the review skill and what to do with the answer. It repeats only the rules that apply to every keystroke, listed under House rules below, so that they hold even before that skill is open. When the two seem to disagree, the review skill decides. + +## Before writing code + +- Choose the target branch before the first commit, with the branch rules of the review skill. The target decides which APIs the code may use, which test style it follows, and where the changelog entry goes. Changing it later means rewriting the change, not rebasing it. +- Re-derive the problem from the code, whatever the issue or the request says it is. A report describes a symptom. Work from the cause you found yourself. +- Reproduce the current behavior with a probe or a failing test before changing anything. A fix for a problem you never saw happen cannot be verified. +- Run the public-API challenge of the review skill against your own design before you build it, not after. Dropping a method that is not needed costs nothing at that point. Defending one that is not justified costs a whole discussion later. + +## While working + +- Keep the diff to what the request needs. Unrelated cleanups make the change harder to review, and they can pull it toward another target branch. Report what you find outside that scope, or send it as its own pull request. +- Apply the house rules of the review skill to everything you produce: tests first, comments, tone, attribution, order of methods, plain English. + +## Running the tests + +- Run one component at a time, by path: `./phpunit src/Symfony/Component/`, and the same form for `src/Symfony/Bridge/` and `src/Symfony/Bundle/`. Everything under `src/Symfony/Contracts` is a single suite: `./phpunit src/Symfony/Contracts`. +- Never run the whole monorepo at once. It takes hours, and it buries the failure you are looking for. +- Narrow to one test file or one filter while iterating, then run the full suite of every touched component before calling the change done. +- Read the summary line, not the exit status alone. A run can end with `Tests: N, Failures: 1`, or die on a fatal error before any banner, and colour codes sit in front of those words. +- After every rebase or merge, rerun the tests of the patched components. A replay that raised no conflict still produces broken code. Run the rebase or merge itself non-interactively, with `GIT_EDITOR=true`. + +## Before opening it + +- Review your own diff with the review skill, as if someone else had written it. Run the checks it asks a reviewer to run: revert-verify each new test, probe the edge cases, check every borrowed symbol against the declared version constraints, check that the changelog and upgrade entries sit in the unreleased section, and run the full suite of every touched component together with the style tool. +- Apply what that pass finds. Do not file the findings in the description as known limitations, because a reviewer reads them as work left undone. +- Shape the commits before pushing: a message that matches its diff, and a structure that carries meaning, such as a failing test followed by the fix. +- Write the description for someone who never saw the request: what the change does, the public API it adds, the options and their defaults, and the traps. Fill the header table, and give the title the component prefix. +- Say which checks you ran and what they returned. State what you did not cover just as plainly. +- A change on a maintained branch gets merged up. When a higher branch needs a different shape, end the description with a `Merge-up to :` paragraph giving the declarations to add, the style that branch expects, or the resolved code itself, and say whether you ran it there. The merge-up skill reads those paragraphs back out of the merge commit, so writing one saves the merger from rediscovering the resolution. + +## Opening it + +- Opening a pull request, pushing to it and commenting on it are outward actions. Ask the user before the first one, unless they already asked for the pull request. +- Push the branch to a fork. Never push a working branch to the upstream repository. + +## House rules + +These hold whether or not the review skill is open, and they cover inherited content too, such as a commit you amend or a patch you rebase. + +- Use TDD: the failing test comes first, the implementation second, the full suite of the touched component last. +- Write code comments sparingly, only where they add value the code cannot express. A test method or a test helper carries no docblock and no comment narrating it: its name and its assertions say what it checks. The comment that stays in a test is the one saying why a fixture looks wrong on purpose. Never reference an issue or a pull request from code or from tests. +- No em-dashes. No `Co-Authored-By` trailer. No credit to Claude, to Anthropic or to any other AI tool, anywhere: code, commit messages, pull request titles and bodies, review comments, issue comments. +- Keep a factual tone in everything published, and use plain English: common words, short sentences, one idea per sentence. Most readers are not native speakers. diff -Nru symfony-6.4.41+dfsg/.agents/skills/pr-merge/SKILL.md symfony-6.4.49+dfsg/.agents/skills/pr-merge/SKILL.md --- symfony-6.4.41+dfsg/.agents/skills/pr-merge/SKILL.md 1970-01-01 00:00:00.000000000 +0000 +++ symfony-6.4.49+dfsg/.agents/skills/pr-merge/SKILL.md 2026-10-28 18:15:18.000000000 +0000 @@ -0,0 +1,283 @@ +--- +name: pr-merge +description: > + Merge a reviewed pull request the way the Symfony core team does: one + --no-ff merge commit per PR, whose message archives the whole discussion, + with the review gates checked first. Use when asked to merge a PR, to + finish a merge that stopped on conflicts, or to verify that a merge was + done right. +--- + +# Merging a pull request + +Every pull request lands as exactly one `--no-ff` merge commit on the target +branch, even a single-commit PR. The first-parent history therefore reads as +one line per PR, the inner commits keep the contributor's authorship, and the +merge commit archives the PR: its number, title, contributors, description +and commit list in the message, and the PR comments in a git note. The +repository stays self-contained: the history explains itself without GitHub. + +This skill states the full process: run it end to end, resume it after a +conflict, or use it to verify a merge. Do all the local work first, then +stop exactly once for confirmation before anything outward happens. + +This skill starts where `pr-review-merge-prep` ends: the PR has been +reviewed, targets the right branch and is merge-ready. After a merge into an +older maintained branch, `merge-up` carries it to the newer branches. + +## Confirmation rule + +Merging publishes: it pushes upstream, edits the PR and comments on it. +Everything up to and including the local merge commit is reversible, so do +it without asking. Then stop once, before the first outward action, with a +summary: target branch, suggested category and why, squash decision, CI +verdict with the failures triaged, the linked issues that will be closed, +and any gate that needs an override. One +confirmation covers all the outward steps that follow. Treat anything but +an explicit affirmative as no, and never bury a blocker in the summary. + +## The merge commit + +``` +{category} #{number} {title} ({contributors}) + +This PR was merged into the {branch} branch. + +Discussion +---------- + +{PR title} + +{PR body} + +Commits +------- + +{output of: git log {target}..pull/{N} --oneline} +``` + +- `{category}` is one of `feature`, `bug`, `minor`, `security`, `tidy` (see + below). The head line is load-bearing: release and changelog tooling parse + it, and maintainers grep history for `bug #`, `feature #` and PR numbers. +- `{contributors}` is the comma-separated list of unique commit authors, in + commit order, GitHub login preferred, raw author name as fallback. +- The second line varies: + - squashed: `This PR was squashed before being merged into the {branch} branch.` + - retargeted: `This PR was submitted for the {asked} branch but it was merged into the {branch} branch instead.` + - retargeted and squashed: `This PR was submitted for the {asked} branch but it was squashed and merged into the {branch} branch instead.` +- Security releases: the head becomes `security #cve-XXXX-NNNNN {title} + ({contributors})` and the message stops after the branch line. No + Discussion, no Commits, no notes: the details stay out of the repository + until the advisory is public. +- Every `@login` in the message is wrapped in backticks, so pushing the + commit does not ping the people mentioned in the discussion. +- The PR comments are attached to the merge commit as a git note under + `refs/notes/github-comments`, one block per comment: + `by {login} at {created_at}` followed by the body. Skip bot comments: + carsonbot and the CI bots add nothing worth archiving. + +## Categories + +The category decides whether the change appears in the CHANGELOG and +triggers a release. Suggest one yourself from the diff and the discussion, +with a one-line reason, as part of the pre-push summary; the user corrects +it there when needed. + +| Category | Meaning | +|---|---| +| `feature` | New feature, merged into the dev branch only | +| `bug` | Bug fix, merged into the oldest affected maintained branch | +| `minor` | Noteworthy change that is neither (new translations, generic types); still listed and released | +| `security` | Security fix with a CVE, merged during a coordinated release | +| `tidy` | Not worth a release: coding standards, CI, typos, test-only fixes | + +Some satellite repositories (ux, ai, twig, reprise) add `documentation`. + +## Gates + +Check these while preparing the merge and put the results in the pre-push +summary. Overriding a failed gate is always the user's decision, never the +skill's. + +- **Core team approval**: at least two `+1` and no standing `-1` among core + team members, counting GitHub reviews (approved is `+1`, changes requested + is `-1`) and comment votes (`+1`, `-1`, thumbs emoji). Votes by the PR + author do not count. The merger's own approval counts as one of the two + when the merger is on the team and did not author the PR. +- **Milestone matches the target branch**: a version milestone names the + branch the fix must land in (resolved through symfony.com/releases). On a + mismatch, either fix the milestone or retarget the merge (step 5). +- **The branch is still maintained**: no merging into a branch past end of + maintenance without an explicit decision. +- **CI**: check it in the background. It needs nothing from the working + tree, so start it first (`gh pr checks `, or the statuses and check + runs on the head SHA) and let it run while the other steps proceed. Triage + every failing job before the summary: a failure caused by the PR is a + blocker to report with evidence, a pre-existing or unrelated failure is + noted and moved past. fabbot and the static-analysis jobs are known + false-positive producers; ignoring them is fine when what they flag is + unrelated to the PR. Required checks still pending mean the verdict is not + in yet. One confirmation covers all jobs; never ask per job. + +Check the rest with `gh pr view --json reviews,milestone,baseRefName`. + +## The procedure + +`REMOTE` is `origin` here. `TARGET` is the branch being merged into, +`ASKED` the PR's base branch; they differ only when retargeting. + +1. **Preconditions.** The working tree is clean for tracked files + (`git status --porcelain --untracked-files=no` prints nothing). Start + the CI gate check in the background now. + +2. **Update the branches.** The local branch must not have diverged: + + ```bash + git fetch $REMOTE + git checkout $TARGET && git merge --ff-only $REMOTE/$TARGET + # when retargeting, the same for $ASKED + ``` + +3. **Fetch the PR head** into a local `pull/` branch: + + ```bash + git fetch -f $REMOTE refs/pull/$N/head:pull/$N + ``` + +4. **Squash when warranted.** A multi-commit PR from a single contributor is + squashed by default (branch-update merge commits made through the GitHub + UI do not count as a second contributor). A multi-author PR is merged + unsquashed to keep each author's commits, unless the commits carry no + meaning and the user agrees to squash across authors. A PR that contains + merge commits cannot be merged unsquashed: squash it, or rebase the merge + commits away first. The squashed commit keeps the first commit's author + and author date, and takes the PR title as its message: + + ```bash + git checkout pull/$N + base=$(git merge-base $ASKED pull/$N) # the PR is still based on $ASKED at this point + first=$(git rev-list $base..pull/$N | tail -1) + last=$(git rev-list $base..pull/$N | head -1) + author=$(git log -1 --format='%an <%ae>' $first) + date=$(git log -1 --format=%ad $first) + git reset --hard $first~ + git merge --squash $last + git commit -m "$PR_TITLE" --author="$author" --date="$date" + ``` + +5. **Retarget when merging into another branch than the PR asked:** + + ```bash + git rebase --onto $TARGET $ASKED pull/$N + ``` + + Remember that retargeting is a rewrite, not a copy: the review skill's + rules on expressing the fix in the target branch's shape apply. + +6. **Build the message** from the template above and write it to a file. + Generate the Commits section now, from the final shas: + `git -c color.ui=false log $TARGET..pull/$N --oneline`. + +7. **Merge without committing:** + + ```bash + git checkout $TARGET + git merge --no-ff --no-commit pull/$N + ``` + +8. **Commit** with the prepared message: `git commit --file=`. + +9. **Attach the notes** (skip for security merges and comment-less PRs): + + ```bash + git fetch -f $REMOTE refs/notes/github-comments:refs/notes/github-comments + git notes --ref=github-comments add --file= + ``` + +10. **Validate.** Run the test suites of the touched components + (`./phpunit src/Symfony/Component/`) whenever the merge involved a + rebase, a squash with conflicts, or anything beyond what CI already ran. + +11. **Stop for the single confirmation** described at the top: present the + summary, collect the CI verdict from the background check, and get one + go-ahead for everything that follows. + +12. **Sync the PR on GitHub when the head was rewritten** (squashed or + retargeted), before the upstream push, so GitHub can mark the PR merged + instead of closed. Only possible when the PR allows maintainer edits; + otherwise skip, and the PR will show as closed. When retargeted, change + the PR base first (`gh pr edit $N --base $TARGET`), then force-push the + rewritten head to the contributor's fork, guarded by the head SHA the PR + had: + + ```bash + git push --no-follow-tags --force-with-lease=$HEAD_BRANCH:$OLD_HEAD_SHA $FORK_SSH_URL pull/$N:$HEAD_BRANCH + ``` + + This is the only force-push in the whole process, and it never targets + the upstream repository. If it fails, restore the PR base. + + Before this push, `git log --oneline $REMOTE/$TARGET..pull/$N` must + list only the commits of the PR. GitHub lists every commit the new head + brings as a commit of the PR, and that list can't be fixed once the PR + is merged. + +13. **Clean up and push:** + + ```bash + git branch -D pull/$N + git push --no-follow-tags $REMOTE $TARGET refs/notes/github-comments + ``` + + Leave `refs/notes/github-comments` out when no note was added. + +14. **Close the loop on GitHub.** Thank the author with a one-line comment + (skip when the merger authored the PR, or for bots). Close the linked + issues: the `Issues` row of the PR header table (`Fix #NNNNN`) and + closing keywords in the body name them. GitHub auto-closes them only + when the merge lands in the default branch, which is the dev branch + here; a merge into any other branch leaves them open, so close each one + with a short comment naming the PR and branch that fixed it. For a + `feature` merged into symfony/symfony, open an issue on + symfony/symfony-docs, milestoned to the target version, linking the PR + and its authors, unless the PR body already links a real docs PR. + +## Conflicts and amending + +- To amend the PR before merging (a review fix, a changelog line), pause + after step 5 on the `pull/` branch, amend there, then continue with + step 6. +- When step 7 conflicts and the PR is editable, abort the merge and rebase + `pull/` onto the target instead: conflicts get resolved in the PR's + own commits, and the recorded merge stays conflict-free. Then redo step 7. +- Rebase onto `$REMOTE/$TARGET`, never onto a local merge that is not + pushed yet. When you merge several PRs in a row and one conflicts with an + earlier merge of the same series, push the earlier merges first (step + 13), then rebase onto the updated remote branch. +- When the PR is not editable, resolve inside the merge by hand and + continue. +- Amendments follow `pr-review-merge-prep`: keep the contributor's + authorship, amend into their commits, never a placeholder identity. + +## Verify before pushing + +```bash +git show -s --format=%B HEAD # message matches the template, category exact +git log -1 --format='%an <%ae> / %cn <%ce>' HEAD # merger as author and committer of the merge commit +git log --first-parent --oneline $REMOTE/$TARGET..$TARGET # exactly one new first-parent commit +git notes --ref=github-comments show HEAD # notes attached, when expected +``` + +The inner commits must keep the contributor as author. The committer of +rewritten inner commits is the merger; that is expected. + +## Hard rules + +- Never force-push to the upstream remote, never rewrite the target branch. + A merge adds exactly one merge commit on top of it. +- Never merge with a plain `git merge`: without the prepared message, the + archive value of the commit is lost and tooling cannot classify it. +- Never push with `--follow-tags`; local tags stay local. +- Never decide an override (a PR-caused CI failure, missing votes, an + unmaintained branch, a milestone mismatch, an unsquashable PR) without + asking; surface it in the pre-push summary. diff -Nru symfony-6.4.41+dfsg/.agents/skills/pr-review-merge-prep/SKILL.md symfony-6.4.49+dfsg/.agents/skills/pr-review-merge-prep/SKILL.md --- symfony-6.4.41+dfsg/.agents/skills/pr-review-merge-prep/SKILL.md 1970-01-01 00:00:00.000000000 +0000 +++ symfony-6.4.49+dfsg/.agents/skills/pr-review-merge-prep/SKILL.md 2026-10-28 18:15:18.000000000 +0000 @@ -0,0 +1,83 @@ +--- +name: pr-review-merge-prep +description: Principles for rigorously reviewing a pull request and making it merge-ready. Use when reviewing PRs (single or batched by milestone), verifying a submitted fix, retargeting a PR to another branch, or amending a contributor's work before merge. +--- + +# PR review and merge preparation + +## Reviewing + +- Re-derive the root cause from the code. Do not trust the PR title, the description or the author's branch analysis. Verify every claim yourself. Use small probe scripts when reasoning alone leaves doubt. +- Read the whole discussion before judging: the linked issue, the PR comments, the reviews and the inline comments. Compare each reviewer request with the current diff. Flag requests that were ignored or only partly applied. +- Challenge every added public or protected method, property, option, parameter and class. Write the use case with the API that already exists, and run it. Accept the addition only when that attempt fails, or only succeeds through internals the component does not promise to keep. An alternative that runs is not automatically a refusal: weigh whether a user would find it, what it forces them to get right by hand, and what it reports when it fails. Saving a few calls is not a reason: public API is carried for a whole major version, and a shortcut added today constrains every later change. Apply the same test to the API you add yourself during merge prep, and run it before making the pull request ready, not after. +- Report that attempt whichever way it went. When it failed, the report is what justifies the addition, and it is what makes the decision survive the discussion. When it succeeded, close with the working snippet rather than the refusal alone, so the author leaves with a solution instead of a no. +- Give the same scrutiny to changed behavior of existing public API. It is riskier than an addition, because nobody opts into it: establish what depends on the current behavior before accepting the change. A diff that edits existing fixtures or expectations to make them pass is announcing such a change; treat that as the signal rather than as housekeeping. +- Revert-verify every new test: put the changed source back in its base state, keep the tests, and confirm they fail with the expected error, not another one. A test that also passes on base protects existing behavior; it does not prove the fix. Be clear about the role of each test. +- Undo a revert-verify without destroying the working tree. `git checkout -- ` writes the base version to the index as well, so restoring with `git checkout -- ` reads back from that index and silently discards every fix made during review. Commit or amend first and restore with `git checkout HEAD -- `, or copy the files aside and put them back by hand. Confirm with `git diff --stat` before trusting the next test run. +- Use three-state verification to judge a rework: base (bug present), PR as submitted (what it really does), final (fixed). Run the same checks in the three states. The pattern of failures across the states is the proof. +- Validate the test harness before trusting it: run it on the known-broken state and watch it fail. A check that cannot tell "read the right thing" from "fell back to a default" proves nothing. Give each outcome its own marker. +- Check the branch target in both directions. Find the commit that introduced the flaw and probe the older maintained branches directly. Bugfixes go to the oldest affected maintained branch. Behavior changes and features go to the dev branch, and a released X.Y is not the dev branch anymore. The reported symptom and the underlying flaw can have different oldest branches: check both. +- A config tree must not depend on anything external. Reject a `Configuration` class, a `configure()` method or a security factory `addConfiguration()` that reads container parameters (`kernel.debug`), env vars, another extension's raw config or machine state (`extension_loaded()`, `isSupported()`) into node defaults, normalization or validation: the same tree must come out whatever the environment or the machine, because `config:dump-reference`, `config/reference.php` and `config/schema.json` are generated from it. Such a default belongs in the extension, behind a `defaultNull()` node whose `info()` names the fallback, or behind a static `'%kernel.debug%'` default that the extension resolves. +- Generated files must be reproducible. The same sources at the same path must give the same bytes, whatever the machine, the clock or what else the process did before. This covers the dumped container and its service ids, the output of cache warmers, compiled templates and `.meta` files. Reject a change that puts any of the following into them, or into a hash used as an id or a file name: the current time, random bytes, `spl_object_id()`, a static counter, a file mtime or inode, or an order that comes from the filesystem (a `Finder` without a sort, `RecursiveDirectoryIterator`, `glob()` with `GLOB_NOSORT`). Take the build time from the `container.build_time` parameter, never from the clock. Keep absolute paths out of hashed ids, and make generated paths relative to the project or build directory where the generated code allows it, as the container dumper does. When a freshness check needs filesystem state, keep that state out of what is written without debug, and out of what is written when `SOURCE_DATE_EPOCH` is set. To settle a doubt, build the same app twice, once from a copy at another path, and diff the two `var/cache/prod` directories. +- List the edge cases and run them. Do not accept plausible reasoning when a probe can answer: nullable, union and interface types, empty input, recursion, encodings, interaction with sibling state. +- Check every symbol the change borrows from another package against that package's declared version constraint. A symbol added in the current release cannot be satisfied by the oldest version the constraint allows, so the call site needs an existence guard, or the test belongs in the package that owns the code. The lowest-dependency job is only the symptom: the same code is broken at runtime for anyone on that older version. +- Test composition: rebase onto the current base tip and rerun. When sibling PRs touch the same area, also run the combined result. +- Account for every failing CI job: reproduce it when possible and classify it as caused by the PR or pre-existing. A red job nobody can explain is a finding. When comparing against a baseline run, check its date and not only its conclusion: a branch tip that saw no push for hours keeps a stale green run, while CI installs current dependencies on every run, which makes an unrelated change look like the regressor. +- Before blaming the PR for a failure, reproduce the failure on the base branch. Local environments have pre-existing failures. +- Check documentation duties in both directions: a behavior change needs its changelog and upgrade entries, and a plain bugfix must not carry entries that belong to feature branches. Check that the entry sits in the unreleased section. Contributors routinely file it under a version that already shipped, because that was the branch they opened against, and it is the most common single defect in the backlog. +- Test at the layer where the defect lives. Assertions on intermediate state (service wiring, generated config) cannot catch a bug that only appears in a later phase (compiled container, runtime, a real tool run). When the bug lives there, the test must go there. + +## Batch review + +- To review many PRs (for example a whole milestone), run one subagent per PR, each in its own git worktree. Parallel runs must never share mutable state. +- Fetch all PR heads first, in one command, into stable refs outside `refs/heads/`, such as `refs/reviews/pr-`. Agents must not depend on `FETCH_HEAD`. +- Disable checkout hooks inside worktrees. Share the main checkout's dependency directory only when every PR targets the same branch, agents never write to it, and nothing installs into the source checkout while they work: an installer that rewrites the autoloader in place propagates through hardlinked copies and breaks every worktree at once, while the source stays healthy. Otherwise give each worktree its own install. Prime shared test-runner caches once, before starting the agents. +- Never let agents touch the main checkout; treat it as owned by the user, along with the branch namespace it works in. Worktrees check out detached: a branch checked out in a worktree is locked for the whole repository, so the user can no longer fetch into it or check it out, and the failure surfaces in their session rather than in the agent's. Review and merge-prep need no branch of their own, since commit, amend, rebase, cherry-pick and push all work on a detached HEAD. +- Give every agent the same brief: the full single-PR standard above plus the batch-wide checks (branch target, composition with sibling PRs), returning a structured report with verdict, root cause, branch conclusion, and findings with evidence. +- When an agent stalls or dies, resume it with a message restating where it was and which constraints apply; do not restart the review from scratch. + +## Making it merge-ready + +- Preserve the contributor's authorship: amend into their commit, or rebuild their commits with the same author. Keep a commit structure that has meaning, such as a tests-then-fix pair. Update the commit message to cover what was added; a message must always match its diff. +- Authorship is two fields. Amending keeps the author and rewrites the committer, and the committer is what the forge shows next to the commit and what stays in public history. Never pass a placeholder identity to `git commit` or `git rebase`: the repository's configured identity is already the right one. Check with `git log -1 --format='%an <%ae> / %cn <%ce>'` before every push, because merged history cannot be fixed. +- Fixes added during review follow the same TDD rule as the original bug: failing test first, then the fix. +- Retargeting to another branch is a rewrite, not a copy: express the fix in the target branch's code shape and conventions (available APIs, test style, annotations or attributes, tool versions). Rebuild tests that depend on things the target branch lacks. Record the known merge-up resolution for the higher branch in the pull request description, under a `Merge-up to :` paragraph, so the merger does not have to rediscover it. +- When the rework sits in local commits on top of the contributor's, squash before rebasing. Otherwise the rebase replays the original commit first and raises conflicts against content the rework already replaced. +- A conflict-free rebase can still produce broken code: an import the source branch happened to have, a test runner that ignores newer test syntax. The test run decides, not the rebase. +- Rebase onto the current base tip and confirm the parent commit equals it. Check again just before pushing: active repositories move. Run rebases and merges non-interactively (`GIT_EDITOR=true`). +- A clean local style run is necessary, not sufficient. The hosted check can be a superset of the local tool, and it lints every file the PR touches, including lines the PR did not write, so pre-existing debt in a touched file becomes this PR's failure. Judge the local tool by its exit code: output formats vary, and a grep for its listing can report clean while the tool found issues. +- Read the reports of static analysis and style tools as hints, not as verdicts. They match patterns, they do not know what the code means, and false positives are normal. Never add an annotation, a cast or any other contortion whose only purpose is to silence a tool, and never patch a line the pull request does not touch to make a check pass. Judge each report by what the code does at runtime, and say so when the right answer is to leave the check red. +- Run scoped tests while iterating and the full suite of each touched component before calling it done; never run the whole monorepo at once. Suites are addressed by path: `./phpunit src/Symfony/Component/`, and the same form for `src/Symfony/Bridge/` and `src/Symfony/Bundle/`, while everything under `src/Symfony/Contracts` is a single suite. Check static analysis and lowest-dependency jobs when the change can affect them. If an assertion depends on the installed dependency version, use feature detection instead of assuming one version. +- Retarget before pushing, never after. CI reads the base branch from the pull request event at push time, so pushing a branch rebased onto a new base while the PR still points at the old one makes every job diff against the wrong branch: a diff of thousands of files, style checks on code the PR never touched, and a wall of red that a three-file change cannot explain. Rerunning does not help, since the event is unchanged. +- Push to the PR's real head with an explicit `HEAD:` refspec, since the work happens on a detached HEAD. The fork's repository name can differ from the upstream one; query it. +- Update the PR's metadata to match what it has become: title and component prefix, header table, description, labels, base and milestone. On a PR that sat, the `Branch?` row names a branch that has since shipped, the description keeps wording the review already corrected, and the component prefix can name the wrong package. Leave exactly one status label, and none the diff no longer justifies. +- Treat the description as the first draft of the documentation, not as a review log. Write it for someone who never saw the discussion: what the feature does, the public API it adds, the options and their defaults, which choice to make when, and the traps. For a feature, end with the points the documentation must carry, so whoever opens the symfony-docs pull request does not have to reconstruct them from the diff. +- Apply corrections instead of suggesting them. The branch is being rewritten anyway, so a review comment asking for a one-line change is a pointless round trip. This covers the contributor's own code comments and test names when they describe something the code does not do. +- Routine merge prep needs no comment at all: a rebase, a changelog fix, a constraint bump and a style fix are all visible in the diff. Comment when the reader has to decide or react. +- Put what changed during review in a new comment instead. Those notes matter to the people following the thread and stop mattering once it merges, while the description outlives it. +- Keep changelog entries to one line each, naming the new public surface and nothing more. Reasoning, comparison tables and usage guidance belong in the documentation. A changelog entry that has to explain itself is a sign the documentation entry is missing. +- Apply the house rules to inherited content too: when amending someone else's commit, remove what the rules forbid instead of keeping it. Scan the added diff lines for violations before pushing. +- Finish on GitHub: post review feedback as a real review with evidence, close replaced issues with a factual explanation, and correct wrong claims left in threads. +- When closing on the merits, state the decision and the reason and stop. Do not invite a fresh pull request, since that reopens the same discussion under a new number. When closing a stale pull request nobody rejected, a short line welcoming a fresh take is the right tone instead. + +## House rules + +- Write code comments sparingly, only where they add value the code cannot express. A test method or a test helper carries no docblock and no comment narrating it: its name and its assertions say what it checks. The comment that stays in a test is the one saying why a fixture looks wrong on purpose. Never reference issues or pull requests in code or tests. +- A prose docblock opens with one line that summarizes, then a blank line, then the details. Before reshaping a comment into that form, ask whether it should exist at all. +- Do not wrap prose at a column. A line ends where a sentence, a paragraph, a list item or a code sample ends, and a sentence stays on one line unless it runs very long, in which case it breaks where a clause ends: a line break has to mean something, and a column count is not a meaning. The same holds for a `@param` description. +- Use TDD for every fix: failing test first, implementation second, full suite of the touched component last. +- No em-dashes, no `Co-Authored-By` trailers, no credit to AI tools anywhere: code, commit messages, PR titles and bodies, review comments, issue comments. +- Keep a factual tone in everything published: findings and evidence, no self-promotion, no filler. +- Never apologize for a late or missing review. Thank the author for their patience and stop there. Do not editorialize about the project's failure to review; credit what the author did well instead. +- Comments are published under the maintainer's own account, so write their past review comments in the first person and everyone else's in the third. +- Private methods go at the end of the class, after all public and protected ones. Do not move existing ones in the same patch. +- Do not call a Symfony or third-party method or constructor with PHP named arguments, in a patch you write or in one you review. Parameter names are outside the backward compatibility promise except for the constructors of attribute classes (note 10 of https://symfony.com/doc/current/contributing/code/bc.html), so a renamed parameter breaks such a call in a minor release. Pass the intermediate defaults explicitly to reach a later optional parameter. Named arguments stay fine for attribute constructors and for PHP's own functions, whose parameter names are part of the language. +- Use plain English: common words, short sentences, one idea per sentence. Avoid idioms, cultural references and rare vocabulary. Most readers are not native speakers. + +## Reporting + +- Lead with the verdict. Then list findings ranked by severity, each with its evidence: what was run, on which state, and the exact failure text. +- Separate regressions from pre-existing gaps, and blockers from polish. Say which findings the merger must act on. +- State what was not covered as plainly as what was. +- In a batch, relay each verdict as soon as it lands. When all reports are in, give a summary table: one line per PR with its verdict and target branch. +- For the detailed pass, present one PR at a time and wait for a go-ahead keyword (such as "next") before the following one. This keeps each review open for discussion and lets fixes happen before moving on. diff -Nru symfony-6.4.41+dfsg/.agents/skills/security-triage/SKILL.md symfony-6.4.49+dfsg/.agents/skills/security-triage/SKILL.md --- symfony-6.4.41+dfsg/.agents/skills/security-triage/SKILL.md 1970-01-01 00:00:00.000000000 +0000 +++ symfony-6.4.49+dfsg/.agents/skills/security-triage/SKILL.md 2026-10-28 18:15:18.000000000 +0000 @@ -0,0 +1,175 @@ +--- +name: security-triage +description: > + Triage a reported security finding into a disposition: a private CVE + (coordinated disclosure + advisory), a public hardening PR (fix in the open, + no CVE), or not-a-security-issue (reply to reporter). Assigns severity and + affected maintained branches, and routes to the next step. Use when the user + says "does this need a CVE", "CVE or hardening", "triage this report", "is + this a security issue", "classify this finding", or "how should we disclose this". +--- + +# Symfony Security Triage + +Decides how a finding is handled, not whether the code is wrong. It complements +`symfony-security-review` (which finds missing hardening) by making the disclosure +call on a report. + +The three dispositions and the conventions that record them: + +| Disposition | Label | Branch prefix | Process | +|---|---|---|---| +| **CVE** | `Has CVE` + severity | `cve-*` | Private fix, GHSA/CVE, credit, blog post, coordinated release | +| **Public hardening** | none / `Not a security issue` | `harden-*`, `hardening-*`, `pin-*`, `fix-*` | Normal open PR, changelog, no embargo | +| **Not a security issue** | `Not a security issue` / `Won't fix` | n/a or `fix-*` | Reply to reporter; optionally a doc/robustness PR | + +This skill produces a recommendation. The final call belongs to the Symfony security +team; treat its output as a structured argument, and defer to `symfony.com/security` +for the authoritative "what is not a vulnerability" list. + +## Progress checklist + +- [ ] Step 0: Establish the facts (reproduce, scope, trust model) +- [ ] Step 1: Apply the disposition decision tree +- [ ] Step 2: Assign severity and affected maintained branches +- [ ] Step 3: Route (branch prefix, labels, next workflow, reporter reply) + +## Confirmation rule + +Whenever this skill says **"Wait for confirmation"**, treat anything other than an +explicit affirmative as **no**: stop and ask the user how they want to proceed. + +--- + +## Step 0 — Establish the facts + +Before classifying, pin down four things. Guessing any of them produces a wrong call. + +1. **Reachability**: is the vulnerable code on a path reachable from untrusted input in + a default configuration, or does it need opt-in/insecure config? +2. **Actor and precondition**: what must the attacker already have? Unauthenticated and + remote is the worst case; "already controls the serialized bytes" or "already has the + app secret" usually means the precondition is itself game-over. +3. **Impact**: RCE, auth/authz bypass, SSRF to internal, signature/secret bypass that + accepts forged input, XSS on a default-rendered surface, secret disclosure, open + redirect, session fixation, or "only" DoS / info of low value. +4. **Contract**: is the component meant to defend this boundary (router, + HttpFoundation/HttpClient, Security, webhook verification, HtmlSanitizer, Mime + parsing), or is the unsafe behaviour documented as the caller's responsibility + (deserializing untrusted bytes, a trusted-channel feature such as ESI, + `template_from_string`)? + +Reproduce if at all possible; an unreproducible report is not yet triable. + +## Step 1 — Disposition decision tree + +Apply in order. The first matching bucket wins. + +### It is **not a security issue** if any of these hold +- **Pure DoS / resource exhaustion.** Generally excluded from the CVE pipeline. Fix as + hardening with a limit if cheap, but no CVE. +- **Requires misuse contrary to documentation**, with no default-config attack. The + component is not contracted to defend this (e.g. deserializing untrusted bytes through + an API documented as trusted-only; using a trusted-channel feature to reach internal hosts). +- **Dev-only tooling** (profiler, debug, web-profiler) manifesting only in a dev environment. +- **Precondition is already game-over** (attacker already holds the app secret, controls + the deserialized input contract, or has local/physical access). +- **Not reproducible**, or rooted in a third-party dependency outside Symfony's control. +- **Not a realistic bypass** (a comparison nuance with no working exploit, etc.). + +### It is a **CVE** only if **all** of these hold +1. **Default-reachable**: exploitable against a default or documented-safe config. +2. **Expected actor**: the attacker is at or below the trust level the boundary is + meant to enforce (typically unauthenticated/remote, or a lower-privileged user + escalating), with no game-over precondition. +3. **Contracted boundary**: the component is meant to defend this (see Step 0.4). +4. **Real impact**: RCE, auth/authz bypass, SSRF to internal, sanitizer/signature + bypass accepting forged input on a sensitive sink, stored/reflected XSS on a default + surface, secret disclosure, or open redirect with meaningful reach. +5. **Maintained**: the vulnerable code ships in a maintained version. + +### Otherwise it is **public hardening** +A genuine improvement where a CVE condition fails. Typical shapes: +- **Defense-in-depth** on top of an existing control, or that only matters once another + bug already holds (an `__unserialize` `__toString` trampoline guard needs a pre-existing + untrusted `unserialize()` entry to matter). +- **Safer-default change** where the old default was not a vulnerability under the + threat model (adding a webhook IP allowlist, pinning the HMAC algorithm). +- **Limited impact or exposure** even though a boundary is technically crossed (a forged + webhook against an opt-in endpoint with a user-configured secret injects only a + delivery-status event). +- **Robustness** improvements (input-length caps, broader sanitizer coverage). + +## Step 2 — Severity and affected branches + +**Severity** (match the `low`/`medium`/`high` labels; CVSS is a sanity check, not the goal): +- **high**: unauthenticated RCE, auth bypass, full sanitizer bypass enabling stored XSS, SSRF reaching internal services. +- **medium**: reflected XSS, open redirect, signature bypass with bounded impact, info disclosure of non-trivial data. +- **low**: defense-in-depth, narrow-config or low-impact issues, most hardening. + +**Affected branches**: find the oldest version where the vulnerable code exists, intersect +with `maintained_versions` from `https://symfony.com/releases.json`. Fix on the lowest +maintained affected branch, then merge up (see the `merge-up` skill). Record the +oldest exposure even if it predates maintained versions. + +## Step 3 — Route + +State the recommendation as: **disposition + severity + affected maintained branches + +the one-line rationale (which decision-tree conditions decided it)**, then route: + +- **CVE**: name the branch `cve--`; apply `Has CVE` + severity; the fix is + prepared privately and goes through the coordinated-disclosure process (request a + GHSA/CVE, credit the reporter, prepare the security release and blog post). Do **not** + open a public PR or push to a public remote before release. **Wait for confirmation** + before any outward step. +- **Public hardening**: name the branch `harden-`/`hardening-`/`pin-`/`fix-`; open a + normal PR with a CHANGELOG entry; use `symfony-security-review` to confirm the fix and + `hardening-rule` to add a durable gate where the class recurs. +- **Not a security issue**: draft a short, factual reply to the reporter explaining why + (cite the contract/threat-model reason), and optionally a doc clarification or + low-priority robustness PR. Apply `Not a security issue` / `Won't fix`. + +In every case, the fix follows TDD, component-scoped tests, no em-dashes, +no Claude/Anthropic credit, comments sparingly, no issue references in code. + +--- + +## Worked examples (abstracted patterns) + +| Finding shape | Disposition | Deciding factor | +|---|---|---| +| SSRF filter (private-network client) bypassed in a default configuration | **CVE** | default control bypassed, unauthenticated reach | +| HTML sanitizer lets a `javascript:` URL through on a default profile | **CVE** | sanitizer's core contract bypassed, stored XSS | +| URL generator emits a path that crosses a routing boundary by default | **CVE** | boundary crossed in default use | +| A signed transport decodes the payload before verifying its MAC | **CVE candidate, high** | pre-auth RCE if signing is meant to defend a malicious broker; confirm the trust model | +| Webhook signature compared with `!==`, or the secret is ignored | **Hardening** | opt-in endpoint, user-configured secret, bounded impact | +| `__unserialize` assigns a string property without a `\Stringable` guard | **Hardening** | needs a pre-existing untrusted `unserialize()` entry (game-over precondition) | +| Input-length cap / broader sanitizer coverage added | **Hardening** | robustness, not a default-exploitable bypass | +| Unbounded recursion / regex backtracking / cache growth on input | **Hardening, low** | pure DoS, excluded from the CVE pipeline | +| Deserializing bytes through an API documented as trusted-only | **Not a security issue** | documented contract, caller's responsibility | +| A trusted-channel feature (e.g. ESI/SSI) used to reach internal hosts | **Not a security issue** | trusted by design | +| Case-insensitive host allowlist with no working bypass | **Not a security issue** | not a realistic bypass | + +## Gotchas + +- **"Boundary crossed" does not imply CVE.** Impact and exposure decide it. A forged + webhook against an opt-in, user-secret endpoint is hardening; an SSRF filter bypass in + default use is a CVE. +- **DoS is the most common miscategorisation.** Resource exhaustion is hardening/low, + not a CVE, even when trivially triggerable. +- **Defense-in-depth tells.** If exploiting the finding requires another, already-present + vulnerability or a leaked secret, it is hardening. +- **Trust-model questions are for the maintainer.** A signed-transport verify-order case + turns on whether the broker is trusted; surface the question, do not assume. +- **Embargo discipline.** Never name a CVE-bound finding, push a `cve-*` branch, or open a + public PR for a CVE-class finding before the coordinated release. **Wait for confirmation.** +- **Defer to authority.** `symfony.com/security` is the source of truth for what is not a + vulnerability; this skill encodes observed practice, not policy. + +## Error handling + +- If reachability or trust model is unknown, say so and triage as needs-human-judgement; + do not force a disposition. +- Security reports are handled privately. Do not echo report contents into public + artifacts, commit messages, or branch names that leak the vulnerability before release. +- Never push to a public remote during CVE triage. Stop and hand back to the user. diff -Nru symfony-6.4.41+dfsg/.agents/skills/symfony-merge-up/SKILL.md symfony-6.4.49+dfsg/.agents/skills/symfony-merge-up/SKILL.md --- symfony-6.4.41+dfsg/.agents/skills/symfony-merge-up/SKILL.md 2026-05-27 08:23:35.000000000 +0000 +++ symfony-6.4.49+dfsg/.agents/skills/symfony-merge-up/SKILL.md 1970-01-01 00:00:00.000000000 +0000 @@ -1,207 +0,0 @@ ---- -name: symfony-merge-up -description: > - Cascade-merge maintained Symfony branches from oldest to newest (e.g. - 6.4 → 7.4 → 8.0 → 8.1). Use when the user says "merge branches", - "merge up", "cascade merge", "sync branches", or "update branches". ---- - -# Symfony Branch Cascade Merge - -Merges each maintained branch into the next one, from oldest to newest. - -## Progress checklist - -- [ ] Step 0: Pre-flight checks -- [ ] Step 1: Fetch maintained branches and pull them -- [ ] Step 2: Cascade merge loop - ---- - -## Confirmation rule - -Whenever the skill says **"Wait for confirmation"**, treat anything other than an -explicit affirmative as **no**: stop and ask the user how they want to proceed. - ---- - -## Step 0 — Pre-flight checks - -```bash -git status --porcelain --untracked-files=no -``` - -If any output, **stop**: -> "The working tree is not clean. Please commit or stash your changes first." - ---- - -## Step 1 — Fetch maintained branches and pull them - -### 1a. Get the branch list - -```bash -curl -s https://symfony.com/releases.json -``` - -Read `maintained_versions`. It is already sorted oldest → newest (e.g. -`["6.4", "7.4", "8.0", "8.1"]`). Store as `BRANCHES`. - -### 1b. Pull every branch - -For each branch in `BRANCHES`: - -```bash -git checkout -git pull --ff-only origin -``` - -Using `--ff-only` ensures local branches haven't diverged from origin. If the -pull fails, **stop** and report the error. - ---- - -## Step 2 — Cascade merge loop - -For each consecutive pair `(SOURCE, TARGET)` in `BRANCHES`: - -### 2a. Merge - -```bash -git checkout -composer up -git merge -``` - -Three outcomes are possible: - -- **Already up-to-date:** print "✓ `` already up-to-date with ``" - and skip to the next pair. -- **Clean merge (no conflicts):** git creates the merge commit automatically. - Proceed directly to step 2c. -- **Conflicts:** proceed to step 2b. - -### 2b. Resolve conflicts (only when git reports conflicts) - -List conflicts: - -```bash -git diff --name-only --diff-filter=U -``` - -Read each conflicted file, resolve it, then `git add` it. When all are resolved: - -```bash -git commit --no-edit -``` - -#### Conflict resolution rules - -| File pattern | Strategy | -|---|---| -| `CHANGELOG*.md` | Keep entries from both sides; newer branch entries on top | -| Version constants, `composer.json` branch aliases | Keep the TARGET branch value | -| Code files | Merge logically based on context; when unsure, ask the user | - -#### Legacy tests across major versions - -When merging from one major version to the next (e.g. 6.4 → 7.0), remove test -methods marked with `@group legacy` or `#[Group('legacy')]`. The deprecations -they cover have been removed in the new major version, so the tests are no -longer relevant. - -After resolving, show `git diff HEAD~1` (first parent of the merge commit, i.e. -the previous TARGET state) and wait for the user to confirm the resolution looks -correct before proceeding. - -### 2c. Run tests for affected components - -Extract component, bridge, and bundle names from changed files: - -```bash -git diff --name-only HEAD~1..HEAD -``` - -Paths look like `src/Symfony/{Component,Bridge,Bundle}//...`. Deduplicate, -then run tests for each: - -```bash -./phpunit src/Symfony/Component/ -./phpunit src/Symfony/Bridge/ -./phpunit src/Symfony/Bundle/ -``` - -For files under `src/Symfony/Contracts/`, run the single shared test suite: - -```bash -./phpunit src/Symfony/Contracts -``` - -Ignore files outside these directories (root configs, `.github/`, etc.): they -don't have component-level test suites. - -If tests fail or report PHPUnit deprecations (the PHPUnit version may differ -between branches), first check whether the failure is pre-existing: run the same -test on the TARGET branch before the merge (`git stash && git checkout HEAD~1` -or check CI). Only fix failures introduced by the merge: -1. Analyze and fix the code, including any PHPUnit deprecation notices. -2. Commit the fix: `[] Fix merge conflict resolution`. -3. Re-run failing tests until green and deprecation-free. - -Report any pre-existing failures to the user without attempting to fix them. - -### 2d. Ask for confirmation before pushing - -Show: - -``` -Merge: → -Affected: -Tests: all passing - -Commits since origin/: -git log --oneline origin/.. - -Ready to push? (yes / no) -``` - -**Wait for confirmation.** The user may make changes themselves before confirming. - -### 2e. Push and continue - -```bash -git push origin -``` - -If the push fails, **stop** and report the error. - -Print "✓ `` → `` done." and continue to the next pair. - ---- - -## Final summary - -``` -All merges complete: - 6.4 → 7.4 ✓ - 7.4 → 8.0 ✓ - 8.0 → 8.1 ✓ -``` - ---- - -## Gotchas - -- `CHANGELOG.md` conflicts are the most common; entries must be kept from both - sides, never dropped. -- A merge can introduce test failures even without conflicts, because behavior - from the older branch may be incompatible with newer code. Always run tests. -- Some components have slow test suites. Only run tests for components with - changed files, not the entire project. - -## Error handling - -- **Never** force-push or rewrite history. -- **Never** use `--no-verify` on commits. -- **Never** auto-recover from a failed `git push` or `git pull`. Stop and hand - control back to the user. diff -Nru symfony-6.4.41+dfsg/.agents/skills/symfony-security-review/SKILL.md symfony-6.4.49+dfsg/.agents/skills/symfony-security-review/SKILL.md --- symfony-6.4.41+dfsg/.agents/skills/symfony-security-review/SKILL.md 1970-01-01 00:00:00.000000000 +0000 +++ symfony-6.4.49+dfsg/.agents/skills/symfony-security-review/SKILL.md 2026-10-28 18:15:18.000000000 +0000 @@ -0,0 +1,238 @@ +--- +name: symfony-security-review +description: > + Review a change (a PR, the current branch diff, or a set of files) or audit a + component or the whole tree for missing or incorrect security hardening. Reasons + about trust boundaries from first principles, then checks the code against + Symfony's hardening-invariant families and runs the .github/sa-tools gates. Use + when the user says + "security review", "security audit", "check hardening", "review this PR/branch + for security", "audit for ", "is any hardening + missing", or names a vulnerability class to hunt for. +--- + +# Symfony Security Review + +Finds hardening that is missing or wrong, grounded in code. It runs in two modes: + +- **Review a change** (default): a PR, the current branch vs its base, or named files. +- **Audit a target**: a component path or the whole `src/` tree, for one or all families. + +Both modes run two passes: first reason about the change's trust boundaries from first +principles (to catch novel issues), then check it against the hardening-invariant families +catalogued in [`hardening-families.md`](hardening-families.md). The catalogue is a checklist +of known classes, not the search space. + +## Scope and non-goals + +- This skill **spots** missing hardening. It does not triage an incoming report + end to end, assign a CVE, or merge a fix. Those are separate workflows. +- **Every finding must point at a real sink** (a concrete file and line). No + speculative findings. A family with no sink in scope is not in scope; but a sink that + matches no family is still in scope (that is what Step 1 is for). +- Respect the decision boundaries in the catalog: several plausible-looking + shapes were ruled "not a security issue". Do not raise those. + +## Progress checklist + +- [ ] Step 0: Pick mode and resolve the scope +- [ ] Step 1: First-principles boundary pass (open-world) +- [ ] Step 2: Map to families (known-class checklist) +- [ ] Step 3: Run the automated gates +- [ ] Step 4: Manual per-family review +- [ ] Step 5: Report findings + +## Confirmation rule + +Whenever this skill says **"Wait for confirmation"**, treat anything other than an +explicit affirmative as **no**: stop and ask the user how they want to proceed. + +## Parallelism (large audits only) + +When auditing the whole `src/` tree or a large multi-file component, fan Step 1 and Step 4 +out to subagents: one per family, or one per file-batch, each returning findings that point +at a concrete file and line (no speculative findings leaking in through parallelism). Keep +the rest in the main loop: aggregation, de-duplication, the completeness check, and the +report are synthesis and must see every finding at once. For a single PR or a small diff, +run every step inline; subagents are pure overhead there. + +--- + +## Step 0 — Pick mode and resolve the scope + +**Review a change.** Resolve the diff and the changed non-test files: + +```bash +# A public PR +gh pr diff --repo symfony/symfony +# The current branch against its base (e.g. 6.4) +git diff ...HEAD --stat +``` + +**Audit a target.** Take a component path (e.g. `src/Symfony/Component/Mailer`) +or the whole `src/` tree. There is no diff; the "changed files" are the target files. + +In both modes, build the file list and **drop tests** (`*/Tests/*`). Hardening +lives in the implementation; tests are checked separately in Step 3. + +State the resolved mode and scope back to the user in one line before continuing. + +## Step 1 — First-principles boundary pass (open-world) + +This pass finds what the catalogue does not list. Do it before mapping to families, and do +not let the anchors narrow it. For each file in scope, reason as an attacker, independent of +any known family: + +1. **Inputs**: what untrusted data can reach this code? Request (query/body/headers/cookies), + uploaded files, environment, a broker/message payload, a stored blob later deserialized, a + webhook, a third-party API response, a database value that was originally user-set. +2. **Flow**: follow each input to where it is used. Does it reach a sink (filesystem, process, + SQL, deserialization, object construction, HTML output, a redirect, an XML/URL parser, a + comparison of a secret)? +3. **Boundary**: which trust boundary does it cross, and who is the expected actor + (unauthenticated, lower-privileged, a malicious broker)? +4. **Worst case**: if the attacker fully controls the input, what is the maximum impact? + State it concretely (RCE, auth bypass, SSRF, file read/write, XSS, info leak). + +Record every input-to-sink path with a non-trivial worst case as a candidate finding, +**whether or not it matches a catalogued family**. An unguarded path from untrusted input to +a dangerous sink is a finding even if no anchor names it. This step uses no greps by design; +it is meant to see sinks the dictionary misses. + +## Step 2 — Map to families (known-class checklist) + +Now apply the catalogue as a checklist, to confirm no *known* class slipped past Step 1. +**Treat each anchor's listed APIs as seed examples of an abstract role** (an inbound +authenticator, a secret comparison, a deserialization entry, an XML/URL sink, a file or +process sink); extend to anything in scope that plays that role, including classes the grep +does not name. + +For each file in scope, decide which families it touches using the grep anchors in +[`hardening-families.md`](hardening-families.md). Run the anchors against the scope, not +the whole tree, when reviewing a change: + +```bash +# Example: which families does this branch touch? +git diff ...HEAD --name-only | grep -v /Tests/ > /tmp/scope.txt +grep -lf <(printf 'extends AbstractRequestParser\nfunction __unserialize\nhash_hmac(\nvalidateOnParse\nloadXML(\nescapeshellarg(\npreg_match') $(cat /tmp/scope.txt) 2>/dev/null +``` + +Carry forward both Step 1's boundary findings and the families with a sink in scope; they +proceed to Step 4. List them. + +## Step 3 — Run the automated gates + +These encode the already-shipped invariants. Run them first; anything they catch +needs no manual argument. + +**Hardening-test convention** (tokenizer only, always runs locally): + +```bash +php .github/sa-tools/check-hardening-tests.php +``` + +Fails if a concrete `AbstractRequestParser` lacks a `RejectWebhookException` test, +or a class with `__unserialize()` and a string property lacks a `__toString` +gadget test. Accepted gaps live in its `ALLOWLIST` const. + +**Custom PHPStan rules** (`HardenedComparisonRule`, `UnserializeToStringTrampolineRule`, +`UnserializeMissingAllowedClassesRule`). In CI these run base-vs-PR through +`phpstan-diff.php`, which only fails on errors **new to the PR**. To reproduce +locally you need PHPStan installed (it is not in `composer.json`; CI installs it +ad hoc). The source of truth for a rule's logic is a `RuleTestCase`, **not** an +ad-hoc `phpstan analyse` run: + +```bash +# Only meaningful if phpstan is installed in the project +./vendor/bin/phpstan analyse --error-format=json --no-progress \ + --autoload-file=.github/sa-tools/rules/bootstrap.php +``` + +Do **not** trust raw `phpstan analyse` counts for these rules: the result cache +plus parallel workers make them nondeterministic (a rule can report 0 then N for +the same input). See the gotchas. + +## Step 4 — Manual per-family review + +For each in-scope family, apply its invariant from [`hardening-families.md`](hardening-families.md). +The catalog gives, per family: the grep anchor, the invariant, the automated +coverage (if any), and the decision boundary. + +Work the sinks, not the families in the abstract: for every sink site the anchor +found, answer the family's check question. If the answer is "no guard / wrong +guard", it is a candidate finding; confirm it is not excluded by the decision +boundary before reporting. + +## Step 5 — Report findings + +Output a table, highest severity first: + +| Location | Family | Severity | Invariant at risk | Suggested hardening | Hardening test | +|---|---|---|---|---|---| +| `Component/.../Foo.php:NN` | webhook-verify | High | signature compared with `!==` | `hash_equals()` | extend parser reject test | + +**Severity rubric** (match the corpus, not CVSS theatre): + +- **Critical**: pre-auth RCE or full auth bypass (e.g. verify-after-deserialize, gadget chain). +- **High**: conditional RCE, SSRF, signature/secret bypass, XXE with file read. +- **Medium**: stored/reflected XSS, open redirect, sensitive info leak. +- **Low**: DoS / resource exhaustion / defense-in-depth only. +- **Not a finding**: excluded by a decision boundary (say which one). + +When a finding moves on to `security-triage`, Critical and High both map to its +`high` label; Medium and Low map to `medium` and `low`. + +For each real finding, state whether a **hardening regression test** is required so +`check-hardening-tests.php` (or a component test) keeps it from being dropped later. + +**Completeness check (before you finalise).** State explicitly: is there an untrusted input, +a sink, a deserialization, an authentication, or a trust boundary in scope that matched **no** +anchor and was not already raised in Step 1? If so, reason about it from scratch before +reporting. A clean family sweep is not a clean review. + +The table holds findings from both passes: the Step 1 boundary pass (Family column = the +vulnerability class, or `novel`) and the Step 4 family review. + +Separate **confirmed** findings from **needs-human-judgement** ones. Do not inflate. + +--- + +## If a finding is real: fix handoff + +This follows the house conventions: + +- **TDD**: write the failing hardening test first, then the fix. +- **Component-scoped tests only**: `./phpunit src/Symfony/Component/` (never the whole suite). +- Add the regression test at the boundary so the convention gate covers it; for a + durable implementation-shape check, see the `hardening-rule` skill. +- No em-dashes, no `Co-Authored-By`, no Claude/Anthropic credit. Comments sparingly, + and do not reference issue numbers in code or tests. + +## Gotchas + +- **Decision boundaries are real.** An empty `$secret` that disables webhook + verification is documented behaviour, not a bug. A literal `allowed_classes` on + a first-party cache file was ruled not-a-security-issue. Pure DoS / memory + exhaustion is generally outside the CVE pipeline (treat as Low). The catalog + lists these; respect them or you will cry wolf. +- **Only string-typed properties trampoline.** In `__unserialize()`, int/float/bool + coercion throws `TypeError` without calling `__toString`. Do not flag non-string slots. +- **PHPStan custom-rule counts are nondeterministic** (result cache + parallel + workers). Verify rule behaviour with `RuleTestCase`, and rely on the CI + base-vs-PR diff (`phpstan-diff.php`), not local counts. +- **The diff-lint only flags what a PR adds.** Standing violations on the tree are + filtered out by design, so a clean local audit does not mean the tree is clean; + it means the PR introduced nothing new. +- **Data families are answer-keys.** SSRF subnet lists and the HtmlSanitizer URL + attribute set drift with specs; a static check only confirms a human-curated set, + it cannot find the next missing entry. Flag these for a completeness test, not a gate. +- **Anchors are seed examples, not the search space.** Novel issues surface in the Step 1 + first-principles pass, not the greps. A finding that matches no family is still a finding; + do not let the dictionary bound the review. + +## Error handling + +- Never fabricate a sink. If the anchor finds nothing, say the family is out of scope. +- Security reports are handled privately. Do not echo report contents into public artifacts. +- When unsure whether something crosses a decision boundary, report it as + needs-human-judgement with the boundary named, and **wait for confirmation**. diff -Nru symfony-6.4.41+dfsg/.agents/skills/symfony-security-review/hardening-families.md symfony-6.4.49+dfsg/.agents/skills/symfony-security-review/hardening-families.md --- symfony-6.4.41+dfsg/.agents/skills/symfony-security-review/hardening-families.md 1970-01-01 00:00:00.000000000 +0000 +++ symfony-6.4.49+dfsg/.agents/skills/symfony-security-review/hardening-families.md 2026-10-28 18:15:18.000000000 +0000 @@ -0,0 +1,214 @@ +# Hardening-invariant families + +Reference catalogue for the `symfony-security-review` skill. Each family lists: + +- **Anchor**: how to find the sinks in scope (grep, run against the scope, not the whole tree). +- **Invariant / check**: the question to answer at every sink. +- **Automated coverage**: the sa-tools gate that already enforces it, if any. +- **Decision boundary**: shapes that look unsafe but are accepted. Do not flag these. + +Families are grouped by how they are best checked. + +--- + +## A. Gated by sa-tools (confirm the gate caught it; otherwise it is a finding) + +### A1. Webhook signature/secret verification +- **Anchor**: `grep -rl "extends AbstractRequestParser" src --include=*.php | grep -v Tests` +- **Invariant**: a concrete `doParse(Request, #[\SensitiveParameter] string $secret)` + must verify the request before returning an event: compare the signature with + `hash_equals()` (never `===`/`!==`/`==`/`strcmp`), pin the HMAC algorithm to a + literal (never read it from the request), and reject a missing signature. +- **Automated coverage**: `HardenedComparisonRule` (inline compare only), + `check-hardening-tests.php` (requires a `RejectWebhookException` test). +- **Decision boundary**: gating verification behind `'' !== $secret` is accepted + (an empty configured secret intentionally disables verification). Authenticating + by IP allowlist (`IpsRequestMatcher`) instead of a secret is accepted. + +### A2. `__unserialize()` `__toString` trampoline +- **Anchor**: `grep -rln "function __unserialize" src --include=*.php | grep -v Tests` +- **Invariant**: before assigning `$data[k]` to a string-typed property, reject + object values (`instanceof \Stringable` / `is_object`), so a crafted payload cannot + fire `__toString` during `unserialize()`. +- **Automated coverage**: `UnserializeToStringTrampolineRule`; `check-hardening-tests.php` part B. +- **Decision boundary**: int/float/bool slots do not trampoline (coercion throws first). + A `__unserialize()` that blanket-throws is exempt. + +### A3. `unserialize()` without `allowed_classes` +- **Anchor**: `grep -rn "unserialize(" src --include=*.php | grep -v Tests | grep -v allowed_classes` +- **Invariant**: `unserialize()` of data that is not provably first-party-trusted must + pass `['allowed_classes' => false]` or an explicit allowlist. +- **Automated coverage**: `UnserializeMissingAllowedClassesRule`. +- **Decision boundary**: a literal `allowed_classes` on a first-party cache/container + file is acceptable; the risk is untrusted bytes. +- **See also**: B15 (the Serializer/denormalize analogue), B2/B3 (nested `unserialize`, + destructor gadgets). + +--- + +## B. High-signal, partly static (worth a manual pass; some are buildable rules) + +### B1. Verify-MAC-before-deserialize ordering [highest severity] +- **Anchor**: serializer `decode()` and `doParse()` bodies that both deserialize and verify: + `grep -rn "function decode\|function doParse" src --include=*.php | grep -v Tests` +- **Invariant**: no `unserialize()` / `$request->toArray()` / inner `decode()` may run + before the `hash_equals()` / secret guard. Verify, then parse. Deserializing before + verifying turns a signed transport into an unauthenticated deserialization sink. +- **Automated coverage**: none (verify-order is best asserted by a per-serializer + regression test, not a static rule). + +### B2. Nested `unserialize()` inside `__unserialize()` +- **Anchor**: in a `__unserialize` body, any raw `unserialize(` that is not `parent::__unserialize(`. +- **Invariant**: do not call `unserialize()` again inside `__unserialize()`; it + re-opens the gadget surface the outer call already controls. +- **Automated coverage**: none yet (candidate extension of `UnserializeMissingAllowedClassesRule`). + +### B3. Side-effecting `__destruct` / `__wakeup` as a POP gadget +- **Anchor**: `grep -rln "function __destruct\|function __wakeup" src --include=*.php | grep -v Tests`, + then keep the classes that are still serializable (no throwing `__sleep`/`__serialize`/`__wakeup`). +- **Invariant**: a class whose `__destruct()`/`__wakeup()` has exploitable side effects + (filesystem writes, `unlink`, process or network calls, cache flush) must be made + non-unserializable, so it cannot be reached as a gadget when an untrusted `unserialize()` + exists elsewhere. The accepted fix throws from `__sleep()`/`__serialize()`/`__wakeup()`. + `Cache\Adapter\AbstractAdapter` and `TagAwareAdapter` are the canonical exemplars + (they forbid serialization). +- **Automated coverage**: none yet (candidate easy AST rule: a non-trivial + `__destruct`/`__wakeup` with a side-effecting call and no throwing serialization guard). + Complements A3, which blocks instantiating arbitrary gadget classes, by hardening the + gadget itself. +- **Decision boundary**: defense-in-depth, exploitable only together with an untrusted + `unserialize()` entry, so usually hardening rather than a CVE on its own; the + gadget-bearing class is still the high-value target. A `__destruct` that only releases + in-memory state is not a gadget. + +### B4. XXE / dangerous libxml +- **Anchor**: `grep -rn "validateOnParse\|->loadXML(\|LIBXML_NOENT\|LIBXML_DTDLOAD" src --include=*.php | grep -v Tests` +- **Invariant**: untrusted XML must not be parsed with `validateOnParse = true` or with + `LIBXML_NOENT`/`LIBXML_DTDLOAD`; reject DOCTYPE, or disable external entities. +- **Automated coverage**: none yet (candidate easy AST rule). Distinguish `loadXML` (XML) + from `loadHTML`. +- **Decision boundary**: a few XML helpers set `validateOnParse` but are guarded by a + post-parse DOCTYPE-rejection loop; confirm the guard before flagging. + +### B5. SSRF / private-network +- **Anchor**: `grep -rn "PRIVATE_SUBNETS\|NoPrivateNetworkHttpClient\|gethostbyname\|filter_var.*FILTER_VALIDATE_IP" src --include=*.php | grep -v Tests` +- **Invariant**: resolve the host, validate the resolved IP against the full reserved + set (IPv4 + IPv6 transition forms + RFC6598), and pin the connection to it (no TOCTOU + re-resolve). Strip credentials on cross-host redirects. +- **Automated coverage**: none (the subnet list is data; use a completeness test). +- **Decision boundary**: the subnet list is an answer-key; a static check only confirms a + curated set, it cannot find the next missing range. + +### B6. Open redirect / user-controlled redirect +- **Anchor**: `grep -rn "RedirectResponse\|createRedirectResponse\|'Location'\|\"Location\"" src --include=*.php | grep -v Tests` +- **Invariant**: a redirect target derived from request input must pass a host/path + allowlist on every path (including forward and stateless), and reject backslash and + scheme-relative `//host` tricks. +- **Automated coverage**: none (a taint problem; Psalm at best). + +### B7. CRLF / control-char injection (headers, addresses, URIs) +- **Anchor**: `grep -rn "class Address\|ParameterizedHeader\|MailboxHeader\|->setUri\|getUri(" src/Symfony/Component/Mime src/Symfony/Component/HttpFoundation --include=*.php | grep -v Tests` +- **Invariant**: reject `\r`, `\n`, and other control characters in email addresses, + header parameter names/values, and URIs before they reach a header sink. +- **Automated coverage**: none (scope a presence-check to `Mime\Header`). + +### B8. Argument / command injection +- **Anchor**: `grep -rn "escapeshellarg\|proc_open\|\bexec(\|shell_exec\|new Process(" src --include=*.php | grep -v Tests` +- **Invariant**: when passing user-derived values as process arguments, emit an + end-of-options separator (`--`) before them and reject leading-dash values; on + Windows, account for the documented quoting hazards. +- **Automated coverage**: none (taint to be precise; advisory at best). `SendmailTransport` + is the positive exemplar (emits `' --'` before the recipient loop). + +### B9. ReDoS / DoS limits +- **Anchor**: `grep -rn "preg_match\|preg_replace\|preg_split\|function.*recurs\|self::\$.*\[" src --include=*.php | grep -v Tests` +- **Invariant**: recursion on attacker input carries a depth/length cap; regexes are + anchored and backtracking-bounded; process-global caches keyed by input are bounded. +- **Automated coverage**: none (constant-presence at best). +- **Decision boundary**: pure DoS is often outside the CVE pipeline; treat as Low / + defense-in-depth unless it amplifies another bug. + +### B10. XSS / output encoding +- **Anchor**: scope to renderers/dumpers/templates: `grep -rn "->escape(\|htmlspecialchars\|is_safe\|sprintf.*<" src/Symfony/Bridge/Twig src/Symfony/Component/ErrorHandler src/Symfony/Component/VarDumper --include=*.php | grep -v Tests` +- **Invariant**: data placed into HTML output is encoded for its context; "safe" flags + are only set on genuinely safe output. +- **Automated coverage**: none (taint; scope to `*.html.php`, dumpers). + +### B11. HtmlSanitizer URL coverage and denied chars +- **Anchor**: `grep -rn "UrlAttributeSanitizer\|getSupportedAttributes\|DENIED" src/Symfony/Component/HtmlSanitizer --include=*.php | grep -v Tests` +- **Invariant**: every URL-bearing attribute is routed through URL sanitization; URL + parsing rejects BiDi/format/whitespace chars, including percent-encoded forms. +- **Automated coverage**: none (the attribute set is an answer-key; use a data-provider test). + +### B12. SQL injection via key/prefix concatenation +- **Anchor**: `grep -rn "->query(\|->exec(\|\"SELECT\|'SELECT\|\\. \\$" src/Symfony/Component/Cache --include=*.php | grep -v Tests` +- **Invariant**: identifiers (cache prefix, namespace, key) interpolated into SQL must be + validated/escaped; do not concatenate request-derived strings into a query. +- **Automated coverage**: none (taint). + +### B13. CSV formula injection +- **Anchor**: `grep -rn "fputcsv\|class CsvEncoder" src/Symfony/Component/Serializer --include=*.php | grep -v Tests` +- **Invariant**: cell values beginning with `=`, `+`, `-`, `@` (and tab/CR) are escaped so + a spreadsheet does not execute them. +- **Automated coverage**: none (the trigger-character set is data; cover it with a + data-provider test). +- **Decision boundary**: the encoder's escaping is opt-in (`csv_escape_formulas`, + default off) and documented; the default being off is not a finding. The check is that + the escape path, when enabled, covers the full trigger set. + +### B14. Constant-time comparison (beyond webhooks) +- **Anchor**: `grep -rn "UriSigner\|hash_equals\|=== .*hash\|RememberMe.*cookie" src --include=*.php | grep -v Tests` +- **Invariant**: any comparison of a secret-derived value (signed URI, remember-me token, + CSRF token) uses `hash_equals()`; HMAC inputs have unambiguous field boundaries. +- **Automated coverage**: `HardenedComparisonRule` (inline HMAC compare only). + +### B15. Serializer denormalization into an attacker-chosen class +- **Anchor**: `grep -rnE "->denormalize\(|ClassDiscriminator|getMappedObjectType|new \\\$" src/Symfony/Component/Serializer --include=*.php | grep -v Tests`, + plus any custom (de)normalizer that reads a class or type name from the payload. +- **Invariant**: a (de)normalizer must not instantiate or denormalize into a class name + taken from an in-band payload field. Resolve polymorphic types through an explicit + `ClassDiscriminatorMapping` allowlist; never feed an unvalidated `type` discriminator to + object construction. This is the Serializer analogue of A3. +- **Automated coverage**: none (a value-origin problem; review custom normalizers, or model + it as Psalm taint into the construction sink). +- **Decision boundary**: a discriminator constrained to a finite mapping is safe; the risk is + an open `type` field reaching `new`/`denormalize`. Pairs with A3 and the gadget hardening in B3. + +### B16. Path traversal / arbitrary file access +- **Anchor**: `grep -rnE "file_get_contents|file_put_contents|fopen|->dumpFile|unlink\(|include |require " src --include=*.php | grep -v Tests`; + keep the sites whose path is built from input (session ids, cache keys, upload names, + profiler tokens, command arguments). +- **Invariant**: a filesystem path built from user-derived input must be confined: reject + `..` and absolute paths, `basename()` untrusted segments, or `realpath()`-check containment + under a base directory before the open/write/include. +- **Automated coverage**: none (taint; advisory presence-check at best). +- **Decision boundary**: a path assembled only from first-party constants is out of scope; + CLI tools that run only under local trust are lower priority. The risk is + request/upload/broker-derived segments. + +--- + +## C. Reviewer checklist (not statically checkable) + +Confirm by reading, not by rule. Raise as needs-human-judgement. + +### C1. Authorization and secure-default regressions +- Access decision strategies, voter behaviour, `#[IsGranted]`/`#[IsSignatureValid]` + and HEAD-request handling, default-on CSRF/secure cookies, OIDC claim validation. + +### C2. Request / Host trust and cache poisoning +- Absolute-URL generation from the `Host` header, trusted proxy/header handling, + stripping internal headers before caching, fragment/secret exposure, CAS service URL + derived from `Host`. + +### C3. User-enumeration / timing oracles +- Uniform failure responses and timing for unknown vs known users, including when a + `UserProvider` caches; consistent status codes on switch-user and login. + +### C4. Secret / sensitive-info leak +- Credentials redacted in DSNs, exception messages, and serialized payloads; + framework/internal names not exposed to clients. + +### C5. Weak randomness / token generation +- Security tokens, nonces, and secrets come from a CSPRNG (`random_bytes`/`random_int`), + not `rand`/`mt_rand`/`uniqid`/`microtime`; such tokens are compared constant-time (B14). diff -Nru symfony-6.4.41+dfsg/.agents/skills/sync-translations/SKILL.md symfony-6.4.49+dfsg/.agents/skills/sync-translations/SKILL.md --- symfony-6.4.41+dfsg/.agents/skills/sync-translations/SKILL.md 1970-01-01 00:00:00.000000000 +0000 +++ symfony-6.4.49+dfsg/.agents/skills/sync-translations/SKILL.md 2026-10-28 18:15:18.000000000 +0000 @@ -0,0 +1,204 @@ +--- +name: sync-translations +description: > + Synchronize translation catalogs across maintained Symfony branches: + find messages that newer branches added to the English catalogs but + that are still missing from the oldest maintained branch, then add + them (with a translation per locale) on that oldest branch so they + cascade up via merges. Use when the user says "synchronize + translations", "sync new translations", "sync the translation + catalogs", "add the missing translation messages", or "propagate new + xlf messages". +--- + +# Symfony Translation Catalog Synchronization + +New messages get added to the English catalog only (e.g. `validators.en.xlf`), +usually on the newest branch where a feature lands. This skill discovers every +such message missing from the **oldest maintained branch** and adds it there, in +all locales, so it cascades up through the regular merge-up. + +## Core convention + +Translation messages always land on the **oldest maintained branch**, even when the +feature that introduced them only exists on a newer branch. Catalogs are append-only +with sequential ids, so the newer branch is a superset of the oldest: the missing +messages are exactly the trailing entries whose id is greater than the oldest +branch's current maximum. Adding them on the oldest branch with the **same ids** +keeps the eventual merge-up conflict-free. + +## Progress checklist + +- [ ] Step 1: Get maintained branches and fetch them +- [ ] Step 2: Create the branch off the oldest maintained branch +- [ ] Step 3: Discover the missing messages per catalog +- [ ] Step 4: Add each missing message to every locale +- [ ] Step 5: Verify +- [ ] Step 6: Commit per component (do not push) + +--- + +## Step 1 — Get maintained branches and fetch them + +Use the same endpoint as the `merge-up` skill: + +```bash +curl -s https://symfony.com/releases.json +``` + +Read `maintained_versions`, already sorted oldest → newest (e.g. +`["6.4", "7.4", "8.0", "8.1"]`). The first is the **TARGET** (oldest); the rest are +the **NEWER** branches. Fetch all of them from upstream: + +```bash +for b in ; do git fetch upstream "$b"; done +``` + +--- + +## Step 2 — Create the branch off the oldest maintained branch + +Branch off the upstream ref, never a local branch. Suffix the branch name with the +current date (`date +%Y-%m-%d`) so it stays unique across runs: + +```bash +git checkout -b "sync-translations-$(date +%Y-%m-%d)" upstream/ +``` + +--- + +## Step 3 — Discover the missing messages per catalog + +The English catalogs to compare (one per component that ships translations): + +```bash +git ls-tree -r --name-only upstream/ | grep -E 'Resources/translations/.*\.en\.xlf$' +``` + +(Today: `Validator/.../validators.en.xlf`, `Form/.../validators.en.xlf`, +`Security/Core/.../security.en.xlf`. A NEWER branch may also introduce a brand-new +catalog file absent from the TARGET; pick those up by listing catalogs on the +newest branch too.) + +Helper to extract `idsource` pairs from a catalog at any ref: + +```bash +extract() { # $1 = git ref, $2 = path + git show "$1:$2" 2>/dev/null | php -r ' +$c = stream_get_contents(STDIN); +preg_match_all("#\s*(.*?)#s", $c, $m, PREG_SET_ORDER); +foreach ($m as $x) { echo $x[1]."\t".$x[2]."\n"; }' +} +``` + +For each catalog file, go over **every NEWER branch** (oldest → newest) and collect +trans-units whose id is greater than the TARGET's current maximum id for that file: + +```bash +TARGET_MAX=$(extract upstream/ "$f" | cut -f1 | sort -n | tail -1) +extract upstream/ "$f" | awk -F'\t' -v max="$TARGET_MAX" '$1 > max' +``` + +Union the results across NEWER branches and dedup by id (newer branches are +cumulative, so the newest usually already contains the full set). **Cross-check**: +every collected source must be absent from the TARGET catalog. If a source already +exists in the TARGET under a different id, the catalogs have diverged or been +renumbered: **stop** and ask the user. + +Report the discovered messages (component, id, English source) before editing. + +--- + +## Step 4 — Add each missing message to every locale + +For each missing message, write a JSON file mapping **every non-en locale** of the +catalog to its translated target, then run the bundled script. Translate the source +yourself (a real translation per locale, never the English fallback); the script +adds the `state="needs-review-translation"` flag that marks them for native-speaker +review. + +```bash +# translations.json: {"af": "...", "ar": "...", ..., "zh_TW": "..."} +php scripts/add_message.php \ + --dir src/Symfony/Component/Validator/Resources/translations \ + --id 146 \ + --source "This value is not a valid cron expression." \ + --translations translations.json +``` + +The script inserts the `` before `` in every `*.xlf` of the +directory: the English catalog gets the source as its target, every other locale gets +its translation. It is idempotent (a locale already holding the id is skipped) and +exits non-zero if the JSON doesn't cover exactly the catalog's non-en locales. Pass +`--source` already XML-ready (escape `&`, `<`, `>` if present) so it is reused +byte-for-byte. Run it once per catalog and per missing id. + +Resulting entries look like: + +```xml + + This value is not a valid cron expression. + This value is not a valid cron expression. + +``` + +```xml + + This value is not a valid cron expression. + Cette valeur n'est pas une expression cron valide. + +``` + +--- + +## Step 5 — Verify + +Well-formedness of every catalog touched: + +```bash +for f in /*.xlf; do xmllint --noout "$f" || echo "BAD: $f"; done +``` + +Catalog consistency (same ids/sources across all locales). Run only the +`TranslationFilesTest` of the components you actually touched, e.g. for Validator: + +```bash +./phpunit src/Symfony/Component/Validator/Tests/Resources/TranslationFilesTest.php +``` + +Each touched component has its own test under +`src/Symfony/Component//Tests/Resources/TranslationFilesTest.php` (Validator, +Form, Security/Core). All must be clean. An unrelated PHPUnit-config schema warning +is fine; a test failure is not. + +--- + +## Step 6 — Commit per component (do not push) + +One atomic commit per affected component, staging only that component's translation +directory: + +```bash +git add src/Symfony/Component/Validator/Resources/translations/ +git commit -m "[Validator] Add translated messages for the constraint" +``` + +Name the commit after the feature when the new messages map to one (e.g. the Cron +constraint); otherwise describe the synchronization. Then **stop**: never push or +open the PR, hand control back to the user. + +--- + +## Gotchas + +- The feature (constraint, attribute) introducing a message may not exist on the + oldest branch at all. That is expected: only the catalog message goes there, never + the feature code. +- Every locale gets the entry, not just `*.en.xlf`, otherwise `TranslationFilesTest` + fails on a missing id. +- Reuse the id and byte-for-byte English `` from the NEWER branch, including + placeholders like `{{ size }}`; a different id or altered source breaks the + conflict-free merge-up and the consistency test. +- A catalog may legitimately have no missing messages; skip it silently. +- Handle each catalog (`Validator`, `Form`, `Security/Core`) independently, with its + own commit and `[Component]` prefix. diff -Nru symfony-6.4.41+dfsg/.agents/skills/sync-translations/scripts/add_message.php symfony-6.4.49+dfsg/.agents/skills/sync-translations/scripts/add_message.php --- symfony-6.4.41+dfsg/.agents/skills/sync-translations/scripts/add_message.php 1970-01-01 00:00:00.000000000 +0000 +++ symfony-6.4.49+dfsg/.agents/skills/sync-translations/scripts/add_message.php 2026-10-28 18:15:18.000000000 +0000 @@ -0,0 +1,176 @@ +#!/usr/bin/env php + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Insert one translation message into every locale of an xlf catalog. + * + * Adds a with the given id and English source to each + * *.xlf file in a catalog directory: the English catalog gets the + * source as its target (no state), every other locale gets its + * translation with state="needs-review-translation". Idempotent: a + * locale that already has the id is left untouched. + * + * Usage: + * add_message.php --dir DIR --id ID --source TEXT --translations FILE + * + * --dir Catalog directory holding the ..xlf files + * --id Numeric trans-unit id (must be free in every locale) + * --source English source text, already XML-ready (escape & < >) + * --translations JSON file mapping every non-en locale to its translated + * target, e.g. {"fr": "...", "de": "..."} + * + * Exit codes: 0 success, 2 bad arguments, 3 locale/translation mismatch. + */ + +if ('cli' !== \PHP_SAPI) { + throw new Exception('This script must be run from the command line.'); +} + +error_reporting(\E_ALL); + +set_error_handler(static function (int $type, string $msg, string $file, int $line): void { + throw new ErrorException($msg, 0, $type, $file, $line); +}); + +const ANCHOR = ' '; + +function fail(string $message, int $code = 1): never +{ + fwrite(\STDERR, $message."\n"); + exit($code); +} + +function unit(string $id, string $source, string $target, ?string $state): string +{ + $attr = null !== $state ? ' state="'.$state.'"' : ''; + + return ' '."\n" + .' '.$source.''."\n" + .' '.$target.''."\n" + .' '."\n"; +} + +function localeOf(string $filename): string +{ + // ..xlf -> + $parts = explode('.', $filename); + + return $parts[\count($parts) - 2]; +} + +function parseArgs(array $argv): array +{ + $options = ['dir' => null, 'id' => null, 'source' => null, 'translations' => null]; + $args = \array_slice($argv, 1); + + for ($i = 0; $i < \count($args); ++$i) { + $arg = $args[$i]; + $key = null; + $value = null; + + if (str_starts_with($arg, '--') && str_contains($arg, '=')) { + [$key, $value] = explode('=', substr($arg, 2), 2); + } elseif (str_starts_with($arg, '--')) { + $key = substr($arg, 2); + $value = $args[++$i] ?? null; + } + + if (null === $key || !\array_key_exists($key, $options) || null === $value) { + fail('Error: invalid arguments', 2); + } + + $options[$key] = $value; + } + + foreach ($options as $name => $value) { + if (null === $value) { + fail('Error: missing required argument --'.$name, 2); + } + } + + return $options; +} + +$opts = parseArgs($argv); + +if (!is_dir($opts['dir'])) { + fail('Error: --dir is not a directory: '.$opts['dir']); +} + +$files = array_values(array_filter(scandir($opts['dir']), static fn ($f) => str_ends_with($f, '.xlf'))); +sort($files); +if (!$files) { + fail('Error: no .xlf files in '.$opts['dir']); +} + +$json = file_get_contents($opts['translations']); +if (false === $json) { + fail('Error: cannot read translations file: '.$opts['translations']); +} +$translations = json_decode($json, true); +if (!\is_array($translations)) { + fail('Error: translations file is not a valid JSON object: '.$opts['translations']); +} + +$locales = []; +foreach ($files as $f) { + $locales[localeOf($f)] = true; +} +unset($locales['en']); +$nonEn = array_keys($locales); + +$missing = array_values(array_diff($nonEn, array_keys($translations))); +$extra = array_values(array_diff(array_keys($translations), $nonEn)); +sort($missing); +sort($extra); +if ($missing || $extra) { + $msg = []; + if ($missing) { + $msg[] = 'missing translations for: '.implode(', ', $missing); + } + if ($extra) { + $msg[] = 'unknown locales in translations file: '.implode(', ', $extra); + } + fail('Error: '.implode('; ', $msg), 3); +} + +$idMarker = ''; +$added = []; +$skipped = []; +foreach ($files as $f) { + $path = $opts['dir'].'/'.$f; + $content = file_get_contents($path); + $loc = localeOf($f); + + if (str_contains($content, $idMarker)) { + $skipped[] = $loc; + continue; + } + if (!str_contains($content, ANCHOR)) { + fail("Error: anchor '' not found in ".$path); + } + + if ('en' === $loc) { + $block = unit($opts['id'], $opts['source'], $opts['source'], null); + } else { + $block = unit($opts['id'], $opts['source'], $translations[$loc], 'needs-review-translation'); + } + + $pos = strpos($content, ANCHOR); + $content = substr_replace($content, $block.ANCHOR, $pos, \strlen(ANCHOR)); + file_put_contents($path, $content); + $added[] = $loc; +} + +sort($added); +sort($skipped); +echo json_encode(['id' => $opts['id'], 'added' => $added, 'skipped' => $skipped])."\n"; diff -Nru symfony-6.4.41+dfsg/.codespellrc symfony-6.4.49+dfsg/.codespellrc --- symfony-6.4.41+dfsg/.codespellrc 1970-01-01 00:00:00.000000000 +0000 +++ symfony-6.4.49+dfsg/.codespellrc 2026-10-28 18:15:18.000000000 +0000 @@ -0,0 +1,9 @@ +[codespell] +# "smove" is the name of a Redis command +# "hastable" is Doctrine's Schema::hasTable() method +# "signall" is the $signAll property of Messenger's SigningSerializer +# "caf" comes from the "café" test fixtures of the HttpClient recorder +# "ser" is the $ser variable of Config's ResourceCheckerConfigCache +# "atleast" is PHPUnit's TestCase::atLeast() +# "grigorian" is the name of an author of Console's Table helper +ignore-words-list = smove,hastable,signall,caf,ser,atleast,grigorian diff -Nru symfony-6.4.41+dfsg/.github/CODEOWNERS symfony-6.4.49+dfsg/.github/CODEOWNERS --- symfony-6.4.41+dfsg/.github/CODEOWNERS 2026-05-27 08:23:35.000000000 +0000 +++ symfony-6.4.49+dfsg/.github/CODEOWNERS 2026-10-28 18:15:18.000000000 +0000 @@ -15,12 +15,6 @@ /src/Symfony/Bridge/Twig/Tests/Node/FormThemeTest.php @xabbuh /src/Symfony/Bridge/Twig/Tests/TokenParser/FormThemeTokenParserTest.php @xabbuh /src/Symfony/Bridge/Twig/TokenParser/FormThemeTokenParser.php @xabbuh -/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Compiler/FormPass.php @xabbuh -/src/Symfony/Bundle/FrameworkBundle/Resources/views/ @xabbuh -/src/Symfony/Bundle/FrameworkBundle/Templating/Helper/FormHelper.php @xabbuh -/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Compiler/FormPassTest.php @xabbuh -/src/Symfony/Bundle/FrameworkBundle/Tests/Templating/Helper/FormHelperTableLayoutTest.php @xabbuh -/src/Symfony/Bundle/FrameworkBundle/Tests/Templating/Helper/FormHelperDivLayoutTest.php @xabbuh /src/Symfony/Component/Form/ @xabbuh @yceruto # HttpKernel /src/Symfony/Component/HttpKernel/Log/Logger.php @dunglas diff -Nru symfony-6.4.41+dfsg/.github/PULL_REQUEST_TEMPLATE.md symfony-6.4.49+dfsg/.github/PULL_REQUEST_TEMPLATE.md --- symfony-6.4.41+dfsg/.github/PULL_REQUEST_TEMPLATE.md 2026-05-27 08:23:35.000000000 +0000 +++ symfony-6.4.49+dfsg/.github/PULL_REQUEST_TEMPLATE.md 2026-10-28 18:15:18.000000000 +0000 @@ -1,6 +1,6 @@ | Q | A | ------------- | --- -| Branch? | 8.2 for features / 6.4, 7.4, 8.0, 8.1 for bug fixes +| Branch? | 8.2 for features / 6.4, 7.4, 8.1 for bug fixes | Bug fix? | yes/no | New feature? | yes/no | Deprecations? | yes/no diff -Nru symfony-6.4.41+dfsg/.github/dependabot.yml symfony-6.4.49+dfsg/.github/dependabot.yml --- symfony-6.4.41+dfsg/.github/dependabot.yml 1970-01-01 00:00:00.000000000 +0000 +++ symfony-6.4.49+dfsg/.github/dependabot.yml 2026-10-28 18:15:18.000000000 +0000 @@ -0,0 +1,55 @@ +# https://docs.github.com/en/code-security/reference/supply-chain-security/dependabot-options-reference + +# Generated by .github/sync-maintained-versions.php from https://symfony.com/maintained-versions.json +# One entry per maintained branch; cooldown increases in merge-up order so the lowest branch surfaces first. + +version: 2 +updates: + + - package-ecosystem: 'github-actions' + directory: '/' + target-branch: '6.4' + schedule: + interval: 'weekly' + groups: + github-actions: + patterns: + - '*' + cooldown: + default-days: 7 + + - package-ecosystem: 'github-actions' + directory: '/' + target-branch: '7.4' + schedule: + interval: 'weekly' + groups: + github-actions: + patterns: + - '*' + cooldown: + default-days: 8 + + - package-ecosystem: 'github-actions' + directory: '/' + target-branch: '8.1' + schedule: + interval: 'weekly' + groups: + github-actions: + patterns: + - '*' + cooldown: + default-days: 10 + + - package-ecosystem: 'github-actions' + directory: '/' + target-branch: '8.2' + schedule: + interval: 'weekly' + groups: + github-actions: + patterns: + - '*' + cooldown: + default-days: 11 diff -Nru symfony-6.4.41+dfsg/.github/deprecation-ignore symfony-6.4.49+dfsg/.github/deprecation-ignore --- symfony-6.4.41+dfsg/.github/deprecation-ignore 1970-01-01 00:00:00.000000000 +0000 +++ symfony-6.4.49+dfsg/.github/deprecation-ignore 2026-10-28 18:15:18.000000000 +0000 @@ -0,0 +1,19 @@ +# Schema mutator deprecations triggered by doctrine/orm's SchemaTool on DBAL 4.5+. +# These are vendor-internal: ORM has not yet migrated SchemaTool to the DBAL +# Schema/Table editor API. Symfony's own schema code already uses the editor API. +%^Doctrine\\DBAL\\Schema\\(Table|Schema)::\w+\(?\)? is deprecated% + +# Static type registry deprecations triggered by doctrine/orm on DBAL 4.6+. +# ORM still resolves types through Type::getType() and Type::hasType() instead +# of the type provider of the connection. +%^Doctrine\\DBAL\\Types\\Type::(getType|hasType) is deprecated% + +# spl_object_hash() is deprecated as of PHP 8.6. Symfony's own code uses +# spl_object_id() but some dependencies still call it: masterminds/html5, +# doctrine/collections, doctrine/dbal and the sebastian/* packages that ship +# with PHPUnit. +%^Function spl_object_hash\(\) is deprecated% + +# PHP 8.6 deprecates "is" as a class name. guzzlehttp/promises declares an "Is" +# class that HttplugClient reaches through the Guzzle promise API. +%^Using "is" as a class name is deprecated% diff -Nru symfony-6.4.41+dfsg/.github/expected-missing-return-types.diff symfony-6.4.49+dfsg/.github/expected-missing-return-types.diff --- symfony-6.4.41+dfsg/.github/expected-missing-return-types.diff 2026-05-27 08:23:35.000000000 +0000 +++ symfony-6.4.49+dfsg/.github/expected-missing-return-types.diff 2026-10-28 18:15:18.000000000 +0000 @@ -144,7 +144,7 @@ diff --git a/src/Symfony/Bridge/Doctrine/Form/DoctrineOrmTypeGuesser.php b/src/Symfony/Bridge/Doctrine/Form/DoctrineOrmTypeGuesser.php --- a/src/Symfony/Bridge/Doctrine/Form/DoctrineOrmTypeGuesser.php +++ b/src/Symfony/Bridge/Doctrine/Form/DoctrineOrmTypeGuesser.php -@@ -164,5 +164,5 @@ class DoctrineOrmTypeGuesser implements FormTypeGuesserInterface +@@ -168,5 +168,5 @@ class DoctrineOrmTypeGuesser implements FormTypeGuesserInterface * @return array{0:ClassMetadata, 1:string}|null */ - protected function getMetadata(string $class) @@ -212,23 +212,40 @@ + public function onWorkerMessageFailed(): void { $this->clearEntityManagers(); +diff --git a/src/Symfony/Bridge/Doctrine/SchemaListener/AbstractSchemaListener.php b/src/Symfony/Bridge/Doctrine/SchemaListener/AbstractSchemaListener.php +--- a/src/Symfony/Bridge/Doctrine/SchemaListener/AbstractSchemaListener.php ++++ b/src/Symfony/Bridge/Doctrine/SchemaListener/AbstractSchemaListener.php +@@ -35,5 +35,5 @@ abstract class AbstractSchemaListener + * @return Schema The (possibly new) schema after filtering + */ +- protected function filterSchemaChanges(Schema $schema, Connection $connection, callable $configurator) ++ protected function filterSchemaChanges(Schema $schema, Connection $connection, callable $configurator): Schema + { + $filter = $connection->getConfiguration()->getSchemaAssetsFilter(); diff --git a/src/Symfony/Bridge/Doctrine/Security/RememberMe/DoctrineTokenProvider.php b/src/Symfony/Bridge/Doctrine/Security/RememberMe/DoctrineTokenProvider.php --- a/src/Symfony/Bridge/Doctrine/Security/RememberMe/DoctrineTokenProvider.php +++ b/src/Symfony/Bridge/Doctrine/Security/RememberMe/DoctrineTokenProvider.php -@@ -73,5 +73,5 @@ class DoctrineTokenProvider implements TokenProviderInterface, TokenVerifierInte +@@ -78,5 +78,5 @@ class DoctrineTokenProvider implements TokenProviderInterface, TokenVerifierInte * @return void */ - public function deleteTokenBySeries(string $series) + public function deleteTokenBySeries(string $series): void { $sql = 'DELETE FROM rememberme_token WHERE series=:series'; -@@ -103,5 +103,5 @@ class DoctrineTokenProvider implements TokenProviderInterface, TokenVerifierInte +@@ -108,5 +108,5 @@ class DoctrineTokenProvider implements TokenProviderInterface, TokenVerifierInte * @return void */ - public function createNewToken(PersistentTokenInterface $token) + public function createNewToken(PersistentTokenInterface $token): void { $sql = 'INSERT INTO rememberme_token (class, username, series, value, lastUsed) VALUES (:class, :username, :series, :value, :lastUsed)'; +@@ -197,5 +197,5 @@ class DoctrineTokenProvider implements TokenProviderInterface, TokenVerifierInte + * @return Schema The (possibly new) schema with the table added + */ +- public function configureSchema(Schema $schema, Connection $forConnection/* , \Closure $isSameDatabase */) ++ public function configureSchema(Schema $schema, Connection $forConnection/* , \Closure $isSameDatabase */): Schema + { + if ($schema->hasTable('rememberme_token')) { diff --git a/src/Symfony/Bridge/Doctrine/Validator/Constraints/UniqueEntityValidator.php b/src/Symfony/Bridge/Doctrine/Validator/Constraints/UniqueEntityValidator.php --- a/src/Symfony/Bridge/Doctrine/Validator/Constraints/UniqueEntityValidator.php +++ b/src/Symfony/Bridge/Doctrine/Validator/Constraints/UniqueEntityValidator.php @@ -252,7 +269,7 @@ diff --git a/src/Symfony/Bridge/Monolog/Command/ServerLogCommand.php b/src/Symfony/Bridge/Monolog/Command/ServerLogCommand.php --- a/src/Symfony/Bridge/Monolog/Command/ServerLogCommand.php +++ b/src/Symfony/Bridge/Monolog/Command/ServerLogCommand.php -@@ -56,5 +56,5 @@ class ServerLogCommand extends Command +@@ -58,5 +58,5 @@ class ServerLogCommand extends Command * @return void */ - protected function configure() @@ -633,7 +650,7 @@ + public function load(array $configs, ContainerBuilder $container): void { $loader = new PhpFileLoader($container, new FileLocator(\dirname(__DIR__).'/Resources/config')); -@@ -3024,5 +3024,5 @@ class FrameworkExtension extends Extension +@@ -3027,5 +3027,5 @@ class FrameworkExtension extends Extension * @return void */ - public static function registerRateLimiter(ContainerBuilder $container, string $name, array $limiterConfig) @@ -650,7 +667,7 @@ + public function boot(): void { $_ENV['DOCTRINE_DEPRECATIONS'] = $_SERVER['DOCTRINE_DEPRECATIONS'] ??= 'trigger'; -@@ -129,5 +129,5 @@ class FrameworkBundle extends Bundle +@@ -135,5 +135,5 @@ class FrameworkBundle extends Bundle * @return void */ - public function build(ContainerBuilder $container) @@ -1279,6 +1296,16 @@ + public function reset(): void { foreach ($this->adapters as $adapter) { +diff --git a/src/Symfony/Component/Cache/Adapter/DoctrineDbalAdapter.php b/src/Symfony/Component/Cache/Adapter/DoctrineDbalAdapter.php +--- a/src/Symfony/Component/Cache/Adapter/DoctrineDbalAdapter.php ++++ b/src/Symfony/Component/Cache/Adapter/DoctrineDbalAdapter.php +@@ -137,5 +137,5 @@ class DoctrineDbalAdapter extends AbstractAdapter implements PruneableInterface + * @return Schema The (possibly new) schema with the table added + */ +- public function configureSchema(Schema $schema, Connection $forConnection/* , \Closure $isSameDatabase */) ++ public function configureSchema(Schema $schema, Connection $forConnection/* , \Closure $isSameDatabase */): Schema + { + if ($schema->hasTable($this->table)) { diff --git a/src/Symfony/Component/Cache/Adapter/MemcachedAdapter.php b/src/Symfony/Component/Cache/Adapter/MemcachedAdapter.php --- a/src/Symfony/Component/Cache/Adapter/MemcachedAdapter.php +++ b/src/Symfony/Component/Cache/Adapter/MemcachedAdapter.php @@ -1325,7 +1352,7 @@ - public function reset() + public function reset(): void { - $this->commit(); + try { diff --git a/src/Symfony/Component/Cache/Adapter/TraceableAdapter.php b/src/Symfony/Component/Cache/Adapter/TraceableAdapter.php --- a/src/Symfony/Component/Cache/Adapter/TraceableAdapter.php +++ b/src/Symfony/Component/Cache/Adapter/TraceableAdapter.php @@ -2908,8 +2935,8 @@ - public function overwrite(string|iterable $message) + public function overwrite(string|iterable $message): void { - $this->clear(); -@@ -166,5 +166,5 @@ class ConsoleSectionOutput extends StreamOutput + if (!$this->content || !$this->isDecorated()) { +@@ -189,5 +189,5 @@ class ConsoleSectionOutput extends StreamOutput * @return void */ - protected function doWrite(string $message, bool $newline) @@ -3494,7 +3521,7 @@ diff --git a/src/Symfony/Component/DependencyInjection/Compiler/CheckDefinitionValidityPass.php b/src/Symfony/Component/DependencyInjection/Compiler/CheckDefinitionValidityPass.php --- a/src/Symfony/Component/DependencyInjection/Compiler/CheckDefinitionValidityPass.php +++ b/src/Symfony/Component/DependencyInjection/Compiler/CheckDefinitionValidityPass.php -@@ -38,5 +38,5 @@ class CheckDefinitionValidityPass implements CompilerPassInterface +@@ -37,5 +37,5 @@ class CheckDefinitionValidityPass implements CompilerPassInterface * @throws RuntimeException When the Definition is invalid */ - public function process(ContainerBuilder $container) @@ -3610,49 +3637,49 @@ diff --git a/src/Symfony/Component/DependencyInjection/Compiler/PassConfig.php b/src/Symfony/Component/DependencyInjection/Compiler/PassConfig.php --- a/src/Symfony/Component/DependencyInjection/Compiler/PassConfig.php +++ b/src/Symfony/Component/DependencyInjection/Compiler/PassConfig.php -@@ -127,5 +127,5 @@ class PassConfig +@@ -128,5 +128,5 @@ class PassConfig * @throws InvalidArgumentException when a pass type doesn't exist */ - public function addPass(CompilerPassInterface $pass, string $type = self::TYPE_BEFORE_OPTIMIZATION, int $priority = 0) + public function addPass(CompilerPassInterface $pass, string $type = self::TYPE_BEFORE_OPTIMIZATION, int $priority = 0): void { $property = $type.'Passes'; -@@ -203,5 +203,5 @@ class PassConfig +@@ -204,5 +204,5 @@ class PassConfig * @return void */ - public function setMergePass(CompilerPassInterface $pass) + public function setMergePass(CompilerPassInterface $pass): void { $this->mergePass = $pass; -@@ -215,5 +215,5 @@ class PassConfig +@@ -216,5 +216,5 @@ class PassConfig * @return void */ - public function setAfterRemovingPasses(array $passes) + public function setAfterRemovingPasses(array $passes): void { $this->afterRemovingPasses = [$passes]; -@@ -227,5 +227,5 @@ class PassConfig +@@ -228,5 +228,5 @@ class PassConfig * @return void */ - public function setBeforeOptimizationPasses(array $passes) + public function setBeforeOptimizationPasses(array $passes): void { $this->beforeOptimizationPasses = [$passes]; -@@ -239,5 +239,5 @@ class PassConfig +@@ -240,5 +240,5 @@ class PassConfig * @return void */ - public function setBeforeRemovingPasses(array $passes) + public function setBeforeRemovingPasses(array $passes): void { $this->beforeRemovingPasses = [$passes]; -@@ -251,5 +251,5 @@ class PassConfig +@@ -252,5 +252,5 @@ class PassConfig * @return void */ - public function setOptimizationPasses(array $passes) + public function setOptimizationPasses(array $passes): void { $this->optimizationPasses = [$passes]; -@@ -263,5 +263,5 @@ class PassConfig +@@ -264,5 +264,5 @@ class PassConfig * @return void */ - public function setRemovingPasses(array $passes) @@ -3920,98 +3947,98 @@ diff --git a/src/Symfony/Component/DependencyInjection/ContainerBuilder.php b/src/Symfony/Component/DependencyInjection/ContainerBuilder.php --- a/src/Symfony/Component/DependencyInjection/ContainerBuilder.php +++ b/src/Symfony/Component/DependencyInjection/ContainerBuilder.php -@@ -177,5 +177,5 @@ class ContainerBuilder extends Container implements TaggedContainerInterface +@@ -182,5 +182,5 @@ class ContainerBuilder extends Container implements TaggedContainerInterface * @return void */ - public function setResourceTracking(bool $track) + public function setResourceTracking(bool $track): void { $this->trackResources = $track; -@@ -195,5 +195,5 @@ class ContainerBuilder extends Container implements TaggedContainerInterface +@@ -200,5 +200,5 @@ class ContainerBuilder extends Container implements TaggedContainerInterface * @return void */ - public function setProxyInstantiator(InstantiatorInterface $proxyInstantiator) + public function setProxyInstantiator(InstantiatorInterface $proxyInstantiator): void { $this->proxyInstantiator = $proxyInstantiator; -@@ -203,5 +203,5 @@ class ContainerBuilder extends Container implements TaggedContainerInterface +@@ -208,5 +208,5 @@ class ContainerBuilder extends Container implements TaggedContainerInterface * @return void */ - public function registerExtension(ExtensionInterface $extension) + public function registerExtension(ExtensionInterface $extension): void { $this->extensions[$extension->getAlias()] = $extension; -@@ -485,5 +485,5 @@ class ContainerBuilder extends Container implements TaggedContainerInterface +@@ -490,5 +490,5 @@ class ContainerBuilder extends Container implements TaggedContainerInterface * @throws BadMethodCallException When this ContainerBuilder is compiled */ - public function set(string $id, ?object $service) + public function set(string $id, ?object $service): void { if ($this->isCompiled() && (isset($this->definitions[$id]) && !$this->definitions[$id]->isSynthetic())) { -@@ -502,5 +502,5 @@ class ContainerBuilder extends Container implements TaggedContainerInterface +@@ -507,5 +507,5 @@ class ContainerBuilder extends Container implements TaggedContainerInterface * @return void */ - public function removeDefinition(string $id) + public function removeDefinition(string $id): void { if (isset($this->definitions[$id])) { -@@ -614,5 +614,5 @@ class ContainerBuilder extends Container implements TaggedContainerInterface +@@ -619,5 +619,5 @@ class ContainerBuilder extends Container implements TaggedContainerInterface * @throws BadMethodCallException When this ContainerBuilder is compiled */ - public function merge(self $container) + public function merge(self $container): void { if ($this->isCompiled()) { -@@ -706,5 +706,5 @@ class ContainerBuilder extends Container implements TaggedContainerInterface +@@ -711,5 +711,5 @@ class ContainerBuilder extends Container implements TaggedContainerInterface * @return void */ - public function prependExtensionConfig(string $name, array $config) + public function prependExtensionConfig(string $name, array $config): void { if (!isset($this->extensionConfigs[$name])) { -@@ -751,5 +751,5 @@ class ContainerBuilder extends Container implements TaggedContainerInterface +@@ -756,5 +756,5 @@ class ContainerBuilder extends Container implements TaggedContainerInterface * @return void */ - public function compile(bool $resolveEnvPlaceholders = false) + public function compile(bool $resolveEnvPlaceholders = false): void { $compiler = $this->getCompiler(); -@@ -815,5 +815,5 @@ class ContainerBuilder extends Container implements TaggedContainerInterface +@@ -820,5 +820,5 @@ class ContainerBuilder extends Container implements TaggedContainerInterface * @return void */ - public function addAliases(array $aliases) + public function addAliases(array $aliases): void { foreach ($aliases as $alias => $id) { -@@ -829,5 +829,5 @@ class ContainerBuilder extends Container implements TaggedContainerInterface +@@ -834,5 +834,5 @@ class ContainerBuilder extends Container implements TaggedContainerInterface * @return void */ - public function setAliases(array $aliases) + public function setAliases(array $aliases): void { $this->aliasDefinitions = []; -@@ -863,5 +863,5 @@ class ContainerBuilder extends Container implements TaggedContainerInterface +@@ -868,5 +868,5 @@ class ContainerBuilder extends Container implements TaggedContainerInterface * @return void */ - public function removeAlias(string $alias) + public function removeAlias(string $alias): void { if (isset($this->aliasDefinitions[$alias])) { -@@ -925,5 +925,5 @@ class ContainerBuilder extends Container implements TaggedContainerInterface +@@ -930,5 +930,5 @@ class ContainerBuilder extends Container implements TaggedContainerInterface * @return void */ - public function addDefinitions(array $definitions) + public function addDefinitions(array $definitions): void { foreach ($definitions as $id => $definition) { -@@ -939,5 +939,5 @@ class ContainerBuilder extends Container implements TaggedContainerInterface +@@ -944,5 +944,5 @@ class ContainerBuilder extends Container implements TaggedContainerInterface * @return void */ - public function setDefinitions(array $definitions) + public function setDefinitions(array $definitions): void { $this->definitions = []; -@@ -1332,5 +1332,5 @@ class ContainerBuilder extends Container implements TaggedContainerInterface +@@ -1337,5 +1337,5 @@ class ContainerBuilder extends Container implements TaggedContainerInterface * @return void */ - public function addExpressionLanguageProvider(ExpressionFunctionProviderInterface $provider) @@ -4505,42 +4532,42 @@ + public function addXmlContent(string $content, string $charset = 'UTF-8', int $options = \LIBXML_NONET): void { // remove the default namespace if it's the only namespace to make XPath expressions simpler -@@ -246,5 +246,5 @@ class Crawler implements \Countable, \IteratorAggregate +@@ -245,5 +245,5 @@ class Crawler implements \Countable, \IteratorAggregate * @return void */ - public function addDocument(\DOMDocument $dom) + public function addDocument(\DOMDocument $dom): void { if ($dom->documentElement) { -@@ -260,5 +260,5 @@ class Crawler implements \Countable, \IteratorAggregate +@@ -259,5 +259,5 @@ class Crawler implements \Countable, \IteratorAggregate * @return void */ - public function addNodeList(\DOMNodeList $nodes) + public function addNodeList(\DOMNodeList $nodes): void { foreach ($nodes as $node) { -@@ -276,5 +276,5 @@ class Crawler implements \Countable, \IteratorAggregate +@@ -275,5 +275,5 @@ class Crawler implements \Countable, \IteratorAggregate * @return void */ - public function addNodes(array $nodes) + public function addNodes(array $nodes): void { foreach ($nodes as $node) { -@@ -290,5 +290,5 @@ class Crawler implements \Countable, \IteratorAggregate +@@ -289,5 +289,5 @@ class Crawler implements \Countable, \IteratorAggregate * @return void */ - public function addNode(\DOMNode $node) + public function addNode(\DOMNode $node): void { if ($node instanceof \DOMDocument) { -@@ -891,5 +891,5 @@ class Crawler implements \Countable, \IteratorAggregate +@@ -890,5 +890,5 @@ class Crawler implements \Countable, \IteratorAggregate * @return void */ - public function setDefaultNamespacePrefix(string $prefix) + public function setDefaultNamespacePrefix(string $prefix): void { $this->defaultNamespacePrefix = $prefix; -@@ -899,5 +899,5 @@ class Crawler implements \Countable, \IteratorAggregate +@@ -898,5 +898,5 @@ class Crawler implements \Countable, \IteratorAggregate * @return void */ - public function registerNamespace(string $prefix, string $namespace) @@ -4578,7 +4605,7 @@ + public function setValue(string|array|bool|null $value): void { if ('checkbox' === $this->type && false === $value) { -@@ -191,5 +191,5 @@ class ChoiceFormField extends FormField +@@ -195,5 +195,5 @@ class ChoiceFormField extends FormField * @throws \LogicException When node type is incorrect */ - protected function initialize() @@ -5073,7 +5100,7 @@ - public function getNodes() + public function getNodes(): Node { - return unserialize($this->nodes); + return unserialize($this->nodes, ['allowed_classes' => true]); diff --git a/src/Symfony/Component/ExpressionLanguage/TokenStream.php b/src/Symfony/Component/ExpressionLanguage/TokenStream.php --- a/src/Symfony/Component/ExpressionLanguage/TokenStream.php +++ b/src/Symfony/Component/ExpressionLanguage/TokenStream.php @@ -6682,7 +6709,7 @@ diff --git a/src/Symfony/Component/Form/Extension/Validator/ViolationMapper/ViolationMapper.php b/src/Symfony/Component/Form/Extension/Validator/ViolationMapper/ViolationMapper.php --- a/src/Symfony/Component/Form/Extension/Validator/ViolationMapper/ViolationMapper.php +++ b/src/Symfony/Component/Form/Extension/Validator/ViolationMapper/ViolationMapper.php -@@ -42,5 +42,5 @@ class ViolationMapper implements ViolationMapperInterface +@@ -43,5 +43,5 @@ class ViolationMapper implements ViolationMapperInterface * @return void */ - public function mapViolation(ConstraintViolation $violation, FormInterface $form, bool $allowNonSynchronized = false) @@ -7202,49 +7229,49 @@ + public function setSession(SessionInterface $session): void { $this->session = $session; -@@ -1212,5 +1212,5 @@ class Request +@@ -1208,5 +1208,5 @@ class Request * @return void */ - public function setMethod(string $method) + public function setMethod(string $method): void { $this->method = null; -@@ -1342,5 +1342,5 @@ class Request +@@ -1338,5 +1338,5 @@ class Request * @return void */ - public function setFormat(?string $format, string|array $mimeTypes) + public function setFormat(?string $format, string|array $mimeTypes): void { if (null === static::$formats) { -@@ -1374,5 +1374,5 @@ class Request +@@ -1370,5 +1370,5 @@ class Request * @return void */ - public function setRequestFormat(?string $format) + public function setRequestFormat(?string $format): void { $this->format = $format; -@@ -1406,5 +1406,5 @@ class Request +@@ -1402,5 +1402,5 @@ class Request * @return void */ - public function setDefaultLocale(string $locale) + public function setDefaultLocale(string $locale): void { $this->defaultLocale = $locale; -@@ -1428,5 +1428,5 @@ class Request +@@ -1424,5 +1424,5 @@ class Request * @return void */ - public function setLocale(string $locale) + public function setLocale(string $locale): void { $this->setPhpDefaultLocale($this->locale = $locale); -@@ -1785,5 +1785,5 @@ class Request +@@ -1781,5 +1781,5 @@ class Request * @return string */ - protected function prepareRequestUri() + protected function prepareRequestUri(): string { $requestUri = ''; -@@ -1954,5 +1954,5 @@ class Request +@@ -1950,5 +1950,5 @@ class Request * @return void */ - protected static function initializeFormats() @@ -7641,10 +7668,47 @@ + public function registerBag(SessionBagInterface $bag): void; /** +diff --git a/src/Symfony/Component/HttpFoundation/Session/Storage/Handler/AbstractSessionHandler.php b/src/Symfony/Component/HttpFoundation/Session/Storage/Handler/AbstractSessionHandler.php +--- a/src/Symfony/Component/HttpFoundation/Session/Storage/Handler/AbstractSessionHandler.php ++++ b/src/Symfony/Component/HttpFoundation/Session/Storage/Handler/AbstractSessionHandler.php +@@ -42,5 +42,5 @@ abstract class AbstractSessionHandler implements \SessionHandlerInterface, \Sess + * @return string + */ +- public function create_sid() ++ public function create_sid(): string + { + return session_create_id() ?: throw new \RuntimeException('Unable to create a session ID.'); +diff --git a/src/Symfony/Component/HttpFoundation/Session/Storage/Handler/MarshallingSessionHandler.php b/src/Symfony/Component/HttpFoundation/Session/Storage/Handler/MarshallingSessionHandler.php +--- a/src/Symfony/Component/HttpFoundation/Session/Storage/Handler/MarshallingSessionHandler.php ++++ b/src/Symfony/Component/HttpFoundation/Session/Storage/Handler/MarshallingSessionHandler.php +@@ -41,5 +41,5 @@ class MarshallingSessionHandler implements \SessionHandlerInterface, \SessionUpd + * @return string + */ +- public function create_sid() ++ public function create_sid(): string + { + return session_create_id() ?: throw new \RuntimeException('Unable to create a session ID.'); +diff --git a/src/Symfony/Component/HttpFoundation/Session/Storage/Handler/MigratingSessionHandler.php b/src/Symfony/Component/HttpFoundation/Session/Storage/Handler/MigratingSessionHandler.php +--- a/src/Symfony/Component/HttpFoundation/Session/Storage/Handler/MigratingSessionHandler.php ++++ b/src/Symfony/Component/HttpFoundation/Session/Storage/Handler/MigratingSessionHandler.php +@@ -42,5 +42,5 @@ class MigratingSessionHandler implements \SessionHandlerInterface, \SessionUpdat + * @return string + */ +- public function create_sid() ++ public function create_sid(): string + { + return session_create_id() ?: throw new \RuntimeException('Unable to create a session ID.'); diff --git a/src/Symfony/Component/HttpFoundation/Session/Storage/Handler/PdoSessionHandler.php b/src/Symfony/Component/HttpFoundation/Session/Storage/Handler/PdoSessionHandler.php --- a/src/Symfony/Component/HttpFoundation/Session/Storage/Handler/PdoSessionHandler.php +++ b/src/Symfony/Component/HttpFoundation/Session/Storage/Handler/PdoSessionHandler.php -@@ -241,5 +241,5 @@ class PdoSessionHandler extends AbstractSessionHandler +@@ -190,5 +190,5 @@ class PdoSessionHandler extends AbstractSessionHandler + * @return Schema The (possibly new) schema with the table added + */ +- public function configureSchema(Schema $schema, ?\Closure $isSameDatabase = null) ++ public function configureSchema(Schema $schema, ?\Closure $isSameDatabase = null): Schema + { + if ($schema->hasTable($this->table) || ($isSameDatabase && !$isSameDatabase($this->getConnection()->exec(...)))) { +@@ -319,5 +319,5 @@ class PdoSessionHandler extends AbstractSessionHandler * @throws \DomainException When an unsupported PDO driver is used */ - public function createTable() @@ -7740,6 +7804,13 @@ @@ -77,5 +77,5 @@ class MockFileSessionStorage extends MockArraySessionStorage * @return void */ +- public function setId(string $id) ++ public function setId(string $id): void + { + // the id is turned into a file name, so keep it to the charset PHP allows for session ids +@@ -91,5 +91,5 @@ class MockFileSessionStorage extends MockArraySessionStorage + * @return void + */ - public function save() + public function save(): void { @@ -7837,6 +7908,16 @@ + public function setName(string $name): void { if ($this->isActive()) { +diff --git a/src/Symfony/Component/HttpFoundation/Session/Storage/Proxy/SessionHandlerProxy.php b/src/Symfony/Component/HttpFoundation/Session/Storage/Proxy/SessionHandlerProxy.php +--- a/src/Symfony/Component/HttpFoundation/Session/Storage/Proxy/SessionHandlerProxy.php ++++ b/src/Symfony/Component/HttpFoundation/Session/Storage/Proxy/SessionHandlerProxy.php +@@ -68,5 +68,5 @@ class SessionHandlerProxy extends AbstractProxy implements \SessionHandlerInterf + * @return string + */ +- public function create_sid() ++ public function create_sid(): string + { + return session_create_id() ?: throw new \RuntimeException('Unable to create a session ID.'); diff --git a/src/Symfony/Component/HttpFoundation/Session/Storage/SessionStorageInterface.php b/src/Symfony/Component/HttpFoundation/Session/Storage/SessionStorageInterface.php --- a/src/Symfony/Component/HttpFoundation/Session/Storage/SessionStorageInterface.php +++ b/src/Symfony/Component/HttpFoundation/Session/Storage/SessionStorageInterface.php @@ -8373,28 +8454,28 @@ diff --git a/src/Symfony/Component/HttpKernel/HttpCache/HttpCache.php b/src/Symfony/Component/HttpKernel/HttpCache/HttpCache.php --- a/src/Symfony/Component/HttpKernel/HttpCache/HttpCache.php +++ b/src/Symfony/Component/HttpKernel/HttpCache/HttpCache.php -@@ -255,5 +255,5 @@ class HttpCache implements HttpKernelInterface, TerminableInterface +@@ -265,5 +265,5 @@ class HttpCache implements HttpKernelInterface, TerminableInterface * @return void */ - public function terminate(Request $request, Response $response) + public function terminate(Request $request, Response $response): void { // Do not call any listeners in case of a cache hit. -@@ -475,5 +475,5 @@ class HttpCache implements HttpKernelInterface, TerminableInterface +@@ -485,5 +485,5 @@ class HttpCache implements HttpKernelInterface, TerminableInterface * @return Response */ - protected function forward(Request $request, bool $catch = false, ?Response $entry = null) + protected function forward(Request $request, bool $catch = false, ?Response $entry = null): Response { $this->surrogate?->addSurrogateCapability($request); -@@ -600,5 +600,5 @@ class HttpCache implements HttpKernelInterface, TerminableInterface +@@ -611,5 +611,5 @@ class HttpCache implements HttpKernelInterface, TerminableInterface * @throws \Exception */ - protected function store(Request $request, Response $response) + protected function store(Request $request, Response $response): void { try { -@@ -678,5 +678,5 @@ class HttpCache implements HttpKernelInterface, TerminableInterface +@@ -689,5 +689,5 @@ class HttpCache implements HttpKernelInterface, TerminableInterface * @return void */ - protected function processResponseBody(Request $request, Response $response) @@ -9225,27 +9306,34 @@ diff --git a/src/Symfony/Component/Lock/Store/DoctrineDbalStore.php b/src/Symfony/Component/Lock/Store/DoctrineDbalStore.php --- a/src/Symfony/Component/Lock/Store/DoctrineDbalStore.php +++ b/src/Symfony/Component/Lock/Store/DoctrineDbalStore.php -@@ -100,5 +100,5 @@ class DoctrineDbalStore implements PersistingStoreInterface +@@ -105,5 +105,5 @@ class DoctrineDbalStore implements PersistingStoreInterface * @return void */ - public function save(Key $key) + public function save(Key $key): void { $key->reduceLifetime($this->initialTtl); -@@ -142,5 +142,5 @@ class DoctrineDbalStore implements PersistingStoreInterface +@@ -194,5 +194,5 @@ class DoctrineDbalStore implements PersistingStoreInterface * @return void */ - public function putOffExpiration(Key $key, $ttl) + public function putOffExpiration(Key $key, $ttl): void { if ($ttl < 1) { -@@ -176,5 +176,5 @@ class DoctrineDbalStore implements PersistingStoreInterface +@@ -228,5 +228,5 @@ class DoctrineDbalStore implements PersistingStoreInterface * @return void */ - public function delete(Key $key) + public function delete(Key $key): void { $this->conn->delete($this->table, [ +@@ -272,5 +272,5 @@ class DoctrineDbalStore implements PersistingStoreInterface + * @return Schema The (possibly new) schema with the table added + */ +- public function configureSchema(Schema $schema/* , \Closure $isSameDatabase */) ++ public function configureSchema(Schema $schema/* , \Closure $isSameDatabase */): Schema + { + if ($schema->hasTable($this->table)) { diff --git a/src/Symfony/Component/Lock/Store/FlockStore.php b/src/Symfony/Component/Lock/Store/FlockStore.php --- a/src/Symfony/Component/Lock/Store/FlockStore.php +++ b/src/Symfony/Component/Lock/Store/FlockStore.php @@ -9394,14 +9482,14 @@ + public function save(Key $key): void { $key->reduceLifetime($this->initialTtl); -@@ -129,5 +129,5 @@ class PdoStore implements PersistingStoreInterface +@@ -188,5 +188,5 @@ class PdoStore implements PersistingStoreInterface * @return void */ - public function putOffExpiration(Key $key, float $ttl) + public function putOffExpiration(Key $key, float $ttl): void { if ($ttl < 1) { -@@ -157,5 +157,5 @@ class PdoStore implements PersistingStoreInterface +@@ -216,5 +216,5 @@ class PdoStore implements PersistingStoreInterface * @return void */ - public function delete(Key $key) @@ -9566,10 +9654,20 @@ + private function getReceiver(): MessageCountAwareInterface&ReceiverInterface { return $this->receiver ??= new AmazonSqsReceiver($this->connection, $this->serializer); +diff --git a/src/Symfony/Component/Messenger/Bridge/Doctrine/Transport/DoctrineTransport.php b/src/Symfony/Component/Messenger/Bridge/Doctrine/Transport/DoctrineTransport.php +--- a/src/Symfony/Component/Messenger/Bridge/Doctrine/Transport/DoctrineTransport.php ++++ b/src/Symfony/Component/Messenger/Bridge/Doctrine/Transport/DoctrineTransport.php +@@ -85,5 +85,5 @@ class DoctrineTransport implements TransportInterface, SetupableTransportInterfa + * @return Schema The (possibly new) schema with the table added + */ +- public function configureSchema(Schema $schema, DbalConnection $forConnection/* , \Closure $isSameDatabase */) ++ public function configureSchema(Schema $schema, DbalConnection $forConnection/* , \Closure $isSameDatabase */): Schema + { + $isSameDatabase = 2 < \func_num_args() ? func_get_arg(2) : static fn () => false; diff --git a/src/Symfony/Component/Messenger/Command/ConsumeMessagesCommand.php b/src/Symfony/Component/Messenger/Command/ConsumeMessagesCommand.php --- a/src/Symfony/Component/Messenger/Command/ConsumeMessagesCommand.php +++ b/src/Symfony/Component/Messenger/Command/ConsumeMessagesCommand.php -@@ -132,5 +132,5 @@ class ConsumeMessagesCommand extends Command implements SignalableCommandInterfa +@@ -131,5 +131,5 @@ class ConsumeMessagesCommand extends Command implements SignalableCommandInterfa * @return void */ - protected function interact(InputInterface $input, OutputInterface $output) @@ -9695,7 +9793,7 @@ - public function process(ContainerBuilder $container) + public function process(ContainerBuilder $container): void { - if ($container->has('mime_types')) { + if (!$container->has('mime_types')) { diff --git a/src/Symfony/Component/Mime/Email.php b/src/Symfony/Component/Mime/Email.php --- a/src/Symfony/Component/Mime/Email.php +++ b/src/Symfony/Component/Mime/Email.php @@ -9978,21 +10076,21 @@ + public function start(?callable $callback = null, array $env = []): void { if ($this->isRunning()) { -@@ -1147,5 +1147,5 @@ class Process implements \IteratorAggregate +@@ -1151,5 +1151,5 @@ class Process implements \IteratorAggregate * @throws ProcessTimedOutException In case the timeout was reached */ - public function checkTimeout() + public function checkTimeout(): void { if (self::STATUS_STARTED !== $this->status) { -@@ -1188,5 +1188,5 @@ class Process implements \IteratorAggregate +@@ -1192,5 +1192,5 @@ class Process implements \IteratorAggregate * @return void */ - public function setOptions(array $options) + public function setOptions(array $options): void { if ($this->isRunning()) { -@@ -1285,5 +1285,5 @@ class Process implements \IteratorAggregate +@@ -1289,5 +1289,5 @@ class Process implements \IteratorAggregate * @return void */ - protected function updateStatus(bool $blocking) @@ -10462,14 +10560,14 @@ + public function setContext(RequestContext $context): void { $this->context = $context; -@@ -106,5 +106,5 @@ class UrlMatcher implements UrlMatcherInterface, RequestMatcherInterface +@@ -109,5 +109,5 @@ class UrlMatcher implements UrlMatcherInterface, RequestMatcherInterface * @return void */ - public function addExpressionLanguageProvider(ExpressionFunctionProviderInterface $provider) + public function addExpressionLanguageProvider(ExpressionFunctionProviderInterface $provider): void { $this->expressionLanguageProviders[] = $provider; -@@ -260,5 +260,5 @@ class UrlMatcher implements UrlMatcherInterface, RequestMatcherInterface +@@ -263,5 +263,5 @@ class UrlMatcher implements UrlMatcherInterface, RequestMatcherInterface * @return ExpressionLanguage */ - protected function getExpressionLanguage() @@ -10691,28 +10789,28 @@ diff --git a/src/Symfony/Component/Security/Core/Authentication/Token/AbstractToken.php b/src/Symfony/Component/Security/Core/Authentication/Token/AbstractToken.php --- a/src/Symfony/Component/Security/Core/Authentication/Token/AbstractToken.php +++ b/src/Symfony/Component/Security/Core/Authentication/Token/AbstractToken.php -@@ -57,5 +57,5 @@ abstract class AbstractToken implements TokenInterface, \Serializable +@@ -63,5 +63,5 @@ abstract class AbstractToken implements TokenInterface * @return void */ - public function setUser(UserInterface $user) + public function setUser(UserInterface $user): void { $this->user = $user; -@@ -65,5 +65,5 @@ abstract class AbstractToken implements TokenInterface, \Serializable +@@ -71,5 +71,5 @@ abstract class AbstractToken implements TokenInterface * @return void */ - public function eraseCredentials() + public function eraseCredentials(): void { if ($this->getUser() instanceof UserInterface) { -@@ -122,5 +122,5 @@ abstract class AbstractToken implements TokenInterface, \Serializable +@@ -128,5 +128,5 @@ abstract class AbstractToken implements TokenInterface * @return void */ - public function setAttributes(array $attributes) + public function setAttributes(array $attributes): void { $this->attributes = $attributes; -@@ -144,5 +144,5 @@ abstract class AbstractToken implements TokenInterface, \Serializable +@@ -150,5 +150,5 @@ abstract class AbstractToken implements TokenInterface * @return void */ - public function setAttribute(string $name, mixed $value) @@ -10883,7 +10981,7 @@ + public function setToken(TokenInterface $token): void { $this->token = $token; -@@ -85,5 +85,5 @@ class AuthenticationException extends RuntimeException +@@ -91,5 +91,5 @@ class AuthenticationException extends RuntimeException * @return string */ - public function getMessageKey() @@ -11372,63 +11470,63 @@ diff --git a/src/Symfony/Component/Serializer/Normalizer/AbstractObjectNormalizer.php b/src/Symfony/Component/Serializer/Normalizer/AbstractObjectNormalizer.php --- a/src/Symfony/Component/Serializer/Normalizer/AbstractObjectNormalizer.php +++ b/src/Symfony/Component/Serializer/Normalizer/AbstractObjectNormalizer.php -@@ -146,5 +146,5 @@ abstract class AbstractObjectNormalizer extends AbstractNormalizer +@@ -145,5 +145,5 @@ abstract class AbstractObjectNormalizer extends AbstractNormalizer * @return bool */ - public function supportsNormalization(mixed $data, ?string $format = null /* , array $context = [] */) + public function supportsNormalization(mixed $data, ?string $format = null /* , array $context = [] */): bool { return \is_object($data) && !$data instanceof \Traversable; -@@ -154,5 +154,5 @@ abstract class AbstractObjectNormalizer extends AbstractNormalizer +@@ -153,5 +153,5 @@ abstract class AbstractObjectNormalizer extends AbstractNormalizer * @return array|string|int|float|bool|\ArrayObject|null */ - public function normalize(mixed $object, ?string $format = null, array $context = []) + public function normalize(mixed $object, ?string $format = null, array $context = []): array|string|int|float|bool|\ArrayObject|null { $context['_read_attributes'] = true; -@@ -236,5 +236,5 @@ abstract class AbstractObjectNormalizer extends AbstractNormalizer +@@ -235,5 +235,5 @@ abstract class AbstractObjectNormalizer extends AbstractNormalizer * @return object */ - protected function instantiateObject(array &$data, string $class, array &$context, \ReflectionClass $reflectionClass, array|bool $allowedAttributes, ?string $format = null) + protected function instantiateObject(array &$data, string $class, array &$context, \ReflectionClass $reflectionClass, array|bool $allowedAttributes, ?string $format = null): object { if ($class !== $mappedClass = $this->getMappedClass($data, $class, $context)) { -@@ -287,5 +287,5 @@ abstract class AbstractObjectNormalizer extends AbstractNormalizer +@@ -286,5 +286,5 @@ abstract class AbstractObjectNormalizer extends AbstractNormalizer * @return string[] */ - abstract protected function extractAttributes(object $object, ?string $format = null, array $context = []); + abstract protected function extractAttributes(object $object, ?string $format = null, array $context = []): array; /** -@@ -294,5 +294,5 @@ abstract class AbstractObjectNormalizer extends AbstractNormalizer - * @return mixed +@@ -295,5 +295,5 @@ abstract class AbstractObjectNormalizer extends AbstractNormalizer + * @throws UninitializedPropertyException When the attribute exists but is not initialized on the object */ - abstract protected function getAttributeValue(object $object, string $attribute, ?string $format = null, array $context = []); + abstract protected function getAttributeValue(object $object, string $attribute, ?string $format = null, array $context = []): mixed; /** -@@ -301,5 +301,5 @@ abstract class AbstractObjectNormalizer extends AbstractNormalizer +@@ -302,5 +302,5 @@ abstract class AbstractObjectNormalizer extends AbstractNormalizer * @return bool */ - public function supportsDenormalization(mixed $data, string $type, ?string $format = null /* , array $context = [] */) + public function supportsDenormalization(mixed $data, string $type, ?string $format = null /* , array $context = [] */): bool { return class_exists($type) || (interface_exists($type, false) && null !== $this->classDiscriminatorResolver?->getMappingForClass($type)); -@@ -309,5 +309,5 @@ abstract class AbstractObjectNormalizer extends AbstractNormalizer +@@ -310,5 +310,5 @@ abstract class AbstractObjectNormalizer extends AbstractNormalizer * @return mixed */ - public function denormalize(mixed $data, string $type, ?string $format = null, array $context = []) + public function denormalize(mixed $data, string $type, ?string $format = null, array $context = []): mixed { $context['_read_attributes'] = false; -@@ -442,5 +442,5 @@ abstract class AbstractObjectNormalizer extends AbstractNormalizer - * @return void +@@ -436,5 +436,5 @@ abstract class AbstractObjectNormalizer extends AbstractNormalizer + * @throws NotNormalizableValueException When the value cannot be assigned to the attribute (e.g. type mismatch) */ - abstract protected function setAttributeValue(object $object, string $attribute, mixed $value, ?string $format = null, array $context = []); + abstract protected function setAttributeValue(object $object, string $attribute, mixed $value, ?string $format = null, array $context = []): void; /** -@@ -786,5 +786,5 @@ abstract class AbstractObjectNormalizer extends AbstractNormalizer +@@ -780,5 +780,5 @@ abstract class AbstractObjectNormalizer extends AbstractNormalizer } - protected function getAllowedAttributes(string|object $classOrObject, array $context, bool $attributesAsString = false) @@ -11473,14 +11571,14 @@ diff --git a/src/Symfony/Component/Serializer/Normalizer/GetSetMethodNormalizer.php b/src/Symfony/Component/Serializer/Normalizer/GetSetMethodNormalizer.php --- a/src/Symfony/Component/Serializer/Normalizer/GetSetMethodNormalizer.php +++ b/src/Symfony/Component/Serializer/Normalizer/GetSetMethodNormalizer.php -@@ -175,5 +175,5 @@ class GetSetMethodNormalizer extends AbstractObjectNormalizer +@@ -183,5 +183,5 @@ class GetSetMethodNormalizer extends AbstractObjectNormalizer * @return void */ - protected function setAttributeValue(object $object, string $attribute, mixed $value, ?string $format = null, array $context = []) + protected function setAttributeValue(object $object, string $attribute, mixed $value, ?string $format = null, array $context = []): void { $setter = 'set'.$attribute; -@@ -189,5 +189,5 @@ class GetSetMethodNormalizer extends AbstractObjectNormalizer +@@ -197,5 +197,5 @@ class GetSetMethodNormalizer extends AbstractObjectNormalizer } - protected function isAllowedAttribute($classOrObject, string $attribute, ?string $format = null, array $context = []) @@ -11526,14 +11624,14 @@ diff --git a/src/Symfony/Component/Serializer/Normalizer/ObjectNormalizer.php b/src/Symfony/Component/Serializer/Normalizer/ObjectNormalizer.php --- a/src/Symfony/Component/Serializer/Normalizer/ObjectNormalizer.php +++ b/src/Symfony/Component/Serializer/Normalizer/ObjectNormalizer.php -@@ -131,5 +131,5 @@ class ObjectNormalizer extends AbstractObjectNormalizer +@@ -133,5 +133,5 @@ class ObjectNormalizer extends AbstractObjectNormalizer * @return void */ - protected function setAttributeValue(object $object, string $attribute, mixed $value, ?string $format = null, array $context = []) + protected function setAttributeValue(object $object, string $attribute, mixed $value, ?string $format = null, array $context = []): void { try { -@@ -140,5 +140,5 @@ class ObjectNormalizer extends AbstractObjectNormalizer +@@ -144,5 +144,5 @@ class ObjectNormalizer extends AbstractObjectNormalizer } - protected function isAllowedAttribute($classOrObject, string $attribute, ?string $format = null, array $context = []) @@ -11543,7 +11641,7 @@ diff --git a/src/Symfony/Component/Serializer/Normalizer/PropertyNormalizer.php b/src/Symfony/Component/Serializer/Normalizer/PropertyNormalizer.php --- a/src/Symfony/Component/Serializer/Normalizer/PropertyNormalizer.php +++ b/src/Symfony/Component/Serializer/Normalizer/PropertyNormalizer.php -@@ -196,5 +196,5 @@ class PropertyNormalizer extends AbstractObjectNormalizer +@@ -201,5 +201,5 @@ class PropertyNormalizer extends AbstractObjectNormalizer * @return void */ - protected function setAttributeValue(object $object, string $attribute, mixed $value, ?string $format = null, array $context = []) @@ -11782,7 +11880,7 @@ diff --git a/src/Symfony/Component/Translation/Catalogue/AbstractOperation.php b/src/Symfony/Component/Translation/Catalogue/AbstractOperation.php --- a/src/Symfony/Component/Translation/Catalogue/AbstractOperation.php +++ b/src/Symfony/Component/Translation/Catalogue/AbstractOperation.php -@@ -184,4 +184,4 @@ abstract class AbstractOperation implements OperationInterface +@@ -190,4 +190,4 @@ abstract class AbstractOperation implements OperationInterface * @return void */ - abstract protected function processDomain(string $domain); diff -Nru symfony-6.4.41+dfsg/.github/sa-tools/.gitignore symfony-6.4.49+dfsg/.github/sa-tools/.gitignore --- symfony-6.4.41+dfsg/.github/sa-tools/.gitignore 2026-05-27 08:23:35.000000000 +0000 +++ symfony-6.4.49+dfsg/.github/sa-tools/.gitignore 2026-10-28 18:15:18.000000000 +0000 @@ -1,6 +1,10 @@ * !.gitignore !psalm.baseline.xml -!phpstan.baseline.neon +!phpstan-diff.php +!check-hardening-tests.php +!rules.neon +!rules +!rules/* !stubs !stubs/* diff -Nru symfony-6.4.41+dfsg/.github/sa-tools/check-hardening-tests.php symfony-6.4.49+dfsg/.github/sa-tools/check-hardening-tests.php --- symfony-6.4.41+dfsg/.github/sa-tools/check-hardening-tests.php 1970-01-01 00:00:00.000000000 +0000 +++ symfony-6.4.49+dfsg/.github/sa-tools/check-hardening-tests.php 2026-10-28 18:15:18.000000000 +0000 @@ -0,0 +1,259 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +// Enforces that security-sensitive boundary classes ship their hardening +// regression test, so the protection is not silently dropped later: +// +// A. Every concrete RequestParser (extends AbstractRequestParser) must have a +// test that expects a RejectWebhookException, proving the reject path is +// exercised (missing/forged/empty secret, unknown IP, malformed payload). +// B. Every class with __unserialize() and a string-typed property must have a +// test that feeds a __toString gadget through unserialize(), proving the +// property does not become a __toString trampoline. +// +// Companion to the PHPStan rules HardenedComparisonRule (timing-safe compare) +// and UnserializeToStringTrampolineRule (the missing guard itself). Those flag +// missing hardening in the implementation; this flags missing hardening in the +// test suite. Runs on the tokenizer only, no autoloading of the analysed code. + +$root = \dirname(__DIR__, 2).'/src/Symfony'; + +// Pre-existing gaps accepted on this branch. Each entry is a TODO, not a waiver: +// add a reason, remove the entry once the test is written. New violations are +// not allowed here and fail the build. +const ALLOWLIST = [ + // 'Symfony\Component\...\FooRequestParser' => 'reason', +]; + +/** + * @return array{fqcn:string, abstract:bool, extends:?string, methods:list, hasStringProperty:bool}|null + */ +function analyze(string $path): ?array +{ + $tokens = \PhpToken::tokenize(file_get_contents($path)); + + $namespace = ''; + $class = null; + $abstract = false; + $extends = null; + $methods = []; + $sawAbstract = false; + $expectClassName = false; + $expectExtends = false; + + foreach ($tokens as $i => $token) { + if ($token->is(T_NAMESPACE)) { + $namespace = trim(collectName($tokens, $i + 1)); + continue; + } + if ($token->is(T_ABSTRACT)) { + $sawAbstract = true; + continue; + } + if ($token->is(T_CLASS) && null === $class) { + $abstract = $sawAbstract; + $expectClassName = true; + continue; + } + if ($expectClassName && $token->is(T_STRING)) { + $class = $token->text; + $expectClassName = false; + continue; + } + if (null !== $class && null === $extends && $token->is(T_EXTENDS)) { + $expectExtends = true; + continue; + } + if ($expectExtends && ($token->is(T_STRING) || $token->is(T_NAME_QUALIFIED) || $token->is(T_NAME_FULLY_QUALIFIED))) { + // keep only the short name of the parent + $parts = explode('\\', $token->text); + $extends = end($parts); + $expectExtends = false; + continue; + } + if ($token->is(T_FUNCTION)) { + if (null !== $name = nextString($tokens, $i + 1)) { + $methods[] = $name; + } + } + } + + if (null === $class) { + return null; + } + + return [ + 'fqcn' => '' !== $namespace ? $namespace.'\\'.$class : $class, + 'abstract' => $abstract, + 'extends' => $extends, + 'methods' => $methods, + 'hasStringProperty' => hasStringProperty(file_get_contents($path)), + 'unserializeRestoresState' => unserializeRestoresState($tokens), + ]; +} + +// True when __unserialize() actually restores object state, i.e. its first +// statement is not an unconditional throw. A class that refuses to unserialize +// ("throw new \BadMethodCallException(...)") has no trampoline surface and so +// needs no trampoline test. +function unserializeRestoresState(array $tokens): bool +{ + $n = \count($tokens); + for ($i = 0; $i < $n; ++$i) { + if (!$tokens[$i]->is(T_FUNCTION) || '__unserialize' !== nextString($tokens, $i + 1)) { + continue; + } + // advance to the body opening brace + for ($j = $i + 1; $j < $n && !$tokens[$j]->is('{'); ++$j); + // first significant token inside the body + for ($k = $j + 1; $k < $n; ++$k) { + if ($tokens[$k]->isIgnorable()) { + continue; + } + + return !$tokens[$k]->is(T_THROW); + } + } + + return false; +} + +/** + * @param list<\PhpToken> $tokens + */ +function collectName(array $tokens, int $from): string +{ + $name = ''; + for ($i = $from, $n = \count($tokens); $i < $n; ++$i) { + if ($tokens[$i]->is(';') || $tokens[$i]->is('{')) { + break; + } + if ($tokens[$i]->isIgnorable()) { + continue; + } + $name .= $tokens[$i]->text; + } + + return $name; +} + +/** + * @param list<\PhpToken> $tokens + */ +function nextString(array $tokens, int $from): ?string +{ + for ($i = $from, $n = \count($tokens); $i < $n; ++$i) { + if ($tokens[$i]->isIgnorable()) { + continue; + } + + return $tokens[$i]->is(T_STRING) ? $tokens[$i]->text : null; + } + + return null; +} + +// A property (incl. constructor-promoted) typed exactly "string" or "?string". +function hasStringProperty(string $source): bool +{ + return 1 === preg_match('/(?:private|protected|public)(?:\s+readonly)?\s+\?\s*string\s+\$/', $source); +} + +function nearestComposerDir(string $path): ?string +{ + $dir = \dirname($path); + while (str_starts_with($dir, '/') && false !== strpos($dir, '/src/Symfony')) { + if (is_file($dir.'/composer.json')) { + return $dir; + } + $dir = \dirname($dir); + } + + return null; +} + +/** + * @param list $allNeedles every needle must be present in a single test file + */ +function testTreeContains(string $componentDir, array $allNeedles): bool +{ + $testsDir = $componentDir.'/Tests'; + if (!is_dir($testsDir)) { + return false; + } + + foreach (new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($testsDir, \FilesystemIterator::SKIP_DOTS)) as $file) { + if (!$file->isFile() || 'php' !== $file->getExtension()) { + continue; + } + $code = file_get_contents($file->getPathname()); + foreach ($allNeedles as $needle) { + if (false === stripos($code, $needle)) { + continue 2; + } + } + + return true; + } + + return false; +} + +$violations = []; + +$it = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($root, \FilesystemIterator::SKIP_DOTS)); +foreach ($it as $file) { + if (!$file->isFile() || 'php' !== $file->getExtension() || false !== strpos($file->getPathname(), '/Tests/') || false !== strpos($file->getPathname(), '/vendor/')) { + continue; + } + + $info = analyze($file->getPathname()); + if (null === $info) { + continue; + } + + $componentDir = nearestComposerDir($file->getPathname()); + if (null === $componentDir) { + continue; + } + + // Check A: concrete webhook RequestParser must have a reject-path test. + if (!$info['abstract'] && 'AbstractRequestParser' === $info['extends']) { + if (!testTreeContains($componentDir, ['RejectWebhookException', 'expectException'])) { + $violations[$info['fqcn']] = \sprintf('%s extends AbstractRequestParser but no test expects RejectWebhookException.', $info['fqcn']); + } + } + + // Check B: serializable class with a string property must have a trampoline test. + if (\in_array('__unserialize', $info['methods'], true) && $info['hasStringProperty'] && $info['unserializeRestoresState']) { + if (!testTreeContains($componentDir, ['__toString', 'unserialize'])) { + $violations[$info['fqcn']] = \sprintf('%s has __unserialize() with a string property but no __toString-trampoline test.', $info['fqcn']); + } + } +} + +$unexpected = array_diff_key($violations, ALLOWLIST); +$stale = array_diff_key(ALLOWLIST, $violations); + +foreach ($unexpected as $message) { + echo '::error::'.$message."\n"; +} + +foreach ($stale as $fqcn => $reason) { + echo \sprintf("::warning::Allow-listed class \"%s\" no longer violates the convention (%s); remove it from the allow-list.\n", $fqcn, $reason); +} + +if ($unexpected) { + echo \sprintf("\n%d hardening-test convention violation(s). Add the missing test, or, only for an accepted pre-existing gap, an entry to the allow-list in %s.\n", \count($unexpected), 'check-hardening-tests.php'); + exit(1); +} + +echo \sprintf("Hardening-test convention satisfied (%d allow-listed gap(s)).\n", \count(ALLOWLIST)); diff -Nru symfony-6.4.41+dfsg/.github/sa-tools/phpstan-diff.php symfony-6.4.49+dfsg/.github/sa-tools/phpstan-diff.php --- symfony-6.4.41+dfsg/.github/sa-tools/phpstan-diff.php 1970-01-01 00:00:00.000000000 +0000 +++ symfony-6.4.49+dfsg/.github/sa-tools/phpstan-diff.php 2026-10-28 18:15:18.000000000 +0000 @@ -0,0 +1,72 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +// Compares two PHPStan JSON reports and fails if the second one (the PR) holds +// errors that are not already present in the first one (the target branch). +// Errors are matched on (file, message), ignoring line numbers, so that they +// keep being recognized when surrounding code shifts. This mirrors how Psalm's +// baseline works and, unlike PHPStan's own baseline, also covers errors PHPStan +// marks as non-ignorable. + +function load(string $file): array +{ + $report = json_decode(file_get_contents($file), true) ?: []; + + $bag = []; + foreach ($report['files'] ?? [] as $path => $data) { + foreach ($data['messages'] ?? [] as $message) { + $key = $path."\0".$message['message']; + $bag[$key] = ($bag[$key] ?? 0) + 1; + } + } + foreach ($report['errors'] ?? [] as $error) { + $bag["\0".$error] = ($bag["\0".$error] ?? 0) + 1; + } + + return [$report, $bag]; +} + +function annotation(string $message): string +{ + return strtr($message, ["\r" => '', "\n" => ' ', '%' => '%25']); +} + +[, $baseBag] = load($argv[1]); +[$pr] = load($argv[2]); + +$new = []; + +foreach ($pr['files'] ?? [] as $path => $data) { + foreach ($data['messages'] ?? [] as $message) { + $key = $path."\0".$message['message']; + if (0 < ($baseBag[$key] ?? 0)) { + --$baseBag[$key]; + continue; + } + $new[] = sprintf('::error file=%s,line=%d::%s', $path, $message['line'] ?? 0, annotation($message['message'])); + } +} + +foreach ($pr['errors'] ?? [] as $error) { + $key = "\0".$error; + if (0 < ($baseBag[$key] ?? 0)) { + --$baseBag[$key]; + continue; + } + $new[] = '::error::'.annotation($error); +} + +if ($new) { + echo implode("\n", $new), "\n"; + exit(1); +} + +echo "No new PHPStan errors.\n"; diff -Nru symfony-6.4.41+dfsg/.github/sa-tools/phpstan.baseline.neon symfony-6.4.49+dfsg/.github/sa-tools/phpstan.baseline.neon --- symfony-6.4.41+dfsg/.github/sa-tools/phpstan.baseline.neon 2026-05-27 08:23:35.000000000 +0000 +++ symfony-6.4.49+dfsg/.github/sa-tools/phpstan.baseline.neon 1970-01-01 00:00:00.000000000 +0000 @@ -1,2 +0,0 @@ -parameters: - ignoreErrors: [] diff -Nru symfony-6.4.41+dfsg/.github/sa-tools/rules/HardenedComparisonRule.php symfony-6.4.49+dfsg/.github/sa-tools/rules/HardenedComparisonRule.php --- symfony-6.4.41+dfsg/.github/sa-tools/rules/HardenedComparisonRule.php 1970-01-01 00:00:00.000000000 +0000 +++ symfony-6.4.49+dfsg/.github/sa-tools/rules/HardenedComparisonRule.php 2026-10-28 18:15:18.000000000 +0000 @@ -0,0 +1,83 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +use PhpParser\Node; +use PhpParser\Node\Expr; +use PHPStan\Analyser\Scope; +use PHPStan\Rules\Rule; +use PHPStan\Rules\RuleErrorBuilder; + +/** + * Flags comparing an HMAC against an expected value with a non-constant-time + * operator ("===", "!==", "==" or "!="). Signatures and message authentication + * codes must be compared with hash_equals() to avoid a timing side channel. + * + * Only the inline form, where hash_hmac() is an operand of the comparison + * (optionally wrapped in an encoder such as base64_encode()), is detected; the + * assign-then-compare idiom is out of reach of a syntactic rule. + * + * @see Symfony\Component\Mailer\Bridge\Mailchimp\Webhook\MailchimpRequestParser + * + * @implements Rule + */ +class HardenedComparisonRule implements Rule +{ + private const ENCODERS = ['base64_encode', 'bin2hex', 'strtoupper', 'strtolower', 'trim', 'rtrim']; + private const MAX_DEPTH = 3; + + public function getNodeType(): string + { + return Expr\BinaryOp::class; + } + + public function processNode(Node $node, Scope $scope): array + { + if (!$node instanceof Expr\BinaryOp\Identical + && !$node instanceof Expr\BinaryOp\NotIdentical + && !$node instanceof Expr\BinaryOp\Equal + && !$node instanceof Expr\BinaryOp\NotEqual + ) { + return []; + } + + if (!$this->isMac($node->left) && !$this->isMac($node->right)) { + return []; + } + + return [ + RuleErrorBuilder::message('Comparing an HMAC with "===", "!==", "==" or "!=" is not constant-time; use hash_equals() instead.') + ->identifier('symfony.nonConstantTimeHmacComparison') + ->build(), + ]; + } + + private function isMac(Expr $expr, int $depth = 0): bool + { + if (!$expr instanceof Expr\FuncCall || !$expr->name instanceof Node\Name) { + return false; + } + + $name = $expr->name->toLowerString(); + + if ('hash_hmac' === $name) { + return true; + } + + if ($depth < self::MAX_DEPTH && \in_array($name, self::ENCODERS, true)) { + $args = $expr->getArgs(); + if (isset($args[0])) { + return $this->isMac($args[0]->value, $depth + 1); + } + } + + return false; + } +} diff -Nru symfony-6.4.41+dfsg/.github/sa-tools/rules/UnserializeMissingAllowedClassesRule.php symfony-6.4.49+dfsg/.github/sa-tools/rules/UnserializeMissingAllowedClassesRule.php --- symfony-6.4.41+dfsg/.github/sa-tools/rules/UnserializeMissingAllowedClassesRule.php 1970-01-01 00:00:00.000000000 +0000 +++ symfony-6.4.49+dfsg/.github/sa-tools/rules/UnserializeMissingAllowedClassesRule.php 2026-10-28 18:15:18.000000000 +0000 @@ -0,0 +1,71 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +use PhpParser\Node; +use PHPStan\Analyser\Scope; +use PHPStan\Rules\Rule; +use PHPStan\Rules\RuleErrorBuilder; +use PHPStan\Type\Constant\ConstantIntegerType; +use PHPStan\Type\Constant\ConstantStringType; + +/** + * @implements Rule + */ +class UnserializeMissingAllowedClassesRule implements Rule +{ + public function getNodeType(): string + { + return Node\Expr\FuncCall::class; + } + + public function processNode(Node $node, Scope $scope): array + { + if (!$node->name instanceof Node\Name + || 'unserialize' !== strtolower($node->name->name) + || $this->hasAllowedClassesKey($scope, $node) + ) { + return []; + } + + return [ + RuleErrorBuilder::message('unserialize() calls must specify the "allowed_classes" option.') + ->identifier('symfony.unserializeMissingAllowedClasses') + ->build(), + ]; + } + + private function hasAllowedClassesKey(Scope $scope, Node\Expr\FuncCall $node): bool + { + if (null === $optionsArg = $node->getArg('options', 1)) { + return false; + } + + if (!$constantArrays = $scope->getType($optionsArg->value)->getConstantArrays()) { + return false; + } + + foreach ($constantArrays as $constantArray) { + $hasAllowedClasses = false; + foreach ($constantArray->getKeyTypes() as $keyType) { + if (($keyType instanceof ConstantStringType || $keyType instanceof ConstantIntegerType) && 'allowed_classes' === $keyType->getValue()) { + $hasAllowedClasses = true; + break; + } + } + + if (!$hasAllowedClasses) { + return false; + } + } + + return true; + } +} diff -Nru symfony-6.4.41+dfsg/.github/sa-tools/rules/UnserializeToStringTrampolineRule.php symfony-6.4.49+dfsg/.github/sa-tools/rules/UnserializeToStringTrampolineRule.php --- symfony-6.4.41+dfsg/.github/sa-tools/rules/UnserializeToStringTrampolineRule.php 1970-01-01 00:00:00.000000000 +0000 +++ symfony-6.4.49+dfsg/.github/sa-tools/rules/UnserializeToStringTrampolineRule.php 2026-10-28 18:15:18.000000000 +0000 @@ -0,0 +1,136 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +use PhpParser\Node; +use PhpParser\Node\Expr; +use PhpParser\NodeFinder; +use PHPStan\Analyser\Scope; +use PHPStan\Rules\Rule; +use PHPStan\Rules\RuleErrorBuilder; +use PHPStan\Type\StringType; +use PHPStan\Type\TypeCombinator; + +/** + * Flags __unserialize() implementations that assign a value coming from the + * unserialized payload into a string-typed property without first rejecting + * object values. An object exposing __toString() would be coerced to string + * during unserialize(), turning the property assignment into a "trampoline" + * that fires the gadget. The accepted fix rejects \Stringable values up front. + * + * @see Symfony\Component\Routing\Route::__unserialize() + * @see Symfony\Component\RateLimiter\Policy\TokenBucket::__unserialize() + * + * @implements Rule + */ +class UnserializeToStringTrampolineRule implements Rule +{ + private const TYPE_PROBES = ['is_object', 'is_scalar', 'is_string', 'gettype', 'get_debug_type']; + + public function getNodeType(): string + { + return Node\Stmt\ClassMethod::class; + } + + public function processNode(Node $node, Scope $scope): array + { + if ('__unserialize' !== $node->name->toLowerString() || null === $node->stmts) { + return []; + } + + if (null === $classReflection = $scope->getClassReflection()) { + return []; + } + + $params = $node->getParams(); + if (!isset($params[0]) || !$params[0]->var instanceof Expr\Variable || !\is_string($params[0]->var->name)) { + return []; + } + $dataParam = $params[0]->var->name; + + // A single up-front object/Stringable guard is treated as sufficient, + // matching how the accepted fixes guard every slot at once. + if ($this->hasGuard($node->stmts)) { + return []; + } + + $finder = new NodeFinder(); + $errors = []; + + foreach ($finder->findInstanceOf($node->stmts, Expr\Assign::class) as $assign) { + // The right-hand side must read from the unserialized payload. + if (null === $finder->findFirst($assign->expr, static fn (Node $n): bool => $n instanceof Expr\Variable && $dataParam === $n->name)) { + continue; + } + + foreach ($this->targetProperties($assign->var) as $propName) { + if (!$classReflection->hasNativeProperty($propName)) { + continue; + } + + $propType = $classReflection->getNativeProperty($propName)->getNativeType(); + if (!TypeCombinator::removeNull($propType) instanceof StringType) { + continue; + } + + $errors[] = RuleErrorBuilder::message(\sprintf('Property "$%s" is assigned from the unserialized payload without rejecting \Stringable values first; an object would fire __toString() during unserialize(). Reject object values up front, e.g. with "instanceof \Stringable".', $propName)) + ->identifier('symfony.unserializeToStringTrampoline') + ->line($assign->getStartLine()) + ->build(); + } + } + + return $errors; + } + + /** + * Property names written by an assignment, covering both "$this->prop = ..." + * and list destructuring "[$this->a, $this->b] = $data". + * + * @return list + */ + private function targetProperties(Expr $var): array + { + if ($var instanceof Expr\PropertyFetch) { + return $var->name instanceof Node\Identifier ? [$var->name->toString()] : []; + } + + if ($var instanceof Expr\List_ || $var instanceof Expr\Array_) { + $props = []; + foreach ($var->items as $item) { + if (null !== $item) { + $props = array_merge($props, $this->targetProperties($item->value)); + } + } + + return $props; + } + + return []; + } + + /** + * @param Node\Stmt[] $stmts + */ + private function hasGuard(array $stmts): bool + { + $finder = new NodeFinder(); + + if (null !== $finder->findFirst($stmts, static fn (Node $n): bool => $n instanceof Expr\Instanceof_)) { + return true; + } + + return null !== $finder->findFirst($stmts, function (Node $n): bool { + return $n instanceof Expr\FuncCall + && $n->name instanceof Node\Name + && \in_array($n->name->toLowerString(), self::TYPE_PROBES, true); + }); + } +} diff -Nru symfony-6.4.41+dfsg/.github/sa-tools/rules/bootstrap.php symfony-6.4.49+dfsg/.github/sa-tools/rules/bootstrap.php --- symfony-6.4.41+dfsg/.github/sa-tools/rules/bootstrap.php 1970-01-01 00:00:00.000000000 +0000 +++ symfony-6.4.49+dfsg/.github/sa-tools/rules/bootstrap.php 2026-10-28 18:15:18.000000000 +0000 @@ -0,0 +1,19 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +// Autoloads the global-namespace *Rule.php classes in this folder so PHPStan can +// instantiate the rules listed in ../rules.neon. New rules are picked up with no +// extra wiring: drop a "Rule.php" here and add it to rules.neon's "rules:". +spl_autoload_register(static function (string $class): void { + if (!str_contains($class, '\\') && is_file($file = __DIR__.'/'.$class.'.php')) { + require_once $file; + } +}); diff -Nru symfony-6.4.41+dfsg/.github/sa-tools/rules.neon symfony-6.4.49+dfsg/.github/sa-tools/rules.neon --- symfony-6.4.41+dfsg/.github/sa-tools/rules.neon 1970-01-01 00:00:00.000000000 +0000 +++ symfony-6.4.49+dfsg/.github/sa-tools/rules.neon 2026-10-28 18:15:18.000000000 +0000 @@ -0,0 +1,4 @@ +rules: + - UnserializeMissingAllowedClassesRule + - HardenedComparisonRule + - UnserializeToStringTrampolineRule diff -Nru symfony-6.4.41+dfsg/.github/sync-maintained-versions.php symfony-6.4.49+dfsg/.github/sync-maintained-versions.php --- symfony-6.4.41+dfsg/.github/sync-maintained-versions.php 1970-01-01 00:00:00.000000000 +0000 +++ symfony-6.4.49+dfsg/.github/sync-maintained-versions.php 2026-10-28 18:15:18.000000000 +0000 @@ -0,0 +1,153 @@ + high). +// +// Standalone helper: run it by hand whenever the maintained branches change. +// +// Updates: +// - .github/dependabot.yml one github-actions entry per maintained +// branch; cooldown.default-days grows by one +// in merge-up order so the lowest branch +// surfaces first and the review queue is staggered. +// - .github/workflows/scorecards.yml push trigger pinned to the default (highest) branch. +// - .github/workflows/unit-tests.yml LTS test versions for the current branch: cross-test +// against the latest LTS at or below it, low-deps floor +// against the LTS one major below that. +// +// Usage: +// php .github/sync-maintained-versions.php # rewrite the files +// php .github/sync-maintained-versions.php --check # exit 1 if anything would change + +if ('cli' !== PHP_SAPI) { + echo "This script can only be run from the command line.\n"; + exit(1); +} + +$self = basename(__FILE__); +$source = 'https://symfony.com/maintained-versions.json'; +$branches = json_decode(file_get_contents($source), true, 512, \JSON_THROW_ON_ERROR); + +if (!\is_array($branches) || !$branches) { + fwrite(\STDERR, "No maintained versions found at $source\n"); + exit(1); +} + +$branches = array_values($branches); +$default = end($branches); // highest branch == dev == default +$check = \in_array('--check', $argv, true); + +// Identify the checked-out branch from the source tree itself (robust to detached +// HEAD and branch naming, unlike `git branch`), then refuse to run unless it is one +// of the maintained versions. +if (!preg_match("/VERSION = '(\d+\.\d+)/", file_get_contents(__DIR__.'/../src/Symfony/Component/HttpKernel/Kernel.php'), $m)) { + fwrite(\STDERR, "Could not read the branch version from Kernel.php\n"); + exit(1); +} +$branch = $m[1]; + +if (!\in_array($branch, $branches, true)) { + fwrite(\STDERR, "Refusing to run: $branch is not a maintained version (".implode(', ', $branches).")\n"); + exit(1); +} + +$sync = static function (string $path, string $contents) use ($check): bool { + if (is_file($path) && file_get_contents($path) === $contents) { + return false; + } + if ($check) { + fwrite(\STDERR, basename($path)." is out of date\n"); + } else { + file_put_contents($path, $contents); + } + + return true; +}; + +// --- .github/dependabot.yml ------------------------------------------------- + +$dependabot = << $b) { + $dependabot .= "\n".sprintf($entry, $b, 7 + $i); +} + +$dirty = $sync(__DIR__.'/dependabot.yml', rtrim($dependabot)."\n"); + +// --- .github/workflows/scorecards.yml (push trigger only) ------------------- + +$scorecards = __DIR__.'/workflows/scorecards.yml'; +$yaml = file_get_contents($scorecards); +$patched = preg_replace('/^(\s*branches:\s*\[\s*")[^"]*("\s*\])/m', '${1}'.$default.'${2}', $yaml, 1, $count); + +if (1 !== $count) { + fwrite(\STDERR, "Could not find the push branch trigger in scorecards.yml\n"); + exit(1); +} + +$dirty = $sync($scorecards, $patched) || $dirty; + +// --- .github/workflows/unit-tests.yml (LTS test versions) ------------------- + +// LTS releases are the *.4 maintained versions. Cross-test against the latest one +// at or below this branch; the low-deps floor is the LTS one major below that. +$crossLts = null; +foreach (array_filter($branches, static fn ($v) => str_ends_with($v, '.4')) as $v) { + if (version_compare($v, $branch, '<=')) { + $crossLts = $v; + } +} + +if (null === $crossLts) { + fwrite(\STDERR, "No maintained LTS at or below $branch\n"); + exit(1); +} + +$floor = ((int) $crossLts - 1).'.4'; + +$unitTests = __DIR__.'/workflows/unit-tests.yml'; +$yaml = file_get_contents($unitTests); + +$patches = [ + ['/(&& echo )\d+\.\d+( \|\| echo \$SYMFONY_VERSION)/', '${1}'.$floor.'${2}'], + ['/(# for )\d+\.\d+( LTS, checkout and test previous major)/', '${1}'.$crossLts.'${2}'], + ['/(\$SYMFONY_VERSION = )\d+\.\d+/', '${1}'.$crossLts], +]; + +foreach ($patches as [$pattern, $replacement]) { + $yaml = preg_replace($pattern, $replacement, $yaml, 1, $count); + if (1 !== $count) { + fwrite(\STDERR, "Could not patch unit-tests.yml ($pattern matched $count times)\n"); + exit(1); + } +} + +$dirty = $sync($unitTests, $yaml) || $dirty; + +if ($check && $dirty) { + exit(1); +} diff -Nru symfony-6.4.41+dfsg/.github/sync-packages.php symfony-6.4.49+dfsg/.github/sync-packages.php --- symfony-6.4.41+dfsg/.github/sync-packages.php 2026-05-27 08:23:35.000000000 +0000 +++ symfony-6.4.49+dfsg/.github/sync-packages.php 2026-10-28 18:15:18.000000000 +0000 @@ -14,44 +14,4 @@ $c = preg_replace('{^/\.git.*+\n}m', '', $c); $c .= "/.git* export-ignore\n"; file_put_contents($package.'/.gitattributes', $c); - - @mkdir($package.'/.github'); - file_put_contents($package.'/.github/PULL_REQUEST_TEMPLATE.md', <<- --name=redis-primary redis-replica: - image: bitnamilegacy/redis:latest + image: bitnamilegacy/redis:latest # zizmor: ignore[unpinned-images] ports: - 16382:6379 env: @@ -110,7 +110,7 @@ ports: - 5672:5672 mongodb: - image: mongo + image: mongo # zizmor: ignore[unpinned-images] ports: - 27017:27017 couchbase: @@ -126,7 +126,7 @@ ports: - 4566:4566 zookeeper: - image: zookeeper + image: zookeeper # zizmor: ignore[unpinned-images] kafka: image: bitnamilegacy/kafka:3.7 ports: @@ -160,8 +160,9 @@ steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: + persist-credentials: false fetch-depth: 0 - name: Init Kafka topics @@ -204,10 +205,10 @@ touch ./ftpusers/test/pub/example ./ftpusers/test/readme.txt - name: Setup PHP - uses: shivammathur/setup-php@v2 + uses: shivammathur/setup-php@eb7c497e18156a6bbabfef1d3a82760b9eda3962 # 2.40.0 with: coverage: "none" - extensions: "json,couchbase-3.2.2,memcached,mongodb-1.12.0,redis,rdkafka,xsl,ldap,relay" + extensions: "json,couchbase-3.2.2,memcached,mongodb,redis,rdkafka,xsl,ldap,relay" ini-values: date.timezone=UTC,memory_limit=-1,default_socket_timeout=10,session.gc_probability=0,apc.enable_cli=1,zend.assertions=1,intl.default_locale=en,intl.error_level=0 php-version: "${{ matrix.php }}" tools: pecl @@ -218,7 +219,7 @@ php -i - name: Load fixtures - uses: docker://bitnamilegacy/openldap + uses: docker://bitnamilegacy/openldap@sha256:687f14a22b5c74fb057a57221acdbe7b8c82e2d3619fc380db3af48ec4aa04ed # latest with: entrypoint: /bin/bash args: -c "(/opt/bitnami/openldap/bin/ldapwhoami -H ldap://ldap:3389 -D cn=admin,dc=symfony,dc=com -w symfony||sleep 5) && /opt/bitnami/openldap/bin/ldapadd -H ldap://ldap:3389 -D cn=admin,dc=symfony,dc=com -w symfony -f src/Symfony/Component/Ldap/Tests/Fixtures/data/fixtures.ldif && /opt/bitnami/openldap/bin/ldapdelete -H ldap://ldap:3389 -D cn=admin,dc=symfony,dc=com -w symfony cn=a,ou=users,dc=symfony,dc=com" diff -Nru symfony-6.4.41+dfsg/.github/workflows/intl-data-tests.yml symfony-6.4.49+dfsg/.github/workflows/intl-data-tests.yml --- symfony-6.4.41+dfsg/.github/workflows/intl-data-tests.yml 2026-05-27 08:23:35.000000000 +0000 +++ symfony-6.4.49+dfsg/.github/workflows/intl-data-tests.yml 2026-10-28 18:15:18.000000000 +0000 @@ -35,7 +35,9 @@ steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + with: + persist-credentials: false - name: Install system dependencies run: | @@ -53,7 +55,7 @@ echo "SYMFONY_ICU_VERSION=$SYMFONY_ICU_VERSION" >> $GITHUB_ENV - name: Setup PHP - uses: shivammathur/setup-php@v2 + uses: shivammathur/setup-php@eb7c497e18156a6bbabfef1d3a82760b9eda3962 # 2.40.0 with: coverage: "none" extensions: "zip,intl-${{env.SYMFONY_ICU_VERSION}}" diff -Nru symfony-6.4.41+dfsg/.github/workflows/package-tests.yml symfony-6.4.49+dfsg/.github/workflows/package-tests.yml --- symfony-6.4.41+dfsg/.github/workflows/package-tests.yml 2026-05-27 08:23:35.000000000 +0000 +++ symfony-6.4.49+dfsg/.github/workflows/package-tests.yml 2026-10-28 18:15:18.000000000 +0000 @@ -14,16 +14,32 @@ runs-on: ubuntu-24.04 steps: - name: Checkout code - uses: actions/checkout@v4 + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + with: + persist-credentials: false - name: Fetch branch from where the PR started - run: git fetch --no-tags --prune --depth=1 origin +refs/heads/*:refs/remotes/origin/* + env: + GH_TOKEN: ${{ github.token }} + run: | + # Credentials are not persisted by the checkout, so remote operations are given + # the job token explicitly. Public repositories would also accept anonymous reads, + # private forks do not. + git fetch --no-tags --prune --depth=1 "https://x-access-token:$GH_TOKEN@github.com/$GITHUB_REPOSITORY" +refs/heads/*:refs/remotes/origin/* - name: Find packages id: find-packages - run: echo "packages=$(php .github/get-modified-packages.php $(find src/Symfony -mindepth 2 -type f -name composer.json -printf '%h\n' | grep -v src/Symfony/Component/Intl/Resources/emoji |jq -R -s -c 'split("\n")[:-1]') $(git diff --name-only origin/${{ github.base_ref }} HEAD | grep src/ | jq -R -s -c 'split("\n")[:-1]'))" >> $GITHUB_OUTPUT + env: + BASE_REF: ${{ github.base_ref }} + run: | + packages=$(php .github/get-modified-packages.php \ + "$(find src/Symfony -mindepth 2 -type f -name composer.json -printf '%h\n' | grep -v src/Symfony/Component/Intl/Resources/emoji | jq -R -s -c 'split("\n")[:-1]')" \ + "$(git diff --name-only "origin/$BASE_REF" HEAD | grep src/ | jq -R -s -c 'split("\n")[:-1]')") + echo "packages=$packages" >> "$GITHUB_OUTPUT" - name: Verify meta files are correct + env: + PACKAGES_JSON: ${{ steps.find-packages.outputs.packages }} run: | ok=0 @@ -57,7 +73,7 @@ fi } - json='${{ steps.find-packages.outputs.packages }}' + json="$PACKAGES_JSON" for package in $(echo "${json}" | jq -r '.[] | @base64'); do _jq() { echo ${package} | base64 --decode | jq -r ${1} @@ -102,11 +118,13 @@ exit $ok - name: Verify symfony/deprecation-contracts requirements + env: + PACKAGES_JSON: ${{ steps.find-packages.outputs.packages }} run: | set +e ok=0 - json='${{ steps.find-packages.outputs.packages }}' + json="$PACKAGES_JSON" for package in $(echo "${json}" | jq -r '.[] | @base64'); do _jq() { echo ${package} | base64 --decode | jq -r ${1} diff -Nru symfony-6.4.41+dfsg/.github/workflows/phpunit-bridge.yml symfony-6.4.49+dfsg/.github/workflows/phpunit-bridge.yml --- symfony-6.4.41+dfsg/.github/workflows/phpunit-bridge.yml 2026-05-27 08:23:35.000000000 +0000 +++ symfony-6.4.49+dfsg/.github/workflows/phpunit-bridge.yml 2026-10-28 18:15:18.000000000 +0000 @@ -27,10 +27,12 @@ steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + with: + persist-credentials: false - name: Setup PHP - uses: shivammathur/setup-php@v2 + uses: shivammathur/setup-php@eb7c497e18156a6bbabfef1d3a82760b9eda3962 # 2.40.0 with: coverage: "none" php-version: "7.1" diff -Nru symfony-6.4.41+dfsg/.github/workflows/scorecards.yml symfony-6.4.49+dfsg/.github/workflows/scorecards.yml --- symfony-6.4.41+dfsg/.github/workflows/scorecards.yml 2026-05-27 08:23:35.000000000 +0000 +++ symfony-6.4.49+dfsg/.github/workflows/scorecards.yml 2026-10-28 18:15:18.000000000 +0000 @@ -26,12 +26,12 @@ steps: - name: "Checkout code" - uses: actions/checkout@a12a3943b4bdde767164f792f33f40b04645d846 # v3.0.0 + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: persist-credentials: false - name: "Run analysis" - uses: ossf/scorecard-action@3e15ea8318eee9b333819ec77a36aca8d39df13e # v1.1.1 + uses: ossf/scorecard-action@fa7117db83c52d787ae5a89f350999701505d78e # v2.5.0 with: results_file: results.sarif results_format: sarif @@ -50,7 +50,7 @@ # Upload the results as artifacts (optional). Commenting out will disable uploads of run results in SARIF # format to the repository Actions tab. - name: "Upload artifact" - uses: actions/upload-artifact@6673cd052c4cd6fcf4b4e6e60ea986c889389535 # v3.0.0 + uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2 with: name: SARIF file path: results.sarif @@ -58,6 +58,6 @@ # Upload the results to GitHub's code scanning dashboard. - name: "Upload to code-scanning" - uses: github/codeql-action/upload-sarif@5f532563584d71fdef14ee64d17bafb34f751ce5 # v1.0.26 + uses: github/codeql-action/upload-sarif@6f2ac81f5cd81fe351a197ba0b00d91d03cd2aee # v4.39.0 with: sarif_file: results.sarif diff -Nru symfony-6.4.41+dfsg/.github/workflows/shell-completion-tests.yml symfony-6.4.49+dfsg/.github/workflows/shell-completion-tests.yml --- symfony-6.4.41+dfsg/.github/workflows/shell-completion-tests.yml 1970-01-01 00:00:00.000000000 +0000 +++ symfony-6.4.49+dfsg/.github/workflows/shell-completion-tests.yml 2026-10-28 18:15:18.000000000 +0000 @@ -0,0 +1,65 @@ +name: Shell Completion Tests + +on: + push: + paths: + - '.github/workflows/shell-completion-tests.yml' + - 'src/Symfony/Component/Console/Resources/completion.*' + - 'src/Symfony/Component/Console/Command/CompleteCommand.php' + - 'src/Symfony/Component/Console/Command/DumpCompletionCommand.php' + - 'src/Symfony/Component/Console/Completion/**' + - 'src/Symfony/Component/Console/Tests/shell-completion/**' + pull_request: + paths: + - '.github/workflows/shell-completion-tests.yml' + - 'src/Symfony/Component/Console/Resources/completion.*' + - 'src/Symfony/Component/Console/Command/CompleteCommand.php' + - 'src/Symfony/Component/Console/Command/DumpCompletionCommand.php' + - 'src/Symfony/Component/Console/Completion/**' + - 'src/Symfony/Component/Console/Tests/shell-completion/**' + +defaults: + run: + shell: bash + +concurrency: + group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} + cancel-in-progress: true + +permissions: + contents: read + +jobs: + + tests: + name: Shell Completion Tests + + strategy: + matrix: + shell: ['bash', 'zsh', 'fish'] + fail-fast: false + + runs-on: ubuntu-24.04 + + steps: + - name: Checkout + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + with: + persist-credentials: false + + - name: Setup PHP + uses: shivammathur/setup-php@eb7c497e18156a6bbabfef1d3a82760b9eda3962 # 2.40.0 + with: + coverage: "none" + ini-values: date.timezone=UTC,memory_limit=-1 + php-version: "8.4" + + - name: Install the shell + run: sudo apt-get install -y --no-install-recommends bash-completion ${{ matrix.shell }} + + - name: Install dependencies + run: composer install --no-interaction --no-progress + working-directory: src/Symfony/Component/Console + + - name: Run tests + run: src/Symfony/Component/Console/Tests/shell-completion/run.sh ${{ matrix.shell }} diff -Nru symfony-6.4.41+dfsg/.github/workflows/static-analysis.yml symfony-6.4.49+dfsg/.github/workflows/static-analysis.yml --- symfony-6.4.41+dfsg/.github/workflows/static-analysis.yml 2026-05-27 08:23:35.000000000 +0000 +++ symfony-6.4.49+dfsg/.github/workflows/static-analysis.yml 2026-10-28 18:15:18.000000000 +0000 @@ -23,16 +23,23 @@ php-version: '8.1' steps: - name: Setup PHP - uses: shivammathur/setup-php@v2 + uses: shivammathur/setup-php@eb7c497e18156a6bbabfef1d3a82760b9eda3962 # 2.40.0 with: php-version: ${{ env.php-version }} ini-values: memory_limit=-1,intl.default_locale=en,intl.error_level=0 coverage: none - - name: Checkout target branch - uses: actions/checkout@v6 + - name: Checkout + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: - ref: ${{ github.base_ref }} + persist-credentials: false + fetch-depth: 2 + + - name: Switch to target branch + run: | + # Analyze the first parent of the PR merge commit, not the tip of the target branch. + # This way, both analyses differ only by the changes of the PR. + git checkout -q HEAD^ - name: Install dependencies run: | @@ -48,8 +55,15 @@ - name: Switch to PR run: | git checkout composer.json - git fetch --depth=1 origin '+${{ github.event.pull_request.head.sha }}' - git checkout -m FETCH_HEAD + git checkout -m "$GITHUB_SHA" + + # update dependencies when the PR changes composer.json so that packages it adds are resolvable + if ! git diff --quiet HEAD^ HEAD -- composer.json; then + export COMPOSER_ROOT_VERSION=$(grep ' VERSION = ' src/Symfony/Component/HttpKernel/Kernel.php | grep -P -o '[0-9]+\.[0-9]+').x-dev + rm composer.lock + composer remove --dev --no-update --no-interaction symfony/phpunit-bridge + composer require --no-progress --ansi --no-plugins psalm/phar:@stable phpunit/phpunit:^9.5 php-http/discovery psr/event-dispatcher mongodb/mongodb jetbrains/phpstorm-stubs + fi - name: Psalm run: ./vendor/bin/psalm.phar --no-progress || ./vendor/bin/psalm.phar --output-format=github --no-progress @@ -62,16 +76,23 @@ php-version: '8.1' steps: - name: Setup PHP - uses: shivammathur/setup-php@v2 + uses: shivammathur/setup-php@eb7c497e18156a6bbabfef1d3a82760b9eda3962 # 2.40.0 with: php-version: ${{ env.php-version }} ini-values: memory_limit=-1,intl.default_locale=en,intl.error_level=0 coverage: none - - name: Checkout target branch - uses: actions/checkout@v6 + - name: Checkout + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: - ref: ${{ github.base_ref }} + persist-credentials: false + fetch-depth: 2 + + - name: Switch to target branch + run: | + # Analyze the first parent of the PR merge commit, not the tip of the target branch. + # This way, both analyses differ only by the changes of the PR. + git checkout -q HEAD^ - name: Install dependencies run: | @@ -81,14 +102,44 @@ composer remove --dev --no-update --no-interaction symfony/phpunit-bridge composer require --no-progress --ansi --no-plugins phpstan/phpstan:@stable phpstan/phpstan-deprecation-rules:@stable phpunit/phpunit:^9.5 php-http/discovery psr/event-dispatcher mongodb/mongodb - - name: Generate PHPStan baseline - run: ./vendor/bin/phpstan analyse --generate-baseline=.github/sa-tools/phpstan.baseline.neon --allow-empty-baseline --no-progress + - name: PHPStan on target branch + run: ./vendor/bin/phpstan analyse --error-format=json --no-progress --autoload-file='.github/sa-tools/rules/bootstrap.php' > .github/sa-tools/phpstan-base.json || true - name: Switch to PR run: | git checkout composer.json - git fetch --depth=1 origin '+${{ github.event.pull_request.head.sha }}' - git checkout -m FETCH_HEAD + git checkout -m "$GITHUB_SHA" + + # update dependencies when the PR changes composer.json so that packages it adds are resolvable + if ! git diff --quiet HEAD^ HEAD -- composer.json; then + export COMPOSER_ROOT_VERSION=$(grep ' VERSION = ' src/Symfony/Component/HttpKernel/Kernel.php | grep -P -o '[0-9]+\.[0-9]+').x-dev + rm composer.lock + composer remove --dev --no-update --no-interaction symfony/phpunit-bridge + composer require --no-progress --ansi --no-plugins phpstan/phpstan:@stable phpstan/phpstan-deprecation-rules:@stable phpunit/phpunit:^9.5 php-http/discovery psr/event-dispatcher mongodb/mongodb + fi - name: PHPStan - run: ./vendor/bin/phpstan analyse --no-progress || ./vendor/bin/phpstan analyse --error-format=github --no-progress + run: | + ./vendor/bin/phpstan analyse --error-format=json --no-progress --autoload-file='.github/sa-tools/rules/bootstrap.php' > .github/sa-tools/phpstan-pr.json || true + php .github/sa-tools/phpstan-diff.php .github/sa-tools/phpstan-base.json .github/sa-tools/phpstan-pr.json + + hardening-tests: + name: Hardening tests + runs-on: ubuntu-24.04 + + env: + php-version: '8.1' + steps: + - name: Setup PHP + uses: shivammathur/setup-php@eb7c497e18156a6bbabfef1d3a82760b9eda3962 # 2.40.0 + with: + php-version: ${{ env.php-version }} + coverage: none + + - name: Checkout + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + with: + persist-credentials: false + + - name: Check hardening-test conventions + run: php .github/sa-tools/check-hardening-tests.php diff -Nru symfony-6.4.41+dfsg/.github/workflows/unit-tests.yml symfony-6.4.49+dfsg/.github/workflows/unit-tests.yml --- symfony-6.4.41+dfsg/.github/workflows/unit-tests.yml 2026-05-27 08:23:35.000000000 +0000 +++ symfony-6.4.49+dfsg/.github/workflows/unit-tests.yml 2026-10-28 18:15:18.000000000 +0000 @@ -35,18 +35,20 @@ - php: '8.4' - php: '8.5' - php: '8.6' + - php: '8.7' fail-fast: false runs-on: ubuntu-24.04 steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: + persist-credentials: false fetch-depth: 2 - name: Setup PHP - uses: shivammathur/setup-php@v2 + uses: shivammathur/setup-php@eb7c497e18156a6bbabfef1d3a82760b9eda3962 # 2.40.0 with: coverage: "none" ini-values: date.timezone=UTC,memory_limit=-1,default_socket_timeout=10,session.gc_probability=0,apc.enable_cli=1,zend.assertions=1,intl.default_locale=en,intl.error_level=0 @@ -55,7 +57,14 @@ tools: flex - name: Configure environment + env: + GH_TOKEN: ${{ github.token }} run: | + # Credentials are not persisted by the checkout, so remote operations are given + # the job token explicitly. Public repositories would also accept anonymous reads, + # private forks do not. + GIT_REMOTE="https://x-access-token:$GH_TOKEN@github.com/$GITHUB_REPOSITORY" + git config --global user.email "" git config --global user.name "Symfony" git config --global init.defaultBranch main @@ -70,7 +79,6 @@ echo PHPUNIT="$(pwd)/phpunit --exclude-group tty,benchmark,intl-data,integration,transient" >> $GITHUB_ENV echo COMPOSER_UP='composer update --no-progress --ansi'$([[ "${{ matrix.mode }}" != low-deps ]] && echo ' --ignore-platform-req=php+') >> $GITHUB_ENV - SYMFONY_VERSIONS=$(git ls-remote -q --heads | cut -f2 | grep -o '/[1-9][0-9]*\.[0-9].*' | sort -V) SYMFONY_VERSION=$(grep ' VERSION = ' src/Symfony/Component/HttpKernel/Kernel.php | cut -d "'" -f2 | cut -d '.' -f 1-2) SYMFONY_FEATURE_BRANCH=$(curl -s https://raw.githubusercontent.com/symfony/recipes/flex/main/index.json | jq -r '.versions."dev-name"') @@ -82,7 +90,7 @@ #SYMFONY_PHPUNIT_BRIDGE_PR=32886 if [[ $SYMFONY_PHPUNIT_BRIDGE_PR ]]; then - git fetch --depth=2 origin refs/pull/$SYMFONY_PHPUNIT_BRIDGE_PR/head + git fetch --depth=2 "$GIT_REMOTE" refs/pull/$SYMFONY_PHPUNIT_BRIDGE_PR/head git rm -rq src/Symfony/Bridge/PhpUnit git checkout -q FETCH_HEAD -- src/Symfony/Bridge/PhpUnit SYMFONY_PHPUNIT_BRIDGE_REF=$(curl -s https://api.github.com/repos/symfony/symfony/pulls/$SYMFONY_PHPUNIT_BRIDGE_PR | jq -r .base.ref) @@ -107,12 +115,16 @@ fi # For the highest branch, in high-deps mode, the version before it is checked out and tested with the locally patched components - if [[ "${{ matrix.mode }}" = high-deps && $SYMFONY_VERSION = $(echo "$SYMFONY_VERSIONS" | tail -n 1 | sed s/.//) ]]; then - echo FLIP='^' >> $GITHUB_ENV - SYMFONY_VERSION=$(echo "$SYMFONY_VERSIONS" | grep -FB1 /$SYMFONY_VERSION | head -n 1 | sed s/.//) - git fetch --depth=2 origin $SYMFONY_VERSION - git checkout -m FETCH_HEAD - echo COMPONENTS=$(find src/Symfony -mindepth 2 -type f -name phpunit.xml.dist -printf '%h ') >> $GITHUB_ENV + if [[ "${{ matrix.mode }}" = high-deps ]]; then + SYMFONY_VERSIONS=$(git ls-remote -q --heads "$GIT_REMOTE" | cut -f2 | grep -o '/[1-9][0-9]*\.[0-9].*' | sort -V) + + if [[ $SYMFONY_VERSION = $(echo "$SYMFONY_VERSIONS" | tail -n 1 | sed s/.//) ]]; then + echo FLIP='^' >> $GITHUB_ENV + SYMFONY_VERSION=$(echo "$SYMFONY_VERSIONS" | grep -FB1 /$SYMFONY_VERSION | head -n 1 | sed s/.//) + git fetch --depth=2 "$GIT_REMOTE" $SYMFONY_VERSION + git checkout -m FETCH_HEAD + echo COMPONENTS=$(find src/Symfony -mindepth 2 -type f -name phpunit.xml.dist -printf '%h ') >> $GITHUB_ENV + fi fi # Skip the phpunit-bridge on bugfix-branches when not in *-deps mode @@ -162,7 +174,11 @@ php .github/patch-types.php lint - name: Run tests + env: + GH_TOKEN: ${{ github.token }} run: | + GIT_REMOTE="https://x-access-token:$GH_TOKEN@github.com/$GITHUB_REPOSITORY" + _run_tests() { local ok=0 local title="$1$FLIP" @@ -210,7 +226,7 @@ echo -e "\\n\\e[33;1mChecking out Symfony $SYMFONY_VERSION and running tests with patched components as deps\\e[0m" export COMPOSER_ROOT_VERSION=$SYMFONY_VERSION.x-dev export SYMFONY_REQUIRE=">=$SYMFONY_VERSION" - git fetch --depth=2 origin $SYMFONY_VERSION + git fetch --depth=2 "$GIT_REMOTE" $SYMFONY_VERSION git checkout -m FETCH_HEAD PATCHED_COMPONENTS=$(echo "$PATCHED_COMPONENTS" | xargs dirname | xargs -I{} bash -c "[ -e '{}/phpunit.xml.dist' ] && echo '{}'" | sort || true) if [[ $PATCHED_COMPONENTS ]]; then diff -Nru symfony-6.4.41+dfsg/.github/workflows/windows.yml symfony-6.4.49+dfsg/.github/workflows/windows.yml --- symfony-6.4.41+dfsg/.github/workflows/windows.yml 2026-05-27 08:23:35.000000000 +0000 +++ symfony-6.4.49+dfsg/.github/workflows/windows.yml 2026-10-28 18:15:18.000000000 +0000 @@ -35,8 +35,9 @@ git config --global user.name "Symfony" - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: + persist-credentials: false fetch-depth: 2 - name: Setup PHP @@ -116,7 +117,7 @@ mv src\Symfony\Component\HttpClient\phpunit.xml.dist src\Symfony\Component\HttpClient\phpunit.xml php phpunit src\Symfony --exclude-group tty,benchmark,intl-data,network,transient-on-windows || ($x = 1) # HttpClient tests need to run separately, they block when run with other components' tests concurrently - php phpunit src\Symfony\Component\HttpClient || ($x = 1) + php phpunit src\Symfony\Component\HttpClient --exclude-group tty,benchmark,intl-data,network,transient-on-windows || ($x = 1) exit $x @@ -130,6 +131,6 @@ Copy c:\php\php.ini-max c:\php\php.ini php phpunit src\Symfony --exclude-group tty,benchmark,intl-data,network,transient-on-windows || ($x = 1) # HttpClient tests need to run separately, they block when run with other components' tests concurrently - php phpunit src\Symfony\Component\HttpClient || ($x = 1) + php phpunit src\Symfony\Component\HttpClient --exclude-group tty,benchmark,intl-data,network,transient-on-windows || ($x = 1) exit $x diff -Nru symfony-6.4.41+dfsg/.github/workflows/zizmor.yml symfony-6.4.49+dfsg/.github/workflows/zizmor.yml --- symfony-6.4.41+dfsg/.github/workflows/zizmor.yml 1970-01-01 00:00:00.000000000 +0000 +++ symfony-6.4.49+dfsg/.github/workflows/zizmor.yml 2026-10-28 18:15:18.000000000 +0000 @@ -0,0 +1,34 @@ +name: GitHub Actions security analysis + +on: + push: + paths: + - ".github/**.yml" + - ".github/**.yaml" + pull_request: + paths: + - ".github/**.yml" + - ".github/**.yaml" + +concurrency: + group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} + cancel-in-progress: true + +permissions: + contents: read + +jobs: + zizmor: + name: Zizmor + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + with: + persist-credentials: false + + - name: Run zizmor + uses: zizmorcore/zizmor-action@85b2b9fb8e3325e7a23d7d0a9d7ba5ae0f999e3e # v0.7.1 + with: + advanced-security: false + annotations: true diff -Nru symfony-6.4.41+dfsg/.php-cs-fixer.dist.php symfony-6.4.49+dfsg/.php-cs-fixer.dist.php --- symfony-6.4.41+dfsg/.php-cs-fixer.dist.php 2026-05-27 08:23:35.000000000 +0000 +++ symfony-6.4.49+dfsg/.php-cs-fixer.dist.php 2026-10-28 18:15:18.000000000 +0000 @@ -58,6 +58,7 @@ 'Symfony/Bridge/PhpUnit/', 'Symfony/Component/Emoji/Resources/', 'Symfony/Component/Intl/Resources/data/', + 'Symfony/Component/String/Resources/data/', ]) // Support for older PHPunit version ->notPath('#Symfony/Bridge/PhpUnit/.*Mock\.php#') diff -Nru symfony-6.4.41+dfsg/CHANGELOG-6.4.md symfony-6.4.49+dfsg/CHANGELOG-6.4.md --- symfony-6.4.41+dfsg/CHANGELOG-6.4.md 2026-05-27 08:23:35.000000000 +0000 +++ symfony-6.4.49+dfsg/CHANGELOG-6.4.md 2026-10-28 18:15:18.000000000 +0000 @@ -7,6 +7,973 @@ To get the diff for a specific change, go to https://github.com/symfony/symfony/commit/XXX where XXX is the change hash To get the diff between two versions, go to https://github.com/symfony/symfony/compare/v6.4.0...v6.4.1 +## 6.4.49 (2026-10-28) + +### AssetMapper + + * bug #67240 [AssetMapper] Fix `importmap:update` and `importmap:remove` deleting vendor files when they fail (nicolas-grekas) + +### BrowserKit + + * bug #67235 [BrowserKit] Send a Content-Length header when uploading files (nicolas-grekas) + * bug #67104 [BrowserKit] Fix HttpBrowser ignoring UploadedFile instances (nicolas-grekas) + * bug #67102 [BrowserKit] Fix URI resolution for mixed-case schemes and base URIs without path (nicolas-grekas) + +### Cache + + * bug #67574 [Cache] Fix items losing their tags when saved after a concurrent invalidation (nicolas-grekas) + * bug #67036 [Cache] Detect ElastiCache Serverless eviction policy (nicolas-grekas) + * bug #67027 [Cache] Fix overriding the adapter of a cache pool that has a provider (nicolas-grekas) + * bug #66991 [Cache] Fix RedisTagAwareAdapter returning invalidated items from Relay's memory (nicolas-grekas) + * bug #66978 [Cache] Fix PhpArrayAdapter::warmUp() when another process creates the cache directory (nicolas-grekas) + +### Config + + * bug #67242 [Config] Quote the default values of arrays in the YAML reference (nicolas-grekas) + +### Console + + * bug #67576 [Console] Don't format escaped tags again when sections measure their lines (nicolas-grekas) + * bug #67542 [Console] Fix style names with uppercase letters not being applied (wfatih) + * bug #67533 [Console] Fix `Table` header cells that span rows and escaped tags in `TableCell` (nicolas-grekas) + * bug #67523 [Console] Fix the alignment of wrapped `Table` cells and newlines around style tags (nicolas-grekas) + * bug #67522 [Console] Fix styles that leak out of `Table` cells (nicolas-grekas) + * bug #67373 [Console] Fix shell completion when a global option conflicts with an option of _complete (lyrixx) + * bug #67329 [Console] Fix StringInput dropping quotes inside a quoted option value (mkantautas) + * bug #67161 [Console] Fix invalid null device redirection on Windows (laloona) + * bug #67146 [Console] Fix locking a command again after acquiring its lock failed (nicolas-grekas) + * bug #67144 [Console] Stop a failed release from wedging the lock of a command (HypeMC) + * bug #67092 [Console] Only rewrite the changed lines when appending a table row (semx) + * bug #67111 [Console] Fix several bugs when sections count the rows of their lines (nicolas-grekas) + * bug #67099 [Console] Fix clearing section lines that are wider than the terminal (nicolas-grekas) + * bug #67088 [Console] Fix hyperlinks next to a literal `<` or `>` (nicolas-grekas) + * bug #67039 [Console] Preserve ANSI sequences when wrapping output (nicolas-grekas) + * bug #66981 [Console] Fix two state bugs in OutputFormatterStyle (nicolas-grekas) + * bug #66971 [Console] Fix how sections count and redraw their lines (nicolas-grekas) + * bug #66943 [Console] Fix nested applications exiting on signals handled by the outer application (nicolas-grekas) + * minor #67482 [Console][SecurityBundle] Fix two tests that fail on every 5.4 pull request (nicolas-grekas) + +### CssSelector + + * bug #67119 [CssSelector] Fix more bugs in the translation to XPath (nicolas-grekas) + * bug #67096 [CssSelector] Fix several bugs in the translation to XPath (nicolas-grekas) + +### DependencyInjection + + * bug #67376 [DependencyInjection] Preserve XML schema temporary files in forked processes (mbeccati) + * bug #67300 [DependencyInjection] Fix lazy closures for static and never-returning methods (nicolas-grekas) + * bug #67269 [DependencyInjection] Fix `process()` running twice on extensions also registered as compiler passes (HypeMC) + * bug #67239 [DependencyInjection] Fix env vars reported as never used when overriding an extension service (nicolas-grekas) + * bug #67134 [DependencyInjection] Keep lazy closures lazy when their service is part of a circular reference (nicolas-grekas) + * bug #67117 [DependencyInjection] Fix `#[AutowireServiceClosure]` ignoring `#[Target]` (nicolas-grekas) + * bug #67079 [DependencyInjection] Fix the proxy tags of lazy arguments typed as a nullable intersection (nicolas-grekas) + * bug #67078 [DependencyInjection] Fix lazy nullable arguments whose service is missing (nicolas-grekas) + * bug #67017 [DependencyInjection] Release the closures that reference the container when resetting it (nicolas-grekas) + * bug #67009 [DependencyInjection] Don't initialize lazy services when resetting the container (nicolas-grekas) + +### DoctrineBridge + + * bug #67116 [DoctrineBridge] Fix dispatching events after a lazy listener failed to initialize (nicolas-grekas) + * bug #67029 [DoctrineBridge] Collect queries executed during request termination (nicolas-grekas) + +### DomCrawler + + * bug #67443 [DomCrawler] Drop the base fragment when resolving an empty URI (wleeaf) + * bug #67440 [DomCrawler] Resolve `0` as a relative URI (nicolas-grekas) + * bug #67438 [DomCrawler] Fix dot segment handling in UriResolver (wleeaf) + * bug #67396 [DomCrawler] Exclude script text from option values (nicolas-grekas) + * bug #67397 [DomCrawler] Fix select defaults and disabled options with duplicate values (nicolas-grekas) + * bug #67395 [DomCrawler] Do not submit fields inside a disabled fieldset (randomsymbols) + * bug #67394 [DomCrawler] Skip disabled options when choosing the default value of a select (randomsymbols) + * bug #67392 [DomCrawler] Do not submit reset inputs (randomsymbols) + * bug #67393 [DomCrawler] Strip and collapse whitespace in option text used as value (randomsymbols) + * bug #67385 [DomCrawler][HttpKernel][Process][Translation] Fix cleanup after forking (nicolas-grekas) + * bug #67200 [DomCrawler] Ignore documents without a root element in addNode() (nicolas-grekas) + * bug #67035 [DomCrawler] Remove temporary uploads at shutdown (nicolas-grekas) + +### ErrorHandler + + * bug #67238 [ErrorHandler] Fix DebugClassLoader suggesting template types as native return types (nicolas-grekas) + * bug #67236 [ErrorHandler] Log uncaught exceptions like PHP does when no logger is set (nicolas-grekas) + +### ExpressionLanguage + + * security #cve-2026-109449 [ExpressionLanguage] Bound the nesting level of parsed expressions (nicolas-grekas, lazerg) + +### Finder + + * bug #67157 [Finder] Match symlinks against their own path in ignoreVCSIgnored() (nicolas-grekas) + * bug #67152 [Finder] Respect `.git/info/exclude` in `ignoreVCSIgnored()` (ephpicman) + * bug #67113 [Finder] Fix `followLinks()` looping on circular symlinks (nicolas-grekas) + * bug #67109 [Finder] Fix negated bracket expressions in gitignore patterns (nicolas-grekas) + * bug #67094 [Finder] Treat unclosed brackets and braces in glob patterns as literal characters (nicolas-grekas) + * bug #67026 [Finder] Only treat patterns that compile as regexps (nicolas-grekas) + * bug #67075 [Finder] Fix wildcards and escapes inside glob bracket expressions (nicolas-grekas) + * bug #67074 [Finder] Fix backslash escapes in gitignore patterns (nicolas-grekas) + * bug #67066 [Finder] Fix escaped brackets in glob patterns (wfatih) + +### Form + + * bug #67495 [Form] Fix `delete_empty` with object collections (nicolas-grekas) + * bug #67410 [Form] Reject week numbers lower than 1 in WeekToArrayTransformer (wfatih) + * bug #67101 [Form] Invalidate cached resources when a block hierarchy changes (drewmt) + * bug #67110 [Form] Fix where `collection_entry` is inserted in the block prefixes of a collection prototype (nicolas-grekas) + * bug #67007 [Form] Fix `debug:form` for types calling `addNormalizer()`, `setDeprecated()`, `setInfo()` or `getInfo()` on inherited options (andyexeter) + * bug #67010 [Form] Fix `debug:form` listing an overridden option twice (nicolas-grekas) + * bug #66958 [Form] Fix rendering the parent block twice from a form theme block (nicolas-grekas) + * bug #66956 [Form] Clear the renderer state when rendering a block fails (KevinMartinsDev) + * minor #67589 [Form] Refine Persian date interval and locale translations (ephpicman) + * minor #67566 [Form] Improve Persian validator translations (ephpicman) + * minor #67546 [Form] Review Indonesian validator translations (Yoruxyv) + * minor #67531 [Form] Review Arabic translations (MohannadElemary) + * minor #67519 [Form] Review Swedish translations (JakobHallin) + * minor #67517 [Form][Validator] Review Latvian translations (k0d3r1s) + * minor #67498 [Form] Review pt_BR translations (anderson-oliveira-git) + * minor #67502 [Form] Remove needs-review-translation state from Spanish translations (abp002) + * minor #67449 [Form][Security][Validator] Add Central Kurdish (ckb) translations (RawanD201) + * minor #67441 [Form][Security][Validator] Review Thai translations (Warayuth014) + * minor #67437 [Form] Review Russian translations (lazerg) + * minor #67330 [Form] Change the validator translations to use neutral messages. (Fan2Shrek) + * minor #67354 [Form][Security][Validator] Correct Arabic translations (malekkadri) + +### FrameworkBundle + + * bug #67516 [FrameworkBundle] Make secrets key generation and list updates safe to interrupt (nicolas-grekas) + * bug #67511 [FrameworkBundle] Make secrets key rotation safe to interrupt (cestercian) + * bug #67288 [FrameworkBundle] Fix `TestContainer::initialized()` for private services (nicolas-grekas) + * bug #67245 [FrameworkBundle] Fix describing classes whose docblock only has a tag (nicolas-grekas) + * bug #67179 [FrameworkBundle][HttpKernel] Collect garbage cycles in the callers of `Kernel::shutdown()` (nicolas-grekas) + * bug #66989 [FrameworkBundle] Reset the whole request context, not only its parameters (nicolas-grekas) + * bug #66944 [FrameworkBundle] Fix request context parameters leaking between requests (nicolas-grekas) + +### HtmlSanitizer + + * bug #67227 [HtmlSanitizer] Don't cut a multibyte character when truncating the input to its maximum length (nicolas-grekas) + +### HttpClient + + * bug #67513 [HttpClient] Fix retry delays longer than the idle timeout (nicolas-grekas) + * bug #67223 [HttpClient] Fix NativeHttpClient sending paused requests up to one second late (nicolas-grekas) + * bug #67052 [HttpClient] Fix CurlHttpClient leaking temp file streams (bakugo) + * bug #67085 [HttpClient] Fix CurlHttpClient leaking the curl handle of responses closed while performing (nicolas-grekas) + * bug #66938 [HttpClient] Don't add the `query` option again to redirect targets in `NoPrivateNetworkHttpClient` (nicolas-grekas) + +### HttpFoundation + + * security #cve-2026-108082 [HttpFoundation] Remove the ambiguity that makes HeaderUtils::split() backtrack (nicolas-grekas) + * bug #67504 [HttpFoundation] Ignore malformed and multiple ranges in BinaryFileResponse (jack-worman) + * bug #67501 [HttpFoundation] Don't reject suffix ranges longer than the file in BinaryFileResponse (jack-worman) + * bug #67296 [HttpFoundation] Handle filter failures in array values (nicolas-grekas) + * bug #67345 [HttpFoundation] Fix cookie names and header parsing (nicolas-grekas) + * bug #67126 [HttpFoundation] Fix MigratingSessionHandler sending needless cookies to delete empty sessions (nicolas-grekas) + * bug #67123 [HttpFoundation] Destroy empty sessions in updateTimestamp() of the Redis, Memcached, MongoDb and Pdo session handlers (PhilETaylor) + * bug #67125 [HttpFoundation] Don't marshall empty session data in MarshallingSessionHandler (nicolas-grekas) + * bug #67059 [HttpFoundation] Don't announce a Content-Length on non-successful BinaryFileResponse (lazerg) + * bug #67060 [HttpFoundation] Register the session shutdown function only once in NativeSessionStorage (lazerg) + +### HttpKernel + + * bug #67581 [HttpKernel] Don't keep the stale container when rebuilding it fails (lazerg) + * bug #67120 [HttpKernel] Fix transient failures in ResponseCacheStrategyTest (nicolas-grekas) + * bug #67083 [HttpKernel] Make `Kernel::terminate()` go through `http_cache` like `handle()` does (nicolas-grekas) + * bug #66997 [HttpKernel] Fix FileProfilerStorage not removing some expired profiles (nicolas-grekas) + * bug #66992 [HttpKernel] Don't list expired profiles in the profiler search (javiereguiluz) + * bug #66922 [HttpKernel] Reset the default logger between requests (KevinMartinsDev) + +### Intl + + * bug #67543 [Intl] Fix Timezones::getRawOffset() depending on the default timezone around DST transitions (wfatih) + * bug #67485 [Intl] Add the locales that have a three-letter language code (nicolas-grekas) + * bug #67476 [Intl] Fix EmojiTransliterator on empty slices and on slices that split a surrogate pair (nicolas-grekas) + * minor #67509 [Intl] Update the ICU data to 79.1 (nicolas-grekas) + +### Lock + + * bug #67401 [Lock] Fix database names parsed from MongoDB URIs (nicolas-grekas) + +### Mailer + + * bug #67264 [Mailer] Throw a TransportException when proc_open() is not available (Amoifr) + * bug #67023 [Mailer] Accept Brevo marketing webhook payloads (nicolas-grekas) + +### Messenger + + * bug #67456 [Messenger] Fix describing classes whose docblock only has a tag in `debug:messenger` (nicolas-grekas) + * bug #67231 [Messenger] Fix the `user_id`, `CC` and `expiration` of republished or delayed AMQP messages (nicolas-grekas) + * bug #67230 [Messenger] Do not inherit AMQP expiration when sending to another transport (dalerazimov) + * bug #67150 [Messenger] Never reuse the received AMQP routing key when sending to another transport (dalerazimov) + * bug #67115 [Messenger][WebProfilerBundle] Fix tracing messages dispatched from internal functions (nicolas-grekas) + * bug #67038 [Messenger] Acknowledge messages sent for retry (nicolas-grekas) + * bug #67002 [Messenger] Fix the Redis transport after a lost connection (nicolas-grekas) + * bug #67000 [Messenger] Fix the Amazon SQS connection rethrowing the same error after a failed receive (nicolas-grekas) + * bug #66973 [Messenger] Fix the Doctrine transport not retrying ack() and reject() on deadlocks (nicolas-grekas) + * bug #66974 [Messenger] Fix PostgreSqlConnection throwing from its destructor when the database is gone (nicolas-grekas) + * bug #66975 [Messenger] Fix the worker looping without sleeping just before its time limit (nicolas-grekas) + * bug #66935 [Messenger] Fix DispatchAfterCurrentBusMiddleware staying in a root dispatch after an \Error (KevinMartinsDev) + * bug #66914 [Messenger] Prevent losing delayed Redis messages on migration failure (dalerazimov) + +### Mime + + * security #cve-2026-45070 [Mime] Reject parameter names containing non-token characters (alexandre-daubois) + * bug #67478 [Mime] Escape backslashes in Address::getEncodedName() (munzzyy) + * bug #67444 [Mime] Escape quotes and backslashes in quoted parameter values (wleeaf) + +### MonologBridge + + * bug #67248 [MonologBridge] Fix NotifierHandler not raising levels below Error with Monolog 3 (nicolas-grekas) + +### Notifier + + * bug #67307 [Notifier] Fix Transport::fromDsn() when some bridges are installed (javiereguiluz) + * minor #67261 [Notifier][Brevo] Update the Brevo API documentation link (lbonnet-gda) + +### OptionsResolver + + * bug #67069 [OptionsResolver] Ensure remove() also unsets nested options (wfatih) + +### PhpUnitBridge + + * bug #67033 [PhpUnitBridge] Honor --stderr for listener output (nicolas-grekas) + +### PropertyAccess + + * bug #67512 [PropertyAccess] Fix writing `SimpleXMLElement` children and dynamic properties of `#[AllowDynamicProperties]` classes (nicolas-grekas) + * bug #66965 [PropertyAccess] Fix using custom PropertyPathInterface implementations on objects (nicolas-grekas) + * bug #66932 [PropertyAccess] Fix using custom PropertyPathInterface implementations (HawkForge) + +### PropertyInfo + + * bug #67234 [PropertyInfo] Fix resolution of `self`, `static` and `parent` in collection types (nicolas-grekas) + +### RateLimiter + + * bug #67204 [RateLimiter] Fix early retry and expiry times, and three consume() edge cases (nicolas-grekas) + * bug #67203 [RateLimiter] Fix SlidingWindow wait duration when refused by the hits of the current window (florentdestremau) + * bug #67087 [RateLimiter] Apply updated configuration to stored fixed windows (nicolas-grekas) + * bug #67022 [RateLimiter] Apply updated configuration to stored token buckets (nicolas-grekas) + * bug #67021 [RateLimiter] Reject refill intervals below one second (nicolas-grekas) + +### Routing + + * bug #67508 [Routing] Don't ignore route conditions that are "0" (nicolas-grekas) + * bug #67093 [Routing] Fix HEAD-only routes with UrlMatcher and scheme redirections when both trailing slash variants exist (nicolas-grekas) + +### Scheduler + + * bug #67503 [Scheduler] Fix skipping a run when the cache loses the checkpoint of a running worker (nicolas-grekas) + +### Security + + * bug #67560 [Security] Stop logging router errors when a check path does not match the request (nicolas-grekas) + * bug #67145 [Security][SecurityBundle] Decide the checks of an expression for the token being voted on (Neirda24) + * bug #67080 [Security] Fix `use_referer` redirecting to the check path (nicolas-grekas) + +### SecurityBundle + + * minor #67551 [SecurityBundle] Stop asserting an empty body for the 401 of a rejected access token (nicolas-grekas) + +### Serializer + + * bug #67459 [Serializer] Escape formulas in the header row of CSV files (nicolas-grekas) + * bug #67243 [Serializer] Fix denormalizing a scalar into a union with an object type (nicolas-grekas) + * bug #67232 [Serializer] Fix normalizing a file that `DataUriNormalizer` denormalized (nicolas-grekas) + * bug #67139 [Serializer] Fix denormalizing string-keyed collections and unions from XML (nicolas-grekas) + * bug #67055 [Serializer] Fix the first normalized object deciding whether property paths are normalized (HypeMC) + * bug #67034 [Serializer] Apply ignored attributes to setter and adder aliases (nicolas-grekas) + * bug #66986 [Serializer] Fix normalizing discriminated classes that have no properties (nicolas-grekas) + +### String + + * bug #67361 [String] Fix hyphenated locales in AsciiSlugger (malekkadri) + * bug #67380 [String] Fix slugger cache changing parent locale transliteration (nicolas-grekas) + * bug #67284 [String] Preserve text after emoji joiners in width calculations (nicolas-grekas) + * bug #67068 [String] Fix trim(), trimStart() and trimEnd() with empty chars on unicode strings (wfatih) + * bug #67091 [String] Fix trim(), trimStart() and trimEnd() with ".." ranges on unicode strings (nicolas-grekas) + * bug #66994 [String] Fix slice(), splice() and chunk() with very large offsets or lengths (nicolas-grekas) + * bug #66969 [String] Fix UnicodeString::replace() and split() with ignorable characters like U+200B (nicolas-grekas) + +### Translation + + * bug #67352 [Translation] Check XLIFF 2 target language when linting filenames (malekkadri) + * bug #66980 [Translation] Fix FileDumper::dump() when another process creates the target directory (nicolas-grekas) + +### TwigBridge + + * bug #66990 [TwigBridge] Fix form_label() with a literal label and non-literal variables (nicolas-grekas) + +### Validator + + * bug #67032 [Validator] Compare integer ranges without losing precision (nicolas-grekas) + * bug #67076 [Validator] Fix Collection with groups failing on fields that have no groups (nicolas-grekas) + * bug #67067 [Validator] Fix Count::$divisibleBy being ignored in groups other than Default (wfatih) + * minor #67540 [Validator] Fix Arabic validation messages and six-form plurals (malekkadri) + * minor #66933 [Validator] Review Italian translations (mrCabez) + +### VarDumper + + * bug #66966 [VarDumper] Fix source excerpts of files with CRLF line endings (nicolas-grekas) + +### VarExporter + + * bug #67301 [VarExporter] Preserve named variadic arguments in lazy proxies (nicolas-grekas) + +### WebProfilerBundle + + * bug #67450 [WebProfilerBundle] Check that the profiler is enabled before opening files (nicolas-grekas) + * bug #67081 [WebProfilerBundle] Fix the toolbar hiding unhandled fetch() rejections and leaving 0 ms requests loading (nicolas-grekas) + * bug #67016 [WebProfilerBundle] Fix the form and translation panels with Twig 4 (nicolas-grekas) + +### Yaml + + * security #cve-2026-109413 [Yaml] Bound recursion depth in the inline lexer (nicolas-grekas) + * bug #67106 [Yaml] Fix dumping control characters and invalid UTF-8 in multi-line literal blocks (nicolas-grekas) + * bug #66954 [Yaml] Fix TypeErrors, a PHP warning and wrong results for !php/const keys and merge keys (nicolas-grekas) + +### Other + + * minor #67379 Add PHP 8.7 to CI (nicolas-grekas) + * minor #67061 Refine Portuguese translations in validators.pt.xlf (lucascamp) + * minor #67065 Resolve grammar and vocabulary issues in pt-PT (1PedroSoares) + +## 6.4.48 (2026-10-14) + +### AssetMapper + + * bug #66645 [AssetMapper] Clean up the asset being created when a compiler fails (phcorp) + +### BrowserKit + + * bug #66182 [BrowserKit] Fix parsing and path matching of cookies (X-Coder264, nicolas-grekas) + +### Cache + + * bug #66651 [Cache][FrameworkBundle] Cache the parsed expressions of `#` attributes (nicolas-grekas) + +### Clock + + * bug #66833 [Clock] Fix `DatePoint` being one hour off when its reference is in the DST fall-back hour (nicolas-grekas) + * bug #66831 [Clock] Fix `DatePoint` keeping the current time of day for dates with a relative part (nicolas-grekas) + * bug #66708 [Clock] Fix `new DatePoint()` being one hour off during the DST fall-back hour (nicolas-grekas) + * bug #66707 [Clock] Fix `MockClock::sleep()` with dates before 1970 (nicolas-grekas) + +### Console + + * bug #66676 [Console] Build the lazy signal listeners before a signal can interrupt an autoload (nicolas-grekas) + +### Contracts + + * bug #66610 [Contracts][HttpClient] Skip tests that rely on 500ms server pauses on Windows (nicolas-grekas) + +### DependencyInjection + + * bug #66894 [DependencyInjection] Fix ignoring env var processors after resolving env vars before compilation (nicolas-grekas) + * bug #66892 [DependencyInjection] Fix dumping strings like "50% of 100%" (nicolas-grekas) + * bug #66743 [DependencyInjection] Make the ids of anonymous services independent from the project directory (nicolas-grekas) + * bug #66738 [DependencyInjection] Make service locator ids reproducible (nicolas-grekas) + * bug #66596 [DependencyInjection] Fix dumping closures of "Class::method" callables (nicolas-grekas) + * minor #66605 [DependencyInjection] Report circular parent definitions before compiler passes walk them (nicolas-grekas) + +### ExpressionLanguage + + * bug #66727 [ExpressionLanguage] Fix discrepancies between evaluated and compiled expressions (lyrixx) + * bug #66723 [ExpressionLanguage] Bound the depth of the parsed node tree (nicolas-grekas) + * bug #66720 [ExpressionLanguage] Fix nesting level of chained ternaries (lazerg) + * bug #66654 [ExpressionLanguage] Fix evaluating a parsed expression again after a null-safe operator short-circuited it (nicolas-grekas) + +### Filesystem + + * bug #66663 [Filesystem] Fix touch() with zero timestamp (ephpicman) + +### Form + + * minor #66903 [Form][Validator] Fix Tagalog (tl) translations and typos (jcparucha) + * minor #66698 [Form][Validator] Review Bulgarian translations (DRaichev) + * minor #66648 [Form][Validator] Reviewed Greek translations (angeliszotis) + * minor #66545 [Form][Security][Validator] Fix Urdu translations (nicolas-grekas) + * minor #66601 [Form][Validator] Review Japanese translations (akine) + * minor #66518 [Form] Fix Urdu translations (Anwishazaman) + * minor #66525 [Form][Validator] Review Turkish (tr) translations (mmustafasenoglu) + * minor #66488 [Form][Validator] Fix malformed placeholders in translations (nicolas-grekas) + * minor #66486 [Form][Validator] Review Persian (fa) translations (amirreza-khaleghverdi) + +### FrameworkBundle + + * bug #66793 [FrameworkBundle] Fix the "Cannot unset string offsets" crash in the configuration of workflows (nicolas-grekas) + * bug #66633 [FrameworkBundle] Don't let Monolog override php_errors.log: false (lazerg) + * bug #66569 [FrameworkBundle] Don't list aliases of abstract services in debug:autowiring (nicolas-grekas) + +### HttpClient + + * bug #66899 [HttpClient] Fix RetryableHttpClient::withOptions() changing the base URIs of the original client (nicolas-grekas) + * bug #66468 [HttpClient] Cap the timeout passed to curl_multi_select() (dylanpulver) + +### HttpFoundation + + * bug #66694 [HttpFoundation] Don't warn about request input keys nested too deeply (logosur) + * bug #66513 [HttpFoundation] Keep the session ID when the session handler fails to read (Firehed, nicolas-grekas) + * bug #66491 [HttpFoundation] Fix HeaderUtils::split() when a separator is a whitespace character (nicolas-grekas) + +### HttpKernel + + * bug #66883 [HttpKernel] Release the services of the container when the kernel shuts down (nicolas-grekas) + * bug #66826 [HttpKernel] Use the clock to resolve relative dates in `DateTimeValueResolver` (nicolas-grekas) + * bug #66759 [HttpKernel] Don't trace the responses `HttpCache` cannot store as stored (nicolas-grekas) + * bug #66665 [HttpKernel] Fix HttpCache leaking an output buffer when an ESI fragment fails (nicolas-grekas) + * bug #66662 [HttpKernel] Fix HttpCache serving a 500 instead of a 503 for stale ESI entries when the cache is locked (lyrixx) + * bug #66631 [HttpKernel] Release the container build lock on failure path (edefimov) + +### Lock + + * bug #66604 [Lock] Fix auto-release after a failed promotion or demotion (nicolas-grekas) + * bug #66600 [Lock] Fix the PostgreSQL stores losing track of a lock after a failed promotion or demotion (nicolas-grekas) + * bug #66597 [Lock] Fix FlockStore keeping a closed handle after a failed promotion (nicolas-grekas) + +### Messenger + + * bug #66867 [Messenger] Route zero-delay AMQP retries to the original queue (dalerazimov) + * bug #66779 [Messenger] Make AMQP transports only read their own queues with `--queues` (jkatruska) + * bug #66783 [Messenger][Amqp] Fix polling an empty queue counting as a message in flight (nicolas-grekas) + * bug #66628 [Messenger] Fix matching AMQP publisher confirms to their message after a timeout (nicolas-grekas) + * bug #66549 [Messenger] Fix the Doctrine transport masking commit failures (lazerg) + * bug #66541 [Messenger] Fix losing delayed messages when retrying the message that dispatched them (nicolas-grekas) + * bug #66509 [Messenger] Reject decoded messages that carry non-sendable stamps and validate the stamps of unserialized envelopes (nicolas-grekas) + * bug #66496 [Messenger] Fix moving a message between transports that use different serialization formats (nicolas-grekas) + * bug #66480 [Messenger] Fix decoding a `ValidationStamp` that holds a `GroupSequence` (nicolas-grekas) + * bug #66478 [Messenger] Fix recognizing a repeated error when its code does not keep its type in XML (nicolas-grekas) + * bug #66479 [Messenger] Fix decoding in XML a `ValidationStamp` that has one group or none (nicolas-grekas) + * bug #66473 [Messenger] Fix decoding in XML an `ErrorDetailsStamp` that has no `FlattenException` (nicolas-grekas) + * bug #66474 [Messenger] Turn any error thrown while decoding into a `MessageDecodingFailedException` (nicolas-grekas) + * bug #66475 [Messenger] Don't send handler results to transports (nicolas-grekas) + * bug #66463 [Messenger] Fix decoding `ErrorDetailsStamp` with the XML format (nicolas-grekas) + * bug #66455 [Messenger] Fix decoding `ErrorDetailsStamp` with `Serializer::create()` (nicolas-grekas) + * minor #66516 [Messenger] Recommend not decoding non-sendable stamps in `SerializerInterface::decode()` (nicolas-grekas) + +### Notifier + + * bug #66814 [Notifier][PagerDuty] Keep the user payload and send the timestamp as a string (nicolas-grekas) + +### PhpUnitBridge + + * minor #66510 [PhpUnitBridge] Remove silencing of __sleep/wakeup() deprecations (nicolas-grekas) + +### Process + + * bug #66696 [Process] Don't let inherited SYMFONY_DOTENV_VARS override explicitly passed env vars (KalimeroMK) + * bug #66620 [Process] Fix waitUntil() missing output read by its own status updates (KalimeroMK) + +### PsrHttpMessageBridge + + * bug #66672 [PsrHttpMessageBridge] use the empty string instead of null as an array offset (dalerazimov) + +### Scheduler + + * bug #66781 [Scheduler] Look inside the Envelope when describing a task (KalimeroMK) + +### Security + + * bug #66841 [Security] Fix using `OidcTokenHandler` when symfony/clock is not installed (nicolas-grekas) + * bug #66629 [Security] Don't copy the security token of the session into logs (nicolas-grekas) + * bug #66548 [Security] Pass only stringable request attributes to the URL generator in HttpUtils (lazerg) + +### SecurityBundle + + * bug #66653 [SecurityBundle] Make the expression language of `#[IsGranted]` lazy (nicolas-grekas) + * bug #66650 [SecurityBundle] Fix warming up the cache of `access_control` expressions (nicolas-grekas) + +### String + + * bug #66572 [String] Fix wordwrap() with $cut when the string ends with the break (SulimanAbdulrazzaq) + * bug #66503 [String] Fix width() of escape sequences with an intermediate or a digit final byte (nicolas-grekas) + * bug #66500 [String] Fix width() of OSC sequences terminated by BEL (nicolas-grekas) + * bug #66490 [String] Fix width() of skin tones on keycap and text-default bases, and of format characters (phcorp) + * bug #66447 [String] Fix the width of emoji sequences and conjoining Hangul jamo (nicolas-grekas) + * minor #66457 [String] Update wcswidth data with Unicode 18 (nicolas-grekas) + +### TwigBundle + + * bug #66741 [TwigBundle] Sort the templates listed by TemplateIterator (nicolas-grekas) + +### Uid + + * bug #66834 [Uid] Fix the date of time-based UUIDs before 1970 that have a fractional second (nicolas-grekas) + +### Validator + + * minor #66514 [Validator] Review Russian translations for the Audio constraint (semx) + +### VarDumper + + * bug #66866 [VarDumper] Fix dumping exceptions whose trace frames contain arrays or objects in extra keys (bwoebi) + +### WebProfilerBundle + + * bug #66682 [WebProfilerBundle] Serve phpinfo() as plain text when PHP runs with the CLI SAPI (lazerg) + +### Yaml + + * bug #66835 [Yaml] Fix parsing timestamps with a fractional second before 1970 (nicolas-grekas) + * bug #66830 [Yaml] Throw a ParseException on keys starting with a NUL byte when parsing mappings as objects (lazerg) + * bug #66711 [Yaml] Fold trailing and leading white space of multi-line quoted scalars (SulimanAbdulrazzaq) + * bug #66621 [Yaml] Do not treat quoted `<<` keys as merge keys (kevin9327) + * bug #66602 [Yaml] Quote the `...` document end marker when dumping (nicolas-grekas) + * bug #66592 [Yaml] Quote signed and decimal numeric strings with underscores when dumping (GabeSilvaDev) + * bug #66567 [Yaml] Quote `.inf` and `.nan` strings when dumping (SulimanAbdulrazzaq) + * bug #66523 [Yaml] Fix dumping tagged multi-line literal blocks (nicolas-grekas) + * bug #66508 [Yaml] Fix round-tripping literal blocks that start with spaces-only lines (drewmt, nicolas-grekas) + +### Other + + * minor #66466 Serbian translation update (Trysha-rbrn) + +* 6.4.47 (2026-09-29) + + * minor #66438 [Form][Validator] Review Dutch (nl) translations (michelvelswijk) + * bug #66434 [DependencyInjection] Track env placeholders reused after a previous extension dropped them (TamasSzigeti) + * bug #66416 [DependencyInjection][Routing] Escape identifiers in generated PHP (thomas-chauchefoin-tob) + * minor #66430 [FrameworkBundle] Fix the description of an empty webhook routing secret (nicolas-grekas) + * bug #66427 [DependencyInjection] Export the service id when sharing a circular wither service (nicolas-grekas) + * bug #66426 [Cache] Escape glob characters when clearing Redis namespaces (nicolas-grekas) + * bug #66425 [DoctrineBridge] Don't map the uuid and ulid type names to uid classes in DoctrineExtractor (lazerg) + * bug #66424 [WebProfilerBundle] Escape the workflow diagram source and listener map in the profiler (nicolas-grekas) + * bug #66409 [DoctrineBridge] Never claim an object as a collection key type (MlleDelphine) + * bug #66408 [Serializer] Don't include the debug trace id in the attributes cache key (javiereguiluz) + * minor #66363 [Translation] Updating and improving Albanian translations (gazi04) + * minor #66225 [Validator] Review Albanian translations (gazi04) + * bug #66395 [HttpKernel] Fix the log level of exceptions mapped to an HTTP status code (nicolas-grekas) + * minor #66362 [Validator] Review Arabic translations (fadyehabamer) + * bug #66359 [FrameworkBundle] Disable HTTP/2 push on the default HTTP client (Amoifr) + * bug #66387 [Serializer] Fix the cache key of MetadataAwareNameConverter when the context can't be serialized (nicolas-grekas) + * bug #66345 [Scheduler] Fix stateful schedules skipping every run when the checkpoint cannot be saved (srebb) + * bug #66344 [Yaml] Fix tabs in block scalars and comments after empty ones (X-Coder264) + * bug #66340 [Yaml] Fix `!!str` and `!!float` tags on block scalars (nicolas-grekas) + * bug #66342 [Yaml] Fix several parsing edge cases (nicolas-grekas) + * bug #66315 [Serializer] Fix quadratic time when collecting denormalization errors (thomas-chauchefoin-tob) + * bug #66338 [DoctrineBridge] Fix DoctrineExtractor for uid types and collections indexed by custom types (MlleDelphine) + * bug #66323 [Finder] Treat a .git file as the repository root in ignoreVCSIgnored() (rubas) + * bug #66322 [HttpKernel] Fix reading the listeners of the default dispatcher from an unserialized `EventDataCollector` (nicolas-grekas) + * minor #66287 [Validator] reviewed Polish translation units 149-165 (thunderer) + * minor #66312 [Form][Validator] Remove needs-review-translation state from Spanish translations (abp002) + * minor #66286 [Form] reviewed Polish translation unit 130 (thunderer) + * bug #66289 [Finder] Avoid quadratic backtracking when globs contain consecutive stars (nicolas-grekas) + * bug #66283 [Form] Stop using the deprecated any() matcher in ValidatorExtensionTrait (mbabker) + * minor #66280 [WebProfilerBundle] Truncate long non-GET URLs in the AJAX requests table (nicolas-grekas) + * bug #66276 [WebProfilerBundle] Fix long URLs overflowing the AJAX requests table in the toolbar (jmsche) + * bug #66274 [Doctrine] Resolve DBAL types through the connection instead of the static registry (GromNaN) + * bug #66268 [SecurityBundle] Dispatch the events of firewalls sharing a context on their own dispatcher (nicolas-grekas) + * bug #66266 [HttpClient] Fix `NativeHttpClient::stream()` skipping responses not opened yet (nicolas-grekas) + * bug #66270 [HttpClient] Don't reject highly compressed responses (nicolas-grekas) + * bug #66264 [Messenger] Fix a doctrine/dbal 4.5 deprecation in DoctrinePostgreSqlFilterIntegrationTest (nicolas-grekas) + * bug #66251 [HttpFoundation] Make session handlers non-serializable (mcdruid) + * bug #66262 [Serializer] Fix denormalizing the discriminator type property when a name converter renames it (nicolas-grekas) + * minor #66259 [Validator] Update Swedish translation #64518 (H4wKs) + * bug #66247 [Uid] Fix comparing a Uuid with a Ulid (nicolas-grekas) + * bug #66228 [Messenger] Avoid priority 0 when retrying AMQP messages (X-Coder264) + * minor #66230 [Validator] Review Indonesian audio translations (Yoruxyv) + * bug #66241 [DependencyInjection] Fix moving tags to the outermost decorator when a decorator is decorated (nicolas-grekas) + * bug #66233 [HttpClient] Don't set CURLOPT_WRITEFUNCTION from within the write callback (nicolas-grekas) + * bug #66222 [ErrorHandler] Remove the backtrace from the array kept by FatalError (janedbal) + * bug #66223 [Messenger] Fix sub-second delays being lost by the Doctrine transport (wimwinterberg) + * minor #66224 [Validator] Review Croatian translations (HypeMC) + * minor #66221 [Translation] Reviewing french validator translations (Kevin-HESSE) + * bug #66220 [FrameworkBundle] Fix DotenvVault corrupting a value that contains a back-reference (lazerg) + * minor #66186 [Translation] Review Brazilian Portuguese validator messages (Kaemiemi) + * minor #66205 [Form][Security][Validator] Review Macedonian (mk) translations (KalimeroMK) + * bug #66202 [Workflow] Escape the hash in Mermaid labels (nicolas-grekas) + * bug #66198 [Messenger] Fix InMemoryTransport delay when it spans a DST transition (SystematicCZ) + * minor #66183 [HttpClient] Document that withOptions() rejects an unsupported option (nicolas-grekas) + * minor #66163 Remove needs-review-translation flag for Russian validators (theprogrammist) + * minor #66156 [Validator] Add translations for the Audio constraint (nicolas-grekas) + * bug #66145 [ErrorHandler] Use the fatal error backtrace provided by PHP 8.5 (janedbal) + * bug #66159 [ErrorHandler] Stop recursing when the logger keeps throwing (nicolas-grekas) + * minor #66150 [Lock] Document that only the owning key can release a lock (nicolas-grekas) + * bug #66141 [Console] Fix quadratic formatting of non-ASCII content (a-muzyka) + * minor #66147 translation: Serbian Translation of issues 66107,66108 (Trysha-rbrn) + * minor #66148 [Form] Review Indonesian translation for validators (Yoruxyv) + * minor #66139 [Validator] Add missing Arabic translation for validation units (EmanFateen) + * bug #66137 [FrameworkBundle] Cache the serializer metadata in debug mode when it comes from mapping files (nicolas-grekas) + * minor #66128 Missing translations for Croatian (hr) (gjuric) + * minor #66132 [Notifier] Fix the event dispatcher type of the FakeChat transports (nicolas-grekas) + * bug #66123 [Yaml] Fix the line offset handed to nested block parsers (lazerg) + * minor #66120 [Security] Document that user checkers run on every authentication (nicolas-grekas) + * minor #66118 [Security] Fix the type declared for the event dispatcher (nicolas-grekas) + * minor #66115 [Form] Review Italian translation for validators (GiuseppePuleri) + * minor #66113 [Form] Review French translation for range bound validator (rooneyi) + * bug #66080 [HttpClient] Add missing non-routable ranges to NoPrivateNetworkHttpClient (nicolas-grekas) + * bug #66079 [Serializer] Make MetadataAwareNameConverter caches per instance (nicolas-grekas) + * bug #66078 [HttpFoundation] Fix port stripping on IPv4-mapped IPv6 forwarded addresses (nicolas-grekas) + +* 6.4.46 (2026-09-15) + + * bug #66048 [HttpFoundation] Remove the ambiguity that makes HeaderUtils::split() backtrack (nicolas-grekas) + * bug #66043 [TwigBridge] Compose form theme blocks with Twig's BlockChain when available (fabpot) + * bug #66041 [Form] Describe the options of a type extension registered on a type extension (fabpot) + * bug #66037 [Translation] Resolve Phrase locales by their code instead of by their name (nicolas-grekas) + * bug #66032 [Messenger] Drop the messages queued by a failed nested dispatch (nicolas-grekas) + * bug #66027 [AssetMapper][FrameworkBundle] Stop versioning the assets the mapper already resolved (Amoifr) + * bug #66023 [HttpFoundation] Fix IpUtils::anonymize() for non-canonical IPv4-mapped addresses (GabeSilvaDev) + * bug #65995 [String] Keep the case of a leading acronym in ByteString::camel() (Amoifr) + * bug #66003 [DoctrineBridge][FrameworkBundle][HttpKernel][TwigBundle] Escape percent signs in kernel path parameters (nicolas-grekas) + * bug #65976 [Console] Keep messages containing malformed UTF-8 when wrapping (Meacue) + * bug #65963 [Finder] Only treat a leading hash as a gitignore comment and strip trailing spaces only (fabpot) + * bug #65974 [FrameworkBundle] Fix the fatal when a cache pool cannot be cleared (nicolas-grekas) + * bug #65967 [Mailer] Reconnect when the server closed the transmission channel (ousamabenyounes) + * bug #65962 [Finder] Fix building the gitignore regex for files with many patterns (fabpot) + * bug #65961 [Finder] Fix ignoreVCSIgnored() when the search directory is reached through a symlink (fabpot) + * bug #65952 [Security] Do not follow redirects on the OIDC UserInfo endpoint (nicolas-grekas) + * bug #65914 [HttpClient] Suppress warnings from failed DNS lookups (Toflar) + * bug #65912 [Security] Read the OIDC verified claims as booleans (nicolas-grekas) + * bug #65904 [Messenger] Fix sub-second delays being ignored by the in-memory transport (nicolas-grekas) + * bug #65907 [Serializer] Don't reuse list items with deep_object_to_populate (nicolas-grekas) + * bug #65893 [Cache] Don't close lock handles that are still in use when evicting a slot (nicolas-grekas) + * bug #65889 [FrameworkBundle] Fix HTTP client request assertion matching (X-Coder264) + * bug #65888 [Validator] Drop unreachable territory keys from IBAN formats (lazerg) + * bug #65883 [FrameworkBundle] Fix the "framework.remote-event" config node being impossible to set (nicolas-grekas) + * bug #65867 [Cache] Add support for relay 0.50 (nicolas-grekas) + * bug #65859 [Security] Reset the login rate limiter on successful login with a peekable limiter (lazerg) + * bug #65843 [HtmlSanitizer] Drop relative URLs whose first path segment contains a colon instead of throwing (nicolas-grekas) + * bug #65844 [Mime] Reject header names containing non-printable or non-ASCII characters (nicolas-grekas) + * bug #65837 [PropertyInfo] Do not prefer a method returning the declaring class as the property accessor (lazerg) + * bug #65823 [String] Fix singularization of words ending in -ives (dylanpulver) + * bug #65822 [WebProfilerBundle] Fix a TypeError when the ajax toolbar panel is missing from the page (lazerg) + * bug #65818 [Console] Do not evaluate the command line in the zsh completion (GromNaN, nicolas-grekas) + * bug #65811 [Console] Fix the bash completion on macOS and cover more option modes (GromNaN) + * bug #65801 [Finder] Fix prune filters not applied to nested directories and with path excludes (nicolas-grekas) + * bug #65780 [Form] Accept UTC-equivalent timezones for date and time model data (ousamabenyounes) + * bug #65784 [Process] Use an absolute path for the cmd.exe fallback on Windows (nicolas-grekas) + * bug #65783 [Console] Test the shell completion scripts and fix the escaping (GromNaN) + * bug #65779 [Messenger] Fix a crash when a Redis stream entry is not a JSON object (nicolas-grekas) + * bug #65778 [Mime] Never emit a raw control character in a header (Spomky) + * bug #65776 [Notifier][Vonage] Verify the payload_hash claim of signed webhooks (nicolas-grekas) + * bug #65775 [HttpFoundation] Match paths with the DOTALL modifier (nicolas-grekas) + * bug #65773 [Mailer][Sendgrid] Verify the webhook signature before parsing the payload (nicolas-grekas) + * bug #65777 [Mime] Do not treat an "@" inside the domain as the addr-spec separator (Spomky) + * bug #65772 [Webhook] Reject a malformed request body with a 406 instead of a 500 (nicolas-grekas) + * bug #65768 [Notifier] Reject an empty secret in the Twilio webhook parser (nicolas-grekas) + +* 6.4.45 (2026-08-30) + + * bug #65754 [PhpUnitBridge] Fix ClockMock::hrtime() when the clock is not mocked and when the nanoseconds have leading zeros (nicolas-grekas) + * bug #65751 [HttpClient] Reject decompression bombs (nicolas-grekas) + * bug #65753 [HttpFoundation] Combine trusted host patterns into a single regexp (nicolas-grekas) + * bug #65740 [HttpClient] Reject https:// proxies that curl would connect to in cleartext (nicolas-grekas) + * bug #65747 [RateLimiter] Cap the burst size and the duration computed from it (cs278, nicolas-grekas) + * bug #65731 [HttpClient] Don't send the original Host header on cross-authority redirects (nicolas-grekas) + * bug #65742 [HttpClient] Reject 3xx pushed responses (nicolas-grekas) + * bug #65746 [Messenger] Drop trace args from FlattenException normalization (ousamabenyounes, nicolas-grekas) + * bug #65744 [Mime] Reject an unquoted "@" in the local part of an email address (nicolas-grekas) + * bug #65739 [Process] Ignore invalid env var names and non-scalar env values (nicolas-grekas, dionisvl) + * bug #65738 [Process] Stop leaking CGI/FastCGI request-context vars to subprocesses (nicolas-grekas) + * bug #65735 [Security] Avoid failing when PersistentRememberMeHandler handles a malformed cookie (Seldaek) + * bug #65734 [Security] Reject malformed login link parameters instead of throwing a TypeError (davidszkiba, nicolas-grekas) + * bug #65733 [Security] Remove the legacy nested unserialize() call from token and exception classes (nicolas-grekas) + * bug #65732 [SecurityBundle] Restrict redirections to the current host when sessions are disabled (nicolas-grekas) + * bug #65737 [HttpKernel][Security] Add allowed_classes => false to unserialize() in CacheWarmerAggregate, LoggerDataCollector, and HttpCache Store (XananasX7) + * bug #65736 [HttpKernel] Ignore the session id that PHP kept from a previous request (nicolas-grekas) + * bug #65730 [HttpKernel] Fix TypeError in UriSigner when the hash parameter is not a string (nicolas-grekas) + * bug #65743 [HttpFoundation] Encode the path in the X-Accel-Redirect header (Athorcis) + * bug #65729 [HttpFoundation] Reject reserved characters in the cookie path and domain (nicolas-grekas) + * bug #65728 [Routing] Fix matching the "0" URL (cs278) + * bug #65727 [Yaml] Fix a TypeError when "!!binary" is given an unparsable value (nicolas-grekas) + * bug #65745 [Filesystem] Keep tempnam() files private when a suffix is given (iliaal) + * bug #65726 [Filesystem] preserve source mode when copying files (nicolas-grekas) + * bug #65741 [HttpFoundation] Reject invalid paths (nicolas-grekas) + * bug #65725 [HttpFoundation] Fix parsing hosts and schemes in URLs (nicolas-grekas) + * bug #65721 [Lock] Never take the reserved "__write__" member as a Redis lock token (nicolas-grekas) + * bug #65718 [VarDumper] Escape UTF-8 encoded C1 control characters (nicolas-grekas) + * bug #65704 [HttpClient] Drop credentials when a redirect changes the scheme (nicolas-grekas) + * bug #65693 [Messenger] Restrict what "X-Message-Stamp-*" headers can put in an envelope (nicolas-grekas) + * bug #65692 [Console][MonologBridge][VarDumper] Escape context strings written to the terminal (nicolas-grekas) + * bug #65691 [VarDumper] Escape context strings in HtmlDescriptor (nicolas-grekas) + * bug #65690 [ExpressionLanguage] Bound the nesting level of parsed expressions (nicolas-grekas) + * bug #65689 [SecurityBundle] Use a lock for login throttling by default (nicolas-grekas) + * bug #65686 [Serializer] Check the denormalized class is a Mime part in MimeMessageNormalizer (nicolas-grekas) + * bug #65688 [Yaml] Bound recursion depth in the inline lexer (nicolas-grekas) + * bug #65687 [HttpKernel] Validate the profiler token before using it as a file name (nicolas-grekas) + * bug #65709 [Mailer][Mailgun] Reject non-string signature fields instead of throwing a TypeError (nicolas-grekas) + * bug #65710 [Notifier][Twilio] Sign the query string as sent instead of the normalized one (nicolas-grekas) + * bug #65670 [Serializer] Fix deep_object_to_populate for collections of objects (lazerg) + * bug #65700 [Mailer][Notifier] Reject Mailgun, SendGrid and Vonage webhook requests with a stale timestamp (nicolas-grekas) + * bug #65701 [DoctrineBridge] Restore the tolerance for outdated remember-me tokens after concurrent requests (nicolas-grekas) + * bug #65702 [HtmlSanitizer] Compare schemes and hosts case-insensitively (nicolas-grekas) + * bug #65684 [Cache][HttpFoundation] Do not unmarshall values that SodiumMarshaller cannot decrypt (nicolas-grekas) + * bug #65685 [Security] Narrow the race that lets a login link exceed max_uses (nicolas-grekas) + * bug #65683 [HttpFoundation] Allow-list the values of the "X-Sendfile-Type" header (nicolas-grekas) + * bug #65682 [HttpFoundation] Ignore session ids that are not usable as file names in MockFileSessionStorage (nicolas-grekas) + * bug #65681 [HttpKernel] Strip cache-internal headers from backend responses in HttpCache (nicolas-grekas) + * bug #65655 [Security] Apply "signature_properties" when a remember-me token provider is used (nicolas-grekas) + * bug #65664 [HtmlSanitizer] Keep rejecting denied URL characters when percent-decoding yields malformed UTF-8 (nicolas-grekas) + * bug #65674 [Mailer] Use the configured secret to authenticate Postmark webhooks (nicolas-grekas) + * bug #65666 [VarDumper] Account for PHP 8.6 deprecating `SplFileObject::getCsvControl()` (nicolas-grekas) + * bug #65662 [HtmlSanitizer] Accept percent-encoded line breaks and tabs in the query of hostless URLs (webdevsamran) + * bug #65660 [Cache] Respect max_execution_time in LockRegistry's wait loop (uncaught) + * bug #65647 [Serializer] Fix max depth counting for subclasses that inherit MaxDepth metadata (oliinykdm) + * bug #65651 [Yaml] Quote strings that look like octal numbers when dumping (lazerg) + * bug #65644 [Notifier] Fix escaping of MarkdownV2 markup in TelegramTransport (nicolas-grekas) + * bug #65637 [Console][FrameworkBundle] Fix profiling a command stopped at ConsoleEvents::COMMAND (Spomky) + * bug #65630 [HttpKernel] Fix regression when a locale aware service is never initialized (lazerg) + * bug #65636 [Cache] Fix authenticating to the master when using Redis Sentinel (nicolas-grekas) + * bug #65621 [PropertyInfo] Do not prefer a static named constructor as the property mutator (nicolas-grekas) + * bug #65619 [PropertyInfo] Do not prefer a static named constructor as the property accessor (lazerg) + * bug #65607 [HttpKernel] Capture flushed content in HttpKernelBrowser (vencakrecl) + * bug #65599 [CssSelector] Fix quadratic token probing in Reader::findPattern() (iliaal) + * bug #65601 [VarExporter] Fix export of string parameter defaults containing escaped quotes (iliaal) + * bug #65598 [Filesystem] Fix makeRelative() stripping leading dots when the base path is a root (iliaal) + * bug #65597 [Filesystem] Keep tempnam() files private when a suffix is given (iliaal) + +* 6.4.44 (2026-08-22) + + * bug #65541 [Serializer] Fix denormalizing mime messages typed as RawMessage (nicolas-grekas) + * bug #65524 [Security] Match check paths given as a route alias (nicolas-grekas) + * bug #65521 [WebProfilerBundle] Fix the mailer panel crashing when an attached file was deleted (nicolas-grekas) + * bug #65514 [Messenger] Tell apart handler services that share the same class (nicolas-grekas) + * bug #65506 [Validator] Fix auto-mapping strategies being ignored on inherited properties (nicolas-grekas) + * bug #65584 [Form] Map violations to child forms named after the snake cased property (nicolas-grekas) + * bug #65582 [CssSelector] Fix :disabled and :enabled inside nested fieldsets (nicolas-grekas) + * bug #65540 [HttpKernel] Fix caching responses that cannot provide their content (nicolas-grekas) + * bug #65538 [Form] Fix rendering and parsing dates before the Gregorian cutover (nicolas-grekas) + * bug #65534 [ErrorHandler] Fix leaking an exception handler when not replacing the error handler (nicolas-grekas) + * bug #65533 [Scheduler] Reject canceled scheduled messages so async transports do not redeliver them (nicolas-grekas) + * bug #65532 [DependencyInjection] Keep % escaping when resolving values against a resolved parameter bag (nicolas-grekas) + * bug #65530 [Form] Apply the configured rounding mode when no scale is set (nicolas-grekas) + * bug #65526 [HttpKernel] Restore the locale that was in use before a sub-request (nicolas-grekas) + * bug #65525 [FrameworkBundle] Fix lint:container skipping services matched by tagged iterators (nicolas-grekas) + * bug #65522 [Form] Do not inherit translation parameters for translatable labels and help messages (nicolas-grekas) + * bug #65519 [DomCrawler] Detect the charset from meta tags only (nicolas-grekas) + * bug #65517 [FrameworkBundle] Fix dispatching console events after cache:clear (nicolas-grekas) + * bug #65516 [HttpKernel] Forward the request headers to inline rendered fragments (nicolas-grekas) + * bug #65513 [Messenger] Ignore the option-less handler tag added by autoconfiguration (nicolas-grekas) + * bug #65512 [HttpKernel] Ignore the session id that PHP kept from a previous request (nicolas-grekas) + * bug #65511 [Serializer] Fix SerializedName being ignored on denormalization when the attribute has groups (nicolas-grekas) + * bug #65510 [PhpUnitBridge] Fix finding the project root when vendor/ is a symlink (nicolas-grekas) + * bug #65509 [Mime] Reject an unquoted "@" in the local part of an email address (nicolas-grekas) + * bug #65508 [Intl] Follow the ICU parent locale when falling back (nicolas-grekas) + * bug #65507 [BrowserKit] Fix decoding raw cookie values that contain a plus sign (nicolas-grekas) + * bug #65504 [Messenger] Stop applying serialization groups and attribute filters to stamps (nicolas-grekas) + * bug #65502 [Security] Refresh the impersonator while impersonating (nicolas-grekas) + * bug #65501 [PropertyInfo] Fix the priority of the accessor named after the property (nicolas-grekas) + * bug #65499 [Serializer] Fix XmlEncoder dropping the extra attributes of item elements on decode (nicolas-grekas) + * bug #65491 [Serializer] Allow the attributes of nested discriminator maps when denormalizing (nicolas-grekas) + * bug #65580 [Notifier] Fix SendFailedMessageToNotifierListener rejecting any notifier but the concrete one (nicolas-grekas) + * bug #65476 [DoctrineBridge][EventDispatcher] Fix losing listeners when a lazy listener adds listeners (nicolas-grekas) + * bug #65498 [Process] Do not wait for output when the input iterator has more data (nicolas-grekas) + * bug #65495 [TwigBridge] Fix the broken error box around Bootstrap 4 date and time widgets (nicolas-grekas) + * bug #65494 [Translation] Stop leaking a temporary schema copy per validated XLIFF file inside a phar (nicolas-grekas) + * bug #65493 [Serializer] Fix XmlEncoder skipping normalizers for nested Traversable values (nicolas-grekas) + * bug #65489 [Scheduler] Fix refreshing the checkpoint lock with a negative TTL (nicolas-grekas) + * bug #65488 [MonologBridge] Fix NotifierHandler calling a method that NotifierInterface does not declare (nicolas-grekas) + * bug #65487 [Messenger] Fail when messenger:consume is given no receiver (nicolas-grekas) + * bug #65486 [Messenger] Remove the worker listeners when messenger:consume ends (nicolas-grekas) + * bug #65485 [Mailer] Remove metadata headers from the emails sent by the SES HTTP transports (nicolas-grekas) + * bug #65484 [HttpClient] Fix CachingHttpClient when trusted hosts are configured (nicolas-grekas) + * bug #65483 [FrameworkBundle] Show the effective priority of tagged services in debug:container (nicolas-grekas) + * bug #65482 [FrameworkBundle] Fix ignored --raw option of debug:router (nicolas-grekas) + * bug #65481 [FrameworkBundle] Fix debug:config and config:dump-reference when a bundle registers services in its build method (nicolas-grekas) + * bug #65474 [DependencyInjection] Fix compiling nested service locators (nicolas-grekas) + * bug #65473 [DependencyInjection] Fix sorting tagged services when autoconfiguration duplicates a tag (nicolas-grekas) + * bug #65578 [Form] Apply the guessed "pattern" and "maxlength" attributes to the types rendered as text inputs (nicolas-grekas) + * bug #65528 [Security] Track session usage when a lazy firewall reads the token (nicolas-grekas) + * bug #65527 [Mailer] Fix emails reported twice when they are queued and sent in the same process (nicolas-grekas) + * bug #65523 [PropertyInfo] Use the same mutator method for types and write info (nicolas-grekas) + * bug #65520 [BrowserKit] Return the most specific cookie when several ones match (nicolas-grekas) + * bug #65505 [Form] Apply the guessed "pattern" and "maxlength" attributes to text inputs only (nicolas-grekas) + * bug #65496 [HttpKernel] Send the response content before terminating the kernel in the test client (nicolas-grekas) + * bug #65492 [Serializer] Allow array indexes in the property paths of attributes when denormalizing (nicolas-grekas) + * bug #65529 [Finder] Fix gitignore matching of negated patterns and excluded directories (nicolas-grekas) + * bug #65546 [Scheduler] Fix infinite loop in MessageGenerator when a trigger does not move the run date forward (lazerg) + * bug #65500 [Console] Keep backslashes preceding < and > when escaping text (nicolas-grekas) + * bug #65542 [DependencyInjection] Detect circular references through a shared factory builder (nicolas-grekas) + * bug #65477 [Finder] Do not report dangling symlinks as both files and directories (nicolas-grekas) + * bug #65472 [HttpKernel] Write pending dumps to the output before dd() exits (nicolas-grekas) + * bug #65471 [Console] Fix clearing more lines than a section holds (nicolas-grekas) + * bug #65470 [Yaml] Fix parsing tagged block scalars inside sequences (nicolas-grekas) + * bug #65537 [Filesystem] Fix mirror() deleting files from the origin directory (nicolas-grekas) + * bug #65518 [Translation] Fix pushing numeric translation keys to Lokalise (nicolas-grekas) + * bug #65547 [VarDumper] Fix division by zero when dumping a DatePeriod whose interval does not move forward (lazerg) + * bug #65544 [Mailer] Fix the SMTP scheme check in the transport factory test case (nicolas-grekas) + * bug #65503 [VarDumper] Fix losing colors when dumping to php://output on the CLI (nicolas-grekas) + * bug #65469 [Scheduler] Fix infinite loop in PeriodicalTrigger when the interval cannot move the run date forward (wazum) + * bug #65478 [Form] Replace the {{ max }} placeholder in the post_max_size error message (nicolas-grekas) + * bug #65480 [Form] Fix the money pattern for locales that do not use ASCII digits (nicolas-grekas) + * bug #65465 [TwigBridge] Pass a valid XML version to DOMDocument in the form layout test case (nicolas-grekas) + * bug #65448 [HttpKernel] Fix concurrent cache warmups corrupting the deprecations log (lazerg) + * bug #65444 [Config] Fix dumping keyless prototyped arrays of arrays in XmlReferenceDumper (nicolas-grekas) + * bug #65430 [Cache] Validate every key before deleting any in ArrayAdapter::deleteItems() (nicolas-grekas) + * bug #65429 [Cache] Fix numeric string keys being cast to integers (nicolas-grekas) + * bug #65425 [Yaml] Fix parsing an alias followed by a comment (eyupcanakman) + * bug #65421 [Cache] Fix Predis ignoring the "auth" parameter set in the DSN or in the options (nicolas-grekas) + * bug #65423 [WebProfilerBundle] Fix wrongly disabled tabs and toggles that cannot be focused (Nitram1123) + * bug #65422 [Security] Reject malformed login link parameters instead of throwing a TypeError (nicolas-grekas) + * bug #65419 [Console] Consume the whole escape sequence when reading autocomplete input (nicolas-grekas) + * bug #65395 [Yaml] Do not treat an uppercase 0X prefix as hexadecimal (eyupcanakman) + * bug #65392 [DomCrawler] Fix FormField::getLabel() when the field id contains a quote (nicolas-grekas) + * bug #65391 [DomCrawler] Read the whole content of a textarea (nicolas-grekas) + * bug #65382 [DomCrawler] Fix matches(), closest() and children() for selectors with a combinator or a positional pseudo-class (nicolas-grekas) + * bug #65376 [Validator] Allow a literal # in the fragment part of Url (lazerg) + * bug #65371 [Translation] Read CSV translations without SplFileObject (nicolas-grekas) + * bug #65372 [HttpFoundation] Declare create_sid() on session handlers (nicolas-grekas) + * bug #65367 Fix PHP 8.6 deprecations (nicolas-grekas) + * bug #65363 [MonologBridge] Release command data in ConsoleCommandProcessor when the command terminates (tomsommer) + * bug #65352 [Mailer] Reconnect after a timeout to avoid SMTP response desync (ousamabenyounes) + * bug #65354 [Serializer] Throw on XML data without a root node (nicolas-grekas) + * bug #65315 [Translation] Do not extract messages from classes merely named TranslatableMessage (nicolas-grekas) + * bug #65314 [HttpClient] Fix abandoned wrapped response throwing on destruct (nicolas-grekas) + * bug #65311 [HttpClient] Fix mis-armed consumption guard in AsyncResponse::stream() (nicolas-grekas) + * bug #65305 [Messenger] Handle synchronous batch nack (eissasoubhi) + * bug #65296 [DoctrineBridge] Fix removing lazy listeners by object (eissasoubhi) + * bug #65288 [Cache] Fix stampede protection not being disabled on CLI (nicolas-grekas) + * bug #65278 [FrameworkBundle] Reset the notification logger listener between messages (nicolas-grekas) + * bug #65271 [DependencyInjection] Fix circular references through expressions (eissasoubhi) + * bug #65275 [PropertyInfo] Ignore methods that only look like accessors (nicolas-grekas) + * bug #65264 [Mime] Do not drop the last line of a resource-backed message (sadiqk2) + * bug #65262 [AssetMapper] Include front controller in dev asset URLs (eissasoubhi) + * bug #65260 [Messenger][AmazonSqs] Support queue URLs from the aws-cn and aws-eusc partitions (bhavin-nakrani) + * bug #65258 [Console] Restore the catchExceptions state after running a command message (KevinMartinsDev) + * bug #65252 [HttpFoundation] Combine trusted host patterns into a single regexp (nicolas-grekas) + * bug #65249 [DependencyInjection][HttpKernel] Fix undefined variable when locking the container build fails early (javiereguiluz) + * bug #65193 [RateLimiter] Cap the burst size and the duration computed from it (cs278) + * bug #65191 [PhpUnitBridge] Don't return a non-callable from getPhpUnitErrorHandler() (sadiqk2) + * bug #65180 [HttpKernel] Fix failing reset methods preventing later services from resetting (javiereguiluz) + * bug #64982 [PropertyInfo] Do not report a non-public mutator as writable (nicolas-grekas) + * bug #65128 [Mime] Escape backslashes in Address::getEncodedName() (munzzyy) + * bug #65172 [DependencyInjection] Don't keep partially-configured shared services when their setup fails (javiereguiluz) + * bug #65131 [FrameworkBundle] Fix "cache:clear" failing when the cache dir is rebuilt concurrently (ousamabenyounes) + * bug #65116 [Lock] Fix a released read lock letting a new read lock through while a write lock is held (Zombaya) + * bug #65133 [DependencyInjection] Fix ParameterBag::clear() leaving stale deprecations and resolution state (javiereguiluz) + * bug #65113 [DependencyInjection] Fix instantiating a lazy proxy for an inline definition (nicolas-grekas) + * bug #65112 [DependencyInjection] Fix misleading error messages for invalid "proxy" tags (nicolas-grekas) + * bug #65111 [DependencyInjection] Fix generating one proxy class per set of "proxy" tags (nicolas-grekas) + * bug #65100 [Translation][Lokalise] Send filter_filenames as a JSON array (nicolas-grekas) + * bug #65099 [Mailer][Sendgrid] Map the processed event to RECEIVED (nicolas-grekas) + * bug #65065 [Console] Fix column widths when a row spans columns (wazum) + * bug #65062 [Mime] Fix corrupted CID references when one is a prefix of another (MarcinOrlowski) + * bug #65066 [Mailer] Fix rewriting cid references of inline parts for Mailgun (nicolas-grekas) + * bug #65060 [TwigBridge][WebProfilerBundle] Fix compatibility with Twig 4 (nicolas-grekas) + * bug #65058 [PropertyAccess] Fix caching of null read info (javiereguiluz) + * bug #65059 [Translation] Fix fuzzy translations and multi-line msgctxt in PO files (javiereguiluz) + * bug #65041 [Validator] Fix File constraint skipping the mime type check when extensions and mimeTypes have no common value (nicolas-grekas) + * bug #65049 [Translation] Do not split ICU messages on pipes in PoFileDumper (nicolas-grekas) + * bug #65036 [HttpClient] Revert " Strip Proxy-Authorization on cross-authority redirects" (GrahamCampbell) + +* 6.4.43 (2026-07-29) + + * bug #65028 [HttpClient] Fail when an https proxy is configured but libcurl cannot use it (nicolas-grekas) + * bug #65025 [Serializer] Check the denormalized class is a Mime part in MimeMessageNormalizer (nicolas-grekas) + * bug #65024 [SecurityBundle] Always constrain redirect targets to the current host, even without sessions (nicolas-grekas) + * bug #65023 [HttpFoundation] Validate the characters allowed in a cookie path and domain (nicolas-grekas) + * bug #65022 [HttpFoundation] Don't crash on a non-string signature in UriSigner (nicolas-grekas) + * bug #65019 [HttpClient] Strip Proxy-Authorization on cross-authority redirects (nicolas-grekas) + * bug #65011 [Cache] Add support for relay 0.40 (nicolas-grekas) + * bug #65009 [HttpClient] Fix the escaping of the generated curl command (nicolas-grekas) + * bug #65004 [HttpClient] Don't send the original Host header on cross-authority redirects (nicolas-grekas) + * bug #64995 [Serializer] Prefer serialized name over raw property key (ousamabenyounes) + * bug #64992 [String] Consistently return null for out-of-range offsets (javiereguiluz) + * bug #64985 [Mailer] Fix fatal TypeError when sending a RawMessage via an API transport (Baylox) + * bug #64975 [SecurityBundle] Let the LDAP and non-LDAP variants of an authenticator share a firewall (nicolas-grekas) + * bug #64662 [Console] Decorate stdout and stderr independently when a formatter is injected (jprivet-dev) + * bug #64820 [Mailer][Messenger] Wrap AsyncAws exceptions into TransportException in the AmazonSqs and SES transports (voodooism, nicolas-grekas) + * bug #64768 [Bridge][Monolog] Do not reset in ConsoleCommandProcessor (lyrixx) + * bug #64971 [Dotenv] Don't parse external env var values when resolving .env references (nicolas-grekas) + * bug #64972 [AssetMapper] Reset the mapped asset factory between requests (pokki-deploy) + * bug #64966 [AssetMapper] Avoid re-expanding bare importmap entries (pokki-deploy) + * bug #64965 [Serializer] Do not read subclass discriminator attributes from base objects (pokki-deploy) + * bug #64957 [Cache] Fix "Class Relay\Relay not found" for RedisCluster/RedisArray with tcp_keepalive (rjmackay) + * bug #64710 [Mailer] Reject control characters in SmtpTransport::setLocalDomain() (iliaal) + * bug #64945 [HttpFoundation] Throw when IpUtils::isPrivateIp() receives a non-canonical IP address (Amoifr) + * bug #64935 [PropertyInfo] Ignore mutators with several required parameters (pokki-deploy) + * bug #64937 [Validator] Allow `Traverse` to be inherited (MatTheCat) + * bug #64905 [PropertyInfo] Fix union with mixed handling in PhpStanTypeHelper (Amoifr) + * bug #64928 [Messenger] Strip trace from nested exceptions in ErrorDetailsStamp (pkranjcecx) + * bug #64933 [Messenger] Fix ack/reject failing when the Redis stream entry is already deleted (pokki-deploy) + * bug #64707 [AssetMapper] Fix crash when a remote package depends on a locally-mapped importmap entry (Amoifr) + * bug #64655 [EventDispatcher] Fix regression in TraceableEventDispatcher invocation counting (jnahmias) + * bug #64727 [Routing] Detect circular references in object route parameters (Amoifr) + * bug #64741 [Mime] Fix dropped whitespace between multiple encoded words (eyupcanakman) + * bug #64843 [Console] Fix table borders around colspan cells and header-less tables (wazum) + * bug #64930 Handle PHP 8.6 removing function arguments in error messages (MatTheCat) + * bug #64847 [DoctrineBridge] Filter non-.php files in ProxyCacheWarmer::warmUp() to avoid CacheWarmerAggregate exception (semx) + * bug #64857 [Config] Escape comment-closing sequence in generated config builders (sadiqk2) + * bug #64886 [Console] Fix two ValueError crashes on multibyte / multi-column widths (sadiqk2) + * bug #64887 [Cache] Initialize PhpArrayAdapter before classifying keys in deleteItems() (sadiqk2) + * bug #64897 [Messenger][AmazonSqs] Fix fatal on shutdown when the in-flight receive cannot be resumed (vadimgodev) + * bug #64904 [ErrorHandler] Fix fatal error without args triggering an error when calling `getTraceFromString` (timacdonald) + * bug #64914 [EventDispatcher] Clear wrappedListeners in TraceableEventDispatcher::reset() (guillaumedelre) + * bug #64914 [EventDispatcher] Clear wrappedListeners in TraceableEventDispatcher::reset() (guillaumedelre) + * bug #64672 [Yaml] Fix line folding after trailing backslashes in quoted strings (eyupcanakman) + * bug #64668 [DependencyInjection] Fix env var reported as never used for a removed autowired service (eyupcanakman) + * bug #64915 [Yaml] Fix parsing and dumping of NaN (semx) + * bug #64918 [String] Fix AsciiSlugger::getLocale() TypeError with no locale set (eyupcanakman) + * bug #64891 [TwigBridge] ensure that a label with value "0" is rendered (xabbuh) + * bug #64889 [HttpClient] Replace the native "dechunk" stream filter with a pure PHP implementation (nicolas-grekas) + * bug #64898 [Cache] Remove obsolete `return` instruction from classes constructors (cedric-anne) + * bug #64895 [Dotenv] Allow multiple underscores at start (Sajito) + * bug #64884 Fix/webprofiler mailer macros 6.4 (HecFranco) + * bug #64877 [Validator] Reject misplaced "X" character in ISBN-10 validation (semx) + * bug #64856 [Console] Fall back to "stty sane" when restoring the captured terminal state fails (lyrixx) + * bug #64649 [Serializer] Fix support check for nested array items (nicolas-grekas) + * bug #64827 jitter shouldn't make scheduler miss runs (mrossard) + * bug #64849 [Console] Fix SymfonyStyle questions when using output sections (javiereguiluz) + * bug #64815 [Cache] Remove always-true method_exists() check in FilesystemCommonTrait::__destruct() (munzzyy) + * bug #64783 Add additional IP ranges for RFC2544 and RFC5180 (thePanz) + * bug #64789 [HttpFoundation] Add RFC5737 and RFC3849 to IpUtils::PRIVATE_SUBNETS (thePanz) + * bug #64739 [PropertyInfo] Prevent `PhpDocTypeHelper` to wrongly assume keys type (MatTheCat) + * bug #64752 [Yaml] Fix parsing of integers with a leading plus sign (eyupcanakman) + * bug #64701 Fix Absolute URL generation by ignore tel: mailto: and other app links (tomm1996, alexander-schranz) + * bug #64734 [Filesystem] Trim trailing whitespace from the tempnam() prefix (Amoifr) + * bug #64732 [String] Fix splice() on multibyte strings (eyupcanakman) + +* 6.4.42 (2026-06-27) + + * bug #64718 [Serializer] Fix `GetSetMethodNormalizer` denormalization of constructor only objects (mtarld) + * data #64692 [Validator] Remove needs-review-translation state from Spanish cron e… (salvador-castro) + * data #64698 [Validator] reviewed Polish translation unit 146 (thunderer) + * data #64711 [Validator] Ukrainian translation update (VladyslavChernyshov) + * data #64675 [Validator] Add translated messages for the Cron constraint (fabpot) + * bug #64120 [Serializer] honor `csv_headers` context when `no_headers` is true (ousamabenyounes) + * bug #64648 [Cache] Ensure RelayProxy compatibility with Relay extension 0.30.0 (nicolas-grekas) + * bug #64225 [Serializer] Fix #[Ignore] on a getter ignoring a same-name property (eyupcanakman) + * bug #64236 [Finder] Fix recursion into stream wrapper subdirectories on Windows (eyupcanakman) + * bug #49137 [Validator] Avoid TypeError and improve DX when null groups (alamirault) + * bug #64635 [AssetMapper] Fix stale dev asset cache in long-running runtimes (adrianrudnik) + * bug #64576 [Serializer] Fix denormalization of already-instantiated nested objects (pokki-deploy) + * bug #64404 [SecurityBundle] Fix state leak in LogoutUrlGenerator in async environments (KevinMartinsDev, nicolas-grekas) + * data #64602 [Form][Validator] Review Hungarian translations (antalaron) + * data #64626 [Form][Validator] Ukrainian translation review and update (VladyslavChernyshov) + * bug #64617 [Cache][DoctrineBridge][HttpFoundation][Lock][Messenger] Restore compat with DBAL 4.5 (nicolas-grekas) + * bug #63800 [FrameworkBundle] Detect env placeholders in resolved route parameter values (Amoifr) + * bug #64596 [EventSourceHttpClient] Prevent re-yielding of the first chunk after reconnect (nacorp) + * data #64597 Review Indonesian (id) translations (sawirricardo) + * data #64607 [Translation] Verify Tagalog (tl) validator strings and remove needs-… (Jerdon07) + * data #64578 [Form][Validator] Review Bulgarian (bg) translations (moynzzz) + * data #64564 Remove review state from Serbian translations (Trysha-rbrn) + * data #64565 Remove review state from Russian translations #64512 (centaur-vova) + * bug #64566 Harden __toString trampolines via __unserialize() (nicolas-grekas) + * bug #64561 [VarExporter] Fix exporting objects that cannot be instantiated empty (nicolas-grekas) + * bug #64557 [Translation] Create Crowdin files before uploading translations (MatTheCat) + * data #64550 [Validator] reviewed Polish translation units 143-145 (thunderer) + * data #64551 [Form] reviewed Polish translation unit 129 (thunderer) + * bug #64549 [TwigBridge] Reject __toString trampolines in TemplatedEmail::__unserialize() (nicolas-grekas) + * data #64544 [Validator] Review French (fr) translations for XML constraints (lacatoire) + * bug #64532 [HttpKernel] Restore null-on-invalid for nullable #[Autowire(service:)] controller args (ousamabenyounes, pokki-deploy) + * bug #64533 [Console] Render formatter tags in ChoiceQuestion default value (ousamabenyounes) + * data #64542 [Form][Validator] Update Spanish translations (ThiagoMirandaLiotto) + * data #64543 [Form][Validator] Review Croatian translations (HypeMC) + * data #64526 [Form][Validator] Review and correct Arabic translation (ayyoub-afwallah) + * bug #64475 [AssetMapper] Render an empty import map as a JSON object (ousamabenyounes) + * bug #64458 [Webhook] Fix Content-Type key in createRequest method (MarijnDoeve) + * bug #64468 [HttpFoundation] Add RFC6598 Shared Address Space to IpUtils::PRIVATE_SUBNETS (derflocki) + * bug #64452 [Translation] Copy domains metadata when moving messages to intl ones (MatTheCat) + * bug #64424 [Form] Translate TranslatableInterface label in violation messages (Amoifr) + * bug #64419 [HttpKernel][Security] Add allowed_classes => false to unserialize() in CacheWarmerAggregate, LoggerDataCollector, and HttpCache Store (XananasX7) + * data #64451 [Form] Add missing translation for invalid UUID (jmsche) + * data #64440 [Validator] fix sr-Latn validation messages and video constraint translations (Trysha-rbrn) + * data #64446 [Validator] Add translated messages for the XML constraint (nicolas-grekas) + * bug #64375 [Notifier] Send message to MS-Teams via Workflow (gassan) + * bug #64429 [Mailer] Fix inline images in MandrillApiTransport by using the Content-ID as image name (ibrambe) + * bug #64394 Fix XMLHttpRequest URL handling in toolbar JS (Mudassar Ali) + * bug #64376 [Translation] Fix XLIFF 2 catalog metadata (MatTheCat) + * bug #64386 [Dotenv] Don't truncate external env vars containing $ when referenced via ${...} indirection (nicolas-grekas) + * bug #64388 [Yaml] Fix parsing inline anchored values (nicolas-grekas) + * 6.4.41 (2026-05-27) * security #cve-2026-48761 [HtmlSanitizer] Sanitize URL attributes on , , - - - - {% endif %} -
-

HTML content

-
- {% if htmlBody %} -
-                                                {%- if message.htmlCharset() %}
-                                                    {{- htmlBody|convert_encoding('UTF-8', message.htmlCharset()) }}
-                                                {%- else %}
-                                                    {{- htmlBody }}
-                                                {%- endif -%}
-                                            
+ {% if attachment_body is null %} + (the file is not readable anymore) {% else %} -
-

The HTML body is empty.

-
+ ({{ _self.render_file_size_humanized(attachment_body|length) }}) + + Download {% endif %} -
+ + {% endfor %} + +
+ {% endif %} + +
+
+ {% if message.htmlBody is defined %} + {% set textBody = message.textBody %} + {% set htmlBody = message.htmlBody %} +
+

Text content

+
+ {% if textBody %} +
+                                            {%- if message.textCharset() %}
+                                                {{- textBody|convert_encoding('UTF-8', message.textCharset()) }}
+                                            {%- else %}
+                                                {{- textBody }}
+                                            {%- endif -%}
+                                        
+ {% else %} +
+

The text body is empty.

+
+ {% endif %}
- {% else %} - {% set body = message.body ? message.body.toString() : null %} -
-

Content

+
+ + {% if htmlBody %} +
+

HTML preview

- {% if body %} -
-                                                {{- body }}
-                                            
- {% else %} -
-

The body is empty.

-
- {% endif %} +

+                                        
{% endif %} + +
+

HTML content

+
+ {% if htmlBody %} +
+                                            {%- if message.htmlCharset() %}
+                                                {{- htmlBody|convert_encoding('UTF-8', message.htmlCharset()) }}
+                                            {%- else %}
+                                                {{- htmlBody }}
+                                            {%- endif -%}
+                                        
+ {% else %} +
+

The HTML body is empty.

+
+ {% endif %} +
+
+ {% else %} + {% set body = message.body ? profiler_mailer_as_string(message.body) : null %} +
+

Content

+
+ {% if body %} +
+                                            {{- body }}
+                                        
+ {% elseif message.body %} +
+

The body is not readable anymore.

+
+ {% else %} +
+

The body is empty.

+
+ {% endif %} +
+ {% endif %}
+ -
-

MIME parts

-
-
{{ message.body().asDebugString() }}
-
+
+

MIME parts

+
+
{{ message.body().asDebugString() }}
+
- + {% endif %} +{% endmacro %} - {% macro render_file_size_humanized(bytes) %} - {%- if bytes < 1000 -%} - {{- bytes ~ ' bytes' -}} - {%- elseif bytes < 1000 ** 2 -%} - {{- (bytes / 1000)|number_format(2) ~ ' kB' -}} - {%- else -%} - {{- (bytes / 1000 ** 2)|number_format(2) ~ ' MB' -}} - {%- endif -%} - {% endmacro %} -{% endblock %} +{% macro render_file_size_humanized(bytes) %} + {%- if bytes < 1000 -%} + {{- bytes ~ ' bytes' -}} + {%- elseif bytes < 1000 ** 2 -%} + {{- (bytes / 1000)|number_format(2) ~ ' kB' -}} + {%- else -%} + {{- (bytes / 1000 ** 2)|number_format(2) ~ ' MB' -}} + {%- endif -%} +{% endmacro %} diff -Nru symfony-6.4.41+dfsg/src/Symfony/Bundle/WebProfilerBundle/Resources/views/Collector/messenger.html.twig symfony-6.4.49+dfsg/src/Symfony/Bundle/WebProfilerBundle/Resources/views/Collector/messenger.html.twig --- symfony-6.4.41+dfsg/src/Symfony/Bundle/WebProfilerBundle/Resources/views/Collector/messenger.html.twig 2026-05-27 08:23:35.000000000 +0000 +++ symfony-6.4.49+dfsg/src/Symfony/Bundle/WebProfilerBundle/Resources/views/Collector/messenger.html.twig 2026-10-28 18:15:18.000000000 +0000 @@ -159,12 +159,14 @@ diff -Nru symfony-6.4.41+dfsg/src/Symfony/Bundle/WebProfilerBundle/Resources/views/Collector/request.html.twig symfony-6.4.49+dfsg/src/Symfony/Bundle/WebProfilerBundle/Resources/views/Collector/request.html.twig --- symfony-6.4.41+dfsg/src/Symfony/Bundle/WebProfilerBundle/Resources/views/Collector/request.html.twig 2026-05-27 08:23:35.000000000 +0000 +++ symfony-6.4.49+dfsg/src/Symfony/Bundle/WebProfilerBundle/Resources/views/Collector/request.html.twig 2026-10-28 18:15:18.000000000 +0000 @@ -271,7 +271,7 @@
-