diff options
| author | Hisham Muhammad <hisham@gobolinux.org> | 2011-08-14 14:50:10 -0300 |
|---|---|---|
| committer | Hisham Muhammad <hisham@gobolinux.org> | 2011-08-14 14:50:10 -0300 |
| commit | 4724492df402089b0529c3ef7cb4fd240cbb5ed0 (patch) | |
| tree | 156108d0960653cc06cc1b7a5683c2e56072b66a | |
| parent | 09636127a571086e6e864f0bb9b162cbdd7c8a51 (diff) | |
| download | luarocks-4724492df402089b0529c3ef7cb4fd240cbb5ed0.tar.gz luarocks-4724492df402089b0529c3ef7cb4fd240cbb5ed0.tar.bz2 luarocks-4724492df402089b0529c3ef7cb4fd240cbb5ed0.zip | |
Abstract all external commands so they can be overriden via config.lua
| -rw-r--r-- | src/luarocks/add.lua | 6 | ||||
| -rw-r--r-- | src/luarocks/cache.lua | 4 | ||||
| -rw-r--r-- | src/luarocks/cfg.lua | 50 | ||||
| -rw-r--r-- | src/luarocks/fetch/cvs.lua | 2 | ||||
| -rw-r--r-- | src/luarocks/fetch/git.lua | 5 | ||||
| -rw-r--r-- | src/luarocks/fetch/sscm.lua | 5 | ||||
| -rw-r--r-- | src/luarocks/fetch/svn.lua | 3 | ||||
| -rw-r--r-- | src/luarocks/fs/unix/tools.lua | 73 | ||||
| -rw-r--r-- | src/luarocks/fs/win32/tools.lua | 57 |
9 files changed, 121 insertions, 84 deletions
diff --git a/src/luarocks/add.lua b/src/luarocks/add.lua index 92b5ac4b..6edfea35 100644 --- a/src/luarocks/add.lua +++ b/src/luarocks/add.lua | |||
| @@ -81,12 +81,12 @@ local function add_files_to_server(refresh, rockfiles, server, upload_server) | |||
| 81 | local cmd | 81 | local cmd |
| 82 | if protocol == "rsync" then | 82 | if protocol == "rsync" then |
| 83 | local srv, path = server_path:match("([^/]+)(/.+)") | 83 | local srv, path = server_path:match("([^/]+)(/.+)") |
| 84 | cmd = "rsync --exclude=.git -Oavz -e ssh "..local_cache.."/ "..user.."@"..srv..":"..path.."/" | 84 | cmd = cfg.variables.RSYNC.." --exclude=.git -Oavz -e ssh "..local_cache.."/ "..user.."@"..srv..":"..path.."/" |
| 85 | elseif upload_server and upload_server.sftp then | 85 | elseif upload_server and upload_server.sftp then |
| 86 | local part1, part2 = upload_server.sftp:match("^([^/]*)/(.*)$") | 86 | local part1, part2 = upload_server.sftp:match("^([^/]*)/(.*)$") |
| 87 | cmd = "scp manifest index.html "..table.concat(files, " ").." "..user.."@"..part1..":/"..part2 | 87 | cmd = cfg.variables.SCP.." manifest index.html "..table.concat(files, " ").." "..user.."@"..part1..":/"..part2 |
| 88 | else | 88 | else |
| 89 | cmd = "curl "..login_info.." -T '{manifest,index.html,"..table.concat(files, ",").."}' "..login_url | 89 | cmd = cfg.variables.CURL.." "..login_info.." -T '{manifest,index.html,"..table.concat(files, ",").."}' "..login_url |
| 90 | end | 90 | end |
| 91 | 91 | ||
| 92 | util.printout(cmd) | 92 | util.printout(cmd) |
diff --git a/src/luarocks/cache.lua b/src/luarocks/cache.lua index 692d3346..21185c10 100644 --- a/src/luarocks/cache.lua +++ b/src/luarocks/cache.lua | |||
| @@ -71,12 +71,12 @@ function refresh_local_cache(server, url, user, password) | |||
| 71 | local ok = false | 71 | local ok = false |
| 72 | if protocol == "rsync" then | 72 | if protocol == "rsync" then |
| 73 | local srv, path = server_path:match("([^/]+)(/.+)") | 73 | local srv, path = server_path:match("([^/]+)(/.+)") |
| 74 | ok = fs.execute("rsync -avz -e ssh "..user.."@"..srv..":"..path.."/ "..local_cache.."/") | 74 | ok = fs.execute(cfg.variables.RSYNC.." -avz -e ssh "..user.."@"..srv..":"..path.."/ "..local_cache.."/") |
| 75 | else | 75 | else |
| 76 | local login_info = "" | 76 | local login_info = "" |
| 77 | if user then login_info = " --user="..user end | 77 | if user then login_info = " --user="..user end |
| 78 | if password then login_info = login_info .. " --password="..password end | 78 | if password then login_info = login_info .. " --password="..password end |
| 79 | ok = fs.execute("wget --no-cache -q -m -np -nd "..protocol.."://"..server_path..login_info) | 79 | ok = fs.execute(cfg.variables.WGET.." --no-cache -q -m -np -nd "..protocol.."://"..server_path..login_info) |
| 80 | end | 80 | end |
| 81 | if not ok then | 81 | if not ok then |
| 82 | return nil, "Failed downloading cache." | 82 | return nil, "Failed downloading cache." |
diff --git a/src/luarocks/cfg.lua b/src/luarocks/cfg.lua index ace0dbf1..1abe39cb 100644 --- a/src/luarocks/cfg.lua +++ b/src/luarocks/cfg.lua | |||
| @@ -145,7 +145,47 @@ local defaults = { | |||
| 145 | downloader = config.LUAROCKS_DOWNLOADER or "wget", | 145 | downloader = config.LUAROCKS_DOWNLOADER or "wget", |
| 146 | md5checker = config.LUAROCKS_MD5CHECKER or "md5sum", | 146 | md5checker = config.LUAROCKS_MD5CHECKER or "md5sum", |
| 147 | 147 | ||
| 148 | variables = {}, | 148 | variables = { |
| 149 | MAKE = "make", | ||
| 150 | CC = "cc", | ||
| 151 | LD = "ld", | ||
| 152 | |||
| 153 | CVS = "cvs", | ||
| 154 | GIT = "git", | ||
| 155 | SSCM = "sscm", | ||
| 156 | SVN = "svn", | ||
| 157 | |||
| 158 | RSYNC = "rsync", | ||
| 159 | WGET = "wget", | ||
| 160 | SCP = "scp", | ||
| 161 | CURL = "curl", | ||
| 162 | |||
| 163 | PWD = "pwd", | ||
| 164 | MKDIR = "mkdir", | ||
| 165 | RMDIR = "rmdir", | ||
| 166 | CP = "cp", | ||
| 167 | LS = "ls", | ||
| 168 | RM = "rm", | ||
| 169 | FIND = "find", | ||
| 170 | TEST = "test", | ||
| 171 | CHMOD = "chmod", | ||
| 172 | PATCH = "patch", | ||
| 173 | |||
| 174 | ZIP = "zip", | ||
| 175 | UNZIP = "unzip", | ||
| 176 | GUNZIP = "gunzip", | ||
| 177 | BUNZIP2 = "bunzip2", | ||
| 178 | TAR = "tar", | ||
| 179 | |||
| 180 | MD5SUM = "md5sum", | ||
| 181 | OPENSSL = "openssl", | ||
| 182 | MD5 = "md5", | ||
| 183 | STAT = "stat", | ||
| 184 | |||
| 185 | SEVENZ = "7z", | ||
| 186 | |||
| 187 | STATFLAG = "-c '%a'", | ||
| 188 | }, | ||
| 149 | 189 | ||
| 150 | external_deps_subdirs = { | 190 | external_deps_subdirs = { |
| 151 | bin = "bin", | 191 | bin = "bin", |
| @@ -241,9 +281,6 @@ if detected.unix then | |||
| 241 | defaults.variables.CFLAGS = "-O2" | 281 | defaults.variables.CFLAGS = "-O2" |
| 242 | defaults.cmake_generator = "Unix Makefiles" | 282 | defaults.cmake_generator = "Unix Makefiles" |
| 243 | defaults.platforms = { "unix" } | 283 | defaults.platforms = { "unix" } |
| 244 | defaults.variables.MAKE = "make" | ||
| 245 | defaults.variables.CC = "cc" | ||
| 246 | defaults.variables.LD = "ld" | ||
| 247 | defaults.variables.LIBFLAG = "-shared" | 284 | defaults.variables.LIBFLAG = "-shared" |
| 248 | defaults.external_deps_patterns = { | 285 | defaults.external_deps_patterns = { |
| 249 | bin = { "?" }, | 286 | bin = { "?" }, |
| @@ -282,6 +319,10 @@ if detected.macosx then | |||
| 282 | defaults.variables.LIBFLAG = "-bundle -undefined dynamic_lookup -all_load" | 319 | defaults.variables.LIBFLAG = "-bundle -undefined dynamic_lookup -all_load" |
| 283 | end | 320 | end |
| 284 | 321 | ||
| 322 | if detected.bsd then | ||
| 323 | defaults.variables.STATFLAG = "-f '%A'" | ||
| 324 | end | ||
| 325 | |||
| 285 | if detected.linux then | 326 | if detected.linux then |
| 286 | defaults.arch = "linux-"..proc | 327 | defaults.arch = "linux-"..proc |
| 287 | defaults.platforms = {"unix", "linux"} | 328 | defaults.platforms = {"unix", "linux"} |
| @@ -302,6 +343,7 @@ end | |||
| 302 | if detected.openbsd then | 343 | if detected.openbsd then |
| 303 | defaults.arch = "openbsd-"..proc | 344 | defaults.arch = "openbsd-"..proc |
| 304 | defaults.platforms = {"unix", "bsd", "openbsd"} | 345 | defaults.platforms = {"unix", "bsd", "openbsd"} |
| 346 | defaults.variables.STATFLAG = "-f '%Op'" | ||
| 305 | end | 347 | end |
| 306 | 348 | ||
| 307 | -- Expose some more values detected by LuaRocks for use by rockspec authors. | 349 | -- Expose some more values detected by LuaRocks for use by rockspec authors. |
diff --git a/src/luarocks/fetch/cvs.lua b/src/luarocks/fetch/cvs.lua index c2957c09..a622cdcb 100644 --- a/src/luarocks/fetch/cvs.lua +++ b/src/luarocks/fetch/cvs.lua | |||
| @@ -19,7 +19,7 @@ function get_sources(rockspec, extract, dest_dir) | |||
| 19 | 19 | ||
| 20 | local name_version = rockspec.name .. "-" .. rockspec.version | 20 | local name_version = rockspec.name .. "-" .. rockspec.version |
| 21 | local module = rockspec.source.module or dir.base_name(rockspec.source.url) | 21 | local module = rockspec.source.module or dir.base_name(rockspec.source.url) |
| 22 | local command = {"cvs", "-d"..rockspec.source.pathname, "export", module} | 22 | local command = {rockspec.variables.CVS, "-d"..rockspec.source.pathname, "export", module} |
| 23 | if rockspec.source.tag then | 23 | if rockspec.source.tag then |
| 24 | table.insert(command, 4, "-r") | 24 | table.insert(command, 4, "-r") |
| 25 | table.insert(command, 5, rockspec.source.tag) | 25 | table.insert(command, 5, rockspec.source.tag) |
diff --git a/src/luarocks/fetch/git.lua b/src/luarocks/fetch/git.lua index a3b763d6..7db74c26 100644 --- a/src/luarocks/fetch/git.lua +++ b/src/luarocks/fetch/git.lua | |||
| @@ -17,15 +17,16 @@ function get_sources(rockspec, extract, dest_dir) | |||
| 17 | assert(type(rockspec) == "table") | 17 | assert(type(rockspec) == "table") |
| 18 | assert(type(dest_dir) == "string" or not dest_dir) | 18 | assert(type(dest_dir) == "string" or not dest_dir) |
| 19 | 19 | ||
| 20 | local git_cmd = rockspec.variables.GIT | ||
| 20 | local name_version = rockspec.name .. "-" .. rockspec.version | 21 | local name_version = rockspec.name .. "-" .. rockspec.version |
| 21 | local module = dir.base_name(rockspec.source.url) | 22 | local module = dir.base_name(rockspec.source.url) |
| 22 | -- Strip off .git from base name if present | 23 | -- Strip off .git from base name if present |
| 23 | module = module:gsub("%.git$", "") | 24 | module = module:gsub("%.git$", "") |
| 24 | local command = {"git", "clone", "--depth=1", rockspec.source.url, module} | 25 | local command = {git_cmd, "clone", "--depth=1", rockspec.source.url, module} |
| 25 | local checkout_command | 26 | local checkout_command |
| 26 | local tag_or_branch = rockspec.source.tag or rockspec.source.branch | 27 | local tag_or_branch = rockspec.source.tag or rockspec.source.branch |
| 27 | if tag_or_branch then | 28 | if tag_or_branch then |
| 28 | checkout_command = {"git", "checkout", tag_or_branch} | 29 | checkout_command = {git_cmd, "checkout", tag_or_branch} |
| 29 | end | 30 | end |
| 30 | local store_dir | 31 | local store_dir |
| 31 | if not dest_dir then | 32 | if not dest_dir then |
diff --git a/src/luarocks/fetch/sscm.lua b/src/luarocks/fetch/sscm.lua index 539014c2..e52e8019 100644 --- a/src/luarocks/fetch/sscm.lua +++ b/src/luarocks/fetch/sscm.lua | |||
| @@ -16,6 +16,7 @@ function get_sources(rockspec, extract, dest_dir) | |||
| 16 | assert(type(rockspec) == "table") | 16 | assert(type(rockspec) == "table") |
| 17 | assert(type(dest_dir) == "string" or not dest_dir) | 17 | assert(type(dest_dir) == "string" or not dest_dir) |
| 18 | 18 | ||
| 19 | local sscm_cmd = rockspec.variables.SSCM | ||
| 19 | local module = rockspec.source.module or dir.base_name(rockspec.source.url) | 20 | local module = rockspec.source.module or dir.base_name(rockspec.source.url) |
| 20 | local branch, repository = string.match(rockspec.source.pathname, "^([^/]*)/(.*)") | 21 | local branch, repository = string.match(rockspec.source.pathname, "^([^/]*)/(.*)") |
| 21 | if not branch or not repository then | 22 | if not branch or not repository then |
| @@ -23,7 +24,7 @@ function get_sources(rockspec, extract, dest_dir) | |||
| 23 | end | 24 | end |
| 24 | -- Search for working directory. | 25 | -- Search for working directory. |
| 25 | local working_dir | 26 | local working_dir |
| 26 | local tmp = io.popen(string.format([[sscm property "/" -d -b%s -p%s]], branch, repository)) | 27 | local tmp = io.popen(string.format(sscm_cmd..[[ property "/" -d -b%s -p%s]], branch, repository)) |
| 27 | for line in tmp:lines() do | 28 | for line in tmp:lines() do |
| 28 | --%c because a chr(13) comes in the end. | 29 | --%c because a chr(13) comes in the end. |
| 29 | working_dir = string.match(line, "Working directory:[%s]*(.*)%c$") | 30 | working_dir = string.match(line, "Working directory:[%s]*(.*)%c$") |
| @@ -33,7 +34,7 @@ function get_sources(rockspec, extract, dest_dir) | |||
| 33 | if not working_dir then | 34 | if not working_dir then |
| 34 | return nil, "Error retrieving working directory from SSCM." | 35 | return nil, "Error retrieving working directory from SSCM." |
| 35 | end | 36 | end |
| 36 | if not fs.execute([["sscm"]], "get", "*", "-e" , "-r", "-b"..branch, "-p"..repository, "-tmodify", "-wreplace") then | 37 | if not fs.execute(sscm_cmd, "get", "*", "-e" , "-r", "-b"..branch, "-p"..repository, "-tmodify", "-wreplace") then |
| 37 | return nil, "Failed fetching files from SSCM." | 38 | return nil, "Failed fetching files from SSCM." |
| 38 | end | 39 | end |
| 39 | -- FIXME: This function does not honor the dest_dir parameter. | 40 | -- FIXME: This function does not honor the dest_dir parameter. |
diff --git a/src/luarocks/fetch/svn.lua b/src/luarocks/fetch/svn.lua index 01ea6ba9..9d00ce5b 100644 --- a/src/luarocks/fetch/svn.lua +++ b/src/luarocks/fetch/svn.lua | |||
| @@ -17,10 +17,11 @@ function get_sources(rockspec, extract, dest_dir) | |||
| 17 | assert(type(rockspec) == "table") | 17 | assert(type(rockspec) == "table") |
| 18 | assert(type(dest_dir) == "string" or not dest_dir) | 18 | assert(type(dest_dir) == "string" or not dest_dir) |
| 19 | 19 | ||
| 20 | local svn_cmd = rockspec.variables.SVN | ||
| 20 | local name_version = rockspec.name .. "-" .. rockspec.version | 21 | local name_version = rockspec.name .. "-" .. rockspec.version |
| 21 | local module = rockspec.source.module or dir.base_name(rockspec.source.url) | 22 | local module = rockspec.source.module or dir.base_name(rockspec.source.url) |
| 22 | local url = rockspec.source.url:gsub("^svn://", "") | 23 | local url = rockspec.source.url:gsub("^svn://", "") |
| 23 | local command = {"svn", "checkout", url, module} | 24 | local command = {svn_cmd, "checkout", url, module} |
| 24 | if rockspec.source.tag then | 25 | if rockspec.source.tag then |
| 25 | table.insert(command, 5, "-r") | 26 | table.insert(command, 5, "-r") |
| 26 | table.insert(command, 6, rockspec.source.tag) | 27 | table.insert(command, 6, rockspec.source.tag) |
diff --git a/src/luarocks/fs/unix/tools.lua b/src/luarocks/fs/unix/tools.lua index 9cd4ca1c..d1722f4b 100644 --- a/src/luarocks/fs/unix/tools.lua +++ b/src/luarocks/fs/unix/tools.lua | |||
| @@ -8,6 +8,8 @@ local cfg = require("luarocks.cfg") | |||
| 8 | 8 | ||
| 9 | local dir_stack = {} | 9 | local dir_stack = {} |
| 10 | 10 | ||
| 11 | local vars = cfg.variables | ||
| 12 | |||
| 11 | --- Run the given command. | 13 | --- Run the given command. |
| 12 | -- The command is executed in the current directory in the dir stack. | 14 | -- The command is executed in the current directory in the dir stack. |
| 13 | -- @param cmd string: No quoting/escaping is applied to the command. | 15 | -- @param cmd string: No quoting/escaping is applied to the command. |
| @@ -26,7 +28,7 @@ end | |||
| 26 | -- Uses the module's internal dir stack. | 28 | -- Uses the module's internal dir stack. |
| 27 | -- @return string: the absolute pathname of the current directory. | 29 | -- @return string: the absolute pathname of the current directory. |
| 28 | function current_dir() | 30 | function current_dir() |
| 29 | local pipe = io.popen("pwd") | 31 | local pipe = io.popen(vars.PWD) |
| 30 | local current = pipe:read("*l") | 32 | local current = pipe:read("*l") |
| 31 | pipe:close() | 33 | pipe:close() |
| 32 | for _, d in ipairs(dir_stack) do | 34 | for _, d in ipairs(dir_stack) do |
| @@ -65,7 +67,7 @@ end | |||
| 65 | -- @return boolean: true on success, false on failure. | 67 | -- @return boolean: true on success, false on failure. |
| 66 | function make_dir(d) | 68 | function make_dir(d) |
| 67 | assert(d) | 69 | assert(d) |
| 68 | return fs.execute("mkdir -p", d) | 70 | return fs.execute(vars.MKDIR.." -p", d) |
| 69 | end | 71 | end |
| 70 | 72 | ||
| 71 | --- Remove a directory if it is empty. | 73 | --- Remove a directory if it is empty. |
| @@ -74,7 +76,7 @@ end | |||
| 74 | -- @param dir string: pathname of directory to remove. | 76 | -- @param dir string: pathname of directory to remove. |
| 75 | function remove_dir_if_empty(d) | 77 | function remove_dir_if_empty(d) |
| 76 | assert(d) | 78 | assert(d) |
| 77 | fs.execute_string("rmdir "..fs.Q(d).." 1> /dev/null 2> /dev/null") | 79 | fs.execute_string(vars.RMDIR.." "..fs.Q(d).." 1> /dev/null 2> /dev/null") |
| 78 | end | 80 | end |
| 79 | 81 | ||
| 80 | --- Remove a directory if it is empty. | 82 | --- Remove a directory if it is empty. |
| @@ -83,7 +85,7 @@ end | |||
| 83 | -- @param dir string: pathname of directory to remove. | 85 | -- @param dir string: pathname of directory to remove. |
| 84 | function remove_dir_tree_if_empty(d) | 86 | function remove_dir_tree_if_empty(d) |
| 85 | assert(d) | 87 | assert(d) |
| 86 | fs.execute_string("rmdir -p "..fs.Q(d).." 1> /dev/null 2> /dev/null") | 88 | fs.execute_string(vars.RMDIR.." -p "..fs.Q(d).." 1> /dev/null 2> /dev/null") |
| 87 | end | 89 | end |
| 88 | 90 | ||
| 89 | --- Copy a file. | 91 | --- Copy a file. |
| @@ -93,7 +95,7 @@ end | |||
| 93 | -- plus an error message. | 95 | -- plus an error message. |
| 94 | function copy(src, dest) | 96 | function copy(src, dest) |
| 95 | assert(src and dest) | 97 | assert(src and dest) |
| 96 | if fs.execute("cp", src, dest) then | 98 | if fs.execute(vars.CP, src, dest) then |
| 97 | return true | 99 | return true |
| 98 | else | 100 | else |
| 99 | return false, "Failed copying "..src.." to "..dest | 101 | return false, "Failed copying "..src.." to "..dest |
| @@ -107,7 +109,7 @@ end | |||
| 107 | -- plus an error message. | 109 | -- plus an error message. |
| 108 | function copy_contents(src, dest) | 110 | function copy_contents(src, dest) |
| 109 | assert(src and dest) | 111 | assert(src and dest) |
| 110 | if fs.execute_string("cp -pPR "..fs.Q(src).."/* "..fs.Q(dest).." 1> /dev/null 2>/dev/null") then | 112 | if fs.execute_string(vars.CP.." -pPR "..fs.Q(src).."/* "..fs.Q(dest).." 1> /dev/null 2>/dev/null") then |
| 111 | return true | 113 | return true |
| 112 | else | 114 | else |
| 113 | return false, "Failed copying "..src.." to "..dest | 115 | return false, "Failed copying "..src.." to "..dest |
| @@ -120,7 +122,7 @@ end | |||
| 120 | function delete(arg) | 122 | function delete(arg) |
| 121 | assert(arg) | 123 | assert(arg) |
| 122 | assert(arg:sub(1,1) == "/") | 124 | assert(arg:sub(1,1) == "/") |
| 123 | return fs.execute_string("rm -rf " .. fs.Q(arg) .. " 1> /dev/null 2>/dev/null") | 125 | return fs.execute_string(vars.RM.." -rf " .. fs.Q(arg) .. " 1> /dev/null 2>/dev/null") |
| 124 | end | 126 | end |
| 125 | 127 | ||
| 126 | --- List the contents of a directory. | 128 | --- List the contents of a directory. |
| @@ -137,7 +139,7 @@ function list_dir(at) | |||
| 137 | return {} | 139 | return {} |
| 138 | end | 140 | end |
| 139 | local result = {} | 141 | local result = {} |
| 140 | local pipe = io.popen("cd "..fs.Q(at).." && ls") | 142 | local pipe = io.popen("cd "..fs.Q(at).." && "..vars.LS) |
| 141 | for file in pipe:lines() do | 143 | for file in pipe:lines() do |
| 142 | table.insert(result, file) | 144 | table.insert(result, file) |
| 143 | end | 145 | end |
| @@ -159,7 +161,7 @@ function find(at) | |||
| 159 | return {} | 161 | return {} |
| 160 | end | 162 | end |
| 161 | local result = {} | 163 | local result = {} |
| 162 | local pipe = io.popen("cd "..fs.Q(at).." && find * 2>/dev/null") | 164 | local pipe = io.popen("cd "..fs.Q(at).." && "..vars.FIND.." * 2>/dev/null") |
| 163 | for file in pipe:lines() do | 165 | for file in pipe:lines() do |
| 164 | table.insert(result, file) | 166 | table.insert(result, file) |
| 165 | end | 167 | end |
| @@ -173,7 +175,7 @@ end | |||
| 173 | -- additional arguments. | 175 | -- additional arguments. |
| 174 | -- @return boolean: true on success, false on failure. | 176 | -- @return boolean: true on success, false on failure. |
| 175 | function zip(zipfile, ...) | 177 | function zip(zipfile, ...) |
| 176 | return fs.execute("zip -r", zipfile, ...) | 178 | return fs.execute(vars.ZIP.." -r", zipfile, ...) |
| 177 | end | 179 | end |
| 178 | 180 | ||
| 179 | --- Uncompress files from a .zip archive. | 181 | --- Uncompress files from a .zip archive. |
| @@ -181,7 +183,7 @@ end | |||
| 181 | -- @return boolean: true on success, false on failure. | 183 | -- @return boolean: true on success, false on failure. |
| 182 | function unzip(zipfile) | 184 | function unzip(zipfile) |
| 183 | assert(zipfile) | 185 | assert(zipfile) |
| 184 | return fs.execute("unzip", zipfile) | 186 | return fs.execute(vars.UNZIP, zipfile) |
| 185 | end | 187 | end |
| 186 | 188 | ||
| 187 | --- Test for existance of a file. | 189 | --- Test for existance of a file. |
| @@ -189,7 +191,7 @@ end | |||
| 189 | -- @return boolean: true if file exists, false otherwise. | 191 | -- @return boolean: true if file exists, false otherwise. |
| 190 | function exists(file) | 192 | function exists(file) |
| 191 | assert(file) | 193 | assert(file) |
| 192 | return fs.execute("test -r", file) | 194 | return fs.execute(vars.TEST, "-r", file) |
| 193 | end | 195 | end |
| 194 | 196 | ||
| 195 | --- Test is file/dir is writable. | 197 | --- Test is file/dir is writable. |
| @@ -197,7 +199,7 @@ end | |||
| 197 | -- @return boolean: true if file exists, false otherwise. | 199 | -- @return boolean: true if file exists, false otherwise. |
| 198 | function is_writable(file) | 200 | function is_writable(file) |
| 199 | assert(file) | 201 | assert(file) |
| 200 | return fs.execute("test -w", file) | 202 | return fs.execute(vars.TEST, "-w", file) |
| 201 | end | 203 | end |
| 202 | 204 | ||
| 203 | --- Test is pathname is a directory. | 205 | --- Test is pathname is a directory. |
| @@ -205,7 +207,7 @@ end | |||
| 205 | -- @return boolean: true if it is a directory, false otherwise. | 207 | -- @return boolean: true if it is a directory, false otherwise. |
| 206 | function is_dir(file) | 208 | function is_dir(file) |
| 207 | assert(file) | 209 | assert(file) |
| 208 | return fs.execute("test -d", file) | 210 | return fs.execute(vars.TEST, "-d", file) |
| 209 | end | 211 | end |
| 210 | 212 | ||
| 211 | --- Test is pathname is a regular file. | 213 | --- Test is pathname is a regular file. |
| @@ -213,7 +215,7 @@ end | |||
| 213 | -- @return boolean: true if it is a regular file, false otherwise. | 215 | -- @return boolean: true if it is a regular file, false otherwise. |
| 214 | function is_file(file) | 216 | function is_file(file) |
| 215 | assert(file) | 217 | assert(file) |
| 216 | return fs.execute("test -f", file) | 218 | return fs.execute(vars.TEST, "-f", file) |
| 217 | end | 219 | end |
| 218 | 220 | ||
| 219 | --- Download a remote file. | 221 | --- Download a remote file. |
| @@ -228,7 +230,7 @@ function download(url, filename) | |||
| 228 | assert(type(filename) == "string" or not filename) | 230 | assert(type(filename) == "string" or not filename) |
| 229 | 231 | ||
| 230 | if cfg.downloader == "wget" then | 232 | if cfg.downloader == "wget" then |
| 231 | local wget_cmd = "wget --no-check-certificate --no-cache --user-agent="..cfg.user_agent.." --quiet --continue " | 233 | local wget_cmd = vars.WGET.." --no-check-certificate --no-cache --user-agent="..cfg.user_agent.." --quiet --continue " |
| 232 | if filename then | 234 | if filename then |
| 233 | return fs.execute(wget_cmd.." --output-document ", filename, url) | 235 | return fs.execute(wget_cmd.." --output-document ", filename, url) |
| 234 | else | 236 | else |
| @@ -236,13 +238,13 @@ function download(url, filename) | |||
| 236 | end | 238 | end |
| 237 | elseif cfg.downloader == "curl" then | 239 | elseif cfg.downloader == "curl" then |
| 238 | filename = filename or dir.base_name(url) | 240 | filename = filename or dir.base_name(url) |
| 239 | return fs.execute_string("curl -L --user-agent "..cfg.user_agent.." "..fs.Q(url).." 2> /dev/null 1> "..fs.Q(filename)) | 241 | return fs.execute_string(vars.CURL.." -L --user-agent "..cfg.user_agent.." "..fs.Q(url).." 2> /dev/null 1> "..fs.Q(filename)) |
| 240 | end | 242 | end |
| 241 | end | 243 | end |
| 242 | 244 | ||
| 243 | function chmod(pathname, mode) | 245 | function chmod(pathname, mode) |
| 244 | if mode then | 246 | if mode then |
| 245 | return fs.execute("chmod "..mode, pathname) | 247 | return fs.execute(vars.CHMOD, mode, pathname) |
| 246 | else | 248 | else |
| 247 | return false | 249 | return false |
| 248 | end | 250 | end |
| @@ -251,7 +253,7 @@ end | |||
| 251 | --- Apply a patch. | 253 | --- Apply a patch. |
| 252 | -- @param patchname string: The filename of the patch. | 254 | -- @param patchname string: The filename of the patch. |
| 253 | function apply_patch(patchname) | 255 | function apply_patch(patchname) |
| 254 | return fs.execute("patch -p1 -f -i ", patchname) | 256 | return fs.execute(vars.PATCH.." -p1 -f -i ", patchname) |
| 255 | end | 257 | end |
| 256 | 258 | ||
| 257 | --- Unpack an archive. | 259 | --- Unpack an archive. |
| @@ -265,12 +267,12 @@ function unpack_archive(archive) | |||
| 265 | local ok | 267 | local ok |
| 266 | if archive:match("%.tar%.gz$") or archive:match("%.tgz$") then | 268 | if archive:match("%.tar%.gz$") or archive:match("%.tgz$") then |
| 267 | -- ok = fs.execute("tar zxvpf ", archive) | 269 | -- ok = fs.execute("tar zxvpf ", archive) |
| 268 | ok = fs.execute_string("gunzip -c "..archive.."|tar -xf -") | 270 | ok = fs.execute_string(vars.GUNZIP.." -c "..archive.."|"..vars.TAR.." -xf -") |
| 269 | elseif archive:match("%.tar%.bz2$") then | 271 | elseif archive:match("%.tar%.bz2$") then |
| 270 | -- ok = fs.execute("tar jxvpf ", archive) | 272 | -- ok = fs.execute("tar jxvpf ", archive) |
| 271 | ok = fs.execute_string("bunzip2 -c "..archive.."|tar -xf -") | 273 | ok = fs.execute_string(vars.BUNZIP2.." -c "..archive.."|tar -xf -") |
| 272 | elseif archive:match("%.zip$") then | 274 | elseif archive:match("%.zip$") then |
| 273 | ok = fs.execute("unzip ", archive) | 275 | ok = fs.execute(vars.UNZIP, archive) |
| 274 | elseif archive:match("%.lua$") or archive:match("%.c$") then | 276 | elseif archive:match("%.lua$") or archive:match("%.c$") then |
| 275 | -- Ignore .lua and .c files; they don't need to be extracted. | 277 | -- Ignore .lua and .c files; they don't need to be extracted. |
| 276 | return true | 278 | return true |
| @@ -285,18 +287,18 @@ function unpack_archive(archive) | |||
| 285 | end | 287 | end |
| 286 | 288 | ||
| 287 | local md5_cmd = { | 289 | local md5_cmd = { |
| 288 | md5sum = "md5sum ", | 290 | md5sum = vars.MD5SUM, |
| 289 | openssl = "openssl md5 ", | 291 | openssl = vars.OPENSSL.." md5", |
| 290 | md5 = "md5 ", | 292 | md5 = vars.MD5, |
| 291 | } | 293 | } |
| 292 | 294 | ||
| 293 | --- Get the MD5 checksum for a file. | 295 | --- Get the MD5 checksum for a file. |
| 294 | -- @param file string: The file to be computed. | 296 | -- @param file string: The file to be computed. |
| 295 | -- @return string: The MD5 checksum | 297 | -- @return string: The MD5 checksum |
| 296 | function get_md5(file) | 298 | function get_md5(file) |
| 297 | local cmd = md5_cmd[cfg.md5checker] | 299 | local cmd = md5_cmd[cfg.md5checker] |
| 298 | if not cmd then return nil end | 300 | if not cmd then return nil end |
| 299 | local pipe = io.popen(cmd..fs.absolute_name(file)) | 301 | local pipe = io.popen(cmd.." "..fs.absolute_name(file)) |
| 300 | local computed = pipe:read("*a") | 302 | local computed = pipe:read("*a") |
| 301 | pipe:close() | 303 | pipe:close() |
| 302 | if not computed then return nil end | 304 | if not computed then return nil end |
| @@ -304,21 +306,8 @@ function get_md5(file) | |||
| 304 | end | 306 | end |
| 305 | 307 | ||
| 306 | function get_permissions(filename) | 308 | function get_permissions(filename) |
| 307 | local ret | 309 | local pipe = io.popen(vars.STAT.." "..vars.STATFLAG.." "..fs.Q(filename)) |
| 308 | 310 | local ret = pipe:read("*l") | |
| 309 | local flag | ||
| 310 | if cfg.is_platform("bsd") then | ||
| 311 | if cfg.is_platform("openbsd") then | ||
| 312 | flag = "-f '%Op'" | ||
| 313 | else | ||
| 314 | flag = "-f '%A'" | ||
| 315 | end | ||
| 316 | else | ||
| 317 | flag = "-c '%a'" | ||
| 318 | end | ||
| 319 | |||
| 320 | local pipe = io.popen("stat "..flag.." "..fs.Q(filename)) | ||
| 321 | ret = pipe:read("*l") | ||
| 322 | pipe:close() | 311 | pipe:close() |
| 323 | return ret | 312 | return ret |
| 324 | end | 313 | end |
diff --git a/src/luarocks/fs/win32/tools.lua b/src/luarocks/fs/win32/tools.lua index a3b7cdd0..5b7634cf 100644 --- a/src/luarocks/fs/win32/tools.lua +++ b/src/luarocks/fs/win32/tools.lua | |||
| @@ -10,6 +10,8 @@ local dir = require("luarocks.dir") | |||
| 10 | 10 | ||
| 11 | local dir_stack = {} | 11 | local dir_stack = {} |
| 12 | 12 | ||
| 13 | local vars = cfg.variables | ||
| 14 | |||
| 13 | --- Strip the last extension of a filename. | 15 | --- Strip the last extension of a filename. |
| 14 | -- Example: "foo.tar.gz" becomes "foo.tar". | 16 | -- Example: "foo.tar.gz" becomes "foo.tar". |
| 15 | -- If filename has no dots, returns it unchanged. | 17 | -- If filename has no dots, returns it unchanged. |
| @@ -43,7 +45,7 @@ end | |||
| 43 | -- Uses the module's internal dir stack. | 45 | -- Uses the module's internal dir stack. |
| 44 | -- @return string: the absolute pathname of the current directory. | 46 | -- @return string: the absolute pathname of the current directory. |
| 45 | function current_dir() | 47 | function current_dir() |
| 46 | local pipe = io.popen("pwd") | 48 | local pipe = io.popen(vars.PWD) |
| 47 | local current = pipe:read("*l") | 49 | local current = pipe:read("*l") |
| 48 | pipe:close() | 50 | pipe:close() |
| 49 | for _, d in ipairs(dir_stack) do | 51 | for _, d in ipairs(dir_stack) do |
| @@ -57,22 +59,22 @@ end | |||
| 57 | -- @return boolean: true if it is a regular file, false otherwise. | 59 | -- @return boolean: true if it is a regular file, false otherwise. |
| 58 | function is_file(file) | 60 | function is_file(file) |
| 59 | assert(file) | 61 | assert(file) |
| 60 | return fs.execute("test -f", file) | 62 | return fs.execute(vars.TEST.." -f", file) |
| 61 | end | 63 | end |
| 62 | 64 | ||
| 63 | local md5_cmd = { | 65 | local md5_cmd = { |
| 64 | md5sum = "md5sum ", | 66 | md5sum = vars.MD5SUM, |
| 65 | openssl = "openssl md5 ", | 67 | openssl = vars.OPENSSL.." md5", |
| 66 | md5 = "md5 ", | 68 | md5 = vars.MD5, |
| 67 | } | 69 | } |
| 68 | 70 | ||
| 69 | --- Get the MD5 checksum for a file. | 71 | --- Get the MD5 checksum for a file. |
| 70 | -- @param file string: The file to be computed. | 72 | -- @param file string: The file to be computed. |
| 71 | -- @return string: The MD5 checksum | 73 | -- @return string: The MD5 checksum |
| 72 | function get_md5(file) | 74 | function get_md5(file) |
| 73 | local cmd = md5_cmd[cfg.md5checker] | 75 | local cmd = md5_cmd[cfg.md5checker] |
| 74 | if not cmd then return nil end | 76 | if not cmd then return nil end |
| 75 | local pipe = io.popen(cmd..fs.absolute_name(file)) | 77 | local pipe = io.popen(cmd.." "..fs.absolute_name(file)) |
| 76 | local computed = pipe:read("*a") | 78 | local computed = pipe:read("*a") |
| 77 | pipe:close() | 79 | pipe:close() |
| 78 | if not computed then return nil end | 80 | if not computed then return nil end |
| @@ -120,7 +122,7 @@ end | |||
| 120 | -- @return boolean: true if it is a regular file, false otherwise. | 122 | -- @return boolean: true if it is a regular file, false otherwise. |
| 121 | function is_dir(file) | 123 | function is_dir(file) |
| 122 | assert(file) | 124 | assert(file) |
| 123 | return fs.execute("test -d " .. fs.Q(file) .. " 2>NUL 1>NUL") | 125 | return fs.execute(vars.TEST.." -d " .. fs.Q(file) .. " 2>NUL 1>NUL") |
| 124 | end | 126 | end |
| 125 | 127 | ||
| 126 | --- Create a directory if it does not already exist. | 128 | --- Create a directory if it does not already exist. |
| @@ -130,7 +132,7 @@ end | |||
| 130 | -- @return boolean: true on success, false on failure. | 132 | -- @return boolean: true on success, false on failure. |
| 131 | function make_dir(d) | 133 | function make_dir(d) |
| 132 | assert(d) | 134 | assert(d) |
| 133 | fs.execute("mkdir "..fs.Q(d).." 1> NUL 2> NUL") | 135 | fs.execute(vars.MKDIR.." "..fs.Q(d).." 1> NUL 2> NUL") |
| 134 | return 1 | 136 | return 1 |
| 135 | end | 137 | end |
| 136 | 138 | ||
| @@ -140,7 +142,7 @@ end | |||
| 140 | -- @param d string: pathname of directory to remove. | 142 | -- @param d string: pathname of directory to remove. |
| 141 | function remove_dir_if_empty(d) | 143 | function remove_dir_if_empty(d) |
| 142 | assert(d) | 144 | assert(d) |
| 143 | fs.execute_string("rmdir "..fs.Q(d).." 1> NUL 2> NUL") | 145 | fs.execute_string(vars.RMDIR.." "..fs.Q(d).." 1> NUL 2> NUL") |
| 144 | end | 146 | end |
| 145 | 147 | ||
| 146 | --- Remove a directory if it is empty. | 148 | --- Remove a directory if it is empty. |
| @@ -149,7 +151,7 @@ end | |||
| 149 | -- @param dir string: pathname of directory to remove. | 151 | -- @param dir string: pathname of directory to remove. |
| 150 | function remove_dir_tree_if_empty(d) | 152 | function remove_dir_tree_if_empty(d) |
| 151 | assert(d) | 153 | assert(d) |
| 152 | fs.execute_string("rmdir "..fs.Q(d).." 1> NUL 2> NUL") | 154 | fs.execute_string(vars.RMDIR.." "..fs.Q(d).." 1> NUL 2> NUL") |
| 153 | end | 155 | end |
| 154 | 156 | ||
| 155 | --- Copy a file. | 157 | --- Copy a file. |
| @@ -160,7 +162,7 @@ end | |||
| 160 | function copy(src, dest) | 162 | function copy(src, dest) |
| 161 | assert(src and dest) | 163 | assert(src and dest) |
| 162 | if dest:match("[/\\]$") then dest = dest:sub(1, -2) end | 164 | if dest:match("[/\\]$") then dest = dest:sub(1, -2) end |
| 163 | if fs.execute("cp", src, dest) then | 165 | if fs.execute(vars.CP, src, dest) then |
| 164 | return true | 166 | return true |
| 165 | else | 167 | else |
| 166 | return false, "Failed copying "..src.." to "..dest | 168 | return false, "Failed copying "..src.." to "..dest |
| @@ -174,7 +176,7 @@ end | |||
| 174 | -- plus an error message. | 176 | -- plus an error message. |
| 175 | function copy_contents(src, dest) | 177 | function copy_contents(src, dest) |
| 176 | assert(src and dest) | 178 | assert(src and dest) |
| 177 | if fs.execute_string("cp -a "..src.."\\*.* "..fs.Q(dest).." 1> NUL 2> NUL") then | 179 | if fs.execute_string(vars.CP.." -a "..src.."\\*.* "..fs.Q(dest).." 1> NUL 2> NUL") then |
| 178 | return true | 180 | return true |
| 179 | else | 181 | else |
| 180 | return false, "Failed copying "..src.." to "..dest | 182 | return false, "Failed copying "..src.." to "..dest |
| @@ -188,8 +190,8 @@ end | |||
| 188 | function delete(arg) | 190 | function delete(arg) |
| 189 | assert(arg) | 191 | assert(arg) |
| 190 | assert(arg:match("^[\a-zA-Z]?:?[\\/]")) | 192 | assert(arg:match("^[\a-zA-Z]?:?[\\/]")) |
| 191 | fs.execute("chmod a+rw -R ", arg) | 193 | fs.execute(vars.CHMOD.." a+rw -R ", arg) |
| 192 | return fs.execute_string("rm -rf " .. fs.Q(arg) .. " 1> NUL 2> NUL") | 194 | return fs.execute_string(vars.RM.." -rf " .. fs.Q(arg) .. " 1> NUL 2> NUL") |
| 193 | end | 195 | end |
| 194 | 196 | ||
| 195 | --- List the contents of a directory. | 197 | --- List the contents of a directory. |
| @@ -206,7 +208,7 @@ function list_dir(at) | |||
| 206 | return {} | 208 | return {} |
| 207 | end | 209 | end |
| 208 | local result = {} | 210 | local result = {} |
| 209 | local pipe = io.popen(command_at(at, "ls")) | 211 | local pipe = io.popen(command_at(at, vars.LS)) |
| 210 | for file in pipe:lines() do | 212 | for file in pipe:lines() do |
| 211 | table.insert(result, file) | 213 | table.insert(result, file) |
| 212 | end | 214 | end |
| @@ -229,7 +231,7 @@ function find(at) | |||
| 229 | return {} | 231 | return {} |
| 230 | end | 232 | end |
| 231 | local result = {} | 233 | local result = {} |
| 232 | local pipe = io.popen(command_at(at, "find 2> NUL")) | 234 | local pipe = io.popen(command_at(at, vars.FIND.." 2> NUL")) |
| 233 | for file in pipe:lines() do | 235 | for file in pipe:lines() do |
| 234 | -- Windows find is a bit different | 236 | -- Windows find is a bit different |
| 235 | local first_two = file:sub(1,2) | 237 | local first_two = file:sub(1,2) |
| @@ -253,7 +255,7 @@ function download(url, filename) | |||
| 253 | assert(type(filename) == "string" or not filename) | 255 | assert(type(filename) == "string" or not filename) |
| 254 | 256 | ||
| 255 | if cfg.downloader == "wget" then | 257 | if cfg.downloader == "wget" then |
| 256 | local wget_cmd = "wget --no-check-certificate --no-cache --user-agent="..cfg.user_agent.." --quiet --continue " | 258 | local wget_cmd = vars.WGET.." --no-check-certificate --no-cache --user-agent="..cfg.user_agent.." --quiet --continue " |
| 257 | if filename then | 259 | if filename then |
| 258 | return fs.execute(wget_cmd.." --output-document ", filename, url) | 260 | return fs.execute(wget_cmd.." --output-document ", filename, url) |
| 259 | else | 261 | else |
| @@ -261,7 +263,7 @@ function download(url, filename) | |||
| 261 | end | 263 | end |
| 262 | elseif cfg.downloader == "curl" then | 264 | elseif cfg.downloader == "curl" then |
| 263 | filename = filename or dir.base_name(url) | 265 | filename = filename or dir.base_name(url) |
| 264 | return fs.execute_string("curl -L --user-agent "..cfg.user_agent.." "..fs.Q(url).." 2> NUL 1> "..fs.Q(filename)) | 266 | return fs.execute_string(vars.CURL.." -L --user-agent "..cfg.user_agent.." "..fs.Q(url).." 2> NUL 1> "..fs.Q(filename)) |
| 265 | end | 267 | end |
| 266 | end | 268 | end |
| 267 | 269 | ||
| @@ -272,7 +274,7 @@ end | |||
| 272 | -- additional arguments. | 274 | -- additional arguments. |
| 273 | -- @return boolean: true on success, false on failure. | 275 | -- @return boolean: true on success, false on failure. |
| 274 | function zip(zipfile, ...) | 276 | function zip(zipfile, ...) |
| 275 | return fs.execute("7z a -tzip", zipfile, ...) | 277 | return fs.execute(vars.SEVENZ.." a -tzip", zipfile, ...) |
| 276 | end | 278 | end |
| 277 | 279 | ||
| 278 | --- Uncompress files from a .zip archive. | 280 | --- Uncompress files from a .zip archive. |
| @@ -280,14 +282,14 @@ end | |||
| 280 | -- @return boolean: true on success, false on failure. | 282 | -- @return boolean: true on success, false on failure. |
| 281 | function unzip(zipfile) | 283 | function unzip(zipfile) |
| 282 | assert(zipfile) | 284 | assert(zipfile) |
| 283 | return fs.execute("7z x", zipfile) | 285 | return fs.execute(vars.SEVENZ.." x", zipfile) |
| 284 | end | 286 | end |
| 285 | 287 | ||
| 286 | --- Uncompress gzip file. | 288 | --- Uncompress gzip file. |
| 287 | -- @param archive string: Filename of archive. | 289 | -- @param archive string: Filename of archive. |
| 288 | -- @return boolean : success status | 290 | -- @return boolean : success status |
| 289 | local function gunzip(archive) | 291 | local function gunzip(archive) |
| 290 | return fs.execute("7z x", archive) | 292 | return fs.execute(vars.SEVENZ.." x", archive) |
| 291 | end | 293 | end |
| 292 | 294 | ||
| 293 | --- Unpack an archive. | 295 | --- Unpack an archive. |
| @@ -299,23 +301,24 @@ function unpack_archive(archive) | |||
| 299 | assert(type(archive) == "string") | 301 | assert(type(archive) == "string") |
| 300 | 302 | ||
| 301 | local ok | 303 | local ok |
| 304 | local sevenzx = vars.SEVENZ.." x" | ||
| 302 | if archive:match("%.tar%.gz$") then | 305 | if archive:match("%.tar%.gz$") then |
| 303 | ok = gunzip(archive) | 306 | ok = gunzip(archive) |
| 304 | if ok then | 307 | if ok then |
| 305 | ok = fs.execute("7z x", strip_extension(archive)) | 308 | ok = fs.execute(sevenzx, strip_extension(archive)) |
| 306 | end | 309 | end |
| 307 | elseif archive:match("%.tgz$") then | 310 | elseif archive:match("%.tgz$") then |
| 308 | ok = gunzip(archive) | 311 | ok = gunzip(archive) |
| 309 | if ok then | 312 | if ok then |
| 310 | ok = fs.execute("7z x ", strip_extension(archive)..".tar") | 313 | ok = fs.execute(sevenzx, strip_extension(archive)..".tar") |
| 311 | end | 314 | end |
| 312 | elseif archive:match("%.tar%.bz2$") then | 315 | elseif archive:match("%.tar%.bz2$") then |
| 313 | ok = fs.execute("7z x ", archive) | 316 | ok = fs.execute(sevenzx, archive) |
| 314 | if ok then | 317 | if ok then |
| 315 | ok = fs.execute("7z x ", strip_extension(archive)) | 318 | ok = fs.execute(sevenzx, strip_extension(archive)) |
| 316 | end | 319 | end |
| 317 | elseif archive:match("%.zip$") then | 320 | elseif archive:match("%.zip$") then |
| 318 | ok = fs.execute("7z x ", archive) | 321 | ok = fs.execute(sevenzx, archive) |
| 319 | elseif archive:match("%.lua$") or archive:match("%.c$") then | 322 | elseif archive:match("%.lua$") or archive:match("%.c$") then |
| 320 | -- Ignore .lua and .c files; they don't need to be extracted. | 323 | -- Ignore .lua and .c files; they don't need to be extracted. |
| 321 | return true | 324 | return true |
