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

This commit is contained in:
Tian Gao 2024-10-17 17:29:11 -07:00 committed by GitHub
parent 7cf2dbc3cb
commit 77cebb1ce9
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 40 additions and 4 deletions

View File

@ -402,6 +402,8 @@ def setup(self, f, tb):
self.curframe = self.stack[self.curindex][0] self.curframe = self.stack[self.curindex][0]
self.set_convenience_variable(self.curframe, '_frame', self.curframe) self.set_convenience_variable(self.curframe, '_frame', self.curframe)
self._save_initial_file_mtime(self.curframe)
if self._chained_exceptions: if self._chained_exceptions:
self.set_convenience_variable( self.set_convenience_variable(
self.curframe, self.curframe,
@ -494,9 +496,21 @@ def _cmdloop(self):
except KeyboardInterrupt: except KeyboardInterrupt:
self.message('--KeyboardInterrupt--') self.message('--KeyboardInterrupt--')
def _save_initial_file_mtime(self, frame):
"""save the mtime of the all the files in the frame stack in the file mtime table
if they haven't been saved yet."""
while frame:
filename = frame.f_code.co_filename
if filename not in self._file_mtime_table:
try:
self._file_mtime_table[filename] = os.path.getmtime(filename)
except Exception:
pass
frame = frame.f_back
def _validate_file_mtime(self): def _validate_file_mtime(self):
"""Check if the source file of the current frame has been modified since """Check if the source file of the current frame has been modified.
the last time we saw it. If so, give a warning.""" If so, give a warning and reset the modify time to current."""
try: try:
filename = self.curframe.f_code.co_filename filename = self.curframe.f_code.co_filename
mtime = os.path.getmtime(filename) mtime = os.path.getmtime(filename)
@ -506,7 +520,7 @@ def _validate_file_mtime(self):
mtime != self._file_mtime_table[filename]): mtime != self._file_mtime_table[filename]):
self.message(f"*** WARNING: file '{filename}' was edited, " self.message(f"*** WARNING: file '{filename}' was edited, "
"running stale code until the program is rerun") "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 # Called before loop, handles display expressions
# Set up convenience variable containers # Set up convenience variable containers
@ -836,7 +850,6 @@ def onecmd(self, line):
a breakpoint command list definition. a breakpoint command list definition.
""" """
if not self.commands_defining: if not self.commands_defining:
self._validate_file_mtime()
if line.startswith('_pdbcmd'): if line.startswith('_pdbcmd'):
command, arg, line = self.parseline(line) command, arg, line = self.parseline(line)
if hasattr(self, command): if hasattr(self, command):
@ -980,6 +993,7 @@ def completedefault(self, text, line, begidx, endidx):
def _pdbcmd_print_frame_status(self, arg): def _pdbcmd_print_frame_status(self, arg):
self.print_stack_trace(0) self.print_stack_trace(0)
self._validate_file_mtime()
self._show_display() self._show_display()
def _pdbcmd_silence_frame_status(self, arg): def _pdbcmd_silence_frame_status(self, arg):
@ -1861,6 +1875,7 @@ def do_list(self, arg):
self.message('[EOF]') self.message('[EOF]')
except KeyboardInterrupt: except KeyboardInterrupt:
pass pass
self._validate_file_mtime()
do_l = do_list do_l = do_list
def do_longlist(self, arg): def do_longlist(self, arg):
@ -1879,6 +1894,7 @@ def do_longlist(self, arg):
self.error(err) self.error(err)
return return
self._print_lines(lines, lineno, breaklist, self.curframe) self._print_lines(lines, lineno, breaklist, self.curframe)
self._validate_file_mtime()
do_ll = do_longlist do_ll = do_longlist
def do_source(self, arg): def do_source(self, arg):

View File

@ -3711,6 +3711,25 @@ def test_file_modified_after_execution(self):
self.assertIn("WARNING:", stdout) self.assertIn("WARNING:", stdout)
self.assertIn("was edited", 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): def test_file_modified_after_execution_with_multiple_instances(self):
# the time.sleep is needed for low-resolution filesystems like HFS+ # the time.sleep is needed for low-resolution filesystems like HFS+
script = """ script = """

View File

@ -0,0 +1 @@
Only show stale code warning in :mod:`pdb` when we display source code.