summaryrefslogtreecommitdiff
path: root/src/luarocks/deplocks.lua
diff options
context:
space:
mode:
authorMike Vink <mike@pionative.com>2025-02-03 21:29:42 +0100
committerMike Vink <mike@pionative.com>2025-02-03 21:29:42 +0100
commit5155816b7b925dec5d5feb1568b1d7ceb00938b9 (patch)
treedeca28ea15e79f6f804c3d90d2ba757881638af5 /src/luarocks/deplocks.lua
fetch tarballHEADmaster
Diffstat (limited to 'src/luarocks/deplocks.lua')
-rw-r--r--src/luarocks/deplocks.lua106
1 files changed, 106 insertions, 0 deletions
diff --git a/src/luarocks/deplocks.lua b/src/luarocks/deplocks.lua
new file mode 100644
index 0000000..d62908f
--- /dev/null
+++ b/src/luarocks/deplocks.lua
@@ -0,0 +1,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