Skip to content
This repository was archived by the owner on Feb 10, 2023. It is now read-only.

Commit 470f70d

Browse files
Fix computing the list of missing packages
1 parent 7b73157 commit 470f70d

File tree

2 files changed

+31
-14
lines changed

2 files changed

+31
-14
lines changed

src/Internal/ComposerPlugin.php

Lines changed: 28 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -153,10 +153,11 @@ public function postUpdate(Event $event)
153153
$composer->getPackage()->getDevRequires(),
154154
];
155155

156-
$missingRequires = $this->getMissingRequires($repo, $requires);
156+
$missingRequires = $this->getMissingRequires($repo, $requires, 'project' === $composer->getPackage()->getType());
157157
$missingRequires = [
158158
'require' => array_fill_keys(array_merge([], ...array_values($missingRequires[0])), '*'),
159159
'require-dev' => array_fill_keys(array_merge([], ...array_values($missingRequires[1])), '*'),
160+
'remove' => array_fill_keys(array_merge([], ...array_values($missingRequires[2])), '*'),
160161
];
161162

162163
if (!$missingRequires = array_filter($missingRequires)) {
@@ -224,7 +225,7 @@ public function postUpdate(Event $event)
224225
}
225226
}
226227

227-
public function getMissingRequires(InstalledRepositoryInterface $repo, array $requires): array
228+
public function getMissingRequires(InstalledRepositoryInterface $repo, array $requires, bool $isProject): array
228229
{
229230
$allPackages = [];
230231
$devPackages = array_flip($repo->getDevPackageNames());
@@ -234,9 +235,8 @@ public function getMissingRequires(InstalledRepositoryInterface $repo, array $re
234235
$requires[(int) isset($devPackages[$package->getName()])] += $package->getRequires();
235236
}
236237

237-
238238
$abstractions = [];
239-
$missingRequires = [[], []];
239+
$missingRequires = [[], [], []];
240240
$versionParser = new VersionParser();
241241

242242
foreach ($requires as $dev => $rules) {
@@ -249,15 +249,25 @@ public function getMissingRequires(InstalledRepositoryInterface $repo, array $re
249249
if (!isset($allPackages[$candidate])) {
250250
continue;
251251
}
252-
$missingRequires[$dev][$abstraction] = !$dev && isset($devPackages[$candidate]) ? [$candidate] : [];
252+
253+
if ($isProject && !$dev && isset($devPackages[$candidate])) {
254+
$missingRequires[0][$abstraction] = [$candidate];
255+
$missingRequires[2][$abstraction] = [$candidate];
256+
} else {
257+
$missingRequires[$dev][$abstraction] = [];
258+
}
253259

254260
foreach ($deps as $dep) {
255261
if (isset(self::PROVIDE_RULES[$dep])) {
256262
$rules[$dep] = self::PROVIDE_RULES[$dep];
257-
} elseif (!isset($allPackages[$dep]) || (!$dev && isset($devPackages[$dep]))) {
263+
} elseif (!isset($allPackages[$dep])) {
258264
$missingRequires[$dev][$abstraction][] = $dep;
265+
} elseif ($isProject && !$dev && isset($devPackages[$dep])) {
266+
$missingRequires[0][$abstraction][] = $dep;
267+
$missingRequires[2][$abstraction][] = $dep;
259268
}
260269
}
270+
break;
261271
}
262272
}
263273

@@ -270,14 +280,14 @@ public function getMissingRequires(InstalledRepositoryInterface $repo, array $re
270280
$candidates = self::PROVIDE_RULES[$abstraction];
271281

272282
foreach ($candidates as $candidate => $deps) {
273-
if (isset($allPackages[$candidate]) && (!$dev || isset($devPackages[$candidate]))) {
283+
if (isset($allPackages[$candidate]) && (!$isProject || $dev || !isset($devPackages[$candidate]))) {
274284
continue 2;
275285
}
276286
}
277287

278288
foreach (array_intersect_key(self::STICKYNESS_RULES, $candidates) as $candidate => $stickyRule) {
279289
[$stickyName, $stickyVersion] = explode(':', $stickyRule, 2) + [1 => null];
280-
if (!isset($allPackages[$stickyName]) || (!$dev && isset($devPackages[$stickyName]))) {
290+
if (!isset($allPackages[$stickyName]) || ($isProject && !$dev && isset($devPackages[$stickyName]))) {
281291
continue;
282292
}
283293
if (null !== $stickyVersion && !$repo->findPackage($stickyName, $versionParser->parseConstraints($stickyVersion))) {
@@ -293,14 +303,17 @@ public function getMissingRequires(InstalledRepositoryInterface $repo, array $re
293303
foreach (current($candidates) as $dep) {
294304
if (isset(self::PROVIDE_RULES[$dep])) {
295305
$abstractions[] = $dep;
296-
} elseif (!isset($allPackages[$dep]) || (!$dev && isset($devPackages[$dep]))) {
306+
} elseif (!isset($allPackages[$dep])) {
297307
$missingRequires[$dev][$abstraction][] = $dep;
308+
} elseif ($isProject && !$dev && isset($devPackages[$dep])) {
309+
$missingRequires[0][$abstraction][] = $dep;
310+
$missingRequires[2][$abstraction][] = $dep;
298311
}
299312
}
300313
}
301314
}
302315

303-
if (!isset($allPackages['nyholm/psr7'])) {
316+
if (!isset($allPackages['nyholm/psr7']) && !isset($allPackages['php-http/discovery'])) {
304317
foreach ($missingRequires as $dev => $abstractions) {
305318
if (\in_array('nyholm/psr7', $missingRequires[$dev]['psr/http-factory-implementation'] ?? [], true)) {
306319
continue;
@@ -328,7 +341,11 @@ public function updateComposerJson(array $missingRequires, bool $sortPackages)
328341

329342
foreach ($missingRequires as $key => $packages) {
330343
foreach ($packages as $package => $constraint) {
331-
$manipulator->addLink($key, $package, $constraint, $sortPackages);
344+
if ('remove' === $key) {
345+
$manipulator->removeSubNode('require-dev', $package);
346+
} else {
347+
$manipulator->addLink($key, $package, $constraint, $sortPackages);
348+
}
332349
}
333350
}
334351

tests/Internal/ComposerPluginTest.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,15 +24,15 @@ public function testMissingRequires(array $expected, InstalledArrayRepository $r
2424
{
2525
$plugin = new ComposerPlugin();
2626

27-
$this->assertSame($expected, $plugin->getMissingRequires($repo, [$rootRequires, $rootDevRequires]));
27+
$this->assertSame($expected, $plugin->getMissingRequires($repo, [$rootRequires, $rootDevRequires], true));
2828
}
2929

3030
public function provideMissingRequires()
3131
{
3232
$link = new Link('source', 'target', new Constraint(Constraint::STR_OP_GE, '1'));
3333
$repo = new InstalledArrayRepository([]);
3434

35-
yield 'empty' => [[[], []], $repo, [], []];
35+
yield 'empty' => [[[], [], []], $repo, [], []];
3636

3737
$rootRequires = [
3838
'php-http/async-client-implementation' => $link,
@@ -46,7 +46,7 @@ public function provideMissingRequires()
4646
'psr/http-factory-implementation' => [
4747
'nyholm/psr7',
4848
],
49-
], []];
49+
], [], []];
5050

5151
yield 'async-httplug' => [$expected, $repo, $rootRequires, []];
5252
}

0 commit comments

Comments
 (0)