Skip to content
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

[Console] Reset question validator attempts only for actual stdin (bis) #37286

Merged
merged 1 commit into from Jun 15, 2020
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
14 changes: 8 additions & 6 deletions src/Symfony/Component/Console/Helper/QuestionHelper.php
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

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

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