소스 검색

Simplify exec implementation and add full PATH support, refs #4887

Jordi Boggiano 9 년 전
부모
커밋
934be204a2
2개의 변경된 파일16개의 추가작업 그리고 15개의 파일을 삭제
  1. 15 14
      src/Composer/Command/ExecCommand.php
  2. 1 1
      src/Composer/EventDispatcher/EventDispatcher.php

+ 15 - 14
src/Composer/Command/ExecCommand.php

@@ -20,7 +20,7 @@ use Symfony\Component\Console\Input\InputArgument;
 /**
  * @author Davey Shafik <me@daveyshafik.com>
  */
-class ExecCommand extends Command
+class ExecCommand extends BaseCommand
 {
     protected function configure()
     {
@@ -41,8 +41,9 @@ class ExecCommand extends Command
 
     protected function execute(InputInterface $input, OutputInterface $output)
     {
-        $binDir = $this->getComposer()->getConfig()->get('bin-dir');
-        if ($input->hasArgument('list') || !$input->hasArgument('script') || !$input->getArgument('script')) {
+        $composer = $this->getComposer();
+        $binDir = $composer->getConfig()->get('bin-dir');
+        if ($input->getOption('list') || !$input->getArgument('script')) {
             $bins = glob($binDir . '/*');
 
             if (!$bins) {
@@ -55,6 +56,12 @@ EOT
             );
 
             foreach ($bins as $bin) {
+                // skip .bat copies
+                if (isset($previousBin) && $bin === $previousBin.'.bat') {
+                    continue;
+                }
+
+                $previousBin = $bin;
                 $bin = basename($bin);
                 $this->getIO()->write(<<<EOT
 <info>- $bin</info>
@@ -66,19 +73,13 @@ EOT
         }
 
         $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);
+        $dispatcher = $composer->getEventDispatcher();
+        $dispatcher->addListener('__exec_command', $script);
+        if ($output->getVerbosity() === OutputInterface::VERBOSITY_NORMAL) {
+            $output->setVerbosity(OutputInterface::VERBOSITY_QUIET);
         }
 
-        $this->getIO()->write(<<<EOT
-<comment>Executing $script$args:</comment>
-EOT
-        );
-
-        passthru($binDir . '/' . $script . $args);
+        return $dispatcher->dispatchScript('__exec_command', true, $input->getArgument('args'));
     }
 }

+ 1 - 1
src/Composer/EventDispatcher/EventDispatcher.php

@@ -284,7 +284,7 @@ class EventDispatcher
      * @param Callable $listener  A callable expecting an event argument
      * @param int      $priority  A higher value represents a higher priority
      */
-    protected function addListener($eventName, $listener, $priority = 0)
+    public function addListener($eventName, $listener, $priority = 0)
     {
         $this->listeners[$eventName][$priority][] = $listener;
     }