* Nils Adermann * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Packagist\WebBundle\Command; use Composer\Factory; use Composer\IO\BufferIO; use Composer\IO\ConsoleIO; use Composer\Package\Loader\ArrayLoader; use Composer\Package\Loader\ValidatingArrayLoader; use Composer\Repository\InvalidRepositoryException; use Composer\Repository\VcsRepository; use Packagist\WebBundle\Package\Updater; use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand; use Symfony\Component\Console\Input\InputArgument; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Output\OutputInterface; /** * @author Jordi Boggiano */ class UpdatePackagesCommand extends ContainerAwareCommand { /** * {@inheritdoc} */ protected function configure() { $this ->setName('packagist:update') ->setDefinition(array( 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('update-equal-refs', null, InputOption::VALUE_NONE, 'Force update of all versions even when they already exist'), new InputArgument('package', InputArgument::OPTIONAL, 'Package name to update'), )) ->setDescription('Updates packages') ; } /** * {@inheritdoc} */ protected function execute(InputInterface $input, OutputInterface $output) { $verbose = $input->getOption('verbose'); $force = $input->getOption('force'); $package = $input->getArgument('package'); $doctrine = $this->getContainer()->get('doctrine'); $router = $this->getContainer()->get('router'); $deleteBefore = false; $updateEqualRefs = false; $randomTimes = true; $locker = $this->getContainer()->get('locker'); if (!$locker->lockCommand($this->getName())) { if ($verbose) { $output->writeln('Aborting, another task is running already'); } return 0; } if ($package) { $packages = array(array('id' => $doctrine->getRepository('PackagistWebBundle:Package')->findOneByName($package)->getId())); if ($force) { $updateEqualRefs = true; } $randomTimes = false; } elseif ($force) { $packages = $doctrine->getManager()->getConnection()->fetchAll('SELECT id FROM package ORDER BY id ASC'); $updateEqualRefs = true; } else { $packages = $doctrine->getRepository('PackagistWebBundle:Package')->getStalePackages(); } $ids = array(); foreach ($packages as $package) { $ids[] = (int) $package['id']; } if ($input->getOption('delete-before')) { $deleteBefore = true; } if ($input->getOption('update-equal-refs')) { $updateEqualRefs = true; } $scheduler = $this->getContainer()->get('scheduler'); while ($ids) { $idsGroup = array_splice($ids, 0, 100); foreach ($idsGroup as $id) { $job = $scheduler->scheduleUpdate($id, $updateEqualRefs, $deleteBefore, $randomTimes ? new \DateTime('+'.rand(1, 1800).'seconds') : null); if ($verbose) { $output->writeln('Scheduled update job '.$job->getId().' for package '.$id); } $doctrine->getManager()->detach($job); } $doctrine->getManager()->clear(); } $locker->unlockCommand($this->getName()); } }