2021-05-10 00:23:30 +00:00
< ? php
/*
* This file is part of the Symfony package .
*
* ( c ) Fabien Potencier < fabien @ symfony . com >
*
* For the full copyright and license information , please view the LICENSE
* file that was distributed with this source code .
*/
2021-08-06 06:45:08 +00:00
namespace RectorPrefix20210806\Symfony\Component\Console\Output ;
2021-05-10 00:23:30 +00:00
2021-08-06 06:45:08 +00:00
use RectorPrefix20210806\Symfony\Component\Console\Exception\InvalidArgumentException ;
use RectorPrefix20210806\Symfony\Component\Console\Formatter\OutputFormatterInterface ;
2021-05-10 00:23:30 +00:00
/**
* 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 ));
*
* @ author Fabien Potencier < fabien @ symfony . com >
*/
2021-08-06 06:45:08 +00:00
class StreamOutput extends \RectorPrefix20210806\Symfony\Component\Console\Output\Output
2021-05-10 00:23:30 +00:00
{
private $stream ;
/**
* @ param resource $stream A stream resource
* @ param int $verbosity The verbosity level ( one of the VERBOSITY constants in OutputInterface )
* @ param bool | null $decorated Whether to decorate messages ( null for auto - guessing )
* @ param OutputFormatterInterface | null $formatter Output formatter instance ( null to use default OutputFormatter )
*
* @ throws InvalidArgumentException When first argument is not a real stream
*/
2021-08-06 06:45:08 +00:00
public function __construct ( $stream , int $verbosity = self :: VERBOSITY_NORMAL , bool $decorated = null , \RectorPrefix20210806\Symfony\Component\Console\Formatter\OutputFormatterInterface $formatter = null )
2021-05-10 00:23:30 +00:00
{
if ( ! \is_resource ( $stream ) || 'stream' !== \get_resource_type ( $stream )) {
2021-08-06 06:45:08 +00:00
throw new \RectorPrefix20210806\Symfony\Component\Console\Exception\InvalidArgumentException ( 'The StreamOutput class needs a stream as its first argument.' );
2021-05-10 00:23:30 +00:00
}
$this -> stream = $stream ;
if ( null === $decorated ) {
$decorated = $this -> hasColorSupport ();
}
parent :: __construct ( $verbosity , $decorated , $formatter );
}
/**
* Gets the stream attached to this StreamOutput instance .
*
* @ return resource A stream resource
*/
public function getStream ()
{
return $this -> stream ;
}
/**
* { @ inheritdoc }
*/
2021-07-05 23:34:08 +00:00
protected function doWrite ( string $message , bool $newline )
2021-05-10 00:23:30 +00:00
{
if ( $newline ) {
$message .= \PHP_EOL ;
}
@ \fwrite ( $this -> stream , $message );
\fflush ( $this -> stream );
}
/**
* Returns true if the stream supports colorization .
*
* Colorization is disabled if not supported by the stream :
*
* This is tricky on Windows , because Cygwin , Msys2 etc emulate pseudo
* terminals via named pipes , so we can only check the environment .
*
* Reference : Composer\XdebugHandler\Process :: supportsColor
* https :// github . com / composer / xdebug - handler
*
* @ return bool true if the stream supports colorization , false otherwise
*/
protected function hasColorSupport ()
{
// Follow https://no-color.org/
if ( isset ( $_SERVER [ 'NO_COLOR' ]) || \false !== \getenv ( 'NO_COLOR' )) {
return \false ;
}
if ( 'Hyper' === \getenv ( 'TERM_PROGRAM' )) {
return \true ;
}
if ( \DIRECTORY_SEPARATOR === '\\' ) {
return \function_exists ( 'sapi_windows_vt100_support' ) && @ \sapi_windows_vt100_support ( $this -> stream ) || \false !== \getenv ( 'ANSICON' ) || 'ON' === \getenv ( 'ConEmuANSI' ) || 'xterm' === \getenv ( 'TERM' );
}
$streamIsatty = function ( $stream ) {
2021-05-18 22:27:49 +00:00
if ( \function_exists ( 'stream_isatty' )) {
2021-07-15 03:40:51 +00:00
return \stream_isatty ( $stream );
2021-05-18 22:27:49 +00:00
}
if ( ! \is_resource ( $stream )) {
\trigger_error ( 'stream_isatty() expects parameter 1 to be resource, ' . \gettype ( $stream ) . ' given' , \E_USER_WARNING );
return \false ;
}
2021-05-10 00:23:30 +00:00
if ( '\\' === \DIRECTORY_SEPARATOR ) {
$stat = @ \fstat ( $stream );
2021-05-18 22:27:49 +00:00
// Check if formatted mode is S_IFCHR
2021-05-10 00:23:30 +00:00
return $stat ? 020000 === ( $stat [ 'mode' ] & 0170000 ) : \false ;
}
2021-05-18 22:27:49 +00:00
return \function_exists ( 'posix_isatty' ) && @ \posix_isatty ( $stream );
2021-05-10 00:23:30 +00:00
};
return $streamIsatty ( $this -> stream );
}
}