Test configuration with project_files stored separately for each directory

This commit is contained in:
Francesco Abbate 2020-12-26 21:22:57 +01:00
parent 2f50f21f57
commit ec730e9520
3 changed files with 73 additions and 52 deletions

View File

@ -112,16 +112,19 @@ local function project_scan_thread()
while true do while true do
-- get project files and replace previous table if the new table is -- get project files and replace previous table if the new table is
-- different -- different
local t, entries_count = get_files(".") for i = 1, #core.project_directories do
if diff_files(core.project_files, t) then local dir = core.project_directories[i]
if entries_count > config.max_project_files then local t, entries_count = get_files(dir.filename)
core.status_view:show_message("!", style.accent, if diff_files(dir.files, t) then
"Too many files in project directory: stopping reading at ".. if entries_count > config.max_project_files then
config.max_project_files.." files according to config.max_project_files.") core.status_view:show_message("!", style.accent,
"Too many files in project directory: stopping reading at "..
config.max_project_files.." files according to config.max_project_files.")
end
dir.files = t
-- core.project_directories[1] = {filename = system.absolute_path("."), type = "dir"}
core.redraw = true
end end
core.project_files = t
core.project_directories[1] = {filename = system.absolute_path("."), type = "dir"}
core.redraw = true
end end
-- wait for next scan -- wait for next scan
@ -252,8 +255,14 @@ function core.init()
core.log_items = {} core.log_items = {}
core.docs = {} core.docs = {}
core.threads = setmetatable({}, { __mode = "k" }) core.threads = setmetatable({}, { __mode = "k" })
core.project_files = {} local dir_abs_path = system.absolute_path(".")
core.project_directories = {} core.project_directories = {
{
filename = dir_abs_path,
item = {filename = dir_abs_path, type = "dir", top_dir = true},
files = {},
}
}
core.redraw = true core.redraw = true
core.visited_files = {} core.visited_files = {}
core.restart_request = false core.restart_request = false

View File

@ -120,7 +120,9 @@ function StatusView:get_items()
style.icon_font, "g", style.icon_font, "g",
style.font, style.dim, self.separator2, style.font, style.dim, self.separator2,
#core.docs, style.text, " / ", #core.docs, style.text, " / ",
#core.project_files, " files" -- FIXME: the number of file should be calculated
-- across directories.
#core.project_directories[1].files, " files"
} }
end end

View File

@ -25,6 +25,7 @@ function TreeView:new()
self.visible = true self.visible = true
self.init_size = true self.init_size = true
self.cache = {} self.cache = {}
self.last = {}
end end
@ -42,22 +43,27 @@ end
function TreeView:get_cached(item, dirname) function TreeView:get_cached(item, dirname)
local t = self.cache[item.filename] local dir_cache = self.cache[dirname]
if not dir_cache then
dir_cache = {}
self.cache[dirname] = dir_cache
end
local t = dir_cache[item.filename]
if not t then if not t then
t = {} t = {}
if dirname then local rel = relative_filename(item.filename, dirname)
local rel = relative_filename(item.filename, dirname) -- FIXME: rel should never be nil here. to be verified.
-- FIXME: rel should never be nil here. to be verified. if item.top_dir then
t.filename = rel or item.filename
t.depth = get_depth(t.filename)
else
t.filename = item.filename:match("[^\\/]+$") t.filename = item.filename:match("[^\\/]+$")
t.depth = 0 t.depth = 0
else
t.filename = rel or item.filename
t.depth = get_depth(t.filename)
end end
t.abs_filename = item.filename t.abs_filename = item.filename
t.name = t.filename:match("[^\\/]+$") t.name = t.filename:match("[^\\/]+$")
t.type = item.type t.type = item.type
self.cache[item.filename] = t dir_cache[item.filename] = t
end end
return t return t
end end
@ -75,11 +81,20 @@ end
function TreeView:check_cache() function TreeView:check_cache()
-- invalidate cache's skip values if project_files has changed -- invalidate cache's skip values if project_files has changed
if core.project_files ~= self.last_project_files then for i = 1, #core.project_directories do
for _, v in pairs(self.cache) do local dir = core.project_directories[i]
v.skip = nil local last_files = self.last[dir.filename]
if not last_files then
self.last[dir.filename] = dir.files
else
if dir.files ~= last_files then
for _, v in pairs(self.cache[dir.filename]) do
v.skip = nil
end
self.last[dir.filename] = dir.files
-- self.last_project_files = core.project_files
end
end end
self.last_project_files = core.project_files
end end
end end
@ -92,39 +107,34 @@ function TreeView:each_item()
local w = self.size.x local w = self.size.x
local h = self:get_item_height() local h = self:get_item_height()
local i = 1 for k = 1, #core.project_directories do
-- FIXME: make this loop more efficient. Currently it takes O(M * N) local dir = core.project_directories[k]
-- where M = (directories number) and N = (files number) local dir_cached = self:get_cached(dir.item, dir.filename)
-- It should take O(N). local dir_name = dir.filename
for idir, dir_item in ipairs(core.project_directories) do coroutine.yield(dir_cached, ox, y, w, h)
local dir_entry = self:get_cached(dir_item)
local dir_name = dir_item.filename
coroutine.yield(dir_entry, ox, y, w, h)
y = y + h y = y + h
while i <= #core.project_files do local i = 1
local item = core.project_files[i] while i <= #dir.files do
if belongs_to_directory(item, dir_name) then local item = dir.files[i]
local cached = self:get_cached(item, dir_name) -- if belongs_to_directory(item, dir_name) then
local cached = self:get_cached(item, dir_name)
coroutine.yield(cached, ox, y, w, h) coroutine.yield(cached, ox, y, w, h)
y = y + h y = y + h
i = i + 1 i = i + 1
if not cached.expanded then if not cached.expanded then
if cached.skip then if cached.skip then
i = cached.skip i = cached.skip
else else
local depth = cached.depth local depth = cached.depth
while i <= #core.project_files do while i <= #dir.files do
local filename = relative_filename(core.project_files[i].filename, dir_name) local filename = relative_filename(dir.files[i].filename, dir_name)
if get_depth(filename) <= depth then break end if get_depth(filename) <= depth then break end
i = i + 1 i = i + 1
end
cached.skip = i
end end
cached.skip = i
end end
else
i = i + 1
end end
end -- while files end -- while files
end -- for directories end -- for directories