瀏覽代碼

Code reorganization

Jordi Boggiano 13 年之前
父節點
當前提交
461ac0f654

+ 76 - 79
src/Packagist/WebBundle/Command/UpdatePackagesCommand.php

@@ -62,106 +62,103 @@ EOF
             ->setParameters(array(date('Y-m-d H:i:s', time() - 3600)));
 
         foreach ($qb->getQuery()->getResult() as $package) {
-            if ($repo = $provider->getRepository($package->getRepository())) {
+            $repo = $provider->getRepository($package->getRepository());
 
-                $output->writeln('Importing '.$repo->getUrl());
-
-                try {
-                    $files = $repo->getAllComposerFiles();
-                }
-                catch (Exception $ex) {
-                    $output->writeln('Err: Could not fetch data from: '.$repo->getUrl().', skipping.');
-                    continue;
-                }
+            if (!$repo) {
+                $output->writeln('<error>Unsupported repository: '.$package->getRepository().'</error>');
+                continue;
+            }
 
-                foreach ($files as $uniqid => $data) {
+            $output->writeln('Importing '.$repo->getUrl());
 
-                    // TODO parse $data['version'] w/ composer version parser, if no match, ignore the tag
+            try {
+                $files = $repo->getAllComposerFiles();
+            } catch (\Exception $e) {
+                $output->writeln('<error>Could not fetch data from: '.$repo->getUrl().', skipping.</error>');
+                continue;
+            }
 
-                    // check if we have that version yet
-                    foreach ($package->getVersions() as $version) {
-                        if ($version->getVersion() === $data['version']) {
-                            continue 2;
-                        }
+            foreach ($files as $uniqid => $data) {
+                // check if we have that version yet
+                foreach ($package->getVersions() as $version) {
+                    if ($version->getVersion() === $data['version']) {
+                        continue 2;
                     }
+                }
 
-                    if ($data['name'] !== $package->getName()) {
-                        $output->writeln('Err: Package name seems to have changed for '.$repo->getUrl().'@'.$uniqid.', skipping');
-                        continue;
-                    }
+                if ($data['name'] !== $package->getName()) {
+                    $output->writeln('<error>Package name seems to have changed for '.$repo->getUrl().'@'.$uniqid.', skipping</error>');
+                    continue;
+                }
 
-                    $version = new Version();
-                    $em->persist($version);
+                $version = new Version();
+                $em->persist($version);
 
-                    foreach (array('name', 'description', 'homepage', 'license', 'version') as $field) {
-                        if (isset($data[$field])) {
-                            $version->{'set'.$field}($data[$field]);
-                        }
+                foreach (array('name', 'description', 'homepage', 'license', 'version') as $field) {
+                    if (isset($data[$field])) {
+                        $version->{'set'.$field}($data[$field]);
                     }
+                }
 
-                    $version->setPackage($package);
-                    $version->setUpdatedAt(new \DateTime);
-                    $version->setReleasedAt(new \DateTime($data['time']));
-                    $version->setSource(array('type' => $repo->getType(), 'url' => $repo->getUrl()));
+                $version->setPackage($package);
+                $version->setUpdatedAt(new \DateTime);
+                $version->setReleasedAt(new \DateTime($data['time']));
+                $version->setSource(array('type' => $repo->getType(), 'url' => $repo->getUrl()));
 
-                    $checksum = hash_file('sha1', $data['download']);
-                    $version->setDist(array('type' => 'zip', 'url' => $data['download'], 'shasum' => $checksum ?: ''));
+                $checksum = hash_file('sha1', $data['download']);
+                $version->setDist(array('type' => 'zip', 'url' => $data['download'], 'shasum' => $checksum ?: ''));
 
-                    if (isset($data['keywords'])) {
-                        foreach ($data['keywords'] as $keyword) {
-                            $version->addTags(Tag::getByName($em, $keyword, true));
-                        }
+                if (isset($data['keywords'])) {
+                    foreach ($data['keywords'] as $keyword) {
+                        $version->addTags(Tag::getByName($em, $keyword, true));
                     }
-                    if (isset($data['authors'])) {
-                        foreach ($data['authors'] as $authorData) {
-                            $author = null;
-                            // skip authors with no information
-                            if (!isset($authorData['email']) && !isset($authorData['name'])) {
-                                continue;
-                            }
+                }
+                if (isset($data['authors'])) {
+                    foreach ($data['authors'] as $authorData) {
+                        $author = null;
+                        // skip authors with no information
+                        if (!isset($authorData['email']) && !isset($authorData['name'])) {
+                            continue;
+                        }
 
-                            if (isset($authorData['email'])) {
-                                $qb = $em->createQueryBuilder();
-                                $qb->select('a')
-                                    ->from('Packagist\WebBundle\Entity\Author', 'a')
-                                    ->where('a.email = ?0')
-                                    ->setParameters(array($authorData['email']))
-                                    ->setMaxResults(1);
-                                $author = $qb->getQuery()->getOneOrNullResult();
-                            }
+                        if (isset($authorData['email'])) {
+                            $qb = $em->createQueryBuilder();
+                            $qb->select('a')
+                                ->from('Packagist\WebBundle\Entity\Author', 'a')
+                                ->where('a.email = ?0')
+                                ->setParameters(array($authorData['email']))
+                                ->setMaxResults(1);
+                            $author = $qb->getQuery()->getOneOrNullResult();
+                        }
 
-                            if (!$author) {
-                                $author = new Author();
-                                $em->persist($author);
-                            }
-                            foreach (array('email', 'name', 'homepage') as $field) {
-                                if (isset($authorData[$field])) {
-                                    $author->{'set'.$field}($authorData[$field]);
-                                }
+                        if (!$author) {
+                            $author = new Author();
+                            $em->persist($author);
+                        }
+                        foreach (array('email', 'name', 'homepage') as $field) {
+                            if (isset($authorData[$field])) {
+                                $author->{'set'.$field}($authorData[$field]);
                             }
-                            $author->setUpdatedAt(new \DateTime);
-                            $version->addAuthors($author);
-                            $author->addVersions($version);
                         }
+                        $author->setUpdatedAt(new \DateTime);
+                        $version->addAuthors($author);
+                        $author->addVersions($version);
                     }
-                    if (isset($data['require'])) {
-                        foreach ($data['require'] as $requireName => $requireVersion) {
-                            $requirement = new Requirement();
-                            $em->persist($requirement);
-                            $requirement->setPackageName($requireName);
-                            $requirement->setPackageVersion($requireVersion);
-                            $version->addRequirements($requirement);
-                            $requirement->setVersion($version);
-                        }
+                }
+                if (isset($data['require'])) {
+                    foreach ($data['require'] as $requireName => $requireVersion) {
+                        $requirement = new Requirement();
+                        $em->persist($requirement);
+                        $requirement->setPackageName($requireName);
+                        $requirement->setPackageVersion($requireVersion);
+                        $version->addRequirements($requirement);
+                        $requirement->setVersion($version);
                     }
                 }
-
-                // TODO parse composer.json on every branch matching a "$num.x.x" version scheme, + the master one, for all "x.y.z-dev" versions, usable through "latest-dev"
-            } else {
-                // TODO support other repos
-                $output->writeln('Err: unsupported repository: '.$package->getRepository());
-                continue;
             }
+
+            // TODO parse composer.json on every branch matching a "$num.x.x" version scheme, + the master one, for all "x.y.z-dev" versions, usable through "latest-dev"
+
             $package->setUpdatedAt(new \DateTime);
             $package->setCrawledAt(new \DateTime);
             $em->flush();

+ 14 - 7
src/Packagist/WebBundle/Repository/Repository/GitHubRepository.php

@@ -6,6 +6,7 @@ class GitHubRepository implements RepositoryInterface
 {
     protected $owner;
     protected $repository;
+    protected $data;
 
     public function __construct($url)
     {
@@ -16,7 +17,14 @@ class GitHubRepository implements RepositoryInterface
 
     protected function getRepoData()
     {
-        return json_decode(file_get_contents('http://github.com/api/v2/json/repos/show/'.$this->owner.'/'.$this->repository), true);
+        if (null === $this->data) {
+            $url = 'http://github.com/api/v2/json/repos/show/'.$this->owner.'/'.$this->repository;
+            $this->data = json_decode(@file_get_contents($url), true);
+            if (!$this->data) {
+                throw new \UnexpectedValueException('Failed to download from '.$url);
+            }
+        }
+        return $this->data;
     }
 
     public function getType()
@@ -41,21 +49,20 @@ class GitHubRepository implements RepositoryInterface
 
     public function getAllComposerFiles()
     {
-        if(!$repoData = $this->getRepoData()) {
-            throw new \Exception();
-        }
+        $repoData = $this->getRepoData();
 
         $files = array();
 
         $tagsData = json_decode(file_get_contents('http://github.com/api/v2/json/repos/show/'.$this->owner.'/'.$this->repository.'/tags'), true);
         foreach ($tagsData['tags'] as $tag => $hash) {
-            if($file = json_decode(file_get_contents('https://raw.github.com/'.$this->owner.'/'.$this->repository.'/'.$hash.'/composer.json'), true)) {
-
-                if(!isset($file['time'])) {
+            if ($file = json_decode(file_get_contents('https://raw.github.com/'.$this->owner.'/'.$this->repository.'/'.$hash.'/composer.json'), true)) {
+                if (!isset($file['time'])) {
                     $commit = json_decode(file_get_contents('http://github.com/api/v2/json/commits/show/'.$this->owner.'/'.$this->repository.'/'.$tag), true);
                     $file['time'] = $commit['commit']['committed_date'];
                 }
 
+                // TODO parse $data['version'] w/ composer version parser, if no match, ignore the tag
+
                 $file['download'] = $this->getDist($tag);
 
                 $files[$tag] = $file;