diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 5df26b9fa43..144f6c06635 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -36,6 +36,7 @@ jobs: include: - {php-version: "8.2"} # Lint on lower PHP version to detected too early usage of new syntaxes - {php-version: "8.3"} # Lint on higher PHP version to detected deprecated elements usage + - {php-version: "8.4-rc"} env: COMPOSE_FILE: ".github/actions/docker-compose-app.yml" APPLICATION_ROOT: "${{ github.workspace }}" @@ -73,9 +74,11 @@ jobs: run: | .github/actions/init_show-versions.sh - name: "Force used PHP version" + # Strip the stability suffix (e.g. "8.4-rc" -> "php:>=8.4") run: | + REQUIRED_PHP_VERSION="$(echo "${{ matrix.php-version }}" | cut -d '-' -f 1)" docker compose exec -T app composer config --unset platform.php - docker compose exec -T app composer require "php:>=${{ matrix.php-version }}" --ignore-platform-req=php+ --no-install --no-scripts + docker compose exec -T app composer require "php:>=$REQUIRED_PHP_VERSION" --ignore-platform-req=php+ --no-install --no-scripts - name: "Build dependencies / translations" run: | docker compose exec -T app .github/actions/init_build.sh @@ -115,6 +118,7 @@ jobs: MATRIX=' { "include": [ + {"php-version": "8.4-rc", "db-image": "mariadb:11.4"}, {"php-version": "8.3", "db-image": "mariadb:11.4"}, {"php-version": "8.3", "db-image": "mysql:8.4"}, {"php-version": "8.2", "db-image": "mariadb:11.4"}, @@ -127,6 +131,7 @@ jobs: MATRIX=' { "include": [ + {"php-version": "8.4-rc", "db-image": "mariadb:11.4"}, {"php-version": "8.3", "db-image": "mariadb:11.4"}, {"php-version": "8.3", "db-image": "mysql:8.4"} ] diff --git a/composer.json b/composer.json index d853eb43744..e93204d3d35 100644 --- a/composer.json +++ b/composer.json @@ -51,7 +51,7 @@ "league/oauth2-server": "^9.0", "mexitek/phpcolors": "^1.0", "monolog/monolog": "^3.7", - "paragonie/sodium_compat": "^2.0", + "paragonie/sodium_compat": "^2.1", "phpdocumentor/reflection-docblock": "^5.4", "phpoffice/phpspreadsheet": "^2.2", "psr/cache": "^3.0", @@ -99,8 +99,8 @@ }, "require-dev": { "ext-xml": "*", - "atoum/atoum": "^4.2", - "atoum/stubs": "^2.6", + "atoum/atoum": "dev-main#e43a6a84809635cf5dcdf80bf3c773e7cf1d5a04", + "atoum/stubs": "dev-master#fb8890f347a7ecf1e3cf2b5a139a8b038359a6ab", "friendsoftwig/twigcs": "^6.4", "glpi-project/tools": "^0.7", "mikey179/vfsstream": "^1.6", @@ -182,19 +182,31 @@ "post-install-cmd": [ "@php -r \"file_put_contents('.composer.hash', sha1_file('composer.lock'));\"", "@php -f vendor/bin/build_hw_jsons", - "patch -f -p1 -d vendor/laminas/laminas-mail/ < tools/patches/laminas-mail-invalid-header-ignore.patch || true", - "patch -f -p1 -d vendor/laminas/laminas-mail/ < tools/patches/laminas-mail-address-no-length-check.patch || true", - "patch -f -p1 -d vendor/guzzlehttp/guzzle/ < tools/patches/guzzle-http-client-restrict-http-methods.patch || true" + "@patch" ], "post-update-cmd": [ "@php -r \"file_put_contents('.composer.hash', sha1_file('composer.lock'));\"", "@php -f vendor/bin/build_hw_jsons", - "patch -f -p1 -d vendor/laminas/laminas-mail/ < tools/patches/laminas-mail-invalid-header-ignore.patch || true", - "patch -f -p1 -d vendor/laminas/laminas-mail/ < tools/patches/laminas-mail-address-no-length-check.patch || true", - "patch -f -p1 -d vendor/guzzlehttp/guzzle/ < tools/patches/guzzle-http-client-restrict-http-methods.patch || true" + "@patch" ], "build": [ "bin/console dependencies install && bin/console locales:compile" + ], + "patch": [ + "patch -f -p1 -d vendor/laminas/laminas-mail/ < tools/patches/laminas-mail-invalid-header-ignore.patch || true", + "patch -f -p1 -d vendor/laminas/laminas-mail/ < tools/patches/laminas-mail-address-no-length-check.patch || true", + "patch -f -p1 -d vendor/guzzlehttp/guzzle/ < tools/patches/guzzle-http-client-restrict-http-methods.patch || true", + "patch -f -p1 -d vendor/apereo/phpcas/ < tools/patches/apereo-phpcas-php84.patch || true", + "patch -f -p1 -d vendor/friendsoftwig/twigcs/ < tools/patches/friendsoftwig-twigcs-php84.patch || true", + "patch -f -p1 -d vendor/league/event/ < tools/patches/league-event-php84.patch || true", + "patch -f -p1 -d vendor/league/oauth2-client/ < tools/patches/league-oauth2-client-php84.patch || true", + "patch -f -p1 -d vendor/league/oauth2-server/ < tools/patches/league-oauth2-server-php84.patch || true", + "patch -f -p1 -d vendor/sabre/dav/ < tools/patches/sabre-dav-php84.patch || true", + "patch -f -p1 -d vendor/sabre/vobject/ < tools/patches/sabre-vobject-php84.patch || true", + "patch -f -p1 -d vendor/swaggest/json-diff/ < tools/patches/swaggest-json-diff-php84.patch || true", + "patch -f -p1 -d vendor/swaggest/json-schema/ < tools/patches/swaggest-json-schema-php84.patch || true", + "patch -f -p1 -d vendor/symfony/cache/ < tools/patches/symfony-cache-php84.patch || true", + "patch -f -p1 -d vendor/wapmorgan/unified-archive/ < tools/patches/wapmorgan-unified-archive-php84.patch || true" ] } } diff --git a/composer.lock b/composer.lock index b8dad9b3bd2..cd45a451a67 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "2a1aacb3c8502970d63d335812826ee9", + "content-hash": "ba5fe16a1e13039f3bb864ab9390cf03", "packages": [ { "name": "apereo/phpcas", @@ -3403,16 +3403,16 @@ }, { "name": "paragonie/sodium_compat", - "version": "v2.0.1", + "version": "v2.1.0", "source": { "type": "git", "url": "https://github.com/paragonie/sodium_compat.git", - "reference": "f65c82939ab17aeff538f9bf6d582f65cc7f255e" + "reference": "a673d5f310477027cead2e2f2b6db5d8368157cb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/paragonie/sodium_compat/zipball/f65c82939ab17aeff538f9bf6d582f65cc7f255e", - "reference": "f65c82939ab17aeff538f9bf6d582f65cc7f255e", + "url": "https://api.github.com/repos/paragonie/sodium_compat/zipball/a673d5f310477027cead2e2f2b6db5d8368157cb", + "reference": "a673d5f310477027cead2e2f2b6db5d8368157cb", "shasum": "" }, "require": { @@ -3427,6 +3427,11 @@ "ext-sodium": "Better performance, password hashing (Argon2i), secure memory management (memzero), and better security." }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, "autoload": { "files": [ "autoload.php" @@ -3483,9 +3488,9 @@ ], "support": { "issues": "https://github.com/paragonie/sodium_compat/issues", - "source": "https://github.com/paragonie/sodium_compat/tree/v2.0.1" + "source": "https://github.com/paragonie/sodium_compat/tree/v2.1.0" }, - "time": "2024-04-24T12:06:31+00:00" + "time": "2024-09-04T12:51:01+00:00" }, { "name": "phpdocumentor/reflection-common", @@ -4870,25 +4875,25 @@ }, { "name": "sabre/event", - "version": "5.1.4", + "version": "5.1.7", "source": { "type": "git", "url": "https://github.com/sabre-io/event.git", - "reference": "d7da22897125d34d7eddf7977758191c06a74497" + "reference": "86d57e305c272898ba3c28e9bd3d65d5464587c2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sabre-io/event/zipball/d7da22897125d34d7eddf7977758191c06a74497", - "reference": "d7da22897125d34d7eddf7977758191c06a74497", + "url": "https://api.github.com/repos/sabre-io/event/zipball/86d57e305c272898ba3c28e9bd3d65d5464587c2", + "reference": "86d57e305c272898ba3c28e9bd3d65d5464587c2", "shasum": "" }, "require": { "php": "^7.1 || ^8.0" }, "require-dev": { - "friendsofphp/php-cs-fixer": "~2.17.1", + "friendsofphp/php-cs-fixer": "~2.17.1||^3.63", "phpstan/phpstan": "^0.12", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.0" + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.6" }, "type": "library", "autoload": { @@ -4932,20 +4937,20 @@ "issues": "https://github.com/sabre-io/event/issues", "source": "https://github.com/fruux/sabre-event" }, - "time": "2021-11-04T06:51:17+00:00" + "time": "2024-08-27T11:23:05+00:00" }, { "name": "sabre/http", - "version": "5.1.10", + "version": "5.1.12", "source": { "type": "git", "url": "https://github.com/sabre-io/http.git", - "reference": "f9f3d1fba8916fa2f4ec25636c4fedc26cb94e02" + "reference": "dedff73f3995578bc942fa4c8484190cac14f139" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sabre-io/http/zipball/f9f3d1fba8916fa2f4ec25636c4fedc26cb94e02", - "reference": "f9f3d1fba8916fa2f4ec25636c4fedc26cb94e02", + "url": "https://api.github.com/repos/sabre-io/http/zipball/dedff73f3995578bc942fa4c8484190cac14f139", + "reference": "dedff73f3995578bc942fa4c8484190cac14f139", "shasum": "" }, "require": { @@ -4957,9 +4962,9 @@ "sabre/uri": "^2.0" }, "require-dev": { - "friendsofphp/php-cs-fixer": "~2.17.1", + "friendsofphp/php-cs-fixer": "~2.17.1||^3.63", "phpstan/phpstan": "^0.12", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.0" + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.6" }, "suggest": { "ext-curl": " to make http requests with the Client class" @@ -4995,31 +5000,31 @@ "issues": "https://github.com/sabre-io/http/issues", "source": "https://github.com/fruux/sabre-http" }, - "time": "2023-08-18T01:55:28+00:00" + "time": "2024-08-27T16:07:41+00:00" }, { "name": "sabre/uri", - "version": "2.3.3", + "version": "2.3.4", "source": { "type": "git", "url": "https://github.com/sabre-io/uri.git", - "reference": "7e0e7dfd0b7e14346a27eabd66e843a6e7f1812b" + "reference": "b76524c22de90d80ca73143680a8e77b1266c291" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sabre-io/uri/zipball/7e0e7dfd0b7e14346a27eabd66e843a6e7f1812b", - "reference": "7e0e7dfd0b7e14346a27eabd66e843a6e7f1812b", + "url": "https://api.github.com/repos/sabre-io/uri/zipball/b76524c22de90d80ca73143680a8e77b1266c291", + "reference": "b76524c22de90d80ca73143680a8e77b1266c291", "shasum": "" }, "require": { "php": "^7.4 || ^8.0" }, "require-dev": { - "friendsofphp/php-cs-fixer": "^3.17", - "phpstan/extension-installer": "^1.3", - "phpstan/phpstan": "^1.10", - "phpstan/phpstan-phpunit": "^1.3", - "phpstan/phpstan-strict-rules": "^1.5", + "friendsofphp/php-cs-fixer": "^3.63", + "phpstan/extension-installer": "^1.4", + "phpstan/phpstan": "^1.12", + "phpstan/phpstan-phpunit": "^1.4", + "phpstan/phpstan-strict-rules": "^1.6", "phpunit/phpunit": "^9.6" }, "type": "library", @@ -5055,7 +5060,7 @@ "issues": "https://github.com/sabre-io/uri/issues", "source": "https://github.com/fruux/sabre-uri" }, - "time": "2023-06-09T06:54:04+00:00" + "time": "2024-08-27T12:18:16+00:00" }, { "name": "sabre/vobject", @@ -5163,16 +5168,16 @@ }, { "name": "sabre/xml", - "version": "2.2.9", + "version": "2.2.10", "source": { "type": "git", "url": "https://github.com/sabre-io/xml.git", - "reference": "88288712d45f694be3679a0db7dfb3770f08d4f0" + "reference": "0734b7af7f045d9ffb0018929750c492698a1536" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sabre-io/xml/zipball/88288712d45f694be3679a0db7dfb3770f08d4f0", - "reference": "88288712d45f694be3679a0db7dfb3770f08d4f0", + "url": "https://api.github.com/repos/sabre-io/xml/zipball/0734b7af7f045d9ffb0018929750c492698a1536", + "reference": "0734b7af7f045d9ffb0018929750c492698a1536", "shasum": "" }, "require": { @@ -5184,7 +5189,7 @@ "sabre/uri": ">=1.0,<3.0.0" }, "require-dev": { - "friendsofphp/php-cs-fixer": "~2.17.1", + "friendsofphp/php-cs-fixer": "~2.17.1||^3.63", "phpstan/phpstan": "^0.12", "phpunit/phpunit": "^7.5 || ^8.5 || ^9.6" }, @@ -5228,7 +5233,7 @@ "issues": "https://github.com/sabre-io/xml/issues", "source": "https://github.com/fruux/sabre-xml" }, - "time": "2024-07-26T12:32:40+00:00" + "time": "2024-08-27T15:55:05+00:00" }, { "name": "scssphp/scssphp", @@ -8899,16 +8904,16 @@ "packages-dev": [ { "name": "atoum/atoum", - "version": "4.2.0", + "version": "dev-main", "source": { "type": "git", "url": "https://github.com/atoum/atoum.git", - "reference": "fd9a339de252ea774ab755b3fd25dd19be2dbefb" + "reference": "e43a6a84809635cf5dcdf80bf3c773e7cf1d5a04" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/atoum/atoum/zipball/fd9a339de252ea774ab755b3fd25dd19be2dbefb", - "reference": "fd9a339de252ea774ab755b3fd25dd19be2dbefb", + "url": "https://api.github.com/repos/atoum/atoum/zipball/e43a6a84809635cf5dcdf80bf3c773e7cf1d5a04", + "reference": "e43a6a84809635cf5dcdf80bf3c773e7cf1d5a04", "shasum": "" }, "require": { @@ -8929,6 +8934,7 @@ "ext-mbstring": "Provides support for UTF-8 strings", "ext-xdebug": "Provides code coverage report (>= 2.3)" }, + "default-branch": true, "bin": [ "bin/atoum" ], @@ -8980,27 +8986,28 @@ ], "support": { "issues": "https://github.com/atoum/atoum/issues", - "source": "https://github.com/atoum/atoum/tree/4.2.0" + "source": "https://github.com/atoum/atoum/tree/main" }, - "time": "2023-07-30T12:52:23+00:00" + "time": "2024-07-31T12:02:10+00:00" }, { "name": "atoum/stubs", - "version": "2.6.0", + "version": "dev-master", "source": { "type": "git", "url": "https://github.com/atoum/stubs.git", - "reference": "df8b73b0358de7283ecba91d8f4a9683f583993d" + "reference": "fb8890f347a7ecf1e3cf2b5a139a8b038359a6ab" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/atoum/stubs/zipball/df8b73b0358de7283ecba91d8f4a9683f583993d", - "reference": "df8b73b0358de7283ecba91d8f4a9683f583993d", + "url": "https://api.github.com/repos/atoum/stubs/zipball/fb8890f347a7ecf1e3cf2b5a139a8b038359a6ab", + "reference": "fb8890f347a7ecf1e3cf2b5a139a8b038359a6ab", "shasum": "" }, "suggest": { "atoum/atoum": "Include atoum in your projet dependencies" }, + "default-branch": true, "type": "library", "extra": { "branch-alias": { @@ -9033,7 +9040,7 @@ "issues": "https://github.com/atoum/stubs/issues", "source": "https://github.com/atoum/stubs/tree/master" }, - "time": "2018-01-29T22:41:37+00:00" + "time": "2024-07-30T18:02:37+00:00" }, { "name": "friendsoftwig/twigcs", @@ -9650,32 +9657,32 @@ }, { "name": "phpunit/php-code-coverage", - "version": "11.0.5", + "version": "11.0.6", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "19b6365ab8b59a64438c0c3f4241feeb480c9861" + "reference": "ebdffc9e09585dafa71b9bffcdb0a229d4704c45" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/19b6365ab8b59a64438c0c3f4241feeb480c9861", - "reference": "19b6365ab8b59a64438c0c3f4241feeb480c9861", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/ebdffc9e09585dafa71b9bffcdb0a229d4704c45", + "reference": "ebdffc9e09585dafa71b9bffcdb0a229d4704c45", "shasum": "" }, "require": { "ext-dom": "*", "ext-libxml": "*", "ext-xmlwriter": "*", - "nikic/php-parser": "^5.0", + "nikic/php-parser": "^5.1.0", "php": ">=8.2", - "phpunit/php-file-iterator": "^5.0", - "phpunit/php-text-template": "^4.0", - "sebastian/code-unit-reverse-lookup": "^4.0", - "sebastian/complexity": "^4.0", - "sebastian/environment": "^7.0", - "sebastian/lines-of-code": "^3.0", - "sebastian/version": "^5.0", - "theseer/tokenizer": "^1.2.0" + "phpunit/php-file-iterator": "^5.0.1", + "phpunit/php-text-template": "^4.0.1", + "sebastian/code-unit-reverse-lookup": "^4.0.1", + "sebastian/complexity": "^4.0.1", + "sebastian/environment": "^7.2.0", + "sebastian/lines-of-code": "^3.0.1", + "sebastian/version": "^5.0.1", + "theseer/tokenizer": "^1.2.3" }, "require-dev": { "phpunit/phpunit": "^11.0" @@ -9687,7 +9694,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "11.0-dev" + "dev-main": "11.0.x-dev" } }, "autoload": { @@ -9716,7 +9723,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/11.0.5" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/11.0.6" }, "funding": [ { @@ -9724,20 +9731,20 @@ "type": "github" } ], - "time": "2024-07-03T05:05:37+00:00" + "time": "2024-08-22T04:37:56+00:00" }, { "name": "phpunit/php-file-iterator", - "version": "5.0.1", + "version": "5.1.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "6ed896bf50bbbfe4d504a33ed5886278c78e4a26" + "reference": "118cfaaa8bc5aef3287bf315b6060b1174754af6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/6ed896bf50bbbfe4d504a33ed5886278c78e4a26", - "reference": "6ed896bf50bbbfe4d504a33ed5886278c78e4a26", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/118cfaaa8bc5aef3287bf315b6060b1174754af6", + "reference": "118cfaaa8bc5aef3287bf315b6060b1174754af6", "shasum": "" }, "require": { @@ -9777,7 +9784,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", "security": "https://github.com/sebastianbergmann/php-file-iterator/security/policy", - "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/5.0.1" + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/5.1.0" }, "funding": [ { @@ -9785,7 +9792,7 @@ "type": "github" } ], - "time": "2024-07-03T05:06:37+00:00" + "time": "2024-08-27T05:02:59+00:00" }, { "name": "phpunit/php-invoker", @@ -9973,16 +9980,16 @@ }, { "name": "phpunit/phpunit", - "version": "11.2.6", + "version": "11.3.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "1dc0fedac703199e8704de085e47dd46bac0dde4" + "reference": "8a4de85cc4a78c59dd31cc4ef454b0029f8440dc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/1dc0fedac703199e8704de085e47dd46bac0dde4", - "reference": "1dc0fedac703199e8704de085e47dd46bac0dde4", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/8a4de85cc4a78c59dd31cc4ef454b0029f8440dc", + "reference": "8a4de85cc4a78c59dd31cc4ef454b0029f8440dc", "shasum": "" }, "require": { @@ -9992,25 +9999,25 @@ "ext-mbstring": "*", "ext-xml": "*", "ext-xmlwriter": "*", - "myclabs/deep-copy": "^1.10.1", - "phar-io/manifest": "^2.0.3", - "phar-io/version": "^3.0.2", + "myclabs/deep-copy": "^1.12.0", + "phar-io/manifest": "^2.0.4", + "phar-io/version": "^3.2.1", "php": ">=8.2", - "phpunit/php-code-coverage": "^11.0", - "phpunit/php-file-iterator": "^5.0", - "phpunit/php-invoker": "^5.0", - "phpunit/php-text-template": "^4.0", - "phpunit/php-timer": "^7.0", - "sebastian/cli-parser": "^3.0", - "sebastian/code-unit": "^3.0", - "sebastian/comparator": "^6.0", - "sebastian/diff": "^6.0", - "sebastian/environment": "^7.0", - "sebastian/exporter": "^6.1.2", - "sebastian/global-state": "^7.0", - "sebastian/object-enumerator": "^6.0", - "sebastian/type": "^5.0", - "sebastian/version": "^5.0" + "phpunit/php-code-coverage": "^11.0.6", + "phpunit/php-file-iterator": "^5.1.0", + "phpunit/php-invoker": "^5.0.1", + "phpunit/php-text-template": "^4.0.1", + "phpunit/php-timer": "^7.0.1", + "sebastian/cli-parser": "^3.0.2", + "sebastian/code-unit": "^3.0.1", + "sebastian/comparator": "^6.0.2", + "sebastian/diff": "^6.0.2", + "sebastian/environment": "^7.2.0", + "sebastian/exporter": "^6.1.3", + "sebastian/global-state": "^7.0.2", + "sebastian/object-enumerator": "^6.0.1", + "sebastian/type": "^5.0.1", + "sebastian/version": "^5.0.1" }, "suggest": { "ext-soap": "To be able to generate mocks based on WSDL files" @@ -10021,7 +10028,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "11.2-dev" + "dev-main": "11.3-dev" } }, "autoload": { @@ -10053,7 +10060,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/11.2.6" + "source": "https://github.com/sebastianbergmann/phpunit/tree/11.3.2" }, "funding": [ { @@ -10069,7 +10076,7 @@ "type": "tidelift" } ], - "time": "2024-07-03T05:51:49+00:00" + "time": "2024-09-03T12:00:26+00:00" }, { "name": "sebastian/cli-parser", @@ -10243,16 +10250,16 @@ }, { "name": "sebastian/comparator", - "version": "6.0.1", + "version": "6.0.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "131942b86d3587291067a94f295498ab6ac79c20" + "reference": "450d8f237bd611c45b5acf0733ce43e6bb280f81" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/131942b86d3587291067a94f295498ab6ac79c20", - "reference": "131942b86d3587291067a94f295498ab6ac79c20", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/450d8f237bd611c45b5acf0733ce43e6bb280f81", + "reference": "450d8f237bd611c45b5acf0733ce43e6bb280f81", "shasum": "" }, "require": { @@ -10308,7 +10315,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/comparator/issues", "security": "https://github.com/sebastianbergmann/comparator/security/policy", - "source": "https://github.com/sebastianbergmann/comparator/tree/6.0.1" + "source": "https://github.com/sebastianbergmann/comparator/tree/6.0.2" }, "funding": [ { @@ -10316,7 +10323,7 @@ "type": "github" } ], - "time": "2024-07-03T04:48:07+00:00" + "time": "2024-08-12T06:07:25+00:00" }, { "name": "sebastian/complexity", @@ -11636,7 +11643,10 @@ ], "aliases": [], "minimum-stability": "stable", - "stability-flags": [], + "stability-flags": { + "atoum/atoum": 20, + "atoum/stubs": 20 + }, "prefer-stable": false, "prefer-lowest": false, "platform": { diff --git a/public/index.php b/public/index.php index caa63615fa3..0571432a332 100755 --- a/public/index.php +++ b/public/index.php @@ -37,8 +37,8 @@ // Check PHP version not to have trouble // Need to be the very fist step before any include -if (version_compare(PHP_VERSION, '8.2.0', '<') || version_compare(PHP_VERSION, '8.3.999', '>')) { - exit('PHP version must be between 8.2 and 8.3.'); +if (version_compare(PHP_VERSION, '8.2.0', '<') || version_compare(PHP_VERSION, '8.4.999', '>')) { + exit('PHP version must be between 8.2 and 8.4.'); } // Check the resources state before trying to instanciate the Kernel. diff --git a/src/Consumable.php b/src/Consumable.php index b86a14325ac..092a1ae1e83 100644 --- a/src/Consumable.php +++ b/src/Consumable.php @@ -197,7 +197,7 @@ public static function getMassiveActionsForItemtype( array &$actions, $itemtype, $is_deleted = 0, - CommonDBTM $checkitem = null + ?CommonDBTM $checkitem = null ) { // Special actions only for self if ($itemtype !== static::class) { diff --git a/src/DBmysql.php b/src/DBmysql.php index 97149ab51fe..244880fc98a 100644 --- a/src/DBmysql.php +++ b/src/DBmysql.php @@ -365,7 +365,7 @@ public function escape($string) */ public function query($query) { - trigger_error('Executing direct queries is not allowed!', E_USER_ERROR); + throw new \Exception('Executing direct queries is not allowed!'); } /** @@ -465,7 +465,7 @@ static function ($warning) { */ public function queryOrDie($query, $message = '') { - trigger_error('Executing direct queries is not allowed!', E_USER_ERROR); + throw new \Exception('Executing direct queries is not allowed!'); } /** diff --git a/src/Glpi/Asset/Asset_PeripheralAsset.php b/src/Glpi/Asset/Asset_PeripheralAsset.php index a9ba93ecb1e..3df0f0cb398 100644 --- a/src/Glpi/Asset/Asset_PeripheralAsset.php +++ b/src/Glpi/Asset/Asset_PeripheralAsset.php @@ -257,7 +257,7 @@ public static function getMassiveActionsForItemtype( array &$actions, $itemtype, $is_deleted = false, - CommonDBTM $checkitem = null + ?CommonDBTM $checkitem = null ) { $action_prefix = __CLASS__ . MassiveAction::CLASS_ACTION_SEPARATOR; $specificities = self::getRelationMassiveActionsSpecificities(); diff --git a/src/Glpi/DBAL/QueryFunction.php b/src/Glpi/DBAL/QueryFunction.php index 62957206db5..d0674371e74 100644 --- a/src/Glpi/DBAL/QueryFunction.php +++ b/src/Glpi/DBAL/QueryFunction.php @@ -171,7 +171,7 @@ public static function ifnull(string|QueryExpression $expression, string|QueryEx * @param string|null $alias Function result alias (will be automatically quoted) * @return QueryExpression */ - public static function groupConcat(string|QueryExpression $expression, ?string $separator = null, bool $distinct = false, array|string $order_by = null, ?string $alias = null): QueryExpression + public static function groupConcat(string|QueryExpression $expression, ?string $separator = null, bool $distinct = false, array|string|null $order_by = null, ?string $alias = null): QueryExpression { /** @var \DBmysql $DB */ global $DB; @@ -305,7 +305,7 @@ public static function replace(string|QueryExpression $expression, string|QueryE * @param string|null $alias Function result alias (will be automatically quoted) * @return QueryExpression */ - public static function fromUnixtime(string|QueryExpression $expression, string|QueryExpression $format = null, ?string $alias = null): QueryExpression + public static function fromUnixtime(string|QueryExpression $expression, string|QueryExpression|null $format = null, ?string $alias = null): QueryExpression { $params = [$expression]; if ($format !== null) { @@ -429,7 +429,7 @@ public static function timediff(string|QueryExpression $expression1, string|Quer * @param string|null $alias Function result alias (will be automatically quoted) * @return QueryExpression */ - public static function unixTimestamp(string|QueryExpression $expression = null, ?string $alias = null): QueryExpression + public static function unixTimestamp(string|QueryExpression|null $expression = null, ?string $alias = null): QueryExpression { $params = []; if ($expression !== null) { diff --git a/src/Glpi/Dashboard/FakeProvider.php b/src/Glpi/Dashboard/FakeProvider.php index b651aca0aea..be12a88f15a 100644 --- a/src/Glpi/Dashboard/FakeProvider.php +++ b/src/Glpi/Dashboard/FakeProvider.php @@ -124,7 +124,7 @@ private static function getItemCount(?string $itemtype = null) return $values[$itemtype] ?? null; } - public static function bigNumberItem(CommonDBTM $item = null, array $params = []): array + public static function bigNumberItem(?CommonDBTM $item = null, array $params = []): array { return [ 'number' => self::getItemCount($item::class) ?? 1500, @@ -277,7 +277,7 @@ public static function nbTicketsByAgreementStatusAndTechnicianGroup(array $param ]; } - public static function nbItemByFk(CommonDBTM $item = null, CommonDBTM $fk_item = null, array $params = []): array + public static function nbItemByFk(?CommonDBTM $item = null, ?CommonDBTM $fk_item = null, array $params = []): array { $item_counts = self::getItemCount(); $number_fk = $item_counts[$fk_item::class] ?? 20; @@ -305,7 +305,7 @@ public static function nbItemByFk(CommonDBTM $item = null, CommonDBTM $fk_item = ]; } - public static function articleListItem(CommonDBTM $item = null, array $params = []): array + public static function articleListItem(?CommonDBTM $item = null, array $params = []): array { $data = []; for ($i = 0; $i < 5; $i++) { diff --git a/src/Glpi/Features/State.php b/src/Glpi/Features/State.php index ede86e18a26..88776e4fb09 100644 --- a/src/Glpi/Features/State.php +++ b/src/Glpi/Features/State.php @@ -50,12 +50,11 @@ private function checkSetup(): void global $CFG_GLPI; if (!in_array(static::class, $CFG_GLPI['state_types'])) { - trigger_error( + throw new \LogicException( sprintf( 'Class %s must be present in $CFG_GLPI[\'state_types\']', static::class - ), - E_USER_ERROR + ) ); } } diff --git a/src/Glpi/Marketplace/Controller.php b/src/Glpi/Marketplace/Controller.php index c982a537034..8253810146d 100644 --- a/src/Glpi/Marketplace/Controller.php +++ b/src/Glpi/Marketplace/Controller.php @@ -158,7 +158,7 @@ private static function getPluginVersionInfo(array $plugin, string $version): ?a * @param ?string $version Download a specific version of the plugin * @return bool */ - public function downloadPlugin($auto_install = true, string $version = null): bool + public function downloadPlugin($auto_install = true, ?string $version = null): bool { if (!self::hasWriteAccess()) { return false; @@ -463,7 +463,7 @@ public function getRequiredOffers(): array * * @return bool */ - public function canBeDownloaded(string $version = null) + public function canBeDownloaded(?string $version = null) { $api = self::getAPI(); $api_plugin = $api->getPlugin($this->plugin_key); diff --git a/src/Glpi/System/Log/LogParser.php b/src/Glpi/System/Log/LogParser.php index afb3fc4af5b..fff81594eb9 100644 --- a/src/Glpi/System/Log/LogParser.php +++ b/src/Glpi/System/Log/LogParser.php @@ -124,7 +124,7 @@ public function getLogFileInfo(string $filepath): ?array * * @return array|null */ - public function parseLogFile(string $filepath, int $max_nb_lines = null): ?array + public function parseLogFile(string $filepath, ?int $max_nb_lines = null): ?array { /** @var array $CFG_GLPI */ global $CFG_GLPI; diff --git a/src/IPAddress.php b/src/IPAddress.php index 2c90baccff2..c3597a30a53 100644 --- a/src/IPAddress.php +++ b/src/IPAddress.php @@ -1276,9 +1276,9 @@ private static function getCriteriaLinkedToNetwork(IPNetwork $network): array * @param array $options **/ public static function getHTMLTableCellsForItem( - HTMLTableRow $row = null, - CommonDBTM $item = null, - HTMLTableCell $father = null, + ?HTMLTableRow $row = null, + ?CommonDBTM $item = null, + ?HTMLTableCell $father = null, array $options = [] ) { /** @var \DBmysql $DB */ diff --git a/src/Line.php b/src/Line.php index fcfa057c5de..70ce1a5d453 100644 --- a/src/Line.php +++ b/src/Line.php @@ -237,7 +237,7 @@ public static function getIcon() return "ti ti-phone-calling"; } - public static function getMassiveActionsForItemtype(array &$actions, $itemtype, $is_deleted = 0, CommonDBTM $checkitem = null) + public static function getMassiveActionsForItemtype(array &$actions, $itemtype, $is_deleted = 0, ?CommonDBTM $checkitem = null) { /** @var array $CFG_GLPI */ global $CFG_GLPI; diff --git a/src/QueuedWebhook.php b/src/QueuedWebhook.php index 58842e07c99..cc1b2621dee 100644 --- a/src/QueuedWebhook.php +++ b/src/QueuedWebhook.php @@ -559,7 +559,7 @@ public static function getPendings($send_time = null, $limit = 20, $extra_where * * @return integer either 0 or 1 **/ - public static function cronQueuedWebhook(CronTask $task = null) + public static function cronQueuedWebhook(?CronTask $task = null) { $cron_status = 0; @@ -585,7 +585,7 @@ public static function cronQueuedWebhook(CronTask $task = null) * * @return integer either 0 or 1 **/ - public static function cronQueuedWebhookClean(CronTask $task = null) + public static function cronQueuedWebhookClean(?CronTask $task = null) { /** @var \DBmysql $DB */ global $DB; diff --git a/src/Reservation.php b/src/Reservation.php index e317a17d8d7..12cc97f87ff 100644 --- a/src/Reservation.php +++ b/src/Reservation.php @@ -1153,7 +1153,7 @@ public static function getIcon() return "ti ti-calendar-event"; } - public static function getMassiveActionsForItemtype(array &$actions, $itemtype, $is_deleted = 0, CommonDBTM $checkitem = null) + public static function getMassiveActionsForItemtype(array &$actions, $itemtype, $is_deleted = 0, ?CommonDBTM $checkitem = null) { /** @var array $CFG_GLPI */ global $CFG_GLPI; diff --git a/src/Toolbox.php b/src/Toolbox.php index ccfd484270d..53ba08bf6bb 100644 --- a/src/Toolbox.php +++ b/src/Toolbox.php @@ -261,7 +261,7 @@ public static function decodeFromUtf8($string, $to_charset = "ISO-8859-1") * * @return void **/ - private static function log(LoggerInterface $logger = null, $level = LogLevel::WARNING, $args = null) + private static function log(?LoggerInterface $logger = null, $level = LogLevel::WARNING, $args = null) { static $tps = 0; diff --git a/src/autoload/constants.php b/src/autoload/constants.php index e8ec0791909..d737740f34e 100644 --- a/src/autoload/constants.php +++ b/src/autoload/constants.php @@ -45,7 +45,7 @@ ); define('GLPI_MIN_PHP', '8.2'); // Must also be changed in top of public/index.php -define('GLPI_MAX_PHP', '8.3'); // Must also be changed in top of public/index.php +define('GLPI_MAX_PHP', '8.4'); // Must also be changed in top of public/index.php define('GLPI_YEAR', '2024'); //Define a global recipient address for email notifications diff --git a/tests/functional/State.php b/tests/functional/State.php index 9b55c1927ab..94d841897e3 100644 --- a/tests/functional/State.php +++ b/tests/functional/State.php @@ -208,15 +208,12 @@ public function testIsStateVisible(): void unset($CFG_GLPI['state_types'][0]); $this->boolean(method_exists($itemtype, 'isStateVisible'))->isTrue($itemtype . ' misses isStateVisible() method!'); - $this->when( + $this->exception( function () use ($item, $states_id) { $this->boolean($item->isStateVisible($states_id))->isTrue(); } - ) - ->error() - ->withType(E_USER_ERROR) - ->withMessage(sprintf('Class %s must be present in $CFG_GLPI[\'state_types\']', $itemtype)) - ->exists(); + )->isInstanceOf(\LogicException::class) + ->hasMessage(sprintf('Class %s must be present in $CFG_GLPI[\'state_types\']', $itemtype)); } public function testGetStateVisibilityCriteria(): void diff --git a/tests/src/FormTesterTrait.php b/tests/src/FormTesterTrait.php index bf459dddc7c..83cf4a9c6ce 100644 --- a/tests/src/FormTesterTrait.php +++ b/tests/src/FormTesterTrait.php @@ -149,7 +149,7 @@ protected function createForm(FormBuilder $builder): Form protected function getQuestionId( Form $form, string $question_name, - string $section_name = null, + ?string $section_name = null, ): int { // Make sure form is up to date $form->getFromDB($form->getID()); @@ -227,7 +227,7 @@ protected function getSectionId( protected function getCommentId( Form $form, string $comment_name, - string $section_name = null, + ?string $section_name = null, ): int { // Make sure form is up to date $form->getFromDB($form->getID()); diff --git a/tools/patches/apereo-phpcas-php84.patch b/tools/patches/apereo-phpcas-php84.patch new file mode 100644 index 00000000000..6df6e7d594c --- /dev/null +++ b/tools/patches/apereo-phpcas-php84.patch @@ -0,0 +1,35 @@ +diff --git a/source/CAS.php b/source/CAS.php +index df6bc82..da145bc 100644 +--- a/source/CAS.php ++++ b/source/CAS.php +@@ -347,7 +347,7 @@ class phpCAS + */ + public static function client($server_version, $server_hostname, + $server_port, $server_uri, $service_base_url, +- $changeSessionID = true, \SessionHandlerInterface $sessionHandler = null ++ $changeSessionID = true, ?\SessionHandlerInterface $sessionHandler = null + ) { + phpCAS :: traceBegin(); + if (is_object(self::$_PHPCAS_CLIENT)) { +@@ -402,7 +402,7 @@ class phpCAS + */ + public static function proxy($server_version, $server_hostname, + $server_port, $server_uri, $service_base_url, +- $changeSessionID = true, \SessionHandlerInterface $sessionHandler = null ++ $changeSessionID = true, ?\SessionHandlerInterface $sessionHandler = null + ) { + phpCAS :: traceBegin(); + if (is_object(self::$_PHPCAS_CLIENT)) { +diff --git a/source/CAS/Client.php b/source/CAS/Client.php +index 8ca9711..42709e9 100644 +--- a/source/CAS/Client.php ++++ b/source/CAS/Client.php +@@ -938,7 +938,7 @@ class CAS_Client + $server_uri, + $service_base_url, + $changeSessionID = true, +- \SessionHandlerInterface $sessionHandler = null ++ ?\SessionHandlerInterface $sessionHandler = null + ) { + // Argument validation + if (gettype($server_version) != 'string') diff --git a/tools/patches/friendsoftwig-twigcs-php84.patch b/tools/patches/friendsoftwig-twigcs-php84.patch new file mode 100644 index 00000000000..2132dad7200 --- /dev/null +++ b/tools/patches/friendsoftwig-twigcs-php84.patch @@ -0,0 +1,100 @@ +diff --git a/src/RegEngine/Checker/Handler.php b/src/RegEngine/Checker/Handler.php +index e29974a..91253be 100644 +--- a/src/RegEngine/Checker/Handler.php ++++ b/src/RegEngine/Checker/Handler.php +@@ -11,7 +11,7 @@ class Handler + + private ?Handler $parent; + +- public function __construct(self $parent = null) ++ public function __construct(?self $parent = null) + { + $this->parent = $parent; + } +diff --git a/src/Rule/AbstractRule.php b/src/Rule/AbstractRule.php +index 1246f6c..443f539 100644 +--- a/src/Rule/AbstractRule.php ++++ b/src/Rule/AbstractRule.php +@@ -45,7 +45,7 @@ protected function getNextSignificantToken(TokenStream $tokens, int $skip = 0): + return StreamNavigator::getNextSignificantToken($tokens, $skip); + } + +- protected function skipTo(TokenStream $tokens, int $tokenType, string $tokenValue = null) ++ protected function skipTo(TokenStream $tokens, int $tokenType, ?string $tokenValue = null) + { + return StreamNavigator::skipTo($tokens, $tokenType, $tokenValue); + } +diff --git a/src/Rule/UnusedMacro.php b/src/Rule/UnusedMacro.php +index ad2faa2..57b6ac3 100644 +--- a/src/Rule/UnusedMacro.php ++++ b/src/Rule/UnusedMacro.php +@@ -11,7 +11,7 @@ class UnusedMacro extends AbstractRule implements RuleInterface + { + public TemplateResolverInterface $loader; + +- public function __construct(int $severity, TemplateResolverInterface $loader = null) ++ public function __construct(int $severity, ?TemplateResolverInterface $loader = null) + { + $this->loader = $loader ?: new NullResolver(); + +diff --git a/src/Rule/UnusedVariable.php b/src/Rule/UnusedVariable.php +index f22140b..abecf66 100644 +--- a/src/Rule/UnusedVariable.php ++++ b/src/Rule/UnusedVariable.php +@@ -11,7 +11,7 @@ class UnusedVariable extends AbstractRule implements RuleInterface + { + public TemplateResolverInterface $loader; + +- public function __construct(int $severity, TemplateResolverInterface $loader = null) ++ public function __construct(int $severity, ?TemplateResolverInterface $loader = null) + { + $this->loader = $loader ?: new NullResolver(); + +diff --git a/src/TwigPort/SyntaxError.php b/src/TwigPort/SyntaxError.php +index 8a26eba..3d08171 100644 +--- a/src/TwigPort/SyntaxError.php ++++ b/src/TwigPort/SyntaxError.php +@@ -20,7 +20,7 @@ class SyntaxError extends \Exception + * @param int $lineno The template line where the error occurred + * @param Source|null $source The source context where the error occurred + */ +- public function __construct(string $message, int $lineno = -1, int $columnno = -1, Source $source = null) ++ public function __construct(string $message, int $lineno = -1, int $columnno = -1, ?Source $source = null) + { + parent::__construct($message); + +diff --git a/src/TwigPort/TokenStream.php b/src/TwigPort/TokenStream.php +index d2b3a90..82f4f46 100644 +--- a/src/TwigPort/TokenStream.php ++++ b/src/TwigPort/TokenStream.php +@@ -15,7 +15,7 @@ final class TokenStream + private int $current = 0; + private Source $source; + +- public function __construct(array $tokens, Source $source = null) ++ public function __construct(array $tokens, ?Source $source = null) + { + $this->tokens = $tokens; + $this->source = $source ?: new Source('', ''); +@@ -51,7 +51,7 @@ public function nextIf($primary, $secondary = null) + } + } + +- public function expect($type, $value = null, string $message = null): Token ++ public function expect($type, $value = null, ?string $message = null): Token + { + $token = $this->tokens[$this->current]; + +diff --git a/src/Util/StreamNavigator.php b/src/Util/StreamNavigator.php +index 573d577..cf58dd4 100644 +--- a/src/Util/StreamNavigator.php ++++ b/src/Util/StreamNavigator.php +@@ -47,7 +47,7 @@ public static function getNextSignificantToken(TokenStream $tokens, int $skip = + return null; + } + +- public static function skipTo(TokenStream $tokens, int $tokenType, string $tokenValue = null) ++ public static function skipTo(TokenStream $tokens, int $tokenType, ?string $tokenValue = null) + { + while (!$tokens->isEOF()) { + $continue = $tokens->getCurrent()->getType() !== $tokenType; diff --git a/tools/patches/league-event-php84.patch b/tools/patches/league-event-php84.patch new file mode 100644 index 00000000000..d728114427f --- /dev/null +++ b/tools/patches/league-event-php84.patch @@ -0,0 +1,13 @@ +diff --git a/src/EventDispatcher.php b/src/EventDispatcher.php +index 6c5128f..35fdaea 100644 +--- a/src/EventDispatcher.php ++++ b/src/EventDispatcher.php +@@ -14,7 +14,7 @@ class EventDispatcher implements EventDispatchingListenerRegistry + */ + protected $listenerProvider; + +- public function __construct(ListenerProviderInterface $listenerProvider = null) ++ public function __construct(?ListenerProviderInterface $listenerProvider = null) + { + $this->listenerProvider = $listenerProvider instanceof ListenerProviderInterface + ? $listenerProvider diff --git a/tools/patches/league-oauth2-client-php84.patch b/tools/patches/league-oauth2-client-php84.patch new file mode 100644 index 00000000000..772afef7158 --- /dev/null +++ b/tools/patches/league-oauth2-client-php84.patch @@ -0,0 +1,13 @@ +diff --git a/src/Provider/AbstractProvider.php b/src/Provider/AbstractProvider.php +index 293a54d6..feba9559 100644 +--- a/src/Provider/AbstractProvider.php ++++ b/src/Provider/AbstractProvider.php +@@ -495,7 +495,7 @@ public function getAuthorizationUrl(array $options = []) + */ + public function authorize( + array $options = [], +- callable $redirectHandler = null ++ ?callable $redirectHandler = null + ) { + $url = $this->getAuthorizationUrl($options); + if ($redirectHandler) { diff --git a/tools/patches/league-oauth2-server-php84.patch b/tools/patches/league-oauth2-server-php84.patch new file mode 100644 index 00000000000..ec60e61bf37 --- /dev/null +++ b/tools/patches/league-oauth2-server-php84.patch @@ -0,0 +1,114 @@ +diff --git a/src/Exception/OAuthServerException.php b/src/Exception/OAuthServerException.php +index 9eff92456..24a38d3fe 100644 +--- a/src/Exception/OAuthServerException.php ++++ b/src/Exception/OAuthServerException.php +@@ -33,7 +33,7 @@ class OAuthServerException extends Exception + /** + * Throw a new exception. + */ +- final public function __construct(string $message, int $code, private string $errorType, private int $httpStatusCode = 400, private ?string $hint = null, private ?string $redirectUri = null, Throwable $previous = null) ++ final public function __construct(string $message, int $code, private string $errorType, private int $httpStatusCode = 400, private ?string $hint = null, private ?string $redirectUri = null, ?Throwable $previous = null) + { + parent::__construct($message, $code, $previous); + $this->payload = [ +@@ -88,7 +88,7 @@ public static function unsupportedGrantType(): static + /** + * Invalid request error. + */ +- public static function invalidRequest(string $parameter, ?string $hint = null, Throwable $previous = null): static ++ public static function invalidRequest(string $parameter, ?string $hint = null, ?Throwable $previous = null): static + { + $errorMessage = 'The request is missing a required parameter, includes an invalid parameter value, ' . + 'includes a parameter more than once, or is otherwise malformed.'; +@@ -141,7 +141,7 @@ public static function invalidCredentials(): static + * + * @codeCoverageIgnore + */ +- public static function serverError(string $hint, Throwable $previous = null): static ++ public static function serverError(string $hint, ?Throwable $previous = null): static + { + return new static( + 'The authorization server encountered an unexpected condition which prevented it from fulfilling' +@@ -158,7 +158,7 @@ public static function serverError(string $hint, Throwable $previous = null): st + /** + * Invalid refresh token. + */ +- public static function invalidRefreshToken(?string $hint = null, Throwable $previous = null): static ++ public static function invalidRefreshToken(?string $hint = null, ?Throwable $previous = null): static + { + return new static('The refresh token is invalid.', 8, 'invalid_grant', 400, $hint, null, $previous); + } +@@ -166,7 +166,7 @@ public static function invalidRefreshToken(?string $hint = null, Throwable $prev + /** + * Access denied. + */ +- public static function accessDenied(?string $hint = null, ?string $redirectUri = null, Throwable $previous = null): static ++ public static function accessDenied(?string $hint = null, ?string $redirectUri = null, ?Throwable $previous = null): static + { + return new static( + 'The resource owner or authorization server denied the request.', +@@ -207,7 +207,7 @@ public function getErrorType(): string + * + * @return static + */ +- public static function expiredToken(?string $hint = null, Throwable $previous = null): static ++ public static function expiredToken(?string $hint = null, ?Throwable $previous = null): static + { + $errorMessage = 'The `device_code` has expired and the device ' . + 'authorization session has concluded.'; +@@ -215,7 +215,7 @@ public static function expiredToken(?string $hint = null, Throwable $previous = + return new static($errorMessage, 11, 'expired_token', 400, $hint, null, $previous); + } + +- public static function authorizationPending(string $hint = '', Throwable $previous = null): static ++ public static function authorizationPending(string $hint = '', ?Throwable $previous = null): static + { + return new static( + 'The authorization request is still pending as the end user ' . +@@ -236,7 +236,7 @@ public static function authorizationPending(string $hint = '', Throwable $previo + * + * @return static + */ +- public static function slowDown(string $hint = '', Throwable $previous = null): static ++ public static function slowDown(string $hint = '', ?Throwable $previous = null): static + { + return new static( + 'The authorization request is still pending and polling should ' . +diff --git a/src/Grant/AbstractGrant.php b/src/Grant/AbstractGrant.php +index ea0064c3b..5ab81ff77 100644 +--- a/src/Grant/AbstractGrant.php ++++ b/src/Grant/AbstractGrant.php +@@ -243,7 +243,7 @@ protected function validateRedirectUri( + * + * @return ScopeEntityInterface[] + */ +- public function validateScopes(string|array|null $scopes, string $redirectUri = null): array ++ public function validateScopes(string|array|null $scopes, ?string $redirectUri = null): array + { + if ($scopes === null) { + $scopes = []; +diff --git a/src/ResourceServer.php b/src/ResourceServer.php +index e89e8d24a..102466fd6 100644 +--- a/src/ResourceServer.php ++++ b/src/ResourceServer.php +@@ -22,19 +22,15 @@ class ResourceServer + { + private CryptKeyInterface $publicKey; + +- private ?AuthorizationValidatorInterface $authorizationValidator = null; +- + public function __construct( + private AccessTokenRepositoryInterface $accessTokenRepository, + CryptKeyInterface|string $publicKey, +- AuthorizationValidatorInterface $authorizationValidator = null ++ private ?AuthorizationValidatorInterface $authorizationValidator = null + ) { + if ($publicKey instanceof CryptKeyInterface === false) { + $publicKey = new CryptKey($publicKey); + } + $this->publicKey = $publicKey; +- +- $this->authorizationValidator = $authorizationValidator; + } + + protected function getAuthorizationValidator(): AuthorizationValidatorInterface diff --git a/tools/patches/sabre-dav-php84.patch b/tools/patches/sabre-dav-php84.patch new file mode 100644 index 00000000000..e25f5f30c46 --- /dev/null +++ b/tools/patches/sabre-dav-php84.patch @@ -0,0 +1,74 @@ +diff --git a/lib/CardDAV/Plugin.php b/lib/CardDAV/Plugin.php +index c2d31d9dfe..810ae3a1ab 100644 +--- a/lib/CardDAV/Plugin.php ++++ b/lib/CardDAV/Plugin.php +@@ -800,7 +800,7 @@ protected function negotiateVCard($input, &$mimeType = null) + * + * @return string + */ +- protected function convertVCard($data, $target, array $propertiesFilter = null) ++ protected function convertVCard($data, $target, ?array $propertiesFilter = null) + { + if (is_resource($data)) { + $data = stream_get_contents($data); +diff --git a/lib/CardDAV/Xml/Property/SupportedAddressData.php b/lib/CardDAV/Xml/Property/SupportedAddressData.php +index fe5f976a03..536c5a19fc 100644 +--- a/lib/CardDAV/Xml/Property/SupportedAddressData.php ++++ b/lib/CardDAV/Xml/Property/SupportedAddressData.php +@@ -34,7 +34,7 @@ class SupportedAddressData implements XmlSerializable + /** + * Creates the property. + */ +- public function __construct(array $supportedData = null) ++ public function __construct(?array $supportedData = null) + { + if (is_null($supportedData)) { + $supportedData = [ +diff --git a/lib/DAV/Auth/Plugin.php b/lib/DAV/Auth/Plugin.php +index eb4f27ca67..47fbe205ac 100644 +--- a/lib/DAV/Auth/Plugin.php ++++ b/lib/DAV/Auth/Plugin.php +@@ -58,7 +58,7 @@ class Plugin extends ServerPlugin + * + * @param Backend\BackendInterface $authBackend + */ +- public function __construct(Backend\BackendInterface $authBackend = null) ++ public function __construct(?Backend\BackendInterface $authBackend = null) + { + if (!is_null($authBackend)) { + $this->addBackend($authBackend); +diff --git a/lib/DAV/Exception/Locked.php b/lib/DAV/Exception/Locked.php +index 28263cf13e..24fad70955 100644 +--- a/lib/DAV/Exception/Locked.php ++++ b/lib/DAV/Exception/Locked.php +@@ -32,7 +32,7 @@ class Locked extends DAV\Exception + * + * @param DAV\Locks\LockInfo $lock + */ +- public function __construct(DAV\Locks\LockInfo $lock = null) ++ public function __construct(?DAV\Locks\LockInfo $lock = null) + { + parent::__construct(); + +diff --git a/lib/DAV/Server.php b/lib/DAV/Server.php +index 1a97951ecd..3133e54ad3 100644 +--- a/lib/DAV/Server.php ++++ b/lib/DAV/Server.php +@@ -211,7 +211,7 @@ class Server implements LoggerAwareInterface, EmitterInterface + * + * @throws Exception + */ +- public function __construct($treeOrNode = null, HTTP\Sapi $sapi = null) ++ public function __construct($treeOrNode = null, ?HTTP\Sapi $sapi = null) + { + if ($treeOrNode instanceof Tree) { + $this->tree = $treeOrNode; +@@ -882,7 +882,7 @@ public function getHTTPHeaders($path) + * + * @return \Traversable + */ +- private function generatePathNodes(PropFind $propFind, array $yieldFirst = null) ++ private function generatePathNodes(PropFind $propFind, ?array $yieldFirst = null) + { + if (null !== $yieldFirst) { + yield $yieldFirst; diff --git a/tools/patches/sabre-vobject-php84.patch b/tools/patches/sabre-vobject-php84.patch new file mode 100644 index 00000000000..82f785b65c1 --- /dev/null +++ b/tools/patches/sabre-vobject-php84.patch @@ -0,0 +1,198 @@ +diff --git a/lib/Component/VCalendar.php b/lib/Component/VCalendar.php +index 4db318135..017aed70c 100644 +--- a/lib/Component/VCalendar.php ++++ b/lib/Component/VCalendar.php +@@ -281,7 +281,7 @@ public function getBaseComponent($componentName = null) + * + * @return VCalendar + */ +- public function expand(DateTimeInterface $start, DateTimeInterface $end, DateTimeZone $timeZone = null) ++ public function expand(DateTimeInterface $start, DateTimeInterface $end, ?DateTimeZone $timeZone = null) + { + $newChildren = []; + $recurringEvents = []; +diff --git a/lib/DateTimeParser.php b/lib/DateTimeParser.php +index c5dbac97d..69072ef8c 100644 +--- a/lib/DateTimeParser.php ++++ b/lib/DateTimeParser.php +@@ -31,7 +31,7 @@ class DateTimeParser + * + * @return DateTimeImmutable + */ +- public static function parseDateTime($dt, DateTimeZone $tz = null) ++ public static function parseDateTime($dt, ?DateTimeZone $tz = null) + { + // Format is YYYYMMDD + "T" + hhmmss + $result = preg_match('/^([0-9]{4})([0-1][0-9])([0-3][0-9])T([0-2][0-9])([0-5][0-9])([0-5][0-9])([Z]?)$/', $dt, $matches); +@@ -61,7 +61,7 @@ public static function parseDateTime($dt, DateTimeZone $tz = null) + * + * @return DateTimeImmutable + */ +- public static function parseDate($date, DateTimeZone $tz = null) ++ public static function parseDate($date, ?DateTimeZone $tz = null) + { + // Format is YYYYMMDD + $result = preg_match('/^([0-9]{4})([0-1][0-9])([0-3][0-9])$/', $date, $matches); +diff --git a/lib/Document.php b/lib/Document.php +index 6b908c70e..d2131f479 100644 +--- a/lib/Document.php ++++ b/lib/Document.php +@@ -157,7 +157,7 @@ public function create($name) + * + * @return Component + */ +- public function createComponent($name, array $children = null, $defaults = true) ++ public function createComponent($name, ?array $children = null, $defaults = true) + { + $name = strtoupper($name); + $class = Component::class; +@@ -187,7 +187,7 @@ public function createComponent($name, array $children = null, $defaults = true) + * @param array $parameters + * @param string $valueType Force a specific valuetype, such as URI or TEXT + */ +- public function createProperty($name, $value = null, array $parameters = null, $valueType = null, int $lineIndex = null, string $lineString = null): Property ++ public function createProperty($name, $value = null, ?array $parameters = null, $valueType = null, ?int $lineIndex = null, ?string $lineString = null): Property + { + // If there's a . in the name, it means it's prefixed by a groupname. + if (false !== ($i = strpos($name, '.'))) { +diff --git a/lib/FreeBusyGenerator.php b/lib/FreeBusyGenerator.php +index 81b8126d5..56ae166fa 100644 +--- a/lib/FreeBusyGenerator.php ++++ b/lib/FreeBusyGenerator.php +@@ -89,7 +89,7 @@ class FreeBusyGenerator + * @param mixed $objects + * @param DateTimeZone $timeZone + */ +- public function __construct(DateTimeInterface $start = null, DateTimeInterface $end = null, $objects = null, DateTimeZone $timeZone = null) ++ public function __construct(?DateTimeInterface $start = null, ?DateTimeInterface $end = null, $objects = null, ?DateTimeZone $timeZone = null) + { + $this->setTimeRange($start, $end); + +@@ -158,7 +158,7 @@ public function setObjects($objects) + * @param DateTimeInterface $start + * @param DateTimeInterface $end + */ +- public function setTimeRange(DateTimeInterface $start = null, DateTimeInterface $end = null) ++ public function setTimeRange(?DateTimeInterface $start = null, ?DateTimeInterface $end = null) + { + if (!$start) { + $start = new DateTimeImmutable(Settings::$minDate); +diff --git a/lib/ITip/Broker.php b/lib/ITip/Broker.php +index dbdd80b78..f007304ce 100644 +--- a/lib/ITip/Broker.php ++++ b/lib/ITip/Broker.php +@@ -108,7 +108,7 @@ class Broker + * + * @return VCalendar|null + */ +- public function processMessage(Message $itipMessage, VCalendar $existingObject = null) ++ public function processMessage(Message $itipMessage, ?VCalendar $existingObject = null) + { + // We only support events at the moment. + if ('VEVENT' !== $itipMessage->component) { +@@ -266,7 +266,7 @@ public function parseEvent($calendar, $userHref, $oldCalendar = null) + * + * @return VCalendar|null + */ +- protected function processMessageRequest(Message $itipMessage, VCalendar $existingObject = null) ++ protected function processMessageRequest(Message $itipMessage, ?VCalendar $existingObject = null) + { + if (!$existingObject) { + // This is a new invite, and we're just going to copy over +@@ -301,7 +301,7 @@ protected function processMessageRequest(Message $itipMessage, VCalendar $existi + * + * @return VCalendar|null + */ +- protected function processMessageCancel(Message $itipMessage, VCalendar $existingObject = null) ++ protected function processMessageCancel(Message $itipMessage, ?VCalendar $existingObject = null) + { + if (!$existingObject) { + // The event didn't exist in the first place, so we're just +@@ -326,7 +326,7 @@ protected function processMessageCancel(Message $itipMessage, VCalendar $existin + * + * @return VCalendar|null + */ +- protected function processMessageReply(Message $itipMessage, VCalendar $existingObject = null) ++ protected function processMessageReply(Message $itipMessage, ?VCalendar $existingObject = null) + { + // A reply can only be processed based on an existing object. + // If the object is not available, the reply is ignored. +@@ -807,7 +807,7 @@ protected function parseEventForAttendee(VCalendar $calendar, array $eventInfo, + * + * @return array + */ +- protected function parseEventInfo(VCalendar $calendar = null) ++ protected function parseEventInfo(?VCalendar $calendar = null) + { + $uid = null; + $organizer = null; +diff --git a/lib/Property.php b/lib/Property.php +index 0805c139a..f52760f9c 100644 +--- a/lib/Property.php ++++ b/lib/Property.php +@@ -81,7 +81,7 @@ abstract class Property extends Node + * @param array $parameters List of parameters + * @param string $group The vcard property group + */ +- public function __construct(Component $root, $name, $value = null, array $parameters = [], $group = null, int $lineIndex = null, string $lineString = null) ++ public function __construct(Component $root, $name, $value = null, array $parameters = [], $group = null, ?int $lineIndex = null, ?string $lineString = null) + { + $this->name = $name; + $this->group = $group; +diff --git a/lib/Property/ICalendar/DateTime.php b/lib/Property/ICalendar/DateTime.php +index ca71633b9..3ea21e2ec 100644 +--- a/lib/Property/ICalendar/DateTime.php ++++ b/lib/Property/ICalendar/DateTime.php +@@ -131,7 +131,7 @@ public function isFloating() + * + * @return \DateTimeImmutable + */ +- public function getDateTime(DateTimeZone $timeZone = null) ++ public function getDateTime(?DateTimeZone $timeZone = null) + { + $dt = $this->getDateTimes($timeZone); + if (!$dt) { +@@ -153,7 +153,7 @@ public function getDateTime(DateTimeZone $timeZone = null) + * @return \DateTimeImmutable[] + * @return \DateTime[] + */ +- public function getDateTimes(DateTimeZone $timeZone = null) ++ public function getDateTimes(?DateTimeZone $timeZone = null) + { + // Does the property have a TZID? + $tzid = $this['TZID']; +diff --git a/lib/Recur/EventIterator.php b/lib/Recur/EventIterator.php +index 61f05d7de..55d6e4779 100644 +--- a/lib/Recur/EventIterator.php ++++ b/lib/Recur/EventIterator.php +@@ -93,7 +93,7 @@ class EventIterator implements \Iterator + * @param DateTimeZone $timeZone reference timezone for floating dates and + * times + */ +- public function __construct($input, $uid = null, DateTimeZone $timeZone = null) ++ public function __construct($input, $uid = null, ?DateTimeZone $timeZone = null) + { + if (is_null($timeZone)) { + $timeZone = new DateTimeZone('UTC'); +diff --git a/lib/TimeZoneUtil.php b/lib/TimeZoneUtil.php +index 6422c0930..0d77e71ed 100644 +--- a/lib/TimeZoneUtil.php ++++ b/lib/TimeZoneUtil.php +@@ -75,7 +75,7 @@ private function addFinder(string $key, TimezoneFinder $finder): void + * Alternatively, if $failIfUncertain is set to true, it will throw an + * exception if we cannot accurately determine the timezone. + */ +- private function findTimeZone(string $tzid, Component $vcalendar = null, bool $failIfUncertain = false): DateTimeZone ++ private function findTimeZone(string $tzid, ?Component $vcalendar = null, bool $failIfUncertain = false): DateTimeZone + { + foreach ($this->timezoneFinders as $timezoneFinder) { + $timezone = $timezoneFinder->find($tzid, $failIfUncertain); +@@ -126,7 +126,7 @@ public static function addTimezoneFinder(string $key, TimezoneFinder $finder): v + * + * @return DateTimeZone + */ +- public static function getTimeZone($tzid, Component $vcalendar = null, $failIfUncertain = false) ++ public static function getTimeZone($tzid, ?Component $vcalendar = null, $failIfUncertain = false) + { + return self::getInstance()->findTimeZone($tzid, $vcalendar, $failIfUncertain); + } diff --git a/tools/patches/swaggest-json-diff-php84.patch b/tools/patches/swaggest-json-diff-php84.patch new file mode 100644 index 00000000000..73fa7996f25 --- /dev/null +++ b/tools/patches/swaggest-json-diff-php84.patch @@ -0,0 +1,65 @@ +diff --git a/src/InvalidFieldTypeException.php b/src/InvalidFieldTypeException.php +index d807046..37b45bc 100644 +--- a/src/InvalidFieldTypeException.php ++++ b/src/InvalidFieldTypeException.php +@@ -27,7 +27,7 @@ public function __construct( + $expectedType, + $operation, + $code = 0, +- Throwable $previous = null ++ ?Throwable $previous = null + ) + { + parent::__construct( +diff --git a/src/MissingFieldException.php b/src/MissingFieldException.php +index ab87967..d9e746e 100644 +--- a/src/MissingFieldException.php ++++ b/src/MissingFieldException.php +@@ -22,7 +22,7 @@ public function __construct( + $missingField, + $operation, + $code = 0, +- Throwable $previous = null ++ ?Throwable $previous = null + ) + { + parent::__construct('Missing "' . $missingField . '" in operation data', $code, $previous); +diff --git a/src/PatchTestOperationFailedException.php b/src/PatchTestOperationFailedException.php +index 7204b7c..d668110 100644 +--- a/src/PatchTestOperationFailedException.php ++++ b/src/PatchTestOperationFailedException.php +@@ -23,7 +23,7 @@ public function __construct( + $operation, + $actualValue, + $code = 0, +- Throwable $previous = null ++ ?Throwable $previous = null + ) + { + parent::__construct('Test operation ' . json_encode($operation, JSON_UNESCAPED_SLASHES) +diff --git a/src/PathException.php b/src/PathException.php +index 6d54fe4..2f2d6d4 100644 +--- a/src/PathException.php ++++ b/src/PathException.php +@@ -29,7 +29,7 @@ public function __construct( + $operation, + $field, + $code = 0, +- Throwable $previous = null ++ ?Throwable $previous = null + ) + { + parent::__construct($message, $code, $previous); +diff --git a/src/UnknownOperationException.php b/src/UnknownOperationException.php +index 8d35abb..c0357b7 100644 +--- a/src/UnknownOperationException.php ++++ b/src/UnknownOperationException.php +@@ -19,7 +19,7 @@ class UnknownOperationException extends Exception + public function __construct( + $operation, + $code = 0, +- Throwable $previous = null ++ ?Throwable $previous = null + ) + { + // @phpstan-ignore-next-line MissingFieldOperation will be thrown if op is not set diff --git a/tools/patches/swaggest-json-schema-php84.patch b/tools/patches/swaggest-json-schema-php84.patch new file mode 100644 index 00000000000..9a3e5eae980 --- /dev/null +++ b/tools/patches/swaggest-json-schema-php84.patch @@ -0,0 +1,159 @@ +diff --git a/src/Context.php b/src/Context.php +index c655dde..fff2862 100644 +--- a/src/Context.php ++++ b/src/Context.php +@@ -75,7 +75,7 @@ public function setSkipValidation($skipValidation = true) + * ProcessingOptions constructor. + * @param RemoteRefProvider $remoteRefProvider + */ +- public function __construct(RemoteRefProvider $remoteRefProvider = null) ++ public function __construct(?RemoteRefProvider $remoteRefProvider = null) + { + $this->remoteRefProvider = $remoteRefProvider; + } +diff --git a/src/RemoteRef/Preloaded.php b/src/RemoteRef/Preloaded.php +index e5b4a38..dc92937 100644 +--- a/src/RemoteRef/Preloaded.php ++++ b/src/RemoteRef/Preloaded.php +@@ -42,7 +42,7 @@ public function getSchemaData($url) + * @param Context|null $options + * @throws \Swaggest\JsonSchema\Exception + */ +- public function populateSchemas(RefResolver $refResolver, Context $options = null) ++ public function populateSchemas(RefResolver $refResolver, ?Context $options = null) + { + if ($options === null) { + $options = new Context(); +diff --git a/src/Schema.php b/src/Schema.php +index 6c1cee8..ff07f0c 100644 +--- a/src/Schema.php ++++ b/src/Schema.php +@@ -109,7 +109,7 @@ public function addPropertyMapping($dataName, $propertyName, $mapping = self::DE + * @throws InvalidValue + * @throws \Exception + */ +- public static function import($data, Context $options = null) ++ public static function import($data, ?Context $options = null) + { + if (null === $options) { + $options = new Context(); +@@ -148,7 +148,7 @@ public static function import($data, Context $options = null) + * @throws InvalidValue + * @throws \Exception + */ +- public function in($data, Context $options = null) ++ public function in($data, ?Context $options = null) + { + if (null !== $this->__booleanSchema) { + if ($this->__booleanSchema) { +@@ -187,7 +187,7 @@ public function in($data, Context $options = null) + * @throws InvalidValue + * @throws \Exception + */ +- public function out($data, Context $options = null) ++ public function out($data, ?Context $options = null) + { + if ($options === null) { + $options = new Context(); +@@ -1385,7 +1385,7 @@ public function getMeta($name) + * @param Context $options + * @return ObjectItemContract + */ +- public function makeObjectItem(Context $options = null) ++ public function makeObjectItem(?Context $options = null) + { + if (null === $this->objectItemClass) { + return new ObjectItem(); +diff --git a/src/SchemaContract.php b/src/SchemaContract.php +index a051305..bff1363 100644 +--- a/src/SchemaContract.php ++++ b/src/SchemaContract.php +@@ -22,7 +22,7 @@ public function process($data, Context $options, $path = '#', $result = null); + * @throws InvalidValue + * @return array|mixed|null|object|\stdClass + */ +- public function in($data, Context $options = null); ++ public function in($data, ?Context $options = null); + + /** + * @param mixed $data +@@ -30,7 +30,7 @@ public function in($data, Context $options = null); + * @throws InvalidValue + * @return array|mixed|null|object|\stdClass + */ +- public function out($data, Context $options = null); ++ public function out($data, ?Context $options = null); + + /** + * @return mixed +@@ -44,7 +44,7 @@ public function getProperties(); + * @param Context|null $options + * @return Structure\ObjectItemContract + */ +- public function makeObjectItem(Context $options = null); ++ public function makeObjectItem(?Context $options = null); + + /** + * @return string +diff --git a/src/Structure/ClassStructureTrait.php b/src/Structure/ClassStructureTrait.php +index c0bb6fc..393e65b 100644 +--- a/src/Structure/ClassStructureTrait.php ++++ b/src/Structure/ClassStructureTrait.php +@@ -55,7 +55,7 @@ public static function properties() + * @throws \Swaggest\JsonSchema\Exception + * @throws \Swaggest\JsonSchema\InvalidValue + */ +- public static function import($data, Context $options = null) ++ public static function import($data, ?Context $options = null) + { + return static::schema()->in($data, $options); + } +@@ -67,7 +67,7 @@ public static function import($data, Context $options = null) + * @throws \Swaggest\JsonSchema\InvalidValue + * @throws \Exception + */ +- public static function export($data, Context $options = null) ++ public static function export($data, ?Context $options = null) + { + return static::schema()->out($data, $options); + } +@@ -150,7 +150,7 @@ public function jsonSerialize() + /** + * @return static|NameMirror + */ +- public static function names(Properties $properties = null, $mapping = Schema::DEFAULT_MAPPING) ++ public static function names(?Properties $properties = null, $mapping = Schema::DEFAULT_MAPPING) + { + if ($properties !== null) { + return new NameMirror($properties->getDataKeyMap($mapping)); +diff --git a/src/Wrapper.php b/src/Wrapper.php +index 98946f6..421ec12 100644 +--- a/src/Wrapper.php ++++ b/src/Wrapper.php +@@ -53,7 +53,7 @@ public function process($data, Context $options, $path = '#', $result = null) + * @throws Exception + * @throws InvalidValue + */ +- public function in($data, Context $options = null) ++ public function in($data, ?Context $options = null) + { + return $this->schema->in($data, $options); + } +@@ -65,7 +65,7 @@ public function in($data, Context $options = null) + * @throws InvalidValue + * @throws \Exception + */ +- public function out($data, Context $options = null) ++ public function out($data, ?Context $options = null) + { + return $this->schema->out($data, $options); + } +@@ -199,7 +199,7 @@ public function getMeta($name) + * @param Context|null $options + * @return Structure\ObjectItemContract + */ +- public function makeObjectItem(Context $options = null) ++ public function makeObjectItem(?Context $options = null) + { + return $this->schema->makeObjectItem($options); + } diff --git a/tools/patches/symfony-cache-php84.patch b/tools/patches/symfony-cache-php84.patch new file mode 100644 index 00000000000..0d07c6da99f --- /dev/null +++ b/tools/patches/symfony-cache-php84.patch @@ -0,0 +1,35 @@ +diff --git a/Traits/Redis6ProxyTrait.php b/Traits/Redis6ProxyTrait.php +index d339e560c7..34f60cb102 100644 +--- a/Traits/Redis6ProxyTrait.php ++++ b/Traits/Redis6ProxyTrait.php +@@ -11,7 +11,7 @@ + + namespace Symfony\Component\Cache\Traits; + +-if (version_compare(phpversion('redis'), '6.1.0', '>=')) { ++if (version_compare(phpversion('redis'), '6.1.0-dev', '>=')) { + /** + * @internal + */ +@@ -27,7 +27,7 @@ if (version_compare(phpversion('redis'), '6.1.0', '>=')) { + return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hRandField(...\func_get_args()); + } + +- public function hSet($key, $fields_and_vals): \Redis|false|int ++ public function hSet($key, ...$fields_and_vals): \Redis|false|int + { + return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->hSet(...\func_get_args()); + } +diff --git a/Traits/RedisCluster6ProxyTrait.php b/Traits/RedisCluster6ProxyTrait.php +index 7addffb97c..9c3169e323 100644 +--- a/Traits/RedisCluster6ProxyTrait.php ++++ b/Traits/RedisCluster6ProxyTrait.php +@@ -11,7 +11,7 @@ + + namespace Symfony\Component\Cache\Traits; + +-if (version_compare(phpversion('redis'), '6.1.0', '>')) { ++if (version_compare(phpversion('redis'), '6.1.0-dev', '>')) { + /** + * @internal + */ diff --git a/tools/patches/wapmorgan-unified-archive-php84.patch b/tools/patches/wapmorgan-unified-archive-php84.patch new file mode 100644 index 00000000000..e0d95fee8fb --- /dev/null +++ b/tools/patches/wapmorgan-unified-archive-php84.patch @@ -0,0 +1,13 @@ +diff --git a/src/Drivers/OneFile/OneFileDriver.php b/src/Drivers/OneFile/OneFileDriver.php +index fee038b..96a1e00 100644 +--- a/src/Drivers/OneFile/OneFileDriver.php ++++ b/src/Drivers/OneFile/OneFileDriver.php +@@ -110,7 +110,7 @@ public function getFileData($fileName) + * @return int + * @throws ArchiveExtractionException + */ +- public function extractFiles($outputFolder, array $files = null) ++ public function extractFiles($outputFolder, ?array $files = null) + { + return $this->extractArchive($outputFolder); + }