[Python-checkins] python/dist/src/Tools/idle IOBinding.py,1.4,1.4.22.1

anthonybaxter@sourceforge.net anthonybaxter@sourceforge.net
Wed, 17 Apr 2002 22:08:31 -0700


Update of /cvsroot/python/python/dist/src/Tools/idle
In directory usw-pr-cvs1:/tmp/cvs-serv11126/Tools/idle

Modified Files:
      Tag: release22-maint
	IOBinding.py 
Log Message:
backport gvanrossum's patch:

Provisional fix for writefile() [SF bug # 541730].

The problem was that an exception can occur in the text.get() call or
in the write() call, when the text buffer contains non-ASCII
characters.  This causes the previous contents of the file to be lost.

The provisional fix is to call str(self.text.get(...)) *before*
opening the file, so that if the exception occurs, we never open the
file.

Two orthogonal better solutions have to wait for policy decisions:

1. We could try to encode the data as Latin-1 or as UTF-8; but that
   would require IDLE to grow a notion of file encoding which requires
   more thought.

2. We could make backups before overwriting a file.  This requires
   more thought because it needs to be fast and cross-platform and
   configurable.


Original patches were:
python/dist/src/Tools/idle/IOBinding.py:1.6



Index: IOBinding.py
===================================================================
RCS file: /cvsroot/python/python/dist/src/Tools/idle/IOBinding.py,v
retrieving revision 1.4
retrieving revision 1.4.22.1
diff -C2 -d -r1.4 -r1.4.22.1
*** IOBinding.py	2 Feb 2001 20:07:46 -0000	1.4
--- IOBinding.py	18 Apr 2002 05:08:28 -0000	1.4.22.1
***************
*** 149,155 ****
      def writefile(self, filename):
          self.fixlastline()
          try:
              f = open(filename, "w")
-             chars = self.text.get("1.0", "end-1c")
              f.write(chars)
              f.close()
--- 149,155 ----
      def writefile(self, filename):
          self.fixlastline()
+         chars = str(self.text.get("1.0", "end-1c"))
          try:
              f = open(filename, "w")
              f.write(chars)
              f.close()