From 98164f6d4f7e70d70710804c7baa31a8d93c19b9 Mon Sep 17 00:00:00 2001 From: Francesco Date: Sun, 13 Jun 2021 19:50:42 +0200 Subject: [PATCH 1/2] Integrate mkdirp function in common module (#265) Move the function mkdirp into common to be generally available. Use the new common.mkdirp from create_user_directory() from core/init.lua replacing previous parent directory creation code within the function. The previous mkdirp function did not work on Windows where absolute paths starts with a drive letter. The code from create_user_directory() did not have this problem but was wrong in the way it was creating the nested directories. The new implementation in common.mkdirp fix both problems. --- data/core/commands/files.lua | 30 ++---------------------------- data/core/common.lua | 22 ++++++++++++++++++++++ data/core/init.lua | 21 ++++----------------- 3 files changed, 28 insertions(+), 45 deletions(-) diff --git a/data/core/commands/files.lua b/data/core/commands/files.lua index a366d43e..b2fdb336 100644 --- a/data/core/commands/files.lua +++ b/data/core/commands/files.lua @@ -1,37 +1,11 @@ local core = require "core" local command = require "core.command" - -local function mkdirp(path) - local segments = {} - local pos = 1 - while true do - local s, e = string.find(path, "[/\\]+", pos) - if not s then break end - table.insert(segments, string.sub(str, pos, s - 1)) - pos = e + 1 - end - table.insert(segments, string.sub(str, pos)) - if segments[#segments] == '' then - table.remove(segments) - end - - for i = 1, #segments do - local p = table.concat(segments, PATHSEP, 1, i) - local stat = system.get_file_info(p) - if stat and stat.type == "file" then - return nil, "path exists", p - end - local success, err = system.mkdir(p) - if not success then - return nil, err, p - end - end -end +local common = require "core.common" command.add(nil, { ["files:create-directory"] = function() core.command_view:enter("New directory name", function(text) - local success, err, path = mkdirp(text) + local success, err, path = common.mkdirp(text) if not success then core.error("cannot create directory %q: %s", path, err) end diff --git a/data/core/common.lua b/data/core/common.lua index e8a989df..155d4ddb 100644 --- a/data/core/common.lua +++ b/data/core/common.lua @@ -273,4 +273,26 @@ function common.relative_path(ref_dir, dir) end +function common.mkdirp(path) + local stat = system.get_file_info(path) + if stat and stat.type then + return false, "path exists", path + end + local subdirs = {} + while path and path ~= "" do + local success_mkdir = system.mkdir(path) + if success_mkdir then break end + local updir, basedir = path:match("(.*)[/\\](.+)$") + table.insert(subdirs, 1, basedir or path) + path = updir + end + for _, dirname in ipairs(subdirs) do + path = path and path .. PATHSEP .. dirname or dirname + if not system.mkdir(path) then + return false, "cannot create directory", path + end + end + return true +end + return common diff --git a/data/core/init.lua b/data/core/init.lua index 3f85c6e0..7adb316b 100644 --- a/data/core/init.lua +++ b/data/core/init.lua @@ -276,25 +276,12 @@ end -- create a directory using mkdir but may need to create the parent -- directories as well. local function create_user_directory() - local dirname_create = USERDIR - local basedir - local subdirs = {} - while dirname_create and dirname_create ~= "" do - local success_mkdir = system.mkdir(dirname_create) - if success_mkdir then break end - dirname_create, basedir = dirname_create:match("(.*)[/\\](.+)$") - if basedir then - subdirs[#subdirs + 1] = basedir - end - end - for _, dirname in ipairs(subdirs) do - dirname_create = dirname_create .. '/' .. dirname - if not system.mkdir(dirname_create) then - error("cannot create directory: \"" .. dirname_create .. "\"") - end + local success, err = common.mkdirp(USERDIR) + if not success then + error("cannot create directory \"" .. USERDIR .. "\": " .. err) end for _, modname in ipairs {'plugins', 'colors', 'fonts'} do - local subdirname = dirname_create .. '/' .. modname + local subdirname = USERDIR .. PATHSEP .. modname if not system.mkdir(subdirname) then error("cannot create directory: \"" .. subdirname .. "\"") end From e070dbebc143de9bbb21ebfbacb89cc5a2f8d0ff Mon Sep 17 00:00:00 2001 From: jgmdev Date: Sun, 13 Jun 2021 21:28:29 -0400 Subject: [PATCH 2/2] Fix undeclared NagView findindex() by moving it to common. --- data/core/commands/dialog.lua | 5 +++-- data/core/common.lua | 7 +++++++ data/core/nagview.lua | 8 +------- 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/data/core/commands/dialog.lua b/data/core/commands/dialog.lua index f6df69aa..90606abb 100644 --- a/data/core/commands/dialog.lua +++ b/data/core/commands/dialog.lua @@ -1,5 +1,6 @@ local core = require "core" local command = require "core.command" +local common = require "core.common" command.add("core.nagview", { ["dialog:previous-entry"] = function() @@ -15,13 +16,13 @@ command.add("core.nagview", { ["dialog:select-yes"] = function() local v = core.active_view if v ~= core.nag_view then return end - v:change_hovered(findindex(v.options, "default_yes")) + v:change_hovered(common.find_index(v.options, "default_yes")) command.perform "dialog:select" end, ["dialog:select-no"] = function() local v = core.active_view if v ~= core.nag_view then return end - v:change_hovered(findindex(v.options, "default_no")) + v:change_hovered(common.find_index(v.options, "default_no")) command.perform "dialog:select" end, ["dialog:select"] = function() diff --git a/data/core/common.lua b/data/core/common.lua index 155d4ddb..b7dd61db 100644 --- a/data/core/common.lua +++ b/data/core/common.lua @@ -22,6 +22,13 @@ function common.round(n) end +function common.find_index(tbl, prop) + for i, o in ipairs(tbl) do + if o[prop] then return i end + end +end + + function common.lerp(a, b, t) if type(a) ~= "table" then return a + (b - a) * t diff --git a/data/core/nagview.lua b/data/core/nagview.lua index 1f48d8d6..6d6f89f4 100644 --- a/data/core/nagview.lua +++ b/data/core/nagview.lua @@ -170,12 +170,6 @@ function NagView:draw() end end -local function findindex(tbl, prop) - for i, o in ipairs(tbl) do - if o[prop] then return i end - end -end - function NagView:get_message_height() local h = 0 for str in string.gmatch(self.message, "(.-)\n") do @@ -196,7 +190,7 @@ function NagView:next() -- self.target_height is the nagview height needed to display the message and -- the buttons, excluding the top and bottom padding space. self.target_height = math.max(message_height, self:get_buttons_height()) - self:change_hovered(findindex(self.options, "default_yes")) + self:change_hovered(common.find_index(self.options, "default_yes")) end self.force_focus = self.message ~= nil core.set_active_view(self.message ~= nil and self or core.last_active_view)