fix(pack): actually checkout proper version of submodules

Problem: Installing plugin with submodules doesn't check out their
  state (due to `git clone --no-checkout` to not end up with default
  branch code in case of invalid `version`).

  Updating a plugin with submodules doesn't update their state.

Solution: Update `git_checkout` helper to account for submodules.
  Another approach would be `git checkout --recurse-submodules ...`,
  but that doesn't seem to allow `--filter=blob:none` for submodules,
  which is nice to have.

  Also make `git_clone` wrapper simpler since `--no-checkout` makes
  `--recurse-submodules` and `--also-filter-submodules` do nothing.
This commit is contained in:
Evgeni Chasnovski
2026-01-12 22:57:38 +02:00
parent 09edb145f5
commit bac4cde9cd
2 changed files with 85 additions and 8 deletions

View File

@@ -264,17 +264,12 @@ end
--- @param url string
--- @param path string
local function git_clone(url, path)
local cmd = { 'clone', '--quiet', '--no-checkout', '--recurse-submodules' }
local cmd = { 'clone', '--quiet', '--no-checkout' }
if vim.startswith(url, 'file://') then
cmd[#cmd + 1] = '--no-hardlinks'
else
if git_version >= vim.version.parse('2.36') then
cmd[#cmd + 1] = '--filter=blob:none'
cmd[#cmd + 1] = '--also-filter-submodules'
elseif git_version >= vim.version.parse('2.27') then
cmd[#cmd + 1] = '--filter=blob:none'
end
elseif git_version >= vim.version.parse('2.27') then
cmd[#cmd + 1] = '--filter=blob:none'
end
vim.list_extend(cmd, { '--origin', 'origin', url, path })
@@ -669,6 +664,12 @@ local function checkout(p, timestamp, skip_stash)
git_cmd({ 'checkout', '--quiet', p.info.sha_target }, p.path)
local submodule_cmd = { 'submodule', 'update', '--init', '--recursive' }
if git_version >= vim.version.parse('2.36') then
submodule_cmd[#submodule_cmd + 1] = '--filter=blob:none'
end
git_cmd(submodule_cmd, p.path)
plugin_lock.plugins[p.spec.name].rev = p.info.sha_target
-- (Re)Generate help tags according to the current help files.