diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/lpm.lua | 81 |
1 files changed, 45 insertions, 36 deletions
diff --git a/src/lpm.lua b/src/lpm.lua index 82925e5..8cecfaa 100644 --- a/src/lpm.lua +++ b/src/lpm.lua @@ -364,7 +364,7 @@ function common.merge(dst, src) for k, v in pairs(src) do dst[k] = v end return function common.map(l, p) local t = {} for i, v in ipairs(l) do table.insert(t, p(v, i)) end return t end function common.each(l, p) for i, v in ipairs(l) do p(v) end end function common.flat_map(l, p) local t = {} for i, v in ipairs(l) do local r = p(v) for k, w in ipairs(r) do table.insert(t, w) end end return t end -function common.concat(t1, t2) local t = {} for i, v in ipairs(t1) do table.insert(t, v) end for i, v in ipairs(t2) do table.insert(t, v) end return t end +function common.concat(...) local t = {} for i, tt in ipairs({ ... }) do for j, v in ipairs(tt) do table.insert(t, v) end end return t end function common.grep(l, p) local t = {} for i, v in ipairs(l) do if p(v) then table.insert(t, v) end end return t end function common.first(l, p) for i, v in ipairs(l) do if (type(p) == 'function' and p(v)) or p == v then return v end end end function common.slice(t, i, l) local n = {} for j = i, l ~= nil and (i - l) or #t do table.insert(n, t[j]) end return n end @@ -472,6 +472,37 @@ function common.stat(path) return stat end +function common.args(arguments, options) + local args = {} + local i = 1 + while i <= #arguments do + local s,e, option, value = arguments[i]:find("%-%-([^=]+)=?(.*)") + if s and options[option] then + local flag_type = options[option] + if flag_type == "flag" then + args[option] = true + elseif flag_type == "string" or flag_type == "number" or flag_type == "array" then + if not value or value == "" then + if i == #arguments then error("option " .. option .. " requires a " .. flag_type) end + value = arguments[i+1] + i = i + 1 + end + if flag_type == "number" and tonumber(flag_type) == nil then error("option " .. option .. " should be a number") end + if flag_type == "array" then + args[option] = args[option] or {} + table.insert(args[option], value) + else + args[option] = value + end + end + else + table.insert(args, arguments[i]) + end + i = i + 1 + end + return args +end + local LATEST_MOD_VERSION = "3.0.0" local EXECUTABLE_EXTENSION = PLATFORM == "windows" and ".exe" or "" local HOME, USERDIR, CACHEDIR, JSON, TABLE, HEADER, RAW, VERBOSE, FILTRATION, MOD_VERSION, QUIET, FORCE, REINSTALL, CONFIG, NO_COLOR, AUTO_PULL_REMOTES, ARCH, ASSUME_YES, NO_INSTALL_OPTIONAL, TMPDIR, DATADIR, BINARY, POST, PROGRESS, SYMLINK, REPOSITORY, EPHEMERAL, MASK, settings, repositories, lite_xls, system_bottle, progress_bar_label, write_progress_bar @@ -1976,7 +2007,7 @@ end function lpm.self_upgrade(release) if not DEFAULT_RELEASE_URL or #DEFAULT_RELEASE_URL == 0 then error("self-upgrade has been disabled on lpm version " .. VERSION .. "; please upgrade it however you installed it") end - local path = ARGV[1]:find(PATHSEP) and system.stat(ARGV[1]) and ARGV[1] or common.path(ARGV[1]) + local path = ARGS[1]:find(PATHSEP) and system.stat(ARGS[1]) and ARGS[1] or common.path(ARGS[1]) if not path then error("can't find path to lpm") end release = release or "latest" local release_url = release and release:find("^https://") and release or (DEFAULT_RELEASE_URL:gsub("%%r", release)) @@ -2012,37 +2043,6 @@ function lpm.purge() common.rmrf(CACHEDIR) end -local function parse_arguments(arguments, options) - local args = {} - local i = 1 - while i <= #arguments do - local s,e, option, value = arguments[i]:find("%-%-([^=]+)=?(.*)") - if s then - local flag_type = options[option] - if not flag_type then error("unknown flag --" .. option) end - if flag_type == "flag" then - args[option] = true - elseif flag_type == "string" or flag_type == "number" or flag_type == "array" then - if not value or value == "" then - if i == #arguments then error("option " .. option .. " requires a " .. flag_type) end - value = arguments[i+1] - i = i + 1 - end - if flag_type == "number" and tonumber(flag_type) == nil then error("option " .. option .. " should be a number") end - if flag_type == "array" then - args[option] = args[option] or {} - table.insert(args[option], value) - else - args[option] = value - end - end - else - table.insert(args, arguments[i]) - end - i = i + 1 - end - return args -end local function run_command(ARGS) @@ -2109,7 +2109,8 @@ end xpcall(function() - local ARGS = parse_arguments(ARGV, { + rawset(_G, "ARGS", ARGV) + ARGS = common.args(ARGS, { json = "flag", userdir = "string", cachedir = "string", version = "flag", verbose = "flag", quiet = "flag", version = "flag", ["mod-version"] = "string", remotes = "flag", help = "flag", remotes = "flag", ["ssl-certs"] = "string", force = "flag", arch = "array", ["assume-yes"] = "flag", @@ -2465,18 +2466,26 @@ not commonly used publically. end end - for i,v in ipairs(common.concat(ARGS["plugin"] or {}, { common.split(":", os.getenv("LPM_PLUGINS") or "") })) do + local lpm_plugins_path = HOME .. PATHSEP .. ".config" .. PATHSEP .. "lpm" .. PATHSEP .. "plugins" + local lpm_plugins = system.stat(lpm_plugins_path) and common.map(common.grep(system.ls(lpm_plugins_path), function(path) return path:find("%.lua$") end), function(path) return lpm_plugins_path .. PATHSEP .. path end) or {} + for i,v in ipairs(common.concat(ARGS["plugin"] or {}, { common.split(":", os.getenv("LPM_PLUGINS") or "") }, lpm_plugins)) do if v ~= "" then local env = { EXECUTABLE_EXTENSION = EXECUTABLE_EXTENSION, SHOULD_COLOR = SHOULD_COLOR, HOME = HOME, USERDIR = USERDIR, CACHEDIR = CACHEDIR, JSON = JSON, TABLE = TABLE, HEADER = HEADER, RAW = RAW, VERBOSE = VERBOSE, FILTRATION = FILTRATION, MOD_VERSION = MOD_VERSION, QUIET = QUIET, FORCE = FORCE, REINSTALL = REINSTALL, CONFIG = CONFIG, NO_COLOR = NO_COLOR, AUTO_PULL_REMOTES = AUTO_PULL_REMOTES, ARCH = ARCH, ASSUME_YES = ASSUME_YES, NO_INSTALL_OPTIONAL = NO_INSTALL_OPTIONAL, TMPDIR = TMPDIR, DATADIR = DATADIR, BINARY = BINARY, POST = POST, PROGRESS = PROGRESS, SYMLINK = SYMLINK, REPOSITORY = REPOSITORY, EPHEMERAL = EPHEMERAL, MASK = MASK, Addon = Addon, Repository = Repository, LiteXL = LiteXL, Bottle = Bottle, lpm = lpm, common = common, json = json, log = log, settings = settings, repositories = repositories, lite_xls = lite_xls, system_bottle = system_bottle, progress_bar_label = progress_bar_label, write_progress_bar, } - setmetatable(env, { __index = _G }) + setmetatable(env, { __index = _G, __newindex = function(t, k, v) _G[k] = v end }) assert(load(assert(io.open(v, "rb")):read("*all"), v, "bt", env))() end end + for i,v in ipairs(ARGS) do + if v:find("^%-%-") then + error("unknown flag " .. v) + end + end + -- Small utility functions that don't play into the larger app; are used for testing -- or for handy scripts. if ARGS[2] == "test" or ARGS[2] == "exec" then |