From bb0a2df293807b04410477abefcd92731e7f04d0 Mon Sep 17 00:00:00 2001 From: Xavier Fornes Date: Wed, 28 Jan 2015 08:49:38 +0100 Subject: [PATCH 1/5] fix for issue #3657 ConsoleIO writing a message which contains end of lines characters --- src/Composer/IO/ConsoleIO.php | 14 ++++++++------ tests/Composer/Test/IO/ConsoleIOTest.php | 24 ++++++++++++++++++++++++ 2 files changed, 32 insertions(+), 6 deletions(-) diff --git a/src/Composer/IO/ConsoleIO.php b/src/Composer/IO/ConsoleIO.php index 491a6b7fb..78b271356 100644 --- a/src/Composer/IO/ConsoleIO.php +++ b/src/Composer/IO/ConsoleIO.php @@ -97,12 +97,14 @@ class ConsoleIO extends BaseIO { if (null !== $this->startTime) { $messages = (array) $messages; - $messages[0] = sprintf( - '[%.1fMB/%.2fs] %s', - memory_get_usage() / 1024 / 1024, - microtime(true) - $this->startTime, - $messages[0] - ); + $messages = array_map(function (&$message) { + return sprintf( + '[%.1fMB/%.2fs] %s', + memory_get_usage() / 1024 / 1024, + microtime(true) - $this->startTime, + $message + ); + }, $messages); } $this->output->write($messages, $newline); $this->lastMessage = join($newline ? "\n" : '', (array) $messages); diff --git a/tests/Composer/Test/IO/ConsoleIOTest.php b/tests/Composer/Test/IO/ConsoleIOTest.php index 6ce95b0ac..8c9fad5fa 100644 --- a/tests/Composer/Test/IO/ConsoleIOTest.php +++ b/tests/Composer/Test/IO/ConsoleIOTest.php @@ -49,6 +49,30 @@ class ConsoleIOTest extends TestCase $consoleIO->write('some information about something', false); } + public function testWriteWithMultipleLineStringWhenDebugging() + { + $inputMock = $this->getMock('Symfony\Component\Console\Input\InputInterface'); + $outputMock = $this->getMock('Symfony\Component\Console\Output\OutputInterface'); + $outputMock->expects($this->once()) + ->method('write') + ->with( + $this->callback(function($messages){ + $this->assertRegExp("[(.*)/(.*) First line]", $messages[0]); + $this->assertRegExp("[(.*)/(.*) Second line]", $messages[1]); + return true; + }), + $this->equalTo(false) + ); + $helperMock = $this->getMock('Symfony\Component\Console\Helper\HelperSet'); + + $consoleIO = new ConsoleIO($inputMock, $outputMock, $helperMock); + $startTime = microtime(true); + $consoleIO->enableDebugging($startTime); + + $example = explode('\n', 'First line\nSecond lines'); + $consoleIO->write($example, false); + } + public function testOverwrite() { $inputMock = $this->getMock('Symfony\Component\Console\Input\InputInterface'); From 8ba8580a28a4b122ee002bd31e8b87df79f32960 Mon Sep 17 00:00:00 2001 From: Xavier Fornes Date: Wed, 28 Jan 2015 11:46:38 +0100 Subject: [PATCH 2/5] fix test implementation for php 5.3 refs issue #3657 --- tests/Composer/Test/IO/ConsoleIOTest.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/Composer/Test/IO/ConsoleIOTest.php b/tests/Composer/Test/IO/ConsoleIOTest.php index 8c9fad5fa..c83ec6296 100644 --- a/tests/Composer/Test/IO/ConsoleIOTest.php +++ b/tests/Composer/Test/IO/ConsoleIOTest.php @@ -57,9 +57,9 @@ class ConsoleIOTest extends TestCase ->method('write') ->with( $this->callback(function($messages){ - $this->assertRegExp("[(.*)/(.*) First line]", $messages[0]); - $this->assertRegExp("[(.*)/(.*) Second line]", $messages[1]); - return true; + $result = preg_match("[(.*)/(.*) First line]", $messages[0]) > 0; + $result &= preg_match("[(.*)/(.*) Second line]", $messages[1]) > 0; + return $result; }), $this->equalTo(false) ); From 3f59c007f776fde89a1c11e2776a9fde3a8ae378 Mon Sep 17 00:00:00 2001 From: Xavier Fornes Date: Wed, 28 Jan 2015 11:50:54 +0100 Subject: [PATCH 3/5] fix implementation for php 5.3 refs issue #3657 --- src/Composer/IO/ConsoleIO.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/Composer/IO/ConsoleIO.php b/src/Composer/IO/ConsoleIO.php index 78b271356..11623a143 100644 --- a/src/Composer/IO/ConsoleIO.php +++ b/src/Composer/IO/ConsoleIO.php @@ -97,11 +97,12 @@ class ConsoleIO extends BaseIO { if (null !== $this->startTime) { $messages = (array) $messages; - $messages = array_map(function (&$message) { + $startTime = $this->startTime; + $messages = array_map(function (&$message) use ($startTime) { return sprintf( '[%.1fMB/%.2fs] %s', memory_get_usage() / 1024 / 1024, - microtime(true) - $this->startTime, + microtime(true) - $startTime, $message ); }, $messages); From a4ffda699f2bcb57d0a0b2aa7bc9fd1d68888412 Mon Sep 17 00:00:00 2001 From: Xavier Fornes Date: Wed, 28 Jan 2015 13:38:43 +0100 Subject: [PATCH 4/5] remove by reference on message parameter refs issue #3657 --- src/Composer/IO/ConsoleIO.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Composer/IO/ConsoleIO.php b/src/Composer/IO/ConsoleIO.php index 11623a143..28a2247cd 100644 --- a/src/Composer/IO/ConsoleIO.php +++ b/src/Composer/IO/ConsoleIO.php @@ -98,7 +98,7 @@ class ConsoleIO extends BaseIO if (null !== $this->startTime) { $messages = (array) $messages; $startTime = $this->startTime; - $messages = array_map(function (&$message) use ($startTime) { + $messages = array_map(function ($message) use ($startTime) { return sprintf( '[%.1fMB/%.2fs] %s', memory_get_usage() / 1024 / 1024, From 2936dc0e55f823251aaad05092c05d28cfb86279 Mon Sep 17 00:00:00 2001 From: Xavier Fornes Date: Wed, 28 Jan 2015 14:43:58 +0100 Subject: [PATCH 5/5] some micro-optimizations made refs issue #3657 --- src/Composer/IO/ConsoleIO.php | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/src/Composer/IO/ConsoleIO.php b/src/Composer/IO/ConsoleIO.php index 28a2247cd..7df26eabf 100644 --- a/src/Composer/IO/ConsoleIO.php +++ b/src/Composer/IO/ConsoleIO.php @@ -96,16 +96,11 @@ class ConsoleIO extends BaseIO public function write($messages, $newline = true) { if (null !== $this->startTime) { - $messages = (array) $messages; - $startTime = $this->startTime; - $messages = array_map(function ($message) use ($startTime) { - return sprintf( - '[%.1fMB/%.2fs] %s', - memory_get_usage() / 1024 / 1024, - microtime(true) - $startTime, - $message - ); - }, $messages); + $memoryUsage = memory_get_usage() / 1024 / 1024; + $timeSpent = microtime(true) - $this->startTime; + $messages = array_map(function ($message) use ($memoryUsage, $timeSpent) { + return sprintf('[%.1fMB/%.2fs] %s', $memoryUsage, $timeSpent, $message); + }, (array) $messages); } $this->output->write($messages, $newline); $this->lastMessage = join($newline ? "\n" : '', (array) $messages);