|
4 | 4 |
|
5 | 5 | namespace RoadRunner\VersionChecker\Version; |
6 | 6 |
|
| 7 | +use Composer\InstalledVersions; |
| 8 | +use Composer\Semver\Comparator as SemverComparator; |
| 9 | +use Composer\Semver\VersionParser; |
| 10 | + |
7 | 11 | final class Required implements RequiredInterface |
8 | 12 | { |
| 13 | + private const ROADRUNNER_PACKAGE = 'spiral/roadrunner'; |
| 14 | + |
9 | 15 | /** |
| 16 | + * @return non-empty-string|null |
| 17 | + */ |
| 18 | + public function getRequiredVersion(): ?string |
| 19 | + { |
| 20 | + $parser = new VersionParser(); |
| 21 | + |
| 22 | + $version = null; |
| 23 | + foreach (InstalledVersions::getInstalledPackages() as $package) { |
| 24 | + $path = InstalledVersions::getInstallPath($package); |
| 25 | + if ($path !== null && \file_exists($path . '/composer.json')) { |
| 26 | + /** @var array $composerJson */ |
| 27 | + $composerJson = \json_decode(\file_get_contents($path . '/composer.json'), true); |
| 28 | + |
| 29 | + if (isset($composerJson['require']) && \is_array($composerJson['require'])) { |
| 30 | + /** @var non-empty-string $packageVersion */ |
| 31 | + foreach ($composerJson['require'] as $package => $packageVersion) { |
| 32 | + if ($package === self::ROADRUNNER_PACKAGE) { |
| 33 | + /** @var non-empty-string $packageVersion */ |
| 34 | + $packageVersion = $parser->normalize($packageVersion); |
| 35 | + $version = $this->getMinimumVersion($packageVersion, $version); |
| 36 | + } |
| 37 | + } |
| 38 | + } |
| 39 | + } |
| 40 | + } |
| 41 | + |
| 42 | + return $version; |
| 43 | + } |
| 44 | + |
| 45 | + /** |
| 46 | + * @param non-empty-string $version |
| 47 | + * @param non-empty-string|null $previous |
10 | 48 | * @return non-empty-string |
11 | 49 | */ |
12 | | - public function getRequiredVersion(): string |
| 50 | + private function getMinimumVersion(string $version, ?string $previous = null): string |
13 | 51 | { |
14 | | - return '1.0'; // TODO need implementation |
| 52 | + if ($previous === null) { |
| 53 | + return $version; |
| 54 | + } |
| 55 | + |
| 56 | + return SemverComparator::lessThan($version, $previous) ? $version : $previous; |
15 | 57 | } |
16 | 58 | } |
0 commit comments