]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-119553: Clear reader on Ctrl-C command (GH-119801)
authorLysandros Nikolaou <lisandrosnik@gmail.com>
Tue, 4 Jun 2024 17:46:33 +0000 (19:46 +0200)
committerGitHub <noreply@github.com>
Tue, 4 Jun 2024 17:46:33 +0000 (19:46 +0200)
Lib/_pyrepl/commands.py
Lib/test/test_pyrepl/support.py
Lib/test/test_pyrepl/test_reader.py

index 2ef5dada9d9e5886afc399b69440dd815bffa0aa..e94e8c25d379c155f35978902374f9cf175366ac 100644 (file)
@@ -221,6 +221,7 @@ class interrupt(FinishCommand):
 
 class ctrl_c(Command):
     def do(self) -> None:
+        self.reader.finish()
         raise KeyboardInterrupt
 
 
index e807b5f34045509d68a1572c32f80076dfad6128..70e12286f7d78154d6df8a2d127eaeeedd49a8f1 100644 (file)
@@ -75,6 +75,8 @@ def handle_all_events(
             reader.handle1()
     except StopIteration:
         pass
+    except KeyboardInterrupt:
+        pass
     return reader, console
 
 
index d02815bfa11d74d2bb759d19348cac7cd8e44457..079c963d19aad5bdb1237a8c5949b6035013a3ed 100644 (file)
@@ -179,6 +179,22 @@ class TestReader(TestCase):
         self.assert_screen_equals(reader, expected)
         self.assertTrue(reader.finished)
 
+    def test_keyboard_interrupt_clears_screen(self):
+        namespace = {"itertools": itertools}
+        code = "import itertools\nitertools."
+        events = itertools.chain(code_to_events(code), [
+            Event(evt='key', data='\t', raw=bytearray(b'\t')),  # Two tabs for completion
+            Event(evt='key', data='\t', raw=bytearray(b'\t')),
+            Event(evt='key', data='\x03', raw=bytearray(b'\x03')),  # Ctrl-C
+        ])
+
+        completing_reader = functools.partial(
+            prepare_reader,
+            readline_completer=rlcompleter.Completer(namespace).complete
+        )
+        reader, _ = handle_all_events(events, prepare_reader=completing_reader)
+        self.assertEqual(reader.calc_screen(), code.split("\n"))
+
     def test_prompt_length(self):
         # Handles simple ASCII prompt
         ps1 = ">>> "