1919use Psr \Container \ContainerInterface ;
2020
2121use function array_map ;
22+ use function array_values ;
2223use function assert ;
2324use function file_exists ;
2425use function sprintf ;
@@ -72,6 +73,7 @@ public function runInstall(
7273 TargetPlatform $ targetPlatform ,
7374 bool $ forceInstallPackageVersion ,
7475 bool $ runCleanup ,
76+ bool $ installFromLock = false ,
7577 ): void {
7678 $ pieComposerJson = Platform::getPieJsonFilename ($ targetPlatform );
7779 $ pieJsonEditor = PieJsonEditor::fromTargetPlatform ($ targetPlatform );
@@ -90,7 +92,14 @@ public function runInstall(
9092 // Refresh the Composer instance so it re-reads the updated pie.json
9193 $ composer = PieComposerFactory::recreatePieComposer ($ this ->container , $ composer );
9294
93- foreach ($ composer ->getRepositoryManager ()->getLocalRepository ()->getPackages () as $ localRepoPackage ) {
95+ $ resolvedPackageByName = [];
96+ foreach ($ resolvedRequestedPackages as $ resolvedPackageRequest ) {
97+ $ resolvedPackageByName [$ resolvedPackageRequest ->piePackage ->composerPackage ()->getName ()] = $ resolvedPackageRequest ->piePackage ;
98+ }
99+
100+ $ localRepository = $ composer ->getRepositoryManager ()->getLocalRepository ();
101+
102+ foreach ($ localRepository ->getPackages () as $ localRepoPackage ) {
94103 $ extName = ExtensionName::determineFromComposerPackage ($ localRepoPackage );
95104
96105 if ($ localRepoPackage instanceof CompleteAliasPackage) {
@@ -110,6 +119,47 @@ public function runInstall(
110119 ), verbosity: IOInterface::VERY_VERBOSE );
111120
112121 if ($ status ->isVerified () && ! $ forceInstallPackageVersion ) {
122+ if ($ installFromLock ) {
123+ $ lockedRepo = $ composer ->getLocker ()->getLockedRepository ();
124+ $ lockedPackage = $ lockedRepo ->findPackage ($ localRepoPackage ->getName (), '* ' );
125+
126+ if ($ lockedPackage === null ) {
127+ // Not in locked repo; Composer will install it anyway
128+ continue ;
129+ }
130+
131+ if ($ lockedPackage ->getVersion () !== $ localRepoPackage ->getVersion ()) {
132+ $ this ->arrayCollectionIo ->write (sprintf (
133+ '%s PIE package %s (%s) is at %s but the lock requires %s, scheduling for reinstall. ' ,
134+ Emoji::WARNING ,
135+ $ localRepoPackage ->getName (),
136+ $ extName ->name (),
137+ $ localRepoPackage ->getPrettyVersion (),
138+ $ lockedPackage ->getPrettyVersion (),
139+ ));
140+
141+ // Locked, but the version we installed is different
142+ $ localRepository ->removePackage ($ localRepoPackage );
143+ continue ;
144+ }
145+ } else {
146+ $ resolvedPackage = $ resolvedPackageByName [$ localRepoPackage ->getName ()] ?? null ;
147+ if ($ resolvedPackage !== null && $ resolvedPackage ->composerPackage ()->getVersion () !== $ localRepoPackage ->getVersion ()) {
148+ $ this ->arrayCollectionIo ->write (sprintf (
149+ '%s PIE package %s (%s) is at %s but %s was installed, adding to install candidates. ' ,
150+ Emoji::WARNING ,
151+ $ localRepoPackage ->getName (),
152+ $ extName ->name (),
153+ $ localRepoPackage ->getPrettyVersion (),
154+ $ resolvedPackage ->composerPackage ()->getPrettyVersion (),
155+ ));
156+
157+ // Resolved a different version than what's installed
158+ $ localRepository ->removePackage ($ localRepoPackage );
159+ continue ;
160+ }
161+ }
162+
113163 $ this ->arrayCollectionIo ->write (sprintf (
114164 '%s PIE package %s (%s) is already installed and verified. ' ,
115165 Emoji::GREEN_CHECKMARK ,
@@ -144,12 +194,16 @@ public function runInstall(
144194 $ extName ->name (),
145195 $ status ->description (),
146196 ));
147- $ composer -> getRepositoryManager ()-> getLocalRepository () ->removePackage ($ localRepoPackage );
197+ $ localRepository ->removePackage ($ localRepoPackage );
148198 }
149199
200+ $ extensionNames = $ installFromLock
201+ ? array_values (array_map (ExtensionName::determineFromComposerPackage (...), $ composer ->getLocker ()->getLockedRepository ()->getPackages ()))
202+ : ResolvedPackageRequest::extensionNames ($ resolvedRequestedPackages );
203+
150204 $ composerInstaller = PieComposerInstaller::createWithPhpBinary (
151205 $ targetPlatform ->phpBinaryPath ,
152- ResolvedPackageRequest:: extensionNames ( $ resolvedRequestedPackages ) ,
206+ $ extensionNames ,
153207 $ this ->arrayCollectionIo ,
154208 $ composer ,
155209 );
@@ -161,7 +215,7 @@ public function runInstall(
161215 ->setPlatformRequirementFilter (PlatformRequirementFilterFactory::fromBoolOrList ($ forceInstallPackageVersion ))
162216 ->setDownloadOnly (false );
163217
164- if (file_exists (PieComposerFactory::getLockFile ($ pieComposerJson ))) {
218+ if (! $ installFromLock && file_exists (PieComposerFactory::getLockFile ($ pieComposerJson ))) {
165219 $ composerInstaller ->setUpdate (true );
166220 $ composerInstaller ->setUpdateAllowList (ResolvedPackageRequest::requestedPackageNames ($ resolvedRequestedPackages ));
167221 }
0 commit comments