commit 60bfc741edd3e2a78d4c06e4ea7c1c5321f7c294
parent c3ac329c7ab1f57adb3c87b1bb60a3073da95e79
Author: Evgeni Chasnovski <evgeni.chasnovski@gmail.com>
Date: Thu, 13 Nov 2025 15:45:55 +0200
refactor(pack): rearrange lockfile code to be able to use other locals
Diffstat:
1 file changed, 62 insertions(+), 64 deletions(-)
diff --git a/runtime/lua/vim/pack.lua b/runtime/lua/vim/pack.lua
@@ -152,6 +152,26 @@ local async = require('vim._async')
local M = {}
+--- @class (private) vim.pack.LockData
+--- @field rev string Latest recorded revision.
+--- @field src string Plugin source.
+--- @field version? string|vim.VersionRange Plugin `version`, as supplied in `spec`.
+
+--- @class (private) vim.pack.Lock
+--- @field plugins table<string, vim.pack.LockData> Map from plugin name to its lock data.
+
+--- @type vim.pack.Lock
+local plugin_lock
+
+--- @return string
+local function get_plug_dir()
+ return vim.fs.joinpath(vim.fn.stdpath('data'), 'site', 'pack', 'core', 'opt')
+end
+
+local function lock_get_path()
+ return vim.fs.joinpath(vim.fn.stdpath('config'), 'nvim-pack-lock.json')
+end
+
-- Git ------------------------------------------------------------------------
--- @async
@@ -251,70 +271,6 @@ local function git_get_tags(cwd)
return tags == '' and {} or vim.split(tags, '\n')
end
--- Lockfile -------------------------------------------------------------------
-
---- @return string
-local function get_plug_dir()
- return vim.fs.joinpath(vim.fn.stdpath('data'), 'site', 'pack', 'core', 'opt')
-end
-
---- @class (private) vim.pack.LockData
---- @field rev string Latest recorded revision.
---- @field src string Plugin source.
---- @field version? string|vim.VersionRange Plugin `version`, as supplied in `spec`.
-
---- @class (private) vim.pack.Lock
---- @field plugins table<string, vim.pack.LockData> Map from plugin name to its lock data.
-
---- @type vim.pack.Lock
-local plugin_lock
-
-local function lock_get_path()
- return vim.fs.joinpath(vim.fn.stdpath('config'), 'nvim-pack-lock.json')
-end
-
-local function lock_read()
- if plugin_lock then
- return
- end
- local fd = uv.fs_open(lock_get_path(), 'r', 438)
- if not fd then
- plugin_lock = { plugins = {} }
- return
- end
- local stat = assert(uv.fs_fstat(fd))
- local data = assert(uv.fs_read(fd, stat.size, 0))
- assert(uv.fs_close(fd))
- plugin_lock = vim.json.decode(data) --- @type vim.pack.Lock
-
- -- Deserialize `version`
- for _, l_data in pairs(plugin_lock.plugins) do
- local version = l_data.version
- if type(version) == 'string' then
- l_data.version = version:match("^'(.+)'$") or vim.version.range(version)
- end
- end
-end
-
-local function lock_write()
- -- Serialize `version`
- local lock = vim.deepcopy(plugin_lock)
- for _, l_data in pairs(lock.plugins) do
- local version = l_data.version
- if version then
- l_data.version = type(version) == 'string' and ("'%s'"):format(version) or tostring(version)
- end
- end
-
- local path = lock_get_path()
- vim.fn.mkdir(vim.fs.dirname(path), 'p')
- local fd = assert(uv.fs_open(path, 'w', 438))
-
- local data = vim.json.encode(lock, { indent = ' ', sort_keys = true })
- assert(uv.fs_write(fd, data))
- assert(uv.fs_close(fd))
-end
-
-- Plugin operations ----------------------------------------------------------
--- @param msg string|string[]
@@ -785,6 +741,48 @@ local function pack_add(plug, load)
end
end
+local function lock_write()
+ -- Serialize `version`
+ local lock = vim.deepcopy(plugin_lock)
+ for _, l_data in pairs(lock.plugins) do
+ local version = l_data.version
+ if version then
+ l_data.version = type(version) == 'string' and ("'%s'"):format(version) or tostring(version)
+ end
+ end
+
+ local path = lock_get_path()
+ vim.fn.mkdir(vim.fs.dirname(path), 'p')
+ local fd = assert(uv.fs_open(path, 'w', 438))
+
+ local data = vim.json.encode(lock, { indent = ' ', sort_keys = true })
+ assert(uv.fs_write(fd, data))
+ assert(uv.fs_close(fd))
+end
+
+local function lock_read()
+ if plugin_lock then
+ return
+ end
+ local fd = uv.fs_open(lock_get_path(), 'r', 438)
+ if not fd then
+ plugin_lock = { plugins = {} }
+ return
+ end
+ local stat = assert(uv.fs_fstat(fd))
+ local data = assert(uv.fs_read(fd, stat.size, 0))
+ assert(uv.fs_close(fd))
+ plugin_lock = vim.json.decode(data) --- @type vim.pack.Lock
+
+ -- Deserialize `version`
+ for _, l_data in pairs(plugin_lock.plugins) do
+ local version = l_data.version
+ if type(version) == 'string' then
+ l_data.version = version:match("^'(.+)'$") or vim.version.range(version)
+ end
+ end
+end
+
--- @class vim.pack.keyset.add
--- @inlinedoc
--- Load `plugin/` files and `ftdetect/` scripts. If `false`, works like `:packadd!`.