summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGeorge Roman <george.roman.99@gmail.com>2018-07-07 18:49:41 +0300
committerHisham Muhammad <hisham@gobolinux.org>2018-07-16 20:34:30 -0300
commit4b3ee931cd8ecc5937811cd8e9316d79c0c9c00e (patch)
tree9b5f36a8f75df296b1bace3413eb4967d9325729
parent1b3b6525a4313404af84fce0fbbc29695e664f73 (diff)
downloadluarocks-4b3ee931cd8ecc5937811cd8e9316d79c0c9c00e.tar.gz
luarocks-4b3ee931cd8ecc5937811cd8e9316d79c0c9c00e.tar.bz2
luarocks-4b3ee931cd8ecc5937811cd8e9316d79c0c9c00e.zip
Add general improvements to the fs module
-rw-r--r--spec/fs_spec.lua36
-rw-r--r--spec/remove_spec.lua34
-rw-r--r--src/luarocks/fs/lua.lua17
-rw-r--r--src/luarocks/fs/tools.lua7
-rw-r--r--src/luarocks/fs/win32/tools.lua11
5 files changed, 61 insertions, 44 deletions
diff --git a/spec/fs_spec.lua b/spec/fs_spec.lua
index eb8425e2..66453404 100644
--- a/spec/fs_spec.lua
+++ b/spec/fs_spec.lua
@@ -161,11 +161,19 @@ describe("Luarocks fs test #unit", function()
161 it("does nothing if the argument is a file", function() 161 it("does nothing if the argument is a file", function()
162 tmpfile1 = get_tmp_path() 162 tmpfile1 = get_tmp_path()
163 create_file(tmpfile1) 163 create_file(tmpfile1)
164 assert.falsy(pcall(fs.dir_iterator, tmpfile1)) 164 local crt = coroutine.create(fs.dir_iterator)
165 while coroutine.status(crt) ~= "dead" do
166 local ok, val = coroutine.resume(crt, tmpfile1)
167 assert.falsy(ok and res)
168 end
165 end) 169 end)
166 170
167 it("does nothing if the argument is invalid", function() 171 it("does nothing if the argument is invalid", function()
168 assert.falsy(pcall(fs.dir_iterator, "/nonexistent")) 172 local crt = coroutine.create(fs.dir_iterator)
173 while coroutine.status(crt) ~= "dead" do
174 local ok, val = coroutine.resume(crt, "/nonexistent")
175 assert.falsy(ok and res)
176 end
169 end) 177 end)
170 end) 178 end)
171 179
@@ -530,11 +538,13 @@ describe("Luarocks fs test #unit", function()
530 tmpdir = get_tmp_path() 538 tmpdir = get_tmp_path()
531 lfs.mkdir(tmpdir) 539 lfs.mkdir(tmpdir)
532 assert.truthy(fs.change_dir(tmpdir)) 540 assert.truthy(fs.change_dir(tmpdir))
533 local success = fs.change_dir_to_root() 541 assert.truthy(fs.change_dir_to_root())
534 if not is_win then 542 if is_win then
535 assert.truthy(success) 543 local curr_dir = fs.current_dir()
544 assert.truthy(curr_dir == "C:\\" or curr_dir == "/")
545 else
546 assert.same("/", fs.current_dir())
536 end 547 end
537 assert.same("/", fs.current_dir())
538 end) 548 end)
539 549
540 it("returns false and does nothing if the current directory is not valid #unix", function() 550 it("returns false and does nothing if the current directory is not valid #unix", function()
@@ -749,18 +759,14 @@ describe("Luarocks fs test #unit", function()
749 end) 759 end)
750 760
751 it("does nothing if the argument is nonexistent", function() 761 it("does nothing if the argument is nonexistent", function()
752 assert.falsy(pcall(fs.list_dir("/nonexistent"))) 762 assert.same(fs.list_dir("/nonexistent"), {})
753 end) 763 end)
754 764
755 it("does nothing if the argument doesn't have the proper permissions", function() 765 it("does nothing if the argument doesn't have the proper permissions", function()
756 tmpdir = get_tmp_path() 766 tmpdir = get_tmp_path()
757 lfs.mkdir(tmpdir) 767 lfs.mkdir(tmpdir)
758 make_unreadable(tmpdir) 768 make_unreadable(tmpdir)
759 if is_win then 769 assert.same(fs.list_dir(tmpdir), {})
760 assert.same(fs.list_dir(tmpdir), {})
761 else
762 assert.falsy(pcall(fs.list_dir, tmpdir))
763 end
764 end) 770 end)
765 end) 771 end)
766 772
@@ -1024,11 +1030,7 @@ describe("Luarocks fs test #unit", function()
1024 tmpdir = get_tmp_path() 1030 tmpdir = get_tmp_path()
1025 lfs.mkdir(tmpdir) 1031 lfs.mkdir(tmpdir)
1026 make_unreadable(tmpdir) 1032 make_unreadable(tmpdir)
1027 if is_win then 1033 assert.same(fs.find(tmpdir), {})
1028 assert.same(fs.find(tmpdir), {})
1029 else
1030 assert.falsy(pcall(fs.find, tmpdir))
1031 end
1032 end) 1034 end)
1033 end) 1035 end)
1034 1036
diff --git a/spec/remove_spec.lua b/spec/remove_spec.lua
index 55264a75..f43b55c6 100644
--- a/spec/remove_spec.lua
+++ b/spec/remove_spec.lua
@@ -7,9 +7,9 @@ test_env.unload_luarocks()
7 7
8local extra_rocks = { 8local extra_rocks = {
9 "/abelhas-1.1-1.rockspec", 9 "/abelhas-1.1-1.rockspec",
10 "/lualogging-1.3.0-1.src.rock", 10 "/copas-2.0.1-1.src.rock",
11 "/luasocket-3.0rc1-2.src.rock", 11 "/coxpcall-1.16.0-1.src.rock",
12 "/luasocket-3.0rc1-2.rockspec" 12 "/coxpcall-1.16.0-1.rockspec"
13} 13}
14 14
15describe("LuaRocks remove tests #integration", function() 15describe("LuaRocks remove tests #integration", function()
@@ -52,38 +52,38 @@ describe("LuaRocks remove tests #integration", function()
52 52
53 describe("LuaRocks remove more complex tests", function() 53 describe("LuaRocks remove more complex tests", function()
54 before_each(function() 54 before_each(function()
55 assert.is.truthy(test_env.need_rock("luasocket")) 55 assert.is.truthy(test_env.need_rock("coxpcall"))
56 end) 56 end)
57 57
58 it("LuaRocks remove fail, break dependencies", function() 58 it("LuaRocks remove fail, break dependencies", function()
59 assert.is.truthy(lfs.attributes(testing_paths.testing_sys_rocks .. "/luasocket")) 59 assert.is.truthy(lfs.attributes(testing_paths.testing_sys_rocks .. "/coxpcall"))
60 assert.is_true(run.luarocks_bool("build lualogging")) 60 assert.is_true(run.luarocks_bool("build copas"))
61 61
62 assert.is_false(run.luarocks_bool("remove luasocket")) 62 assert.is_false(run.luarocks_bool("remove coxpcall"))
63 assert.is.truthy(lfs.attributes(testing_paths.testing_sys_rocks .. "/luasocket")) 63 assert.is.truthy(lfs.attributes(testing_paths.testing_sys_rocks .. "/coxpcall"))
64 end) 64 end)
65 65
66 it("LuaRocks remove force", function() 66 it("LuaRocks remove force", function()
67 assert.is.truthy(lfs.attributes(testing_paths.testing_sys_rocks .. "/luasocket")) 67 assert.is.truthy(lfs.attributes(testing_paths.testing_sys_rocks .. "/coxpcall"))
68 assert.is_true(run.luarocks_bool("build lualogging")) 68 assert.is_true(run.luarocks_bool("build copas"))
69 69
70 local output = run.luarocks("remove --force luasocket") 70 local output = run.luarocks("remove --force coxpcall")
71 assert.is.falsy(lfs.attributes(testing_paths.testing_sys_rocks .. "/luasocket")) 71 assert.is.falsy(lfs.attributes(testing_paths.testing_sys_rocks .. "/coxpcall"))
72 assert.is.truthy(output:find("Checking stability of dependencies")) 72 assert.is.truthy(output:find("Checking stability of dependencies"))
73 end) 73 end)
74 74
75 it("LuaRocks remove force fast", function() 75 it("LuaRocks remove force fast", function()
76 assert.is.truthy(lfs.attributes(testing_paths.testing_sys_rocks .. "/luasocket")) 76 assert.is.truthy(lfs.attributes(testing_paths.testing_sys_rocks .. "/coxpcall"))
77 assert.is_true(run.luarocks_bool("build lualogging")) 77 assert.is_true(run.luarocks_bool("build copas"))
78 78
79 local output = run.luarocks("remove --force-fast luasocket") 79 local output = run.luarocks("remove --force-fast coxpcall")
80 assert.is.falsy(lfs.attributes(testing_paths.testing_sys_rocks .. "/luasocket")) 80 assert.is.falsy(lfs.attributes(testing_paths.testing_sys_rocks .. "/coxpcall"))
81 assert.is.falsy(output:find("Checking stability of dependencies")) 81 assert.is.falsy(output:find("Checking stability of dependencies"))
82 end) 82 end)
83 end) 83 end)
84 84
85 it("#admin remove #ssh", function() 85 it("#admin remove #ssh", function()
86 assert.is_true(run.luarocks_admin_bool("--server=testing remove luasocket-3.0rc1-2.src.rock")) 86 assert.is_true(run.luarocks_admin_bool("--server=testing remove coxpcall-1.16.0-1.src.rock"))
87 end) 87 end)
88 88
89 it("#admin remove missing", function() 89 it("#admin remove missing", function()
diff --git a/src/luarocks/fs/lua.lua b/src/luarocks/fs/lua.lua
index 373dcbdd..9da3875b 100644
--- a/src/luarocks/fs/lua.lua
+++ b/src/luarocks/fs/lua.lua
@@ -464,9 +464,13 @@ end
464--- Internal implementation function for fs.dir. 464--- Internal implementation function for fs.dir.
465-- Yields a filename on each iteration. 465-- Yields a filename on each iteration.
466-- @param at string: directory to list 466-- @param at string: directory to list
467-- @return nil 467-- @return nil or (nil and string): an error message on failure
468function fs_lua.dir_iterator(at) 468function fs_lua.dir_iterator(at)
469 for file in lfs.dir(at) do 469 local pok, iter, arg = pcall(lfs.dir, at)
470 if not pok then
471 return nil, iter
472 end
473 for file in iter, arg do
470 if file ~= "." and file ~= ".." then 474 if file ~= "." and file ~= ".." then
471 coroutine.yield(file) 475 coroutine.yield(file)
472 end 476 end
@@ -479,7 +483,11 @@ end
479-- @param prefix string: Auxiliary prefix string to form pathname. 483-- @param prefix string: Auxiliary prefix string to form pathname.
480-- @param result table: Array of strings where results are collected. 484-- @param result table: Array of strings where results are collected.
481local function recursive_find(cwd, prefix, result) 485local function recursive_find(cwd, prefix, result)
482 for file in lfs.dir(cwd) do 486 local pok, iter, arg = pcall(lfs.dir, cwd)
487 if not pok then
488 return nil
489 end
490 for file in iter, arg do
483 if file ~= "." and file ~= ".." then 491 if file ~= "." and file ~= ".." then
484 local item = prefix .. file 492 local item = prefix .. file
485 table.insert(result, item) 493 table.insert(result, item)
@@ -502,9 +510,6 @@ function fs_lua.find(at)
502 at = fs.current_dir() 510 at = fs.current_dir()
503 end 511 end
504 at = dir.normalize(at) 512 at = dir.normalize(at)
505 if not fs.is_dir(at) then
506 return {}
507 end
508 local result = {} 513 local result = {}
509 recursive_find(at, "", result) 514 recursive_find(at, "", result)
510 return result 515 return result
diff --git a/src/luarocks/fs/tools.lua b/src/luarocks/fs/tools.lua
index 0cfdc9f7..d2dc08ae 100644
--- a/src/luarocks/fs/tools.lua
+++ b/src/luarocks/fs/tools.lua
@@ -82,7 +82,12 @@ end
82-- Allows leaving a directory (e.g. for deleting it) in 82-- Allows leaving a directory (e.g. for deleting it) in
83-- a crossplatform way. 83-- a crossplatform way.
84function tools.change_dir_to_root() 84function tools.change_dir_to_root()
85 local curr_dir = fs.current_dir()
86 if not curr_dir or not fs.is_dir(curr_dir) then
87 return false
88 end
85 table.insert(dir_stack, "/") 89 table.insert(dir_stack, "/")
90 return true
86end 91end
87 92
88--- Change working directory to the previous in the directory stack. 93--- Change working directory to the previous in the directory stack.
@@ -113,7 +118,7 @@ end
113-- @param at string: directory to list 118-- @param at string: directory to list
114-- @return nil 119-- @return nil
115function tools.dir_iterator(at) 120function tools.dir_iterator(at)
116 local pipe = io.popen(fs.command_at(at, fs.Q(vars.LS))) 121 local pipe = io.popen(fs.command_at(at, fs.Q(vars.LS), true))
117 for file in pipe:lines() do 122 for file in pipe:lines() do
118 if file ~= "." and file ~= ".." then 123 if file ~= "." and file ~= ".." then
119 coroutine.yield(file) 124 coroutine.yield(file)
diff --git a/src/luarocks/fs/win32/tools.lua b/src/luarocks/fs/win32/tools.lua
index c267b316..de3d9031 100644
--- a/src/luarocks/fs/win32/tools.lua
+++ b/src/luarocks/fs/win32/tools.lua
@@ -13,10 +13,15 @@ local vars = setmetatable({}, { __index = function(_,k) return cfg.variables[k]
13--- Adds prefix to command to make it run from a directory. 13--- Adds prefix to command to make it run from a directory.
14-- @param directory string: Path to a directory. 14-- @param directory string: Path to a directory.
15-- @param cmd string: A command-line string. 15-- @param cmd string: A command-line string.
16-- @param exit_on_error bool: Exits immediately if entering the directory failed.
16-- @return string: The command-line with prefix. 17-- @return string: The command-line with prefix.
17function tools.command_at(directory, cmd) 18function tools.command_at(directory, cmd, exit_on_error)
18 local drive = directory:match("^([A-Za-z]:)") 19 local drive = directory:match("^([A-Za-z]:)")
19 cmd = "cd " .. fs.Q(directory) .. " & " .. cmd 20 local op = " & "
21 if exit_on_error then
22 op = " && "
23 end
24 local cmd = "cd " .. fs.Q(directory) .. op .. cmd
20 if drive then 25 if drive then
21 cmd = drive .. " & " .. cmd 26 cmd = drive .. " & " .. cmd
22 end 27 end
@@ -113,7 +118,7 @@ function tools.find(at)
113 return {} 118 return {}
114 end 119 end
115 local result = {} 120 local result = {}
116 local pipe = io.popen(fs.command_at(at, fs.quiet_stderr(fs.Q(vars.FIND)))) 121 local pipe = io.popen(fs.command_at(at, fs.quiet_stderr(fs.Q(vars.FIND)), true))
117 for file in pipe:lines() do 122 for file in pipe:lines() do
118 -- Windows find is a bit different 123 -- Windows find is a bit different
119 local first_two = file:sub(1,2) 124 local first_two = file:sub(1,2)