Issue #19884: readline: Disable the meta modifier key if stdout is not a

terminal to not write the ANSI sequence "\033[1034h" into stdout. This sequence
is used on some terminal (ex: TERM=xterm-256color") to enable support of 8 bit
characters.
This commit is contained in:
Victor Stinner 2014-07-24 12:23:56 +02:00
parent cdb2c601db
commit a3c80ce8b7
3 changed files with 34 additions and 5 deletions

View File

@ -1,17 +1,20 @@
""" """
Very minimal unittests for parts of the readline module. Very minimal unittests for parts of the readline module.
These tests were added to check that the libedit emulation on OSX and
the "real" readline have the same interface for history manipulation. That's
why the tests cover only a small subset of the interface.
""" """
import os
import unittest import unittest
from test.support import run_unittest, import_module from test.support import run_unittest, import_module
from test.script_helper import assert_python_ok
# Skip tests if there is no readline module # Skip tests if there is no readline module
readline = import_module('readline') readline = import_module('readline')
class TestHistoryManipulation (unittest.TestCase): class TestHistoryManipulation (unittest.TestCase):
"""
These tests were added to check that the libedit emulation on OSX and the
"real" readline have the same interface for history manipulation. That's
why the tests cover only a small subset of the interface.
"""
@unittest.skipIf(not hasattr(readline, 'clear_history'), @unittest.skipIf(not hasattr(readline, 'clear_history'),
"The history update test cannot be run because the " "The history update test cannot be run because the "
@ -40,8 +43,18 @@ class TestHistoryManipulation (unittest.TestCase):
self.assertEqual(readline.get_current_history_length(), 1) self.assertEqual(readline.get_current_history_length(), 1)
class TestReadline(unittest.TestCase):
def test_init(self):
# Issue #19884: Ensure that the ANSI sequence "\033[1034h" is not
# written into stdout when the readline module is imported and stdout
# is redirected to a pipe.
rc, stdout, stderr = assert_python_ok('-c', 'import readline',
TERM='xterm-256color')
self.assertEqual(stdout, b'')
def test_main(): def test_main():
run_unittest(TestHistoryManipulation) run_unittest(TestHistoryManipulation, TestReadline)
if __name__ == "__main__": if __name__ == "__main__":
test_main() test_main()

View File

@ -27,6 +27,11 @@ Core and Builtins
Library Library
------- -------
- Issue #19884: readline: Disable the meta modifier key if stdout is not
a terminal to not write the ANSI sequence "\033[1034h" into stdout. This
sequence is used on some terminal (ex: TERM=xterm-256color") to enable
support of 8 bit characters.
- Issue #21888: plistlib's load() and loads() now work if the fmt parameter is - Issue #21888: plistlib's load() and loads() now work if the fmt parameter is
specified. specified.

View File

@ -1019,6 +1019,17 @@ setup_readline(readlinestate *mod_state)
mod_state->begidx = PyLong_FromLong(0L); mod_state->begidx = PyLong_FromLong(0L);
mod_state->endidx = PyLong_FromLong(0L); mod_state->endidx = PyLong_FromLong(0L);
if (!isatty(STDOUT_FILENO)) {
/* Issue #19884: stdout is no a terminal. Disable meta modifier
keys to not write the ANSI sequence "\033[1034h" into stdout. On
terminals supporting 8 bit characters like TERM=xterm-256color
(which is now the default Fedora since Fedora 18), the meta key is
used to enable support of 8 bit characters (ANSI sequence
"\033[1034h"). */
rl_variable_bind ("enable-meta-key", "off");
}
/* Initialize (allows .inputrc to override) /* Initialize (allows .inputrc to override)
* *
* XXX: A bug in the readline-2.2 library causes a memory leak * XXX: A bug in the readline-2.2 library causes a memory leak