# So, we've only tested that the read did not fail.
# See TestHistoryManipulation for the full test.
+ def test_environment_is_not_modified(self):
+ # os.environ contains environment at the time "os" module was loaded, so
+ # before the "readline" module is loaded.
+ original_env = dict(os.environ)
+
+ # Force refresh of os.environ and make sure it is the same as before the
+ # refresh.
+ os.reload_environ()
+ self.assertEqual(dict(os.environ), original_env)
+
@unittest.skipUnless(hasattr(readline, "get_pre_input_hook"),
"get_pre_input_hook not available")
def test_get_pre_input_hook(self):
--- /dev/null
+Prevent :mod:`readline` from overriding the ``COLUMNS`` and ``LINES``
+environment variables, as values are not updated on terminal resize.
/* The name must be defined before initialization */
rl_readline_name = "python";
+#ifdef HAVE_RL_CHANGE_ENVIRONMENT
+ /* Prevent readline from setting the LINES and COLUMNS environment
+ * variables: ncurses prefers them over an ioctl() query, so a stale value
+ * left after a resize breaks SIGWINCH / KEY_RESIZE handling (gh-46927). */
+ rl_change_environment = 0;
+#endif
+
/* the libedit readline emulation resets key bindings etc
* when calling rl_initialize. So call it upfront
*/
printf "%s\n" "#define HAVE_RL_RESIZE_TERMINAL 1" >>confdefs.h
+fi
+
+ # rl_change_environment is in readline 6.3, but not in editline
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for rl_change_environment in -l$LIBREADLINE" >&5
+printf %s "checking for rl_change_environment in -l$LIBREADLINE... " >&6; }
+if test ${ac_cv_readline_rl_change_environment+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e)
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+ #include <stdio.h> /* Must be first for Gnu Readline */
+ #ifdef WITH_EDITLINE
+ # include <editline/readline.h>
+ #else
+ # include <readline/readline.h>
+ # include <readline/history.h>
+ #endif
+
+int
+main (void)
+{
+int x = rl_change_environment
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ ac_cv_readline_rl_change_environment=yes
+else case e in #(
+ e) ac_cv_readline_rl_change_environment=no
+ ;;
+esac
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+ ;;
+esac
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_readline_rl_change_environment" >&5
+printf "%s\n" "$ac_cv_readline_rl_change_environment" >&6; }
+ if test "x$ac_cv_readline_rl_change_environment" = xyes
+then :
+
+
+printf "%s\n" "#define HAVE_RL_CHANGE_ENVIRONMENT 1" >>confdefs.h
+
+
fi
# check for readline 4.2
AC_DEFINE([HAVE_RL_RESIZE_TERMINAL], [1], [Define if you have readline 4.0])
])
+ # rl_change_environment is in readline 6.3, but not in editline
+ AC_CACHE_CHECK([for rl_change_environment in -l$LIBREADLINE], [ac_cv_readline_rl_change_environment], [
+ AC_LINK_IFELSE(
+ [AC_LANG_PROGRAM([readline_includes], [int x = rl_change_environment])],
+ [ac_cv_readline_rl_change_environment=yes], [ac_cv_readline_rl_change_environment=no]
+ )
+ ])
+ AS_VAR_IF([ac_cv_readline_rl_change_environment], [yes], [
+ AC_DEFINE([HAVE_RL_CHANGE_ENVIRONMENT], [1], [Define if you have readline 6.3])
+ ])
+
# check for readline 4.2
AC_CACHE_CHECK([for rl_completion_matches in -l$LIBREADLINE], [ac_cv_readline_rl_completion_matches], [
AC_LINK_IFELSE(
/* Define if you can turn off readline's signal handling. */
#undef HAVE_RL_CATCH_SIGNAL
+/* Define if you have readline 6.3 */
+#undef HAVE_RL_CHANGE_ENVIRONMENT
+
/* Define to 1 if the system has the type 'rl_compdisp_func_t'. */
#undef HAVE_RL_COMPDISP_FUNC_T