summaryrefslogtreecommitdiff
path: root/src/luarocks/deplocks.lua
blob: d62908f462e0873c632337895b8d3a2115c6aa59 (plain)
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