]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
[3.14] gh-138568: Make `help` mode in PyREPL not exit on empty line input (GH-143512...
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>
Wed, 7 Jan 2026 16:06:53 +0000 (17:06 +0100)
committerGitHub <noreply@github.com>
Wed, 7 Jan 2026 16:06:53 +0000 (17:06 +0100)
(cherry picked from commit b3e4a3462f6011cacdfc58c565c69e4d7de6b9cd)

Signed-off-by: yihong0618 <zouzou0208@gmail.com>
Co-authored-by: Ɓukasz Langa <lukasz@langa.pl>
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 abd3be8b65a63d3e7625df9da1186e48cff363ca..1f8a6ef3d7c998fdcf4fc2921ff41be4a59ad078 100644 (file)
@@ -2072,10 +2072,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 34629fdc546db95ad57d1545b819254e0427fe0f..8ea7f267e693e8650447281e76ebbc0b04fb6d17 100644 (file)
@@ -2188,10 +2188,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.