aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/luarocks/add.lua11
-rw-r--r--src/luarocks/admin_remove.lua2
-rw-r--r--src/luarocks/build.lua12
-rw-r--r--src/luarocks/cfg.lua39
-rw-r--r--src/luarocks/fs/unix.lua6
-rw-r--r--src/luarocks/fs/win32.lua6
-rw-r--r--src/luarocks/fs/win32/tools.lua2
-rw-r--r--src/luarocks/install.lua3
-rw-r--r--src/luarocks/make_manifest.lua2
-rw-r--r--src/luarocks/manif.lua102
-rw-r--r--src/luarocks/path.lua26
-rw-r--r--src/luarocks/purge.lua2
-rw-r--r--src/luarocks/repos.lua20
-rw-r--r--src/luarocks/tools/patch.lua2
-rw-r--r--src/luarocks/unpack.lua4
-rw-r--r--src/luarocks/util.lua9
16 files changed, 195 insertions, 53 deletions
diff --git a/src/luarocks/add.lua b/src/luarocks/add.lua
index 30db9a48..d7c293e5 100644
--- a/src/luarocks/add.lua
+++ b/src/luarocks/add.lua
@@ -65,7 +65,7 @@ local function add_files_to_server(refresh, rockfiles, server, upload_server)
65 fs.change_dir(local_cache) 65 fs.change_dir(local_cache)
66 66
67 util.printout("Updating manifest...") 67 util.printout("Updating manifest...")
68 manif.make_manifest(local_cache, "one") 68 manif.make_manifest(local_cache, "one", true)
69 util.printout("Updating index.html...") 69 util.printout("Updating index.html...")
70 index.make_index(local_cache) 70 index.make_index(local_cache)
71 71
@@ -76,6 +76,11 @@ local function add_files_to_server(refresh, rockfiles, server, upload_server)
76 login_url = login_url .. "/" 76 login_url = login_url .. "/"
77 end 77 end
78 78
79 table.insert(files, "index.html")
80 table.insert(files, "manifest")
81 table.insert(files, "manifest-5.1")
82 table.insert(files, "manifest-5.2")
83
79 -- TODO abstract away explicit 'curl' call 84 -- TODO abstract away explicit 'curl' call
80 85
81 local cmd 86 local cmd
@@ -84,9 +89,9 @@ local function add_files_to_server(refresh, rockfiles, server, upload_server)
84 cmd = cfg.variables.RSYNC.." --exclude=.git -Oavz -e ssh "..local_cache.."/ "..user.."@"..srv..":"..path.."/" 89 cmd = cfg.variables.RSYNC.." --exclude=.git -Oavz -e ssh "..local_cache.."/ "..user.."@"..srv..":"..path.."/"
85 elseif upload_server and upload_server.sftp then 90 elseif upload_server and upload_server.sftp then
86 local part1, part2 = upload_server.sftp:match("^([^/]*)/(.*)$") 91 local part1, part2 = upload_server.sftp:match("^([^/]*)/(.*)$")
87 cmd = cfg.variables.SCP.." manifest index.html "..table.concat(files, " ").." "..user.."@"..part1..":/"..part2 92 cmd = cfg.variables.SCP.." "..table.concat(files, " ").." "..user.."@"..part1..":/"..part2
88 else 93 else
89 cmd = cfg.variables.CURL.." "..login_info.." -T '{manifest,index.html,"..table.concat(files, ",").."}' "..login_url 94 cmd = cfg.variables.CURL.." "..login_info.." -T '{"..table.concat(files, ",").."}' "..login_url
90 end 95 end
91 96
92 util.printout(cmd) 97 util.printout(cmd)
diff --git a/src/luarocks/admin_remove.lua b/src/luarocks/admin_remove.lua
index c235776f..83b57fc9 100644
--- a/src/luarocks/admin_remove.lua
+++ b/src/luarocks/admin_remove.lua
@@ -61,7 +61,7 @@ local function remove_files_from_server(refresh, rockfiles, server, upload_serve
61 fs.change_dir(local_cache) 61 fs.change_dir(local_cache)
62 62
63 util.printout("Updating manifest...") 63 util.printout("Updating manifest...")
64 manif.make_manifest(local_cache, "one") 64 manif.make_manifest(local_cache, "one", true)
65 util.printout("Updating index.html...") 65 util.printout("Updating index.html...")
66 index.make_index(local_cache) 66 index.make_index(local_cache)
67 67
diff --git a/src/luarocks/build.lua b/src/luarocks/build.lua
index 83abbf8d..71b3cb89 100644
--- a/src/luarocks/build.lua
+++ b/src/luarocks/build.lua
@@ -111,8 +111,9 @@ end
111-- @param minimal_mode boolean: true if there's no need to fetch, 111-- @param minimal_mode boolean: true if there's no need to fetch,
112-- unpack or change dir (this is used by "luarocks make"). Implies 112-- unpack or change dir (this is used by "luarocks make"). Implies
113-- need_to_fetch = false. 113-- need_to_fetch = false.
114-- @param deps_mode: string: Which trees to check dependencies for: 114-- @param deps_mode string: Dependency mode: "one" for the current default tree,
115-- "none", "one", "order" or "all". 115-- "all" for all trees, "order" for all trees with priority >= the current default,
116-- "none" for no trees.
116-- @return boolean or (nil, string, [string]): True if succeeded or 117-- @return boolean or (nil, string, [string]): True if succeeded or
117-- nil and an error message followed by an error code. 118-- nil and an error message followed by an error code.
118function build_rockspec(rockspec_file, need_to_fetch, minimal_mode, deps_mode) 119function build_rockspec(rockspec_file, need_to_fetch, minimal_mode, deps_mode)
@@ -196,6 +197,10 @@ function build_rockspec(rockspec_file, need_to_fetch, minimal_mode, deps_mode)
196 build.type = "builtin" 197 build.type = "builtin"
197 end 198 end
198 199
200 if cfg.accepted_build_types and util.array_contains(cfg.accepted_build_types, build.type) then
201 return nil, "This rockspec uses the '"..build.type.."' build type, which is blocked by the 'accepted_build_types' setting in your LuaRocks configuration."
202 end
203
199 local build_type 204 local build_type
200 ok, build_type = pcall(require, "luarocks.build." .. build.type) 205 ok, build_type = pcall(require, "luarocks.build." .. build.type)
201 if not ok or not type(build_type) == "table" then 206 if not ok or not type(build_type) == "table" then
@@ -275,7 +280,8 @@ end
275-- @param need_to_fetch boolean: true if sources need to be fetched, 280-- @param need_to_fetch boolean: true if sources need to be fetched,
276-- false if the rockspec was obtained from inside a source rock. 281-- false if the rockspec was obtained from inside a source rock.
277-- @param deps_mode: string: Which trees to check dependencies for: 282-- @param deps_mode: string: Which trees to check dependencies for:
278-- "none", "one", "order" or "all". 283-- "one" for the current default tree, "all" for all trees,
284-- "order" for all trees with priority >= the current default, "none" for no trees.
279-- @return boolean or (nil, string, [string]): True if build was successful, 285-- @return boolean or (nil, string, [string]): True if build was successful,
280-- or false and an error message and an optional error code. 286-- or false and an error message and an optional error code.
281function build_rock(rock_file, need_to_fetch, deps_mode) 287function build_rock(rock_file, need_to_fetch, deps_mode)
diff --git a/src/luarocks/cfg.lua b/src/luarocks/cfg.lua
index f3cbe1fb..5d918b13 100644
--- a/src/luarocks/cfg.lua
+++ b/src/luarocks/cfg.lua
@@ -30,7 +30,7 @@ end
30 30
31_M.site_config = site_config 31_M.site_config = site_config
32 32
33program_version = "2.0.13" 33program_version = "2.1.0"
34 34
35local persist = require("luarocks.persist") 35local persist = require("luarocks.persist")
36 36
@@ -137,13 +137,13 @@ if not site_config.LUAROCKS_FORCE_CONFIG then
137 local home_overrides, err 137 local home_overrides, err
138 home_config_file = os.getenv("LUAROCKS_CONFIG_" .. version_suffix) or os.getenv("LUAROCKS_CONFIG") 138 home_config_file = os.getenv("LUAROCKS_CONFIG_" .. version_suffix) or os.getenv("LUAROCKS_CONFIG")
139 if home_config_file then 139 if home_config_file then
140 home_overrides, err = persist.load_into_table(home_config_file, { home = home }) 140 home_overrides, err = persist.load_into_table(home_config_file, { home = home, lua_version = lua_version })
141 else 141 else
142 home_config_file = home_config_dir.."/config-"..lua_version..".lua" 142 home_config_file = home_config_dir.."/config-"..lua_version..".lua"
143 home_overrides, err = persist.load_into_table(home_config_file, { home = home }) 143 home_overrides, err = persist.load_into_table(home_config_file, { home = home, lua_version = lua_version })
144 if not home_overrides then 144 if not home_overrides then
145 home_config_file = home_config_dir.."/config.lua" 145 home_config_file = home_config_dir.."/config.lua"
146 home_overrides, err = persist.load_into_table(home_config_file, { home = home }) 146 home_overrides, err = persist.load_into_table(home_config_file, { home = home, lua_version = lua_version })
147 end 147 end
148 end 148 end
149 if home_overrides then 149 if home_overrides then
@@ -182,6 +182,7 @@ local defaults = {
182 use_extensions = false, 182 use_extensions = false,
183 accept_unknown_fields = false, 183 accept_unknown_fields = false,
184 fs_use_modules = true, 184 fs_use_modules = true,
185 hooks_enabled = true,
185 deps_mode = "one", 186 deps_mode = "one",
186 187
187 lua_modules_path = "/share/lua/"..lua_version, 188 lua_modules_path = "/share/lua/"..lua_version,
@@ -305,7 +306,7 @@ if detected.windows then
305end 306end
306 307
307if detected.mingw32 then 308if detected.mingw32 then
308 defaults.platforms = { "win32", "mingw32" } 309 defaults.platforms = { "win32", "mingw32", "windows" }
309 defaults.obj_extension = "o" 310 defaults.obj_extension = "o"
310 defaults.cmake_generator = "MinGW Makefiles" 311 defaults.cmake_generator = "MinGW Makefiles"
311 defaults.variables.MAKE = "mingw32-make" 312 defaults.variables.MAKE = "mingw32-make"
@@ -442,15 +443,25 @@ local cfg_mt = {
442} 443}
443setmetatable(_M, cfg_mt) 444setmetatable(_M, cfg_mt)
444 445
445for _,tree in ipairs(rocks_trees) do 446function package_paths()
446 if type(tree) == "string" then 447 local new_path, new_cpath = {}, {}
447 package.path = tree..lua_modules_path.."/?.lua;"..tree..lua_modules_path.."/?/init.lua;"..package.path 448 for _,tree in ipairs(rocks_trees) do
448 package.cpath = tree..lib_modules_path.."/?."..lib_extension..";"..package.cpath 449 if type(tree) == "string" then
449 else 450 table.insert(new_path, 1, tree..lua_modules_path.."/?.lua;"..tree..lua_modules_path.."/?/init.lua")
450 package.path = (tree.lua_dir or tree.root..lua_modules_path).."/?.lua;".. 451 table.insert(new_cpath, 1, tree..lib_modules_path.."/?."..lib_extension)
451 (tree.lua_dir or tree.root..lua_modules_path).."/?/init.lua;"..package.path 452 else
452 package.cpath = (tree.lib_dir or tree.root..lib_modules_path).."/?."..lib_extension..";"..package.cpath 453 table.insert(new_path, 1, (tree.lua_dir or tree.root..lua_modules_path).."/?.lua;"..
453 end 454 (tree.lua_dir or tree.root..lua_modules_path).."/?/init.lua")
455 table.insert(new_cpath, 1, (tree.lib_dir or tree.root..lib_modules_path).."/?."..lib_extension)
456 end
457 end
458 return table.concat(new_path, ";"), table.concat(new_cpath, ";")
459end
460
461do
462 local new_path, new_cpath = package_paths()
463 package.path = new_path..";"..package.path
464 package.cpath = new_cpath..";"..package.cpath
454end 465end
455 466
456function which_config() 467function which_config()
diff --git a/src/luarocks/fs/unix.lua b/src/luarocks/fs/unix.lua
index cfd20c70..cccbbd33 100644
--- a/src/luarocks/fs/unix.lua
+++ b/src/luarocks/fs/unix.lua
@@ -43,9 +43,11 @@ end
43--- Create a wrapper to make a script executable from the command-line. 43--- Create a wrapper to make a script executable from the command-line.
44-- @param file string: Pathname of script to be made executable. 44-- @param file string: Pathname of script to be made executable.
45-- @param dest string: Directory where to put the wrapper. 45-- @param dest string: Directory where to put the wrapper.
46-- @param name string: rock name to be used in loader context.
47-- @param version string: rock version to be used in loader context.
46-- @return boolean or (nil, string): True if succeeded, or nil and 48-- @return boolean or (nil, string): True if succeeded, or nil and
47-- an error message. 49-- an error message.
48function wrap_script(file, dest) 50function wrap_script(file, dest, name, version)
49 assert(type(file) == "string") 51 assert(type(file) == "string")
50 assert(type(dest) == "string") 52 assert(type(dest) == "string")
51 53
@@ -59,7 +61,7 @@ function wrap_script(file, dest)
59 wrapper:write('LUA_PATH="'..package.path..';$LUA_PATH"\n') 61 wrapper:write('LUA_PATH="'..package.path..';$LUA_PATH"\n')
60 wrapper:write('LUA_CPATH="'..package.cpath..';$LUA_CPATH"\n') 62 wrapper:write('LUA_CPATH="'..package.cpath..';$LUA_CPATH"\n')
61 wrapper:write('export LUA_PATH LUA_CPATH\n') 63 wrapper:write('export LUA_PATH LUA_CPATH\n')
62 wrapper:write('exec "'..dir.path(cfg.variables["LUA_BINDIR"], cfg.lua_interpreter)..'" -lluarocks.loader "'..file..'" "$@"\n') 64 wrapper:write('exec "'..dir.path(cfg.variables["LUA_BINDIR"], cfg.lua_interpreter)..'" -lluarocks.loader -e\'luarocks.loader.add_context([['..name..']],[['..version..']])\' "'..file..'" "$@"\n')
63 wrapper:close() 65 wrapper:close()
64 if fs.chmod(wrapname, "0755") then 66 if fs.chmod(wrapname, "0755") then
65 return true 67 return true
diff --git a/src/luarocks/fs/win32.lua b/src/luarocks/fs/win32.lua
index 2c78d9b6..2b5bb955 100644
--- a/src/luarocks/fs/win32.lua
+++ b/src/luarocks/fs/win32.lua
@@ -52,9 +52,11 @@ end
52--- Create a wrapper to make a script executable from the command-line. 52--- Create a wrapper to make a script executable from the command-line.
53-- @param file string: Pathname of script to be made executable. 53-- @param file string: Pathname of script to be made executable.
54-- @param dest string: Directory where to put the wrapper. 54-- @param dest string: Directory where to put the wrapper.
55-- @param name string: rock name to be used in loader context.
56-- @param version string: rock version to be used in loader context.
55-- @return boolean or (nil, string): True if succeeded, or nil and 57-- @return boolean or (nil, string): True if succeeded, or nil and
56-- an error message. 58-- an error message.
57function wrap_script(file, dest) 59function wrap_script(file, dest, name, version)
58 assert(type(file) == "string") 60 assert(type(file) == "string")
59 assert(type(dest) == "string") 61 assert(type(dest) == "string")
60 62
@@ -69,7 +71,7 @@ function wrap_script(file, dest)
69 wrapper:write("setlocal\n") 71 wrapper:write("setlocal\n")
70 wrapper:write('set LUA_PATH='..package.path..";%LUA_PATH%\n") 72 wrapper:write('set LUA_PATH='..package.path..";%LUA_PATH%\n")
71 wrapper:write('set LUA_CPATH='..package.cpath..";%LUA_CPATH%\n") 73 wrapper:write('set LUA_CPATH='..package.cpath..";%LUA_CPATH%\n")
72 wrapper:write('"'..dir.path(cfg.variables["LUA_BINDIR"], cfg.lua_interpreter)..'" -lluarocks.loader "'..file..'" %*\n') 74 wrapper:write('"'..dir.path(cfg.variables["LUA_BINDIR"], cfg.lua_interpreter)..'" -lluarocks.loader -e\'luarocks.loader.add_context([['..name..']],[['..version..']])\' "'..file..'" %*\n')
73 wrapper:write("endlocal\n") 75 wrapper:write("endlocal\n")
74 wrapper:close() 76 wrapper:close()
75 return true 77 return true
diff --git a/src/luarocks/fs/win32/tools.lua b/src/luarocks/fs/win32/tools.lua
index 033f71be..1af1dd91 100644
--- a/src/luarocks/fs/win32/tools.lua
+++ b/src/luarocks/fs/win32/tools.lua
@@ -146,7 +146,7 @@ end
146-- plus an error message. 146-- plus an error message.
147function copy_contents(src, dest) 147function copy_contents(src, dest)
148 assert(src and dest) 148 assert(src and dest)
149 if fs.execute_string(fs.quiet(vars.CP.." -a "..src.."\\*.* "..fs.Q(dest))) then 149 if fs.execute_string(fs.quiet(vars.CP.." -dR "..src.."\\*.* "..fs.Q(dest))) then
150 return true 150 return true
151 else 151 else
152 return false, "Failed copying "..src.." to "..dest 152 return false, "Failed copying "..src.." to "..dest
diff --git a/src/luarocks/install.lua b/src/luarocks/install.lua
index c2a54482..3960dcb8 100644
--- a/src/luarocks/install.lua
+++ b/src/luarocks/install.lua
@@ -24,7 +24,8 @@ or a filename of a locally available rock.
24--- Install a binary rock. 24--- Install a binary rock.
25-- @param rock_file string: local or remote filename of a rock. 25-- @param rock_file string: local or remote filename of a rock.
26-- @param deps_mode: string: Which trees to check dependencies for: 26-- @param deps_mode: string: Which trees to check dependencies for:
27-- "none", "one", "order" or "all". 27-- "one" for the current default tree, "all" for all trees,
28-- "order" for all trees with priority >= the current default, "none" for no trees.
28-- @return boolean or (nil, string, [string]): True if succeeded or 29-- @return boolean or (nil, string, [string]): True if succeeded or
29-- nil and an error message and an optional error code. 30-- nil and an error message and an optional error code.
30function install_binary_rock(rock_file, deps_mode) 31function install_binary_rock(rock_file, deps_mode)
diff --git a/src/luarocks/make_manifest.lua b/src/luarocks/make_manifest.lua
index 845c9f8a..f793dcf2 100644
--- a/src/luarocks/make_manifest.lua
+++ b/src/luarocks/make_manifest.lua
@@ -28,7 +28,7 @@ function run(...)
28 28
29 util.printout("Making manifest for "..repo) 29 util.printout("Making manifest for "..repo)
30 30
31 local ok, err = manif.make_manifest(repo, deps.get_deps_mode(flags)) 31 local ok, err = manif.make_manifest(repo, deps.get_deps_mode(flags), true)
32 if ok then 32 if ok then
33 util.printout("Generating index.html for "..repo) 33 util.printout("Generating index.html for "..repo)
34 index.make_index(repo) 34 index.make_index(repo)
diff --git a/src/luarocks/manif.lua b/src/luarocks/manif.lua
index 414c3262..c17da71e 100644
--- a/src/luarocks/manif.lua
+++ b/src/luarocks/manif.lua
@@ -81,6 +81,16 @@ function make_rock_manifest(name, version)
81 save_table(install_dir, "rock_manifest", rock_manifest ) 81 save_table(install_dir, "rock_manifest", rock_manifest )
82end 82end
83 83
84local function fetch_manifest_from(repo_url, filename)
85 local url = dir.path(repo_url, filename)
86 local name = repo_url:gsub("[/:]","_")
87 local file, err, errcode = fetch.fetch_url_at_temp_dir(url, "luarocks-manifest-"..name)
88 if not file then
89 return nil, "Failed fetching manifest for "..repo_url..(err and " - "..err or ""), errcode
90 end
91 return file
92end
93
84--- Load a local or remote manifest describing a repository. 94--- Load a local or remote manifest describing a repository.
85-- All functions that use manifest tables assume they were obtained 95-- All functions that use manifest tables assume they were obtained
86-- through either this function or load_local_manifest. 96-- through either this function or load_local_manifest.
@@ -94,15 +104,23 @@ function load_manifest(repo_url)
94 return manif_core.manifest_cache[repo_url] 104 return manif_core.manifest_cache[repo_url]
95 end 105 end
96 106
107 local vmanifest = "manifest-"..cfg.lua_version
108
97 local protocol, pathname = dir.split_url(repo_url) 109 local protocol, pathname = dir.split_url(repo_url)
98 if protocol == "file" then 110 if protocol == "file" then
99 pathname = dir.path(pathname, "manifest") 111 local file = dir.path(pathname, vmanifest)
112 if fs.exists(file) then
113 pathname = file
114 else
115 pathname = dir.path(pathname, "manifest")
116 end
100 else 117 else
101 local url = dir.path(repo_url, "manifest") 118 local file, err = fetch_manifest_from(repo_url, vmanifest)
102 local name = repo_url:gsub("[/:]","_")
103 local file, err, errcode = fetch.fetch_url_at_temp_dir(url, "luarocks-manifest-"..name)
104 if not file then 119 if not file then
105 return nil, "Failed fetching manifest for "..repo_url..(err and " - "..err or ""), errcode 120 file, err = fetch_manifest_from(repo_url, "manifest")
121 end
122 if not file then
123 return nil, err
106 end 124 end
107 pathname = file 125 pathname = file
108 end 126 end
@@ -185,11 +203,21 @@ end
185-- and any dependency inconsistencies or missing dependencies are reported to 203-- and any dependency inconsistencies or missing dependencies are reported to
186-- standard error. 204-- standard error.
187-- @param manifest table: a manifest table. 205-- @param manifest table: a manifest table.
188local function update_dependencies(manifest, deps_mode) 206-- @param deps_mode string: Dependency mode: "one" for the current default tree,
207-- "all" for all trees, "order" for all trees with priority >= the current default,
208-- "none" for no trees.
209-- @param repodir string: directory of repository being scanned
210-- @param filter_lua string or nil: filter by Lua version
211-- @param cache table: temporary rockspec cache table
212local function update_dependencies(manifest, deps_mode, repodir, filter_lua, cache)
189 assert(type(manifest) == "table") 213 assert(type(manifest) == "table")
190 assert(type(deps_mode) == "string") 214 assert(type(deps_mode) == "string")
191 215
216 cache = cache or {}
217 local lua_version = filter_lua and deps.parse_version(filter_lua)
218
192 for pkg, versions in pairs(manifest.repository) do 219 for pkg, versions in pairs(manifest.repository) do
220 local to_remove = {}
193 for version, repositories in pairs(versions) do 221 for version, repositories in pairs(versions) do
194 local current = pkg.." "..version 222 local current = pkg.." "..version
195 for _, repo in ipairs(repositories) do 223 for _, repo in ipairs(repositories) do
@@ -206,9 +234,36 @@ local function update_dependencies(manifest, deps_mode)
206 end 234 end
207 end 235 end
208 end 236 end
237 elseif filter_lua and repo.arch == "rockspec" then
238 local pathname = dir.path(repodir, pkg.."-"..version..".rockspec")
239 local rockspec, err = cache[pathname]
240 if not rockspec then
241 rockspec, err = fetch.load_local_rockspec(pathname)
242 end
243 if rockspec then
244 cache[pathname] = rockspec
245 for _, dep in ipairs(rockspec.dependencies) do
246 if dep.name == "lua" then
247 if not deps.match_constraints(lua_version, dep.constraints) then
248 table.insert(to_remove, version)
249 end
250 break
251 end
252 end
253 else
254 util.printerr("Error loading rockspec for "..pkg.." "..version..": "..err)
255 end
209 end 256 end
210 end 257 end
211 end 258 end
259 if next(to_remove) then
260 for _, incompat in ipairs(to_remove) do
261 manifest.repository[pkg][incompat] = nil
262 end
263 if not next(manifest.repository[pkg]) then
264 manifest.repository[pkg] = nil
265 end
266 end
212 end 267 end
213end 268end
214 269
@@ -216,8 +271,14 @@ end
216-- @param results table: The search results as returned by search.disk_search. 271-- @param results table: The search results as returned by search.disk_search.
217-- @param manifest table: A manifest table (must contain repository, modules, commands tables). 272-- @param manifest table: A manifest table (must contain repository, modules, commands tables).
218-- It will be altered to include the search results. 273-- It will be altered to include the search results.
274-- @param deps_mode string: Dependency mode: "one" for the current default tree,
275-- "all" for all trees, "order" for all trees with priority >= the current default,
276-- "none" for no trees.
277-- @param repo string: directory of repository
278-- @param filter_lua string or nil: filter by Lua version
279-- @param cache table: temporary rockspec cache table
219-- @return boolean or (nil, string): true in case of success, or nil followed by an error message. 280-- @return boolean or (nil, string): true in case of success, or nil followed by an error message.
220local function store_results(results, manifest, deps_mode) 281local function store_results(results, manifest, deps_mode, repo, filter_lua, cache)
221 assert(type(results) == "table") 282 assert(type(results) == "table")
222 assert(type(manifest) == "table") 283 assert(type(manifest) == "table")
223 assert(type(deps_mode) == "string") 284 assert(type(deps_mode) == "string")
@@ -243,7 +304,7 @@ local function store_results(results, manifest, deps_mode)
243 end 304 end
244 manifest.repository[name] = pkgtable 305 manifest.repository[name] = pkgtable
245 end 306 end
246 update_dependencies(manifest, deps_mode) 307 update_dependencies(manifest, deps_mode, repo, filter_lua, cache)
247 sort_package_matching_table(manifest.modules) 308 sort_package_matching_table(manifest.modules)
248 sort_package_matching_table(manifest.commands) 309 sort_package_matching_table(manifest.commands)
249 return true 310 return true
@@ -253,9 +314,13 @@ end
253-- A file called 'manifest' will be written in the root of the given 314-- A file called 'manifest' will be written in the root of the given
254-- repository directory. 315-- repository directory.
255-- @param repo A local repository directory. 316-- @param repo A local repository directory.
317-- @param deps_mode string: Dependency mode: "one" for the current default tree,
318-- "all" for all trees, "order" for all trees with priority >= the current default,
319-- "none" for the default dependency mode from the configuration.
320-- @param versioned boolean: if versioned versions of the manifest should be created.
256-- @return boolean or (nil, string): True if manifest was generated, 321-- @return boolean or (nil, string): True if manifest was generated,
257-- or nil and an error message. 322-- or nil and an error message.
258function make_manifest(repo, deps_mode) 323function make_manifest(repo, deps_mode, versioned)
259 assert(type(repo) == "string") 324 assert(type(repo) == "string")
260 assert(type(deps_mode) == "string") 325 assert(type(deps_mode) == "string")
261 326
@@ -270,11 +335,21 @@ function make_manifest(repo, deps_mode)
270 query.arch = "any" 335 query.arch = "any"
271 local results = search.disk_search(repo, query) 336 local results = search.disk_search(repo, query)
272 local manifest = { repository = {}, modules = {}, commands = {} } 337 local manifest = { repository = {}, modules = {}, commands = {} }
338
273 manif_core.manifest_cache[repo] = manifest 339 manif_core.manifest_cache[repo] = manifest
274 340
275 local ok, err = store_results(results, manifest, deps_mode) 341 local cache = {}
342 local ok, err = store_results(results, manifest, deps_mode, repo, nil, cache)
276 if not ok then return nil, err end 343 if not ok then return nil, err end
277 344
345 if versioned then
346 for _, luaver in ipairs({"5.1", "5.2"}) do
347 local vmanifest = { repository = {}, modules = {}, commands = {} }
348 local ok, err = store_results(results, vmanifest, deps_mode, repo, luaver, cache)
349 save_table(repo, "manifest-"..luaver, vmanifest)
350 end
351 end
352
278 return save_table(repo, "manifest", manifest) 353 return save_table(repo, "manifest", manifest)
279end 354end
280 355
@@ -286,6 +361,9 @@ end
286-- @param version string: Version of a package from the repository. 361-- @param version string: Version of a package from the repository.
287-- @param repo string or nil: Pathname of a local repository. If not given, 362-- @param repo string or nil: Pathname of a local repository. If not given,
288-- the default local repository configured as cfg.rocks_dir is used. 363-- the default local repository configured as cfg.rocks_dir is used.
364-- @param deps_mode string: Dependency mode: "one" for the current default tree,
365-- "all" for all trees, "order" for all trees with priority >= the current default,
366-- "none" for using the default dependency mode from the configuration.
289-- @return boolean or (nil, string): True if manifest was generated, 367-- @return boolean or (nil, string): True if manifest was generated,
290-- or nil and an error message. 368-- or nil and an error message.
291function update_manifest(name, version, repo, deps_mode) 369function update_manifest(name, version, repo, deps_mode)
@@ -313,7 +391,7 @@ function update_manifest(name, version, repo, deps_mode)
313 391
314 local results = {[name] = {[version] = {{arch = "installed", repo = repo}}}} 392 local results = {[name] = {[version] = {{arch = "installed", repo = repo}}}}
315 393
316 local ok, err = store_results(results, manifest, deps_mode) 394 local ok, err = store_results(results, manifest, deps_mode, repo)
317 if not ok then return nil, err end 395 if not ok then return nil, err end
318 396
319 return save_table(repo, "manifest", manifest) 397 return save_table(repo, "manifest", manifest)
diff --git a/src/luarocks/path.lua b/src/luarocks/path.lua
index 5e380992..7af81c07 100644
--- a/src/luarocks/path.lua
+++ b/src/luarocks/path.lua
@@ -313,6 +313,13 @@ function use_tree(tree)
313 cfg.deploy_lib_dir = deploy_lib_dir(tree) 313 cfg.deploy_lib_dir = deploy_lib_dir(tree)
314end 314end
315 315
316--- Apply a given function to the active rocks trees based on chosen dependency mode.
317-- @param deps_mode string: Dependency mode: "one" for the current default tree,
318-- "all" for all trees, "order" for all trees with priority >= the current default,
319-- "none" for no trees (this function becomes a nop).
320-- @param fn function: function to be applied, with the tree dir (string) as the first
321-- argument and the remaining varargs of map_trees as the following arguments.
322-- @return a table with all results of invocations of fn collected.
316function map_trees(deps_mode, fn, ...) 323function map_trees(deps_mode, fn, ...)
317 local result = {} 324 local result = {}
318 if deps_mode == "one" then 325 if deps_mode == "one" then
@@ -382,13 +389,28 @@ end
382function run(...) 389function run(...)
383 local flags = util.parse_flags(...) 390 local flags = util.parse_flags(...)
384 local deps_mode = deps.get_deps_mode(flags) 391 local deps_mode = deps.get_deps_mode(flags)
392
393 local lr_path, lr_cpath = cfg.package_paths()
394 local bin_dirs = map_trees(deps_mode, deploy_bin_dir)
395
396 if flags["lr-path"] then
397 util.printout(util.remove_path_dupes(lr_path, ';'))
398 return true
399 elseif flags["lr-cpath"] then
400 util.printout(util.remove_path_dupes(lr_cpath, ';'))
401 return true
402 elseif flags["lr-bin"] then
403 local lr_bin = util.remove_path_dupes(table.concat(bin_dirs, cfg.export_path_separator), cfg.export_path_separator)
404 util.printout(util.remove_path_dupes(lr_bin, ';'))
405 return true
406 end
385 407
386 util.printout(cfg.export_lua_path:format(util.remove_path_dupes(package.path, ';'))) 408 util.printout(cfg.export_lua_path:format(util.remove_path_dupes(package.path, ';')))
387 util.printout(cfg.export_lua_cpath:format(util.remove_path_dupes(package.cpath, ';'))) 409 util.printout(cfg.export_lua_cpath:format(util.remove_path_dupes(package.cpath, ';')))
388 if flags["bin"] then 410 if flags["bin"] then
389 local bin_dirs = map_trees(deps_mode, deploy_bin_dir)
390 table.insert(bin_dirs, 1, os.getenv("PATH")) 411 table.insert(bin_dirs, 1, os.getenv("PATH"))
391 util.printout(cfg.export_path:format(util.remove_path_dupes(table.concat(bin_dirs, cfg.export_path_separator), cfg.export_path_separator))) 412 local lr_bin = util.remove_path_dupes(table.concat(bin_dirs, cfg.export_path_separator), cfg.export_path_separator)
413 util.printout(cfg.export_path:format(lr_bin))
392 end 414 end
393 return true 415 return true
394end 416end
diff --git a/src/luarocks/purge.lua b/src/luarocks/purge.lua
index 6b094061..46a023e9 100644
--- a/src/luarocks/purge.lua
+++ b/src/luarocks/purge.lua
@@ -44,5 +44,5 @@ function run(...)
44 end 44 end
45 end 45 end
46 end 46 end
47 return manif.make_manifest(cfg.rocks_dir, "one") 47 return manif.make_manifest(cfg.rocks_dir, "one", true)
48end 48end
diff --git a/src/luarocks/repos.lua b/src/luarocks/repos.lua
index dc1b63c8..b7e64d42 100644
--- a/src/luarocks/repos.lua
+++ b/src/luarocks/repos.lua
@@ -131,6 +131,11 @@ function run_hook(rockspec, hook_name)
131 if not hooks then 131 if not hooks then
132 return true 132 return true
133 end 133 end
134
135 if cfg.hooks_enabled == false then
136 return nil, "This rockspec contains hooks, which are blocked by the 'hooks_enabled' setting in your LuaRocks configuration."
137 end
138
134 if not hooks.substituted_variables then 139 if not hooks.substituted_variables then
135 util.variable_substitutions(hooks, rockspec.variables) 140 util.variable_substitutions(hooks, rockspec.variables)
136 hooks.substituted_variables = true 141 hooks.substituted_variables = true
@@ -145,7 +150,7 @@ function run_hook(rockspec, hook_name)
145 return true 150 return true
146end 151end
147 152
148local function install_binary(source, target) 153local function install_binary(source, target, name, version)
149 assert(type(source) == "string") 154 assert(type(source) == "string")
150 assert(type(target) == "string") 155 assert(type(target) == "string")
151 156
@@ -155,7 +160,7 @@ local function install_binary(source, target)
155 file = io.open(source) 160 file = io.open(source)
156 end 161 end
157 if match or (file and file:read():match("^#!.*lua.*")) then 162 if match or (file and file:read():match("^#!.*lua.*")) then
158 ok, err = fs.wrap_script(source, target) 163 ok, err = fs.wrap_script(source, target, name, version)
159 else 164 else
160 ok, err = fs.copy_binary(source, target) 165 ok, err = fs.copy_binary(source, target)
161 end 166 end
@@ -195,7 +200,8 @@ function deploy_files(name, version, wrap_bin_scripts)
195 assert(type(version) == "string") 200 assert(type(version) == "string")
196 assert(type(wrap_bin_scripts) == "boolean") 201 assert(type(wrap_bin_scripts) == "boolean")
197 202
198 local function deploy_file_tree(file_tree, source_dir, deploy_dir, move_fn) 203 local function deploy_file_tree(file_tree, path_fn, deploy_dir, move_fn)
204 local source_dir = path_fn(name, version)
199 if not move_fn then 205 if not move_fn then
200 move_fn = fs.move 206 move_fn = fs.move
201 end 207 end
@@ -215,7 +221,7 @@ function deploy_files(name, version, wrap_bin_scripts)
215 end 221 end
216 end 222 end
217 fs.make_dir(dir.dir_name(target)) 223 fs.make_dir(dir.dir_name(target))
218 ok, err = move_fn(source, target) 224 ok, err = move_fn(source, target, name, version)
219 fs.remove_dir_tree_if_empty(dir.dir_name(source)) 225 fs.remove_dir_tree_if_empty(dir.dir_name(source))
220 if not ok then return nil, err end 226 if not ok then return nil, err end
221 return true 227 return true
@@ -228,13 +234,13 @@ function deploy_files(name, version, wrap_bin_scripts)
228 local ok, err = true 234 local ok, err = true
229 if rock_manifest.bin then 235 if rock_manifest.bin then
230 local move_bin_fn = wrap_bin_scripts and install_binary or fs.copy_binary 236 local move_bin_fn = wrap_bin_scripts and install_binary or fs.copy_binary
231 ok, err = deploy_file_tree(rock_manifest.bin, path.bin_dir(name, version), cfg.deploy_bin_dir, move_bin_fn) 237 ok, err = deploy_file_tree(rock_manifest.bin, path.bin_dir, cfg.deploy_bin_dir, move_bin_fn)
232 end 238 end
233 if ok and rock_manifest.lua then 239 if ok and rock_manifest.lua then
234 ok, err = deploy_file_tree(rock_manifest.lua, path.lua_dir(name, version), cfg.deploy_lua_dir) 240 ok, err = deploy_file_tree(rock_manifest.lua, path.lua_dir, cfg.deploy_lua_dir)
235 end 241 end
236 if ok and rock_manifest.lib then 242 if ok and rock_manifest.lib then
237 ok, err = deploy_file_tree(rock_manifest.lib, path.lib_dir(name, version), cfg.deploy_lib_dir) 243 ok, err = deploy_file_tree(rock_manifest.lib, path.lib_dir, cfg.deploy_lib_dir)
238 end 244 end
239 return ok, err 245 return ok, err
240end 246end
diff --git a/src/luarocks/tools/patch.lua b/src/luarocks/tools/patch.lua
index 04154219..baaacfc1 100644
--- a/src/luarocks/tools/patch.lua
+++ b/src/luarocks/tools/patch.lua
@@ -95,7 +95,7 @@ local function string_as_file(s)
95 eof = false, 95 eof = false,
96 read = function(self, n) 96 read = function(self, n)
97 if self.eof then return nil end 97 if self.eof then return nil end
98 local chunk = self.str:sub(self.at, self.at+n) 98 local chunk = self.str:sub(self.at, self.at + n - 1)
99 self.at = self.at + n 99 self.at = self.at + n
100 if self.at > self.len then 100 if self.at > self.len then
101 self.eof = true 101 self.eof = true
diff --git a/src/luarocks/unpack.lua b/src/luarocks/unpack.lua
index 1db66bbb..67153812 100644
--- a/src/luarocks/unpack.lua
+++ b/src/luarocks/unpack.lua
@@ -26,7 +26,7 @@ In the latter case, the app version may be given as a second argument.
26local function unpack_rockspec(rockspec_file, dir_name) 26local function unpack_rockspec(rockspec_file, dir_name)
27 assert(type(rockspec_file) == "string") 27 assert(type(rockspec_file) == "string")
28 assert(type(dir_name) == "string") 28 assert(type(dir_name) == "string")
29 29
30 local rockspec, err = fetch.load_rockspec(rockspec_file) 30 local rockspec, err = fetch.load_rockspec(rockspec_file)
31 if not rockspec then 31 if not rockspec then
32 return nil, "Failed loading rockspec "..rockspec_file..": "..err 32 return nil, "Failed loading rockspec "..rockspec_file..": "..err
@@ -52,7 +52,7 @@ end
52local function unpack_rock(rock_file, dir_name, kind) 52local function unpack_rock(rock_file, dir_name, kind)
53 assert(type(rock_file) == "string") 53 assert(type(rock_file) == "string")
54 assert(type(dir_name) == "string") 54 assert(type(dir_name) == "string")
55 55
56 local ok, err, errcode = fetch.fetch_and_unpack_rock(rock_file, dir_name) 56 local ok, err, errcode = fetch.fetch_and_unpack_rock(rock_file, dir_name)
57 if not ok then 57 if not ok then
58 return nil, "Failed unzipping rock "..rock_file, errcode 58 return nil, "Failed unzipping rock "..rock_file, errcode
diff --git a/src/luarocks/util.lua b/src/luarocks/util.lua
index c5095675..b2428f62 100644
--- a/src/luarocks/util.lua
+++ b/src/luarocks/util.lua
@@ -461,3 +461,12 @@ function show_table(t, name, indent)
461 addtocart(t, name, indent) 461 addtocart(t, name, indent)
462 return cart .. autoref 462 return cart .. autoref
463end 463end
464
465function array_contains(tbl, value)
466 for _, v in ipairs(tbl) do
467 if v == value then
468 return true
469 end
470 end
471 return false
472end