From 772410c041f3fa9480e49e7aea88ec265a74b89d Mon Sep 17 00:00:00 2001 From: Hisham Muhammad Date: Thu, 15 Aug 2013 14:27:33 -0300 Subject: Make sure fs.make_dir is always checked and results in proper errors. --- src/luarocks/build.lua | 12 ++++++++---- src/luarocks/build/builtin.lua | 5 +++-- src/luarocks/cache.lua | 6 ++++-- src/luarocks/fetch.lua | 9 ++++++--- src/luarocks/fs/lua.lua | 28 ++++++++++++++-------------- src/luarocks/fs/unix/tools.lua | 6 +++++- src/luarocks/fs/win32/tools.lua | 5 ++++- src/luarocks/pack.lua | 14 +++++++++----- src/luarocks/repos.lua | 6 ++++-- src/luarocks/tools/tar.lua | 6 ++++-- src/luarocks/unpack.lua | 3 ++- 11 files changed, 63 insertions(+), 37 deletions(-) diff --git a/src/luarocks/build.lua b/src/luarocks/build.lua index dbe450ab..40f02e38 100644 --- a/src/luarocks/build.lua +++ b/src/luarocks/build.lua @@ -56,14 +56,17 @@ local function install_files(files, location, is_module_path) if type(k) == "string" then if is_module_path then dest = dir.path(location, path.module_to_path(k)) - fs.make_dir(dest) + local ok, err = fs.make_dir(dest) + if not ok then return nil, err end else dest = dir.path(location, dir.dir_name(k)) - fs.make_dir(dest) + local ok, err = fs.make_dir(dest) + if not ok then return nil, err end dest = dir.path(dest, dir.base_name(k)) end else - fs.make_dir(dest) + local ok, err = fs.make_dir(dest) + if not ok then return nil, err end end local ok = fs.copy(dir.path(file), dest) if not ok then @@ -180,7 +183,8 @@ function build_rockspec(rockspec_file, need_to_fetch, minimal_mode, deps_mode) } for _, d in pairs(dirs) do - fs.make_dir(d.name) + local ok, err = fs.make_dir(d.name) + if not ok then return nil, err end end local rollback = util.schedule_function(function() fs.delete(path.install_dir(name, version)) diff --git a/src/luarocks/build/builtin.lua b/src/luarocks/build/builtin.lua index 9d97d58b..c96a2496 100644 --- a/src/luarocks/build/builtin.lua +++ b/src/luarocks/build/builtin.lua @@ -224,7 +224,8 @@ function run(rockspec) if not ok then break end local module_name = dir.path(moddir, name:match("([^.]*)$").."."..util.matchquote(cfg.lib_extension)):gsub("//", "/") if moddir ~= "" then - fs.make_dir(moddir) + local ok, err = fs.make_dir(moddir) + if not ok then return nil, err end end local dest = dir.path(libdir, moddir) built_modules[module_name] = dest @@ -242,7 +243,7 @@ function run(rockspec) end end if fs.is_dir("lua") then - ok, err = fs.copy_contents("lua", luadir) + local ok, err = fs.copy_contents("lua", luadir) if not ok then return nil, "Failed copying contents of 'lua' directory: "..err end diff --git a/src/luarocks/cache.lua b/src/luarocks/cache.lua index 21185c10..fe74ba18 100644 --- a/src/luarocks/cache.lua +++ b/src/luarocks/cache.lua @@ -53,11 +53,13 @@ end function refresh_local_cache(server, url, user, password) local local_cache, protocol, server_path, user, password = split_server_url(server, url, user, password) - fs.make_dir(cfg.local_cache) + local ok, err = fs.make_dir(cfg.local_cache) + if not ok then return nil, err end local tmp_cache = false if not local_cache then - local_cache = fs.make_temp_dir("local_cache") + local err + local_cache, err = fs.make_temp_dir("local_cache") tmp_cache = true end local ok = fs.make_dir(local_cache) diff --git a/src/luarocks/fetch.lua b/src/luarocks/fetch.lua index bfdbacec..be2f32c6 100644 --- a/src/luarocks/fetch.lua +++ b/src/luarocks/fetch.lua @@ -66,9 +66,9 @@ function fetch_url_at_temp_dir(url, tmpname, filename) return nil, "File not found: "..pathname end else - local temp_dir = fs.make_temp_dir(tmpname) + local temp_dir, err = fs.make_temp_dir(tmpname) if not temp_dir then - return nil, "Failed creating temporary directory." + return nil, "Failed creating temporary directory "..tmpname..": "..err end util.schedule_function(fs.delete, temp_dir) fs.change_dir(temp_dir) @@ -104,7 +104,10 @@ function fetch_and_unpack_rock(rock_file, dest) local unpack_dir if dest then unpack_dir = dest - fs.make_dir(unpack_dir) + local ok, err = fs.make_dir(unpack_dir) + if not ok then + return nil, "Failed unpacking rock file: " .. err + end else unpack_dir = fs.make_temp_dir(name) end diff --git a/src/luarocks/fs/lua.lua b/src/luarocks/fs/lua.lua index 36b33690..7e208357 100644 --- a/src/luarocks/fs/lua.lua +++ b/src/luarocks/fs/lua.lua @@ -69,16 +69,17 @@ end --- Create a temporary directory. -- @param name string: name pattern to use for avoiding conflicts -- when creating temporary directory. --- @return string or nil: name of temporary directory or nil on failure. +-- @return string or (nil, string): name of temporary directory or (nil, error message) on failure. function make_temp_dir(name) assert(type(name) == "string") name = dir.normalize(name) local temp_dir = (os.getenv("TMP") or "/tmp") .. "/luarocks_" .. name:gsub(dir.separator, "_") .. "-" .. tostring(math.floor(math.random() * 10000)) - if fs.make_dir(temp_dir) then + local ok, err = fs.make_dir(temp_dir) + if ok then return temp_dir else - return nil + return nil, err end end @@ -131,11 +132,7 @@ if lfs_ok then function execute_string(cmd) if cfg.verbose then print("Executing: "..cmd) end local code = os.execute(cmd) - if code == 0 or code == true then - return true - else - return false - end + return (code == 0 or code == true) end --- Obtain current directory. @@ -180,7 +177,7 @@ end -- If any of the higher levels in the path name does not exist -- too, they are created as well. -- @param directory string: pathname of directory to create. --- @return boolean: true on success, false on failure. +-- @return boolean or (boolean, string): true on success or (false, error message) on failure. function make_dir(directory) assert(type(directory) == "string") directory = dir.normalize(directory) @@ -197,11 +194,12 @@ function make_dir(directory) path = path and path .. dir.separator .. d or d local mode = lfs.attributes(path, "mode") if not mode then - if not lfs.mkdir(path) then - return false + local ok, err = lfs.mkdir(path) + if not ok then + return false, err end elseif mode ~= "directory" then - return false + return false, path.." is not a directory" end end return true @@ -274,7 +272,8 @@ local function recursive_copy(src, dest) if not ok then return false end elseif srcmode == "directory" then local subdir = dir.path(dest, dir.base_name(src)) - fs.make_dir(subdir) + local ok, err = fs.make_dir(subdir) + if not ok then return nil, err end for file in lfs.dir(src) do if file ~= "." and file ~= ".." then local ok = recursive_copy(dir.path(src, file), subdir) @@ -455,7 +454,8 @@ function unzip(zipfile) local file = files() repeat if file.filename:sub(#file.filename) == "/" then - fs.make_dir(dir.path(fs.current_dir(), file.filename)) + local ok, err = fs.make_dir(dir.path(fs.current_dir(), file.filename)) + if not ok then return nil, err end else local rf, err = zipfile:open(file.filename) if not rf then zipfile:close(); return nil, err end diff --git a/src/luarocks/fs/unix/tools.lua b/src/luarocks/fs/unix/tools.lua index 3b853be7..23bd8161 100644 --- a/src/luarocks/fs/unix/tools.lua +++ b/src/luarocks/fs/unix/tools.lua @@ -71,7 +71,11 @@ end -- @return boolean: true on success, false on failure. function make_dir(directory) assert(directory) - return fs.execute(vars.MKDIR.." -p", directory) + local ok, err = fs.execute(vars.MKDIR.." -p", directory) + if not ok then + err = "failed making directory "..directory + end + return ok, err end --- Remove a directory if it is empty. diff --git a/src/luarocks/fs/win32/tools.lua b/src/luarocks/fs/win32/tools.lua index 1af1dd91..97ba4fe5 100644 --- a/src/luarocks/fs/win32/tools.lua +++ b/src/luarocks/fs/win32/tools.lua @@ -103,7 +103,10 @@ end function make_dir(directory) assert(directory) fs.execute(fs.quiet(vars.MKDIR.." "..fs.Q(directory))) - return 1 + if not fs.is_dir(directory) then + return false, "failed making directory "..directory + end + return true end --- Remove a directory if it is empty. diff --git a/src/luarocks/pack.lua b/src/luarocks/pack.lua index 583932e0..ede992ce 100644 --- a/src/luarocks/pack.lua +++ b/src/luarocks/pack.lua @@ -58,12 +58,14 @@ local function pack_source_rock(rockspec_file) end local function copy_back_files(name, version, file_tree, deploy_dir, pack_dir) - fs.make_dir(pack_dir) + local ok, err = fs.make_dir(pack_dir) + if not ok then return nil, err end for file, sub in pairs(file_tree) do local source = dir.path(deploy_dir, file) local target = dir.path(pack_dir, file) if type(sub) == "table" then local ok, err = copy_back_files(name, version, sub, source, target) + if not ok then return nil, err end else local versioned = path.versioned_name(source, deploy_dir, name, version) if fs.exists(versioned) then @@ -128,11 +130,13 @@ local function do_pack_binary_rock(name, version) local is_binary = false if rock_manifest.lib then - copy_back_files(name, version, rock_manifest.lib, path.deploy_lib_dir(root), dir.path(temp_dir, "lib")) + local ok, err = copy_back_files(name, version, rock_manifest.lib, path.deploy_lib_dir(root), dir.path(temp_dir, "lib")) + if not ok then return nil, "Failed copying back files: " .. err end is_binary = true end if rock_manifest.lua then - copy_back_files(name, version, rock_manifest.lua, path.deploy_lua_dir(root), dir.path(temp_dir, "lua")) + local ok, err = copy_back_files(name, version, rock_manifest.lua, path.deploy_lua_dir(root), dir.path(temp_dir, "lua")) + if not ok then return nil, "Failed copying back files: " .. err end end fs.change_dir(temp_dir) @@ -157,9 +161,9 @@ function pack_binary_rock(name, version, cmd, ...) -- to shave off the final deploy steps from the build phase and the initial -- collect steps from the pack phase. - local temp_dir = fs.make_temp_dir("luarocks-build-pack-"..dir.base_name(name)) + local temp_dir, err = fs.make_temp_dir("luarocks-build-pack-"..dir.base_name(name)) if not temp_dir then - return nil, "Failed creating temporary directory." + return nil, "Failed creating temporary directory: "..err end util.schedule_function(fs.delete, temp_dir) diff --git a/src/luarocks/repos.lua b/src/luarocks/repos.lua index b7e64d42..c7b381df 100644 --- a/src/luarocks/repos.lua +++ b/src/luarocks/repos.lua @@ -175,7 +175,8 @@ local function resolve_conflict(target, deploy_dir, name, version) end if name ~= cname or deps.compare_versions(version, cversion) then local versioned = path.versioned_name(target, deploy_dir, cname, cversion) - fs.make_dir(dir.dir_name(versioned)) + local ok, err = fs.make_dir(dir.dir_name(versioned)) + if not ok then return nil, err end fs.move(target, versioned) return target else @@ -220,7 +221,8 @@ function deploy_files(name, version, wrap_bin_scripts) target = new_target end end - fs.make_dir(dir.dir_name(target)) + ok, err = fs.make_dir(dir.dir_name(target)) + if not ok then return nil, err end ok, err = move_fn(source, target, name, version) fs.remove_dir_tree_if_empty(dir.dir_name(source)) if not ok then return nil, err end diff --git a/src/luarocks/tools/tar.lua b/src/luarocks/tools/tar.lua index ba01a413..0c68ab2f 100644 --- a/src/luarocks/tools/tar.lua +++ b/src/luarocks/tools/tar.lua @@ -119,11 +119,13 @@ function untar(filename, destdir) end local pathname = dir.path(destdir, header.name) if header.typeflag == "directory" then - fs.make_dir(pathname) + local ok, err = fs.make_dir(pathname) + if not ok then return nil, err end elseif header.typeflag == "file" then local dirname = dir.dir_name(pathname) if dirname ~= "" then - fs.make_dir(dirname) + local ok, err = fs.make_dir(dirname) + if not ok then return nil, err end end local file_handle = io.open(pathname, "wb") file_handle:write(file_data) diff --git a/src/luarocks/unpack.lua b/src/luarocks/unpack.lua index 67153812..67db5ca5 100644 --- a/src/luarocks/unpack.lua +++ b/src/luarocks/unpack.lua @@ -99,7 +99,8 @@ local function run_unpacker(file) if (fs.exists(dir_name)) then return nil, "Directory "..dir_name.." already exists." end - fs.make_dir(dir_name) + local ok, err = fs.make_dir(dir_name) + if not ok then return nil, err end local rollback = util.schedule_function(fs.delete, fs.absolute_name(dir_name)) local rockspec, err -- cgit v1.2.3-55-g6feb