mirror of https://github.com/python/cpython.git
gh-125600: Only show stale code warning on source code display commands (#125601)
This commit is contained in:
parent
7cf2dbc3cb
commit
77cebb1ce9
24
Lib/pdb.py
24
Lib/pdb.py
|
@ -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):
|
||||||
|
|
|
@ -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 = """
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
Only show stale code warning in :mod:`pdb` when we display source code.
|
Loading…
Reference in New Issue