summaryrefslogtreecommitdiffstats
path: root/Lib/_pyrepl
diff options
context:
space:
mode:
authorMatt Wozniski <mwozniski@bloomberg.net>2024-08-25 22:54:06 (GMT)
committerGitHub <noreply@github.com>2024-08-25 22:54:06 (GMT)
commit602fcf97df1665538d4e9841f9dc6bc33e38bece (patch)
treecc892e3ee534c2781c0ce5dbf97658d08175c9e6 /Lib/_pyrepl
parent70bfef52b5734d6cd81c5e8ca9eaf85658916b04 (diff)
downloadcpython-602fcf97df1665538d4e9841f9dc6bc33e38bece.zip
cpython-602fcf97df1665538d4e9841f9dc6bc33e38bece.tar.gz
cpython-602fcf97df1665538d4e9841f9dc6bc33e38bece.tar.bz2
gh-123177: Fix prompt for wrapped lines in pyrepl (#123324)
When display lines above the cursor come from the cache, the first line to not come from the cache may be a wrapped line, starting half way through a logical line in the buffer. Detect and handle this case to avoid accidentally drawing a stray prompt in the middle of a logical line.
Diffstat (limited to 'Lib/_pyrepl')
-rw-r--r--Lib/_pyrepl/reader.py10
1 files changed, 9 insertions, 1 deletions
diff --git a/Lib/_pyrepl/reader.py b/Lib/_pyrepl/reader.py
index 13b1f3e..aa3f5fd 100644
--- a/Lib/_pyrepl/reader.py
+++ b/Lib/_pyrepl/reader.py
@@ -345,7 +345,10 @@ class Reader:
pos = self.pos
pos -= offset
+ prompt_from_cache = (offset and self.buffer[offset - 1] != "\n")
+
lines = "".join(self.buffer[offset:]).split("\n")
+
cursor_found = False
lines_beyond_cursor = 0
for ln, line in enumerate(lines, num_common_lines):
@@ -359,7 +362,12 @@ class Reader:
# No need to keep formatting lines.
# The console can't show them.
break
- prompt = self.get_prompt(ln, ll >= pos >= 0)
+ if prompt_from_cache:
+ # Only the first line's prompt can come from the cache
+ prompt_from_cache = False
+ prompt = ""
+ else:
+ prompt = self.get_prompt(ln, ll >= pos >= 0)
while "\n" in prompt:
pre_prompt, _, prompt = prompt.partition("\n")
last_refresh_line_end_offsets.append(offset)