diff --git a/src/Composer/Installer/SuggestedPackagesReporter.php b/src/Composer/Installer/SuggestedPackagesReporter.php index 935ec50cf..7f4230017 100644 --- a/src/Composer/Installer/SuggestedPackagesReporter.php +++ b/src/Composer/Installer/SuggestedPackagesReporter.php @@ -15,6 +15,7 @@ namespace Composer\Installer; use Composer\IO\IOInterface; use Composer\Package\PackageInterface; use Composer\Repository\RepositoryInterface; +use Symfony\Component\Console\Formatter\OutputFormatter; /** * Add suggested packages from different places to output them in the end. @@ -116,11 +117,35 @@ class SuggestedPackagesReporter $this->io->writeError(sprintf( '%s suggests installing %s (%s)', $suggestion['source'], - $suggestion['target'], - $suggestion['reason'] + $this->escapeOutput($suggestion['target']), + $this->escapeOutput($suggestion['reason']) )); } return $this; } + + /** + * @param string $string + * @return string + */ + private function escapeOutput($string) + { + return OutputFormatter::escape( + $this->removeControlCharacters($string) + ); + } + + /** + * @param string $string + * @return string + */ + private function removeControlCharacters($string) + { + return preg_replace( + '/[[:cntrl:]]/', + '', + str_replace("\n", ' ', $string) + ); + } } diff --git a/tests/Composer/Test/Installer/SuggestedPackagesReporterTest.php b/tests/Composer/Test/Installer/SuggestedPackagesReporterTest.php index c4cbd72c5..0edb1b2a4 100644 --- a/tests/Composer/Test/Installer/SuggestedPackagesReporterTest.php +++ b/tests/Composer/Test/Installer/SuggestedPackagesReporterTest.php @@ -144,6 +144,25 @@ class SuggestedPackagesReporterTest extends \PHPUnit_Framework_TestCase $this->suggestedPackagesReporter->output(); } + /** + * @covers ::output + */ + public function testOutputIgnoresFormatting() + { + $this->suggestedPackagesReporter->addPackage('source', 'target1', "\x1b[1;37;42m Like us\r\non Facebook \x1b[0m"); + $this->suggestedPackagesReporter->addPackage('source', 'target2', "Like us on Facebook"); + + $this->io->expects($this->at(0)) + ->method('writeError') + ->with("source suggests installing target1 ([1;37;42m Like us on Facebook [0m)"); + + $this->io->expects($this->at(1)) + ->method('writeError') + ->with('source suggests installing target2 (\\Like us on Facebook\\)'); + + $this->suggestedPackagesReporter->output(); + } + /** * @covers ::output */