]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
[3.13] gh-138568: Make `help` mode in PyREPL not exit on empty line input (GH-143512...
authorŁukasz Langa <lukasz@langa.pl>
Wed, 7 Jan 2026 17:44:39 +0000 (18:44 +0100)
committerGitHub <noreply@github.com>
Wed, 7 Jan 2026 17:44:39 +0000 (18:44 +0100)
(cherry picked from commit b3e4a3462f6011cacdfc58c565c69e4d7de6b9cd)

Signed-off-by: yihong0618 <zouzou0208@gmail.com>
Co-authored-by: yihong0618 <zouzou0208@gmail.com>
Lib/pydoc.py
Lib/test/test_pydoc/test_pydoc.py
Misc/NEWS.d/next/Core and Builtins/2025-09-06-08-29-08.gh-issue-138568.iZlalC.rst [new file with mode: 0644]

index 6c84093ce8261a7ac5d0a568f6f3d29726fc5918..d5b56f7ee08739e712b5c867bbe8d751ad21ce1f 100755 (executable)
@@ -2028,10 +2028,11 @@ has the same effect as typing a particular string at the help> prompt.
         while True:
             try:
                 request = self.getline('help> ')
-                if not request: break
             except (KeyboardInterrupt, EOFError):
                 break
             request = request.strip()
+            if not request:
+                continue  # back to the prompt
 
             # Make sure significant trailing quoting marks of literals don't
             # get deleted while cleaning input
index 16512065a6f1168a12bcc7b8a18aabbca2889211..581d2d15eb7f9afac317ee33fa0d50cce3c589a0 100644 (file)
@@ -2175,10 +2175,47 @@ class PydocUrlHandlerTest(PydocBaseTest):
 
 
 class TestHelper(unittest.TestCase):
+    def mock_interactive_session(self, inputs):
+        """
+        Given a list of inputs, run an interactive help session.  Returns a string
+        of what would be shown on screen.
+        """
+        input_iter = iter(inputs)
+
+        def mock_getline(prompt):
+            output.write(prompt)
+            next_input = next(input_iter)
+            output.write(next_input + os.linesep)
+            return next_input
+
+        with captured_stdout() as output:
+            helper = pydoc.Helper(output=output)
+            with unittest.mock.patch.object(helper, "getline", mock_getline):
+                helper.interact()
+
+        # handle different line endings across platforms consistently
+        return output.getvalue().strip().splitlines(keepends=False)
+
     def test_keywords(self):
         self.assertEqual(sorted(pydoc.Helper.keywords),
                          sorted(keyword.kwlist))
 
+    def test_interact_empty_line_continues(self):
+        # gh-138568: test pressing Enter without input should continue in help session
+        self.assertEqual(
+            self.mock_interactive_session(["", "    ", "quit"]),
+            ["help> ", "help>     ", "help> quit"],
+        )
+
+    def test_interact_quit_commands_exit(self):
+        quit_commands = ["quit", "q", "exit"]
+        for quit_cmd in quit_commands:
+            with self.subTest(quit_command=quit_cmd):
+                self.assertEqual(
+                    self.mock_interactive_session([quit_cmd]),
+                    [f"help> {quit_cmd}"],
+                )
+
 
 class PydocWithMetaClasses(unittest.TestCase):
     def tearDown(self):
diff --git a/Misc/NEWS.d/next/Core and Builtins/2025-09-06-08-29-08.gh-issue-138568.iZlalC.rst b/Misc/NEWS.d/next/Core and Builtins/2025-09-06-08-29-08.gh-issue-138568.iZlalC.rst
new file mode 100644 (file)
index 0000000..8a91631
--- /dev/null
@@ -0,0 +1,2 @@
+Adjusted the built-in :func:`help` function so that empty inputs are ignored in
+interactive mode.