~tsep-dev/tsep/tsep2

« back to all changes in this revision

Viewing changes to src/TSEP/Packagist/WebBundle/Command/UpdatePackagesCommand.php

  • Committer: xaav
  • Date: 2011-09-27 01:31:36 UTC
  • Revision ID: git-v1:3c3f2e8d21ccd506f3cd12b2650591f6532368fb
First commit'

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
<?php
 
2
 
 
3
/*
 
4
 * This file is part of Packagist.
 
5
 *
 
6
 * (c) Jordi Boggiano <j.boggiano@seld.be>
 
7
 *     Nils Adermann <naderman@naderman.de>
 
8
 *
 
9
 * For the full copyright and license information, please view the LICENSE
 
10
 * file that was distributed with this source code.
 
11
 */
 
12
 
 
13
namespace Packagist\WebBundle\Command;
 
14
 
 
15
use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand;
 
16
use Symfony\Bridge\Doctrine\RegistryInterface;
 
17
use Symfony\Component\Console\Input\InputInterface;
 
18
use Symfony\Component\Console\Input\InputOption;
 
19
use Symfony\Component\Console\Output\OutputInterface;
 
20
use Symfony\Component\HttpKernel\KernelInterface;
 
21
use Symfony\Component\Finder\Finder;
 
22
use Packagist\WebBundle\Entity\Version;
 
23
use Packagist\WebBundle\Entity\Tag;
 
24
use Packagist\WebBundle\Entity\Author;
 
25
use Packagist\WebBundle\Entity\Requirement;
 
26
 
 
27
/**
 
28
 * @author Jordi Boggiano <j.boggiano@seld.be>
 
29
 */
 
30
class UpdatePackagesCommand extends ContainerAwareCommand
 
31
{
 
32
    /**
 
33
     * {@inheritdoc}
 
34
     */
 
35
    protected function configure()
 
36
    {
 
37
        $this
 
38
            ->setName('pkg:update')
 
39
            ->setDefinition(array(
 
40
            ))
 
41
            ->setDescription('Updates packages')
 
42
            ->setHelp(<<<EOF
 
43
 
 
44
EOF
 
45
            )
 
46
        ;
 
47
    }
 
48
 
 
49
    /**
 
50
     * {@inheritdoc}
 
51
     */
 
52
    protected function execute(InputInterface $input, OutputInterface $output)
 
53
    {
 
54
        $doctrine = $this->getContainer()->get('doctrine');
 
55
 
 
56
        $logger = $this->getContainer()->get('logger');
 
57
        $provider = $this->getContainer()->get('packagist.repository_provider');
 
58
 
 
59
        $packages = $doctrine->getRepository('PackagistWebBundle:Package')->getStalePackages();
 
60
 
 
61
        foreach ($packages as $package) {
 
62
            $repository = $provider->getRepository($package->getRepository());
 
63
 
 
64
            if (!$repository) {
 
65
                $output->writeln('<error>Unsupported repository: '.$package->getRepository().'</error>');
 
66
                continue;
 
67
            }
 
68
 
 
69
            $output->writeln('Importing '.$repository->getUrl());
 
70
 
 
71
            try {
 
72
                foreach ($repository->getTags() as $tag => $identifier) {
 
73
                    // TODO parse tag name (or fetch composer file?) w/ composer version parser, if no match, ignore the tag
 
74
                    $this->fetchInformation($output, $doctrine, $package, $repository, $identifier);
 
75
                }
 
76
 
 
77
                foreach ($repository->getBranches() as $branch => $identifier) {
 
78
                    // TODO parse branch name, matching a "$num.x.x" version scheme, + the master one
 
79
                    // use for all "x.y.z-dev" versions, usable through "latest-dev"
 
80
                    $this->fetchInformation($output, $doctrine, $package, $repository, $identifier);
 
81
                }
 
82
 
 
83
                $package->setUpdatedAt(new \DateTime);
 
84
                $package->setCrawledAt(new \DateTime);
 
85
                $doctrine->getEntityManager()->flush();
 
86
            } catch (\Exception $e) {
 
87
                $output->writeln('<error>Exception: '.$e->getMessage().', skipping package.</error>');
 
88
                continue;
 
89
            }
 
90
        }
 
91
    }
 
92
 
 
93
    protected function fetchInformation(OutputInterface $output, RegistryInterface $doctrine, $package, $repository, $identifier)
 
94
    {
 
95
        $data = $repository->getComposerInformation($identifier);
 
96
        $em = $doctrine->getEntityManager();
 
97
 
 
98
        // check if we have that version yet
 
99
        foreach ($package->getVersions() as $version) {
 
100
            if ($version->getVersion() === $data['version']) {
 
101
                return;
 
102
            }
 
103
        }
 
104
 
 
105
        if ($data['name'] !== $package->getName()) {
 
106
            $output->writeln('<error>Package name seems to have changed for '.$repository->getUrl().'@'.$identifier.', skipping.</error>');
 
107
            return;
 
108
        }
 
109
 
 
110
        $version = new Version();
 
111
        $em->persist($version);
 
112
 
 
113
        foreach (array('name', 'description', 'homepage', 'license', 'version') as $field) {
 
114
            if (isset($data[$field])) {
 
115
                $version->{'set'.$field}($data[$field]);
 
116
            }
 
117
        }
 
118
 
 
119
        $version->setPackage($package);
 
120
        $version->setUpdatedAt(new \DateTime);
 
121
        $version->setReleasedAt(new \DateTime($data['time']));
 
122
        $version->setSource(array('type' => $repository->getType(), 'url' => $repository->getUrl()));
 
123
        $version->setDist($repository->getDist($identifier));
 
124
 
 
125
        if (isset($data['keywords'])) {
 
126
            foreach ($data['keywords'] as $keyword) {
 
127
                $version->addTags(Tag::getByName($em, $keyword, true));
 
128
            }
 
129
        }
 
130
 
 
131
        if (isset($data['authors'])) {
 
132
            foreach ($data['authors'] as $authorData) {
 
133
                $author = null;
 
134
                // skip authors with no information
 
135
                if (!isset($authorData['email']) && !isset($authorData['name'])) {
 
136
                    continue;
 
137
                }
 
138
 
 
139
                if (isset($authorData['email'])) {
 
140
                    $author = $doctrine->getRepository('PackagistWebBundle:Author')->findOneByEmail($authorData['email']);
 
141
                }
 
142
 
 
143
                if (!$author) {
 
144
                    $author = new Author();
 
145
                    $em->persist($author);
 
146
                }
 
147
                foreach (array('email', 'name', 'homepage') as $field) {
 
148
                    if (isset($authorData[$field])) {
 
149
                        $author->{'set'.$field}($authorData[$field]);
 
150
                    }
 
151
                }
 
152
                $author->setUpdatedAt(new \DateTime);
 
153
                $version->addAuthors($author);
 
154
                $author->addVersions($version);
 
155
            }
 
156
        }
 
157
 
 
158
        if (isset($data['require'])) {
 
159
            foreach ($data['require'] as $requireName => $requireVersion) {
 
160
                $requirement = new Requirement();
 
161
                $em->persist($requirement);
 
162
                $requirement->setPackageName($requireName);
 
163
                $requirement->setPackageVersion($requireVersion);
 
164
                $version->addRequirements($requirement);
 
165
                $requirement->setVersion($version);
 
166
            }
 
167
        }
 
168
    }
 
169
}