diff --git a/doc/03-cli.md b/doc/03-cli.md index 0c3343010..86977fd9d 100644 --- a/doc/03-cli.md +++ b/doc/03-cli.md @@ -59,6 +59,18 @@ into `composer.lock`. * **--dry-run:** Simulate the command without actually doing anything. * **--dev:** Install packages listed in `require-dev`. +## require + +The `require` command adds new packages to the `composer.json` file from the current +directory. + + $ php composer.phar require + +This will update your `composer.json` file keeping previous required packages. +If a package is already in the `composer.json` file you will be asked to choose which version you want. + +Like the `init` command, `require` allows you to search for packages. + ## search The search command allows you to search through the current project's package diff --git a/src/Composer/Command/RequireCommand.php b/src/Composer/Command/RequireCommand.php new file mode 100644 index 000000000..80cc68e02 --- /dev/null +++ b/src/Composer/Command/RequireCommand.php @@ -0,0 +1,110 @@ + + * 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 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\Json\JsonFile; +use Composer\Json\JsonValidationException; +use Composer\Util\RemoteFilesystem; + +/** + * @author Jérémy Romey + */ +class RequireCommand extends InitCommand +{ + protected function configure() + { + $this + ->setName('require') + ->setDescription('Adds a required package to a composer.json') + ->setDefinition(array( + new InputArgument('file', InputArgument::OPTIONAL, 'path to composer.json file', './composer.json'), + new InputOption('require', null, InputOption::VALUE_IS_ARRAY | InputOption::VALUE_REQUIRED, 'An array of required packages'), + )) + ->setHelp(<<getArgument('file'); + + if (!file_exists($file)) { + $output->writeln(''.$file.' not found.'); + return 1; + } + if (!is_readable($file)) { + $output->writeln(''.$file.' is not readable.'); + return 1; + } + + $laxValid = false; + try { + $json = new JsonFile($file, new RemoteFilesystem($this->getIO())); + $json->read(); + + $json->validateSchema(JsonFile::LAX_SCHEMA); + $laxValid = true; + $json->validateSchema(); + + } catch (\Exception $e) { + $output->writeln(''.$file.' has an error. Run the validate command for more info'); + return 1; + } + + $output->writeln(array( + '', + 'Updating your dependencies.', + '' + )); + + $dialog = $this->getHelperSet()->get('dialog'); + + $options = json_decode($json->getResult(), true); + + $requirements = array(); + $requirements = $this->determineRequirements($input, $output); + + $baseRequirements = array_key_exists('require', $options) ? $options['require'] : array(); + $requirements = $this->formatRequirements($requirements); + + foreach ($requirements as $package => $version) { + if (array_key_exists($package, $baseRequirements)) { + if ($dialog->askConfirmation($output, $dialog->getQuestion('The package '.$package.' is already in requirements. Would you like to update the version required from '.$baseRequirements[$package].' to '.$version, 'yes', '?'), true)) { + $baseRequirements[$package] = $version; + } + } else { + $baseRequirements[$package] = $version; + } + } + + $options['require'] = $baseRequirements; + + $json->encode($options); + $json->write($options); + + $output->writeln(''.$file.' has been updated'); + } + + protected function interact(InputInterface $input, OutputInterface $output) + { + return; + } +} diff --git a/src/Composer/Console/Application.php b/src/Composer/Console/Application.php index ae7518618..1174c2c90 100644 --- a/src/Composer/Console/Application.php +++ b/src/Composer/Console/Application.php @@ -117,6 +117,7 @@ class Application extends BaseApplication $this->add(new Command\SearchCommand()); $this->add(new Command\ValidateCommand()); $this->add(new Command\ShowCommand()); + $this->add(new Command\RequireCommand()); if ('phar:' === substr(__FILE__, 0, 5)) { $this->add(new Command\SelfUpdateCommand()); diff --git a/src/Composer/Json/JsonFile.php b/src/Composer/Json/JsonFile.php index f463c777e..09ae3eb0f 100644 --- a/src/Composer/Json/JsonFile.php +++ b/src/Composer/Json/JsonFile.php @@ -299,4 +299,14 @@ class JsonFile throw $result; } + + /** + * Returns the content of the file + * + * @return string result + */ + public function getResult() + { + return $this->rfs->getContents($this->path, $this->path, false); + } }