From 3ae8312f472e4fb6381915be4b11b19984f77bd5 Mon Sep 17 00:00:00 2001 From: Uladzimir Tsykun Date: Wed, 24 Jan 2024 18:42:45 +0100 Subject: [PATCH] Fix support proxy format without version_normalized and packages uid --- src/Composer/MetadataMinifier.php | 16 ++++++++++++++ src/Mirror/Manager/RootMetadataMerger.php | 27 ++++++++++++++++++++++- 2 files changed, 42 insertions(+), 1 deletion(-) diff --git a/src/Composer/MetadataMinifier.php b/src/Composer/MetadataMinifier.php index 2503d86a..a84a78f7 100644 --- a/src/Composer/MetadataMinifier.php +++ b/src/Composer/MetadataMinifier.php @@ -10,6 +10,12 @@ class MetadataMinifier { private static $masterVersions = ['dev-master', 'dev-main', 'dev-default', 'dev-trunk']; + private VersionParser $parser; + + public function __construct() + { + $this->parser = new VersionParser(); + } /** * Convert metadata v1 to metadata v2 @@ -24,6 +30,7 @@ public function minify(array $metadata, ?bool $isDev = true, &$lastModified = nu foreach ($packages as $packName => $versions) { $versions = \array_filter($versions, fn($v) => $isDev === null || $this->isValidStability($v, $isDev)); + $versions = \array_map(fn($v) => $v + ['version_normalized' => $v['version_normalized'] ?? $this->normalizeVersion($v['version'])], $versions); \usort($versions, fn($v1, $v2) => -1 * version_compare($v1['version_normalized'], $v2['version_normalized'])); \array_map(fn($v) => $obj->time < ($v['time'] ?? 0) ? $obj->time = ($v['time'] ?? 0) : null, $versions); @@ -93,6 +100,15 @@ private function doExpand(array $metadata): array return ['packages' => $metadata['packages'] ?? []]; } + private function normalizeVersion(string $version): string + { + try { + return $this->parser->normalize($version); + } catch (\Throwable $e) { + return $version; + } + } + public static function getNormalizedVersionV1($version) { if (in_array($version, self::$masterVersions, true)) { diff --git a/src/Mirror/Manager/RootMetadataMerger.php b/src/Mirror/Manager/RootMetadataMerger.php index 036270bc..aa564f65 100644 --- a/src/Mirror/Manager/RootMetadataMerger.php +++ b/src/Mirror/Manager/RootMetadataMerger.php @@ -91,6 +91,31 @@ public function merge(JsonMetadata $stamps, int $composerApi = null): JsonMetada ]; } - return $stamps->withContent(\array_merge($rootFile, $newFile), \JSON_UNESCAPED_SLASHES | \JSON_PRETTY_PRINT); + $result = \array_merge($rootFile, $newFile); + $this->normalizePackagesNode($result); + + return $stamps->withContent($result, \JSON_UNESCAPED_SLASHES | \JSON_PRETTY_PRINT); + } + + protected function normalizePackagesNode(array &$result): void + { + if (!is_array($packages = $result['packages'] ?? null)) { + return; + } + + $i = 1; + foreach ($packages as $packageName => $list) { + if (!is_array($list)) { + break; + } + foreach ($list as $ver => $pkg) { + if (isset($pkg['uid'])) { + break 2; + } + $list[$ver]['uid'] = $i++; + } + $packages[$packageName] = $list; + } + $result['packages'] = $packages; } }