From f728b1b2118cdf66a1e17778d49fe8b1b3648041 Mon Sep 17 00:00:00 2001 From: Hisham Muhammad Date: Mon, 14 Oct 2013 11:32:30 -0300 Subject: Improved quoting in script wrappers. Add util.LQ function for Lua quoting. As discussed in #154. --- src/luarocks/fs/unix.lua | 7 ++++--- src/luarocks/fs/win32.lua | 7 ++++--- src/luarocks/util.lua | 9 ++++++--- 3 files changed, 14 insertions(+), 9 deletions(-) diff --git a/src/luarocks/fs/unix.lua b/src/luarocks/fs/unix.lua index e154ef45..9dc3b6a6 100644 --- a/src/luarocks/fs/unix.lua +++ b/src/luarocks/fs/unix.lua @@ -54,14 +54,15 @@ function wrap_script(file, dest, name, version) local base = dir.base_name(file) local wrapname = fs.is_dir(dest) and dest.."/"..base or dest local lpath, lcpath = cfg.package_paths() - lpath = util.escape_doublebrackets(lpath) - lcpath = util.escape_doublebrackets(lcpath) local wrapper = io.open(wrapname, "w") if not wrapper then return nil, "Could not open "..wrapname.." for writing." end wrapper:write("#!/bin/sh\n\n") - wrapper:write('exec "'..dir.path(cfg.variables["LUA_BINDIR"], cfg.lua_interpreter)..'" -e \'package.path=[['..lpath..';]]..package.path\' -e \'package.cpath=[['..lcpath..';]]..package.cpath\' -lluarocks.loader -e\'luarocks.loader.add_context([['..name..']],[['..version..']])\' "'..file..'" "$@"\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 = "luarocks.loader.add_context("..util.LQ(name)..","..util.LQ(version)..")" + wrapper:write('exec '..fs.Q(lua)..' -e '..fs.Q(ppaths)..' -lluarocks.loader -e '..fs.Q(addctx)..' '..fs.Q(file)..' "$@"\n') wrapper:close() if fs.chmod(wrapname, "0755") then return true diff --git a/src/luarocks/fs/win32.lua b/src/luarocks/fs/win32.lua index ba3ba2b3..4a105e8d 100644 --- a/src/luarocks/fs/win32.lua +++ b/src/luarocks/fs/win32.lua @@ -65,14 +65,15 @@ function wrap_script(file, dest, name, version) local wrapname = fs.is_dir(dest) and dest.."/"..base or dest wrapname = wrapname..".bat" local lpath, lcpath = cfg.package_paths() - lpath = util.escape_doublebrackets(lpath) - lcpath = util.escape_doublebrackets(lcpath) local wrapper = io.open(wrapname, "w") if not wrapper then return nil, "Could not open "..wrapname.." for writing." end wrapper:write("@echo off\n") - wrapper:write('"'..dir.path(cfg.variables["LUA_BINDIR"], cfg.lua_interpreter)..'" -e "package.path=[['..lpath..';]]..package.path" -e "package.cpath=[['..lcpath..';]]..package.cpath" -lluarocks.loader -e"luarocks.loader.add_context([['..name..']],[['..version..']])" "'..file..'" %*\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 = "luarocks.loader.add_context("..util.LQ(name)..","..util.LQ(version)..")" + wrapper:write(fs.Q(lua)..' -e '..fs.Q(ppaths)..' -lluarocks.loader -e '..fs.Q(addctx)..' '..fs.Q(file)..' %*\n') wrapper:close() return true end diff --git a/src/luarocks/util.lua b/src/luarocks/util.lua index cfcd2013..1a60fd9c 100644 --- a/src/luarocks/util.lua +++ b/src/luarocks/util.lua @@ -512,6 +512,9 @@ function array_contains(tbl, value) return false end -function escape_doublebrackets(s) - return s:gsub("(([%[%]])%2)","]]..'%1'..[[") -end \ No newline at end of file +-- Quote Lua string, analogous to fs.Q. +-- @param s A string, such as "hello" +-- @return string: A quoted string, such as '"hello"' +function LQ(s) + return ("%q"):format(s) +end -- cgit v1.2.3-55-g6feb