77use Composer \Installer \InstallationManager ;
88use Composer \Package \PackageInterface ;
99
10+ use Composer \Package \RootPackageInterface ;
11+ use Composer \Repository \ArrayRepository ;
1012use Composer \Repository \RepositoryManager ;
1113use Composer \Util \ProcessExecutor ;
1214use Psr \Log \LoggerInterface ;
@@ -83,6 +85,16 @@ class Patcher
8385 */
8486 private $ processExecutor ;
8587
88+ /**
89+ * @var ArrayRepository
90+ */
91+ private $ installedRepository ;
92+
93+ /**
94+ * @var RootPackageInterface
95+ */
96+ private $ rootPackage ;
97+
8698 /**
8799 * The constructor computes state, so it needs to be called only after all packages have been installed
88100 * and the local composer repository updated.
@@ -91,20 +103,24 @@ class Patcher
91103 * @param InstallationManager $installationManager
92104 * @param RepositoryManager $repositoryManager
93105 * @param ProcessExecutor $processExecutor
106+ * @param RootPackageInterface $rootPackage
94107 */
95108 public function __construct (
96109 LoggerInterface $ logger ,
97110 InstallationManager $ installationManager ,
98111 RepositoryManager $ repositoryManager ,
99- ProcessExecutor $ processExecutor
112+ ProcessExecutor $ processExecutor ,
113+ RootPackageInterface $ rootPackage
100114 ) {
101115 $ this ->logger = $ logger ;
116+ $ this ->rootPackage = $ rootPackage ;
102117 $ this ->collector = new PatchCollector ($ this ->logger );
103118 $ this ->operationResolver = new OperationResolver ();
104119 $ this ->installationManager = $ installationManager ;
105120 $ this ->repositoryManager = $ repositoryManager ;
106121 $ this ->pathResolver = new PathResolver ($ installationManager );
107122 $ this ->processExecutor = $ processExecutor ;
123+ $ this ->installedRepository = $ this ->buildInstalledRepository ();
108124
109125 $ this ->applicator = new PatchApplicator (
110126 $ this ->logger ,
@@ -114,7 +130,7 @@ public function __construct(
114130 );
115131
116132 $ this ->packageApplicationRepository = new PackageApplicationRepository (
117- $ this ->repositoryManager -> getLocalRepository () ,
133+ $ this ->installedRepository ,
118134 $ this ->installationManager ,
119135 $ this ->pathResolver ,
120136 $ this ->logger
@@ -125,6 +141,23 @@ public function __construct(
125141 $ this ->installedPackageApplications = $ this ->packageApplicationRepository ->getPackageApplications ();
126142
127143 list ($ this ->packagesToReinstall , $ this ->packagesToPatch ) = $ this ->computeChanges ();
144+
145+ }
146+
147+ /**
148+ * @return ArrayRepository
149+ */
150+ private function buildInstalledRepository ()
151+ {
152+ $ repo = new ArrayRepository (array_map (function (PackageInterface $ package ) {
153+ return clone $ package ;
154+ }, $ this ->repositoryManager ->getLocalRepository ()->getCanonicalPackages ()));
155+
156+ $ rootPackage = clone $ this ->rootPackage ;
157+
158+ $ repo ->addPackage ($ rootPackage );
159+
160+ return $ repo ;
128161 }
129162
130163 /**
@@ -133,7 +166,7 @@ public function __construct(
133166 private function collectPatches ()
134167 {
135168 return $ this ->collector ->collectFromRepository (
136- $ this ->repositoryManager -> getLocalRepository ()
169+ $ this ->installedRepository
137170 );
138171 }
139172
@@ -143,7 +176,7 @@ private function collectPatches()
143176 private function computeTargetPackageApplications ()
144177 {
145178 $ packageApplications = [];
146- $ repo = $ this ->repositoryManager -> getLocalRepository () ;
179+ $ repo = $ this ->installedRepository ;
147180
148181 $ patchesByPackage = [];
149182
0 commit comments