From e050b6ae232f989f01fe87be9eed03a98eea3ba7 Mon Sep 17 00:00:00 2001 From: MarcoJmz Date: Thu, 5 Jun 2025 08:04:29 -0600 Subject: [PATCH 1/6] Fallback to packagist API v2 when package install fails --- src/Package_Command.php | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/src/Package_Command.php b/src/Package_Command.php index 82fc3508..9c47980d 100644 --- a/src/Package_Command.php +++ b/src/Package_Command.php @@ -74,6 +74,8 @@ class Package_Command extends WP_CLI_Command { const PACKAGE_INDEX_URL = 'https://wp-cli.org/package-index/'; + private $packagist_version = 'p'; + const DEFAULT_DEV_BRANCH_CONSTRAINTS = 'dev-main || dev-master || dev-trunk'; private $version_selector = false; @@ -834,8 +836,7 @@ private function get_package_by_shortened_identifier( $package_name, $insecure = $options = [ 'insecure' => $insecure ]; // Check if the package exists on Packagist. - $url = "https://repo.packagist.org/p/{$package_name}.json"; - $response = Utils\http_request( 'GET', $url, null, [], $options ); + $response = $this->get_from_packagist( $package_name, $options ); if ( 20 === (int) substr( $response->status_code, 0, 2 ) ) { return $package_name; } @@ -862,6 +863,18 @@ private function get_package_by_shortened_identifier( $package_name, $insecure = return false; } + private function get_from_packagist( $package_name, $options ) { + $url = "https://repo.packagist.org/p/{$package_name}.json"; + $response = Utils\http_request( 'GET', $url, null, [], $options ); + + if ( 20 === (int) substr( $response->status_code, 0, 2 ) ) { + return $response; + } + + $url = "https://repo.packagist.org/p2/{$package_name}.json"; + return Utils\http_request( 'GET', $url, null, [], $options ); + } + /** * Gets the installed community packages. */ From b2452e0c09e19a778343f208276390ff3d451205 Mon Sep 17 00:00:00 2001 From: MarcoJmz Date: Thu, 5 Jun 2025 08:31:47 -0600 Subject: [PATCH 2/6] Document new function --- src/Package_Command.php | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/Package_Command.php b/src/Package_Command.php index 9c47980d..24a41be5 100644 --- a/src/Package_Command.php +++ b/src/Package_Command.php @@ -836,7 +836,8 @@ private function get_package_by_shortened_identifier( $package_name, $insecure = $options = [ 'insecure' => $insecure ]; // Check if the package exists on Packagist. - $response = $this->get_from_packagist( $package_name, $options ); + $url = $this->get_packagist_url( $package_name, $options ); + $response = Utils\http_request( 'GET', $url, null, [], $options ); if ( 20 === (int) substr( $response->status_code, 0, 2 ) ) { return $package_name; } @@ -863,16 +864,18 @@ private function get_package_by_shortened_identifier( $package_name, $insecure = return false; } - private function get_from_packagist( $package_name, $options ) { + /** + * Gets the correct packagist URL. + */ + private function get_packagist_url( $package_name, $options ) { $url = "https://repo.packagist.org/p/{$package_name}.json"; $response = Utils\http_request( 'GET', $url, null, [], $options ); if ( 20 === (int) substr( $response->status_code, 0, 2 ) ) { - return $response; + return $url; } - $url = "https://repo.packagist.org/p2/{$package_name}.json"; - return Utils\http_request( 'GET', $url, null, [], $options ); + return "https://repo.packagist.org/p2/{$package_name}.json"; } /** From b89ccbe6088749d53aba3cd0014c7cda563a09bb Mon Sep 17 00:00:00 2001 From: MarcoJmz Date: Thu, 5 Jun 2025 08:48:12 -0600 Subject: [PATCH 3/6] PHPCS fix --- src/Package_Command.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Package_Command.php b/src/Package_Command.php index 24a41be5..58856f3d 100644 --- a/src/Package_Command.php +++ b/src/Package_Command.php @@ -836,7 +836,7 @@ private function get_package_by_shortened_identifier( $package_name, $insecure = $options = [ 'insecure' => $insecure ]; // Check if the package exists on Packagist. - $url = $this->get_packagist_url( $package_name, $options ); + $url = $this->get_packagist_url( $package_name, $options ); $response = Utils\http_request( 'GET', $url, null, [], $options ); if ( 20 === (int) substr( $response->status_code, 0, 2 ) ) { return $package_name; From 8447db104dd7ebefe88d7895ca50bf6ed84780cf Mon Sep 17 00:00:00 2001 From: MarcoJmz Date: Thu, 5 Jun 2025 08:50:27 -0600 Subject: [PATCH 4/6] Remove unused variable --- src/Package_Command.php | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/Package_Command.php b/src/Package_Command.php index 58856f3d..caeecff0 100644 --- a/src/Package_Command.php +++ b/src/Package_Command.php @@ -74,8 +74,6 @@ class Package_Command extends WP_CLI_Command { const PACKAGE_INDEX_URL = 'https://wp-cli.org/package-index/'; - private $packagist_version = 'p'; - const DEFAULT_DEV_BRANCH_CONSTRAINTS = 'dev-main || dev-master || dev-trunk'; private $version_selector = false; From 5e19a5e1cdade350029e63337767b41545057489 Mon Sep 17 00:00:00 2001 From: MarcoJmz Date: Thu, 5 Jun 2025 09:07:19 -0600 Subject: [PATCH 5/6] Add test --- tests/ComposerJsonTest.php | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/tests/ComposerJsonTest.php b/tests/ComposerJsonTest.php index 82ef7d46..697a5174 100644 --- a/tests/ComposerJsonTest.php +++ b/tests/ComposerJsonTest.php @@ -180,6 +180,25 @@ public function test_get_composer_json_path_backup_decoded() { putenv( false === $env_wp_cli_packages_dir ? 'WP_CLI_PACKAGES_DIR' : "WP_CLI_PACKAGES_DIR=$env_wp_cli_packages_dir" ); } + public function test_get_packagist_url() { + $get_packagist_url = new \ReflectionMethod( 'Package_Command', 'get_packagist_url' ); + $get_packagist_url->setAccessible( true ); + + $package = new Package_Command(); + $options = [ 'insecure' => false ]; + + // Test with a valid package that should exist on packagist v1 + $result = $get_packagist_url->invoke( $package, 'wp-cli/wp-cli', $options ); + $this->assertStringContainsString( 'repo.packagist.org/p/', $result ); + $this->assertStringContainsString( 'wp-cli/wp-cli.json', $result ); + + // The method should return either v1 or v2 URL based on availability + $this->assertTrue( + strpos( $result, 'https://repo.packagist.org/p/wp-cli/wp-cli.json' ) === 0 || + strpos( $result, 'https://repo.packagist.org/p2/wp-cli/wp-cli.json' ) === 0 + ); + } + private function mac_safe_path( $path ) { return preg_replace( '#^/private/(var|tmp)/#i', '/$1/', $path ); } From 9edf4c83b55e29300d9ab35542ff2cb1c1bc32ec Mon Sep 17 00:00:00 2001 From: MarcoJmz Date: Thu, 5 Jun 2025 09:16:52 -0600 Subject: [PATCH 6/6] Switch to check URL v2 first --- src/Package_Command.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Package_Command.php b/src/Package_Command.php index caeecff0..32a6284f 100644 --- a/src/Package_Command.php +++ b/src/Package_Command.php @@ -866,14 +866,14 @@ private function get_package_by_shortened_identifier( $package_name, $insecure = * Gets the correct packagist URL. */ private function get_packagist_url( $package_name, $options ) { - $url = "https://repo.packagist.org/p/{$package_name}.json"; + $url = "https://repo.packagist.org/p2/{$package_name}.json"; $response = Utils\http_request( 'GET', $url, null, [], $options ); if ( 20 === (int) substr( $response->status_code, 0, 2 ) ) { return $url; } - return "https://repo.packagist.org/p2/{$package_name}.json"; + return "https://repo.packagist.org/p/{$package_name}.json"; } /**