Fix application start for project-based approach

This commit is contained in:
Francesco Abbate 2021-05-14 10:59:42 +02:00
parent 07a6cb23bc
commit d84246c61d
1 changed files with 78 additions and 59 deletions

View File

@ -53,6 +53,20 @@ local function update_recents_project(action, dir_path_abs)
end
local function cleanup_recent_projects()
local recents = core.recent_projects
local i = 1
while i <= #recents do
local info = system.get_file_info(recents[i])
if not info or info.type ~= "dir" then
table.remove(recents, i)
else
i = i + 1
end
end
end
function core.reschedule_project_scan()
if core.project_scan_thread_id then
core.threads[core.project_scan_thread_id].wake = 0
@ -63,7 +77,6 @@ end
function core.open_folder_project(dir_path_abs)
core.root_view:close_all_docviews()
core.project_entries = {}
-- FIXME: check stat info to verify is a directory
core.add_project_directory(dir_path_abs)
update_recents_project("add", dir_path_abs)
end
@ -353,15 +366,14 @@ function core.load_user_directory()
end)
end
function core.add_project_file(path)
path = common.normalize_path(path)
table.insert(core.project_entries, {
-- type = 'file',
local entry = {
name = path,
item = {filename = common.basename(path), type = "file", topdir = true},
files = {path}
})
}
table.insert(core.project_entries, entry)
end
@ -370,12 +382,12 @@ function core.add_project_directory(path)
-- will be simply the name of the directory, without its path.
-- The field item.topdir will identify it as a top level directory.
path = common.normalize_path(path)
table.insert(core.project_entries, {
-- type = 'dir',
local entry = {
name = path,
item = {filename = common.basename(path), type = "dir", topdir = true},
files = {}
})
}
table.insert(core.project_entries, entry)
end
@ -440,56 +452,51 @@ function core.init()
end
core.recent_projects = recent_projects
end
cleanup_recent_projects()
local project_dir = core.recent_projects[1] or "."
local project_dir_explicit = false
local files = {}
local delayed_error
for i = 2, #ARGS do
local arg_filename = strip_trailing_slash(ARGS[i])
local info = system.get_file_info(arg_filename) or {}
if info.type == "file" then
local file_abs = system.absolute_path(arg_filename)
if file_abs then
table.insert(files, file_abs)
project_dir = file_abs:match("^(.+)[/\\].+$")
end
elseif info.type == "dir" then
project_dir = arg_filename
project_dir_explicit = true
else
delayed_error = string.format("error: invalid file or directory %q", ARGS[i])
end
end
core.frame_start = 0
core.clip_rect_stack = {{ 0,0,0,0 }}
core.log_items = {}
core.docs = {}
core.window_mode = "normal"
core.project_entries = {}
core.threads = setmetatable({}, { __mode = "k" })
core.blink_start = system.get_time()
core.blink_timer = core.blink_start
core.working_dir = system.absolute_path(".")
local project_dir_abs = system.absolute_path(project_dir)
if project_dir_abs then
core.add_project_directory(project_dir_abs)
update_recents_project("add", project_dir_abs)
local init_files = {}
local delayed_errors = {}
for i = 2, #ARGS do
local filename = strip_trailing_slash(ARGS[i])
local info = system.get_file_info(filename)
if info and info.type == "file" then
filename = system.absolute_path(filename)
if filename then
core.add_project_file(filename)
table.insert(init_files, filename)
end
-- FIXME: below, check if project_dir_abs is ok as a project directory
local set_project_ok = project_dir_abs
if set_project_ok then
if project_dir_explicit then
update_recents_project("add", project_dir_abs)
elseif info and info.type == "dir" then
filename = system.absolute_path(filename)
if filename then
core.add_project_directory(filename)
update_recents_project("add", filename)
end
else
if not project_dir_explicit then
update_recents_project("remove", project_dir)
local error_msg = string.format("error: invalid file or directory \"%s\"", ARGS[i])
table.insert(delayed_errors, error_msg)
end
end
local init_message
if #core.project_entries == 0 then
if #core.recent_projects > 0 then
init_message = string.format("Opening project from directory \"%s\"", core.recent_projects[1])
core.add_project_directory(core.recent_projects[1])
else
init_message = string.format("Empty project: use the \"Core: Open File\" command to open a file or a directory.")
end
end
core.threads = setmetatable({}, { __mode = "k" })
core.frame_start = 0
core.clip_rect_stack = {{ 0,0,0,0 }}
core.window_mode = "normal"
core.blink_start = system.get_time()
core.blink_timer = core.blink_start
core.redraw = true
core.visited_files = {}
core.restart_request = false
@ -512,21 +519,33 @@ function core.init()
core.project_scan_thread_id = core.add_thread(project_scan_thread)
command.add_defaults()
for _, project_entry in ipairs(core.project_entries) do
if project_entry.item.type == "dir" then
core.log_quiet("Setting working directory to \"%s\"", project_entry.name)
system.chdir(project_entry.name)
core.working_dir = project_entry.name
break
end
end
if not core.working_dir then
core.working_dir = system.absolute_path(".")
end
if init_message then
core.log(init_message)
end
local got_user_error = not core.load_user_directory()
local plugins_success, plugins_refuse_list = core.load_plugins()
do
local pdir, pname = project_dir_abs:match("(.*)[/\\\\](.*)")
core.log("Opening project %q from directory %s", pname, pdir)
end
local got_project_error = not core.load_project_module()
for _, filename in ipairs(files) do
for _, filename in ipairs(init_files) do
core.root_view:open_doc(core.open_doc(filename))
end
if delayed_error then
core.error(delayed_error)
for _, error_msg in ipairs(delayed_errors) do
core.error(error_msg)
end
if not plugins_success or got_user_error or got_project_error then