* Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Command; use Composer\Composer; use Composer\Package\PackageInterface; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Input\InputArgument; use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Output\OutputInterface; use Composer\Repository\CompositeRepository; use Composer\Repository\PlatformRepository; use Composer\Repository\ComposerRepository; use Composer\Repository\RepositoryInterface; /** * @author Robert Schönthal * @author Jordi Boggiano */ class ShowCommand extends Command { protected function configure() { $this ->setName('show') ->setDescription('Show information about packages') ->setDefinition(array( new InputArgument('package', InputArgument::OPTIONAL, 'Package to inspect'), new InputArgument('version', InputArgument::OPTIONAL, 'Version to inspect'), new InputOption('installed', null, InputOption::VALUE_NONE, 'List installed packages only'), new InputOption('platform', null, InputOption::VALUE_NONE, 'List platform packages only'), )) ->setHelp(<<getOption('platform')) { $repos = $installedRepo = $platformRepo; } elseif ($input->getOption('installed')) { $composer = $this->getComposer(); $repos = $installedRepo = $composer->getRepositoryManager()->getLocalRepository(); } elseif ($composer = $this->getComposer(false)) { $localRepo = $composer->getRepositoryManager()->getLocalRepository(); $installedRepo = new CompositeRepository(array($localRepo, $platformRepo)); $repos = new CompositeRepository(array_merge(array($installedRepo), $composer->getRepositoryManager()->getRepositories())); } else { $output->writeln('No composer.json found in the current directory, showing packages from packagist.org'); $installedRepo = $platformRepo; $repos = new CompositeRepository(array($installedRepo, new ComposerRepository(array('url' => 'http://packagist.org')))); } // show single package or single version if ($input->getArgument('package')) { $package = $this->getPackage($input, $output, $installedRepo, $repos); if (!$package) { throw new \InvalidArgumentException('Package '.$input->getArgument('package').' not found'); } $this->printMeta($input, $output, $package, $installedRepo, $repos); $this->printLinks($input, $output, $package, 'requires'); $this->printLinks($input, $output, $package, 'recommends'); $this->printLinks($input, $output, $package, 'replaces'); return; } // list packages foreach ($repos->getPackages() as $package) { if ($platformRepo->hasPackage($package)) { $type = 'platform: '; } elseif ($installedRepo->hasPackage($package)) { $type = 'installed: '; } else { $type = 'available: '; } $output->writeln($type . ' ' . $package->getPrettyName() . ' ' . $package->getPrettyVersion() . ' (' . $package->getVersion() . ')'); } } /** * finds a package by name and version if provided * * @param InputInterface $input * @return PackageInterface * @throws \InvalidArgumentException */ protected function getPackage(InputInterface $input, OutputInterface $output, RepositoryInterface $installedRepo, RepositoryInterface $repos) { // we have a name and a version so we can use ::findPackage if ($input->getArgument('version')) { return $repos->findPackage($input->getArgument('package'), $input->getArgument('version')); } // check if we have a local installation so we can grab the right package/version foreach ($installedRepo->getPackages() as $package) { if ($package->getName() === $input->getArgument('package')) { return $package; } } // we only have a name, so search for the highest version of the given package $highestVersion = null; foreach ($repos->findPackages($input->getArgument('package')) as $package) { if (null === $highestVersion || version_compare($package->getVersion(), $highestVersion->getVersion(), '>=')) { $highestVersion = $package; } } return $highestVersion; } /** * prints package meta data */ protected function printMeta(InputInterface $input, OutputInterface $output, PackageInterface $package, RepositoryInterface $installedRepo, RepositoryInterface $repos) { $output->writeln('name : ' . $package->getPrettyName(). ' '.$package->getDescription()); $this->printVersions($input, $output, $package, $installedRepo, $repos); $output->writeln('type : ' . $package->getType()); $output->writeln('names : ' . join(', ', $package->getNames())); $output->writeln('source : ' . sprintf('[%s] %s %s', $package->getSourceType(), $package->getSourceUrl(), $package->getSourceReference())); $output->writeln('dist : ' . sprintf('[%s] %s %s', $package->getDistType(), $package->getDistUrl(), $package->getDistReference())); $output->writeln('license : ' . join(', ', $package->getLicense())); if ($package->getAutoload()) { $output->writeln("\nautoload"); foreach ($package->getAutoload() as $type => $autoloads) { $output->writeln('' . $type . ''); foreach ($autoloads as $name => $path) { $output->writeln($name . ' : ' . ($path ?: '.')); } } } } /** * prints all available versions of this package and highlights the installed one if any */ protected function printVersions(InputInterface $input, OutputInterface $output, PackageInterface $package, RepositoryInterface $installedRepo, RepositoryInterface $repos) { if ($input->getArgument('version')) { $output->writeln('version : ' . $package->getPrettyVersion()); return; } $versions = array(); foreach ($repos->findPackages($package->getName()) as $version) { $versions[$version->getPrettyVersion()] = $version->getVersion(); } uasort($versions, 'version_compare'); $versions = join(', ', array_keys(array_reverse($versions))); // highlight installed version if ($installedRepo->hasPackage($package)) { $versions = str_replace($package->getPrettyVersion(), '* ' . $package->getPrettyVersion() . '', $versions); } $output->writeln('versions : ' . $versions); } /** * print link objects * * @param string $linkType */ protected function printLinks(InputInterface $input, OutputInterface $output, PackageInterface $package, $linkType) { if ($links = $package->{'get'.ucfirst($linkType)}()) { $output->writeln("\n" . $linkType . ""); foreach ($links as $link) { $output->writeln($link->getTarget() . ' ' . $link->getPrettyConstraint() . ''); } } } }