aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorhisham <hisham@9ca3f7c1-7366-0410-b1a3-b5c78f85698c>2009-10-04 19:47:11 +0000
committerhisham <hisham@9ca3f7c1-7366-0410-b1a3-b5c78f85698c>2009-10-04 19:47:11 +0000
commit230da1deaefff2404e0ea4aa380c2e7cda306733 (patch)
tree5be922f2abfb94386e8a6ffcfbd279bc920e6e94
parentc9c83162748bea1f9c1b6574ce3cc6560e5490b4 (diff)
downloadluarocks-230da1deaefff2404e0ea4aa380c2e7cda306733.tar.gz
luarocks-230da1deaefff2404e0ea4aa380c2e7cda306733.tar.bz2
luarocks-230da1deaefff2404e0ea4aa380c2e7cda306733.zip
Implement deployment and removal of files
git-svn-id: http://luarocks.org/svn/luarocks/trunk@63 9ca3f7c1-7366-0410-b1a3-b5c78f85698c
-rw-r--r--src/luarocks/fs/lua.lua2
-rw-r--r--src/luarocks/manif.lua36
-rw-r--r--src/luarocks/path.lua17
-rw-r--r--src/luarocks/rep.lua154
4 files changed, 152 insertions, 57 deletions
diff --git a/src/luarocks/fs/lua.lua b/src/luarocks/fs/lua.lua
index dd9857a0..c7d7fb2a 100644
--- a/src/luarocks/fs/lua.lua
+++ b/src/luarocks/fs/lua.lua
@@ -511,7 +511,7 @@ end
511-- plus an error message. 511-- plus an error message.
512function move(src, dest) 512function move(src, dest)
513 assert(src and dest) 513 assert(src and dest)
514 if fs.exists(dest) then 514 if fs.exists(dest) and not fs.is_dir(dest) then
515 return false, "File already exists: "..dest 515 return false, "File already exists: "..dest
516 end 516 end
517 local ok, err = fs.copy(src, dest) 517 local ok, err = fs.copy(src, dest)
diff --git a/src/luarocks/manif.lua b/src/luarocks/manif.lua
index de885ca5..e3e2728b 100644
--- a/src/luarocks/manif.lua
+++ b/src/luarocks/manif.lua
@@ -293,9 +293,41 @@ function update_manifest(name, version, repo)
293 293
294 local results = {[name] = {[version] = {{arch = "installed", repo = repo}}}} 294 local results = {[name] = {[version] = {{arch = "installed", repo = repo}}}}
295 295
296 print("TODO LR2 update manifest")
297
298 store_results(results, manifest) 296 store_results(results, manifest)
299 297
300 return save_table(repo, "manifest", manifest) 298 return save_table(repo, "manifest", manifest)
301end 299end
300
301--- Given a path of a deployed file, figure out which rock name and version
302-- correspond to it in the tree manifest.
303-- @param file string: The full path of a deployed file.
304-- @param root string or nil: A local root dir for a rocks tree. If not given, the default is used.
305-- @return string, string: name and version of the provider rock.
306function find_current_provider(file, root)
307 assert(type(file) == "string")
308 assert(type(root) == "string" or not root)
309 root = root or cfg.root_dir
310
311 local manifest = manif_core.load_local_manifest(path.rocks_dir(root))
312 local deploy_bin = path.deploy_bin_dir(root)
313 local deploy_lua = path.deploy_lua_dir(root)
314 local deploy_lib = path.deploy_lib_dir(root)
315 local key, manifest_tbl
316
317 if file:match("^"..deploy_bin) then
318 manifest_tbl = manifest.commands
319 key = file:sub(#deploy_bin+1)
320 elseif file:match("^"..deploy_lua) then
321 manifest_tbl = manifest.modules
322 key = path.path_to_module(file:sub(#deploy_lua+1))
323 elseif file:match("^"..deploy_lib) then
324 manifest_tbl = manifest.modules
325 key = path.path_to_module(file:sub(#deploy_lib+1))
326 end
327
328 local providers = manifest_tbl[key]
329 if not providers then
330 return nil, "File "..file.." is not tracked by LuaRocks."
331 end
332 return providers[1]:match("([^/]*)/([^/]*)")
333end
diff --git a/src/luarocks/path.lua b/src/luarocks/path.lua
index f62ff230..b63eaa43 100644
--- a/src/luarocks/path.lua
+++ b/src/luarocks/path.lua
@@ -216,6 +216,7 @@ function path_to_module(file)
216 name = name:gsub(dir.separator, ".") 216 name = name:gsub(dir.separator, ".")
217 end 217 end
218 end 218 end
219 name = name:gsub("^%.+", ""):gsub("%.+$", "")
219 return name 220 return name
220end 221end
221 222
@@ -247,3 +248,19 @@ function configure_paths(rockspec)
247 vars.DOCDIR = doc_dir(name, version) 248 vars.DOCDIR = doc_dir(name, version)
248 rockspec.variables = vars 249 rockspec.variables = vars
249end 250end
251
252function versioned_name(file, name, version)
253 assert(type(file) == "string")
254 assert(type(name) == "string")
255 assert(type(version) == "string")
256
257 name = name:gsub("%-", "_")
258 version = version:gsub("%-", "_")
259 return dir.path(dir.dir_name(file), name.."_"..version.."-"..dir.base_name(file))
260end
261
262function unversioned_name(file)
263 assert(type(file) == "string")
264
265 return dir.path(dir.dir_name(file), dir.base_name(file):match("^[^-]+-(.*)"))
266end
diff --git a/src/luarocks/rep.lua b/src/luarocks/rep.lua
index 0a2e9cbb..8d3ecfb2 100644
--- a/src/luarocks/rep.lua
+++ b/src/luarocks/rep.lua
@@ -8,6 +8,7 @@ local cfg = require("luarocks.cfg")
8local util = require("luarocks.util") 8local util = require("luarocks.util")
9local dir = require("luarocks.dir") 9local dir = require("luarocks.dir")
10local manif = require("luarocks.manif") 10local manif = require("luarocks.manif")
11local deps = require("luarocks.deps")
11 12
12--- Get all installed versions of a package. 13--- Get all installed versions of a package.
13-- @param name string: a package name. 14-- @param name string: a package name.
@@ -32,21 +33,6 @@ function is_installed(name, version)
32 33
33 return fs.is_dir(path.install_dir(name, version)) 34 return fs.is_dir(path.install_dir(name, version))
34end 35end
35
36--- Delete a package from the local repository.
37-- Version numbers are compared as exact string comparison.
38-- @param name string: name of package
39-- @param version string: package version in string format
40function delete_version(name, version)
41 assert(type(name) == "string")
42 assert(type(version) == "string")
43
44 fs.delete(path.install_dir(name, version))
45 print("TODO LR2 remove deployed files based on rock_manifest")
46 if not get_versions(name) then
47 fs.delete(dir.path(cfg.rocks_dir, name))
48 end
49end
50 36
51--[[ 37--[[
52--- Install bin entries in the repository bin dir. 38--- Install bin entries in the repository bin dir.
@@ -121,8 +107,6 @@ function package_modules(package, version)
121 local result = {} 107 local result = {}
122 local rock_manifest = manif.load_rock_manifest(package, version) 108 local rock_manifest = manif.load_rock_manifest(package, version)
123 109
124 print(pkg, version, util.show_table(rock_manifest))
125
126 if rock_manifest.lib then 110 if rock_manifest.lib then
127 for name,sub in pairs(rock_manifest.lib) do 111 for name,sub in pairs(rock_manifest.lib) do
128 store_package_data(result, name, sub, "", "") 112 store_package_data(result, name, sub, "", "")
@@ -202,35 +186,6 @@ function run_hook(rockspec, hook_name)
202 return true 186 return true
203end 187end
204 188
205local function deploy_file_tree(file_tree, source_dir, deploy_dir, move_fn)
206 assert(type(file_tree) == "table")
207 assert(type(source_dir) == "string")
208 assert(type(deploy_dir) == "string")
209 assert(type(move_fn) == "function" or not move_fn)
210
211 print("TODO LR2 actually fs.move")
212 if not move_fn then move_fn = fs.copy end
213
214 local ok, err = fs.make_dir(deploy_dir)
215 if not ok then
216 return nil, "Could not create "..deploy_dir
217 end
218 for file, sub in pairs(file_tree) do
219 if type(sub) == "table" then
220 ok, err = deploy_file_tree(sub, dir.path(source_dir, file), dir.path(deploy_dir, file))
221 if not ok then return nil, err end
222 else
223 local target = dir.path(deploy_dir, file)
224 if fs.exists(target) then
225 print("TODO LR2 make_way_for_new_version(target)")
226 end
227 local source = dir.path(source_dir, file)
228 ok, err = move_fn(source, deploy_dir)
229 if not ok then return nil, err end
230 end
231 end
232end
233
234local function install_binary(source, target) 189local function install_binary(source, target)
235 assert(type(source) == "string") 190 assert(type(source) == "string")
236 assert(type(target) == "string") 191 assert(type(target) == "string")
@@ -249,22 +204,113 @@ local function install_binary(source, target)
249 return ok, err 204 return ok, err
250end 205end
251 206
207local function resolve_conflict(name, version, target)
208 local cname, cversion = manif.find_current_provider(target)
209 if not cname then
210 return nil, cversion
211 end
212 if name ~= cname or deps.compare_versions(version, cversion) then
213print("MOVE EXISTING, MAKE WAY FOR NEW")
214 fs.move(target, path.versioned_name(target, cname, cversion))
215 return target
216 else
217print("INSTALL NEW WITH DIFFERENT NAME")
218 return path.versioned_name(target, name, version)
219 end
220end
221
252function deploy_files(name, version) 222function deploy_files(name, version)
253 assert(type(name) == "string") 223 assert(type(name) == "string")
254 assert(type(version) == "string") 224 assert(type(version) == "string")
225
226 local function deploy_file_tree(file_tree, source_dir, deploy_dir, move_fn)
227 assert(type(file_tree) == "table")
228 assert(type(source_dir) == "string")
229 assert(type(deploy_dir) == "string")
230 assert(type(move_fn) == "function" or not move_fn)
231
232 if not move_fn then move_fn = fs.move end
233
234 local ok, err = fs.make_dir(deploy_dir)
235 if not ok then
236 return nil, "Could not create "..deploy_dir
237 end
238 for file, sub in pairs(file_tree) do
239 local target = dir.path(deploy_dir, file)
240 if type(sub) == "table" then
241 ok, err = deploy_file_tree(sub, dir.path(source_dir, file), dir.path(deploy_dir, file))
242 if not ok then return nil, err end
243 fs.remove_dir_if_empty(target)
244 else
245 if fs.exists(target) then
246 target, err = resolve_conflict(name, version, target)
247 if err then return nil, err.." Cannot install new version." end
248 end
249 local source = dir.path(source_dir, file)
250 ok, err = move_fn(source, target)
251 if not ok then return nil, err end
252 end
253 end
254 return true
255 end
255 256
256 local rock_manifest = manif.load_rock_manifest(name, version) 257 local rock_manifest = manif.load_rock_manifest(name, version)
257 258
259 local ok, err = true
258 if rock_manifest.bin then 260 if rock_manifest.bin then
259 local ok, err = deploy_file_tree(rock_manifest.bin, path_bin_dir(name, version), cfg.deploy_bin_dir, install_binary) 261 ok, err = deploy_file_tree(rock_manifest.bin, path_bin_dir(name, version), cfg.deploy_bin_dir, install_binary)
260 if err then return nil, err end
261 end 262 end
262 if rock_manifest.lua then 263 if ok and rock_manifest.lua then
263 local ok, err = deploy_file_tree(rock_manifest.lua, path.lua_dir(name, version), cfg.deploy_lua_dir) 264 ok, err = deploy_file_tree(rock_manifest.lua, path.lua_dir(name, version), cfg.deploy_lua_dir)
264 if err then return nil, err end
265 end 265 end
266 if rock_manifest.lib then 266 if ok and rock_manifest.lib then
267 local ok, err = deploy_file_tree(rock_manifest.lib, path.lib_dir(name, version), cfg.deploy_lib_dir) 267 ok, err = deploy_file_tree(rock_manifest.lib, path.lib_dir(name, version), cfg.deploy_lib_dir)
268 if err then return nil, err end
269 end 268 end
269 return ok, err
270end
271
272--- Delete a package from the local repository.
273-- Version numbers are compared as exact string comparison.
274-- @param name string: name of package
275-- @param version string: package version in string format
276function delete_version(name, version)
277 assert(type(name) == "string")
278 assert(type(version) == "string")
279
280 local function delete_deployed_file_tree(file_tree, deploy_dir)
281 for file, sub in pairs(file_tree) do
282 local target = dir.path(deploy_dir, file)
283 if type(sub) == "table" then
284 local ok, err = delete_deployed_file_tree(sub, dir.path(deploy_dir, file))
285 fs.remove_dir_if_empty(target)
286 else
287 local versioned = path.versioned_name(target, name, version)
288 if fs.exists(versioned) then
289 fs.delete(versioned)
290 else
291 fs.delete(target)
292 end
293 end
294 end
295 return true
296 end
297
298 local rock_manifest = manif.load_rock_manifest(name, version)
299 local ok, err = true
300 if rock_manifest.bin then
301 ok, err = delete_deployed_file_tree(rock_manifest.bin, cfg.deploy_bin_dir)
302 end
303 if ok and rock_manifest.lua then
304 ok, err = delete_deployed_file_tree(rock_manifest.lua, cfg.deploy_lua_dir)
305 end
306 if ok and rock_manifest.lib then
307 ok, err = delete_deployed_file_tree(rock_manifest.lib, cfg.deploy_lib_dir)
308 end
309 if err then return nil, err end
310
311 fs.delete(path.install_dir(name, version))
312 if not get_versions(name) then
313 fs.delete(dir.path(cfg.rocks_dir, name))
314 end
315 return true
270end 316end