diff --git a/composer.json b/composer.json index 1bba5487..aedd38d9 100644 --- a/composer.json +++ b/composer.json @@ -28,7 +28,7 @@ ], "require": { "php": "8.1.*||8.2.*||8.3.*||8.4.*||8.5.*", - "composer/composer": "^2.9.2", + "composer/composer": "^2.9.5", "composer/pcre": "^3.3.2", "composer/semver": "^3.4.4", "fidry/cpu-core-counter": "^1.3.0", diff --git a/composer.lock b/composer.lock index 665d0eeb..48278fed 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "ab3e2edb8ee4fdb637409ca1149f7d0a", + "content-hash": "a0a5418f392e9a86fd3ad48a5be15549", "packages": [ { "name": "composer/ca-bundle", @@ -149,16 +149,16 @@ }, { "name": "composer/composer", - "version": "2.9.2", + "version": "2.9.5", "source": { "type": "git", "url": "https://github.com/composer/composer.git", - "reference": "8d5358f147c63a3a681b002076deff8c90e0b19d" + "reference": "72a8f8e653710e18d83e5dd531eb5a71fc3223e6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/composer/zipball/8d5358f147c63a3a681b002076deff8c90e0b19d", - "reference": "8d5358f147c63a3a681b002076deff8c90e0b19d", + "url": "https://api.github.com/repos/composer/composer/zipball/72a8f8e653710e18d83e5dd531eb5a71fc3223e6", + "reference": "72a8f8e653710e18d83e5dd531eb5a71fc3223e6", "shasum": "" }, "require": { @@ -246,7 +246,7 @@ "irc": "ircs://irc.libera.chat:6697/composer", "issues": "https://github.com/composer/composer/issues", "security": "https://github.com/composer/composer/security/policy", - "source": "https://github.com/composer/composer/tree/2.9.2" + "source": "https://github.com/composer/composer/tree/2.9.5" }, "funding": [ { @@ -258,7 +258,7 @@ "type": "github" } ], - "time": "2025-11-19T20:57:25+00:00" + "time": "2026-01-29T10:40:53+00:00" }, { "name": "composer/metadata-minifier", @@ -5484,5 +5484,5 @@ "platform-overrides": { "php": "8.1.99" }, - "plugin-api-version": "2.6.0" + "plugin-api-version": "2.9.0" } diff --git a/features/download-extensions.feature b/features/download-extensions.feature index 012e3928..e757bd07 100644 --- a/features/download-extensions.feature +++ b/features/download-extensions.feature @@ -13,7 +13,7 @@ Feature: Extensions can be downloaded with PIE Examples: | constraint | version | | 2.0.5 | 2.0.5 | - | ^2.0 | 2.0.5 | + | ^2.0 | 2.0.8 | # pie download :dev-main @non-windows diff --git a/phpstan-baseline.neon b/phpstan-baseline.neon index 13c36588..5df0ca82 100644 --- a/phpstan-baseline.neon +++ b/phpstan-baseline.neon @@ -420,18 +420,6 @@ parameters: count: 1 path: test/unit/ComposerIntegration/VendorCleanupTest.php - - - message: '#^Parameter \#1 \$phpExt of method Composer\\Package\\Package\:\:setPhpExt\(\) expects array\{extension\-name\?\: string, priority\?\: int, support\-zts\?\: bool, support\-nts\?\: bool, build\-path\?\: string\|null, download\-url\-method\?\: string, os\-families\?\: non\-empty\-list\, os\-families\-exclude\?\: non\-empty\-list\, \.\.\.\}\|null, array\{download\-url\-method\: array\{''composer\-default''\}\} given\.$#' - identifier: argument.type - count: 1 - path: test/unit/DependencyResolver/PackageTest.php - - - - message: '#^Parameter \#1 \$phpExt of method Composer\\Package\\Package\:\:setPhpExt\(\) expects array\{extension\-name\?\: string, priority\?\: int, support\-zts\?\: bool, support\-nts\?\: bool, build\-path\?\: string\|null, download\-url\-method\?\: string, os\-families\?\: non\-empty\-list\, os\-families\-exclude\?\: non\-empty\-list\, \.\.\.\}\|null, array\{download\-url\-method\: array\{''pre\-packaged\-source'', ''composer\-default''\}\} given\.$#' - identifier: argument.type - count: 1 - path: test/unit/DependencyResolver/PackageTest.php - - message: '#^Parameter \#2 \$extractedSourcePath of static method Php\\Pie\\Downloading\\DownloadedPackage\:\:fromPackageAndExtractedPath\(\) expects string, string\|false given\.$#' identifier: argument.type @@ -439,7 +427,7 @@ parameters: path: test/unit/Downloading/DownloadedPackageTest.php - - message: '#^Parameter \#1 \$phpExt of method Composer\\Package\\Package\:\:setPhpExt\(\) expects array\{extension\-name\?\: string, priority\?\: int, support\-zts\?\: bool, support\-nts\?\: bool, build\-path\?\: string\|null, download\-url\-method\?\: string, os\-families\?\: non\-empty\-list\, os\-families\-exclude\?\: non\-empty\-list\, \.\.\.\}\|null, array\{extension\-name\: null\} given\.$#' + message: '#^Parameter \#1 \$phpExt of method Composer\\Package\\Package\:\:setPhpExt\(\) expects array\{extension\-name\?\: string, priority\?\: int, support\-zts\?\: bool, support\-nts\?\: bool, build\-path\?\: string\|null, download\-url\-method\?\: list\\|string, os\-families\?\: non\-empty\-list\, os\-families\-exclude\?\: non\-empty\-list\, \.\.\.\}\|null, array\{extension\-name\: null\} given\.$#' identifier: argument.type count: 1 path: test/unit/ExtensionNameTest.php diff --git a/src/DependencyResolver/Package.php b/src/DependencyResolver/Package.php index bfd7eba7..eb54d5d8 100644 --- a/src/DependencyResolver/Package.php +++ b/src/DependencyResolver/Package.php @@ -94,11 +94,11 @@ public static function fromComposerCompletePackage(CompletePackageInterface $com /** @var string|list $method */ $method = $phpExtOptions['download-url-method']; if (is_array($method)) { - if (count($method) !== 1) { - throw new InvalidArgumentException('This extension requires a newer version of PIE. Multiple download-url-methods are not supported until PIE 1.4.0.'); + if (count($method) === 1) { + $method = $method[0]; + } else { + $method = DownloadUrlMethod::ComposerDefaultDownload->value; } - - $method = $method[0]; } $package->downloadUrlMethod = DownloadUrlMethod::tryFrom($method); diff --git a/src/SelfManage/Update/FetchPieReleaseFromGitHub.php b/src/SelfManage/Update/FetchPieReleaseFromGitHub.php index aae223dd..9b03ee77 100644 --- a/src/SelfManage/Update/FetchPieReleaseFromGitHub.php +++ b/src/SelfManage/Update/FetchPieReleaseFromGitHub.php @@ -11,6 +11,7 @@ use Webmozart\Assert\Assert; use function array_filter; +use function array_key_exists; use function array_map; use function count; use function file_put_contents; @@ -85,7 +86,10 @@ static function (array $asset): bool { $firstAssetNamedPiePhar['browser_download_url'], ); }, - $decodedResponse, + array_filter( + $decodedResponse, + static fn (array $releaseResponse): bool => (! array_key_exists('draft', $releaseResponse) || ! $releaseResponse['draft']), + ), ), static function (ReleaseMetadata|null $releaseMetadata) use ($updateChannel): bool { if ($releaseMetadata === null) { diff --git a/test/integration/Command/DownloadCommandTest.php b/test/integration/Command/DownloadCommandTest.php index 13da63e7..0d063107 100644 --- a/test/integration/Command/DownloadCommandTest.php +++ b/test/integration/Command/DownloadCommandTest.php @@ -23,7 +23,7 @@ #[CoversClass(DownloadCommand::class)] class DownloadCommandTest extends TestCase { - private const TEST_PACKAGE_LATEST = '2.0.5'; + private const TEST_PACKAGE_LATEST = '2.0.8'; private const TEST_PACKAGE = 'asgrim/example-pie-extension'; private CommandTester $commandTester; diff --git a/test/integration/DependencyResolver/ResolveDependencyWithComposerTest.php b/test/integration/DependencyResolver/ResolveDependencyWithComposerTest.php index 0fcfbf51..aac93901 100644 --- a/test/integration/DependencyResolver/ResolveDependencyWithComposerTest.php +++ b/test/integration/DependencyResolver/ResolveDependencyWithComposerTest.php @@ -26,7 +26,7 @@ #[CoversClass(ResolveDependencyWithComposer::class)] final class ResolveDependencyWithComposerTest extends TestCase { - private const TEST_PACKAGE_LATEST = '2.0.5'; + private const TEST_PACKAGE_LATEST = '2.0.8'; private const DOWNLOAD_URL_ANY = 'https://api.github.com/repos/asgrim/example-pie-extension/zipball/%s'; private const DOWNLOAD_URL_1_0_1_ALPHA_3 = 'https://api.github.com/repos/asgrim/example-pie-extension/zipball/115f8f8e01ee098a18ec2f47af4852be51ebece7'; private const DOWNLOAD_URL_1_0_1 = 'https://api.github.com/repos/asgrim/example-pie-extension/zipball/769f906413d6d1e12152f6d34134cbcd347ca253'; diff --git a/test/unit/DependencyResolver/PackageTest.php b/test/unit/DependencyResolver/PackageTest.php index eebb5a17..d048da9c 100644 --- a/test/unit/DependencyResolver/PackageTest.php +++ b/test/unit/DependencyResolver/PackageTest.php @@ -173,8 +173,8 @@ public function testDownloadUrlMethodWithMultiItemListIsNotYetSupported(): void $composerCompletePackage = new CompletePackage('vendor/foo', '1.2.3.0', '1.2.3'); $composerCompletePackage->setPhpExt(['download-url-method' => ['pre-packaged-source', 'composer-default']]); - $this->expectException(InvalidArgumentException::class); - $this->expectExceptionMessage('This extension requires a newer version of PIE. Multiple download-url-methods are not supported until PIE 1.4.0.'); - Package::fromComposerCompletePackage($composerCompletePackage); + $package = Package::fromComposerCompletePackage($composerCompletePackage); + + self::assertSame(DownloadUrlMethod::ComposerDefaultDownload, $package->downloadUrlMethod()); } } diff --git a/test/unit/SelfManage/Update/FetchPieReleaseFromGitHubTest.php b/test/unit/SelfManage/Update/FetchPieReleaseFromGitHubTest.php index ea66dec0..840ec7a6 100644 --- a/test/unit/SelfManage/Update/FetchPieReleaseFromGitHubTest.php +++ b/test/unit/SelfManage/Update/FetchPieReleaseFromGitHubTest.php @@ -207,4 +207,60 @@ public function testDownloadContent(): void self::assertSame($pharContent, file_get_contents($file->filePath)); self::assertSame($expectedDigest, $file->checksum); } + + public function testDraftReleasesAreNotReturnedForStableChannel(): void + { + $httpDownloader = $this->createMock(HttpDownloader::class); + + $url = self::TEST_GITHUB_URL . '/repos/php/pie/releases'; + $httpDownloader->expects(self::once()) + ->method('get') + ->with( + $url, + [ + 'retry-auth-failure' => true, + 'http' => [ + 'method' => 'GET', + 'header' => [], + ], + ], + ) + ->willReturn( + new Response( + ['url' => $url], + 200, + [], + (string) json_encode([ + + [ + 'draft' => true, + 'tag_name' => '1.2.4', + 'assets' => [ + [ + 'name' => 'pie.phar', + 'browser_download_url' => self::TEST_GITHUB_URL . '/path/to/pie.phar', + ], + ], + ], + [ + 'draft' => false, + 'tag_name' => '1.2.3', + 'assets' => [ + [ + 'name' => 'pie.phar', + 'browser_download_url' => self::TEST_GITHUB_URL . '/path/to/pie.phar', + ], + ], + ], + ]), + ), + ); + + $fetch = new FetchPieReleaseFromGitHub(self::TEST_GITHUB_URL, $httpDownloader); + + $latestRelease = $fetch->latestReleaseMetadata(Channel::Stable); + + self::assertSame('1.2.3', $latestRelease->tag); + self::assertSame(self::TEST_GITHUB_URL . '/path/to/pie.phar', $latestRelease->downloadUrl); + } }