classification
Title: IDLE EOL convention not set on a empty file
Type: crash Stage: resolved
Components: IDLE Versions: Python 3.10, Python 3.9, Python 3.8
process
Status: closed Resolution: duplicate
Dependencies: Superseder: IDLE: edit/save files created by Windows Explorer
View: 41373
Assigned To: terry.reedy Nosy List: eamanu, lukasz.langa, rhettinger, serhiy.storchaka, terry.reedy
Priority: high Keywords: 3.8regression, 3.9regression, patch

Created on 2020-07-24 00:42 by rhettinger, last changed 2020-07-24 05:50 by serhiy.storchaka. This issue is now closed.

Files
File name Uploaded Description Edit
0001-Fix-eol_convention-when-file-does-not-exist.patch eamanu, 2020-07-24 02:28
Messages (4)
msg374155 - (view) Author: Raymond Hettinger (rhettinger) * (Python committer) Date: 2020-07-24 00:42
I think this is a new bug, present in Python 3.8.5 but not present in 3.8.3.

Steps to reproduce:

    * $ touch xyzpdq.py             # Creates new file, zero bytes in length
    * $ python3.8 -m idlelib.idle xyzdpq.py
    * Enter text:   print('hello world')
    * Attempt to save the file with Cmd-S
    * This seems to be unrecoverable and results
      in losing all the code that was entered.

---------------- example session ---------------
~ $ cd tmp
~/tmp $ touch qwerty.py
~/tmp $ python3.8 -m idlelib.idle qwerty.py
Exception in Tkinter callback
Traceback (most recent call last):
  File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/tkinter/__init__.py", line 1883, in __call__
    return self.func(*args)
  File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/idlelib/multicall.py", line 176, in handler
    r = l[i](event)
  File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/idlelib/iomenu.py", line 200, in save
    if self.writefile(self.filename):
  File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/idlelib/iomenu.py", line 232, in writefile
    text = self.fixnewlines()
  File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/idlelib/iomenu.py", line 252, in fixnewlines
    text = text.replace("\n", self.eol_convention)
TypeError: replace() argument 2 must be str, not None
msg374156 - (view) Author: Emmanuel Arias (eamanu) * Date: 2020-07-24 02:28
Hello everybody!

When a new file is loaded, the current loadfile read for the newline to set
the eol_convention. As does not exist for a empty file a None is saved and
for that reason the exception is raised

If you consider that this patch is correct I cant submit a PR

Cheers
msg374157 - (view) Author: Raymond Hettinger (rhettinger) * (Python committer) Date: 2020-07-24 03:41
This may have been caused by https://github.com/python/cpython/commit/c3fa7534c7173d338880a1727f17795670518610 for https://bugs.python.org/issue41378
msg374159 - (view) Author: Serhiy Storchaka (serhiy.storchaka) * (Python committer) Date: 2020-07-24 05:50
It is a duplicate of issue41373 (and the problem is not only with empty files).
History
Date User Action Args
2020-07-24 05:50:02serhiy.storchakasetstatus: open -> closed
superseder: IDLE: edit/save files created by Windows Explorer
messages: + msg374159

resolution: duplicate
stage: resolved
2020-07-24 04:25:58rhettingersetnosy: + lukasz.langa
2020-07-24 03:41:29rhettingersetmessages: + msg374157
2020-07-24 03:38:47rhettingersetnosy: + serhiy.storchaka
2020-07-24 02:28:51eamanusetfiles: + 0001-Fix-eol_convention-when-file-does-not-exist.patch

nosy: + eamanu
messages: + msg374156

keywords: + patch
2020-07-24 00:42:59rhettingercreate