diff --git a/src/Composer/Command/ExecCommand.php b/src/Composer/Command/ExecCommand.php new file mode 100644 index 000000000..7d7927410 --- /dev/null +++ b/src/Composer/Command/ExecCommand.php @@ -0,0 +1,84 @@ + + * 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\InputOption; +use Symfony\Component\Console\Output\OutputInterface; +use Symfony\Component\Console\Input\InputArgument; + +/** + * @author Davey Shafik + */ +class ExecCommand extends Command +{ + protected function configure() + { + $this + ->setName('exec') + ->setDescription('Execute a vendored binary/script') + ->setDefinition(array( + new InputOption('list', 'l', InputOption::VALUE_NONE), + new InputArgument('script', InputArgument::OPTIONAL, 'The script to run, e.g. phpunit'), + new InputArgument( + 'args', + InputArgument::IS_ARRAY | InputArgument::OPTIONAL, + 'Arguments to pass to the script. Use -- to separate from composer arguments' + ), + )) + ; + } + + protected function execute(InputInterface $input, OutputInterface $output) + { + $binDir = $this->getComposer()->getConfig()->get('bin-dir'); + if ($input->hasArgument('list') || !$input->hasArgument('script') || !$input->getArgument('script')) { + $bins = glob($binDir . '/*'); + + if (!$bins) { + throw new \RuntimeException("No scripts found in bin-dir ($binDir)"); + } + + $this->getIO()->write(<<Available scripts: +EOT + ); + + foreach ($bins as $bin) { + $bin = basename($bin); + $this->getIO()->write(<<- $bin +EOT + ); + } + + return; + } + + $script = $input->getArgument('script'); + if (!file_exists($binDir . '/' . $script)) { + throw new \RuntimeException("script '$script' not found in bin-dir ($binDir)"); + } + + if ($args = $input->getArgument('args')) { + $args = " " . implode(" ", $args); + } + + $this->getIO()->write(<<Executing $script$args: +EOT + ); + + passthru($binDir . '/' . $script . $args); + } +} diff --git a/src/Composer/Console/Application.php b/src/Composer/Console/Application.php index 51db89e89..dc06615a1 100644 --- a/src/Composer/Console/Application.php +++ b/src/Composer/Console/Application.php @@ -307,6 +307,7 @@ class Application extends BaseApplication new Command\ClearCacheCommand(), new Command\RemoveCommand(), new Command\HomeCommand(), + new Command\ExecCommand(), )); if ('phar:' === substr(__FILE__, 0, 5)) {