aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorThijs Schreijer <thijs@thijsschreijer.nl>2014-01-11 13:54:13 +0100
committerThijs Schreijer <thijs@thijsschreijer.nl>2014-01-11 13:54:13 +0100
commit1e0af10c6d824bcebb15d4d61da712911c20f168 (patch)
tree1bf9f695a1372731700da342521fc993f0e64424 /src
parent60323b48f917e2c7495d3899a3c4bec87cd98750 (diff)
parent17f1c5d3600fa24c670d78bc9e9931502309bf36 (diff)
downloadluarocks-1e0af10c6d824bcebb15d4d61da712911c20f168.tar.gz
luarocks-1e0af10c6d824bcebb15d4d61da712911c20f168.tar.bz2
luarocks-1e0af10c6d824bcebb15d4d61da712911c20f168.zip
Merge branch 'master' of https://github.com/keplerproject/luarocks
Diffstat (limited to 'src')
-rwxr-xr-xsrc/bin/luarocks36
-rwxr-xr-xsrc/bin/luarocks-admin11
-rw-r--r--src/luarocks/build.lua3
-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/install.lua3
-rw-r--r--src/luarocks/manif.lua87
-rw-r--r--src/luarocks/remove.lua3
-rw-r--r--src/luarocks/search.lua7
-rw-r--r--src/luarocks/show.lua34
-rw-r--r--src/luarocks/util.lua20
-rw-r--r--src/luarocks/write_rockspec.lua66
21 files changed, 359 insertions, 120 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.lua b/src/luarocks/build.lua
index ec269023..72b5649e 100644
--- a/src/luarocks/build.lua
+++ b/src/luarocks/build.lua
@@ -31,7 +31,8 @@ or the name of a rock to be fetched from a repository.
31 rock after building a new one. This behavior can 31 rock after building a new one. This behavior can
32 be made permanent by setting keep_other_versions=true 32 be made permanent by setting keep_other_versions=true
33 in the configuration file. 33 in the configuration file.
34]] 34
35]]..util.deps_mode_help()
35 36
36--- Install files to a given location. 37--- Install files to a given location.
37-- Takes a table where the array part is a list of filenames to be copied. 38-- Takes a table where the array part is a list of filenames to be copied.
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/install.lua b/src/luarocks/install.lua
index b28e6282..7458ec8e 100644
--- a/src/luarocks/install.lua
+++ b/src/luarocks/install.lua
@@ -25,7 +25,8 @@ or a filename of a locally available rock.
25 rock after installing a new one. This behavior can 25 rock after installing a new one. This behavior can
26 be made permanent by setting keep_other_versions=true 26 be made permanent by setting keep_other_versions=true
27 in the configuration file. 27 in the configuration file.
28]] 28]]..util.deps_mode_help()
29
29 30
30--- Install a binary rock. 31--- Install a binary rock.
31-- @param rock_file string: local or remote filename of a rock. 32-- @param rock_file string: local or remote filename of a rock.
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/remove.lua b/src/luarocks/remove.lua
index f2f6997b..8f751a93 100644
--- a/src/luarocks/remove.lua
+++ b/src/luarocks/remove.lua
@@ -22,7 +22,8 @@ Will only perform the removal if it does not break dependencies.
22To override this check and force the removal, use --force. 22To override this check and force the removal, use --force.
23To perform a forced removal without reporting dependency issues, 23To perform a forced removal without reporting dependency issues,
24use --force=fast. 24use --force=fast.
25]] 25
26]]..util.deps_mode_help()
26 27
27--- Obtain a list of packages that depend on the given set of packages 28--- Obtain a list of packages that depend on the given set of packages
28-- (where all packages of the set are versions of one program). 29-- (where all packages of the set are versions of one program).
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)
diff --git a/src/luarocks/util.lua b/src/luarocks/util.lua
index 1a60fd9c..4b138516 100644
--- a/src/luarocks/util.lua
+++ b/src/luarocks/util.lua
@@ -8,6 +8,8 @@ local global_env = _G
8 8
9module("luarocks.util", package.seeall) 9module("luarocks.util", package.seeall)
10 10
11local cfg = require("luarocks.cfg")
12
11local scheduled_functions = {} 13local scheduled_functions = {}
12local debug = require("debug") 14local debug = require("debug")
13 15
@@ -371,6 +373,24 @@ function this_program(default)
371 return last:sub(2) 373 return last:sub(2)
372end 374end
373 375
376function deps_mode_help(program)
377 return [[
378--deps-mode=<mode> How to handle dependencies. Four modes are supported:
379 * all - use all trees from the rocks_trees list
380 for finding dependencies
381 * one - use only the current tree (possibly set
382 with --tree)
383 * order - use trees based on order (use the current
384 tree and all trees below it on the rocks_trees list)
385 * none - ignore dependencies altogether.
386 The default mode may be set with the deps_mode entry
387 in the configuration file.
388 The current default is "]]..cfg.deps_mode..[[".
389 Type ']]..this_program(program or "luarocks")..[[' with no arguments to see
390 your list of rocks trees.
391]]
392end
393
374function see_help(command, program) 394function see_help(command, program)
375 return "See '"..this_program(program or "luarocks")..' help '..command.."'." 395 return "See '"..this_program(program or "luarocks")..' help '..command.."'."
376end 396end
diff --git a/src/luarocks/write_rockspec.lua b/src/luarocks/write_rockspec.lua
index f8035b8d..a27f0b63 100644
--- a/src/luarocks/write_rockspec.lua
+++ b/src/luarocks/write_rockspec.lua
@@ -31,10 +31,14 @@ rockspec, and is not guaranteed to be complete or correct.
31--homepage=<url> Project homepage. 31--homepage=<url> Project homepage.
32--lua-version=<ver> Supported Lua versions. Accepted values are "5.1", "5.2" 32--lua-version=<ver> Supported Lua versions. Accepted values are "5.1", "5.2"
33 or "5.1,5.2". 33 or "5.1,5.2".
34--tag=<tag> Tag to use. Will attempt to extract version number from it.
34--lib=<lib>[,<lib>] A comma-separated list of libraries that C files need to 35--lib=<lib>[,<lib>] A comma-separated list of libraries that C files need to
35 link to. 36 link to.
36]] 37]]
37 38
39local function open_file(name)
40 return io.open(dir.path(fs.current_dir(), name), "r")
41end
38 42
39local function get_url(rockspec) 43local function get_url(rockspec)
40 local url = rockspec.source.url 44 local url = rockspec.source.url
@@ -79,12 +83,11 @@ local function configure_lua_version(rockspec, luaver)
79end 83end
80 84
81local function detect_description(rockspec) 85local function detect_description(rockspec)
82 local fd = io.open("README.md", "r") 86 local fd = open_file("README.md") or open_file("README")
83 if not fd then fd = io.open("README", "r") end
84 if not fd then return end 87 if not fd then return end
85 local data = fd:read("*a") 88 local data = fd:read("*a")
86 fd:close() 89 fd:close()
87 local paragraph = data:match("\n\n(.-)\n\n") 90 local paragraph = data:match("\n\n([^%[].-)\n\n")
88 if not paragraph then paragraph = data:match("\n\n(.*)") end 91 if not paragraph then paragraph = data:match("\n\n(.*)") end
89 if paragraph then 92 if paragraph then
90 if #paragraph < 80 then 93 if #paragraph < 80 then
@@ -100,19 +103,32 @@ local function detect_description(rockspec)
100 end 103 end
101end 104end
102 105
106local function detect_mit_license(data)
107 local strip_copyright = (data:gsub("Copyright [^\n]*\n", ""))
108 local sum = 0
109 for i = 1, #strip_copyright do
110 local num = string.byte(strip_copyright:sub(i,i))
111 if num > 32 and num <= 128 then
112 sum = sum + num
113 end
114 end
115 return sum == 78656
116end
117
103local function show_license(rockspec) 118local function show_license(rockspec)
104 local fd = io.open("COPYING", "r") 119 local fd = open_file("COPYING") or open_file("LICENSE") or open_file("MIT-LICENSE.txt")
105 if not fd then fd = io.open("LICENSE", "r") end 120 if not fd then return nil end
106 if not fd then return end
107 local data = fd:read("*a") 121 local data = fd:read("*a")
108 fd:close() 122 fd:close()
123 local is_mit = detect_mit_license(data)
109 util.title("License for "..rockspec.package..":") 124 util.title("License for "..rockspec.package..":")
110 util.printout(data) 125 util.printout(data)
111 util.printout() 126 util.printout()
127 return is_mit
112end 128end
113 129
114local function get_cmod_name(file) 130local function get_cmod_name(file)
115 local fd = io.open(file, "r") 131 local fd = open_file(file)
116 if not fd then return nil end 132 if not fd then return nil end
117 local data = fd:read("*a") 133 local data = fd:read("*a")
118 fd:close() 134 fd:close()
@@ -199,22 +215,35 @@ function run(...)
199 elseif not url_or_dir then 215 elseif not url_or_dir then
200 url_or_dir = version 216 url_or_dir = version
201 end 217 end
218
219 if flags["tag"] == true then
220 return nil, "Incorrect usage: --tag requires an argument. "..util.see_help("write_rockspec")
221 end
222
223 if flags["tag"] then
224 if not version then
225 version = flags["tag"]:gsub("^v", "")
226 end
227 end
202 228
203 local protocol, pathname = dir.split_url(url_or_dir) 229 local protocol, pathname = dir.split_url(url_or_dir)
204 if not fetch.is_basic_protocol(protocol) then 230 if not fetch.is_basic_protocol(protocol) then
205 version = "scm"
206 if not name then 231 if not name then
207 name = dir.base_name(url_or_dir):gsub("%.[^.]+$", "") 232 name = dir.base_name(url_or_dir):gsub("%.[^.]+$", "")
208 end 233 end
234 if not version then
235 version = "scm"
236 end
209 elseif protocol ~= "file" then 237 elseif protocol ~= "file" then
210 local filename = dir.base_name(url_or_dir) 238 local filename = dir.base_name(url_or_dir)
211 local newname, newversion = filename:match("(.*)-([^-]+)") 239 local newname, newversion = filename:match("(.*)-([^-]+)")
212 if not name then 240 if (not name) and newname then
213 name = newname 241 name = newname
214 end 242 end
215 if newversion then 243 if (not version) and newversion then
216 version = newversion:gsub(".[a-z]+$", ""):gsub(".tar$", "") 244 version = newversion:gsub(".[a-z]+$", ""):gsub(".tar$", "")
217 else 245 end
246 if not (name and version) then
218 return nil, "Missing name and version arguments. "..util.see_help("write_rockspec") 247 return nil, "Missing name and version arguments. "..util.see_help("write_rockspec")
219 end 248 end
220 elseif not version then 249 elseif not version then
@@ -222,13 +251,18 @@ function run(...)
222 end 251 end
223 252
224 local filename = flags["output"] or dir.path(fs.current_dir(), name:lower().."-"..version.."-1.rockspec") 253 local filename = flags["output"] or dir.path(fs.current_dir(), name:lower().."-"..version.."-1.rockspec")
254
255 if not flags["homepage"] and url_or_dir:match("^git://github.com") then
256 flags["homepage"] = "http://"..url_or_dir:match("^[^:]+://(.*)")
257 end
225 258
226 local rockspec = { 259 local rockspec = {
227 package = name, 260 package = name,
228 name = name:lower(), 261 name = name:lower(),
229 version = version.."-1", 262 version = version.."-1",
230 source = { 263 source = {
231 url = "*** please add URL for source tarball, zip or repository here ***" 264 url = "*** please add URL for source tarball, zip or repository here ***",
265 tag = flags["tag"],
232 }, 266 },
233 description = { 267 description = {
234 summary = flags["summary"] or "*** please specify description summary ***", 268 summary = flags["summary"] or "*** please specify description summary ***",
@@ -252,7 +286,7 @@ function run(...)
252 rockspec.source.dir = "dummy" 286 rockspec.source.dir = "dummy"
253 if not fetch.is_basic_protocol(rockspec.source.protocol) then 287 if not fetch.is_basic_protocol(rockspec.source.protocol) then
254 if version ~= "scm" then 288 if version ~= "scm" then
255 rockspec.source.tag = "v" .. version 289 rockspec.source.tag = flags["tag"] or "v" .. version
256 end 290 end
257 end 291 end
258 rockspec.source.dir = nil 292 rockspec.source.dir = nil
@@ -290,7 +324,11 @@ function run(...)
290 324
291 detect_description(rockspec) 325 detect_description(rockspec)
292 326
293 show_license(rockspec) 327 local is_mit = show_license(rockspec)
328
329 if is_mit and not flags["license"] then
330 rockspec.description.license = "MIT"
331 end
294 332
295 fill_as_builtin(rockspec, libs) 333 fill_as_builtin(rockspec, libs)
296 334