◐ Shell
clean mode source ↗

[3.14] gh-50948: IDLE: Warn if saving a file will overwrite a newer version (GH-17578) by miss-islington · Pull Request #151027 · python/cpython

Expand Up @@ -61,6 +61,7 @@ def set_filename_change_hook(self, hook): self.filename_change_hook = hook
filename = None file_timestamp = None dirname = None
def set_filename(self, filename): Expand Down Expand Up @@ -127,6 +128,7 @@ def loadfile(self, filename): chars = f.read() fileencoding = f.encoding eol_convention = f.newlines file_timestamp = self.getmtime(filename) converted = False except (UnicodeDecodeError, SyntaxError): # Wait for the editor window to appear Expand All @@ -142,6 +144,7 @@ def loadfile(self, filename): chars = f.read() fileencoding = f.encoding eol_convention = f.newlines file_timestamp = self.getmtime(filename) converted = True except OSError as err: messagebox.showerror("I/O Error", str(err), parent=self.text) Expand Down Expand Up @@ -170,6 +173,7 @@ def loadfile(self, filename): self.text.insert("1.0", chars) self.reset_undo() self.set_filename(filename) self.file_timestamp = file_timestamp if converted: # We need to save the conversion results first # before being able to execute the code Expand Down Expand Up @@ -206,7 +210,26 @@ def save(self, event): if not self.filename: self.save_as(event) else: # Check the time of most recent content modification so the # user doesn't accidentally overwrite a newer version of the file. try: file_timestamp = self.getmtime(self.filename) except OSError: pass else: if self.file_timestamp != file_timestamp: confirm = messagebox.askokcancel( title="File has changed", message=( "The file has changed on disk since reading it!\n\n" "Do you really want to overwrite it?"), default=messagebox.CANCEL, parent=self.text) if not confirm: return "break"
if self.writefile(self.filename): self.file_timestamp = self.getmtime(self.filename) self.set_saved(True) try: self.editwin.store_file_breaks() Expand All @@ -219,6 +242,7 @@ def save_as(self, event): filename = self.asksavefile() if filename: if self.writefile(filename): self.file_timestamp = self.getmtime(filename) self.set_filename(filename) self.set_saved(1) try: Expand Down Expand Up @@ -251,6 +275,9 @@ def writefile(self, filename): parent=self.text) return False
def getmtime(self, filename): return os.stat(filename).st_mtime
def fixnewlines(self): """Return text with os eols.
Expand Down