Преглед на файлове

Add new minified format

Jordi Boggiano преди 6 години
родител
ревизия
464d8a0f1b
променени са 2 файла, в които са добавени 36 реда и са изтрити 19 реда
  1. 4 0
      src/Packagist/WebBundle/Entity/Package.php
  2. 32 19
      src/Packagist/WebBundle/Package/SymlinkDumper.php

+ 4 - 0
src/Packagist/WebBundle/Entity/Package.php

@@ -905,6 +905,10 @@ class Package
 
         // equal versions are sorted by date
         if ($aVersion === $bVersion) {
+            // make sure sort is stable
+            if ($a->getReleasedAt() === $a->getReleasedAt()) {
+                return $a->getNormalizedVersion() <=> $b->getNormalizedVersion();
+            }
             return $b->getReleasedAt() > $a->getReleasedAt() ? 1 : -1;
         }
 

+ 32 - 19
src/Packagist/WebBundle/Package/SymlinkDumper.php

@@ -701,37 +701,50 @@ class SymlinkDumper
 
     private function dumpPackageToV2File(Package $package, $versionData, string $packageKey)
     {
-        $deduplicatedVersions = [];
-        $uniqKeys = ['version', 'version_normalized', 'source', 'dist', 'time'];
+        $minifiedVersions = [];
         $mtime = 0;
 
-        foreach ($package->getVersions() as $version) {
+        $versions = $package->getVersions();
+        if (is_object($versions)) {
+            $versions = $versions->toArray();
+        }
+
+        usort($versions, Package::class.'::sortVersions');
+
+        $lastKnownVersionData = null;
+        foreach ($versions as $version) {
             $versionArray = $version->toV2Array($versionData);
+            $mtime = max($mtime, $version->getReleasedAt() ? $version->getReleasedAt()->getTimestamp() : time());
 
-            $filtered = $versionArray;
-            foreach ($uniqKeys as $key) {
-                unset($filtered[$key]);
+            if (!$lastKnownVersionData) {
+                $lastKnownVersionData = $versionArray;
+                $minifiedVersions[] = $versionArray;
+                continue;
             }
-            $hash = md5(json_encode($filtered));
 
-            if (isset($deduplicatedVersions[$hash])) {
-                foreach ($uniqKeys as $key) {
-                    $deduplicatedVersions[$hash][$key.'s'][] = $versionArray[$key] ?? null;
+            $minifiedVersion = [];
+
+            // add any changes from the previous version
+            foreach ($versionArray as $key => $val) {
+                if (!isset($lastKnownVersionData[$key]) || $lastKnownVersionData[$key] !== $val) {
+                    $minifiedVersion[$key] = $val;
+                    $lastKnownVersionData[$key] = $val;
                 }
-            } else {
-                foreach ($uniqKeys as $key) {
-                    $filtered[$key.'s'] = [$versionArray[$key] ?? null];
+            }
+
+            // store any deletions from the previous version for keys missing in current one
+            foreach ($lastKnownVersionData as $key => $val) {
+                if (!isset($versionArray[$key])) {
+                    $minifiedVersion[$key] = "__unset";
+                    unset($lastKnownVersionData[$key]);
                 }
-                $deduplicatedVersions[$hash] = $filtered;
             }
 
-            $mtime = max($mtime, $version->getReleasedAt() ? $version->getReleasedAt()->getTimestamp() : time());
+            $minifiedVersions[] = $minifiedVersion;
         }
 
-        // get rid of md5 hash keys
-        $deduplicatedVersions = array_values($deduplicatedVersions);
-
-        $this->individualFilesV2[$packageKey]['packages'][strtolower($package->getName())] = $deduplicatedVersions;
+        $this->individualFilesV2[$packageKey]['packages'][strtolower($package->getName())] = $minifiedVersions;
+        $this->individualFilesV2[$packageKey]['minified'] = 'composer/2.0';
         $this->individualFilesV2Mtime[$packageKey] = $mtime;
     }