fix(pack)!: adjust install confirm (no error on "No", show names)

Problem: Installation confirmation has several usability issues:
    - Choosing "No" results in a `vim.pack.add()` error. This was by
      design to ensure that all later code that *might* reference
      presumably installed plugin will not get executed. However, this
      is often too restrictive since there might be no such code (like
      if plugin's effects are automated in its 'plugin/' directory).
      Instead the potential code using not installed plugin will throw
      an error.

      No error on "No" will also be useful for planned lockfile repair.

    - List of soon-to-be-installed plugins doesn't mention plugin names.
      This might be confusing if plugins are installed under different
      name.

Solution: Silently drop installation step if user chose "No" and show
  plugin names in confirmation text (together with their pretty aligned
  sources).
This commit is contained in:
Evgeni Chasnovski
2025-11-13 15:45:48 +02:00
parent 5d258854a7
commit 9e2599df05
2 changed files with 39 additions and 29 deletions

View File

@@ -387,18 +387,22 @@ describe('vim.pack', function()
end)
it('asks for installation confirmation', function()
-- Do not confirm installation to see what happens
-- Do not confirm installation to see what happens (should not error)
mock_confirm(2)
local err = pcall_err(exec_lua, function()
vim.pack.add({ repos_src.basic })
exec_lua(function()
vim.pack.add({ repos_src.basic, { src = repos_src.defbranch, name = 'other-name' } })
end)
matches('`basic`:\nInstallation was not confirmed', err)
eq(false, exec_lua('return pcall(require, "basic")'))
eq(false, exec_lua('return pcall(require, "defbranch")'))
local confirm_msg = 'These plugins will be installed:\n\n' .. repos_src.basic .. '\n'
local ref_log = { { confirm_msg, 'Proceed? &Yes\n&No\n&Always', 1, 'Question' } }
local confirm_msg_lines = ([[
These plugins will be installed:
basic from %s
other-name from %s]]):format(repos_src.basic, repos_src.defbranch)
local confirm_msg = vim.trim(vim.text.indent(0, confirm_msg_lines))
local ref_log = { { confirm_msg .. '\n', 'Proceed? &Yes\n&No\n&Always', 1, 'Question' } }
eq(ref_log, exec_lua('return _G.confirm_log'))
end)