1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
|
local deplocks = {}
local fs = require("luarocks.fs")
local dir = require("luarocks.dir")
local util = require("luarocks.util")
local persist = require("luarocks.persist")
local deptable = {}
local deptable_mode = "start"
local deplock_abs_filename
local deplock_root_rock_name
function deplocks.init(root_rock_name, dirname)
if deptable_mode ~= "start" then
return
end
deptable_mode = "create"
local filename = dir.path(dirname, "luarocks.lock")
deplock_abs_filename = fs.absolute_name(filename)
deplock_root_rock_name = root_rock_name
deptable = {}
end
function deplocks.get_abs_filename(root_rock_name)
if root_rock_name == deplock_root_rock_name then
return deplock_abs_filename
end
end
function deplocks.load(root_rock_name, dirname)
if deptable_mode ~= "start" then
return true, nil
end
deptable_mode = "locked"
local filename = dir.path(dirname, "luarocks.lock")
local ok, result, errcode = persist.run_file(filename, {})
if errcode == "load" or errcode == "run" then
-- bad config file or depends on env, so error out
return nil, nil, "Could not read existing lockfile " .. filename
end
if errcode == "open" then
-- could not open, maybe file does not exist
return true, nil
end
deplock_abs_filename = fs.absolute_name(filename)
deplock_root_rock_name = root_rock_name
deptable = result
return true, filename
end
function deplocks.add(depskey, name, version)
if deptable_mode == "locked" then
return
end
local dk = deptable[depskey]
if not dk then
dk = {}
deptable[depskey] = dk
end
if not dk[name] then
dk[name] = version
end
end
function deplocks.get(depskey, name)
local dk = deptable[depskey]
if not dk then
return nil
end
return deptable[name]
end
function deplocks.write_file()
if deptable_mode ~= "create" then
return true
end
return persist.save_as_module(deplock_abs_filename, deptable)
end
-- a table-like interface to deplocks
function deplocks.proxy(depskey)
return setmetatable({}, {
__index = function(_, k)
return deplocks.get(depskey, k)
end,
__newindex = function(_, k, v)
return deplocks.add(depskey, k, v)
end,
})
end
function deplocks.each(depskey)
return util.sortedpairs(deptable[depskey] or {})
end
return deplocks
|