Commit Graph

169 Commits

Author SHA1 Message Date
Andy Wilkinson 3becdc7d47 Move server.error properties to spring.web.error
Closes gh-48201
2025-11-20 11:55:23 +00:00
Phillip Webb d4b9786b8b Merge branch '3.5.x'
Closes gh-48177
2025-11-18 17:08:35 -08:00
Stefan Würsten 9ccec12506 Move mime-mappings.properties to spring-boot-web-server
This commit moves mime-mapping.properties in the module that actually
uses it, rather than in the top-level spring-boot module.

See gh-48138

Signed-off-by: Stefan Würsten <stefan@wuersten.ch>
2025-11-14 14:52:54 +01:00
Andy Wilkinson 8a52f4931b Merge branch '3.5.x'
Closes gh-48136
2025-11-14 09:10:21 +00:00
Stéphane Nicoll 097184c2e4 Merge branch '3.5.x'
Closes gh-48132
2025-11-14 09:55:46 +01:00
Andy Wilkinson 5281f5c6bc Merge branch '3.5.x'
The issue had already been fixed in 4.0 as part of the nullability
work. As such, this commit doesn't fix anything. It does, however,
merge forward a test and makes some stylistic changes to the code so
that it's aligned with the same code in 3.5.x and 3.4.x
2025-11-13 14:06:46 +00:00
Stéphane Nicoll 3d23261f87 Merge branch '3.5.x'
Closes gh-48122
2025-11-13 14:55:19 +01:00
Stéphane Nicoll d1e5fe3248 Merge branch '3.5.x'
Closes gh-48106
2025-11-13 10:31:25 +01:00
Stéphane Nicoll 73087f369b Merge branch '3.5.x'
Build and Deploy Snapshot / Build and Deploy Snapshot (push) Waiting to run Details
Build and Deploy Snapshot / Trigger Docs Build (push) Blocked by required conditions Details
Build and Deploy Snapshot / Verify (push) Blocked by required conditions Details
CI / ${{ matrix.os.name}} | Java ${{ matrix.java.version}} (map[toolchain:false version:25], map[id:${{ vars.UBUNTU_MEDIUM || 'ubuntu-latest' }} name:Linux]) (push) Waiting to run Details
CI / ${{ matrix.os.name}} | Java ${{ matrix.java.version}} (map[toolchain:false version:25], map[id:windows-latest name:Windows]) (push) Waiting to run Details
CI / ${{ matrix.os.name}} | Java ${{ matrix.java.version}} (map[toolchain:true version:17], map[id:${{ vars.UBUNTU_MEDIUM || 'ubuntu-latest' }} name:Linux]) (push) Waiting to run Details
CI / ${{ matrix.os.name}} | Java ${{ matrix.java.version}} (map[toolchain:true version:17], map[id:windows-latest name:Windows]) (push) Waiting to run Details
CI / ${{ matrix.os.name}} | Java ${{ matrix.java.version}} (map[toolchain:true version:21], map[id:${{ vars.UBUNTU_MEDIUM || 'ubuntu-latest' }} name:Linux]) (push) Waiting to run Details
CI / ${{ matrix.os.name}} | Java ${{ matrix.java.version}} (map[toolchain:true version:21], map[id:windows-latest name:Windows]) (push) Waiting to run Details
Run CodeQL Analysis / run-analysis (push) Waiting to run Details
Run System Tests / Java ${{ matrix.java.version}} (map[toolchain:true version:17]) (push) Waiting to run Details
Run System Tests / Java ${{ matrix.java.version}} (map[toolchain:true version:21]) (push) Waiting to run Details
Closes gh-48071
2025-11-12 13:08:31 +01:00
Stéphane Nicoll 8584f604e3 Rename maxAttempts to maxRetries
Closes gh-48023
2025-11-11 10:22:08 +00:00
Phillip Webb 6158a52b8c Support deprecated EnvironmentPostProcessor arguments
Fixes gh-48047
2025-11-10 15:51:53 -08:00
Andy Wilkinson ef46636c7e Tolerate Podman's response to docker context ls
In Spring Boot 3.x with Jackson 2, a null (or missing) value for
a primitive would be mapped to the primitive's default value. In
Jackson 3, the default behavior is to fail instead. This causes a
failure when trying to deserialize Podman's
`docker context ls response` as it is not in the expected format
and has no entry for `current` that's mapped to a boolean.

This commit disables FAIL_ON_NULL_FOR_PRIMITIVES to restore the
behavior that we had with Jackson 2 in Spring Boot 3.x.

Closes gh-47971
2025-11-06 09:19:47 +00:00
Phillip Webb 08857b4c7f Cache SystemEnvironmentPropertyMapper configuration property names
Build and Deploy Snapshot / Build and Deploy Snapshot (push) Waiting to run Details
Build and Deploy Snapshot / Trigger Docs Build (push) Blocked by required conditions Details
Build and Deploy Snapshot / Verify (push) Blocked by required conditions Details
CI / ${{ matrix.os.name}} | Java ${{ matrix.java.version}} (map[toolchain:false version:25], map[id:${{ vars.UBUNTU_MEDIUM || 'ubuntu-latest' }} name:Linux]) (push) Waiting to run Details
CI / ${{ matrix.os.name}} | Java ${{ matrix.java.version}} (map[toolchain:false version:25], map[id:windows-latest name:Windows]) (push) Waiting to run Details
CI / ${{ matrix.os.name}} | Java ${{ matrix.java.version}} (map[toolchain:true version:17], map[id:${{ vars.UBUNTU_MEDIUM || 'ubuntu-latest' }} name:Linux]) (push) Waiting to run Details
CI / ${{ matrix.os.name}} | Java ${{ matrix.java.version}} (map[toolchain:true version:17], map[id:windows-latest name:Windows]) (push) Waiting to run Details
CI / ${{ matrix.os.name}} | Java ${{ matrix.java.version}} (map[toolchain:true version:21], map[id:${{ vars.UBUNTU_MEDIUM || 'ubuntu-latest' }} name:Linux]) (push) Waiting to run Details
CI / ${{ matrix.os.name}} | Java ${{ matrix.java.version}} (map[toolchain:true version:21], map[id:windows-latest name:Windows]) (push) Waiting to run Details
Run CodeQL Analysis / run-analysis (push) Waiting to run Details
Run System Tests / Java ${{ matrix.java.version}} (map[toolchain:true version:17]) (push) Waiting to run Details
Run System Tests / Java ${{ matrix.java.version}} (map[toolchain:true version:21]) (push) Waiting to run Details
Add a static cache to `SystemEnvironmentPropertyMapper` for property
source name to configuration property name conversion. This update
should help ease object allocations for system environment names which
are unlikely to change often.

Closes gh-14121
2025-11-05 14:30:31 -08:00
Stéphane Nicoll a3ba9e3bf4 Merge branch '3.5.x'
Build and Deploy Snapshot / Build and Deploy Snapshot (push) Waiting to run Details
Build and Deploy Snapshot / Trigger Docs Build (push) Blocked by required conditions Details
Build and Deploy Snapshot / Verify (push) Blocked by required conditions Details
CI / ${{ matrix.os.name}} | Java ${{ matrix.java.version}} (map[toolchain:false version:25], map[id:${{ vars.UBUNTU_MEDIUM || 'ubuntu-latest' }} name:Linux]) (push) Waiting to run Details
CI / ${{ matrix.os.name}} | Java ${{ matrix.java.version}} (map[toolchain:false version:25], map[id:windows-latest name:Windows]) (push) Waiting to run Details
CI / ${{ matrix.os.name}} | Java ${{ matrix.java.version}} (map[toolchain:true version:17], map[id:${{ vars.UBUNTU_MEDIUM || 'ubuntu-latest' }} name:Linux]) (push) Waiting to run Details
CI / ${{ matrix.os.name}} | Java ${{ matrix.java.version}} (map[toolchain:true version:17], map[id:windows-latest name:Windows]) (push) Waiting to run Details
CI / ${{ matrix.os.name}} | Java ${{ matrix.java.version}} (map[toolchain:true version:21], map[id:${{ vars.UBUNTU_MEDIUM || 'ubuntu-latest' }} name:Linux]) (push) Waiting to run Details
CI / ${{ matrix.os.name}} | Java ${{ matrix.java.version}} (map[toolchain:true version:21], map[id:windows-latest name:Windows]) (push) Waiting to run Details
Run CodeQL Analysis / run-analysis (push) Waiting to run Details
Run System Tests / Java ${{ matrix.java.version}} (map[toolchain:true version:17]) (push) Waiting to run Details
Run System Tests / Java ${{ matrix.java.version}} (map[toolchain:true version:21]) (push) Waiting to run Details
Closes gh-47906
2025-11-02 10:58:26 +01:00
Phillip Webb 0f3631b7cc Merge branch '3.5.x'
Closes gh-47899
2025-10-31 09:25:55 -07:00
Stéphane Nicoll b0e2f2c770 Configure application task executor with custom AsyncConfigurer
Previously, any user that defines an AsyncConfigurer should provide
the async executor as well, given that our auto-configuration no longer
defines a "taskExecutor" bean.

This commit extends our auto-configuration of async processing to
use the "applicationTaskExecutor" bean name transparently if a user
has configured an AsyncConfigurer, but did not override the
getAsyncExecutor method.

Closes gh-47897
2025-10-31 17:16:49 +01:00
Stéphane Nicoll f11e3f3877 Adapt to new GraalVM metadata format
This commit updates our web resources patterns due to a change in the
GraalVM metadata format. Previously a single `*` was considering a
directory and its sub-folders. The same behavior now requires two `*`.

Closes gh-47894
2025-10-31 12:28:01 +01:00
Stéphane Nicoll 30a6b50e82 Align naming change for Jackson components
This commit polishes the renaming of JsonComponent to JacksonComponent
and the use of JacksonModule instead of Module in Jackson 2.

This also adds integration tests that use a JacksonComponent with
WebMvcTest and WebFluxTest.

Closes gh-47864
2025-10-29 16:58:16 +01:00
Andy Wilkinson 578b199b6d Merge branch '3.5.x'
Closes gh-47860
2025-10-29 10:25:10 +00:00
Stéphane Nicoll 7bde0e65f1 Fix typos
Build and Deploy Snapshot / Build and Deploy Snapshot (push) Waiting to run Details
Build and Deploy Snapshot / Trigger Docs Build (push) Blocked by required conditions Details
Build and Deploy Snapshot / Verify (push) Blocked by required conditions Details
CI / ${{ matrix.os.name}} | Java ${{ matrix.java.version}} (map[toolchain:false version:25], map[id:${{ vars.UBUNTU_MEDIUM || 'ubuntu-latest' }} name:Linux]) (push) Waiting to run Details
CI / ${{ matrix.os.name}} | Java ${{ matrix.java.version}} (map[toolchain:false version:25], map[id:windows-latest name:Windows]) (push) Waiting to run Details
CI / ${{ matrix.os.name}} | Java ${{ matrix.java.version}} (map[toolchain:true version:17], map[id:${{ vars.UBUNTU_MEDIUM || 'ubuntu-latest' }} name:Linux]) (push) Waiting to run Details
CI / ${{ matrix.os.name}} | Java ${{ matrix.java.version}} (map[toolchain:true version:17], map[id:windows-latest name:Windows]) (push) Waiting to run Details
CI / ${{ matrix.os.name}} | Java ${{ matrix.java.version}} (map[toolchain:true version:21], map[id:${{ vars.UBUNTU_MEDIUM || 'ubuntu-latest' }} name:Linux]) (push) Waiting to run Details
CI / ${{ matrix.os.name}} | Java ${{ matrix.java.version}} (map[toolchain:true version:21], map[id:windows-latest name:Windows]) (push) Waiting to run Details
Run CodeQL Analysis / run-analysis (push) Waiting to run Details
Run System Tests / Java ${{ matrix.java.version}} (map[toolchain:true version:17]) (push) Waiting to run Details
Run System Tests / Java ${{ matrix.java.version}} (map[toolchain:true version:21]) (push) Waiting to run Details
Closes gh-47818
2025-10-27 14:55:39 +01:00
Stéphane Nicoll 87acda775d Merge branch '3.5.x'
Closes gh-47783
2025-10-24 09:22:53 +02:00
Stéphane Nicoll 728cb95a17 Fix formatting 2025-10-23 14:12:50 +02:00
Andy Wilkinson aa95282290 Polish `@since` tags
Closes gh-47779
2025-10-23 12:48:58 +01:00
Andy Wilkinson f5dbd8550f Stop Log4j2 configuration to hopefully close the log file
Build and Deploy Snapshot / Build and Deploy Snapshot (push) Waiting to run Details
Build and Deploy Snapshot / Trigger Docs Build (push) Blocked by required conditions Details
Build and Deploy Snapshot / Verify (push) Blocked by required conditions Details
CI / ${{ matrix.os.name}} | Java ${{ matrix.java.version}} (map[toolchain:false version:25], map[id:${{ vars.UBUNTU_MEDIUM || 'ubuntu-latest' }} name:Linux]) (push) Waiting to run Details
CI / ${{ matrix.os.name}} | Java ${{ matrix.java.version}} (map[toolchain:false version:25], map[id:windows-latest name:Windows]) (push) Waiting to run Details
CI / ${{ matrix.os.name}} | Java ${{ matrix.java.version}} (map[toolchain:true version:17], map[id:${{ vars.UBUNTU_MEDIUM || 'ubuntu-latest' }} name:Linux]) (push) Waiting to run Details
CI / ${{ matrix.os.name}} | Java ${{ matrix.java.version}} (map[toolchain:true version:17], map[id:windows-latest name:Windows]) (push) Waiting to run Details
CI / ${{ matrix.os.name}} | Java ${{ matrix.java.version}} (map[toolchain:true version:21], map[id:${{ vars.UBUNTU_MEDIUM || 'ubuntu-latest' }} name:Linux]) (push) Waiting to run Details
CI / ${{ matrix.os.name}} | Java ${{ matrix.java.version}} (map[toolchain:true version:21], map[id:windows-latest name:Windows]) (push) Waiting to run Details
Run CodeQL Analysis / run-analysis (push) Waiting to run Details
Run System Tests / Java ${{ matrix.java.version}} (map[toolchain:true version:17]) (push) Waiting to run Details
Run System Tests / Java ${{ matrix.java.version}} (map[toolchain:true version:21]) (push) Waiting to run Details
See gh-47424
2025-10-23 12:06:43 +01:00
Andy Wilkinson 2c563004d5 Clean up logging system properties to avoid test pollution
See gh-47424
2025-10-23 11:04:01 +01:00
Andy Wilkinson a120ed4383 Stop logger context so that file handlers are not leaked
See gh-47424
2025-10-23 11:04:01 +01:00
Stéphane Nicoll ffc822d852 Revisit metrics and tracing test properties
This commit renames 'spring.test.metrics.auto-configure' and
'spring.test.tracing.auto-configure' for consistency with the non-test
properties. It also adds a configuration metadata entry for
'spring.test.observability.auto-configure' that's superseded by these
two properties.

Closes gh-47776
2025-10-23 11:18:53 +02:00
Phillip Webb 1a8402e938 Polish 'Simplify Log4J2LoggingSystem'
See gh-47424
2025-10-22 23:46:21 -07:00
Piotr P. Karwasz 7d34320401 Simplify Log4J2LoggingSystem
Streamline and harden `Log4J2LoggingSystem` by delegating more
functionality. The commit makes updates in two key areas:

Previously, each method fetched the `LoggerContext` directly from
`LogManager` and cast it to `....core.LoggerContext`. This approach
has several issues:

* ClassCastException risks:
  - When Log4j Core is on the classpath but not the active implementation
    (e.g. when `log4j-to-slf4j` is used).
  - During shutdown, when `LogManager` may return a `SimpleLoggerContext`
    (see spring-projects/spring-boot#26953).

* Unexpected reinitialization:
  - If the logger context had already been stopped, `Log4J2LoggingSystem`
    would trigger creation of a new context, even mid-shutdown.

Configuration file detection was previously hardcoded in
`Log4J2LoggingSystem`, which limited flexibility:

* Harder to support additional configuration formats.

* Coupled Spring Boot to internal Log4j Core classes such as
  `AuthorizationProvider`.

This change now delegates configuration resolution to Log4j. This reduces
reliance on internal APIs and allows Log4j Core to handle configuration
formats and factories more naturally.

Signed-off-by: Piotr P. Karwasz <piotr@github.copernik.eu>

See gh-47424
2025-10-22 23:41:11 -07:00
Varun Patni f84b17c751 Migrate from Dokkatoo to Dokka
This commit migrates from Dokkatoo to Dokka for generation of Kotlin
API documentation.

See gh-47706

Signed-off-by: Varun Patni <varun.patni1@gmail.com>
2025-10-22 15:50:29 +01:00
Phillip Webb 739cb529fb Merge branch '3.5.x'
Closes gh-47749
2025-10-21 11:30:56 -07:00
Phillip Webb 2210252c75 Drop @TestAutoConfiguration annotation
Closes gh-47746
2025-10-21 11:18:01 -07:00
Stéphane Nicoll aceaee89ee Polish "Replace `BaseUrl` with `LocalTestWebServer`"
See gh-47680
2025-10-21 11:08:48 +02:00
Phillip Webb 41a399c5ae Replace `BaseUrl` with `LocalTestWebServer`
Replace `BaseUrl` and `BaseUrlProvider` provider code with a more
targeted `LocalTestWebServer` class.

The `LocalTestWebServer` can be used to obtain the url of the locally
running server, or provide `UriBuilderFactory` or `UriBuilder`
instances base on it.

This commit also updates the MockMVC HTML Unit auto-configuration to
directly use `localhost` as the base URL.

Closes gh-47680
2025-10-20 17:44:51 -07:00
Stéphane Nicoll dfb4213f33 Stop using LoggerContext#start
Closes gh-46035
2025-10-20 14:58:44 +02:00
Stéphane Nicoll f1b1183098 Polish "Use JsonMapper instead of ObjectMapper where feasible"
See gh-47503
2025-10-20 13:21:47 +02:00
Yanming Zhou 609b0b444e Use JsonMapper instead of ObjectMapper where feasible
See gh-47503

Signed-off-by: Yanming Zhou <zhouyanming@gmail.com>
2025-10-20 13:16:52 +02:00
Phillip Webb 069809505e Drop SharedMetadataReaderFactoryContextInitializer
Build and Deploy Snapshot / Build and Deploy Snapshot (push) Waiting to run Details
Build and Deploy Snapshot / Trigger Docs Build (push) Blocked by required conditions Details
Build and Deploy Snapshot / Verify (push) Blocked by required conditions Details
CI / ${{ matrix.os.name}} | Java ${{ matrix.java.version}} (map[toolchain:false version:25], map[id:${{ vars.UBUNTU_MEDIUM || 'ubuntu-latest' }} name:Linux]) (push) Waiting to run Details
CI / ${{ matrix.os.name}} | Java ${{ matrix.java.version}} (map[toolchain:false version:25], map[id:windows-latest name:Windows]) (push) Waiting to run Details
CI / ${{ matrix.os.name}} | Java ${{ matrix.java.version}} (map[toolchain:true version:17], map[id:${{ vars.UBUNTU_MEDIUM || 'ubuntu-latest' }} name:Linux]) (push) Waiting to run Details
CI / ${{ matrix.os.name}} | Java ${{ matrix.java.version}} (map[toolchain:true version:17], map[id:windows-latest name:Windows]) (push) Waiting to run Details
CI / ${{ matrix.os.name}} | Java ${{ matrix.java.version}} (map[toolchain:true version:21], map[id:${{ vars.UBUNTU_MEDIUM || 'ubuntu-latest' }} name:Linux]) (push) Waiting to run Details
CI / ${{ matrix.os.name}} | Java ${{ matrix.java.version}} (map[toolchain:true version:21], map[id:windows-latest name:Windows]) (push) Waiting to run Details
Run CodeQL Analysis / run-analysis (push) Waiting to run Details
Run System Tests / Java ${{ matrix.java.version}} (map[toolchain:true version:17]) (push) Waiting to run Details
Run System Tests / Java ${{ matrix.java.version}} (map[toolchain:true version:21]) (push) Waiting to run Details
Closes gh-47687
2025-10-17 19:46:42 -07:00
Phillip Webb 77f207a079 Simplify BaseUrl code and cache resolved URLs
See gh-47680
2025-10-17 19:28:18 -07:00
Phillip Webb 50a73b8dfe Add Jackson2Tester support
See gh-47688
2025-10-17 13:17:22 -07:00
Eddú Meléndez 7f64615690 Upgrade to Testcontainers 2.0.1
* Update dependencies name
  Modules are prefixed with `testcontainers-`
* Update container classes
  Container classes are under `org.testcontainers.<module-name>` package

See gh-47664

Signed-off-by: Eddú Meléndez <eddu.melendez@gmail.com>
2025-10-17 17:11:24 +02:00
Stéphane Nicoll 46a3c95a5c Apply BaseUrl consistently
This commit updates BaseUrlBuilderFactory to reuse features of the
Spring Framework to handle the base URL rather than duplicating it.

As a result, BaseUrl no longer resolves anything but rather provide
a standard component that is able to resolve the URI if needed.

Closes gh-47674
2025-10-17 16:35:06 +02:00
Stéphane Nicoll 998a2fa7b4 Fix configuration of HttpGraphQlTester with a running server
This commit restores the user of HttpGraphQlTester when it is configured
against a running server. The logic that appends the graphQl path to
the HTTP url was lost while refactoring the HTTP clients infrastructure.

To work against the new API, BaseUrl has been updated to provide the
ability to append a path to its URL

Closes gh-47659
2025-10-17 16:35:06 +02:00
Andy Wilkinson b88551a198 Remove Spock integration until it supports Groovy 5
Closes gh-47650
2025-10-16 15:27:35 +01:00
Andy Wilkinson 55e7c83498 Allow modules to contribute to Devtools' default properties
Closes gh-44792
2025-10-15 20:19:02 +01:00
Moritz Halbritter 57532c62be Fix tests regarding Native Image baseline on JDKs < 25
Build and Deploy Snapshot / Build and Deploy Snapshot (push) Waiting to run Details
Build and Deploy Snapshot / Trigger Docs Build (push) Blocked by required conditions Details
Build and Deploy Snapshot / Verify (push) Blocked by required conditions Details
CI / ${{ matrix.os.name}} | Java ${{ matrix.java.version}} (map[toolchain:false version:25], map[id:${{ vars.UBUNTU_MEDIUM || 'ubuntu-latest' }} name:Linux]) (push) Waiting to run Details
CI / ${{ matrix.os.name}} | Java ${{ matrix.java.version}} (map[toolchain:false version:25], map[id:windows-latest name:Windows]) (push) Waiting to run Details
CI / ${{ matrix.os.name}} | Java ${{ matrix.java.version}} (map[toolchain:true version:17], map[id:${{ vars.UBUNTU_MEDIUM || 'ubuntu-latest' }} name:Linux]) (push) Waiting to run Details
CI / ${{ matrix.os.name}} | Java ${{ matrix.java.version}} (map[toolchain:true version:17], map[id:windows-latest name:Windows]) (push) Waiting to run Details
CI / ${{ matrix.os.name}} | Java ${{ matrix.java.version}} (map[toolchain:true version:21], map[id:${{ vars.UBUNTU_MEDIUM || 'ubuntu-latest' }} name:Linux]) (push) Waiting to run Details
CI / ${{ matrix.os.name}} | Java ${{ matrix.java.version}} (map[toolchain:true version:21], map[id:windows-latest name:Windows]) (push) Waiting to run Details
Run CodeQL Analysis / run-analysis (push) Waiting to run Details
Run System Tests / Java ${{ matrix.java.version}} (map[toolchain:true version:17]) (push) Waiting to run Details
Run System Tests / Java ${{ matrix.java.version}} (map[toolchain:true version:21]) (push) Waiting to run Details
See gh-47433
2025-10-15 12:17:37 +02:00
Moritz Halbritter e1f9116684 Raise GraalVM baseline to 25
This also removes the 'requiredVersion' setting from the
native-maven-plugin configuration, as this is deprecated in the native
build tools.

Close gh-47433
2025-10-15 09:59:03 +02:00
Dmytro Nosan bc2ca5b9fc Extend ArchitectureCheck with NullMarkedExtension
Introduce NullMarkedExtension for ArchitectureCheck, which provides
functionality to configure packages to ignore in nullability checks and
to enable or disable the extension.

See gh-47596

Signed-off-by: Dmytro Nosan <dimanosan@gmail.com>
2025-10-15 08:23:47 +02:00
Vedran Pavic c6397305bb Add AWS ECS to cloud platforms
This commit adds support for detecting AWS ECS to `CloudPlatform`. The
detection is based on presence of `AWS_EXECUTION_ENV` environment
variable with value starting with `AWS_ECS`.

See gh-47482

Signed-off-by: Vedran Pavic <vedran@vedranpavic.com>
2025-10-15 08:15:29 +02:00
Phillip Webb 5ce1438be6 Merge branch '3.5.x' 2025-10-14 14:20:22 -07:00