aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rwxr-xr-xsrc/bin/luarocks35
-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/command_line.lua3
-rw-r--r--src/luarocks/deps.lua2
-rw-r--r--src/luarocks/dir.lua14
-rw-r--r--src/luarocks/fetch.lua18
-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.lua79
-rw-r--r--src/luarocks/remove.lua3
-rw-r--r--src/luarocks/search.lua7
-rw-r--r--src/luarocks/util.lua20
-rw-r--r--src/luarocks/write_rockspec.lua66
16 files changed, 190 insertions, 107 deletions
diff --git a/src/bin/luarocks b/src/bin/luarocks
index 6ab27fa3..72f04c83 100755
--- a/src/bin/luarocks
+++ b/src/bin/luarocks
@@ -5,22 +5,23 @@ 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}
25 26
26command_line.run_command(...) 27command_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/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/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/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..ed1780b3 100644
--- a/src/luarocks/manif.lua
+++ b/src/luarocks/manif.lua
@@ -231,18 +231,11 @@ end
231-- @param deps_mode string: Dependency mode: "one" for the current default tree, 231-- @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, 232-- "all" for all trees, "order" for all trees with priority >= the current default,
233-- "none" for no trees. 233-- "none" for no trees.
234-- @param repodir string: directory of repository being scanned 234local 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") 235 assert(type(manifest) == "table")
239 assert(type(deps_mode) == "string") 236 assert(type(deps_mode) == "string")
240 237
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 238 for pkg, versions in pairs(manifest.repository) do
245 local to_remove = {}
246 for version, repositories in pairs(versions) do 239 for version, repositories in pairs(versions) do
247 local current = pkg.." "..version 240 local current = pkg.." "..version
248 for _, repo in ipairs(repositories) do 241 for _, repo in ipairs(repositories) do
@@ -259,11 +252,34 @@ local function update_dependencies(manifest, deps_mode, repodir, filter_lua, cac
259 end 252 end
260 end 253 end
261 end 254 end
262 elseif filter_lua and repo.arch == "rockspec" then 255 end
256 end
257 end
258 end
259end
260
261--- Filter manifest table by Lua version, removing rockspecs whose Lua version
262-- does not match.
263-- @param manifest table: a manifest table.
264-- @param lua_version string or nil: filter by Lua version
265-- @param repodir string: directory of repository being scanned
266-- @param cache table: temporary rockspec cache table
267local function filter_by_lua_version(manifest, lua_version, repodir, cache)
268 assert(type(manifest) == "table")
269 assert(type(repodir) == "string")
270 assert((not cache) or type(cache) == "table")
271
272 cache = cache or {}
273 lua_version = deps.parse_version(lua_version)
274 for pkg, versions in pairs(manifest.repository) do
275 local to_remove = {}
276 for version, repositories in pairs(versions) do
277 for _, repo in ipairs(repositories) do
278 if repo.arch == "rockspec" then
263 local pathname = dir.path(repodir, pkg.."-"..version..".rockspec") 279 local pathname = dir.path(repodir, pkg.."-"..version..".rockspec")
264 local rockspec, err = cache[pathname] 280 local rockspec, err = cache[pathname]
265 if not rockspec then 281 if not rockspec then
266 rockspec, err = fetch.load_local_rockspec(pathname) 282 rockspec, err = fetch.load_local_rockspec(pathname, true)
267 end 283 end
268 if rockspec then 284 if rockspec then
269 cache[pathname] = rockspec 285 cache[pathname] = rockspec
@@ -283,9 +299,9 @@ local function update_dependencies(manifest, deps_mode, repodir, filter_lua, cac
283 end 299 end
284 if next(to_remove) then 300 if next(to_remove) then
285 for _, incompat in ipairs(to_remove) do 301 for _, incompat in ipairs(to_remove) do
286 manifest.repository[pkg][incompat] = nil 302 versions[incompat] = nil
287 end 303 end
288 if not next(manifest.repository[pkg]) then 304 if not next(versions) then
289 manifest.repository[pkg] = nil 305 manifest.repository[pkg] = nil
290 end 306 end
291 end 307 end
@@ -296,17 +312,12 @@ end
296-- @param results table: The search results as returned by search.disk_search. 312-- @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). 313-- @param manifest table: A manifest table (must contain repository, modules, commands tables).
298-- It will be altered to include the search results. 314-- It will be altered to include the search results.
299-- @param deps_mode string: Dependency mode: "one" for the current default tree, 315-- @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. 316-- @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) 317local function store_results(results, manifest, dep_handler)
307 assert(type(results) == "table") 318 assert(type(results) == "table")
308 assert(type(manifest) == "table") 319 assert(type(manifest) == "table")
309 assert(type(deps_mode) == "string") 320 assert((not dep_handler) or type(dep_handler) == "function")
310 321
311 for name, versions in pairs(results) do 322 for name, versions in pairs(results) do
312 local pkgtable = manifest.repository[name] or {} 323 local pkgtable = manifest.repository[name] or {}
@@ -329,7 +340,9 @@ local function store_results(results, manifest, deps_mode, repo, filter_lua, cac
329 end 340 end
330 manifest.repository[name] = pkgtable 341 manifest.repository[name] = pkgtable
331 end 342 end
332 update_dependencies(manifest, deps_mode, repo, filter_lua, cache) 343 if dep_handler then
344 dep_handler(manifest)
345 end
333 sort_package_matching_table(manifest.modules) 346 sort_package_matching_table(manifest.modules)
334 sort_package_matching_table(manifest.commands) 347 sort_package_matching_table(manifest.commands)
335 return true 348 return true
@@ -345,7 +358,7 @@ end
345-- @param versioned boolean: if versioned versions of the manifest should be created. 358-- @param versioned boolean: if versioned versions of the manifest should be created.
346-- @return boolean or (nil, string): True if manifest was generated, 359-- @return boolean or (nil, string): True if manifest was generated,
347-- or nil and an error message. 360-- or nil and an error message.
348function make_manifest(repo, deps_mode, versioned) 361function make_manifest(repo, deps_mode, remote)
349 assert(type(repo) == "string") 362 assert(type(repo) == "string")
350 assert(type(deps_mode) == "string") 363 assert(type(deps_mode) == "string")
351 364
@@ -363,14 +376,23 @@ function make_manifest(repo, deps_mode, versioned)
363 376
364 manif_core.manifest_cache[repo] = manifest 377 manif_core.manifest_cache[repo] = manifest
365 378
366 local cache = {} 379 local dep_handler = nil
367 local ok, err = store_results(results, manifest, deps_mode, repo, nil, cache) 380 if not remote then
381 dep_handler = function(manifest)
382 update_dependencies(manifest, deps_mode)
383 end
384 end
385 local ok, err = store_results(results, manifest, dep_handler)
368 if not ok then return nil, err end 386 if not ok then return nil, err end
369 387
370 if versioned then 388 if remote then
389 local cache = {}
371 for luaver in util.lua_versions() do 390 for luaver in util.lua_versions() do
372 local vmanifest = { repository = {}, modules = {}, commands = {} } 391 local vmanifest = { repository = {}, modules = {}, commands = {} }
373 local ok, err = store_results(results, vmanifest, deps_mode, repo, luaver, cache) 392 local dep_handler = function(manifest)
393 filter_by_lua_version(manifest, luaver, repo, cache)
394 end
395 local ok, err = store_results(results, vmanifest, dep_handler)
374 save_table(repo, "manifest-"..luaver, vmanifest) 396 save_table(repo, "manifest-"..luaver, vmanifest)
375 end 397 end
376 end 398 end
@@ -416,7 +438,10 @@ function update_manifest(name, version, repo, deps_mode)
416 438
417 local results = {[name] = {[version] = {{arch = "installed", repo = repo}}}} 439 local results = {[name] = {[version] = {{arch = "installed", repo = repo}}}}
418 440
419 local ok, err = store_results(results, manifest, deps_mode, repo) 441 local dep_handler = function(manifest)
442 update_dependencies(manifest, deps_mode)
443 end
444 local ok, err = store_results(results, manifest, dep_handler)
420 if not ok then return nil, err end 445 if not ok then return nil, err end
421 446
422 return save_table(repo, "manifest", manifest) 447 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/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