Skip to contentSkip to conversation

python: fix importing readline with probably escape sequence output

PATCH Superseded Hongxu Jia 2 participants 3 messages Jul 18, 2013

v1 of 3 Superseded Latest is v3 →

lore
Share & tools
lore

Hongxu Jia

author
#0 lore raw

cover python: fix importing readline with probably escape sequence output

While imports readline in python, if TERM in terminfo is available and it contains the variable 'km' and 'smm', the readline initialization will output the value of 'smm' which is the escape sequence '\E[?1034h'.

'km' means the terminal has a meta key which is a special key on MIT keyboards, 'smm' means turn on the meta key if this terminal has one.

There are 4 solutions to fix this issue:

1) Preserving TERM and unsetting TERM, or setting TERM with a terminal without 'smm' (such as terminal 'dumb'). This is the most common approach. But the effect is global even we don't import readline.
https://bugzilla.redhat.com/show_bug.cgi?id=304181
http://bugs.python.org/issue11390
http://lists.gnu.org/archive/html/bug-readline/2013-06/msg00000.html

2) Modify readline.c in python, mandatory let readline use a term without 'smm' as terminal (such as 'dumb'), it is similar to the above solution, but it localizes the effect in readline. The reason why choose 'dumb' is GNU Readline library use 'dumb' as default term when TERM is unset.

3) Modify terminfo.src in ncurses, let terminfo database doesn't contian 'smm', but the number of terms we supported is limited.

4) Modify terminal.c and readline.c in GNU Readline library to explicitly disable meta key, or just comment out the outputting code.

This patch implements solution 2, I think it has the least side effect.

Thanks
Hongxu

The following changes since commit 3dee534f1e25109e0bdb681de0746c336f4b8840:

lib/oeqa: fix dependecy check (2013-07-16 10:04:17 +0100)

are available in the git repository at:

git://git.pokylinux.org/poky-contrib hongxu/fix-python-readlne
http://git.pokylinux.org/cgit.cgi/poky-contrib/log/?h=hongxu/fix-python-readlne

Hongxu Jia (1):
python: fix importing readline with probably escape sequence output

 meta/recipes-devtools/python/python.inc            |  4 ++-
 ...e-explicitly-use-dumb-as-default-terminal.patch | 35 ++++++++++++++++++++++
 2 files changed, 38 insertions(+), 1 deletion(-)
 create mode 100644 meta/recipes-devtools/python/python/readline-explicitly-use-dumb-as-default-terminal.patch
Signature · 1 line
1.8.1.2
author
#1 lore raw

PATCH 1/1 python: fix importing readline with probably escape sequence output

While imports readline in python, if the term in terminfo is available and it contains the variable 'km' and 'smm', the readline initialization will output the value of 'smm' which is the escape sequence '\E[?1034h'.

'km' means the terminal has a meta key which is a special key on MIT keyboards, 'smm' means turn on the meta key if this terminal has one. They don't exist in term 'dumb'.

Explicitly use dumb as default terminal to avoid probably escape sequence output. The dumb is used to label tty lines when you don't know what kind of terminal is on it. The characteristics of an unknown terminal are the lowest common denominator.

[YOCTO #4835]
[YOCTO #4732]

---
 meta/recipes-devtools/python/python.inc            |  4 ++-
 ...e-explicitly-use-dumb-as-default-terminal.patch | 35 ++++++++++++++++++++++
 2 files changed, 38 insertions(+), 1 deletion(-)
 create mode 100644 meta/recipes-devtools/python/python/readline-explicitly-use-dumb-as-default-terminal.patch
meta/recipes-devtools/python/python.inc +3 -1
index 80609a8..2fc894d 100644
@@ -7,7 +7,9 @@ INC_PR = "r0"
 
 LIC_FILES_CHKSUM = "file://LICENSE;md5=ed3abfd1059e2d3a36a8cff3986f9bb6"
 
-SRC_URI = "http://www.python.org/ftp/python/${PV}/Python-${PV}.tar.bz2"
+SRC_URI = "http://www.python.org/ftp/python/${PV}/Python-${PV}.tar.bz2 \
+           file://readline-explicitly-use-dumb-as-default-terminal.patch \
+"
  
 SRC_URI[md5sum] = "c57477edd6d18bd9eeca2f21add73919"
 SRC_URI[sha256sum] = "726457e11cb153adc3f428aaf1901fc561a374c30e5e7da6742c0742a338663c"
meta/recipes-devtools/python/python/readline-explicitly-use-dumb-as-default-terminal.patch new file +35 -0
new file mode 100644
index 0000000..11928d1
@@ -0,0 +1,35 @@
+readline: explicitly use dumb as default terminal
+
+Explicitly use dumb as default terminal to avoid probably
+escape sequence output. The dumb is used to label tty lines
+when you don't know what kind of terminal is on it. The
+characteristics of an unknown terminal are the lowest common
+denominator.
+
+Signed-off-by: Hongxu Jia <[email protected]>
+Upstream-Status: inappropriate [oe specific] 
+---
+ Modules/readline.c | 8 ++++++++
+ 1 file changed, 8 insertions(+)
+
+diff --git a/Modules/readline.c b/Modules/readline.c
+--- a/Modules/readline.c
++++ b/Modules/readline.c
+@@ -882,6 +882,14 @@ setup_readline(void)
+ #endif
+     /* Force rebind of TAB to insert-tab */
+     rl_bind_key('\t', rl_insert);
++
++    /* Explicitly use dumb as default terminal to avoid probably
++     * escape sequence output. The dumb is used to label tty lines
++     * when you don't know what kind of terminal is on it. The
++     * characteristics of an unknown terminal are the lowest common
++     * denominator.
++     */
++    rl_terminal_name = "dumb";
+     /* Bind both ESC-TAB and ESC-ESC to the completion function */
+     rl_bind_key_in_map ('\t', rl_complete, emacs_meta_keymap);
+     rl_bind_key_in_map ('\033', rl_complete, emacs_meta_keymap);
+-- 
+1.8.1.2
+
Signature · 1 line
1.8.1.2
#2 lore raw
Quoted 63 lines · Hongxu Jia

While imports readline in python, if the term in terminfo is available and it contains the variable 'km' and 'smm', the readline initialization will output the value of 'smm' which is the escape sequence '\E[?1034h'.

'km' means the terminal has a meta key which is a special key on MIT keyboards, 'smm' means turn on the meta key if this terminal has one. They don't exist in term 'dumb'.

Explicitly use dumb as default terminal to avoid probably escape sequence output. The dumb is used to label tty lines when you don't know what kind of terminal is on it. The characteristics of an unknown terminal are the lowest common denominator.

[YOCTO #4835]
[YOCTO #4732]

---
  meta/recipes-devtools/python/python.inc            |  4 ++-
  ...e-explicitly-use-dumb-as-default-terminal.patch | 35 ++++++++++++++++++++++
  2 files changed, 38 insertions(+), 1 deletion(-)

create mode 100644 meta/recipes-devtools/python/python/readline-explicitly-use-dumb-as-default-terminal.patch

meta/recipes-devtools/python/python.inc +3 -1
index 80609a8..2fc894d 100644
@@ -7,7 +7,9 @@ INC_PR = "r0"
 
  LIC_FILES_CHKSUM = "file://LICENSE;md5=ed3abfd1059e2d3a36a8cff3986f9bb6"
 
-SRC_URI = "http://www.python.org/ftp/python/${PV}/Python-${PV}.tar.bz2"
+SRC_URI = "http://www.python.org/ftp/python/${PV}/Python-${PV}.tar.bz2 \
+           file://readline-explicitly-use-dumb-as-default-terminal.patch \
+"
 
  SRC_URI[md5sum] = "c57477edd6d18bd9eeca2f21add73919"
  SRC_URI[sha256sum] = "726457e11cb153adc3f428aaf1901fc561a374c30e5e7da6742c0742a338663c"
meta/recipes-devtools/python/python/readline-explicitly-use-dumb-as-default-terminal.patch new file +19 -0
new file mode 100644
index 0000000..11928d1
@@ -0,0 +1,35 @@
+readline: explicitly use dumb as default terminal
+
+Explicitly use dumb as default terminal to avoid probably
+escape sequence output. The dumb is used to label tty lines
+when you don't know what kind of terminal is on it. The
+characteristics of an unknown terminal are the lowest common
+denominator.
+
+Signed-off-by: Hongxu Jia <[email protected]>
+Upstream-Status: inappropriate [oe specific]
+---
+ Modules/readline.c | 8 ++++++++
+ 1 file changed, 8 insertions(+)
+
+diff --git a/Modules/readline.c b/Modules/readline.c
+--- a/Modules/readline.c
++++ b/Modules/readline.c
+@@ -882,6 +882,14 @@ setup_readline(void)
+ #endif

meta/recipes-devtools/python/python/readline-explicitly-use-dumb-as-default-terminal.patch line 29

Quoted 10 lines
meta/recipes-devtools/python/python/readline-explicitly-use-dumb-as-default-terminal.patch new file +10 -0
+     /* Force rebind of TAB to insert-tab */
+     rl_bind_key('\t', rl_insert);
++
++    /* Explicitly use dumb as default terminal to avoid probably
++     * escape sequence output. The dumb is used to label tty lines
++     * when you don't know what kind of terminal is on it. The
++     * characteristics of an unknown terminal are the lowest common
++     * denominator.
++     */
++    rl_terminal_name = "dumb";

I don't think this will work, since it will force all terminal interactions that use python to be dumb, how will the bitbake knotty interface behave with dumb terminal.

Sau!

Quoted 7 lines
meta/recipes-devtools/python/python/readline-explicitly-use-dumb-as-default-terminal.patch new file +6 -0
+     /* Bind both ESC-TAB and ESC-ESC to the completion function */
+     rl_bind_key_in_map ('\t', rl_complete, emacs_meta_keymap);
+     rl_bind_key_in_map ('\033', rl_complete, emacs_meta_keymap);
+--
+1.8.1.2
+