Escape trailing \ in QuestionHelper autocompletion
Fixes symfony/symfony#24652 Trailing backslash, being unescaped, used to escape closing formatting tag and, thus, formatting tag appeared in autocompletion
This commit is contained in:
parent
0f9c6e6682
commit
0c0f1da67d
|
@ -11,6 +11,7 @@
|
||||||
|
|
||||||
namespace Symfony\Component\Console\Helper;
|
namespace Symfony\Component\Console\Helper;
|
||||||
|
|
||||||
|
use Symfony\Component\Console\Formatter\OutputFormatter;
|
||||||
use Symfony\Component\Console\Input\InputInterface;
|
use Symfony\Component\Console\Input\InputInterface;
|
||||||
use Symfony\Component\Console\Output\ConsoleOutputInterface;
|
use Symfony\Component\Console\Output\ConsoleOutputInterface;
|
||||||
use Symfony\Component\Console\Output\OutputInterface;
|
use Symfony\Component\Console\Output\OutputInterface;
|
||||||
|
@ -303,7 +304,7 @@ class QuestionHelper extends Helper
|
||||||
// Save cursor position
|
// Save cursor position
|
||||||
$output->write("\0337");
|
$output->write("\0337");
|
||||||
// Write highlighted text
|
// Write highlighted text
|
||||||
$output->write('<hl>'.substr($matches[$ofs], $i).'</hl>');
|
$output->write('<hl>'.OutputFormatter::escapeTrailingBackslash(substr($matches[$ofs], $i)).'</hl>');
|
||||||
// Restore cursor position
|
// Restore cursor position
|
||||||
$output->write("\0338");
|
$output->write("\0338");
|
||||||
}
|
}
|
||||||
|
|
|
@ -156,6 +156,46 @@ class QuestionHelperTest extends TestCase
|
||||||
$this->assertEquals('AsseticBundle', $dialog->ask($this->createInputInterfaceMock(), $this->createOutputInterface(), $question));
|
$this->assertEquals('AsseticBundle', $dialog->ask($this->createInputInterfaceMock(), $this->createOutputInterface(), $question));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function testAutocompleteWithTrailingBackslash()
|
||||||
|
{
|
||||||
|
if (!$this->hasSttyAvailable()) {
|
||||||
|
$this->markTestSkipped('`stty` is required to test autocomplete functionality');
|
||||||
|
}
|
||||||
|
|
||||||
|
$inputStream = $this->getInputStream('E');
|
||||||
|
|
||||||
|
$dialog = new QuestionHelper();
|
||||||
|
$dialog->setInputStream($inputStream);
|
||||||
|
$helperSet = new HelperSet(array(new FormatterHelper()));
|
||||||
|
$dialog->setHelperSet($helperSet);
|
||||||
|
|
||||||
|
$question = new Question('');
|
||||||
|
$expectedCompletion = 'ExampleNamespace\\';
|
||||||
|
$question->setAutocompleterValues(array($expectedCompletion));
|
||||||
|
|
||||||
|
$output = $this->createOutputInterface();
|
||||||
|
$dialog->ask($this->createInputInterfaceMock(), $output, $question);
|
||||||
|
|
||||||
|
$outputStream = $output->getStream();
|
||||||
|
rewind($outputStream);
|
||||||
|
$actualOutput = stream_get_contents($outputStream);
|
||||||
|
|
||||||
|
// Shell control (esc) sequences are not so important: we only care that
|
||||||
|
// <hl> tag is interpreted correctly and replaced
|
||||||
|
$irrelevantEscSequences = array(
|
||||||
|
"\0337" => '', // Save cursor position
|
||||||
|
"\0338" => '', // Restore cursor position
|
||||||
|
"\033[K" => '', // Clear line from cursor till the end
|
||||||
|
);
|
||||||
|
|
||||||
|
$importantActualOutput = strtr($actualOutput, $irrelevantEscSequences);
|
||||||
|
|
||||||
|
// Remove colors (e.g. "\033[30m", "\033[31;41m")
|
||||||
|
$importantActualOutput = preg_replace('/\033\[\d+(;\d+)?m/', '', $importantActualOutput);
|
||||||
|
|
||||||
|
$this->assertEquals($expectedCompletion, $importantActualOutput);
|
||||||
|
}
|
||||||
|
|
||||||
public function testAskHiddenResponse()
|
public function testAskHiddenResponse()
|
||||||
{
|
{
|
||||||
if ('\\' === DIRECTORY_SEPARATOR) {
|
if ('\\' === DIRECTORY_SEPARATOR) {
|
||||||
|
|
Reference in New Issue