Browse Source

Merge pull request #376 from davedevelopment/show-failed-git-command-output

Add stderr to exceptions for GitDownloader
Nils Adermann 13 years ago
parent
commit
c70fcb3f9c

+ 3 - 3
src/Composer/Downloader/GitDownloader.php

@@ -31,7 +31,7 @@ class GitDownloader extends VcsDownloader
         $this->io->write("    Cloning ".$package->getSourceReference());
         $command = sprintf('git clone %s %s && cd %2$s && git checkout %3$s && git reset --hard %3$s', $url, $path, $ref);
         if (0 !== $this->process->execute($command, $ignoredOutput)) {
-            throw new \RuntimeException('Failed to execute ' . $command);
+            throw new \RuntimeException('Failed to execute ' . $command . "\n\n" . $this->process->getErrorOutput());
         }
     }
 
@@ -45,7 +45,7 @@ class GitDownloader extends VcsDownloader
         $this->io->write("    Checking out ".$target->getSourceReference());
         $command = sprintf('cd %s && git fetch && git checkout %2$s && git reset --hard %2$s', $path, $ref);
         if (0 !== $this->process->execute($command, $ignoredOutput)) {
-            throw new \RuntimeException('Failed to execute ' . $command);
+            throw new \RuntimeException('Failed to execute ' . $command . "\n\n" . $this->process->getErrorOutput());
         }
     }
 
@@ -56,7 +56,7 @@ class GitDownloader extends VcsDownloader
     {
         $command = sprintf('cd %s && git status --porcelain', escapeshellarg($path));
         if (0 !== $this->process->execute($command, $output)) {
-            throw new \RuntimeException('Failed to execute ' . $command);
+            throw new \RuntimeException('Failed to execute ' . $command . "\n\n" . $this->process->getErrorOutput());
         }
 
         if (trim($output)) {

+ 15 - 0
src/Composer/Util/ProcessExecutor.php

@@ -21,6 +21,8 @@ class ProcessExecutor
 {
     static protected $timeout = 300;
 
+    protected $errorOutput;
+
     /**
      * runs a process on the commandline
      *
@@ -31,6 +33,7 @@ class ProcessExecutor
     public function execute($command, &$output = null)
     {
         $captureOutput = count(func_get_args()) > 1;
+        $this->errorOutput = null;
         $process = new Process($command, null, null, null, static::getTimeout());
         $process->run(function($type, $buffer) use ($captureOutput) {
             if ($captureOutput) {
@@ -44,6 +47,8 @@ class ProcessExecutor
             $output = $process->getOutput();
         }
 
+        $this->errorOutput = $process->getErrorOutput();
+
         return $process->getExitCode();
     }
 
@@ -52,6 +57,16 @@ class ProcessExecutor
         return ((string) $output === '') ? array() : preg_split('{\r?\n}', $output);
     }
 
+    /**
+     * Get any error output from the last command
+     *
+     * @return string
+     */
+    public function getErrorOutput()
+    {
+        return $this->errorOutput;
+    }
+
     static public function getTimeout()
     {
         return static::$timeout;

+ 7 - 0
tests/Composer/Test/Util/ProcessExecutorTest.php

@@ -33,6 +33,13 @@ class ProcessExecutorTest extends TestCase
         $this->assertEquals("foo".PHP_EOL, $output);
     }
 
+    public function testExecuteCapturesStderr()
+    {
+        $process = new ProcessExecutor;
+        $process->execute('cat foo', $output);
+        $this->assertNotNull($process->getErrorOutput());
+    }
+
     public function testTimeout()
     {
         ProcessExecutor::setTimeout(1);