-
-
Notifications
You must be signed in to change notification settings - Fork 12
/
PackageProviderDetectionFactory.php
82 lines (68 loc) · 2.57 KB
/
PackageProviderDetectionFactory.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
<?php
declare(strict_types=1);
namespace Laminas\ComponentInstaller\PackageProvider;
use Composer\Composer;
use Composer\Installer\PackageEvent;
use Composer\IO\IOInterface;
use Composer\IO\NullIO;
use Composer\Repository\CompositeRepository;
use Composer\Repository\InstalledArrayRepository;
use Composer\Repository\InstalledRepository;
use Composer\Repository\PlatformRepository;
use Composer\Repository\RepositoryFactory;
use Composer\Repository\RepositoryInterface;
use Composer\Repository\RepositoryInterface as ComposerRepositoryInterface;
use Composer\Repository\RootPackageRepository;
use function method_exists;
/**
* @internal
*/
final class PackageProviderDetectionFactory implements PackageProviderDetectionFactoryInterface
{
private Composer $composer;
private RootPackageRepository $packageRepository;
public function __construct(Composer $composer)
{
$this->composer = $composer;
$this->packageRepository = new RootPackageRepository($composer->getPackage());
}
public static function create(Composer $composer): self
{
return new self($composer);
}
public function detect(PackageEvent $event, string $packageName): PackageProviderDetectionInterface
{
$installedRepo = new InstalledRepository($this->prepareRepositoriesForInstalledRepository());
$defaultRepos = new CompositeRepository($this->createDefaultRepos(new NullIO()));
if (
($match = $defaultRepos->findPackage($packageName, '*'))
&& false === $installedRepo->hasPackage($match)
) {
$installedRepo->addRepository(new InstalledArrayRepository([clone $match]));
}
return new InstalledRepositoryPackageProvider($installedRepo);
}
/**
* @return list<ComposerRepositoryInterface>
*/
private function prepareRepositoriesForInstalledRepository(): array
{
/** @var array<string,string|false> $platformOverrides */
$platformOverrides = $this->composer->getConfig()->get('platform') ?? [];
return [
$this->packageRepository,
$this->composer->getRepositoryManager()->getLocalRepository(),
new PlatformRepository([], $platformOverrides),
];
}
/**
* @return RepositoryInterface[]
*/
private function createDefaultRepos(IOInterface $io): array
{
if (method_exists(RepositoryFactory::class, 'defaultReposWithDefaultManager')) {
return RepositoryFactory::defaultReposWithDefaultManager($io);
}
return RepositoryFactory::defaultRepos($io);
}
}