2010-04-08 08:03:04 +04:00
|
|
|
<?php
|
|
|
|
|
2010-08-23 10:21:41 +04:00
|
|
|
namespace Symfony\Component\Console\Output;
|
2010-04-08 08:03:04 +04:00
|
|
|
|
|
|
|
/*
|
2010-10-30 15:24:50 +04:00
|
|
|
* This file is part of the Symfony framework.
|
2010-04-08 08:03:04 +04:00
|
|
|
*
|
|
|
|
* (c) Fabien Potencier <fabien.potencier@symfony-project.com>
|
|
|
|
*
|
|
|
|
* This source file is subject to the MIT license that is bundled
|
|
|
|
* with this source code in the file LICENSE.
|
|
|
|
*/
|
|
|
|
|
|
|
|
/**
|
|
|
|
* StreamOutput writes the output to a given stream.
|
|
|
|
*
|
|
|
|
* Usage:
|
|
|
|
*
|
|
|
|
* $output = new StreamOutput(fopen('php://stdout', 'w'));
|
|
|
|
*
|
|
|
|
* As `StreamOutput` can use any stream, you can also use a file:
|
|
|
|
*
|
|
|
|
* $output = new StreamOutput(fopen('/path/to/output.log', 'a', false));
|
|
|
|
*
|
2010-10-30 15:24:50 +04:00
|
|
|
* @author Fabien Potencier <fabien.potencier@symfony-project.com>
|
2010-04-08 08:03:04 +04:00
|
|
|
*/
|
|
|
|
class StreamOutput extends Output
|
|
|
|
{
|
2010-10-30 15:24:50 +04:00
|
|
|
protected $stream;
|
2010-04-08 08:03:04 +04:00
|
|
|
|
2010-10-30 15:24:50 +04:00
|
|
|
/**
|
|
|
|
* Constructor.
|
|
|
|
*
|
|
|
|
* @param mixed $stream A stream resource
|
|
|
|
* @param integer $verbosity The verbosity level (self::VERBOSITY_QUIET, self::VERBOSITY_NORMAL, self::VERBOSITY_VERBOSE)
|
|
|
|
* @param Boolean $decorated Whether to decorate messages or not (null for auto-guessing)
|
|
|
|
*
|
|
|
|
* @throws \InvalidArgumentException When first argument is not a real stream
|
|
|
|
*/
|
|
|
|
public function __construct($stream, $verbosity = self::VERBOSITY_NORMAL, $decorated = null)
|
2010-04-08 08:03:04 +04:00
|
|
|
{
|
2010-10-30 15:24:50 +04:00
|
|
|
if (!is_resource($stream) || 'stream' !== get_resource_type($stream)) {
|
|
|
|
throw new \InvalidArgumentException('The StreamOutput class needs a stream as its first argument.');
|
|
|
|
}
|
2010-04-08 08:03:04 +04:00
|
|
|
|
2010-10-30 15:24:50 +04:00
|
|
|
$this->stream = $stream;
|
2010-04-08 08:03:04 +04:00
|
|
|
|
2010-10-30 15:24:50 +04:00
|
|
|
if (null === $decorated) {
|
|
|
|
$decorated = $this->hasColorSupport($decorated);
|
|
|
|
}
|
2010-04-08 08:03:04 +04:00
|
|
|
|
2010-10-30 15:24:50 +04:00
|
|
|
parent::__construct($verbosity, $decorated);
|
|
|
|
}
|
2010-04-08 08:03:04 +04:00
|
|
|
|
2010-10-30 15:24:50 +04:00
|
|
|
/**
|
|
|
|
* Gets the stream attached to this StreamOutput instance.
|
|
|
|
*
|
|
|
|
* @return resource A stream resource
|
|
|
|
*/
|
|
|
|
public function getStream()
|
2010-04-08 08:03:04 +04:00
|
|
|
{
|
2010-10-30 15:24:50 +04:00
|
|
|
return $this->stream;
|
2010-04-08 08:03:04 +04:00
|
|
|
}
|
|
|
|
|
2010-10-30 15:24:50 +04:00
|
|
|
/**
|
|
|
|
* Writes a message to the output.
|
|
|
|
*
|
|
|
|
* @param string $message A message to write to the output
|
|
|
|
* @param Boolean $newline Whether to add a newline or not
|
|
|
|
*
|
|
|
|
* @throws \RuntimeException When unable to write output (should never happen)
|
|
|
|
*/
|
|
|
|
public function doWrite($message, $newline)
|
2010-04-08 08:03:04 +04:00
|
|
|
{
|
2010-10-30 15:24:50 +04:00
|
|
|
if (false === @fwrite($this->stream, $message.($newline ? PHP_EOL : ''))) {
|
|
|
|
// @codeCoverageIgnoreStart
|
|
|
|
// should never happen
|
|
|
|
throw new \RuntimeException('Unable to write output.');
|
|
|
|
// @codeCoverageIgnoreEnd
|
|
|
|
}
|
|
|
|
|
|
|
|
flush();
|
2010-04-08 08:03:04 +04:00
|
|
|
}
|
2010-10-30 15:24:50 +04:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Returns true if the stream supports colorization.
|
|
|
|
*
|
|
|
|
* Colorization is disabled if not supported by the stream:
|
|
|
|
*
|
|
|
|
* - windows without ansicon
|
|
|
|
* - non tty consoles
|
|
|
|
*
|
|
|
|
* @return Boolean true if the stream supports colorization, false otherwise
|
|
|
|
*/
|
|
|
|
protected function hasColorSupport()
|
2010-04-08 08:03:04 +04:00
|
|
|
{
|
2010-10-30 15:24:50 +04:00
|
|
|
// @codeCoverageIgnoreStart
|
|
|
|
if (DIRECTORY_SEPARATOR == '\\') {
|
|
|
|
return false !== getenv('ANSICON');
|
|
|
|
} else {
|
|
|
|
return function_exists('posix_isatty') && @posix_isatty($this->stream);
|
|
|
|
}
|
|
|
|
// @codeCoverageIgnoreEnd
|
2010-04-08 08:03:04 +04:00
|
|
|
}
|
|
|
|
}
|