Эх сурвалжийг харах

Add cache for missing composer.json files to avoid polling github repeatedly

Jordi Boggiano 6 жил өмнө
parent
commit
1d497c19f7

+ 21 - 4
composer.lock

@@ -248,12 +248,12 @@
             "source": {
                 "type": "git",
                 "url": "https://github.com/composer/composer.git",
-                "reference": "d3873a05650e168251067d9648845c220c50e2d7"
+                "reference": "ba1e5c213c2932093ee3d8aa3ee1591ffa35e877"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/composer/composer/zipball/d3873a05650e168251067d9648845c220c50e2d7",
-                "reference": "d3873a05650e168251067d9648845c220c50e2d7",
+                "url": "https://api.github.com/repos/composer/composer/zipball/ba1e5c213c2932093ee3d8aa3ee1591ffa35e877",
+                "reference": "ba1e5c213c2932093ee3d8aa3ee1591ffa35e877",
                 "shasum": ""
             },
             "require": {
@@ -301,9 +301,26 @@
             "license": [
                 "MIT"
             ],
+            "authors": [
+                {
+                    "name": "Nils Adermann",
+                    "email": "naderman@naderman.de",
+                    "homepage": "http://www.naderman.de"
+                },
+                {
+                    "name": "Jordi Boggiano",
+                    "email": "j.boggiano@seld.be",
+                    "homepage": "http://seld.be"
+                }
+            ],
             "description": "Composer helps you declare, manage and install dependencies of PHP projects, ensuring you have the right stack everywhere.",
             "homepage": "https://getcomposer.org/",
-            "time": "2019-02-20T07:43:56+00:00"
+            "keywords": [
+                "autoload",
+                "dependency",
+                "package"
+            ],
+            "time": "2019-02-27T14:07:33+00:00"
         },
         {
             "name": "composer/semver",

+ 54 - 0
src/Packagist/WebBundle/Entity/EmptyReferenceCache.php

@@ -0,0 +1,54 @@
+<?php
+
+/*
+ * This file is part of Packagist.
+ *
+ * (c) Jordi Boggiano <j.boggiano@seld.be>
+ *     Nils Adermann <naderman@naderman.de>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Packagist\WebBundle\Entity;
+
+use Doctrine\ORM\Mapping as ORM;
+
+/**
+ * @ORM\Entity
+ * @ORM\Table(name="empty_references")
+ * @author Jordi Boggiano <j.boggiano@seld.be>
+ */
+class EmptyReferenceCache
+{
+    /**
+     * @ORM\Id
+     * @ORM\OneToOne(targetEntity="Packagist\WebBundle\Entity\Package")
+     */
+    protected $package;
+
+    /**
+     * @ORM\Column(type="array")
+     */
+    protected $emptyReferences = array();
+
+    public function __construct(Package $package)
+    {
+        $this->package = $package;
+    }
+
+    public function setPackage(Package $package)
+    {
+        $this->package = $package;
+    }
+
+    public function setEmptyReferences(array $emptyReferences)
+    {
+        $this->emptyReferences = $emptyReferences;
+    }
+
+    public function getEmptyReferences()
+    {
+        return $this->emptyReferences;
+    }
+}

+ 15 - 1
src/Packagist/WebBundle/Service/UpdaterWorker.php

@@ -20,6 +20,7 @@ use Packagist\WebBundle\Entity\Package;
 use Packagist\WebBundle\Entity\Version;
 use Packagist\WebBundle\Package\Updater;
 use Packagist\WebBundle\Entity\Job;
+use Packagist\WebBundle\Entity\EmptyReferenceCache;
 use Packagist\WebBundle\Model\PackageManager;
 use Packagist\WebBundle\Model\DownloadManager;
 use Seld\Signal\SignalHandler;
@@ -99,10 +100,19 @@ class UpdaterWorker
 
             $versionCache = null;
             $existingVersions = null;
+            $emptyRefCache = $em->getRepository(EmptyReferenceCache::class)->findOneBy(['package' => $package]);
+            if (!$emptyRefCache) {
+                $emptyRefCache = new EmptyReferenceCache($package);
+                $em->persist($emptyRefCache);
+                $em->flush($emptyRefCache);
+            }
 
             if ($useVersionCache) {
                 $existingVersions = $em->getRepository(Version::class)->getVersionMetadataForUpdate($package);
-                $versionCache = new VersionCache($package, $existingVersions);
+
+                $versionCache = new VersionCache($package, $existingVersions, $emptyRefCache->getEmptyReferences());
+            } else {
+                $emptyRefCache->setEmptyReferences([]);
             }
 
             // prepare repository
@@ -119,6 +129,10 @@ class UpdaterWorker
             // perform the actual update (fetch and re-scan the repository's source)
             $package = $this->updater->update($io, $config, $package, $repository, $flags, $existingVersions);
 
+            $emptyRefCache = $em->merge($emptyRefCache);
+            $emptyRefCache->setEmptyReferences($repository->getEmptyReferences());
+            $em->flush($emptyRefCache);
+
             // github update downgraded to a git clone, this should not happen, so check through API whether the package still exists
             if (preg_match('{[@/]github.com[:/]([^/]+/[^/]+?)(\.git)?$}i', $package->getRepository(), $match) && 0 === strpos($repository->getDriver()->getUrl(), 'git@')) {
                 if ($result = $this->checkForDeadGitHubPackage($package, $match, $io, $io->getOutput())) {

+ 7 - 1
src/Packagist/WebBundle/Service/VersionCache.php

@@ -10,15 +10,17 @@ class VersionCache implements VersionCacheInterface
 {
     /** @var Version[] */
     private $versionCache;
+    private $emptyReferences;
     private $package;
 
-    public function __construct(Package $package, array $existingVersions)
+    public function __construct(Package $package, array $existingVersions, array $emptyReferences)
     {
         $this->versionCache = [];
         foreach ($existingVersions as $version) {
             $this->versionCache[$version['version']] = $version;
         }
         $this->package = $package;
+        $this->emptyReferences = $emptyReferences;
     }
 
     public function getVersionPackage($version, $identifier)
@@ -32,6 +34,10 @@ class VersionCache implements VersionCacheInterface
             ];
         }
 
+        if (in_array($identifier, $this->emptyReferences, true)) {
+            return false;
+        }
+
         return null;
     }
 }