diff --git a/src/Composer/Command/CreateProjectCommand.php b/src/Composer/Command/CreateProjectCommand.php index 6df45c229..c4fa7abf4 100644 --- a/src/Composer/Command/CreateProjectCommand.php +++ b/src/Composer/Command/CreateProjectCommand.php @@ -87,7 +87,7 @@ EOT ); } - public function installProject(IOInterface $io, $packageName, $directory = null, $version = null, $preferSource = false, $installDevPackages = false, $repositoryUrl = null, $disableCustomInstallers = false, $noScripts = false) + public function installProject(IOInterface $io, $packageName, $directory = null, $packageVersion = null, $preferSource = false, $installDevPackages = false, $repositoryUrl = null, $disableCustomInstallers = false, $noScripts = false) { $dm = $this->createDownloadManager($io); if ($preferSource) { @@ -105,9 +105,30 @@ EOT throw new \InvalidArgumentException("Invalid repository url given. Has to be a .json file or an http url."); } - $candidates = $sourceRepo->findPackages($packageName, $version); + $candidates = array(); + $name = strtolower($packageName); + + if ($packageVersion === null) { + $sourceRepo->filterPackages(function ($package) use (&$candidates, $name) { + if ($package->getName() === $name) { + $candidates[] = $package; + } + }); + } else { + $parser = new VersionParser(); + $version = $parser->normalize($packageVersion); + $sourceRepo->filterPackages(function ($package) use (&$candidates, $name, $version) { + if ($package->getName() === $name && $version === $package->getVersion()) { + $candidates[] = $package; + + return false; + } + if ($package->getName() === $name) {var_dump((string) $package);} + }); + } + if (!$candidates) { - throw new \InvalidArgumentException("Could not find package $packageName" . ($version ? " with version $version." : '')); + throw new \InvalidArgumentException("Could not find package $packageName" . ($packageVersion ? " with version $packageVersion." : '')); } if (null === $directory) { diff --git a/src/Composer/Command/SearchCommand.php b/src/Composer/Command/SearchCommand.php index 80bac3abe..a89f6b1dc 100644 --- a/src/Composer/Command/SearchCommand.php +++ b/src/Composer/Command/SearchCommand.php @@ -72,8 +72,6 @@ EOT foreach ($this->lowMatches as $details) { $output->writeln($details['name'] . ': '. $details['description']); } - - var_dump((memory_get_peak_usage() / 1024 / 1024) . 'MB memory, '.round(microtime(true) - $time, 2) .'secs'); } public function processPackage($package) diff --git a/src/Composer/Command/ShowCommand.php b/src/Composer/Command/ShowCommand.php index a850da552..6be8fdc7c 100644 --- a/src/Composer/Command/ShowCommand.php +++ b/src/Composer/Command/ShowCommand.php @@ -15,6 +15,7 @@ namespace Composer\Command; use Composer\Composer; use Composer\Factory; use Composer\Package\CompletePackageInterface; +use Composer\Package\Version\VersionParser; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Input\InputArgument; use Symfony\Component\Console\Input\InputOption; @@ -38,9 +39,9 @@ class ShowCommand extends Command ->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'), - new InputOption('self', null, InputOption::VALUE_NONE, 'Show the root package information'), + new InputOption('installed', 'i', InputOption::VALUE_NONE, 'List installed packages only'), + new InputOption('platform', 'p', InputOption::VALUE_NONE, 'List platform packages only'), + new InputOption('self', 's', InputOption::VALUE_NONE, 'Show the root package information'), )) ->setHelp(<<getArgument('package') || !empty($package)) { if (empty($package)) { - $package = $this->getPackage($input, $output, $installedRepo, $repos); - } - if (!$package) { - throw new \InvalidArgumentException('Package '.$input->getArgument('package').' not found'); + list($package, $versions) = $this->getPackage($installedRepo, $repos, $input->getArgument('package'), $input->getArgument('version')); + + if (!$package) { + throw new \InvalidArgumentException('Package '.$input->getArgument('package').' not found'); + } } - $this->printMeta($input, $output, $package, $installedRepo, $repos); + $this->printMeta($input, $output, $package, $versions, $installedRepo, $repos); $this->printLinks($input, $output, $package, 'requires'); $this->printLinks($input, $output, $package, 'devRequires', 'requires (dev)'); if ($package->getSuggests()) { @@ -101,7 +103,7 @@ EOT // list packages $packages = array(); - foreach ($repos->getPackages() as $package) { + $repos->filterPackages(function ($package) use (&$packages, $platformRepo, $installedRepo) { if ($platformRepo->hasPackage($package)) { $type = 'platform:'; } elseif ($installedRepo->hasPackage($package)) { @@ -109,13 +111,12 @@ EOT } else { $type = 'available:'; } - if (isset($packages[$type][$package->getName()]) - && version_compare($packages[$type][$package->getName()]->getVersion(), $package->getVersion(), '>=') + if (!isset($packages[$type][$package->getName()]) + || version_compare($packages[$type][$package->getName()]->getVersion(), $package->getVersion(), '<') ) { - continue; + $packages[$type][$package->getName()] = $package; } - $packages[$type][$package->getName()] = $package; - } + }, 'Composer\Package\CompletePackage'); foreach (array('platform:' => true, 'available:' => false, 'installed:' => true) as $type => $showVersion) { if (isset($packages[$type])) { @@ -132,44 +133,69 @@ EOT /** * finds a package by name and version if provided * - * @param InputInterface $input - * @return CompletePackageInterface + * @return array array(CompletePackageInterface, array of versions) * @throws \InvalidArgumentException */ - protected function getPackage(InputInterface $input, OutputInterface $output, RepositoryInterface $installedRepo, RepositoryInterface $repos) + protected function getPackage(RepositoryInterface $installedRepo, RepositoryInterface $repos, $name, $version = null) { - // 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')); + $name = strtolower($name); + if ($version) { + $parser = new VersionParser(); + $version = $parser->normalize($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; + $match = null; + $matches = array(); + $repos->filterPackages(function ($package) use ($name, $version, &$matches) { + if ($package->getName() === $name) { + $matches[] = $package; } - } + }, 'Composer\Package\CompletePackage'); - // 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; + if (null === $version) { + // search for a locally installed version + foreach ($matches as $package) { + if ($installedRepo->hasPackage($package)) { + $match = $package; + break; + } + } + + if (!$match) { + // fallback to the highest version + foreach ($matches as $package) { + if (null === $match || version_compare($package->getVersion(), $match->getVersion(), '>=')) { + $match = $package; + } + } } + } else { + // select the specified version + foreach ($matches as $package) { + if ($package->getVersion() === $version) { + $match = $package; + } + } + } + + // build versions array + $versions = array(); + foreach ($matches as $package) { + $versions[$package->getPrettyVersion()] = $package->getVersion(); } - return $highestVersion; + return array($match, $versions); } /** * prints package meta data */ - protected function printMeta(InputInterface $input, OutputInterface $output, CompletePackageInterface $package, RepositoryInterface $installedRepo, RepositoryInterface $repos) + protected function printMeta(InputInterface $input, OutputInterface $output, CompletePackageInterface $package, array $versions, RepositoryInterface $installedRepo, RepositoryInterface $repos) { $output->writeln('name : ' . $package->getPrettyName()); $output->writeln('descrip. : ' . $package->getDescription()); $output->writeln('keywords : ' . join(', ', $package->getKeywords() ?: array())); - $this->printVersions($input, $output, $package, $installedRepo, $repos); + $this->printVersions($input, $output, $package, $versions, $installedRepo, $repos); $output->writeln('type : ' . $package->getType()); $output->writeln('license : ' . implode(', ', $package->getLicense())); $output->writeln('source : ' . sprintf('[%s] %s %s', $package->getSourceType(), $package->getSourceUrl(), $package->getSourceReference())); @@ -206,7 +232,7 @@ EOT /** * prints all available versions of this package and highlights the installed one if any */ - protected function printVersions(InputInterface $input, OutputInterface $output, CompletePackageInterface $package, RepositoryInterface $installedRepo, RepositoryInterface $repos) + protected function printVersions(InputInterface $input, OutputInterface $output, CompletePackageInterface $package, array $versions, RepositoryInterface $installedRepo, RepositoryInterface $repos) { if ($input->getArgument('version')) { $output->writeln('version : ' . $package->getPrettyVersion()); @@ -214,14 +240,7 @@ EOT return; } - $versions = array(); - - foreach ($repos->findPackages($package->getName()) as $version) { - $versions[$version->getPrettyVersion()] = $version->getVersion(); - } - uasort($versions, 'version_compare'); - $versions = implode(', ', array_keys(array_reverse($versions))); // highlight installed version