1
0
Fork 0

Fix phpstan issues, update baseline and pin PHPStan version in 2.2 branch (#10474)

pull/10477/head
Jordi Boggiano 2022-01-21 12:48:16 +01:00 committed by GitHub
parent e103ee0249
commit e3d99cac59
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
24 changed files with 118 additions and 182 deletions

View File

@ -51,7 +51,7 @@ jobs:
- name: "Install PHPStan" - name: "Install PHPStan"
# Locked to phpunit 7.5 here as newer ones have void return types which break inheritance # Locked to phpunit 7.5 here as newer ones have void return types which break inheritance
run: "bin/composer require --dev phpstan/phpstan:^1.0 phpstan/phpstan-phpunit:^1.0 phpstan/phpstan-deprecation-rules:^1 phpstan/phpstan-strict-rules:^1 phpunit/phpunit:^7.5.20 --with-all-dependencies ${{ env.COMPOSER_FLAGS }}" run: "bin/composer require --dev phpstan/phpstan:1.4.* phpstan/phpstan-phpunit:1.0.* phpstan/phpstan-deprecation-rules:1.0.* phpstan/phpstan-strict-rules:1.1.* phpunit/phpunit:^7.5.20 --with-all-dependencies ${{ env.COMPOSER_FLAGS }}"
- name: "Run PHPStan" - name: "Run PHPStan"
run: "vendor/bin/phpstan analyse --configuration=phpstan/config.neon" run: "vendor/bin/phpstan analyse --configuration=phpstan/config.neon"

View File

@ -83,7 +83,7 @@
"phpstan-setup": [ "phpstan-setup": [
"@composer config platform --unset", "@composer config platform --unset",
"@composer update", "@composer update",
"@composer require --dev phpstan/phpstan:^1.0 phpstan/phpstan-phpunit:^1.0 phpstan/phpstan-deprecation-rules:^1 phpstan/phpstan-strict-rules:^1 phpunit/phpunit:^7.5.20 --with-all-dependencies", "@composer require --dev phpstan/phpstan:1.4.* phpstan/phpstan-phpunit:1.0.* phpstan/phpstan-deprecation-rules:1.0.* phpstan/phpstan-strict-rules:1.1.* phpunit/phpunit:^7.5.20 --with-all-dependencies",
"git checkout composer.json composer.lock" "git checkout composer.json composer.lock"
], ],
"phpstan": "@php vendor/bin/phpstan analyse --configuration=phpstan/config.neon" "phpstan": "@php vendor/bin/phpstan analyse --configuration=phpstan/config.neon"

View File

@ -1,10 +1,5 @@
parameters: parameters:
ignoreErrors: ignoreErrors:
-
message: "#^Argument of an invalid type array\\<string\\>\\|string supplied for foreach, only iterables are supported\\.$#"
count: 1
path: ../src/Composer/Autoload/AutoloadGenerator.php
- -
message: "#^Binary operation \"\\.\" between non\\-empty\\-string and array\\|string\\|null results in an error\\.$#" message: "#^Binary operation \"\\.\" between non\\-empty\\-string and array\\|string\\|null results in an error\\.$#"
count: 1 count: 1
@ -110,11 +105,6 @@ parameters:
count: 3 count: 3
path: ../src/Composer/Autoload/AutoloadGenerator.php path: ../src/Composer/Autoload/AutoloadGenerator.php
-
message: "#^Parameter \\#1 \\$files of method Composer\\\\Autoload\\\\AutoloadGenerator\\:\\:getIncludeFilesFile\\(\\) expects array\\<string, string\\>, array\\<int\\|string, array\\<string\\>\\|string\\> given\\.$#"
count: 1
path: ../src/Composer/Autoload/AutoloadGenerator.php
- -
message: "#^Parameter \\#1 \\$from of method Composer\\\\Util\\\\Filesystem\\:\\:findShortestPathCode\\(\\) expects string, string\\|false given\\.$#" message: "#^Parameter \\#1 \\$from of method Composer\\\\Util\\\\Filesystem\\:\\:findShortestPathCode\\(\\) expects string, string\\|false given\\.$#"
count: 5 count: 5
@ -165,11 +155,6 @@ parameters:
count: 1 count: 1
path: ../src/Composer/Autoload/AutoloadGenerator.php path: ../src/Composer/Autoload/AutoloadGenerator.php
-
message: "#^Parameter \\#6 \\$namespaceFilter of method Composer\\\\Autoload\\\\AutoloadGenerator\\:\\:addClassMapCode\\(\\) expects string\\|null, int\\|string given\\.$#"
count: 1
path: ../src/Composer/Autoload/AutoloadGenerator.php
- -
message: "#^Short ternary operator is not allowed\\. Use null coalesce operator if applicable or consider using long ternary\\.$#" message: "#^Short ternary operator is not allowed\\. Use null coalesce operator if applicable or consider using long ternary\\.$#"
count: 2 count: 2
@ -1175,6 +1160,11 @@ parameters:
count: 1 count: 1
path: ../src/Composer/Command/InitCommand.php path: ../src/Composer/Command/InitCommand.php
-
message: "#^Property Composer\\\\Command\\\\InitCommand\\:\\:\\$gitConfig \\(array\\<string, string\\>\\) does not accept array\\<int\\|string, mixed\\>\\.$#"
count: 1
path: ../src/Composer/Command/InitCommand.php
- -
message: "#^Short ternary operator is not allowed\\. Use null coalesce operator if applicable or consider using long ternary\\.$#" message: "#^Short ternary operator is not allowed\\. Use null coalesce operator if applicable or consider using long ternary\\.$#"
count: 15 count: 15
@ -2485,11 +2475,6 @@ parameters:
count: 1 count: 1
path: ../src/Composer/Config.php path: ../src/Composer/Config.php
-
message: "#^Array \\(array\\<string, true\\>\\) does not accept key 0\\|string\\.$#"
count: 1
path: ../src/Composer/Config.php
- -
message: "#^Call to function array_search\\(\\) requires parameter \\#3 to be set\\.$#" message: "#^Call to function array_search\\(\\) requires parameter \\#3 to be set\\.$#"
count: 1 count: 1
@ -3005,11 +2990,6 @@ parameters:
count: 2 count: 2
path: ../src/Composer/DependencyResolver/Rule.php path: ../src/Composer/DependencyResolver/Rule.php
-
message: "#^Array \\(array\\<string, array\\<Composer\\\\DependencyResolver\\\\Rule\\>\\|Composer\\\\DependencyResolver\\\\Rule\\>\\) does not accept key int\\|string\\.$#"
count: 2
path: ../src/Composer/DependencyResolver/RuleSet.php
- -
message: "#^Method Composer\\\\DependencyResolver\\\\RuleSet\\:\\:getTypes\\(\\) should return array\\{0, 1, 4\\} but returns array\\<int, 0\\|1\\|4\\>\\.$#" message: "#^Method Composer\\\\DependencyResolver\\\\RuleSet\\:\\:getTypes\\(\\) should return array\\{0, 1, 4\\} but returns array\\<int, 0\\|1\\|4\\>\\.$#"
count: 1 count: 1
@ -3080,11 +3060,6 @@ parameters:
count: 1 count: 1
path: ../src/Composer/DependencyResolver/Solver.php path: ../src/Composer/DependencyResolver/Solver.php
-
message: "#^Casting to int something that's already int\\.$#"
count: 2
path: ../src/Composer/DependencyResolver/Solver.php
- -
message: "#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#" message: "#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#"
count: 2 count: 2
@ -3100,11 +3075,6 @@ parameters:
count: 1 count: 1
path: ../src/Composer/DependencyResolver/Solver.php path: ../src/Composer/DependencyResolver/Solver.php
-
message: "#^Only booleans are allowed in &&, int given on the left side\\.$#"
count: 1
path: ../src/Composer/DependencyResolver/Solver.php
- -
message: "#^Only booleans are allowed in &&, int\\<0, max\\> given on the right side\\.$#" message: "#^Only booleans are allowed in &&, int\\<0, max\\> given on the right side\\.$#"
count: 2 count: 2
@ -3127,7 +3097,7 @@ parameters:
- -
message: "#^Only booleans are allowed in a negated boolean, int given\\.$#" message: "#^Only booleans are allowed in a negated boolean, int given\\.$#"
count: 3 count: 1
path: ../src/Composer/DependencyResolver/Solver.php path: ../src/Composer/DependencyResolver/Solver.php
- -
@ -3980,11 +3950,6 @@ parameters:
count: 5 count: 5
path: ../src/Composer/Factory.php path: ../src/Composer/Factory.php
-
message: "#^Array \\(array\\<string, array\\{username\\: string, password\\: string\\}\\>\\) does not accept array\\{username\\: string, password\\: string\\|null\\}\\.$#"
count: 1
path: ../src/Composer/IO/BaseIO.php
- -
message: "#^Call to function in_array\\(\\) requires parameter \\#3 to be set\\.$#" message: "#^Call to function in_array\\(\\) requires parameter \\#3 to be set\\.$#"
count: 1 count: 1
@ -4050,11 +4015,6 @@ parameters:
count: 1 count: 1
path: ../src/Composer/IO/ConsoleIO.php path: ../src/Composer/IO/ConsoleIO.php
-
message: "#^Array \\(array\\<string, array\\<string, array\\<string, array\\<array\\<string\\>\\|bool\\|string\\>\\|bool\\|string\\>\\>\\>\\) does not accept key \\(int\\|string\\)\\.$#"
count: 1
path: ../src/Composer/InstalledVersions.php
- -
message: "#^Call to function method_exists\\(\\) with 'Composer\\\\\\\\Autoload…' and 'getRegisteredLoaders' will always evaluate to true\\.$#" message: "#^Call to function method_exists\\(\\) with 'Composer\\\\\\\\Autoload…' and 'getRegisteredLoaders' will always evaluate to true\\.$#"
count: 1 count: 1
@ -4085,11 +4045,6 @@ parameters:
count: 15 count: 15
path: ../src/Composer/Installer.php path: ../src/Composer/Installer.php
-
message: "#^Method Composer\\\\Installer\\:\\:run\\(\\) should return 0\\|1\\|2\\|3\\|4 but returns int\\<min, \\-1\\>\\|int\\<1, max\\>\\.$#"
count: 1
path: ../src/Composer/Installer.php
- -
message: "#^Only booleans are allowed in &&, array\\<array\\<string, string\\>\\> given on the right side\\.$#" message: "#^Only booleans are allowed in &&, array\\<array\\<string, string\\>\\> given on the right side\\.$#"
count: 1 count: 1
@ -4150,11 +4105,6 @@ parameters:
count: 1 count: 1
path: ../src/Composer/Installer.php path: ../src/Composer/Installer.php
-
message: "#^Only booleans are allowed in an if condition, int given\\.$#"
count: 1
path: ../src/Composer/Installer.php
- -
message: "#^Only booleans are allowed in \\|\\|, array\\<string\\>\\|null given on the left side\\.$#" message: "#^Only booleans are allowed in \\|\\|, array\\<string\\>\\|null given on the left side\\.$#"
count: 2 count: 2
@ -4235,6 +4185,11 @@ parameters:
count: 2 count: 2
path: ../src/Composer/Installer/InstallationManager.php path: ../src/Composer/Installer/InstallationManager.php
-
message: "#^Constant PHP_WINDOWS_EVENT_CTRL_C not found\\.$#"
count: 1
path: ../src/Composer/Installer/InstallationManager.php
- -
message: "#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#" message: "#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#"
count: 1 count: 1
@ -4245,6 +4200,11 @@ parameters:
count: 2 count: 2
path: ../src/Composer/Installer/InstallationManager.php path: ../src/Composer/Installer/InstallationManager.php
-
message: "#^Function sapi_windows_set_ctrl_handler not found\\.$#"
count: 3
path: ../src/Composer/Installer/InstallationManager.php
- -
message: "#^Only booleans are allowed in &&, Composer\\\\EventDispatcher\\\\EventDispatcher\\|null given on the right side\\.$#" message: "#^Only booleans are allowed in &&, Composer\\\\EventDispatcher\\\\EventDispatcher\\|null given on the right side\\.$#"
count: 2 count: 2
@ -4450,11 +4410,6 @@ parameters:
count: 1 count: 1
path: ../src/Composer/Json/JsonFile.php path: ../src/Composer/Json/JsonFile.php
-
message: "#^Only booleans are allowed in an if condition, int given\\.$#"
count: 1
path: ../src/Composer/Json/JsonFile.php
- -
message: "#^Parameter \\#1 \\$json of function json_decode expects string, string\\|false given\\.$#" message: "#^Parameter \\#1 \\$json of function json_decode expects string, string\\|false given\\.$#"
count: 1 count: 1
@ -4625,11 +4580,6 @@ parameters:
count: 1 count: 1
path: ../src/Composer/Package/BasePackage.php path: ../src/Composer/Package/BasePackage.php
-
message: "#^Method Composer\\\\Package\\\\Comparer\\\\Comparer\\:\\:getChanged\\(\\) should return array\\{changed\\?\\: array\\<string\\>, removed\\?\\: array\\<string\\>, added\\?\\: array\\<string\\>\\}\\|string\\|false but returns \\(non\\-empty\\-array\\<literal\\-string&non\\-empty\\-string, array\\<string\\>\\>\\)\\|string\\.$#"
count: 1
path: ../src/Composer/Package/Comparer/Comparer.php
- -
message: "#^Only booleans are allowed in &&, int\\<0, max\\>\\|false given on the right side\\.$#" message: "#^Only booleans are allowed in &&, int\\<0, max\\>\\|false given on the right side\\.$#"
count: 1 count: 1
@ -5115,11 +5065,6 @@ parameters:
count: 1 count: 1
path: ../src/Composer/Platform/Runtime.php path: ../src/Composer/Platform/Runtime.php
-
message: "#^Array \\(array\\<string, Composer\\\\Plugin\\\\PluginInterface\\>\\) does not accept object\\.$#"
count: 2
path: ../src/Composer/Plugin/PluginManager.php
- -
message: "#^Cannot call method getInstallationManager\\(\\) on Composer\\\\Composer\\|null\\.$#" message: "#^Cannot call method getInstallationManager\\(\\) on Composer\\\\Composer\\|null\\.$#"
count: 1 count: 1
@ -5195,21 +5140,11 @@ parameters:
count: 1 count: 1
path: ../src/Composer/Plugin/PluginManager.php path: ../src/Composer/Plugin/PluginManager.php
-
message: "#^Parameter \\#1 \\$installer of method Composer\\\\Installer\\\\InstallationManager\\:\\:addInstaller\\(\\) expects Composer\\\\Installer\\\\InstallerInterface, object given\\.$#"
count: 1
path: ../src/Composer/Plugin/PluginManager.php
- -
message: "#^Parameter \\#1 \\$path of function dirname expects string, string\\|false given\\.$#" message: "#^Parameter \\#1 \\$path of function dirname expects string, string\\|false given\\.$#"
count: 1 count: 1
path: ../src/Composer/Plugin/PluginManager.php path: ../src/Composer/Plugin/PluginManager.php
-
message: "#^Parameter \\#1 \\$plugin of method Composer\\\\Plugin\\\\PluginManager\\:\\:addPlugin\\(\\) expects Composer\\\\Plugin\\\\PluginInterface, object given\\.$#"
count: 1
path: ../src/Composer/Plugin/PluginManager.php
- -
message: "#^Parameter \\#3 \\$subject of static method Composer\\\\Pcre\\\\Preg\\:\\:replace\\(\\) expects string, string\\|false given\\.$#" message: "#^Parameter \\#3 \\$subject of static method Composer\\\\Pcre\\\\Preg\\:\\:replace\\(\\) expects string, string\\|false given\\.$#"
count: 1 count: 1
@ -5275,11 +5210,6 @@ parameters:
count: 3 count: 3
path: ../src/Composer/Repository/ComposerRepository.php path: ../src/Composer/Repository/ComposerRepository.php
-
message: "#^Argument of an invalid type array\\<string, Composer\\\\Package\\\\PackageInterface\\>\\|null supplied for foreach, only iterables are supported\\.$#"
count: 1
path: ../src/Composer/Repository/ComposerRepository.php
- -
message: "#^Cannot access offset 'path' on array\\{scheme\\?\\: string, host\\?\\: string, port\\?\\: int, user\\?\\: string, pass\\?\\: string, path\\?\\: string, query\\?\\: string, fragment\\?\\: string\\}\\|false\\.$#" message: "#^Cannot access offset 'path' on array\\{scheme\\?\\: string, host\\?\\: string, port\\?\\: int, user\\?\\: string, pass\\?\\: string, path\\?\\: string, query\\?\\: string, fragment\\?\\: string\\}\\|false\\.$#"
count: 1 count: 1
@ -5420,11 +5350,6 @@ parameters:
count: 1 count: 1
path: ../src/Composer/Repository/ComposerRepository.php path: ../src/Composer/Repository/ComposerRepository.php
-
message: "#^Only booleans are allowed in an if condition, int given\\.$#"
count: 1
path: ../src/Composer/Repository/ComposerRepository.php
- -
message: "#^Only booleans are allowed in an if condition, string\\|false given\\.$#" message: "#^Only booleans are allowed in an if condition, string\\|false given\\.$#"
count: 3 count: 3
@ -5445,11 +5370,6 @@ parameters:
count: 1 count: 1
path: ../src/Composer/Repository/ComposerRepository.php path: ../src/Composer/Repository/ComposerRepository.php
-
message: "#^Parameter \\#1 \\$input of function array_values expects array, array\\<string, Composer\\\\Package\\\\PackageInterface\\>\\|null given\\.$#"
count: 1
path: ../src/Composer/Repository/ComposerRepository.php
- -
message: "#^Parameter \\#1 \\$json of function json_decode expects string, string\\|false given\\.$#" message: "#^Parameter \\#1 \\$json of function json_decode expects string, string\\|false given\\.$#"
count: 3 count: 3
@ -5920,11 +5840,6 @@ parameters:
count: 1 count: 1
path: ../src/Composer/Repository/Vcs/GitDriver.php path: ../src/Composer/Repository/Vcs/GitDriver.php
-
message: "#^Property Composer\\\\Repository\\\\Vcs\\\\GitDriver\\:\\:\\$branches \\(array\\<string, string\\>\\) does not accept array\\<int\\|string, mixed\\>\\.$#"
count: 1
path: ../src/Composer/Repository/Vcs/GitDriver.php
- -
message: "#^Call to function array_search\\(\\) requires parameter \\#3 to be set\\.$#" message: "#^Call to function array_search\\(\\) requires parameter \\#3 to be set\\.$#"
count: 2 count: 2
@ -6725,11 +6640,6 @@ parameters:
count: 2 count: 2
path: ../src/Composer/Util/Hg.php path: ../src/Composer/Util/Hg.php
-
message: "#^Array \\(array\\<array\\{url\\: string, origin\\: string, attributes\\: array\\{retryAuthFailure\\: bool, redirects\\: int, retries\\: int, storeAuth\\: bool\\}, options\\: array, progress\\: array, curlHandle\\: resource, filename\\: string\\|false, headerHandle\\: resource, \\.\\.\\.\\}\\>\\) does not accept array\\{url\\: string, origin\\: string, attributes\\: non\\-empty\\-array\\<literal\\-string&non\\-empty\\-string, bool\\|int\\>, options\\: array, progress\\: array, curlHandle\\: resource, filename\\: string\\|null, headerHandle\\: resource\\|false, \\.\\.\\.\\}\\.$#"
count: 1
path: ../src/Composer/Util/Http/CurlDownloader.php
- -
message: "#^Call to function in_array\\(\\) requires parameter \\#3 to be set\\.$#" message: "#^Call to function in_array\\(\\) requires parameter \\#3 to be set\\.$#"
count: 1 count: 1
@ -6920,6 +6830,11 @@ parameters:
count: 1 count: 1
path: ../src/Composer/Util/Http/CurlDownloader.php path: ../src/Composer/Util/Http/CurlDownloader.php
-
message: "#^Property Composer\\\\Util\\\\Http\\\\CurlDownloader\\:\\:\\$jobs \\(array\\<array\\{url\\: string, origin\\: string, attributes\\: array\\{retryAuthFailure\\: bool, redirects\\: int, retries\\: int, storeAuth\\: bool\\}, options\\: array, progress\\: array, curlHandle\\: resource, filename\\: string\\|false, headerHandle\\: resource, \\.\\.\\.\\}\\>\\) does not accept non\\-empty\\-array\\<array\\{url\\: string, origin\\: string, attributes\\: array\\<literal\\-string&non\\-empty\\-string, bool\\|int\\>, options\\: array, progress\\: array, curlHandle\\: resource, filename\\: string\\|false\\|null, headerHandle\\: resource, \\.\\.\\.\\}\\>\\.$#"
count: 1
path: ../src/Composer/Util/Http/CurlDownloader.php
- -
message: "#^Property Composer\\\\Util\\\\Http\\\\CurlDownloader\\:\\:\\$multiHandle \\(resource\\|null\\) does not accept resource\\|false\\.$#" message: "#^Property Composer\\\\Util\\\\Http\\\\CurlDownloader\\:\\:\\$multiHandle \\(resource\\|null\\) does not accept resource\\|false\\.$#"
count: 1 count: 1
@ -7155,11 +7070,6 @@ parameters:
count: 2 count: 2
path: ../src/Composer/Util/Loop.php path: ../src/Composer/Util/Loop.php
-
message: "#^Cannot access offset int\\<min, 16\\> on array\\|false\\.$#"
count: 6
path: ../src/Composer/Util/NoProxyPattern.php
- -
message: "#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#" message: "#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#"
count: 2 count: 2
@ -7345,11 +7255,6 @@ parameters:
count: 1 count: 1
path: ../src/Composer/Util/ProcessExecutor.php path: ../src/Composer/Util/ProcessExecutor.php
-
message: "#^Only booleans are allowed in &&, Composer\\\\IO\\\\IOInterface\\|null given on the left side\\.$#"
count: 2
path: ../src/Composer/Util/ProcessExecutor.php
- -
message: "#^Only booleans are allowed in &&, string\\|false given on the right side\\.$#" message: "#^Only booleans are allowed in &&, string\\|false given on the right side\\.$#"
count: 2 count: 2
@ -7370,9 +7275,14 @@ parameters:
count: 1 count: 1
path: ../src/Composer/Util/ProcessExecutor.php path: ../src/Composer/Util/ProcessExecutor.php
-
message: "#^Property Composer\\\\Util\\\\ProcessExecutor\\:\\:\\$jobs \\(array\\<int, array\\<string, mixed\\>\\>\\) does not accept array\\<int\\|string, array\\<string, mixed\\>\\>\\.$#"
count: 1
path: ../src/Composer/Util/ProcessExecutor.php
- -
message: "#^Short ternary operator is not allowed\\. Use null coalesce operator if applicable or consider using long ternary\\.$#" message: "#^Short ternary operator is not allowed\\. Use null coalesce operator if applicable or consider using long ternary\\.$#"
count: 2 count: 1
path: ../src/Composer/Util/ProcessExecutor.php path: ../src/Composer/Util/ProcessExecutor.php
- -
@ -8226,13 +8136,7 @@ parameters:
path: ../tests/Composer/Test/EventDispatcher/EventDispatcherTest.php path: ../tests/Composer/Test/EventDispatcher/EventDispatcherTest.php
- -
message: "#^Call to function is_array\\(\\) with array\\<string, array\\{username\\: string, password\\: string\\}\\> will always evaluate to true\\.$#" message: """
count: 1
path: ../tests/Composer/Test/IO/NullIOTest.php
-
message:
"""
#^Call to deprecated method getRawData\\(\\) of class Composer\\\\InstalledVersions\\: #^Call to deprecated method getRawData\\(\\) of class Composer\\\\InstalledVersions\\:
Use getAllRawData\\(\\) instead which returns all datasets for all autoloaders present in the process\\. getRawData only returns the first dataset loaded, which may not be what you expect\\.$# Use getAllRawData\\(\\) instead which returns all datasets for all autoloaders present in the process\\. getRawData only returns the first dataset loaded, which may not be what you expect\\.$#
""" """
@ -8684,11 +8588,6 @@ parameters:
count: 1 count: 1
path: ../tests/Composer/Test/Platform/VersionTest.php path: ../tests/Composer/Test/Platform/VersionTest.php
-
message: "#^Array \\(array\\<Composer\\\\Package\\\\CompletePackage\\>\\) does not accept Composer\\\\Package\\\\CompleteAliasPackage\\|Composer\\\\Package\\\\CompletePackage\\.$#"
count: 1
path: ../tests/Composer/Test/Plugin/PluginInstallerTest.php
- -
message: "#^Call to method PHPUnit\\\\Framework\\\\Assert\\:\\:assertInstanceOf\\(\\) with 'Composer\\\\\\\\Command…' and Composer\\\\Command\\\\BaseCommand will always evaluate to true\\.$#" message: "#^Call to method PHPUnit\\\\Framework\\\\Assert\\:\\:assertInstanceOf\\(\\) with 'Composer\\\\\\\\Command…' and Composer\\\\Command\\\\BaseCommand will always evaluate to true\\.$#"
count: 1 count: 1

View File

@ -606,6 +606,7 @@ class Config
} }
if ($io) { if ($io) {
$host = parse_url($url, PHP_URL_HOST); $host = parse_url($url, PHP_URL_HOST);
if (is_string($host)) {
if (!isset($this->warnedHosts[$host])) { if (!isset($this->warnedHosts[$host])) {
$io->writeError("<warning>Warning: Accessing $host over $scheme which is an insecure protocol.</warning>"); $io->writeError("<warning>Warning: Accessing $host over $scheme which is an insecure protocol.</warning>");
} }
@ -613,6 +614,7 @@ class Config
} }
} }
} }
}
/** /**
* Used by long-running custom scripts in composer.json * Used by long-running custom scripts in composer.json

View File

@ -45,7 +45,7 @@ class RuleSet implements \IteratorAggregate, \Countable
/** @var int */ /** @var int */
protected $nextRuleId = 0; protected $nextRuleId = 0;
/** @var array<string, Rule|Rule[]> */ /** @var array<int|string, Rule|Rule[]> */
protected $rulesByHash = array(); protected $rulesByHash = array();
public function __construct() public function __construct()

View File

@ -324,7 +324,7 @@ class Solver
if ($newLevel <= 0 || $newLevel >= $level) { if ($newLevel <= 0 || $newLevel >= $level) {
throw new SolverBugException( throw new SolverBugException(
"Trying to revert to invalid level ".(int) $newLevel." from level ".(int) $level."." "Trying to revert to invalid level ".$newLevel." from level ".$level."."
); );
} }
@ -423,7 +423,7 @@ class Solver
while ($l1retry) { while ($l1retry) {
$l1retry = false; $l1retry = false;
if (!$num && !--$l1num) { if (0 === $num && 0 === --$l1num) {
// all level 1 literals done // all level 1 literals done
break 2; break 2;
} }
@ -447,7 +447,7 @@ class Solver
unset($seen[abs($literal)]); unset($seen[abs($literal)]);
if ($num && 0 === --$num) { if (0 !== $num && 0 === --$num) {
if ($literal < 0) { if ($literal < 0) {
$this->testFlagLearnedPositiveLiteral = true; $this->testFlagLearnedPositiveLiteral = true;
} }

View File

@ -19,7 +19,7 @@ use Psr\Log\LogLevel;
abstract class BaseIO implements IOInterface abstract class BaseIO implements IOInterface
{ {
/** @var array<string, array{username: string, password: string}> */ /** @var array<string, array{username: string|null, password: string|null}> */
protected $authentications = array(); protected $authentications = array();
/** /**

View File

@ -198,7 +198,7 @@ interface IOInterface extends LoggerInterface
/** /**
* Get all authentication information entered. * Get all authentication information entered.
* *
* @return array<string, array{username: string, password: string}> The map of authentication data * @return array<string, array{username: string|null, password: string|null}> The map of authentication data
*/ */
public function getAuthentications(); public function getAuthentications();

View File

@ -354,7 +354,7 @@ class Installer
$fundingCount++; $fundingCount++;
} }
} }
if ($fundingCount) { if ($fundingCount > 0) {
$this->io->writeError(array( $this->io->writeError(array(
sprintf( sprintf(
"<info>%d package%s you are using %s looking for funding.</info>", "<info>%d package%s you are using %s looking for funding.</info>",

View File

@ -149,7 +149,7 @@ class JsonFile
$this->filePutContentsIfModified($this->path, static::encode($hash, $options). ($options & self::JSON_PRETTY_PRINT ? "\n" : '')); $this->filePutContentsIfModified($this->path, static::encode($hash, $options). ($options & self::JSON_PRETTY_PRINT ? "\n" : ''));
break; break;
} catch (\Exception $e) { } catch (\Exception $e) {
if ($retries) { if ($retries > 0) {
usleep(500000); usleep(500000);
continue; continue;
} }

View File

@ -67,12 +67,13 @@ class Comparer
} }
if ($toString) { if ($toString) {
$strings = array();
foreach ($changed as $sectionKey => $itemSection) { foreach ($changed as $sectionKey => $itemSection) {
foreach ($itemSection as $itemKey => $item) { foreach ($itemSection as $itemKey => $item) {
$changed['string'][] = $item."\r\n"; $strings[] = $item."\r\n";
} }
} }
$changed = implode("\r\n", $changed['string']); $changed = implode("\r\n", $strings);
} }
return $changed; return $changed;

View File

@ -251,7 +251,7 @@ class VersionGuesser
// re-use the HgDriver to fetch branches (this properly includes bookmarks) // re-use the HgDriver to fetch branches (this properly includes bookmarks)
$io = new NullIO(); $io = new NullIO();
$driver = new HgDriver(array('url' => $path), $io, $this->config, new HttpDownloader($io, $this->config), $this->process); $driver = new HgDriver(array('url' => $path), $io, $this->config, new HttpDownloader($io, $this->config), $this->process);
$branches = array_keys($driver->getBranches()); $branches = array_map('strval', array_keys($driver->getBranches()));
// try to find the best (nearest) version branch to assume this feature's version // try to find the best (nearest) version branch to assume this feature's version
$result = $this->guessFeatureVersion($packageConfig, $version, $branches, 'hg log -r "not ancestors(\'%candidate%\') and ancestors(\'%branch%\')" --template "{node}\\n"', $path); $result = $this->guessFeatureVersion($packageConfig, $version, $branches, 'hg log -r "not ancestors(\'%candidate%\') and ancestors(\'%branch%\')" --template "{node}\\n"', $path);

View File

@ -14,6 +14,7 @@ namespace Composer\Plugin;
use Composer\Composer; use Composer\Composer;
use Composer\EventDispatcher\EventSubscriberInterface; use Composer\EventDispatcher\EventSubscriberInterface;
use Composer\Installer\InstallerInterface;
use Composer\IO\IOInterface; use Composer\IO\IOInterface;
use Composer\Package\BasePackage; use Composer\Package\BasePackage;
use Composer\Package\CompletePackage; use Composer\Package\CompletePackage;
@ -50,7 +51,7 @@ class PluginManager
/** @var array<PluginInterface> */ /** @var array<PluginInterface> */
protected $plugins = array(); protected $plugins = array();
/** @var array<string, PluginInterface> */ /** @var array<string, PluginInterface|InstallerInterface> */
protected $registeredPlugins = array(); protected $registeredPlugins = array();
/** /**
@ -284,11 +285,17 @@ class PluginManager
} }
if ($oldInstallerPlugin) { if ($oldInstallerPlugin) {
if (!is_a($class, 'Composer\Installer\InstallerInterface', true)) {
throw new \RuntimeException('Could not activate plugin "'.$package->getName().'" as "'.$class.'" does not implement Composer\Installer\InstallerInterface');
}
$this->io->writeError('<warning>Loading "'.$package->getName() . '" '.($isGlobalPlugin ? '(installed globally) ' : '').'which is a legacy composer-installer built for Composer 1.x, it is likely to cause issues as you are running Composer 2.x.</warning>'); $this->io->writeError('<warning>Loading "'.$package->getName() . '" '.($isGlobalPlugin ? '(installed globally) ' : '').'which is a legacy composer-installer built for Composer 1.x, it is likely to cause issues as you are running Composer 2.x.</warning>');
$installer = new $class($this->io, $this->composer); $installer = new $class($this->io, $this->composer);
$this->composer->getInstallationManager()->addInstaller($installer); $this->composer->getInstallationManager()->addInstaller($installer);
$this->registeredPlugins[$package->getName()] = $installer; $this->registeredPlugins[$package->getName()] = $installer;
} elseif (class_exists($class)) { } elseif (class_exists($class)) {
if (!is_a($class, 'Composer\Plugin\PluginInterface', true)) {
throw new \RuntimeException('Could not activate plugin "'.$package->getName().'" as "'.$class.'" does not implement Composer\Plugin\PluginInterface');
}
$plugin = new $class(); $plugin = new $class();
$this->addPlugin($plugin, $isGlobalPlugin, $package); $this->addPlugin($plugin, $isGlobalPlugin, $package);
$this->registeredPlugins[$package->getName()] = $plugin; $this->registeredPlugins[$package->getName()] = $plugin;
@ -316,20 +323,15 @@ class PluginManager
return; return;
} }
$oldInstallerPlugin = ($package->getType() === 'composer-installer');
if (!isset($this->registeredPlugins[$package->getName()])) { if (!isset($this->registeredPlugins[$package->getName()])) {
return; return;
} }
if ($oldInstallerPlugin) {
/** @var \Composer\Installer\InstallerInterface $installer */
$installer = $this->registeredPlugins[$package->getName()];
unset($this->registeredPlugins[$package->getName()]);
$this->composer->getInstallationManager()->removeInstaller($installer);
} else {
$plugin = $this->registeredPlugins[$package->getName()]; $plugin = $this->registeredPlugins[$package->getName()];
unset($this->registeredPlugins[$package->getName()]); unset($this->registeredPlugins[$package->getName()]);
if ($plugin instanceof InstallerInterface) {
$this->composer->getInstallationManager()->removeInstaller($plugin);
} else {
$this->removePlugin($plugin); $this->removePlugin($plugin);
} }
} }
@ -352,16 +354,14 @@ class PluginManager
return; return;
} }
$oldInstallerPlugin = ($package->getType() === 'composer-installer');
if (!isset($this->registeredPlugins[$package->getName()])) { if (!isset($this->registeredPlugins[$package->getName()])) {
return; return;
} }
if ($oldInstallerPlugin) { $plugin = $this->registeredPlugins[$package->getName()];
if ($plugin instanceof InstallerInterface) {
$this->deactivatePackage($package); $this->deactivatePackage($package);
} else { } else {
$plugin = $this->registeredPlugins[$package->getName()];
unset($this->registeredPlugins[$package->getName()]); unset($this->registeredPlugins[$package->getName()]);
$this->removePlugin($plugin); $this->removePlugin($plugin);
$this->uninstallPlugin($plugin); $this->uninstallPlugin($plugin);

View File

@ -210,12 +210,13 @@ class ArrayRepository implements RepositoryInterface
/** /**
* Adds a new package to the repository * Adds a new package to the repository
* *
* @param PackageInterface $package
*
* @return void * @return void
*/ */
public function addPackage(PackageInterface $package) public function addPackage(PackageInterface $package)
{ {
if (!$package instanceof BasePackage) {
throw new \InvalidArgumentException('Only subclasses of BasePackage are supported');
}
if (null === $this->packages) { if (null === $this->packages) {
$this->initialize(); $this->initialize();
} }

View File

@ -102,7 +102,7 @@ class ComposerRepository extends ArrayRepository implements ConfigurableReposito
private $rootData; private $rootData;
/** @var bool */ /** @var bool */
private $hasPartialPackages = false; private $hasPartialPackages = false;
/** @var ?array<string, PackageInterface> */ /** @var ?array<string, mixed[]> */
private $partialPackagesByName = null; private $partialPackagesByName = null;
/** /**
@ -323,7 +323,10 @@ class ComposerRepository extends ArrayRepository implements ConfigurableReposito
} }
if ($this->hasPartialPackages()) { if ($this->hasPartialPackages()) {
return array_values($this->partialPackagesByName); if (!is_array($this->partialPackagesByName)) {
throw new \LogicException('hasPartialPackages failed to initialize $this->partialPackagesByName');
}
return $this->createPackages($this->partialPackagesByName, 'packages.json inline packages');
} }
throw new \LogicException('Composer repositories that have lazy providers and no available-packages list can not load the complete list of packages, use getPackageNames instead.'); throw new \LogicException('Composer repositories that have lazy providers and no available-packages list can not load the complete list of packages, use getPackageNames instead.');
@ -614,6 +617,9 @@ class ComposerRepository extends ArrayRepository implements ConfigurableReposito
} }
if ($this->hasPartialPackages()) { if ($this->hasPartialPackages()) {
if (!is_array($this->partialPackagesByName)) {
throw new \LogicException('hasPartialPackages failed to initialize $this->partialPackagesByName');
}
foreach ($this->partialPackagesByName as $versions) { foreach ($this->partialPackagesByName as $versions) {
foreach ($versions as $candidate) { foreach ($versions as $candidate) {
if (isset($result[$candidate['name']]) || !isset($candidate['provide'][$packageName])) { if (isset($result[$candidate['name']]) || !isset($candidate['provide'][$packageName])) {
@ -1327,7 +1333,7 @@ class ComposerRepository extends ArrayRepository implements ConfigurableReposito
$filename = str_replace('http://', 'https://', $filename); $filename = str_replace('http://', 'https://', $filename);
} }
if ($retries) { if ($retries > 0) {
usleep(100000); usleep(100000);
continue; continue;

View File

@ -26,9 +26,9 @@ use Composer\Config;
*/ */
class GitDriver extends VcsDriver class GitDriver extends VcsDriver
{ {
/** @var array<string, string> Map of tag name to identifier */ /** @var array<int|string, string> Map of tag name (can be turned to an int by php if it is a numeric name) to identifier */
protected $tags; protected $tags;
/** @var array<string, string> Map of branch name to identifier */ /** @var array<int|string, string> Map of branch name (can be turned to an int by php if it is a numeric name) to identifier */
protected $branches; protected $branches;
/** @var string */ /** @var string */
protected $rootIdentifier; protected $rootIdentifier;
@ -172,7 +172,7 @@ class GitDriver extends VcsDriver
$this->process->execute('git show-ref --tags --dereference', $output, $this->repoDir); $this->process->execute('git show-ref --tags --dereference', $output, $this->repoDir);
foreach ($output = $this->process->splitLines($output) as $tag) { foreach ($output = $this->process->splitLines($output) as $tag) {
if ($tag && Preg::isMatch('{^([a-f0-9]{40}) refs/tags/(\S+?)(\^\{\})?$}', $tag, $match)) { if ($tag && Preg::isMatch('{^([a-f0-9]{40}) refs/tags/(\S+?)(\^\{\})?$}', $tag, $match)) {
$this->tags[$match[2]] = $match[1]; $this->tags[$match[2]] = (string) $match[1];
} }
} }
} }

View File

@ -46,7 +46,7 @@ class GitLabDriver extends VcsDriver
private $project; private $project;
/** /**
* @var array<string, mixed[]> Keeps commits returned by GitLab API * @var array<string|int, mixed[]> Keeps commits returned by GitLab API as commit id => info
*/ */
private $commits = array(); private $commits = array();

View File

@ -62,14 +62,14 @@ interface VcsDriverInterface
/** /**
* Return list of branches in the repository * Return list of branches in the repository
* *
* @return array<string, string> Branch names as keys, identifiers as values * @return array<int|string, string> Branch names as keys, identifiers as values
*/ */
public function getBranches(); public function getBranches();
/** /**
* Return list of tags in the repository * Return list of tags in the repository
* *
* @return array<string, string> Tag names as keys, identifiers as values * @return array<int|string, string> Tag names as keys, identifiers as values
*/ */
public function getTags(); public function getTags();

View File

@ -223,6 +223,7 @@ class VcsRepository extends ArrayRepository implements ConfigurableRepositoryInt
} }
foreach ($driver->getTags() as $tag => $identifier) { foreach ($driver->getTags() as $tag => $identifier) {
$tag = (string) $tag;
$msg = 'Reading composer.json of <info>' . ($this->packageName ?: $this->url) . '</info> (<comment>' . $tag . '</comment>)'; $msg = 'Reading composer.json of <info>' . ($this->packageName ?: $this->url) . '</info> (<comment>' . $tag . '</comment>)';
if ($isVeryVerbose) { if ($isVeryVerbose) {
$this->io->writeError($msg); $this->io->writeError($msg);
@ -330,6 +331,7 @@ class VcsRepository extends ArrayRepository implements ConfigurableRepositoryInt
} }
foreach ($branches as $branch => $identifier) { foreach ($branches as $branch => $identifier) {
$branch = (string) $branch;
$msg = 'Reading composer.json of <info>' . ($this->packageName ?: $this->url) . '</info> (<comment>' . $branch . '</comment>)'; $msg = 'Reading composer.json of <info>' . ($this->packageName ?: $this->url) . '</info> (<comment>' . $branch . '</comment>)';
if ($isVeryVerbose) { if ($isVeryVerbose) {
$this->io->writeError($msg); $this->io->writeError($msg);

View File

@ -174,6 +174,9 @@ class CurlDownloader
$curlHandle = curl_init(); $curlHandle = curl_init();
$headerHandle = fopen('php://temp/maxmemory:32768', 'w+b'); $headerHandle = fopen('php://temp/maxmemory:32768', 'w+b');
if (false === $headerHandle) {
throw new \RuntimeException('Failed to open a temp stream to store curl headers');
}
if ($copyTo) { if ($copyTo) {
$errorMessage = ''; $errorMessage = '';

View File

@ -159,6 +159,15 @@ class NoProxyPattern
$net = unpack('C*', $network->ip); $net = unpack('C*', $network->ip);
$mask = unpack('C*', $network->netmask); $mask = unpack('C*', $network->netmask);
$ip = unpack('C*', $target->ip); $ip = unpack('C*', $target->ip);
if (false === $net) {
throw new \RuntimeException('Could not parse network IP '.$network->ip);
}
if (false === $mask) {
throw new \RuntimeException('Could not parse netmask '.$network->netmask);
}
if (false === $ip) {
throw new \RuntimeException('Could not parse target IP '.$target->ip);
}
for ($i = 1; $i < 17; ++$i) { for ($i = 1; $i < 17; ++$i) {
if (($net[$i] & $mask[$i]) !== ($ip[$i] & $mask[$i])) { if (($net[$i] & $mask[$i]) !== ($ip[$i] & $mask[$i])) {
@ -304,6 +313,12 @@ class NoProxyPattern
$mask = unpack('C*', $netmask); $mask = unpack('C*', $netmask);
$ip = unpack('C*', $rangeIp); $ip = unpack('C*', $rangeIp);
$net = ''; $net = '';
if (false === $mask) {
throw new \RuntimeException('Could not parse netmask '.$netmask);
}
if (false === $ip) {
throw new \RuntimeException('Could not parse range IP '.$rangeIp);
}
for ($i = 1; $i < 17; ++$i) { for ($i = 1; $i < 17; ++$i) {
$net .= chr($ip[$i] & $mask[$i]); $net .= chr($ip[$i] & $mask[$i]);

View File

@ -217,8 +217,10 @@ class Svn
$this->io->writeError("The Subversion server ({$this->url}) requested credentials:"); $this->io->writeError("The Subversion server ({$this->url}) requested credentials:");
$this->hasAuth = true; $this->hasAuth = true;
$this->credentials['username'] = $this->io->ask("Username: "); $this->credentials = array(
$this->credentials['password'] = $this->io->askAndHideAnswer("Password: "); 'username' => (string) $this->io->ask("Username: ", ''),
'password' => (string) $this->io->askAndHideAnswer("Password: "),
);
$this->cacheCredentials = $this->io->askConfirmation("Should Subversion cache these credentials? (yes/no) "); $this->cacheCredentials = $this->io->askConfirmation("Should Subversion cache these credentials? (yes/no) ");
@ -345,8 +347,10 @@ class Svn
$host = parse_url($this->url, PHP_URL_HOST); $host = parse_url($this->url, PHP_URL_HOST);
if (isset($authConfig[$host])) { if (isset($authConfig[$host])) {
$this->credentials['username'] = $authConfig[$host]['username']; $this->credentials = array(
$this->credentials['password'] = $authConfig[$host]['password']; 'username' => $authConfig[$host]['username'],
'password' => $authConfig[$host]['password'],
);
return $this->hasAuth = true; return $this->hasAuth = true;
} }
@ -366,8 +370,10 @@ class Svn
return $this->hasAuth = false; return $this->hasAuth = false;
} }
$this->credentials['username'] = $uri['user']; $this->credentials = array(
$this->credentials['password'] = !empty($uri['pass']) ? $uri['pass'] : ''; 'username' => $uri['user'],
'password' => !empty($uri['pass']) ? $uri['pass'] : '',
);
return $this->hasAuth = true; return $this->hasAuth = true;
} }

View File

@ -42,7 +42,7 @@ class NullIOTest extends TestCase
{ {
$io = new NullIO(); $io = new NullIO();
$this->assertTrue(is_array($io->getAuthentications())); $this->assertTrue(is_array($io->getAuthentications())); // @phpstan-ignore-line
$this->assertEmpty($io->getAuthentications()); $this->assertEmpty($io->getAuthentications());
$this->assertEquals(array('username' => null, 'password' => null), $io->getAuthentication('foo')); $this->assertEquals(array('username' => null, 'password' => null), $io->getAuthentication('foo'));
} }

View File

@ -15,6 +15,7 @@ namespace Composer\Test\Plugin;
use Composer\Composer; use Composer\Composer;
use Composer\Config; use Composer\Config;
use Composer\Installer\PluginInstaller; use Composer\Installer\PluginInstaller;
use Composer\Package\CompleteAliasPackage;
use Composer\Package\CompletePackage; use Composer\Package\CompletePackage;
use Composer\Package\Loader\JsonLoader; use Composer\Package\Loader\JsonLoader;
use Composer\Package\Loader\ArrayLoader; use Composer\Package\Loader\ArrayLoader;
@ -44,7 +45,7 @@ class PluginInstallerTest extends TestCase
protected $autoloadGenerator; protected $autoloadGenerator;
/** /**
* @var CompletePackage[] * @var array<CompletePackage|CompleteAliasPackage>
*/ */
protected $packages; protected $packages;
@ -274,7 +275,7 @@ class PluginInstallerTest extends TestCase
/** /**
* @param string $newPluginApiVersion * @param string $newPluginApiVersion
* @param CompletePackage[] $plugins * @param array<CompletePackage|CompleteAliasPackage> $plugins
* *
* @return void * @return void
*/ */