Summary
lib/python/touchy/filechooser.py:28-29 hardcodes the file-listing directory and crashes if the path is missing:
self.dir = os.path.join(os.getenv('HOME'), 'linuxcnc', 'nc_files')
self.reload(0)
reload() calls os.listdir(self.dir) with no try/except, raising FileNotFoundError and aborting touchy startup on any system without ~/linuxcnc/nc_files/.
Reproducer
HOME=/tmp/clean-home linuxcnc -r configs/sim/touchy/touchy.ini
Touchy aborts with:
Traceback (most recent call last):
File ".../bin/touchy", line 887, in <module>
hwg = touchy(sys.argv[2])
File ".../bin/touchy", line 228, in __init__
self.filechooser = filechooser.filechooser(...)
File ".../lib/python/touchy/filechooser.py", line 29, in __init__
self.reload(0)
File ".../lib/python/touchy/filechooser.py", line 89, in reload
self.files = os.listdir(self.dir)
FileNotFoundError: [Errno 2] No such file or directory: '/tmp/clean-home/linuxcnc/nc_files'
How it surfaced
Caught by the new ui-smoke tests (#3999) on a clean GitHub Actions $HOME. Worked around in launch.sh by pre-creating the dir; filing this issue and a follow-up PR so the workaround can come back out.
Proposed fix
reload() should tolerate a missing or unreadable directory: catch OSError, set self.files = [], log a warning, continue. The user can still browse via the normal file menu; they just see an empty quick-pick list.
If [DISPLAY] PROGRAM_PREFIX from the INI file is available the constructor could prefer that path over the hardcoded $HOME/linuxcnc/nc_files, falling back to the existing default. PR to follow.
Summary
lib/python/touchy/filechooser.py:28-29 hardcodes the file-listing directory and crashes if the path is missing:
reload()callsos.listdir(self.dir)with no try/except, raisingFileNotFoundErrorand aborting touchy startup on any system without~/linuxcnc/nc_files/.Reproducer
Touchy aborts with:
How it surfaced
Caught by the new ui-smoke tests (#3999) on a clean GitHub Actions
$HOME. Worked around in launch.sh by pre-creating the dir; filing this issue and a follow-up PR so the workaround can come back out.Proposed fix
reload()should tolerate a missing or unreadable directory: catchOSError, setself.files = [], log a warning, continue. The user can still browse via the normal file menu; they just see an empty quick-pick list.If
[DISPLAY] PROGRAM_PREFIXfrom the INI file is available the constructor could prefer that path over the hardcoded$HOME/linuxcnc/nc_files, falling back to the existing default. PR to follow.