Skip to content

Commit

Permalink
Merge branch 'contao:main' into main
Browse files Browse the repository at this point in the history
  • Loading branch information
christianbarkowsky authored Aug 8, 2024
2 parents 8d96007 + 93d3637 commit 0087b32
Show file tree
Hide file tree
Showing 73 changed files with 762 additions and 223 deletions.
3 changes: 3 additions & 0 deletions CODEOWNERS
Validating CODEOWNERS rules …
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@
/meta/heimrichhannot/ @heimrichhannot @koertho
/meta/inspiredminds/ @fritzmg
/meta/isotope/ @aschempp @Toflar @netzarbeiter
/meta/lukasbableck/ @lukasbableck
/meta/madeyourday/ @ausi
/meta/markenzoo/ @felix-kaestner
/meta/myparcelcom/ @derkurier100
Expand All @@ -52,3 +53,5 @@
/meta/agonyz/ @agonyz
/meta/jb-support/ @jb-support
/meta/xenbyte/ @av3
/meta/jedocodes/ @jedoCodes
/meta/jedocodes-components/ @jedoCodes @jedocodes-components
1 change: 1 addition & 0 deletions indexer/composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
"ext-json": "*",
"algolia/algoliasearch-client-php": "^1.27",
"composer/metadata-minifier": "^1.0",
"composer/semver": "^3.4",
"symfony/console": "^6.0",
"symfony/finder": "^6.0",
"symfony/filesystem": "^6.0",
Expand Down
85 changes: 83 additions & 2 deletions indexer/composer.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 1 addition & 2 deletions indexer/index
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,7 @@ $httpClient = new CachingHttpClient($httpClient, $store, [/*'trace_level' => 'fu
$packagist = new Packagist($output, $httpClient);
$metadataRepository = new MetaDataRepository(dirname(__DIR__).'/meta');
$packageFactory = new Factory($metadataRepository, $packagist);
$algoliaClient = new Client($_SERVER['ALGOLIA_APP_ID'], $_SERVER['ALGOLIA_API_KEY']);
$command = new IndexCommand($packagist, $packageFactory, $algoliaClient, $metadataRepository, $httpClient);
$command = new IndexCommand($packagist, $packageFactory, $metadataRepository, $httpClient);

$application = new Application();
$application->add($command);
Expand Down
11 changes: 8 additions & 3 deletions indexer/src/Command/IndexCommand.php
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ class IndexCommand extends Command
*/
private array $packages;

public function __construct(private readonly Packagist $packagist, private readonly Factory $packageFactory, private readonly Client $algoliaClient, private readonly MetaDataRepository $metaDataRepository, private readonly HttpClientInterface $httpClient)
public function __construct(private readonly Packagist $packagist, private readonly Factory $packageFactory, private readonly MetaDataRepository $metaDataRepository, private readonly HttpClientInterface $httpClient, private readonly Client|null $algoliaClient = null)
{
parent::__construct();
}
Expand All @@ -66,7 +66,10 @@ protected function execute(InputInterface $input, OutputInterface $output): int
$this->packages = [];

$this->initLanguages();
$this->initIndex($clearIndex);

if (!$dryRun) {
$this->initIndex($clearIndex);
}

$updateAll = false;
$packageNames = $input->getArgument('packages');
Expand Down Expand Up @@ -204,8 +207,10 @@ private function indexPackages(bool $dryRun, bool $updateStats): void

private function initIndex(bool $clearIndex): void
{
$client = $this->algoliaClient ?: new Client($_SERVER['ALGOLIA_APP_ID'], $_SERVER['ALGOLIA_API_KEY']);

/** @noinspection PhpUnhandledExceptionInspection */
$this->index = $this->algoliaClient->initIndex($_SERVER['ALGOLIA_INDEX']);
$this->index = $client->initIndex($_SERVER['ALGOLIA_INDEX']);
$this->indexData = [];

if ($clearIndex) {
Expand Down
112 changes: 112 additions & 0 deletions indexer/src/Package/Factory.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,10 @@

namespace Contao\PackageMetaDataIndexer\Package;

use Composer\Semver\Constraint\Constraint;
use Composer\Semver\Constraint\MultiConstraint;
use Composer\Semver\Intervals;
use Composer\Semver\VersionParser;
use Contao\PackageMetaDataIndexer\Command\IndexCommand;
use Contao\PackageMetaDataIndexer\MetaDataRepository;
use Contao\PackageMetaDataIndexer\Packagist;
Expand All @@ -12,6 +16,8 @@ class Factory
{
private array $cache = [];

private array $contaoVersions = [];

public function __construct(private readonly MetaDataRepository $metaData, private readonly Packagist $packagist)
{
}
Expand Down Expand Up @@ -70,6 +76,18 @@ private function setDataForPrivate(Package $package): void
$package->setReleased($data['time'] ?? null);
$package->setUpdated($data['time'] ?? null);
$package->setSuggest($data['suggest'] ?? null);

if (isset($data['require']['contao/core-bundle'])) {
try {
$contaoConstraint = (new VersionParser())->parseConstraints($data['require']['contao/core-bundle']);
$contaoConstraint = $this->normalizeConstraints([$contaoConstraint]);

$package->setContaoConstraint($contaoConstraint);
$package->setContaoVersions($this->buildContaoVersions($contaoConstraint));
} catch (\Throwable) {
// Ignore
}
}
}

private function setBasicDataFromPackagist(array $data, Package $package): void
Expand All @@ -78,6 +96,8 @@ private function setBasicDataFromPackagist(array $data, Package $package): void
$versions = array_keys($data['packages']['versions']);
// $data['p'] contains the non-cached data, while only $data['packages'] has the "support" metadata
$latestPackages = $this->findLatestVersion($data['packages']['versions']);
$contaoConstraint = $this->buildContaoConstraint($data['p']);
$contaoVersions = $contaoConstraint ? $this->buildContaoVersions($contaoConstraint) : null;

sort($versions);

Expand All @@ -96,6 +116,8 @@ private function setBasicDataFromPackagist(array $data, Package $package): void
$package->setSupported($this->isSupported($data['packages']['versions']));
$package->setAbandoned($data['packages']['abandoned'] ?? false);
$package->setSuggest($latest['suggest'] ?? null);
$package->setContaoConstraint($contaoConstraint);
$package->setContaoVersions($contaoVersions);
$package->setPrivate(false);
}

Expand Down Expand Up @@ -169,4 +191,94 @@ static function (?string $prev, string $curr) use ($versions) {

return $versions[$latest] ?? [];
}

private function buildContaoConstraint(array $versions): string|null
{
$constraints = [];

foreach ($versions as $package) {
if (VersionParser::parseStability($package['version']) !== 'stable') {
continue;
}

if (!$constraint = $package['require']['contao/core-bundle'] ?? null) {
continue;
}

if ('self.version' === $constraint) {
$constraint = $package['version'];
}

try {
$constraints[] = (new VersionParser())->parseConstraints($constraint);
} catch (\Throwable) {
// Ignore
}
}

if (!$constraints) {
return null;
}

return $this->normalizeConstraints($constraints);
}

private function buildContaoVersions(string $contaoConstraint): array
{
if (!$this->contaoVersions) {
$data = $this->packagist->getPackageData('contao/core-bundle');

foreach ($data['p'] as $package) {
$version = explode('.', (new VersionParser())->normalize($package['version'] ?? ''));

if (\count($version) > 3 && (int) $version[0]) {
$this->contaoVersions[(int) $version[0]][(int) $version[1]] ??= implode('.', $version);
}
}

ksort($this->contaoVersions);

foreach ($this->contaoVersions as $major => $minors) {
ksort($this->contaoVersions[$major]);
}
}

$constraint = (new VersionParser())->parseConstraints($contaoConstraint);

$matches = [];

foreach ($this->contaoVersions as $major => $minors) {
$prefix = '';
$lastMinor = 0;

foreach ($minors as $minor => $versionString) {
if ($constraint->matches(new Constraint('=', $versionString))) {
if (!$prefix) {
$prefix = "$major.$minor";
}
} elseif ($prefix) {
$version = "$major.$lastMinor";
$matches[] = $version === $prefix ? $version : "$prefix - $version";
$prefix = '';
}

$lastMinor = $minor;
}

if ($prefix) {
$matches[] = "$prefix+";
}
}

return $matches;
}

private function normalizeConstraints(array $constraints): string
{
$constraint = (string) Intervals::compactConstraint(MultiConstraint::create($constraints, false));
$constraint = str_replace(['[', ']'], '', $constraint);
$constraint = preg_replace('{(\d+\.\d+\.\d+)\.\d+(-dev)?( |$)}', '$1 ', $constraint);

return trim($constraint);
}
}
34 changes: 34 additions & 0 deletions indexer/src/Package/Package.php
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,8 @@ class Package
private string|bool $abandoned = false;
private bool $private = false;
private array|null $suggest = null;
private string|null $contaoConstraint = null;
private array|null $contaoVersions = null;
private string|null $logo = null;
private array $meta = [];

Expand Down Expand Up @@ -252,6 +254,30 @@ public function setSuggest(array|null $suggest): self
return $this;
}

public function getContaoConstraint(): string|null
{
return $this->contaoConstraint;
}

public function setContaoConstraint(string|null $contaoConstraint): self
{
$this->contaoConstraint = $contaoConstraint;

return $this;
}

public function getContaoVersions(): array|null
{
return $this->contaoVersions;
}

public function setContaoVersions(array|null $contaoVersions): self
{
$this->contaoVersions = $contaoVersions;

return $this;
}

public function getLogo(): string|null
{
return $this->logo;
Expand Down Expand Up @@ -314,6 +340,14 @@ public function getForAlgolia(array $languages): array
'languages' => $languages,
];

if ($this->getContaoConstraint()) {
$data['contaoConstraint'] = $this->getContaoConstraint();
}

if ($this->getContaoVersions()) {
$data['contaoVersions'] = $this->getContaoVersions();
}

$data = array_replace_recursive($data, $this->getMetaForLanguage($language));

if ($data['dependency']) {
Expand Down
Loading

0 comments on commit 0087b32

Please sign in to comment.