From d3446d4ef8970c700d96ecbb150b0ab3271e1ee7 Mon Sep 17 00:00:00 2001 From: James Titcumb Date: Tue, 3 Nov 2026 20:24:07 +0000 Subject: [PATCH] 790: disable mirrors when PIE overrides download URLs --- .../OverrideDownloadUrlInstallListener.php | 5 + ...OverrideDownloadUrlInstallListenerTest.php | 133 ++++++++++++++++++ 2 files changed, 138 insertions(+) diff --git a/src/ComposerIntegration/Listeners/OverrideDownloadUrlInstallListener.php b/src/ComposerIntegration/Listeners/OverrideDownloadUrlInstallListener.php index 199acf4e..e2ae1921 100644 --- a/src/ComposerIntegration/Listeners/OverrideDownloadUrlInstallListener.php +++ b/src/ComposerIntegration/Listeners/OverrideDownloadUrlInstallListener.php @@ -12,6 +12,7 @@ use Composer\Installer\InstallerEvents; use Composer\IO\IOInterface; use Composer\Package\CompletePackageInterface; +use Composer\Package\Package as ComposerPackage; use Composer\Util\HttpDownloader; use Php\Pie\ComposerIntegration\PieComposerRequest; use Php\Pie\ComposerIntegration\PieOperation; @@ -155,6 +156,10 @@ function (OperationInterface $operation): void { $this->composerRequest->pieOutput->write('Found prebuilt archive: ' . $matchedReleaseAsset->url); $composerPackage->setDistUrl($matchedReleaseAsset->url); + $composerPackage->setDistMirrors(null); + if ($composerPackage instanceof ComposerPackage) { + $composerPackage->setDistSha1Checksum(null); + } $composerPackage->setTransportOptions(array_merge_recursive( $composerPackage->getTransportOptions(), diff --git a/test/unit/ComposerIntegration/Listeners/OverrideDownloadUrlInstallListenerTest.php b/test/unit/ComposerIntegration/Listeners/OverrideDownloadUrlInstallListenerTest.php index a04eeb83..b2ad4e66 100644 --- a/test/unit/ComposerIntegration/Listeners/OverrideDownloadUrlInstallListenerTest.php +++ b/test/unit/ComposerIntegration/Listeners/OverrideDownloadUrlInstallListenerTest.php @@ -390,6 +390,139 @@ public function testDistUrlIsUpdatedForPrePackagedTgzSource(): void self::assertSame('tar', $composerPackage->getDistType()); } + public function testPreferredDistMirrorDoesNotReplaceReleaseAssetUrl(): void + { + $composerPackage = new CompletePackage('foo/bar', '1.2.3.0', '1.2.3'); + $composerPackage->setDistType('zip'); + $composerPackage->setDistUrl('https://example.com/git-archive-zip-url'); + $composerPackage->setDistReference('abc123'); + $composerPackage->setDistMirrors([ + [ + 'url' => 'https://mirror.example.com/dists/%package%/%version%/r%reference%.%type%', + 'preferred' => true, + ], + ]); + $composerPackage->setPhpExt([ + 'extension-name' => 'foobar', + 'download-url-method' => 'pre-packaged-source', + ]); + + $installerEvent = new InstallerEvent( + InstallerEvents::PRE_OPERATIONS_EXEC, + $this->composer, + $this->io, + false, + true, + new Transaction([], [$composerPackage]), + ); + + $packageReleaseAssets = $this->createMock(PackageReleaseAssets::class); + $packageReleaseAssets + ->expects(self::once()) + ->method('findMatchingReleaseAsset') + ->willReturn(new MatchedReleaseAsset( + 'https://api.github.com/repos/foo/bar/releases/assets/22222', + 'php_foobar-1.2.3-src.tgz', + )); + + $this->container + ->method('get') + ->with(PackageReleaseAssets::class) + ->willReturn($packageReleaseAssets); + + (new OverrideDownloadUrlInstallListener( + $this->composer, + $this->io, + $this->container, + new PieComposerRequest( + $this->createMock(IOInterface::class), + new TargetPlatform( + OperatingSystem::NonWindows, + OperatingSystemFamily::Linux, + PhpBinaryPath::fromCurrentProcess(), + Architecture::x86_64, + ThreadSafetyMode::NonThreadSafe, + 1, + WindowsCompiler::VC15, + null, + ), + [new RequestedPackageAndVersion('foo/bar', '^1.1')], + PieOperation::Install, + [], + false, + ), + ))($installerEvent); + + self::assertSame( + ['https://api.github.com/repos/foo/bar/releases/assets/22222'], + $composerPackage->getDistUrls(), + ); + } + + public function testRepositoryShasumIsNotUsedForReleaseAsset(): void + { + $composerPackage = new CompletePackage('foo/bar', '1.2.3.0', '1.2.3'); + $composerPackage->setDistType('zip'); + $composerPackage->setDistUrl('https://example.com/git-archive-zip-url'); + $composerPackage->setDistSha1Checksum('da39a3ee5e6b4b0d3255bfef95601890afd80709'); + $composerPackage->setPhpExt([ + 'extension-name' => 'foobar', + 'download-url-method' => 'pre-packaged-source', + ]); + + $installerEvent = new InstallerEvent( + InstallerEvents::PRE_OPERATIONS_EXEC, + $this->composer, + $this->io, + false, + true, + new Transaction([], [$composerPackage]), + ); + + $packageReleaseAssets = $this->createMock(PackageReleaseAssets::class); + $packageReleaseAssets + ->expects(self::once()) + ->method('findMatchingReleaseAsset') + ->willReturn(new MatchedReleaseAsset( + 'https://api.github.com/repos/foo/bar/releases/assets/22222', + 'php_foobar-1.2.3-src.tgz', + )); + + $this->container + ->method('get') + ->with(PackageReleaseAssets::class) + ->willReturn($packageReleaseAssets); + + (new OverrideDownloadUrlInstallListener( + $this->composer, + $this->io, + $this->container, + new PieComposerRequest( + $this->createMock(IOInterface::class), + new TargetPlatform( + OperatingSystem::NonWindows, + OperatingSystemFamily::Linux, + PhpBinaryPath::fromCurrentProcess(), + Architecture::x86_64, + ThreadSafetyMode::NonThreadSafe, + 1, + WindowsCompiler::VC15, + null, + ), + [new RequestedPackageAndVersion('foo/bar', '^1.1')], + PieOperation::Install, + [], + false, + ), + ))($installerEvent); + + self::assertSame( + 'https://api.github.com/repos/foo/bar/releases/assets/22222', + $composerPackage->getDistUrl(), + ); + self::assertNull($composerPackage->getDistSha1Checksum()); + } + public function testDistUrlIsUpdatedForPrePackagedTgzBinaryWhenBinaryIsFound(): void { $composerPackage = new CompletePackage('foo/bar', '1.2.3.0', '1.2.3');