aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rwxr-xr-xsrc/bin/luarocks36
-rwxr-xr-xsrc/bin/luarocks-admin11
-rw-r--r--src/luarocks/build/builtin.lua3
-rw-r--r--src/luarocks/cfg.lua3
-rw-r--r--src/luarocks/command_line.lua3
-rw-r--r--src/luarocks/deps.lua2
-rw-r--r--src/luarocks/dir.lua14
-rw-r--r--src/luarocks/doc.lua128
-rw-r--r--src/luarocks/fetch.lua18
-rw-r--r--src/luarocks/fs/unix/tools.lua4
-rw-r--r--src/luarocks/fs/win32/tools.lua4
-rw-r--r--src/luarocks/help.lua19
-rw-r--r--src/luarocks/index.lua11
-rw-r--r--src/luarocks/manif.lua87
-rw-r--r--src/luarocks/search.lua7
-rw-r--r--src/luarocks/show.lua34
16 files changed, 281 insertions, 103 deletions
diff --git a/src/bin/luarocks b/src/bin/luarocks
index 6ab27fa3..e9cfc349 100755
--- a/src/bin/luarocks
+++ b/src/bin/luarocks
@@ -5,22 +5,24 @@ local command_line = require("luarocks.command_line")
5 5
6program_description = "LuaRocks main command-line interface" 6program_description = "LuaRocks main command-line interface"
7 7
8commands = {} 8commands = {
9commands.help = require("luarocks.help") 9 help = "luarocks.help",
10commands.pack = require("luarocks.pack") 10 pack = "luarocks.pack",
11commands.unpack = require("luarocks.unpack") 11 unpack = "luarocks.unpack",
12commands.build = require("luarocks.build") 12 build = "luarocks.build",
13commands.install = require("luarocks.install") 13 install = "luarocks.install",
14commands.search = require("luarocks.search") 14 search = "luarocks.search",
15commands.list = require("luarocks.list") 15 list = "luarocks.list",
16commands.remove = require("luarocks.remove") 16 remove = "luarocks.remove",
17commands.make = require("luarocks.make") 17 make = "luarocks.make",
18commands.download = require("luarocks.download") 18 download = "luarocks.download",
19commands.path = require("luarocks.path") 19 path = "luarocks.path",
20commands.show = require("luarocks.show") 20 show = "luarocks.show",
21commands.new_version = require("luarocks.new_version") 21 new_version = "luarocks.new_version",
22commands.lint = require("luarocks.lint") 22 lint = "luarocks.lint",
23commands.write_rockspec = require("luarocks.write_rockspec") 23 write_rockspec = "luarocks.write_rockspec",
24commands.purge = require("luarocks.purge") 24 purge = "luarocks.purge",
25 doc = "luarocks.doc",
26}
25 27
26command_line.run_command(...) 28command_line.run_command(...)
diff --git a/src/bin/luarocks-admin b/src/bin/luarocks-admin
index 983dda87..e7f49c25 100755
--- a/src/bin/luarocks-admin
+++ b/src/bin/luarocks-admin
@@ -6,12 +6,11 @@ local command_line = require("luarocks.command_line")
6program_description = "LuaRocks repository administration interface" 6program_description = "LuaRocks repository administration interface"
7 7
8commands = { 8commands = {
9 help = "luarocks.help",
10 make_manifest = "luarocks.make_manifest",
11 add = "luarocks.add",
12 remove = "luarocks.admin_remove",
13 refresh_cache = "luarocks.refresh_cache",
9} 14}
10 15
11commands.help = require("luarocks.help")
12commands.make_manifest = require("luarocks.make_manifest")
13commands.add = require("luarocks.add")
14commands.remove = require("luarocks.admin_remove")
15commands.refresh_cache = require("luarocks.refresh_cache")
16
17command_line.run_command(...) 16command_line.run_command(...)
diff --git a/src/luarocks/build/builtin.lua b/src/luarocks/build/builtin.lua
index f9ef4c44..5c58265a 100644
--- a/src/luarocks/build/builtin.lua
+++ b/src/luarocks/build/builtin.lua
@@ -235,8 +235,9 @@ function run(rockspec)
235 table.insert(objects, object) 235 table.insert(objects, object)
236 end 236 end
237 if not ok then break end 237 if not ok then break end
238 local module_name = dir.path(moddir, name:match("([^.]*)$").."."..util.matchquote(cfg.lib_extension)):gsub("//", "/") 238 local module_name = name:match("([^.]*)$").."."..util.matchquote(cfg.lib_extension)
239 if moddir ~= "" then 239 if moddir ~= "" then
240 module_name = dir.path(moddir, module_name)
240 local ok, err = fs.make_dir(moddir) 241 local ok, err = fs.make_dir(moddir)
241 if not ok then return nil, err end 242 if not ok then return nil, err end
242 end 243 end
diff --git a/src/luarocks/cfg.lua b/src/luarocks/cfg.lua
index 87777b86..5e43535b 100644
--- a/src/luarocks/cfg.lua
+++ b/src/luarocks/cfg.lua
@@ -342,6 +342,7 @@ if detected.windows then
342 localappdata = os.getenv("USERPROFILE").."/Local Settings/Application Data" 342 localappdata = os.getenv("USERPROFILE").."/Local Settings/Application Data"
343 end 343 end
344 defaults.local_cache = localappdata.."/LuaRocks/Cache" 344 defaults.local_cache = localappdata.."/LuaRocks/Cache"
345 defaults.web_browser = "start"
345end 346end
346 347
347if detected.mingw32 then 348if detected.mingw32 then
@@ -403,6 +404,7 @@ if detected.unix then
403 if not defaults.variables.CFLAGS:match("-fPIC") then 404 if not defaults.variables.CFLAGS:match("-fPIC") then
404 defaults.variables.CFLAGS = defaults.variables.CFLAGS.." -fPIC" 405 defaults.variables.CFLAGS = defaults.variables.CFLAGS.." -fPIC"
405 end 406 end
407 defaults.web_browser = "xdg-open"
406end 408end
407 409
408if detected.cygwin then 410if detected.cygwin then
@@ -436,6 +438,7 @@ if detected.macosx then
436 end 438 end
437 defaults.variables.CC = "export MACOSX_DEPLOYMENT_TARGET=10."..version.."; gcc" 439 defaults.variables.CC = "export MACOSX_DEPLOYMENT_TARGET=10."..version.."; gcc"
438 defaults.variables.LD = "export MACOSX_DEPLOYMENT_TARGET=10."..version.."; gcc" 440 defaults.variables.LD = "export MACOSX_DEPLOYMENT_TARGET=10."..version.."; gcc"
441 defaults.web_browser = "open"
439end 442end
440 443
441if detected.linux then 444if detected.linux then
diff --git a/src/luarocks/command_line.lua b/src/luarocks/command_line.lua
index e79b1442..19d04290 100644
--- a/src/luarocks/command_line.lua
+++ b/src/luarocks/command_line.lua
@@ -185,7 +185,8 @@ function run_command(...)
185 -- I'm not changing this now to avoid messing with the run() 185 -- I'm not changing this now to avoid messing with the run()
186 -- interface, which I know some people use (even though 186 -- interface, which I know some people use (even though
187 -- I never published it as a public API...) 187 -- I never published it as a public API...)
188 local xp, ok, err, exitcode = xpcall(function() return commands[command].run(unpack(args)) end, function(err) 188 local cmd = require(commands[command])
189 local xp, ok, err, exitcode = xpcall(function() return cmd.run(unpack(args)) end, function(err)
189 die(debug.traceback("LuaRocks "..cfg.program_version 190 die(debug.traceback("LuaRocks "..cfg.program_version
190 .." bug (please report at luarocks-developers@lists.sourceforge.net).\n" 191 .." bug (please report at luarocks-developers@lists.sourceforge.net).\n"
191 ..err, 2)) 192 ..err, 2))
diff --git a/src/luarocks/deps.lua b/src/luarocks/deps.lua
index 116b4bbb..0adb5834 100644
--- a/src/luarocks/deps.lua
+++ b/src/luarocks/deps.lua
@@ -689,7 +689,7 @@ function scan_deps(results, missing, manifest, name, version, deps_mode)
689 local deplist = dependencies_name[version] 689 local deplist = dependencies_name[version]
690 local rockspec, err 690 local rockspec, err
691 if not deplist then 691 if not deplist then
692 rockspec, err = fetch.load_local_rockspec(path.rockspec_file(name, version)) 692 rockspec, err = fetch.load_local_rockspec(path.rockspec_file(name, version), false)
693 if err then 693 if err then
694 missing[name.." "..version] = err 694 missing[name.." "..version] = err
695 return results, missing 695 return results, missing
diff --git a/src/luarocks/dir.lua b/src/luarocks/dir.lua
index e8cd746e..1f3b5c3d 100644
--- a/src/luarocks/dir.lua
+++ b/src/luarocks/dir.lua
@@ -35,17 +35,11 @@ end
35-- @return string: a string with a platform-specific representation 35-- @return string: a string with a platform-specific representation
36-- of the path. 36-- of the path.
37function path(...) 37function path(...)
38 local items = {...} 38 local t = {...}
39 local i = 1 39 while t[1] == "" do
40 while items[i] do 40 table.remove(t, 1)
41 items[i] = items[i]:gsub("(.+)/+$", "%1")
42 if items[i] == "" then
43 table.remove(items, i)
44 else
45 i = i + 1
46 end
47 end 41 end
48 return (table.concat(items, "/"):gsub("(.+)/+$", "%1")) 42 return (table.concat(t, "/"):gsub("([^:])/+", "%1/"):gsub("^/+", "/"):gsub("/*$", ""))
49end 43end
50 44
51--- Split protocol and path from an URL or local pathname. 45--- Split protocol and path from an URL or local pathname.
diff --git a/src/luarocks/doc.lua b/src/luarocks/doc.lua
new file mode 100644
index 00000000..1a843f37
--- /dev/null
+++ b/src/luarocks/doc.lua
@@ -0,0 +1,128 @@
1
2--- Module implementing the LuaRocks "doc" command.
3-- Shows documentation for an installed rock.
4module("luarocks.doc", package.seeall)
5
6local util = require("luarocks.util")
7local show = require("luarocks.show")
8local path = require("luarocks.path")
9local dir = require("luarocks.dir")
10local fetch = require("luarocks.fetch")
11local fs = require("luarocks.fs")
12
13help_summary = "Shows documentation for an installed rock."
14
15help = [[
16<argument> is an existing package name.
17Without any flags, tries to load the documentation
18using a series of heuristics.
19With these flags, return only the desired information:
20
21--homepage Open the home page of project.
22--list List documentation files only.
23
24For more information about a rock, see the 'show' command.
25]]
26
27--- Driver function for "doc" command.
28-- @param name or nil: an existing package name.
29-- @param version string or nil: a version may also be passed.
30-- @return boolean: True if succeeded, nil on errors.
31function run(...)
32 local flags, name, version = util.parse_flags(...)
33 if not name then
34 return nil, "Argument missing. "..util.see_help("doc")
35 end
36
37 local repo
38 name, version, repo = show.pick_installed_rock(name, version, flags["tree"])
39 if not name then
40 return nil, version
41 end
42
43 local rockspec, err = fetch.load_local_rockspec(path.rockspec_file(name, version, repo))
44 if not rockspec then return nil,err end
45 local descript = rockspec.description or {}
46
47 if flags["homepage"] then
48 if not descript.homepage then
49 return nil, "No 'homepage' field in rockspec for "..name.." "..version
50 end
51 util.printout("Opening "..descript.homepage.." ...")
52 fs.browser(descript.homepage)
53 return true
54 end
55
56 local directory = path.install_dir(name,version,repo)
57
58 local docdir
59 local directories = { "doc", "docs" }
60 for _, d in ipairs(directories) do
61 local dirname = dir.path(directory, d)
62 if fs.is_dir(dirname) then
63 docdir = dirname
64 break
65 end
66 end
67 if not docdir then
68 if descript.homepage and not flags["list"] then
69 util.printout("Local documentation directory not found -- opening "..descript.homepage.." ...")
70 fs.browser(descript.homepage)
71 return true
72 end
73 return nil, "Documentation directory not found for "..name.." "..version
74 end
75
76 docdir = dir.normalize(docdir):gsub("/+", "/")
77 local files = fs.find(docdir)
78 local htmlpatt = "%.html?$"
79 local extensions = { htmlpatt, "%.md$", "%.txt$", "%.textile$", "" }
80 local basenames = { "index", "readme", "manual" }
81
82 local porcelain = flags["porcelain"]
83 if #files > 0 then
84 util.title("Documentation files for "..name.." "..version, porcelain)
85 if porcelain then
86 for _, file in ipairs(files) do
87 util.printout(docdir.."/"..file)
88 end
89 else
90 util.printout(docdir.."/")
91 for _, file in ipairs(files) do
92 util.printout("\t"..file)
93 end
94 end
95 end
96
97 if flags["list"] then
98 return true
99 end
100
101 for _, extension in ipairs(extensions) do
102 for _, basename in ipairs(basenames) do
103 local filename = basename..extension
104 local found
105 for _, file in ipairs(files) do
106 if file:lower():match(filename) and ((not found) or #file < #found) then
107 found = file
108 end
109 end
110 if found then
111 local pathname = dir.path(docdir, found)
112 util.printout()
113 util.printout("Opening "..pathname.." ...")
114 util.printout()
115 local ok = fs.browser(pathname)
116 if not ok and not pathname:match(htmlpatt) then
117 local fd = io.open(pathname, "r")
118 util.printout(fd:read("*a"))
119 fd:close()
120 end
121 return true
122 end
123 end
124 end
125
126 return true
127end
128
diff --git a/src/luarocks/fetch.lua b/src/luarocks/fetch.lua
index 53c9d748..83ab6fa9 100644
--- a/src/luarocks/fetch.lua
+++ b/src/luarocks/fetch.lua
@@ -137,9 +137,11 @@ end
137--- Back-end function that actually loads the local rockspec. 137--- Back-end function that actually loads the local rockspec.
138-- Performs some validation and postprocessing of the rockspec contents. 138-- Performs some validation and postprocessing of the rockspec contents.
139-- @param filename string: The local filename of the rockspec file. 139-- @param filename string: The local filename of the rockspec file.
140-- @param quick boolean: if true, skips some steps when loading
141-- rockspec.
140-- @return table or (nil, string): A table representing the rockspec 142-- @return table or (nil, string): A table representing the rockspec
141-- or nil followed by an error message. 143-- or nil followed by an error message.
142function load_local_rockspec(filename) 144function load_local_rockspec(filename, quick)
143 assert(type(filename) == "string") 145 assert(type(filename) == "string")
144 filename = fs.absolute_name(filename) 146 filename = fs.absolute_name(filename)
145 local rockspec, err = persist.load_into_table(filename) 147 local rockspec, err = persist.load_into_table(filename)
@@ -147,9 +149,12 @@ function load_local_rockspec(filename)
147 return nil, "Could not load rockspec file "..filename.." ("..err..")" 149 return nil, "Could not load rockspec file "..filename.." ("..err..")"
148 end 150 end
149 151
150 local ok, err = type_check.type_check_rockspec(rockspec) 152 local ok, err = true, nil
151 if not ok then 153 if not quick then
152 return nil, filename..": "..err 154 ok, err = type_check.type_check_rockspec(rockspec)
155 if not ok then
156 return nil, filename..": "..err
157 end
153 end 158 end
154 159
155 if rockspec.rockspec_format then 160 if rockspec.rockspec_format then
@@ -207,9 +212,8 @@ function load_local_rockspec(filename)
207 else 212 else
208 rockspec.dependencies = {} 213 rockspec.dependencies = {}
209 end 214 end
210 local ok, err = path.configure_paths(rockspec) 215 if not quick then
211 if err then 216 path.configure_paths(rockspec)
212 return nil, "Error verifying paths: "..err
213 end 217 end
214 218
215 return rockspec 219 return rockspec
diff --git a/src/luarocks/fs/unix/tools.lua b/src/luarocks/fs/unix/tools.lua
index 5495760b..7535d679 100644
--- a/src/luarocks/fs/unix/tools.lua
+++ b/src/luarocks/fs/unix/tools.lua
@@ -341,3 +341,7 @@ function get_permissions(filename)
341 pipe:close() 341 pipe:close()
342 return ret 342 return ret
343end 343end
344
345function browser(url)
346 return fs.execute(cfg.web_browser, url)
347end
diff --git a/src/luarocks/fs/win32/tools.lua b/src/luarocks/fs/win32/tools.lua
index 345ec682..24197f47 100644
--- a/src/luarocks/fs/win32/tools.lua
+++ b/src/luarocks/fs/win32/tools.lua
@@ -362,3 +362,7 @@ function exists(file)
362 assert(file) 362 assert(file)
363 return fs.execute_quiet("if not exist " .. fs.Q(file) .. " invalidcommandname") 363 return fs.execute_quiet("if not exist " .. fs.Q(file) .. " invalidcommandname")
364end 364end
365
366function browser(url)
367 return fs.execute(cfg.web_browser.." "..url)
368end
diff --git a/src/luarocks/help.lua b/src/luarocks/help.lua
index 2774dc41..2136f5da 100644
--- a/src/luarocks/help.lua
+++ b/src/luarocks/help.lua
@@ -71,14 +71,10 @@ function run(...)
71 can be overriden with VAR=VALUE assignments.]]) 71 can be overriden with VAR=VALUE assignments.]])
72 print_section("COMMANDS") 72 print_section("COMMANDS")
73 local names = {} 73 local names = {}
74 for name, command in pairs(commands) do 74 for name, command in util.sortedpairs(commands) do
75 table.insert(names, name) 75 local cmd = require(command)
76 end
77 table.sort(names)
78 for _, name in ipairs(names) do
79 local command = commands[name]
80 util.printout("", name) 76 util.printout("", name)
81 util.printout("\t", command.help_summary) 77 util.printout("\t", cmd.help_summary)
82 end 78 end
83 print_section("CONFIGURATION") 79 print_section("CONFIGURATION")
84 util.printout("\tLua version: " .. cfg.lua_version) 80 util.printout("\tLua version: " .. cfg.lua_version)
@@ -100,15 +96,16 @@ function run(...)
100 end 96 end
101 else 97 else
102 command = command:gsub("-", "_") 98 command = command:gsub("-", "_")
103 if commands[command] then 99 local cmd = require(commands[command])
104 local arguments = commands[command].help_arguments or "<argument>" 100 if cmd then
101 local arguments = cmd.help_arguments or "<argument>"
105 print_banner() 102 print_banner()
106 print_section("NAME") 103 print_section("NAME")
107 util.printout("\t"..program.." "..command.." - "..commands[command].help_summary) 104 util.printout("\t"..program.." "..command.." - "..cmd.help_summary)
108 print_section("SYNOPSIS") 105 print_section("SYNOPSIS")
109 util.printout("\t"..program.." "..command.." "..arguments) 106 util.printout("\t"..program.." "..command.." "..arguments)
110 print_section("DESCRIPTION") 107 print_section("DESCRIPTION")
111 util.printout("",(commands[command].help:gsub("\n","\n\t"):gsub("\n\t$",""))) 108 util.printout("",(cmd.help:gsub("\n","\n\t"):gsub("\n\t$","")))
112 print_section("SEE ALSO") 109 print_section("SEE ALSO")
113 util.printout("","'"..program.." help' for general options and configuration.\n") 110 util.printout("","'"..program.." help' for general options and configuration.\n")
114 else 111 else
diff --git a/src/luarocks/index.lua b/src/luarocks/index.lua
index e0785d9c..1ce66f70 100644
--- a/src/luarocks/index.lua
+++ b/src/luarocks/index.lua
@@ -139,15 +139,14 @@ function make_index(repo)
139 output = output..version..':&nbsp;' 139 output = output..version..':&nbsp;'
140 table.sort(data, function(a,b) return a.arch < b.arch end) 140 table.sort(data, function(a,b) return a.arch < b.arch end)
141 for _, item in ipairs(data) do 141 for _, item in ipairs(data) do
142 local link = '<a href="$url">'..item.arch..'</a>' 142 local file
143 if item.arch == 'rockspec' then 143 if item.arch == 'rockspec' then
144 local rs = ("%s-%s.rockspec"):format(package, version) 144 file = ("%s-%s.rockspec"):format(package, version)
145 if not latest_rockspec then latest_rockspec = rs end 145 if not latest_rockspec then latest_rockspec = file end
146 link = link:gsub("$url", rs)
147 else 146 else
148 link = link:gsub("$url", ("%s-%s.%s.rock"):format(package, version, item.arch)) 147 file = ("%s-%s.%s.rock"):format(package, version, item.arch)
149 end 148 end
150 table.insert(versions, link) 149 table.insert(versions, '<a href="'..file..'">'..item.arch..'</a>')
151 end 150 end
152 output = output .. table.concat(versions, ',&nbsp;') .. '<br/>' 151 output = output .. table.concat(versions, ',&nbsp;') .. '<br/>'
153 end 152 end
diff --git a/src/luarocks/manif.lua b/src/luarocks/manif.lua
index 238c4056..3fb3e4e3 100644
--- a/src/luarocks/manif.lua
+++ b/src/luarocks/manif.lua
@@ -141,12 +141,18 @@ function load_manifest(repo_url)
141 end 141 end
142 end 142 end
143 if pathname:match(".*%.zip$") then 143 if pathname:match(".*%.zip$") then
144 pathname = fs.absolute_name(pathname)
144 local dir = dir.dir_name(pathname) 145 local dir = dir.dir_name(pathname)
145 fs.change_dir(dir) 146 fs.change_dir(dir)
146 local nozip = pathname:match("(.*)%.zip$") 147 local nozip = pathname:match("(.*)%.zip$")
147 fs.delete(nozip) 148 fs.delete(nozip)
148 fs.unzip(pathname) 149 local ok = fs.unzip(pathname)
149 fs.pop_dir() 150 fs.pop_dir()
151 if not ok then
152 fs.delete(pathname)
153 fs.delete(pathname..".timestamp")
154 return nil, "Failed extracting manifest file"
155 end
150 pathname = nozip 156 pathname = nozip
151 end 157 end
152 return manif_core.manifest_loader(pathname, repo_url) 158 return manif_core.manifest_loader(pathname, repo_url)
@@ -231,18 +237,11 @@ end
231-- @param deps_mode string: Dependency mode: "one" for the current default tree, 237-- @param deps_mode string: Dependency mode: "one" for the current default tree,
232-- "all" for all trees, "order" for all trees with priority >= the current default, 238-- "all" for all trees, "order" for all trees with priority >= the current default,
233-- "none" for no trees. 239-- "none" for no trees.
234-- @param repodir string: directory of repository being scanned 240local function update_dependencies(manifest, deps_mode)
235-- @param filter_lua string or nil: filter by Lua version
236-- @param cache table: temporary rockspec cache table
237local function update_dependencies(manifest, deps_mode, repodir, filter_lua, cache)
238 assert(type(manifest) == "table") 241 assert(type(manifest) == "table")
239 assert(type(deps_mode) == "string") 242 assert(type(deps_mode) == "string")
240 243
241 cache = cache or {}
242 local lua_version = filter_lua and deps.parse_version(filter_lua)
243
244 for pkg, versions in pairs(manifest.repository) do 244 for pkg, versions in pairs(manifest.repository) do
245 local to_remove = {}
246 for version, repositories in pairs(versions) do 245 for version, repositories in pairs(versions) do
247 local current = pkg.." "..version 246 local current = pkg.." "..version
248 for _, repo in ipairs(repositories) do 247 for _, repo in ipairs(repositories) do
@@ -259,11 +258,34 @@ local function update_dependencies(manifest, deps_mode, repodir, filter_lua, cac
259 end 258 end
260 end 259 end
261 end 260 end
262 elseif filter_lua and repo.arch == "rockspec" then 261 end
262 end
263 end
264 end
265end
266
267--- Filter manifest table by Lua version, removing rockspecs whose Lua version
268-- does not match.
269-- @param manifest table: a manifest table.
270-- @param lua_version string or nil: filter by Lua version
271-- @param repodir string: directory of repository being scanned
272-- @param cache table: temporary rockspec cache table
273local function filter_by_lua_version(manifest, lua_version, repodir, cache)
274 assert(type(manifest) == "table")
275 assert(type(repodir) == "string")
276 assert((not cache) or type(cache) == "table")
277
278 cache = cache or {}
279 lua_version = deps.parse_version(lua_version)
280 for pkg, versions in pairs(manifest.repository) do
281 local to_remove = {}
282 for version, repositories in pairs(versions) do
283 for _, repo in ipairs(repositories) do
284 if repo.arch == "rockspec" then
263 local pathname = dir.path(repodir, pkg.."-"..version..".rockspec") 285 local pathname = dir.path(repodir, pkg.."-"..version..".rockspec")
264 local rockspec, err = cache[pathname] 286 local rockspec, err = cache[pathname]
265 if not rockspec then 287 if not rockspec then
266 rockspec, err = fetch.load_local_rockspec(pathname) 288 rockspec, err = fetch.load_local_rockspec(pathname, true)
267 end 289 end
268 if rockspec then 290 if rockspec then
269 cache[pathname] = rockspec 291 cache[pathname] = rockspec
@@ -283,9 +305,9 @@ local function update_dependencies(manifest, deps_mode, repodir, filter_lua, cac
283 end 305 end
284 if next(to_remove) then 306 if next(to_remove) then
285 for _, incompat in ipairs(to_remove) do 307 for _, incompat in ipairs(to_remove) do
286 manifest.repository[pkg][incompat] = nil 308 versions[incompat] = nil
287 end 309 end
288 if not next(manifest.repository[pkg]) then 310 if not next(versions) then
289 manifest.repository[pkg] = nil 311 manifest.repository[pkg] = nil
290 end 312 end
291 end 313 end
@@ -296,17 +318,12 @@ end
296-- @param results table: The search results as returned by search.disk_search. 318-- @param results table: The search results as returned by search.disk_search.
297-- @param manifest table: A manifest table (must contain repository, modules, commands tables). 319-- @param manifest table: A manifest table (must contain repository, modules, commands tables).
298-- It will be altered to include the search results. 320-- It will be altered to include the search results.
299-- @param deps_mode string: Dependency mode: "one" for the current default tree, 321-- @param dep_handler: dependency handler function
300-- "all" for all trees, "order" for all trees with priority >= the current default,
301-- "none" for no trees.
302-- @param repo string: directory of repository
303-- @param filter_lua string or nil: filter by Lua version
304-- @param cache table: temporary rockspec cache table
305-- @return boolean or (nil, string): true in case of success, or nil followed by an error message. 322-- @return boolean or (nil, string): true in case of success, or nil followed by an error message.
306local function store_results(results, manifest, deps_mode, repo, filter_lua, cache) 323local function store_results(results, manifest, dep_handler)
307 assert(type(results) == "table") 324 assert(type(results) == "table")
308 assert(type(manifest) == "table") 325 assert(type(manifest) == "table")
309 assert(type(deps_mode) == "string") 326 assert((not dep_handler) or type(dep_handler) == "function")
310 327
311 for name, versions in pairs(results) do 328 for name, versions in pairs(results) do
312 local pkgtable = manifest.repository[name] or {} 329 local pkgtable = manifest.repository[name] or {}
@@ -329,7 +346,9 @@ local function store_results(results, manifest, deps_mode, repo, filter_lua, cac
329 end 346 end
330 manifest.repository[name] = pkgtable 347 manifest.repository[name] = pkgtable
331 end 348 end
332 update_dependencies(manifest, deps_mode, repo, filter_lua, cache) 349 if dep_handler then
350 dep_handler(manifest)
351 end
333 sort_package_matching_table(manifest.modules) 352 sort_package_matching_table(manifest.modules)
334 sort_package_matching_table(manifest.commands) 353 sort_package_matching_table(manifest.commands)
335 return true 354 return true
@@ -345,7 +364,7 @@ end
345-- @param versioned boolean: if versioned versions of the manifest should be created. 364-- @param versioned boolean: if versioned versions of the manifest should be created.
346-- @return boolean or (nil, string): True if manifest was generated, 365-- @return boolean or (nil, string): True if manifest was generated,
347-- or nil and an error message. 366-- or nil and an error message.
348function make_manifest(repo, deps_mode, versioned) 367function make_manifest(repo, deps_mode, remote)
349 assert(type(repo) == "string") 368 assert(type(repo) == "string")
350 assert(type(deps_mode) == "string") 369 assert(type(deps_mode) == "string")
351 370
@@ -363,14 +382,23 @@ function make_manifest(repo, deps_mode, versioned)
363 382
364 manif_core.manifest_cache[repo] = manifest 383 manif_core.manifest_cache[repo] = manifest
365 384
366 local cache = {} 385 local dep_handler = nil
367 local ok, err = store_results(results, manifest, deps_mode, repo, nil, cache) 386 if not remote then
387 dep_handler = function(manifest)
388 update_dependencies(manifest, deps_mode)
389 end
390 end
391 local ok, err = store_results(results, manifest, dep_handler)
368 if not ok then return nil, err end 392 if not ok then return nil, err end
369 393
370 if versioned then 394 if remote then
395 local cache = {}
371 for luaver in util.lua_versions() do 396 for luaver in util.lua_versions() do
372 local vmanifest = { repository = {}, modules = {}, commands = {} } 397 local vmanifest = { repository = {}, modules = {}, commands = {} }
373 local ok, err = store_results(results, vmanifest, deps_mode, repo, luaver, cache) 398 local dep_handler = function(manifest)
399 filter_by_lua_version(manifest, luaver, repo, cache)
400 end
401 local ok, err = store_results(results, vmanifest, dep_handler)
374 save_table(repo, "manifest-"..luaver, vmanifest) 402 save_table(repo, "manifest-"..luaver, vmanifest)
375 end 403 end
376 end 404 end
@@ -416,7 +444,10 @@ function update_manifest(name, version, repo, deps_mode)
416 444
417 local results = {[name] = {[version] = {{arch = "installed", repo = repo}}}} 445 local results = {[name] = {[version] = {{arch = "installed", repo = repo}}}}
418 446
419 local ok, err = store_results(results, manifest, deps_mode, repo) 447 local dep_handler = function(manifest)
448 update_dependencies(manifest, deps_mode)
449 end
450 local ok, err = store_results(results, manifest, dep_handler)
420 if not ok then return nil, err end 451 if not ok then return nil, err end
421 452
422 return save_table(repo, "manifest", manifest) 453 return save_table(repo, "manifest", manifest)
diff --git a/src/luarocks/search.lua b/src/luarocks/search.lua
index 76ea6815..ad205d6a 100644
--- a/src/luarocks/search.lua
+++ b/src/luarocks/search.lua
@@ -139,14 +139,15 @@ function disk_search(repo, query, results)
139 for _, name in pairs(fs.list_dir(repo)) do 139 for _, name in pairs(fs.list_dir(repo)) do
140 local pathname = dir.path(repo, name) 140 local pathname = dir.path(repo, name)
141 local rname, rversion, rarch = path.parse_name(name) 141 local rname, rversion, rarch = path.parse_name(name)
142 if fs.is_dir(pathname) then 142
143 if rname and (pathname:match(".rockspec$") or pathname:match(".rock$")) then
144 store_if_match(results, repo, rname, rversion, rarch, query)
145 elseif fs.is_dir(pathname) then
143 for _, version in pairs(fs.list_dir(pathname)) do 146 for _, version in pairs(fs.list_dir(pathname)) do
144 if version:match("-%d+$") then 147 if version:match("-%d+$") then
145 store_if_match(results, repo, name, version, "installed", query) 148 store_if_match(results, repo, name, version, "installed", query)
146 end 149 end
147 end 150 end
148 elseif rname then
149 store_if_match(results, repo, rname, rversion, rarch, query)
150 end 151 end
151 end 152 end
152 return results 153 return results
diff --git a/src/luarocks/show.lua b/src/luarocks/show.lua
index 536085a7..2e039dd4 100644
--- a/src/luarocks/show.lua
+++ b/src/luarocks/show.lua
@@ -66,22 +66,14 @@ local function module_name(mod, filename, name, version, repo, manifest)
66 return dir.path(base_dir, filename) 66 return dir.path(base_dir, filename)
67end 67end
68 68
69--- Driver function for "show" command. 69function pick_installed_rock(name, version, tree)
70-- @param name or nil: an existing package name.
71-- @param version string or nil: a version may also be passed.
72-- @return boolean: True if succeeded, nil on errors.
73function run(...)
74 local flags, name, version = util.parse_flags(...)
75 if not name then
76 return nil, "Argument missing. "..util.see_help("show")
77 end
78 local results = {} 70 local results = {}
79 local query = search.make_query(name, version) 71 local query = search.make_query(name, version)
80 query.exact_name = true 72 query.exact_name = true
81 local tree_map = {} 73 local tree_map = {}
82 local trees = cfg.rocks_trees 74 local trees = cfg.rocks_trees
83 if flags["tree"] then 75 if tree then
84 trees = { flags["tree"] } 76 trees = { tree }
85 end 77 end
86 for _, tree in ipairs(trees) do 78 for _, tree in ipairs(trees) do
87 local rocks_dir = path.rocks_dir(tree) 79 local rocks_dir = path.rocks_dir(tree)
@@ -103,8 +95,26 @@ function run(...)
103 for _, rp in ipairs(repositories) do repo_url = rp.repo end 95 for _, rp in ipairs(repositories) do repo_url = rp.repo end
104 end 96 end
105 97
106
107 local repo = tree_map[repo_url] 98 local repo = tree_map[repo_url]
99 return name, version, repo, repo_url
100end
101
102--- Driver function for "show" command.
103-- @param name or nil: an existing package name.
104-- @param version string or nil: a version may also be passed.
105-- @return boolean: True if succeeded, nil on errors.
106function run(...)
107 local flags, name, version = util.parse_flags(...)
108 if not name then
109 return nil, "Argument missing. "..util.see_help("show")
110 end
111
112 local repo, repo_url
113 name, version, repo, repo_url = pick_installed_rock(name, version, flags["tree"])
114 if not name then
115 return nil, version
116 end
117
108 local directory = path.install_dir(name,version,repo) 118 local directory = path.install_dir(name,version,repo)
109 local rockspec_file = path.rockspec_file(name, version, repo) 119 local rockspec_file = path.rockspec_file(name, version, repo)
110 local rockspec, err = fetch.load_local_rockspec(rockspec_file) 120 local rockspec, err = fetch.load_local_rockspec(rockspec_file)