Add update command, fixes #28

main
Jordi Boggiano 13 years ago
parent 7493cf7654
commit 1feebcafe2

@ -33,7 +33,7 @@ class DebugPackagesCommand extends Command
->setName('debug:packages') ->setName('debug:packages')
->setDescription('Lists all existing packages and their version') ->setDescription('Lists all existing packages and their version')
->setHelp(<<<EOT ->setHelp(<<<EOT
<info>php composer debug:packages</info> <info>php composer.phar debug:packages</info>
EOT EOT
) )

@ -43,7 +43,7 @@ The <info>install</info> command reads the composer.json file from the
current directory, processes it, and downloads and installs all the current directory, processes it, and downloads and installs all the
libraries and dependencies outlined in that file. libraries and dependencies outlined in that file.
<info>php composer install</info> <info>php composer.phar install</info>
EOT EOT
) )
@ -51,10 +51,15 @@ EOT
} }
protected function execute(InputInterface $input, OutputInterface $output) protected function execute(InputInterface $input, OutputInterface $output)
{
return $this->install($output, $input->getOption('dev'));
}
public function install(OutputInterface $output, $preferSource, $update = false)
{ {
$composer = $this->getComposer(); $composer = $this->getComposer();
if ($input->getOption('dev')) { if ($preferSource) {
$composer->getDownloadManager()->setPreferSource(true); $composer->getDownloadManager()->setPreferSource(true);
} }
@ -72,7 +77,30 @@ EOT
// creating requirements request // creating requirements request
$request = new Request($pool); $request = new Request($pool);
if ($composer->getLocker()->isLocked()) { if ($update) {
$output->writeln('> Updating dependencies.');
$listedPackages = array();
$installedPackages = $installedRepo->getPackages();
foreach ($composer->getPackage()->getRequires() as $link) {
$listedPackages[] = $link->getTarget();
foreach ($installedPackages as $package) {
if ($package->getName() === $link->getTarget()) {
$request->update($link->getTarget(), $link->getConstraint());
continue 2;
}
}
$request->install($link->getTarget(), $link->getConstraint());
}
foreach ($localRepo->getPackages() as $package) {
if (!in_array($package->getName(), $listedPackages)) {
$request->remove($package->getName());
}
}
} elseif ($composer->getLocker()->isLocked()) {
$output->writeln('> Found lockfile. Reading.'); $output->writeln('> Found lockfile. Reading.');
foreach ($composer->getLocker()->getLockedPackages() as $package) { foreach ($composer->getLocker()->getLockedPackages() as $package) {
@ -80,6 +108,7 @@ EOT
$request->install($package->getName(), $constraint); $request->install($package->getName(), $constraint);
} }
} else { } else {
$output->writeln('> Installing dependencies.');
foreach ($composer->getPackage()->getRequires() as $link) { foreach ($composer->getPackage()->getRequires() as $link) {
$request->install($link->getTarget(), $link->getConstraint()); $request->install($link->getTarget(), $link->getConstraint());
} }
@ -116,7 +145,7 @@ EOT
$installationManager->execute($operation); $installationManager->execute($operation);
} }
if (!$composer->getLocker()->isLocked()) { if ($update || !$composer->getLocker()->isLocked()) {
$composer->getLocker()->lockPackages($localRepo->getPackages()); $composer->getLocker()->lockPackages($localRepo->getPackages());
$output->writeln('> Locked'); $output->writeln('> Locked');
} }

@ -0,0 +1,58 @@
<?php
/*
* This file is part of Composer.
*
* (c) Nils Adermann <naderman@naderman.de>
* Jordi Boggiano <j.boggiano@seld.be>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Composer\Command;
use Composer\Autoload\AutoloadGenerator;
use Composer\DependencyResolver;
use Composer\DependencyResolver\Pool;
use Composer\DependencyResolver\Request;
use Composer\DependencyResolver\Operation;
use Composer\Package\LinkConstraint\VersionConstraint;
use Composer\Repository\PlatformRepository;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;
/**
* @author Jordi Boggiano <j.boggiano@seld.be>
*/
class UpdateCommand extends Command
{
protected function configure()
{
$this
->setName('update')
->setDescription('Updates your dependencies to the latest version, and updates the composer.lock file.')
->setDefinition(array(
new InputOption('dev', null, InputOption::VALUE_NONE, 'Forces installation from package sources when possible, including VCS information.'),
))
->setHelp(<<<EOT
The <info>update</info> command reads the composer.json file from the
current directory, processes it, and updates, removes or installs all the
dependencies.
<info>php composer.phar update</info>
EOT
)
;
}
protected function execute(InputInterface $input, OutputInterface $output)
{
$composer = $this->getComposer();
$installCommand = $this->getApplication()->find('install');
return $installCommand->install($output, $input->getOption('dev'), true);
}
}

@ -64,6 +64,7 @@ class Application extends BaseApplication
protected function registerCommands() protected function registerCommands()
{ {
$this->add(new Command\InstallCommand()); $this->add(new Command\InstallCommand());
$this->add(new Command\UpdateCommand());
$this->add(new Command\DebugPackagesCommand()); $this->add(new Command\DebugPackagesCommand());
} }
} }

Loading…
Cancel
Save