[Python-checkins] cpython (3.4): Issue #19884: readline: Disable the meta modifier key if stdout is not a

victor.stinner python-checkins at python.org
Thu Jul 24 12:25:04 CEST 2014


http://hg.python.org/cpython/rev/6303266beb80
changeset:   91825:6303266beb80
branch:      3.4
parent:      91822:9cc55d7ef922
user:        Victor Stinner <victor.stinner at gmail.com>
date:        Thu Jul 24 12:23:56 2014 +0200
summary:
  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.

files:
  Lib/test/test_readline.py |  23 ++++++++++++++++++-----
  Misc/NEWS                 |   5 +++++
  Modules/readline.c        |  11 +++++++++++
  3 files changed, 34 insertions(+), 5 deletions(-)


diff --git a/Lib/test/test_readline.py b/Lib/test/test_readline.py
--- a/Lib/test/test_readline.py
+++ b/Lib/test/test_readline.py
@@ -1,17 +1,20 @@
 """
 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
 from test.support import run_unittest, import_module
+from test.script_helper import assert_python_ok
 
 # Skip tests if there is no readline module
 readline = import_module('readline')
 
 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'),
                      "The history update test cannot be run because the "
@@ -40,8 +43,18 @@
         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():
-    run_unittest(TestHistoryManipulation)
+    run_unittest(TestHistoryManipulation, TestReadline)
 
 if __name__ == "__main__":
     test_main()
diff --git a/Misc/NEWS b/Misc/NEWS
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -27,6 +27,11 @@
 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
   specified.
 
diff --git a/Modules/readline.c b/Modules/readline.c
--- a/Modules/readline.c
+++ b/Modules/readline.c
@@ -1019,6 +1019,17 @@
 
     mod_state->begidx = 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)
      *
      * XXX: A bug in the readline-2.2 library causes a memory leak

-- 
Repository URL: http://hg.python.org/cpython


More information about the Python-checkins mailing list