From 93baa38d5c1050d6086787870dc4167258790d94 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Wed, 8 Feb 2012 10:24:36 +0100 Subject: [PATCH] Allow show command to work without a composer.json --- src/Composer/Command/Command.php | 4 +-- src/Composer/Command/ShowCommand.php | 53 +++++++++++++++------------- src/Composer/Console/Application.php | 10 ++++-- 3 files changed, 37 insertions(+), 30 deletions(-) diff --git a/src/Composer/Command/Command.php b/src/Composer/Command/Command.php index c5f83998d..8744a0da1 100644 --- a/src/Composer/Command/Command.php +++ b/src/Composer/Command/Command.php @@ -25,8 +25,8 @@ abstract class Command extends BaseCommand /** * @return \Composer\Composer */ - protected function getComposer() + protected function getComposer($required = true) { - return $this->getApplication()->getComposer(); + return $this->getApplication()->getComposer($required); } } diff --git a/src/Composer/Command/ShowCommand.php b/src/Composer/Command/ShowCommand.php index 9de3ed2de..9a2b1b6a3 100644 --- a/src/Composer/Command/ShowCommand.php +++ b/src/Composer/Command/ShowCommand.php @@ -17,6 +17,9 @@ use Composer\Package\PackageInterface; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Input\InputArgument; use Symfony\Component\Console\Output\OutputInterface; +use Composer\Repository\CompositeRepository; +use Composer\Repository\PlatformRepository; +use Composer\Repository\ComposerRepository; /** * @author Robert Schönthal @@ -44,13 +47,22 @@ EOT protected function execute(InputInterface $input, OutputInterface $output) { - $composer = $this->getComposer(); - $package = $this->getPackage($input, $output, $composer); + if ($composer = $this->getComposer(false)) { + $localRepo = $composer->getRepositoryManager()->getLocalRepository(); + $installedRepo = new CompositeRepository(array($localRepo, new PlatformRepository())); + $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 = new PlatformRepository; + $repos = new CompositeRepository(array($installedRepo, new ComposerRepository(array('url' => 'http://packagist.org')))); + } + + $package = $this->getPackage($input, $output, $installedRepo, $repos); if (!$package) { throw new \InvalidArgumentException('no package found'); } - $this->printMeta($input, $output, $package, $composer); + $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'); @@ -63,16 +75,15 @@ EOT * @return PackageInterface * @throws \InvalidArgumentException */ - protected function getPackage(InputInterface $input, OutputInterface $output, Composer $composer) + protected function getPackage(InputInterface $input, OutputInterface $output, $installedRepo, $repos) { // we have a name and a version so we can use ::findPackage if ($input->getArgument('version')) { - return $composer->getRepositoryManager()->findPackage($input->getArgument('package'), $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 - $localRepo = $composer->getRepositoryManager()->getLocalRepository(); - foreach ($localRepo->getPackages() as $package) { + foreach ($installedRepo->getPackages() as $package) { if ($package->getName() === $input->getArgument('package')) { return $package; } @@ -80,15 +91,9 @@ EOT // we only have a name, so search for the highest version of the given package $highestVersion = null; - $repos = array_merge( - array($composer->getRepositoryManager()->getLocalRepository()), - $composer->getRepositoryManager()->getRepositories() - ); - foreach ($repos as $repository) { - foreach ($repository->findPackagesByName($input->getArgument('package')) as $package) { - if (null === $highestVersion || version_compare($package->getVersion(), $highestVersion->getVersion(), '>=')) { - $highestVersion = $package; - } + foreach ($repos->findPackagesByName($input->getArgument('package')) as $package) { + if (null === $highestVersion || version_compare($package->getVersion(), $highestVersion->getVersion(), '>=')) { + $highestVersion = $package; } } @@ -98,15 +103,15 @@ EOT /** * prints package meta data */ - protected function printMeta(InputInterface $input, OutputInterface $output, PackageInterface $package, Composer $composer) + protected function printMeta(InputInterface $input, OutputInterface $output, PackageInterface $package, $installedRepo, $repos) { $output->writeln('name : ' . $package->getPrettyName()); - $this->printVersions($input, $output, $package, $composer); + $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('licence : ' . join(', ', $package->getLicense())); + $output->writeln('license : ' . join(', ', $package->getLicense())); if ($package->getAutoload()) { $output->writeln("\nautoload"); @@ -123,7 +128,7 @@ EOT /** * prints all available versions of this package and highlights the installed one if any */ - protected function printVersions(InputInterface $input, OutputInterface $output, PackageInterface $package, Composer $composer) + protected function printVersions(InputInterface $input, OutputInterface $output, PackageInterface $package, $installedRepo, $repos) { if ($input->getArgument('version')) { $output->writeln('version : ' . $package->getPrettyVersion()); @@ -132,16 +137,14 @@ EOT $versions = array(); - foreach ($composer->getRepositoryManager()->getRepositories() as $repository) { - foreach ($repository->findPackagesByName($package->getName()) as $version) { - $versions[] = $version->getPrettyVersion(); - } + foreach ($repos->findPackagesByName($package->getName()) as $version) { + $versions[] = $version->getPrettyVersion(); } $versions = join(', ', $versions); // highlight installed version - if ($composer->getRepositoryManager()->getLocalRepository()->hasPackage($package)) { + if ($installedRepo->hasPackage($package)) { $versions = str_replace($package->getPrettyVersion(), '* ' . $package->getPrettyVersion() . '', $versions); } diff --git a/src/Composer/Console/Application.php b/src/Composer/Console/Application.php index 745d5510d..fef0ed4e3 100644 --- a/src/Composer/Console/Application.php +++ b/src/Composer/Console/Application.php @@ -71,14 +71,18 @@ class Application extends BaseApplication /** * @return Composer */ - public function getComposer() + public function getComposer($required = true) { if (null === $this->composer) { try { $this->composer = Factory::create($this->io); } catch (\InvalidArgumentException $e) { - $this->io->write($e->getMessage()); - exit(1); + if ($required) { + $this->io->write($e->getMessage()); + exit(1); + } + + return; } }