From 173dd3aeb4891267e139dd752fada6c15abbdda9 Mon Sep 17 00:00:00 2001 From: jgmdev Date: Fri, 17 Jun 2022 15:35:23 -0400 Subject: [PATCH] plugin treeview: fix crash When the max_project_files is set to a higher value than the allowed system maximum file descriptors, and opening a project directory that causes dirmonitor to open a watch on a lot of files or directories, at least on MacOSX it causes all system.* file functions to return nil (for too many opened files) which breaks the project files scan. --- data/plugins/treeview.lua | 38 ++++++++++++++++++++------------------ 1 file changed, 20 insertions(+), 18 deletions(-) diff --git a/data/plugins/treeview.lua b/data/plugins/treeview.lua index bdcb0f49..cc13ec59 100644 --- a/data/plugins/treeview.lua +++ b/data/plugins/treeview.lua @@ -153,28 +153,30 @@ function TreeView:each_item() count_lines = count_lines + 1 y = y + h local i = 1 - while i <= #dir.files and dir_cached.expanded do - local item = dir.files[i] - local cached = self:get_cached(dir, item, dir.name) + if dir.files then -- if consumed max sys file descriptors this can be nil + while i <= #dir.files and dir_cached.expanded do + local item = dir.files[i] + local cached = self:get_cached(dir, item, dir.name) - coroutine.yield(cached, ox, y, w, h) - count_lines = count_lines + 1 - y = y + h - i = i + 1 + coroutine.yield(cached, ox, y, w, h) + count_lines = count_lines + 1 + y = y + h + i = i + 1 - if not cached.expanded then - if cached.skip then - i = cached.skip - else - local depth = cached.depth - while i <= #dir.files do - if get_depth(dir.files[i].filename) <= depth then break end - i = i + 1 + if not cached.expanded then + if cached.skip then + i = cached.skip + else + local depth = cached.depth + while i <= #dir.files do + if get_depth(dir.files[i].filename) <= depth then break end + i = i + 1 + end + cached.skip = i end - cached.skip = i end - end - end -- while files + end -- while files + end end -- for directories self.count_lines = count_lines end)