/**
  * {@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');
     $logger = $this->getContainer()->get('logger');
     $this->versionParser = new VersionParser();
     if ($package) {
         $packages = array($doctrine->getRepository('PackagistWebBundle:Package')->findOneByName($package));
     } elseif ($force) {
         $packages = $doctrine->getRepository('PackagistWebBundle:Package')->findAll();
     } else {
         $packages = $doctrine->getRepository('PackagistWebBundle:Package')->getStalePackages();
     }
     $start = new \DateTime();
     foreach ($packages as $package) {
         if ($verbose) {
             $output->writeln('Importing ' . $package->getRepository());
         }
         try {
             $repository = new VcsRepository(array('url' => $package->getRepository()), new NullIO());
             if ($verbose) {
                 $repository->setDebug(true);
             }
             $versions = $repository->getPackages();
             usort($versions, function ($a, $b) {
                 return version_compare($a->getVersion(), $b->getVersion());
             });
             // clear existing versions to force a clean reloading if --force is enabled
             if ($force) {
                 $versionRepo = $doctrine->getRepository('PackagistWebBundle:Version');
                 foreach ($package->getVersions() as $version) {
                     $versionRepo->remove($version);
                 }
                 $doctrine->getEntityManager()->flush();
                 $doctrine->getEntityManager()->refresh($package);
             }
             foreach ($versions as $version) {
                 if ($verbose) {
                     $output->writeln('Storing ' . $version->getPrettyVersion() . ' (' . $version->getVersion() . ')');
                 }
                 $this->updateInformation($output, $doctrine, $package, $version);
                 $doctrine->getEntityManager()->flush();
             }
             // remove outdated -dev versions
             foreach ($package->getVersions() as $version) {
                 if ($version->getDevelopment() && $version->getUpdatedAt() < $start) {
                     if ($verbose) {
                         $output->writeln('Deleting stale version: ' . $version->getVersion());
                     }
                     $doctrine->getRepository('PackagistWebBundle:Version')->remove($version);
                 }
             }
             $package->setUpdatedAt(new \DateTime());
             $package->setCrawledAt(new \DateTime());
             $doctrine->getEntityManager()->flush();
         } catch (\Exception $e) {
             $output->writeln('<error>Exception: ' . $e->getMessage() . ', skipping package ' . $package->getName() . '.</error>');
         }
     }
 }