[Console] Fix STDERR output text on IBM iSeries OS400

This commit is contained in:
John Kary 2015-06-21 18:29:54 -05:00 committed by Fabien Potencier
parent 25a50f5b55
commit 23c42ca333

View File

@ -30,6 +30,9 @@ use Symfony\Component\Console\Formatter\OutputFormatterInterface;
*/ */
class ConsoleOutput extends StreamOutput implements ConsoleOutputInterface class ConsoleOutput extends StreamOutput implements ConsoleOutputInterface
{ {
/**
* @var StreamOutput
*/
private $stderr; private $stderr;
/** /**
@ -43,14 +46,12 @@ class ConsoleOutput extends StreamOutput implements ConsoleOutputInterface
*/ */
public function __construct($verbosity = self::VERBOSITY_NORMAL, $decorated = null, OutputFormatterInterface $formatter = null) public function __construct($verbosity = self::VERBOSITY_NORMAL, $decorated = null, OutputFormatterInterface $formatter = null)
{ {
$outputStream = 'php://stdout'; $outputStream = $this->hasStdoutSupport() ? 'php://stdout' : 'php://output';
if (!$this->hasStdoutSupport()) { $errorStream = $this->hasStderrSupport() ? 'php://stderr' : 'php://output';
$outputStream = 'php://output';
}
parent::__construct(fopen($outputStream, 'w'), $verbosity, $decorated, $formatter); parent::__construct(fopen($outputStream, 'w'), $verbosity, $decorated, $formatter);
$this->stderr = new StreamOutput(fopen('php://stderr', 'w'), $verbosity, $decorated, $this->getFormatter()); $this->stderr = new StreamOutput(fopen($errorStream, 'w'), $verbosity, $decorated, $this->getFormatter());
} }
/** /**
@ -100,14 +101,32 @@ class ConsoleOutput extends StreamOutput implements ConsoleOutputInterface
* Returns true if current environment supports writing console output to * Returns true if current environment supports writing console output to
* STDOUT. * STDOUT.
* *
* IBM iSeries (OS400) exhibits character-encoding issues when writing to
* STDOUT and doesn't properly convert ASCII to EBCDIC, resulting in garbage
* output.
*
* @return bool * @return bool
*/ */
protected function hasStdoutSupport() protected function hasStdoutSupport()
{ {
return ('OS400' != php_uname('s')); return false === $this->isRunningOS400();
}
/**
* Returns true if current environment supports writing console output to
* STDERR.
*
* @return bool
*/
protected function hasStderrSupport()
{
return false === $this->isRunningOS400();
}
/**
* Checks if current executing environment is IBM iSeries (OS400), which
* doesn't properly convert character-encodings between ASCII to EBCDIC.
*
* @return bool
*/
private function isRunningOS400()
{
return 'OS400' === php_uname('s');
} }
} }