From 9941d6d52c1052d449aec6b77adf95f2d308e320 Mon Sep 17 00:00:00 2001 From: Hisham Muhammad Date: Thu, 24 May 2018 16:02:11 -0300 Subject: fs: wrap_script: allow hardcoding arguments, support wrapping luarocks --- src/luarocks/cmd/path.lua | 13 +----------- src/luarocks/fs/unix.lua | 43 +++++++++++++++++++++++++++++++--------- src/luarocks/fs/win32.lua | 50 +++++++++++++++++++++++++++++++++++------------ src/luarocks/util.lua | 17 ++++++++++++++++ 4 files changed, 89 insertions(+), 34 deletions(-) (limited to 'src') diff --git a/src/luarocks/cmd/path.lua b/src/luarocks/cmd/path.lua index 9bcd1c81..0f672a91 100644 --- a/src/luarocks/cmd/path.lua +++ b/src/luarocks/cmd/path.lua @@ -58,18 +58,7 @@ function path_cmd.command(flags) lr_bin = lr_bin .. path_sep .. os.getenv("PATH") end - local lpath_var = "LUA_PATH" - local lcpath_var = "LUA_CPATH" - - local lv = cfg.lua_version:gsub("%.", "_") - if lv ~= "5_1" then - if os.getenv("LUA_PATH_" .. lv) then - lpath_var = "LUA_PATH_" .. lv - end - if os.getenv("LUA_CPATH_" .. lv) then - lcpath_var = "LUA_CPATH_" .. lv - end - end + local lpath_var, lcpath_var = util.lua_path_variables() util.printout(fs.export_cmd(lpath_var, util.cleanup_path(lr_path, ';', cfg.lua_version))) util.printout(fs.export_cmd(lcpath_var, util.cleanup_path(lr_cpath, ';', cfg.lua_version))) diff --git a/src/luarocks/fs/unix.lua b/src/luarocks/fs/unix.lua index b64a4a38..dbe48cca 100644 --- a/src/luarocks/fs/unix.lua +++ b/src/luarocks/fs/unix.lua @@ -64,23 +64,48 @@ end -- @param version string: rock version to be used in loader context. -- @return boolean or (nil, string): True if succeeded, or nil and -- an error message. -function unix.wrap_script(file, dest, name, version) - assert(type(file) == "string") +function unix.wrap_script(file, dest, name, version, ...) + assert(type(file) == "string" or not file) assert(type(dest) == "string") + assert(type(name) == "string" or not name) + assert(type(version) == "string" or not version) - local base = dir.base_name(file) - local wrapname = fs.is_dir(dest) and dest.."/"..base or dest - local lpath, lcpath = cfg.package_paths(cfg.root_dir) + local wrapname = fs.is_dir(dest) and dest.."/"..dir.base_name(file) or dest local wrapper = io.open(wrapname, "w") if not wrapper then return nil, "Could not open "..wrapname.." for writing." end + + local lpath, lcpath = cfg.package_paths(cfg.root_dir) + lpath = util.cleanup_path(lpath, ";", cfg.lua_version) + lcpath = util.cleanup_path(lcpath, ";", cfg.lua_version) + + local luainit = { + "package.path="..util.LQ(lpath..";").."..package.path", + "package.cpath="..util.LQ(lcpath..";").."..package.cpath", + } + if dest == "luarocks" then + luainit = { + "package.path="..util.LQ(package.path), + "package.cpath="..util.LQ(package.cpath), + } + end + if name and version then + local addctx = "local k,l,_=pcall(require,"..util.LQ("luarocks.loader")..") _=k " .. + "and l.add_context("..util.LQ(name)..","..util.LQ(version)..")" + table.insert(luainit, addctx) + end + + local argv = { + fs.Q(dir.path(cfg.variables["LUA_BINDIR"], cfg.lua_interpreter)), + file and fs.Q(file) or "", + ... + } + wrapper:write("#!/bin/sh\n\n") - local lua = dir.path(cfg.variables["LUA_BINDIR"], cfg.lua_interpreter) - local ppaths = "package.path="..util.LQ(lpath..";").."..package.path; package.cpath="..util.LQ(lcpath..";").."..package.cpath" - local addctx = "local k,l,_=pcall(require,"..util.LQ("luarocks.loader")..") _=k and l.add_context("..util.LQ(name)..","..util.LQ(version)..")" - wrapper:write('exec '..fs.Q(lua)..' -e '..fs.Q(ppaths)..' -e '..fs.Q(addctx)..' '..fs.Q(file)..' "$@"\n') + wrapper:write("LUA_INIT="..fs.Q(table.concat(luainit, ";")).." exec "..table.concat(argv, " ")..' "$@"\n') wrapper:close() + if fs.set_permissions(wrapname, "exec", "user") then return true else diff --git a/src/luarocks/fs/win32.lua b/src/luarocks/fs/win32.lua index c2331cad..bf133448 100644 --- a/src/luarocks/fs/win32.lua +++ b/src/luarocks/fs/win32.lua @@ -133,26 +133,50 @@ end -- @param version string: rock version to be used in loader context. -- @return boolean or (nil, string): True if succeeded, or nil and -- an error message. -function win32.wrap_script(file, dest, name, version) - assert(type(file) == "string") +function win32.wrap_script(file, dest, name, version, ...) + assert(type(file) == "string" or not file) assert(type(dest) == "string") + assert(type(name) == "string" or not name) + assert(type(version) == "string" or not version) - local base = dir.base_name(file) - local wrapname = fs.is_dir(dest) and dest.."/"..base or dest + local wrapname = fs.is_dir(dest) and dest.."/"..dir.base_name(file) or dest wrapname = wrapname..".bat" - local lpath, lcpath = cfg.package_paths() - lpath = util.cleanup_path(lpath, ";", cfg.lua_version) - lcpath = util.cleanup_path(lcpath, ";", cfg.lua_version) local wrapper = io.open(wrapname, "w") if not wrapper then return nil, "Could not open "..wrapname.." for writing." end - wrapper:write("@echo off\n") - local lua = dir.path(cfg.variables["LUA_BINDIR"], cfg.lua_interpreter) - local ppaths = "package.path="..util.LQ(lpath..";").."..package.path; package.cpath="..util.LQ(lcpath..";").."..package.cpath" - local addctx = "local k,l,_=pcall(require,"..util.LQ("luarocks.loader")..") _=k and l.add_context("..util.LQ(name)..","..util.LQ(version)..")" - wrapper:write(fs.Qb(lua)..' -e '..fs.Qb(ppaths)..' -e '..fs.Qb(addctx)..' '..fs.Qb(file)..' %*\n') - wrapper:write("exit /b %ERRORLEVEL%\n") + + local lpath, lcpath = cfg.package_paths(cfg.root_dir) + lpath = util.cleanup_path(lpath, ";", cfg.lua_version) + lcpath = util.cleanup_path(lcpath, ";", cfg.lua_version) + + local lpath_var, lcpath_var = util.lua_path_variables() + + local addctx + if name and version then + addctx = "local k,l,_=pcall(require,'luarocks.loader') _=k " .. + "and l.add_context('"..name.."','"..version.."')" + end + + local argv = { + fs.Qb(dir.path(cfg.variables["LUA_BINDIR"], cfg.lua_interpreter)), + file and fs.Qb(file) or "", + ... + } + + wrapper:write("@echo off\r\n") + if dest == "luarocks" then + wrapper:write("set "..fs.Qb(lpath_var.."="..package.path) .. "\r\n") + wrapper:write("set "..fs.Qb(lcpath_var.."="..package.cpath) .. "\r\n") + else + wrapper:write("set "..fs.Qb(lpath_var.."="..lpath..";%"..lpath_var.."%") .. "\r\n") + wrapper:write("set "..fs.Qb(lcpath_var.."="..lcpath..";%"..lcpath_var.."%") .. "\r\n") + end + if addctx then + wrapper:write("set "..fs.Qb("LUA_INIT=" .. addctx) .. "\r\n") + end + wrapper:write(table.concat(argv, " ") .. " %*\r\n") + wrapper:write("exit /b %ERRORLEVEL%\r\n") wrapper:close() return true end diff --git a/src/luarocks/util.lua b/src/luarocks/util.lua index ff36aa50..64765a43 100644 --- a/src/luarocks/util.lua +++ b/src/luarocks/util.lua @@ -318,6 +318,23 @@ function util.lua_versions() end end +function util.lua_path_variables() + local cfg = require("luarocks.core.cfg") + local lpath_var = "LUA_PATH" + local lcpath_var = "LUA_CPATH" + + local lv = cfg.lua_version:gsub("%.", "_") + if lv ~= "5_1" then + if os.getenv("LUA_PATH_" .. lv) then + lpath_var = "LUA_PATH_" .. lv + end + if os.getenv("LUA_CPATH_" .. lv) then + lcpath_var = "LUA_CPATH_" .. lv + end + end + return lpath_var, lcpath_var +end + function util.starts_with(s, prefix) return s:sub(1,#prefix) == prefix end -- cgit v1.2.3-55-g6feb