diff --git a/src/Composer/IO/BaseIO.php b/src/Composer/IO/BaseIO.php
index 8f61c863d..cb2e99def 100644
--- a/src/Composer/IO/BaseIO.php
+++ b/src/Composer/IO/BaseIO.php
@@ -65,6 +65,22 @@ abstract class BaseIO implements IOInterface, LoggerInterface
$this->authentications[$repositoryName] = array('username' => $username, 'password' => $password);
}
+ /**
+ * {@inheritDoc}
+ */
+ public function writeRaw($messages, $newline = true, $verbosity = self::NORMAL)
+ {
+ $this->write($messages, $newline, $verbosity);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function writeErrorRaw($messages, $newline = true, $verbosity = self::NORMAL)
+ {
+ $this->writeError($messages, $newline, $verbosity);
+ }
+
/**
* Check for overwrite and set the authentication information for the repository.
*
diff --git a/src/Composer/IO/ConsoleIO.php b/src/Composer/IO/ConsoleIO.php
index 8b29177d5..925a528be 100644
--- a/src/Composer/IO/ConsoleIO.php
+++ b/src/Composer/IO/ConsoleIO.php
@@ -129,13 +129,29 @@ class ConsoleIO extends BaseIO
$this->doWrite($messages, $newline, true, $verbosity);
}
+ /**
+ * {@inheritDoc}
+ */
+ public function writeRaw($messages, $newline = true, $verbosity = self::NORMAL)
+ {
+ $this->doWrite($messages, $newline, false, $verbosity, true);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function writeErrorRaw($messages, $newline = true, $verbosity = self::NORMAL)
+ {
+ $this->doWrite($messages, $newline, true, $verbosity, true);
+ }
+
/**
* @param array|string $messages
* @param bool $newline
* @param bool $stderr
* @param int $verbosity
*/
- private function doWrite($messages, $newline, $stderr, $verbosity)
+ private function doWrite($messages, $newline, $stderr, $verbosity, $raw = false)
{
$sfVerbosity = $this->verbosityMap[$verbosity];
if ($sfVerbosity > $this->output->getVerbosity()) {
@@ -149,6 +165,14 @@ class ConsoleIO extends BaseIO
$sfVerbosity = OutputInterface::OUTPUT_NORMAL;
}
+ if ($raw) {
+ if ($sfVerbosity === OutputInterface::OUTPUT_NORMAL) {
+ $sfVerbosity = OutputInterface::OUTPUT_RAW;
+ } else {
+ $sfVerbosity |= OutputInterface::OUTPUT_RAW;
+ }
+ }
+
if (null !== $this->startTime) {
$memoryUsage = memory_get_usage() / 1024 / 1024;
$timeSpent = microtime(true) - $this->startTime;
diff --git a/src/Composer/Util/ProcessExecutor.php b/src/Composer/Util/ProcessExecutor.php
index 00b2e7547..83f19cf2d 100644
--- a/src/Composer/Util/ProcessExecutor.php
+++ b/src/Composer/Util/ProcessExecutor.php
@@ -112,10 +112,18 @@ class ProcessExecutor
return;
}
- if (Process::ERR === $type) {
- $this->io->writeError($buffer, false);
+ if (method_exists($this->io, 'writeRaw')) {
+ if (Process::ERR === $type) {
+ $this->io->writeErrorRaw($buffer, false);
+ } else {
+ $this->io->writeRaw($buffer, false);
+ }
} else {
- $this->io->write($buffer, false);
+ if (Process::ERR === $type) {
+ $this->io->writeError($buffer, false);
+ } else {
+ $this->io->write($buffer, false);
+ }
}
}
diff --git a/tests/Composer/Test/Util/ProcessExecutorTest.php b/tests/Composer/Test/Util/ProcessExecutorTest.php
index db16b8c02..29723b4a5 100644
--- a/tests/Composer/Test/Util/ProcessExecutorTest.php
+++ b/tests/Composer/Test/Util/ProcessExecutorTest.php
@@ -12,9 +12,14 @@
namespace Composer\Test\Util;
+use Composer\IO\ConsoleIO;
use Composer\Util\ProcessExecutor;
use Composer\Test\TestCase;
use Composer\IO\BufferIO;
+use Symfony\Component\Console\Helper\HelperSet;
+use Symfony\Component\Console\Input\ArrayInput;
+use Symfony\Component\Console\Output\BufferedOutput;
+use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Output\StreamOutput;
class ProcessExecutorTest extends TestCase
@@ -99,4 +104,13 @@ class ProcessExecutorTest extends TestCase
$this->assertEquals(array('foo', 'bar'), $process->splitLines("foo\r\nbar"));
$this->assertEquals(array('foo', 'bar'), $process->splitLines("foo\r\nbar\n"));
}
+
+ public function testConsoleIODoesNotFormatSymfonyConsoleStyle()
+ {
+ $output = new BufferedOutput(OutputInterface::VERBOSITY_NORMAL, true);
+ $process = new ProcessExecutor(new ConsoleIO(new ArrayInput([]), $output, new HelperSet([])));
+
+ $process->execute('echo \'foo\'');
+ $this->assertSame('foo'.PHP_EOL, $output->fetch());
+ }
}