Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .typos.toml
Original file line number Diff line number Diff line change
Expand Up @@ -7,5 +7,5 @@ extend-ignore-re = [

[files]
extend-exclude = [
"tests/JsonManipulatorTest.php"
"tests/phpunit/JsonManipulatorTest.php"
]
4 changes: 2 additions & 2 deletions composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,8 @@
],
"require": {
"ext-json": "*",
"composer/composer": "^2.2.25",
"wp-cli/wp-cli": "^2.12"
"composer/composer": "^2.9.5",
"wp-cli/wp-cli": "^2.13"
},
"require-dev": {
"wp-cli/scaffold-command": "^1 || ^2",
Expand Down
3 changes: 2 additions & 1 deletion phpcs.xml.dist
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
<exclude-pattern>*/src/WP_CLI/JsonManipulator\.php$</exclude-pattern>
<exclude-pattern>*/src/WP_CLI/Package/Compat/Min_Composer_1_10/NullIOMethodsTrait\.php$</exclude-pattern>
<exclude-pattern>*/src/WP_CLI/Package/Compat/Min_Composer_2_3/NullIOMethodsTrait\.php$</exclude-pattern>
<exclude-pattern>*/tests/JsonManipulatorTest\.php$</exclude-pattern>
<exclude-pattern>*/tests/phpunit/JsonManipulatorTest\.php$</exclude-pattern>

<!-- Show progress. -->
<arg value="p"/>
Expand Down Expand Up @@ -63,4 +63,5 @@
<exclude-pattern>*/src/Package_Command\.php$</exclude-pattern>
</rule>

<exclude-pattern>*/tests/phpstan/scan-files\.php$</exclude-pattern>
</ruleset>
3 changes: 2 additions & 1 deletion phpstan.neon.dist
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
parameters:
level: 1
level: 5
paths:
- src
- package-command.php
scanDirectories:
- vendor/wp-cli/wp-cli/php
scanFiles:
- vendor/php-stubs/wordpress-stubs/wordpress-stubs.php
- tests/phpstan/scan-files.php
treatPhpDocTypesAsCertain: false
ignoreErrors:
# WP_CLI_VERSION is defined in wp-cli core at runtime
Expand Down
2 changes: 1 addition & 1 deletion phpunit.xml.dist
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
colors="true"
verbose="true">
<testsuite name="wp-cli/package-command tests">
<directory suffix="Test.php">tests</directory>
<directory suffix="Test.php">tests/phpunit</directory>
</testsuite>

<filter>
Expand Down
76 changes: 24 additions & 52 deletions src/Package_Command.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
use Composer\Composer;
use Composer\Config;
use Composer\Config\JsonConfigSource;
use Composer\DependencyResolver\Pool;
use Composer\Factory;
use Composer\IO\NullIO;
use Composer\Installer;
Expand Down Expand Up @@ -223,9 +222,7 @@ public function install( $args, $assoc_args ) {
$dir_package = false;
$version = '';
if ( $this->is_git_repository( $package_name ) ) {
if ( '' === $version ) {
$version = "dev-{$this->get_github_default_branch( $package_name, $insecure )}";
}
$version = "dev-{$this->get_github_default_branch( $package_name, $insecure )}";
$git_package = $package_name;
$matches = [];
if ( preg_match( '#([^:\/]+\/[^\/]+)\.git#', $package_name, $matches ) ) {
Expand All @@ -247,7 +244,7 @@ public function install( $args, $assoc_args ) {
$gitlab_token = getenv( 'GITLAB_TOKEN' ); // Use GITLAB_TOKEN if available to avoid authorization failures or rate-limiting.
$headers = $gitlab_token && strpos( $package_name, '://gitlab.com/' ) !== false ? [ 'PRIVATE-TOKEN' => $gitlab_token ] : [];
$response = Utils\http_request( 'GET', $package_name, null, $headers, $options );
if ( 20 !== (int) substr( $response->status_code, 0, 2 ) ) {
if ( 20 !== (int) substr( (string) $response->status_code, 0, 2 ) ) {
@unlink( $temp ); // @codingStandardsIgnoreLine
WP_CLI::error( sprintf( "Couldn't download package from '%s' (HTTP code %d).", $package_name, $response->status_code ) );
}
Expand Down Expand Up @@ -316,11 +313,9 @@ public function install( $args, $assoc_args ) {
}
}

if ( $this->is_composer_v2() ) {
$package_name = function_exists( 'mb_strtolower' )
? mb_strtolower( $package_name )
: strtolower( $package_name );
}
$package_name = function_exists( 'mb_strtolower' )
? mb_strtolower( $package_name )
: strtolower( $package_name );

if ( '' === $version ) {
$version = self::DEFAULT_DEV_BRANCH_CONSTRAINTS;
Expand Down Expand Up @@ -822,8 +817,8 @@ private function package_index() {
* Displays a set of packages
*
* @param string $context
* @param array
* @param array
* @param array $packages
* @param array $assoc_args
*/
private function show_packages( $context, $packages, $assoc_args ) {
$default_fields = [];
Expand Down Expand Up @@ -866,7 +861,7 @@ private function show_packages( $context, $packages, $assoc_args ) {
$update_version = '';
if ( 'list' === $context && ! $skip_update_check ) {
try {
$latest = $this->find_latest_package( $package, $composer, null );
$latest = $this->find_latest_package( $package, $composer );
if ( $latest && $latest->getFullPrettyVersion() !== $package->getFullPrettyVersion() ) {
$update = 'available';
$update_version = $latest->getPrettyVersion();
Expand Down Expand Up @@ -929,7 +924,7 @@ private function get_package_by_shortened_identifier( $package_name, $insecure =
// Check if the package exists on Packagist.
$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 ) ) {
if ( 20 === (int) substr( (string) $response->status_code, 0, 2 ) ) {
return $package_name;
}

Expand All @@ -938,7 +933,7 @@ private function get_package_by_shortened_identifier( $package_name, $insecure =
$github_token = getenv( 'GITHUB_TOKEN' ); // Use GITHUB_TOKEN if available to avoid authorization failures or rate-limiting.
$headers = $github_token ? [ 'Authorization' => 'token ' . $github_token ] : [];
$response = Utils\http_request( 'GET', $url, null /*data*/, $headers, $options );
if ( 20 === (int) substr( $response->status_code, 0, 2 ) ) {
if ( 20 === (int) substr( (string) $response->status_code, 0, 2 ) ) {
return $url;
}

Expand All @@ -948,7 +943,7 @@ private function get_package_by_shortened_identifier( $package_name, $insecure =
$headers = $github_token ? [ 'Authorization' => 'token ' . $github_token ] : [];
$headers = $gitlab_token && strpos( $package_name, '://gitlab.com/' ) !== false ? [ 'PRIVATE-TOKEN' => $gitlab_token ] : [];
$response = Utils\http_request( 'GET', $url, null /*data*/, $headers, $options );
if ( 20 === (int) substr( $response->status_code, 0, 2 ) ) {
if ( 20 === (int) substr( (string) $response->status_code, 0, 2 ) ) {
return $url;
}

Expand Down Expand Up @@ -976,9 +971,6 @@ private function get_installed_packages() {
if ( in_array( $package->getPrettyName(), $installed_package_keys, true ) ) {
$installed_packages[] = $package;
} elseif ( false !== $idx ) { // Legacy incorrect name check.
if ( ! $this->is_composer_v2() ) {
WP_CLI::warning( sprintf( "Found package '%s' misnamed '%s' in '%s'.", $package->getPrettyName(), $installed_package_keys[ $idx ], $this->get_composer_json_path() ) );
}
$installed_packages[] = $package;
}
}
Expand Down Expand Up @@ -1130,12 +1122,11 @@ private function create_default_composer_json( $composer_path ) {
*
* @param PackageInterface $package
* @param Composer $composer
* @param string $phpVersion
* @param bool $minorOnly
* @param bool $minor_only
*
* @return PackageInterface|null
* @return PackageInterface|false
*/
private function find_latest_package( PackageInterface $package, Composer $composer, $php_version, $minor_only = false ) {
private function find_latest_package( PackageInterface $package, Composer $composer, $minor_only = false ) {
// Find the latest version allowed in this pool/repository set.
$name = $package->getPrettyName();
$version_selector = $this->get_version_selector( $composer );
Expand All @@ -1156,30 +1147,20 @@ private function find_latest_package( PackageInterface $package, Composer $compo
$target_version = '^' . $package->getVersion();
}

if ( $this->is_composer_v2() ) {
return $version_selector->findBestCandidate( $name, $target_version, $best_stability );
}

return $version_selector->findBestCandidate( $name, $target_version, $php_version, $best_stability );
return $version_selector->findBestCandidate( $name, $target_version, $best_stability );
}

/**
* @return VersionSelector
*/
private function get_version_selector( Composer $composer ) {
if ( ! $this->version_selector ) {
if ( $this->is_composer_v2() ) {
$repository_set = new Repository\RepositorySet(
$composer->getPackage()->getMinimumStability(),
$composer->getPackage()->getStabilityFlags()
);
$repository_set->addRepository( new CompositeRepository( $composer->getRepositoryManager()->getRepositories() ) );
$this->version_selector = new VersionSelector( $repository_set );
} else {
$pool = new Pool( $composer->getPackage()->getMinimumStability(), $composer->getPackage()->getStabilityFlags() );
$pool->addRepository( new CompositeRepository( $composer->getRepositoryManager()->getRepositories() ) );
$this->version_selector = new VersionSelector( $pool );
}
$repository_set = new Repository\RepositorySet(
$composer->getPackage()->getMinimumStability(),
$composer->getPackage()->getStabilityFlags()
);
$repository_set->addRepository( new CompositeRepository( $composer->getRepositoryManager()->getRepositories() ) );
$this->version_selector = new VersionSelector( $repository_set );
}

return $this->version_selector;
Expand Down Expand Up @@ -1213,7 +1194,7 @@ private function check_github_package_name( $package_name, $version = '', $insec
$raw_content_url = "https://raw.githubusercontent.com/{$package_name}/{$this->get_raw_git_version( $version )}/composer.json";

$response = Utils\http_request( 'GET', $raw_content_url, null /*data*/, $headers, $options );
if ( 20 !== (int) substr( $response->status_code, 0, 2 ) ) {
if ( 20 !== (int) substr( (string) $response->status_code, 0, 2 ) ) {
// Could not get composer.json. Possibly private so warn and return best guess from input (always xxx/xxx).
WP_CLI::warning(
sprintf(
Expand Down Expand Up @@ -1360,7 +1341,7 @@ private function get_github_latest_release_tag( $package_name, $insecure ) {
$url = "https://api.github.com/repos/{$package_name}/releases/latest";
$options = [ 'insecure' => $insecure ];
$response = Utils\http_request( 'GET', $url, null, [], $options );
if ( 20 !== (int) substr( $response->status_code, 0, 2 ) ) {
if ( 20 !== (int) substr( (string) $response->status_code, 0, 2 ) ) {
WP_CLI::warning( 'Could not guess stable version from GitHub repository, falling back to master branch' );
return 'master';
}
Expand Down Expand Up @@ -1500,15 +1481,6 @@ static function () use (
);
}

/**
* Check whether we are dealing with Composer version 2.0.0+.
*
* @return bool
*/
private function is_composer_v2() {
return version_compare( Composer::getVersion(), '2.0.0', '>=' );
}

/**
* Try to retrieve default branch via GitHub API.
*
Expand All @@ -1529,7 +1501,7 @@ private function get_github_default_branch( $package_name, $insecure = false ) {

$github_api_repo_url = "https://api.github.com/repos/{$package_name}";
$response = Utils\http_request( 'GET', $github_api_repo_url, null /*data*/, $headers, $options );
if ( 20 !== (int) substr( $response->status_code, 0, 2 ) ) {
if ( 20 !== (int) substr( (string) $response->status_code, 0, 2 ) ) {
WP_CLI::warning(
sprintf(
"Couldn't fetch default branch for package '%s' (HTTP code %d). Presuming default branch is 'master'.",
Expand Down

This file was deleted.

This file was deleted.

29 changes: 0 additions & 29 deletions src/WP_CLI/Package/Compat/NullIOMethodsTrait.php

This file was deleted.

31 changes: 29 additions & 2 deletions src/WP_CLI/Package/ComposerIO.php
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,35 @@
namespace WP_CLI\Package;

use Composer\IO\NullIO;
use WP_CLI\Package\Compat\NullIOMethodsTrait;
use WP_CLI;

class ComposerIO extends NullIO {
use NullIOMethodsTrait;
/**
* {@inheritDoc}
*/
public function isVerbose(): bool {
return true;
}

/**
* {@inheritDoc}
*/
public function write( $messages, bool $newline = true, int $verbosity = self::NORMAL ): void {
self::output_clean_message( $messages );
}

/**
* {@inheritDoc}
*/
public function writeError( $messages, bool $newline = true, int $verbosity = self::NORMAL ): void {
self::output_clean_message( $messages );
}

private static function output_clean_message( $messages ) {
$messages = (array) preg_replace( '#<(https?)([^>]+)>#', '$1$2', $messages );
foreach ( $messages as $message ) {
// phpcs:ignore WordPress.WP.AlternativeFunctions.strip_tags_strip_tags
WP_CLI::log( strip_tags( trim( $message ) ) );
}
}
}
Loading