diff --git a/CHANGELOG.md b/CHANGELOG.md index 5405513ad..5a48af7ba 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,12 @@ +### [2.5.5] 2023-03-21 + + * Fixed basic auth failures resulting in infinite retry loop (#11320) + * Fixed GitHub rate limit reporting (#11366) + * Fixed InstalledVersions error in Composer 1 compatibility edge case (#11304) + * Fixed issue displaying solver problems with branch names containing `%` signs (#11359) + * Fixed race condition in cache validity detection when running Composer highly concurrently (#11375) + * Fixed various minor config command issues (#11353, #11302) + ### [2.5.4] 2023-02-15 * Fixed extra.plugin-optional support in PluginInstaller when doing pre-install checks (#11318) @@ -1699,6 +1708,7 @@ * Initial release +[2.5.5]: https://github.com/composer/composer/compare/2.5.4...2.5.5 [2.5.4]: https://github.com/composer/composer/compare/2.5.3...2.5.4 [2.5.3]: https://github.com/composer/composer/compare/2.5.2...2.5.3 [2.5.2]: https://github.com/composer/composer/compare/2.5.1...2.5.2 diff --git a/src/Composer/Command/ConfigCommand.php b/src/Composer/Command/ConfigCommand.php index d7f4ad78a..bef163b3d 100644 --- a/src/Composer/Command/ConfigCommand.php +++ b/src/Composer/Command/ConfigCommand.php @@ -274,8 +274,21 @@ EOT // show the value if no value is provided if ([] === $input->getArgument('setting-value') && !$input->getOption('unset')) { $properties = self::CONFIGURABLE_PACKAGE_PROPERTIES; + $propertiesDefaults = [ + 'type' => 'library', + 'description' => '', + 'homepage' => '', + 'minimum-stability' => 'stable', + 'prefer-stable' => false, + 'keywords' => [], + 'license' => [], + 'suggest' => [], + 'extra' => [], + ]; $rawData = $this->configFile->read(); $data = $this->config->all(); + $source = $this->config->getSourceOfValue($settingKey); + if (Preg::isMatch('/^repos?(?:itories)?(?:\.(.+))?/', $settingKey, $matches)) { if (!isset($matches[1]) || $matches[1] === '') { $value = $data['repositories'] ?? []; @@ -311,19 +324,33 @@ EOT $value = $data; } elseif (isset($data['config'][$settingKey])) { $value = $this->config->get($settingKey, $input->getOption('absolute') ? 0 : Config::RELATIVE_PATHS); + // ensure we get {} output for properties which are objects + if ($value === []) { + $schema = JsonFile::parseJson((string) file_get_contents(JsonFile::COMPOSER_SCHEMA_PATH)); + if ( + isset($schema['properties']['config']['properties'][$settingKey]['type']) + && in_array('object', (array) $schema['properties']['config']['properties'][$settingKey]['type'], true) + ) { + $value = new \stdClass; + } + } } elseif (isset($rawData[$settingKey]) && in_array($settingKey, $properties, true)) { $value = $rawData[$settingKey]; + $source = $this->configFile->getPath(); + } elseif (isset($propertiesDefaults[$settingKey])) { + $value = $propertiesDefaults[$settingKey]; + $source = 'defaults'; } else { throw new \RuntimeException($settingKey.' is not defined'); } - if (is_array($value)) { + if (is_array($value) || is_object($value) || is_bool($value)) { $value = JsonFile::encode($value, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE); } $sourceOfConfigValue = ''; if ($input->getOption('source')) { - $sourceOfConfigValue = ' (' . $this->config->getSourceOfValue($settingKey) . ')'; + $sourceOfConfigValue = ' (' . $source . ')'; } $this->getIO()->write($value . $sourceOfConfigValue, true, IOInterface::QUIET); diff --git a/src/Composer/PHPStan/ConfigReturnTypeExtension.php b/src/Composer/PHPStan/ConfigReturnTypeExtension.php index b28d3ebd2..e7ff6e52e 100644 --- a/src/Composer/PHPStan/ConfigReturnTypeExtension.php +++ b/src/Composer/PHPStan/ConfigReturnTypeExtension.php @@ -40,7 +40,7 @@ final class ConfigReturnTypeExtension implements DynamicMethodReturnTypeExtensio public function __construct() { - $schema = JsonFile::parseJson((string) file_get_contents(__DIR__.'/../../../res/composer-schema.json')); + $schema = JsonFile::parseJson((string) file_get_contents(JsonFile::COMPOSER_SCHEMA_PATH)); /** * @var string $prop */ diff --git a/tests/Composer/Test/Json/ComposerSchemaTest.php b/tests/Composer/Test/Json/ComposerSchemaTest.php index c964a170c..9a6735091 100644 --- a/tests/Composer/Test/Json/ComposerSchemaTest.php +++ b/tests/Composer/Test/Json/ComposerSchemaTest.php @@ -12,6 +12,7 @@ namespace Composer\Test\Json; +use Composer\Json\JsonFile; use JsonSchema\Validator; use Composer\Test\TestCase; @@ -96,7 +97,7 @@ class ComposerSchemaTest extends TestCase private function check(string $json) { $validator = new Validator(); - $validator->check(json_decode($json), (object) ['$ref' => 'file://' . __DIR__ . '/../../../../res/composer-schema.json']); + $validator->check(json_decode($json), (object) ['$ref' => 'file://' . JsonFile::COMPOSER_SCHEMA_PATH]); if (!$validator->isValid()) { $errors = $validator->getErrors();