Skip to content

Commit d82edd7

Browse files
committed
TEMP locked pacakges
Signed-off-by: Tim Goudriaan <tim@codedmonkey.com>
1 parent a59fee1 commit d82edd7

4 files changed

Lines changed: 108 additions & 12 deletions

File tree

src/Composer/ComposerClient.php

Lines changed: 48 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,18 @@
44

55
use CodedMonkey\Dirigent\Doctrine\Entity\Package;
66
use CodedMonkey\Dirigent\Doctrine\Entity\Registry;
7+
use CodedMonkey\Dirigent\Doctrine\Entity\Version;
78
use Composer\Config;
89
use Composer\Factory;
10+
use Composer\Installer\InstallationManager;
911
use Composer\IO\IOInterface;
1012
use Composer\IO\NullIO;
13+
use Composer\Package\Locker;
1114
use Composer\Repository\ComposerRepository;
1215
use Composer\Repository\VcsRepository;
1316
use Composer\Util\HttpDownloader;
17+
use Composer\Util\Loop;
18+
use Composer\Util\ProcessExecutor;
1419

1520
class ComposerClient
1621
{
@@ -19,10 +24,7 @@ public function createComposerRepository(Package|Registry $registry, ?IOInterfac
1924
$registry = $registry instanceof Package ? $registry->getMirrorRegistry() : $registry;
2025

2126
$config ??= ConfigFactory::createForRegistry($registry);
22-
if (!$io) {
23-
$io = new NullIO();
24-
$io->loadConfiguration($config);
25-
}
27+
$io ??= $this->createIo($io);
2628
$httpDownloader = $this->createHttpDownloader($io, $config);
2729

2830
return new ComposerRepository(['url' => $registry->getUrl()], $io, $config, $httpDownloader);
@@ -33,10 +35,7 @@ public function createVcsRepository(Package $package, ?IOInterface $io = null, ?
3335
$repoUrl = $package->getRepositoryUrl();
3436

3537
$config ??= ConfigFactory::createForVcsRepository($repoUrl, $package->getRepositoryCredentials());
36-
if (!$io) {
37-
$io = new NullIO();
38-
$io->loadConfiguration($config);
39-
}
38+
$io ??= $this->createIo($io);
4039
$httpDownloader = $this->createHttpDownloader($io, $config);
4140

4241
return new VcsRepository(['url' => $repoUrl], $io, $config, $httpDownloader);
@@ -45,14 +44,51 @@ public function createVcsRepository(Package $package, ?IOInterface $io = null, ?
4544
public function createHttpDownloader(?IOInterface $io = null, ?Config $config = null): HttpDownloader
4645
{
4746
$config ??= Factory::createConfig();
48-
if (!$io) {
49-
$io = new NullIO();
50-
$io->loadConfiguration($config);
51-
}
47+
$io ??= $this->createIo($io);
5248

5349
return new HttpDownloader($io, $config, self::getHttpDownloaderOptions());
5450
}
5551

52+
public function createIo(?Config $config = null): IOInterface
53+
{
54+
$io = new NullIO();
55+
$io->loadConfiguration($config);
56+
57+
return $io;
58+
}
59+
60+
public function createLocker(Version $version, ?IOInterface $io = null, ?Config $config = null): ?Locker
61+
{
62+
$package = $version->getPackage();
63+
64+
$config ??= ConfigFactory::createForVcsRepository($package->getRepositoryUrl(), $package->getRepositoryCredentials());
65+
$io ??= $this->createIo($config);
66+
$repository = $this->createVcsRepository($package, $io, $config);
67+
$driver = $repository->getDriver();
68+
$process = $this->createProcessExecutor($io);
69+
$httpDownloader = $this->createHttpDownloader($io, $config);
70+
$loop = new Loop($httpDownloader, $process);
71+
$installationManager = new InstallationManager($loop, $io);
72+
73+
$jsonSource = $driver->getFileContent('composer.json', $version->getSource()['reference']);
74+
$lockerSource = $driver->getFileContent('composer.lock', $version->getSource()['reference']);
75+
76+
if (empty($lockerSource)) {
77+
return null;
78+
}
79+
80+
$lockerJsonFile = new InMemoryJsonFile($lockerSource);
81+
82+
return new Locker($io, $lockerJsonFile, $installationManager, $jsonSource);
83+
}
84+
85+
public function createProcessExecutor(?IOInterface $io = null): ProcessExecutor
86+
{
87+
$io ??= $this->createIo($io);
88+
89+
return new ProcessExecutor($io);
90+
}
91+
5692
public static function getHttpDownloaderOptions(): array
5793
{
5894
$options['http']['header'][] = 'User-Agent: Dirigent (https://github.com/codedmonkey/dirigent)';

src/Composer/InMemoryJsonFile.php

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
<?php
2+
3+
/*
4+
* © CleverMobi
5+
*/
6+
7+
declare(strict_types=1);
8+
9+
namespace CodedMonkey\Dirigent\Composer;
10+
11+
use Composer\Json\JsonFile;
12+
13+
class InMemoryJsonFile extends JsonFile
14+
{
15+
public function __construct(
16+
private readonly string $contents,
17+
) {
18+
parent::__construct('in-memory');
19+
}
20+
21+
public function exists(): bool
22+
{
23+
return true;
24+
}
25+
26+
public function read(): array
27+
{
28+
return static::parseJson($this->contents, 'in-memory');
29+
}
30+
31+
public function write(array $hash, int $options = JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE)
32+
{
33+
throw new \LogicException();
34+
}
35+
}

src/Message/UpdatePackageLinksHandler.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
use CodedMonkey\Dirigent\Doctrine\Repository\PackageRepository;
66
use CodedMonkey\Dirigent\Doctrine\Repository\VersionRepository;
7+
use CodedMonkey\Dirigent\Package\PackageMetadataResolver;
78
use Symfony\Component\Messenger\Attribute\AsMessageHandler;
89

910
#[AsMessageHandler]
@@ -12,6 +13,7 @@
1213
public function __construct(
1314
private PackageRepository $packageRepository,
1415
private VersionRepository $versionRepository,
16+
private PackageMetadataResolver $metadataResolver,
1517
) {
1618
}
1719

@@ -21,5 +23,7 @@ public function __invoke(UpdatePackageLinks $message): void
2123
$version = $this->versionRepository->findOneByNormalizedVersion($package, $message->versionName);
2224

2325
$this->packageRepository->updatePackageLinks($package, $version);
26+
27+
$this->metadataResolver->updateLockedPackages($version);
2428
}
2529
}

src/Package/PackageMetadataResolver.php

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44

55
use cebe\markdown\GithubMarkdown;
66
use CodedMonkey\Dirigent\Composer\ComposerClient;
7+
use CodedMonkey\Dirigent\Composer\ConfigFactory;
8+
use CodedMonkey\Dirigent\Composer\InMemoryJsonFile;
79
use CodedMonkey\Dirigent\Doctrine\Entity\AbstractVersionLink;
810
use CodedMonkey\Dirigent\Doctrine\Entity\Package;
911
use CodedMonkey\Dirigent\Doctrine\Entity\PackageFetchStrategy;
@@ -21,10 +23,15 @@
2123
use CodedMonkey\Dirigent\Doctrine\Repository\VersionRepository;
2224
use CodedMonkey\Dirigent\Message\DumpPackageProvider;
2325
use CodedMonkey\Dirigent\Message\UpdatePackageLinks;
26+
use Composer\Installer\InstallationManager;
27+
use Composer\IO\NullIO;
2428
use Composer\Package\AliasPackage;
2529
use Composer\Package\CompletePackageInterface;
30+
use Composer\Package\Locker;
2631
use Composer\Pcre\Preg;
2732
use Composer\Repository\Vcs\VcsDriverInterface;
33+
use Composer\Util\Loop;
34+
use Composer\Util\ProcessExecutor;
2835
use Doctrine\ORM\EntityManagerInterface;
2936
use Symfony\Component\Messenger\Envelope;
3037
use Symfony\Component\Messenger\MessageBusInterface;
@@ -120,6 +127,8 @@ private function resolveRegistryPackage(Package $package, ?Registry $registry =
120127
/** @var CompletePackageInterface[] $composerPackages */
121128
$composerPackages = $repository->findPackages($packageName);
122129

130+
dd($composerPackages);
131+
123132
$this->updatePackage($package, $composerPackages);
124133
}
125134

@@ -156,6 +165,10 @@ private function resolveVcsPackage(Package $package): void
156165
/** @var CompletePackageInterface[] $composerPackages */
157166
$composerPackages = $repository->findPackages($packageName);
158167

168+
dump($repository);
169+
dump($composerPackages[0]);
170+
//dd($composerPackages);
171+
159172
$this->updatePackage($package, $composerPackages, $driver);
160173
}
161174

@@ -431,6 +444,14 @@ private function sanitize(?string $str): ?string
431444
return Preg::replace("{[\x01-\x1A]}u", '', $str);
432445
}
433446

447+
private function updateLockedPackages(Version $version): void
448+
{
449+
$locker = $this->composer->createLocker($version);
450+
451+
dump($locker->getLockedRepository());
452+
dd();
453+
}
454+
434455
private function updateReadme(Version $version, VcsDriverInterface $driver): void
435456
{
436457
try {

0 commit comments

Comments
 (0)