Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

gh-125600: Only show stale code warning on source code display commands #125601

Merged
merged 8 commits into from
Oct 18, 2024
Merged
Show file tree
Hide file tree
Changes from 6 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 20 additions & 4 deletions Lib/pdb.py
Original file line number Diff line number Diff line change
Expand Up @@ -401,6 +401,8 @@ def setup(self, f, tb):
self.curframe = self.stack[self.curindex][0]
self.set_convenience_variable(self.curframe, '_frame', self.curframe)

self._save_initial_file_mtime(self.curframe)

if self._chained_exceptions:
self.set_convenience_variable(
self.curframe,
Expand Down Expand Up @@ -493,9 +495,21 @@ def _cmdloop(self):
except KeyboardInterrupt:
self.message('--KeyboardInterrupt--')

def _save_initial_file_mtime(self, frame):
"""save the mtile of the all the files in the frame stack in the file mtime table
gaogaotiantian marked this conversation as resolved.
Show resolved Hide resolved
if it hasn't been saved yet."""
while frame:
filename = frame.f_code.co_filename
if filename not in self._file_mtime_table:
iritkatriel marked this conversation as resolved.
Show resolved Hide resolved
try:
self._file_mtime_table[filename] = os.path.getmtime(filename)
except Exception:
pass
frame = frame.f_back

def _validate_file_mtime(self):
"""Check if the source file of the current frame has been modified since
the last time we saw it. If so, give a warning."""
"""Check if the source file of the current frame has been modified.
If so, give a warning and reset the modify time to current."""
try:
filename = self.curframe.f_code.co_filename
mtime = os.path.getmtime(filename)
Expand All @@ -505,7 +519,7 @@ def _validate_file_mtime(self):
mtime != self._file_mtime_table[filename]):
self.message(f"*** WARNING: file '{filename}' was edited, "
"running stale code until the program is rerun")
self._file_mtime_table[filename] = mtime
self._file_mtime_table[filename] = mtime

# Called before loop, handles display expressions
# Set up convenience variable containers
Expand Down Expand Up @@ -835,7 +849,6 @@ def onecmd(self, line):
a breakpoint command list definition.
"""
if not self.commands_defining:
self._validate_file_mtime()
if line.startswith('_pdbcmd'):
command, arg, line = self.parseline(line)
if hasattr(self, command):
Expand Down Expand Up @@ -979,6 +992,7 @@ def completedefault(self, text, line, begidx, endidx):

def _pdbcmd_print_frame_status(self, arg):
self.print_stack_trace(0)
self._validate_file_mtime()
self._show_display()

def _pdbcmd_silence_frame_status(self, arg):
Expand Down Expand Up @@ -1860,6 +1874,7 @@ def do_list(self, arg):
self.message('[EOF]')
except KeyboardInterrupt:
pass
self._validate_file_mtime()
do_l = do_list

def do_longlist(self, arg):
Expand All @@ -1878,6 +1893,7 @@ def do_longlist(self, arg):
self.error(err)
return
self._print_lines(lines, lineno, breaklist, self.curframe)
self._validate_file_mtime()
do_ll = do_longlist

def do_source(self, arg):
Expand Down
19 changes: 19 additions & 0 deletions Lib/test/test_pdb.py
Original file line number Diff line number Diff line change
Expand Up @@ -3662,6 +3662,25 @@ def test_file_modified_after_execution(self):
self.assertIn("WARNING:", stdout)
self.assertIn("was edited", stdout)

def test_file_modified_and_immediately_restarted(self):
script = """
print("hello")
"""

# the time.sleep is needed for low-resolution filesystems like HFS+
commands = """
filename = $_frame.f_code.co_filename
f = open(filename, "w")
f.write("print('goodbye')")
import time; time.sleep(1)
f.close()
restart
"""

stdout, stderr = self.run_pdb_script(script, commands)
self.assertNotIn("WARNING:", stdout)
self.assertNotIn("was edited", stdout)

def test_file_modified_after_execution_with_multiple_instances(self):
# the time.sleep is needed for low-resolution filesystems like HFS+
script = """
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Only show stale code warning in :mod:`pdb` when we display source code.
Loading