From 26d6eae4254ddc5d275bd7ccc694012e9f065016 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dezs=C5=91=20BICZ=C3=93?= <dezso.biczo@pronovix.com> Date: Wed, 21 May 2025 13:19:03 +0200 Subject: [PATCH 1/3] Improve error reporting on content mismatch --- composer/Plugin/RecipeUnpack/RootComposer.php | 34 +++++++++++++++---- 1 file changed, 28 insertions(+), 6 deletions(-) diff --git a/composer/Plugin/RecipeUnpack/RootComposer.php b/composer/Plugin/RecipeUnpack/RootComposer.php index da07224a275c..6367946d25a6 100644 --- a/composer/Plugin/RecipeUnpack/RootComposer.php +++ b/composer/Plugin/RecipeUnpack/RootComposer.php @@ -7,6 +7,7 @@ use Composer\IO\IOInterface; use Composer\Json\JsonFile; use Composer\Json\JsonManipulator; +use Composer\Package\Link; use Composer\Package\Locker; use Composer\Package\RootPackageInterface; @@ -139,23 +140,44 @@ public function writeFiles(): void { $this->io->write("Unpacking has updated the root composer files.", verbosity: IOInterface::VERBOSE); - assert(self::checkRootPackage($composer_content, $this->composer->getPackage()), 'Composer root package and composer.json match'); + $diff = self::compareComposerContentWithRootPackage($composer_content, $this->composer->getPackage()); + assert(empty($diff), + sprintf("Composer root package and composer.json mismatch detected.\nrequire: %s\nrequire-dev: %s\n", + array_key_exists('require', $diff) ? implode(', ', $diff['require']) : 'OK', + array_key_exists('require-dev', $diff) ? implode(', ', $diff['require-dev']) : 'OK', + ) + ); } /** - * Checks that the composer content and root package match. + * Composer the root composer content and root package. * * @param string $composer_content * The root composer content. * @param \Composer\Package\RootPackageInterface $root_package * The root package. * - * @return bool - * TRUE if the composer content and root package match, FALSE if not. + * @return array{require?: string, require-dev?: string[]} + * An array containing differences between composer content and + * root package or an empty array if they match. */ - private static function checkRootPackage(string $composer_content, RootPackageInterface $root_package): bool { + private static function compareComposerContentWithRootPackage(string $composer_content, RootPackageInterface $root_package): array { $composer = JsonFile::parseJson($composer_content); - return empty(array_diff_key($root_package->getRequires(), $composer['require'] ?? [])) && empty(array_diff_key($root_package->getDevRequires(), $composer['require-dev'] ?? [])); + $diff = []; + + $format_diff = static fn(Link $link): string => (string) $link; + + $requires_diff = array_diff_key($root_package->getRequires(), $composer['require'] ?? []); + if (!empty($requires_diff)) { + $diff['require'] = array_map($format_diff, $requires_diff); + } + + $dev_requires_diff = array_diff_key($root_package->getDevRequires(), $composer['require-dev'] ?? []); + if (!empty($dev_requires_diff)) { + $diff['require-dev'] = array_map($format_diff, $dev_requires_diff); + } + + return $diff; } } -- GitLab From a517263b3d2901d2776acdc5501f9922e6398317 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dezs=C5=91=20BICZ=C3=93?= <dezso.biczo@pronovix.com> Date: Wed, 21 May 2025 13:39:04 +0200 Subject: [PATCH 2/3] Only run diff when assertions are enabled --- composer/Plugin/RecipeUnpack/RootComposer.php | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/composer/Plugin/RecipeUnpack/RootComposer.php b/composer/Plugin/RecipeUnpack/RootComposer.php index 6367946d25a6..e25208bdeecc 100644 --- a/composer/Plugin/RecipeUnpack/RootComposer.php +++ b/composer/Plugin/RecipeUnpack/RootComposer.php @@ -140,13 +140,15 @@ public function writeFiles(): void { $this->io->write("Unpacking has updated the root composer files.", verbosity: IOInterface::VERBOSE); - $diff = self::compareComposerContentWithRootPackage($composer_content, $this->composer->getPackage()); - assert(empty($diff), - sprintf("Composer root package and composer.json mismatch detected.\nrequire: %s\nrequire-dev: %s\n", - array_key_exists('require', $diff) ? implode(', ', $diff['require']) : 'OK', - array_key_exists('require-dev', $diff) ? implode(', ', $diff['require-dev']) : 'OK', - ) - ); + if (ini_get('zend.assertions') === '-1') { + $diff = self::compareComposerContentWithRootPackage($composer_content, $this->composer->getPackage()); + assert(empty($diff), + sprintf("Composer root package and composer.json mismatch detected.\nrequire: %s\nrequire-dev: %s\n", + array_key_exists('require', $diff) ? implode(', ', $diff['require']) : 'OK', + array_key_exists('require-dev', $diff) ? implode(', ', $diff['require-dev']) : 'OK', + ) + ); + } } /** -- GitLab From 1c1ffcb0afb0dc53433c83086465260516701ed7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dezs=C5=91=20BICZ=C3=93?= <dezso.biczo@pronovix.com> Date: Wed, 21 May 2025 13:42:55 +0200 Subject: [PATCH 3/3] Only generate diff when assertions are active --- composer/Plugin/RecipeUnpack/RootComposer.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer/Plugin/RecipeUnpack/RootComposer.php b/composer/Plugin/RecipeUnpack/RootComposer.php index e25208bdeecc..6ddf5d967ce1 100644 --- a/composer/Plugin/RecipeUnpack/RootComposer.php +++ b/composer/Plugin/RecipeUnpack/RootComposer.php @@ -140,7 +140,7 @@ public function writeFiles(): void { $this->io->write("Unpacking has updated the root composer files.", verbosity: IOInterface::VERBOSE); - if (ini_get('zend.assertions') === '-1') { + if (ini_get('zend.assertions') > 0) { $diff = self::compareComposerContentWithRootPackage($composer_content, $this->composer->getPackage()); assert(empty($diff), sprintf("Composer root package and composer.json mismatch detected.\nrequire: %s\nrequire-dev: %s\n", -- GitLab