summaryrefslogtreecommitdiff
path: root/xmake/plugins/lua/main.lua
diff options
context:
space:
mode:
Diffstat (limited to 'xmake/plugins/lua/main.lua')
-rw-r--r--xmake/plugins/lua/main.lua137
1 files changed, 11 insertions, 126 deletions
diff --git a/xmake/plugins/lua/main.lua b/xmake/plugins/lua/main.lua
index e3cabc19c..6e0ca88be 100644
--- a/xmake/plugins/lua/main.lua
+++ b/xmake/plugins/lua/main.lua
@@ -23,14 +23,17 @@ import("core.base.option")
import("core.sandbox.module")
import("core.sandbox.sandbox")
import("core.project.project")
+import("utils.run_script")
-- get all lua scripts
function scripts()
local names = {}
+ local oldir = os.cd(os.workingdir())
local files = os.files(path.join(os.scriptdir(), "scripts/*.lua"))
for _, file in ipairs(files) do
table.insert(names, path.basename(file))
end
+ os.cd(oldir)
return names
end
@@ -42,141 +45,23 @@ function _list()
end
end
--- print verbose log
-function _print_vlog(script_type, script_name, args)
- if not option.get("verbose") then return end
- cprintf("running %s ${underline}%s${reset}", script_type, script_name)
- if args.n > 0 then
- print(" with args:")
- if not option.get("diagnosis") then
- for i = 1, args.n do
- print(" - " .. todisplay(args[i]))
- end
- else
- utils.dump(table.unpack(args, 1, args.n))
- end
- else
- print(".")
- end
-end
-
-function _run_commanad(command, args)
- local tmpfile = os.tmpfile() .. ".lua"
- io.writefile(tmpfile, "function main(...)\n" .. command .. "\nend")
- return _run_script(tmpfile, args)
-end
-
-function _is_callable(func)
- if type(func) == "function" then
- return true
- elseif type(func) == "table" then
- local meta = debug.getmetatable(func)
- if meta and meta.__call then
- return true
- end
- end
-end
-
-function _run_script(script, args)
-
- local func
- local printresult = false
- local script_type, script_name
-
- -- import and run script
- if path.extension(script) == ".lua" and os.isfile(script) then
-
- -- run the given lua script file (xmake lua /tmp/script.lua)
- script_type, script_name = "given lua script file", path.relative(script)
- func = import(path.basename(script), {rootdir = path.directory(script), anonymous = true})
- elseif os.isfile(path.join(os.scriptdir(), "scripts", script .. ".lua")) then
-
- -- run builtin lua script (xmake lua echo "hello xmake")
- script_type, script_name = "builtin lua script", script
- func = import("scripts." .. script, {anonymous = true})
- else
-
- -- attempt to find the builtin module
- local object = nil
- for _, name in ipairs(script:split("%.")) do
- object = object and object[name] or module.get(name)
- if not object then
- break
- end
- end
- if object then
- -- run builtin modules (xmake lua core.xxx.xxx)
- script_type, script_name = "builtin module", script
- func = object
- else
- -- run imported modules (xmake lua core.xxx.xxx)
- script_type, script_name = "imported module", script
- func = import(script, {anonymous = true})
- end
- printresult = true
- end
-
- -- print verbose log
- _print_vlog(script_type or "script", script_name or "", args)
-
- -- dump func() result
- if _is_callable(func) then
- local result = table.pack(func(table.unpack(args, 1, args.n)))
- if printresult and result and result.n ~= 0 then
- utils.dump(table.unpack(result, 1, result.n))
- end
- else
- -- dump variables directly
- utils.dump(func)
- end
-end
-
-function _get_args()
-
- -- get arguments
- local args = option.get("arguments") or {}
- args.n = #args
-
- -- get deserialize tag
- local deserialize = option.get("deserialize")
- if not deserialize then
- return args
- end
- deserialize = tostring(deserialize)
-
- -- deserialize prefixed arguments
- for i, value in ipairs(args) do
- if value:startswith(deserialize) then
- local v, err = string.deserialize(value:sub(#deserialize + 1))
- if err then
- raise(err)
- else
- args[i] = v
- end
- end
- end
- return args
-end
-
function main()
- -- restore to the current working directory
- os.cd(os.workingdir())
-
-- list builtin scripts
if option.get("list") then
return _list()
end
- -- run command?
+ -- run script
local script = option.get("script")
- if option.get("command") and script then
- return _run_commanad(script, _get_args())
- end
-
- -- get script
if script then
- return _run_script(script, _get_args())
+ return run_script(script, {
+ curdir = os.workingdir(),
+ verbose = option.get("verbose"),
+ diagnosis = option.get("diagnosis"),
+ command = option.get("command"),
+ arguments = option.get("arguments"),
+ deserialize = option.get("deserialize")})
end
-- enter interactive mode