Thanks to visit codestin.com
Credit goes to github.com

Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
[Console] Reset question validator attempts only for actual stdin (bis)
  • Loading branch information
nicolas-grekas committed Jun 15, 2020
commit 867642e337284766d566fc2ef5750a7a62cda96b
14 changes: 8 additions & 6 deletions src/Symfony/Component/Console/Helper/QuestionHelper.php
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,7 @@ private function doAsk(OutputInterface $output, Question $question)
{
$this->writePrompt($output, $question);

$inputStream = $this->inputStream ?: STDIN;
$inputStream = $this->inputStream ?: fopen('php://stdin', 'r');
$autocomplete = $question->getAutocompleterCallback();

if (null === $autocomplete || !self::$stty || !Terminal::hasSttyAvailable()) {
Expand Down Expand Up @@ -474,7 +474,7 @@ private function validateAttempts(callable $interviewer, OutputInterface $output
} catch (\Exception $error) {
}

$attempts = $attempts ?? -(int) $this->isTty();
$attempts = $attempts ?? -(int) $this->askForever();
}

throw $error;
Expand Down Expand Up @@ -507,18 +507,20 @@ private function getShell()
return self::$shell;
}

private function isTty(): bool
private function askForever(): bool
{
if (!\defined('STDIN')) {
$inputStream = $this->inputStream ?: fopen('php://stdin', 'r');

if ('php://stdin' !== (stream_get_meta_data($inputStream)['url'] ?? null)) {
Copy link
Member Author

@nicolas-grekas nicolas-grekas Jun 15, 2020

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

actually this is not needed to fix the failure, but making the behavior of this method global looks suspicious to me so here is a local check

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

note that this check works even if $inputStream === STDIN

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Are you sure with url here?

>>> stream_get_meta_data(STDIN)['url']
PHP Notice:  Undefined index: url in phar://eval()'d code on line 1
=> null
>>> stream_get_meta_data(STDIN)
=> [
     "timed_out" => false,
     "blocked" => true,
     "eof" => false,
     "wrapper_type" => "PHP",
     "stream_type" => "STDIO",
     "mode" => "rb",
     "unread_bytes" => 0,
     "seekable" => false,
     "uri" => "php://stdin",
   ]

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pretty much yes: https://3v4l.org/njZZV
What's your runtime?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That 3v4l snippet follows behaviour I observe on my PC, it looks to be uri, not url

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🀦

return true;
}

if (\function_exists('stream_isatty')) {
return stream_isatty(fopen('php://input', 'r'));
return stream_isatty($inputStream);
Copy link
Member Author

@nicolas-grekas nicolas-grekas Jun 15, 2020

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this was my mistake: using php://stdin here instead is enough to fix the failure

}

if (\function_exists('posix_isatty')) {
return posix_isatty(fopen('php://input', 'r'));
return posix_isatty($inputStream);
}

return true;
Expand Down