-
-
Notifications
You must be signed in to change notification settings - Fork 9.6k
Use new PHP7.2 functions in hasColorSupport #26910
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -58,7 +58,7 @@ public function __construct($output = null, $charset = null) | |
{ | ||
parent::__construct($output, $charset); | ||
|
||
if ('\\' === DIRECTORY_SEPARATOR && 'ON' !== @getenv('ConEmuANSI') && 'xterm' !== @getenv('TERM')) { | ||
if ('\\' === DIRECTORY_SEPARATOR && !$this->isWindowsTrueColor()) { | ||
// Use only the base 16 xterm colors when using ANSICON or standard Windows 10 CLI | ||
$this->setStyles(array( | ||
'default' => '31', | ||
|
@@ -420,7 +420,7 @@ protected function style($style, $value, $attr = array()) | |
protected function supportsColors() | ||
{ | ||
if ($this->outputStream !== static::$defaultOutput) { | ||
return @(is_resource($this->outputStream) && function_exists('posix_isatty') && posix_isatty($this->outputStream)); | ||
return $this->hasColorSupport($this->outputStream); | ||
} | ||
if (null !== static::$defaultColors) { | ||
return static::$defaultColors; | ||
|
@@ -448,23 +448,10 @@ protected function supportsColors() | |
} | ||
} | ||
|
||
if ('\\' === DIRECTORY_SEPARATOR) { | ||
static::$defaultColors = @( | ||
function_exists('sapi_windows_vt100_support') && sapi_windows_vt100_support($this->outputStream) | ||
|| '10.0.10586' === PHP_WINDOWS_VERSION_MAJOR.'.'.PHP_WINDOWS_VERSION_MINOR.'.'.PHP_WINDOWS_VERSION_BUILD | ||
|| false !== getenv('ANSICON') | ||
|| 'ON' === getenv('ConEmuANSI') | ||
|| 'xterm' === getenv('TERM') | ||
); | ||
} elseif (function_exists('posix_isatty')) { | ||
$h = stream_get_meta_data($this->outputStream) + array('wrapper_type' => null); | ||
$h = 'Output' === $h['stream_type'] && 'PHP' === $h['wrapper_type'] ? fopen('php://stdout', 'wb') : $this->outputStream; | ||
static::$defaultColors = @posix_isatty($h); | ||
} else { | ||
static::$defaultColors = false; | ||
} | ||
$h = stream_get_meta_data($this->outputStream) + array('wrapper_type' => null); | ||
$h = 'Output' === $h['stream_type'] && 'PHP' === $h['wrapper_type'] ? fopen('php://stdout', 'wb') : $this->outputStream; | ||
|
||
return static::$defaultColors; | ||
return static::$defaultColors = $this->hasColorSupport($h); | ||
} | ||
|
||
/** | ||
|
@@ -477,4 +464,69 @@ protected function dumpLine($depth, $endOfValue = false) | |
} | ||
parent::dumpLine($depth); | ||
} | ||
|
||
/** | ||
* Returns true if the stream supports colorization. | ||
* | ||
* Reference: Composer\XdebugHandler\Process::supportsColor | ||
* https://github.com/composer/xdebug-handler | ||
* | ||
* @param mixed $stream A CLI output stream | ||
* | ||
* @return bool | ||
*/ | ||
private function hasColorSupport($stream) | ||
{ | ||
if (!is_resource($stream) || 'stream' !== get_resource_type($stream)) { | ||
return false; | ||
} | ||
|
||
if (DIRECTORY_SEPARATOR === '\\') { | ||
return (function_exists('sapi_windows_vt100_support') | ||
&& @sapi_windows_vt100_support($stream)) | ||
|| false !== getenv('ANSICON') | ||
|| 'ON' === getenv('ConEmuANSI') | ||
|| 'xterm' === getenv('TERM'); | ||
} | ||
|
||
if (function_exists('stream_isatty')) { | ||
return @stream_isatty($stream); | ||
} | ||
|
||
if (function_exists('posix_isatty')) { | ||
return @posix_isatty($stream); | ||
} | ||
|
||
$stat = @fstat($stream); | ||
// Check if formatted mode is S_IFCHR | ||
return $stat ? 0020000 === ($stat['mode'] & 0170000) : false; | ||
} | ||
|
||
/** | ||
* Returns true if the Windows terminal supports true color. | ||
* | ||
* Note that this does not check an output stream, but relies on environment | ||
* variables from known implementations, or a PHP and Windows version that | ||
* supports true color. | ||
* | ||
* @return bool | ||
*/ | ||
private function isWindowsTrueColor() | ||
{ | ||
$result = strval(getenv('ANSICON_VER')) >= '183' | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. thanks to PHP type juggling, this should be simplified to There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Ah yes, that is a much better way of doing it. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. fixed in 9234171 |
||
|| 'ON' === getenv('ConEmuANSI') | ||
|| 'xterm' === getenv('TERM'); | ||
|
||
if (!$result && PHP_VERSION_ID >= 70200) { | ||
$version = sprintf( | ||
'%s.%s.%s', | ||
PHP_WINDOWS_VERSION_MAJOR, | ||
PHP_WINDOWS_VERSION_MINOR, | ||
PHP_WINDOWS_VERSION_BUILD | ||
); | ||
$result = $version >= '10.0.15063'; | ||
} | ||
|
||
return $result; | ||
} | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
this annotation should be removed and replaced by a return-type on the hasColorsSupport (same in other files below)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
?? Sorry, you've lost me!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Oups sorry, branch 2.7 doesn't support scalar type hints.