Prechádzať zdrojové kódy

Optimization of updater/force update

Jordi Boggiano 11 rokov pred
rodič
commit
879cc8c053

+ 2 - 2
src/Packagist/WebBundle/Command/UpdatePackagesCommand.php

@@ -39,7 +39,7 @@ class UpdatePackagesCommand extends ContainerAwareCommand
         $this
             ->setName('packagist:update')
             ->setDefinition(array(
-                new InputOption('force', null, InputOption::VALUE_NONE, 'Force a re-crawl of all packages'),
+                new InputOption('force', null, InputOption::VALUE_NONE, 'Force a re-crawl of all packages, or if a package name is given forces an update of all versions'),
                 new InputOption('delete-before', null, InputOption::VALUE_NONE, 'Force deletion of all versions before an update'),
                 new InputOption('notify-failures', null, InputOption::VALUE_NONE, 'Notify failures to maintainers by email'),
                 new InputArgument('package', InputArgument::OPTIONAL, 'Package name to update'),
@@ -64,7 +64,7 @@ class UpdatePackagesCommand extends ContainerAwareCommand
 
         if ($package) {
             $packages = array(array('id' => $doctrine->getRepository('PackagistWebBundle:Package')->findOneByName($package)->getId()));
-            $flags = Updater::UPDATE_EQUAL_REFS;
+            $flags = $force ? Updater::UPDATE_EQUAL_REFS : 0;
         } elseif ($force) {
             $packages = $doctrine->getManager()->getConnection()->fetchAll('SELECT id FROM package ORDER BY id ASC');
             $flags = Updater::UPDATE_EQUAL_REFS;

+ 2 - 1
src/Packagist/WebBundle/Controller/WebController.php

@@ -731,6 +731,7 @@ class WebController extends Controller
 
         $update = $req->request->get('update', $req->query->get('update'));
         $autoUpdated = $req->request->get('autoUpdated', $req->query->get('autoUpdated'));
+        $updateEqualRefs = $req->request->get('updateAll', $req->query->get('updateAll'));
 
         $user = $this->getUser() ?: $doctrine
             ->getRepository('PackagistWebBundle:User')
@@ -758,7 +759,7 @@ class WebController extends Controller
                 $repository->setLoader($loader);
 
                 try {
-                    $updater->update($package, $repository, Updater::UPDATE_EQUAL_REFS);
+                    $updater->update($package, $repository, $updateEqualRefs ? Updater::UPDATE_EQUAL_REFS : 0);
                 } catch (\Exception $e) {
                     return new Response(json_encode(array(
                         'status' => 'error',

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

@@ -125,6 +125,11 @@ class Package
     private $vcsDriver = true;
     private $vcsDriverError;
 
+    /**
+     * @var array lookup table for versions
+     */
+    private $cachedVersions;
+
     public function __construct()
     {
         $this->versions = new ArrayCollection();
@@ -389,6 +394,20 @@ class Package
         return $this->versions;
     }
 
+    public function getVersion($normalizedVersion)
+    {
+        if (null === $this->cachedVersions) {
+            $this->cachedVersions = array();
+            foreach ($this->getVersions() as $version) {
+                $this->cachedVersions[strtolower($version->getNormalizedVersion())] = $version;
+            }
+        }
+
+        if (isset($this->cachedVersions[strtolower($normalizedVersion)])) {
+            return $this->cachedVersions[strtolower($normalizedVersion)];
+        }
+    }
+
     /**
      * Set updatedAt
      *

+ 27 - 12
src/Packagist/WebBundle/Package/Updater.php

@@ -111,11 +111,20 @@ class Updater
             if ($bVersion === '9999999-dev' || 'dev-' === substr($bVersion, 0, 4)) {
                 $bVersion = 'dev';
             }
+            $aIsDev = $aVersion === 'dev' || substr($aVersion, -4) === '-dev';
+            $bIsDev = $bVersion === 'dev' || substr($bVersion, -4) === '-dev';
 
+            // push dev versions to the end
+            if ($aIsDev !== $bIsDev) {
+                return $aIsDev ? 1 : -1;
+            }
+
+            // equal versions are sorted by date
             if ($aVersion === $bVersion) {
                 return $a->getReleaseDate() > $b->getReleaseDate() ? 1 : -1;
             }
 
+            // the rest is sorted by version
             return version_compare($a->getVersion(), $b->getVersion());
         });
 
@@ -130,6 +139,7 @@ class Updater
             $em->refresh($package);
         }
 
+        $lastUpdated = true;
         foreach ($versions as $version) {
             if ($version instanceof AliasPackage) {
                 continue;
@@ -139,7 +149,13 @@ class Updater
                 continue;
             }
 
-            $this->updateInformation($package, $version, $flags);
+            $lastUpdated = $this->updateInformation($package, $version, $flags);
+            if ($lastUpdated) {
+                $em->flush();
+            }
+        }
+
+        if (!$lastUpdated) {
             $em->flush();
         }
 
@@ -162,20 +178,17 @@ class Updater
 
         $normVersion = $data->getVersion();
 
-        // check if we have that version yet
-        foreach ($package->getVersions() as $existingVersion) {
-            if (strtolower($existingVersion->getNormalizedVersion()) === strtolower($normVersion)) {
-                $source = $existingVersion->getSource();
-                // update if the right flag is set, or it's a dev version, or the source reference has changed in a tagged release (re-tag)
-                if ($existingVersion->getDevelopment() || $source['reference'] !== $data->getSourceReference() || ($flags & self::UPDATE_EQUAL_REFS)) {
-                    $version = $existingVersion;
-                    break;
-                }
-
+        $existingVersion = $package->getVersion($normVersion);
+        if ($existingVersion) {
+            $source = $existingVersion->getSource();
+            // update if the right flag is set, or it's a dev version, or the source reference has changed in a tagged release (re-tag)
+            if ($existingVersion->getDevelopment() || $source['reference'] !== $data->getSourceReference() || ($flags & self::UPDATE_EQUAL_REFS)) {
+                $version = $existingVersion;
+            } else {
                 // mark it updated to avoid it being pruned
                 $existingVersion->setUpdatedAt(new \DateTime);
 
-                return;
+                return false;
             }
         }
 
@@ -361,5 +374,7 @@ class Updater
         if (!$package->getVersions()->contains($version)) {
             $package->addVersions($version);
         }
+
+        return true;
     }
 }