]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
[3.13] gh-121245: Refactor site.register_readline() (GH-121659) (GH-121816)
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>
Mon, 15 Jul 2024 20:49:18 +0000 (22:49 +0200)
committerGitHub <noreply@github.com>
Mon, 15 Jul 2024 20:49:18 +0000 (22:49 +0200)
(cherry picked from commit 05d413764c8ae793b8321c21cb10094c934b8cb3)

Co-authored-by: Sergey B Kirpichev <skirpichev@gmail.com>
Co-authored-by: Ɓukasz Langa <lukasz@langa.pl>
Lib/_pyrepl/main.py
Lib/site.py
Misc/NEWS.d/next/Library/2024-07-13-06-23-24.gh-issue-121245.RfOgf4.rst [new file with mode: 0644]

index 041a4009f42ed851c7d327cb7994b2a67b9cccec..946bf339220865bdbf9ccf4c0e636123560aff5b 100644 (file)
@@ -1,16 +1,32 @@
+import errno
 import os
 import sys
 
+
 CAN_USE_PYREPL: bool
-if sys.platform != "win32":
-    CAN_USE_PYREPL = True
+FAIL_REASON: str
+try:
+    if sys.platform == "win32" and sys.getwindowsversion().build < 10586:
+        raise RuntimeError("Windows 10 TH2 or later required")
+    if not os.isatty(sys.stdin.fileno()):
+        raise OSError(errno.ENOTTY, "tty required", "stdin")
+    from .simple_interact import check
+    if err := check():
+        raise RuntimeError(err)
+except Exception as e:
+    CAN_USE_PYREPL = False
+    FAIL_REASON = f"warning: can't use pyrepl: {e}"
 else:
-    CAN_USE_PYREPL = sys.getwindowsversion().build >= 10586  # Windows 10 TH2
+    CAN_USE_PYREPL = True
+    FAIL_REASON = ""
 
 
 def interactive_console(mainmodule=None, quiet=False, pythonstartup=False):
-    global CAN_USE_PYREPL
     if not CAN_USE_PYREPL:
+        if not os.environ.get('PYTHON_BASIC_REPL', None) and FAIL_REASON:
+            from .trace import trace
+            trace(FAIL_REASON)
+            print(FAIL_REASON, file=sys.stderr)
         return sys._baserepl()
 
     if mainmodule:
@@ -20,6 +36,7 @@ def interactive_console(mainmodule=None, quiet=False, pythonstartup=False):
         namespace = __main__.__dict__
         namespace.pop("__pyrepl_interactive_console", None)
 
+    # sys._baserepl() above does this internally, we do it here
     startup_path = os.getenv("PYTHONSTARTUP")
     if pythonstartup and startup_path:
         import tokenize
@@ -34,22 +51,5 @@ def interactive_console(mainmodule=None, quiet=False, pythonstartup=False):
     if not hasattr(sys, "ps2"):
         sys.ps2 = "... "
 
-    run_interactive = None
-    try:
-        import errno
-        if not os.isatty(sys.stdin.fileno()):
-            raise OSError(errno.ENOTTY, "tty required", "stdin")
-        from .simple_interact import check
-        if err := check():
-            raise RuntimeError(err)
-        from .simple_interact import run_multiline_interactive_console
-        run_interactive = run_multiline_interactive_console
-    except Exception as e:
-        from .trace import trace
-        msg = f"warning: can't use pyrepl: {e}"
-        trace(msg)
-        print(msg, file=sys.stderr)
-        CAN_USE_PYREPL = False
-    if run_interactive is None:
-        return sys._baserepl()
-    run_interactive(namespace)
+    from .simple_interact import run_multiline_interactive_console
+    run_multiline_interactive_console(namespace)
index 650fa2b01835f91e6fb993212d0beb80ee732b1a..8e7a20de6f8aaeab6066254058f764971eb7e88c 100644 (file)
@@ -517,6 +517,10 @@ def register_readline():
         pass
 
     if readline.get_current_history_length() == 0:
+        try:
+            from _pyrepl.main import CAN_USE_PYREPL
+        except ImportError:
+            CAN_USE_PYREPL = False
         # If no history was loaded, default to .python_history,
         # or PYTHON_HISTORY.
         # The guard is necessary to avoid doubling history size at
@@ -524,25 +528,18 @@ def register_readline():
         # through a PYTHONSTARTUP hook, see:
         # http://bugs.python.org/issue5845#msg198636
         history = gethistoryfile()
+        if os.getenv("PYTHON_BASIC_REPL") or not CAN_USE_PYREPL:
+            readline_module = readline
+        else:
+            readline_module = _pyrepl.readline
         try:
-            if os.getenv("PYTHON_BASIC_REPL"):
-                readline.read_history_file(history)
-            else:
-                _pyrepl.readline.read_history_file(history)
+            readline_module.read_history_file(history)
         except (OSError,* _pyrepl.unix_console._error):
             pass
 
         def write_history():
             try:
-                from _pyrepl.main import CAN_USE_PYREPL
-            except ImportError:
-                CAN_USE_PYREPL = False
-
-            try:
-                if os.getenv("PYTHON_BASIC_REPL") or not CAN_USE_PYREPL:
-                    readline.write_history_file(history)
-                else:
-                    _pyrepl.readline.write_history_file(history)
+                readline_module.write_history_file(history)
             except (FileNotFoundError, PermissionError):
                 # home directory does not exist or is not writable
                 # https://bugs.python.org/issue19891
diff --git a/Misc/NEWS.d/next/Library/2024-07-13-06-23-24.gh-issue-121245.RfOgf4.rst b/Misc/NEWS.d/next/Library/2024-07-13-06-23-24.gh-issue-121245.RfOgf4.rst
new file mode 100644 (file)
index 0000000..1758f58
--- /dev/null
@@ -0,0 +1,3 @@
+Simplify handling of the history file in ``site.register_readline()``
+helper. The ``CAN_USE_PYREPL`` variable now will be initialized, when
+imported.  Patch by Sergey B Kirpichev.