summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHisham Muhammad <hisham@gobolinux.org>2019-03-14 22:01:53 -0300
committerHisham Muhammad <hisham@gobolinux.org>2019-03-15 19:45:26 -0300
commite4315e0511ecce37d7848dc4ffe11b59b778256a (patch)
tree39c2c9ae3d79cc59cf6cb50e0857d114b5b6f426
parent6d7723a48093eb49b17fd1e5eb3653b9c20461b7 (diff)
downloadluarocks-e4315e0511ecce37d7848dc4ffe11b59b778256a.tar.gz
luarocks-e4315e0511ecce37d7848dc4ffe11b59b778256a.tar.bz2
luarocks-e4315e0511ecce37d7848dc4ffe11b59b778256a.zip
core.cfg: produce quoted values in tool variables for Windows
Alternative solution to the problem described in #968. We can't use #968 because on Unix sometimes people set the value of those variables so they include arguments (even LuaRocks does it by default, setting `UNZIP="unzip -n"`). Now that the variables are quoted, we stop auto-quoting them in `luarocks.fs`. I expect this change to have to practical impact on Unix, where paths with spaces are uncommon (those can use explicit quotes in their values).
-rw-r--r--src/luarocks/core/cfg.lua2
-rw-r--r--src/luarocks/fs/tools.lua10
-rw-r--r--src/luarocks/fs/win32/tools.lua28
-rw-r--r--src/luarocks/upload/api.lua2
4 files changed, 21 insertions, 21 deletions
diff --git a/src/luarocks/core/cfg.lua b/src/luarocks/core/cfg.lua
index 75075792..5cfa10c3 100644
--- a/src/luarocks/core/cfg.lua
+++ b/src/luarocks/core/cfg.lua
@@ -720,7 +720,7 @@ function cfg.init(lua_data, project_dir, warning)
720 if platforms.windows and hardcoded.WIN_TOOLS then 720 if platforms.windows and hardcoded.WIN_TOOLS then
721 local tools = { "SEVENZ", "CP", "FIND", "LS", "MD5SUM", "PWD", "RMDIR", "TEST", "WGET", "MKDIR" } 721 local tools = { "SEVENZ", "CP", "FIND", "LS", "MD5SUM", "PWD", "RMDIR", "TEST", "WGET", "MKDIR" }
722 for _, tool in ipairs(tools) do 722 for _, tool in ipairs(tools) do
723 defaults.variables[tool] = hardcoded.WIN_TOOLS .. "/" .. defaults.variables[tool] .. ".exe" 723 defaults.variables[tool] = '"' .. hardcoded.WIN_TOOLS .. "/" .. defaults.variables[tool] .. '.exe"'
724 end 724 end
725 else 725 else
726 defaults.fs_use_modules = true 726 defaults.fs_use_modules = true
diff --git a/src/luarocks/fs/tools.lua b/src/luarocks/fs/tools.lua
index 691d670e..52915781 100644
--- a/src/luarocks/fs/tools.lua
+++ b/src/luarocks/fs/tools.lua
@@ -39,7 +39,7 @@ do
39 if not tool then 39 if not tool then
40 return nil 40 return nil
41 end 41 end
42 return tool.name, fs.Q(vars[tool.var]) .. (tool.cmdarg and " "..tool.cmdarg or "") 42 return tool.name, vars[tool.var] .. (tool.cmdarg and " "..tool.cmdarg or "")
43 end 43 end
44end 44end
45 45
@@ -51,7 +51,7 @@ do
51 function tools.current_dir() 51 function tools.current_dir()
52 local current = cache_pwd 52 local current = cache_pwd
53 if not current then 53 if not current then
54 local pipe = io.popen(fs.quiet_stderr(fs.Q(vars.PWD))) 54 local pipe = io.popen(fs.quiet_stderr(vars.PWD))
55 current = pipe:read("*l") 55 current = pipe:read("*l")
56 pipe:close() 56 pipe:close()
57 cache_pwd = current 57 cache_pwd = current
@@ -118,7 +118,7 @@ end
118-- @param at string: directory to list 118-- @param at string: directory to list
119-- @return nil 119-- @return nil
120function tools.dir_iterator(at) 120function tools.dir_iterator(at)
121 local pipe = io.popen(fs.command_at(at, fs.Q(vars.LS), true)) 121 local pipe = io.popen(fs.command_at(at, vars.LS, true))
122 for file in pipe:lines() do 122 for file in pipe:lines() do
123 if file ~= "." and file ~= ".." then 123 if file ~= "." and file ~= ".." then
124 coroutine.yield(file) 124 coroutine.yield(file)
@@ -147,7 +147,7 @@ function tools.use_downloader(url, filename, cache)
147 147
148 local ok 148 local ok
149 if downloader == "wget" then 149 if downloader == "wget" then
150 local wget_cmd = fs.Q(vars.WGET).." "..vars.WGETNOCERTFLAG.." --no-cache --user-agent=\""..cfg.user_agent.." via wget\" --quiet " 150 local wget_cmd = vars.WGET.." "..vars.WGETNOCERTFLAG.." --no-cache --user-agent=\""..cfg.user_agent.." via wget\" --quiet "
151 if cfg.connection_timeout and cfg.connection_timeout > 0 then 151 if cfg.connection_timeout and cfg.connection_timeout > 0 then
152 wget_cmd = wget_cmd .. "--timeout="..tostring(cfg.connection_timeout).." --tries=1 " 152 wget_cmd = wget_cmd .. "--timeout="..tostring(cfg.connection_timeout).." --tries=1 "
153 end 153 end
@@ -163,7 +163,7 @@ function tools.use_downloader(url, filename, cache)
163 ok = fs.execute_quiet(wget_cmd, url) 163 ok = fs.execute_quiet(wget_cmd, url)
164 end 164 end
165 elseif downloader == "curl" then 165 elseif downloader == "curl" then
166 local curl_cmd = fs.Q(vars.CURL).." "..vars.CURLNOCERTFLAG.." -f -L --user-agent \""..cfg.user_agent.." via curl\" " 166 local curl_cmd = vars.CURL.." "..vars.CURLNOCERTFLAG.." -f -L --user-agent \""..cfg.user_agent.." via curl\" "
167 if cfg.connection_timeout and cfg.connection_timeout > 0 then 167 if cfg.connection_timeout and cfg.connection_timeout > 0 then
168 curl_cmd = curl_cmd .. "--connect-timeout "..tostring(cfg.connection_timeout).." " 168 curl_cmd = curl_cmd .. "--connect-timeout "..tostring(cfg.connection_timeout).." "
169 end 169 end
diff --git a/src/luarocks/fs/win32/tools.lua b/src/luarocks/fs/win32/tools.lua
index 0fd73205..77e962eb 100644
--- a/src/luarocks/fs/win32/tools.lua
+++ b/src/luarocks/fs/win32/tools.lua
@@ -36,7 +36,7 @@ end
36function tools.make_dir(directory) 36function tools.make_dir(directory)
37 assert(directory) 37 assert(directory)
38 directory = dir.normalize(directory) 38 directory = dir.normalize(directory)
39 fs.execute_quiet(fs.Q(vars.MKDIR).." -p ", directory) 39 fs.execute_quiet(vars.MKDIR.." -p ", directory)
40 if not fs.is_dir(directory) then 40 if not fs.is_dir(directory) then
41 return false, "failed making directory "..directory 41 return false, "failed making directory "..directory
42 end 42 end
@@ -49,7 +49,7 @@ end
49-- @param directory string: pathname of directory to remove. 49-- @param directory string: pathname of directory to remove.
50function tools.remove_dir_if_empty(directory) 50function tools.remove_dir_if_empty(directory)
51 assert(directory) 51 assert(directory)
52 fs.execute_quiet(fs.Q(vars.RMDIR), directory) 52 fs.execute_quiet(vars.RMDIR, directory)
53end 53end
54 54
55--- Remove a directory if it is empty. 55--- Remove a directory if it is empty.
@@ -58,7 +58,7 @@ end
58-- @param directory string: pathname of directory to remove. 58-- @param directory string: pathname of directory to remove.
59function tools.remove_dir_tree_if_empty(directory) 59function tools.remove_dir_tree_if_empty(directory)
60 assert(directory) 60 assert(directory)
61 fs.execute_quiet(fs.Q(vars.RMDIR), directory) 61 fs.execute_quiet(vars.RMDIR, directory)
62end 62end
63 63
64--- Copy a file. 64--- Copy a file.
@@ -69,7 +69,7 @@ end
69function tools.copy(src, dest) 69function tools.copy(src, dest)
70 assert(src and dest) 70 assert(src and dest)
71 if dest:match("[/\\]$") then dest = dest:sub(1, -2) end 71 if dest:match("[/\\]$") then dest = dest:sub(1, -2) end
72 local ok = fs.execute(fs.Q(vars.CP), src, dest) 72 local ok = fs.execute(vars.CP, src, dest)
73 if ok then 73 if ok then
74 return true 74 return true
75 else 75 else
@@ -87,7 +87,7 @@ function tools.copy_contents(src, dest)
87 if not fs.is_dir(src) then 87 if not fs.is_dir(src) then
88 return false, src .. " is not a directory" 88 return false, src .. " is not a directory"
89 end 89 end
90 if fs.make_dir(dest) and fs.execute_quiet(fs.Q(vars.CP), "-dR", src.."\\*.*", dest) then 90 if fs.make_dir(dest) and fs.execute_quiet(vars.CP, "-dR", src.."\\*.*", dest) then
91 return true 91 return true
92 else 92 else
93 return false, "Failed copying "..src.." to "..dest 93 return false, "Failed copying "..src.." to "..dest
@@ -118,7 +118,7 @@ function tools.find(at)
118 return {} 118 return {}
119 end 119 end
120 local result = {} 120 local result = {}
121 local pipe = io.popen(fs.command_at(at, fs.quiet_stderr(fs.Q(vars.FIND)), true)) 121 local pipe = io.popen(fs.command_at(at, fs.quiet_stderr(vars.FIND), true))
122 for file in pipe:lines() do 122 for file in pipe:lines() do
123 -- Windows find is a bit different 123 -- Windows find is a bit different
124 local first_two = file:sub(1,2) 124 local first_two = file:sub(1,2)
@@ -137,7 +137,7 @@ end
137-- additional arguments. 137-- additional arguments.
138-- @return boolean: true on success, nil and error message on failure. 138-- @return boolean: true on success, nil and error message on failure.
139function tools.zip(zipfile, ...) 139function tools.zip(zipfile, ...)
140 if fs.execute_quiet(fs.Q(vars.SEVENZ).." -aoa a -tzip", zipfile, ...) then 140 if fs.execute_quiet(vars.SEVENZ.." -aoa a -tzip", zipfile, ...) then
141 return true 141 return true
142 else 142 else
143 return nil, "failed compressing " .. zipfile 143 return nil, "failed compressing " .. zipfile
@@ -149,7 +149,7 @@ end
149-- @return boolean: true on success, nil and error message on failure. 149-- @return boolean: true on success, nil and error message on failure.
150function tools.unzip(zipfile) 150function tools.unzip(zipfile)
151 assert(zipfile) 151 assert(zipfile)
152 if fs.execute_quiet(fs.Q(vars.SEVENZ).." -aoa x", zipfile) then 152 if fs.execute_quiet(vars.SEVENZ.." -aoa x", zipfile) then
153 return true 153 return true
154 else 154 else
155 return nil, "failed extracting " .. zipfile 155 return nil, "failed extracting " .. zipfile
@@ -165,7 +165,7 @@ local function sevenz(default_ext, infile, outfile)
165 165
166 infile = fs.absolute_name(infile) 166 infile = fs.absolute_name(infile)
167 167
168 local cmdline = fs.Q(vars.SEVENZ).." -aoa -t* -o"..fs.Q(outdir).." x "..fs.Q(infile) 168 local cmdline = vars.SEVENZ.." -aoa -t* -o"..fs.Q(outdir).." x "..fs.Q(infile)
169 local ok, err = fs.execute_quiet(cmdline) 169 local ok, err = fs.execute_quiet(cmdline)
170 if not ok then 170 if not ok then
171 return nil, "failed extracting " .. infile 171 return nil, "failed extracting " .. infile
@@ -214,7 +214,7 @@ end
214-- @return boolean: true if it is a regular file, false otherwise. 214-- @return boolean: true if it is a regular file, false otherwise.
215function tools.is_file(file) 215function tools.is_file(file)
216 assert(file) 216 assert(file)
217 return fs.execute(fs.Q(vars.TEST).." -f", file) 217 return fs.execute(vars.TEST.." -f", file)
218end 218end
219 219
220--- Helper function for fs.set_permissions 220--- Helper function for fs.set_permissions
@@ -255,13 +255,13 @@ function tools.set_permissions(filename, mode, scope)
255 return false, "Could not take ownership of the given file" 255 return false, "Could not take ownership of the given file"
256 end 256 end
257 -- Grant the current user the proper rights 257 -- Grant the current user the proper rights
258 ok = fs.execute_quiet(fs.Q(vars.ICACLS) .. " " .. fs.Q(filename) .. " /inheritance:d /grant:r %USERNAME%:" .. perms) 258 ok = fs.execute_quiet(vars.ICACLS .. " " .. fs.Q(filename) .. " /inheritance:d /grant:r %USERNAME%:" .. perms)
259 if not ok then 259 if not ok then
260 return false, "Failed setting permission " .. mode .. " for " .. scope 260 return false, "Failed setting permission " .. mode .. " for " .. scope
261 end 261 end
262 -- Finally, remove all the other users from the ACL in order to deny them access to the file 262 -- Finally, remove all the other users from the ACL in order to deny them access to the file
263 for _, user in pairs(get_system_users()) do 263 for _, user in pairs(get_system_users()) do
264 local ok = fs.execute_quiet(fs.Q(vars.ICACLS) .. " " .. fs.Q(filename) .. " /remove " .. fs.Q(user)) 264 local ok = fs.execute_quiet(vars.ICACLS .. " " .. fs.Q(filename) .. " /remove " .. fs.Q(user))
265 if not ok then 265 if not ok then
266 return false, "Failed setting permission " .. mode .. " for " .. scope 266 return false, "Failed setting permission " .. mode .. " for " .. scope
267 end 267 end
@@ -278,12 +278,12 @@ function tools.set_permissions(filename, mode, scope)
278 278
279 local ok 279 local ok
280 -- Grant permissions available to all users 280 -- Grant permissions available to all users
281 ok = fs.execute_quiet(fs.Q(vars.ICACLS) .. " " .. fs.Q(filename) .. " /inheritance:d /grant:r *S-1-1-0:" .. others_perms) 281 ok = fs.execute_quiet(vars.ICACLS .. " " .. fs.Q(filename) .. " /inheritance:d /grant:r *S-1-1-0:" .. others_perms)
282 if not ok then 282 if not ok then
283 return false, "Failed setting permission " .. mode .. " for " .. scope 283 return false, "Failed setting permission " .. mode .. " for " .. scope
284 end 284 end
285 -- Grant permissions available only to the current user 285 -- Grant permissions available only to the current user
286 ok = fs.execute_quiet(fs.Q(vars.ICACLS) .. " " .. fs.Q(filename) .. " /inheritance:d /grant %USERNAME%:" .. my_perms) 286 ok = fs.execute_quiet(vars.ICACLS .. " " .. fs.Q(filename) .. " /inheritance:d /grant %USERNAME%:" .. my_perms)
287 if not ok then 287 if not ok then
288 return false, "Failed setting permission " .. mode .. " for " .. scope 288 return false, "Failed setting permission " .. mode .. " for " .. scope
289 end 289 end
diff --git a/src/luarocks/upload/api.lua b/src/luarocks/upload/api.lua
index bf83faf6..dd0f1309 100644
--- a/src/luarocks/upload/api.lua
+++ b/src/luarocks/upload/api.lua
@@ -140,7 +140,7 @@ function Api:request(url, params, post_params)
140 local tmpfile = fs.tmpname() 140 local tmpfile = fs.tmpname()
141 if post_params then 141 if post_params then
142 method = "POST" 142 method = "POST"
143 local curl_cmd = fs.Q(vars.CURL).." -f -k -L --silent --user-agent \""..cfg.user_agent.." via curl\" " 143 local curl_cmd = vars.CURL.." -f -k -L --silent --user-agent \""..cfg.user_agent.." via curl\" "
144 for k,v in pairs(post_params) do 144 for k,v in pairs(post_params) do
145 local var = v 145 local var = v
146 if type(v) == "table" then 146 if type(v) == "table" then