瀏覽代碼

More tweaks to the refactoring of Package\Updater

Beau Simensen 13 年之前
父節點
當前提交
9d582fd2e4

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

@@ -82,15 +82,14 @@ class UpdatePackagesCommand extends ContainerAwareCommand
             $packages = $doctrine->getRepository('PackagistWebBundle:Package')->getStalePackages();
         }
 
-        $start = new \DateTime();
-        $updater = new Updater();
+        $updater = new Updater($doctrine);
 
         foreach ($packages as $package) {
             if ($verbose) {
                 $output->writeln('Importing '.$package->getRepository());
             }
             try {
-                $updater->update($doctrine, $package, $start, $force);
+                $updater->update($package, $force);
             } catch (\Exception $e) {
                 $output->writeln('<error>Exception: '.$e->getMessage().', skipping package '.$package->getName().'.</error>');
             }

+ 2 - 15
src/Packagist/WebBundle/Controller/ApiController.php

@@ -31,15 +31,6 @@ use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
  */
 class ApiController extends Controller
 {
-    protected $supportedLinkTypes = array(
-        'require'   => 'RequireLink',
-        'conflict'  => 'ConflictLink',
-        'provide'   => 'ProvideLink',
-        'replace'   => 'ReplaceLink',
-        'recommend' => 'RecommendLink',
-        'suggest'   => 'SuggestLink',
-    );
-
     /**
      * @Template()
      * @Route("/packages.json", name="packages", defaults={"_format" = "json"})
@@ -91,18 +82,14 @@ class ApiController extends Controller
 
         foreach ($user->getPackages() as $package) {
             if (false !== strpos($package->getRepository(), $payloadRepositoryChunk)) {
-
-                //
                 // We found the package that was referenced.
-                //
 
-                $updater = new Updater();
-                $updater->update($doctrine, $package);
+                $updater = new Updater($doctrine);
+                $updater->update($package);
 
                 return new Response('{ "status": "success" }', 202);
             }
         }
         return new Response(json_encode(array('status' => 'error', 'message' => 'Could not find a package that matches this request (does user maintain the package?)',)), 404);
     }
-
 }

+ 2 - 12
src/Packagist/WebBundle/Entity/User.php

@@ -55,7 +55,7 @@ class User extends BaseUser
         $this->packages = new ArrayCollection();
         $this->authors = new ArrayCollection();
         $this->createdAt = new \DateTime();
-        $this->apiToken = $this->generateApiToken();
+        $this->regenerateApiToken();
         parent::__construct();
     }
 
@@ -152,16 +152,6 @@ class User extends BaseUser
      */
     public function regenerateApiToken()
     {
-        $this->apiToken = $this->generateApiToken();
-    }
-
-    /**
-     * Generate an apiToken
-     *
-     * @return string
-     */
-    protected function generateApiToken()
-    {
-        return substr($this->generateToken(), 0, 20);
+        $this->apiToken = substr($this->generateToken(), 0, 20);
     }
 }

+ 49 - 30
src/Packagist/WebBundle/Package/Updater.php

@@ -12,27 +12,36 @@
 
 namespace Packagist\WebBundle\Package;
 
-use Packagist\WebBundle\Entity\Package;
-
 use Composer\Package\PackageInterface;
 use Composer\Repository\VcsRepository;
 use Composer\IO\NullIO;
 use Packagist\WebBundle\Entity\Author;
+use Packagist\WebBundle\Entity\Package;
 use Packagist\WebBundle\Entity\Tag;
 use Packagist\WebBundle\Entity\Version;
 use Symfony\Bridge\Doctrine\RegistryInterface;
-use Symfony\Bundle\FrameworkBundle\Controller\Controller;
-use Symfony\Component\HttpFoundation\Response;
-use Symfony\Component\HttpFoundation\Request;
-use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
-use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
-use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
 
 /**
  * @author Jordi Boggiano <j.boggiano@seld.be>
  */
 class Updater
 {
+    /**
+     * Doctrine
+     * @var RegistryInterface
+     */
+    protected $doctrine;
+
+    /**
+     * Start
+     * @var DateTime
+     */
+    protected $start;
+
+    /**
+     * Supported link types
+     * @var array
+     */
     protected $supportedLinkTypes = array(
         'require'   => 'RequireLink',
         'conflict'  => 'ConflictLink',
@@ -43,57 +52,65 @@ class Updater
     );
 
 
+    /**
+     * Constructor
+     * 
+     * @param RegistryInterface $doctrine
+     * @param \DateTime $start
+     */
+    public function __construct(RegistryInterface $doctrine, \DateTime $start = null)
+    {
+        $this->doctrine = $doctrine;
+        $this->start = null !== $start ? $start : new \DateTime();
+    }
+
     /**
      * Update a project
      *
-     * @param RegistryInterface $doctrine
      * @param PackageInterface $package
      * @param boolean $clearExistingVersions
      */
-    public function update(RegistryInterface $doctrine, Package $package, \DateTime $start = null, $clearExistingVersions = false)
+    public function update(Package $package, $clearExistingVersions = false)
     {
-        
-        if (null === $start) {
-            $start = new \DateTime();
-        }
-        
         $repository = new VcsRepository(array('url' => $package->getRepository()), new NullIO());
         $versions = $repository->getPackages();
+        $em = $this->doctrine->getEntityManager();
         
         usort($versions, function ($a, $b) {
             return version_compare($a->getVersion(), $b->getVersion());
         });
 
+        $versionRepository = $this->doctrine->getRepository('PackagistWebBundle:Version');
+        
         if ($clearExistingVersions) {
-            $versionRepo = $doctrine->getRepository('PackagistWebBundle:Version');
             foreach ($package->getVersions() as $version) {
                 $versionRepo->remove($version);
             }
         
-            $doctrine->getEntityManager()->flush();
-            $doctrine->getEntityManager()->refresh($package);
+            $em->flush();
+            $em->refresh($package);
         }
 
        foreach ($versions as $version) {
-            $this->updateInformation($doctrine, $package, $version);
-            $doctrine->getEntityManager()->flush();
+            $this->updateInformation($package, $version);
+            $em->flush();
         }
         
         // remove outdated -dev versions
         foreach ($package->getVersions() as $version) {
-            if ($version->getDevelopment() && $version->getUpdatedAt() < $start) {
-                $doctrine->getRepository('PackagistWebBundle:Version')->remove($version);
+            if ($version->getDevelopment() && $version->getUpdatedAt() < $this->start) {
+                $versionRepository->remove($version);
             }
         }
         
         $package->setUpdatedAt(new \DateTime);
         $package->setCrawledAt(new \DateTime);
-        $doctrine->getEntityManager()->flush();
+        $em->flush();
     }
 
-    private function updateInformation(RegistryInterface $doctrine, $package, PackageInterface $data)
+    private function updateInformation(Package $package, PackageInterface $data)
     {
-        $em = $doctrine->getEntityManager();
+        $em = $this->doctrine->getEntityManager();
         $version = new Version();
     
         $version->setName($package->getName());
@@ -161,6 +178,8 @@ class Updater
                 $version->addTag(Tag::getByName($em, $keyword, true));
             }
         }
+        
+        $authorRepository = $this->doctrine->getRepository('PackagistWebBundle:Author');
     
         $version->getAuthors()->clear();
         if ($data->getAuthors()) {
@@ -172,18 +191,18 @@ class Updater
                 }
     
                 if (!empty($authorData['email'])) {
-                    $author = $doctrine->getRepository('PackagistWebBundle:Author')->findOneByEmail($authorData['email']);
+                    $author = $authorRepository->findOneByEmail($authorData['email']);
                 }
     
                 if (!$author && !empty($authorData['homepage'])) {
-                    $author = $doctrine->getRepository('PackagistWebBundle:Author')->findOneBy(array(
-                            'name' => $authorData['name'],
-                            'homepage' => $authorData['homepage']
+                    $author = $authorRepository->findOneBy(array(
+                        'name' => $authorData['name'],
+                        'homepage' => $authorData['homepage']
                     ));
                 }
     
                 if (!$author && !empty($authorData['name'])) {
-                    $author = $doctrine->getRepository('PackagistWebBundle:Author')->findOneByNameAndPackage($authorData['name'], $package);
+                    $author = $authorRepository->findOneByNameAndPackage($authorData['name'], $package);
                 }
     
                 if (!$author) {