I'm still not sure if it's a minimal reproduction though.
nvim -u minimal.lua
In any git repo, change a random place like in the following example. This includes changing a current line (e.g. return to return // s), and adding a new line above it (e.g. // foo).
The :Neogit panel shows some diff like the following:
[..]
- return
+ // foo
+ return // s
[..]
Use S to stage the unstaged changes, and use u to unstage it again.
Delete the // foo line, now the diff should look like the following:
[..]
- return
+ return // s
[..]
Use V to select the first line, and use s to stage it.
Use V to select the second line, and use s to stage it.
Expected behavior
Staging completed without error.
Actual behavior
E5108: Error executing lua: ...share/nvim/lazy/plenary.nvim/lua/plenary/async/async.lua:18: The coroutine failed with this message: ....local/share/nvim/lazy/neogit/lua/neogit/lib/ui/init.lua:192: attempt to compare nil with number
stack traceback:
[C]: in function 'error'
...share/nvim/lazy/plenary.nvim/lua/plenary/async/async.lua:18: in function 'callback_or_next'
...share/nvim/lazy/plenary.nvim/lua/plenary/async/async.lua:45: in function 'step'
...share/nvim/lazy/plenary.nvim/lua/plenary/async/async.lua:48: in function 'execute'
...share/nvim/lazy/plenary.nvim/lua/plenary/async/async.lua:118: in function 'cb'
.../.local/share/nvim/lazy/neogit/lua/neogit/lib/buffer.lua:582: in function <.../.local/share/nvim/lazy/neogit/lua/neogit/lib/buffer.lua:581>
Minimal config
This is the original `minimal.lua` without any changes.
```Lua
-- NOTE: See the end of this file if you are reporting an issue, etc. Ignore all the "scary" functions up top, those are
-- used for setup and other operations.
local M = {}
local base_root_path = vim.fn.fnamemodify(debug.getinfo(1, "S").source:sub(2), ":p:h") .. "/.min"
function M.root(path)
return base_root_path .. "/" .. (path or "")
end
function M.load_plugin(plugin_name, plugin_url)
local package_root = M.root("plugins/")
local install_destination = package_root .. plugin_name
vim.opt.runtimepath:append(install_destination)
if not vim.loop.fs_stat(package_root) then
vim.fn.mkdir(package_root, "p")
end
if not vim.loop.fs_stat(install_destination) then
print(string.format("> Downloading plugin '%s' to '%s'", plugin_name, install_destination))
vim.fn.system({
"git",
"clone",
"--depth=1",
plugin_url,
install_destination,
})
if vim.v.shell_error > 0 then
error(string.format("> Failed to clone plugin: '%s' in '%s'!", plugin_name, install_destination),
vim.log.levels.ERROR)
end
end
end
---@alias PluginName string The plugin name, will be used as part of the git clone destination
---@alias PluginUrl string The git url at which a plugin is located, can be a path. See https://git-scm.com/book/en/v2/Git-on-the-Server-The-Protocols for details
---@alias MinPlugins table
---Do the initial setup. Downloads plugins, ensures the minimal init does not pollute the filesystem by keeping
---everything self contained to the CWD of the minimal init file. Run prior to running tests, reproducing issues, etc.
---@param plugins? table
function M.setup(plugins)
vim.opt.packpath = {} -- Empty the package path so we use only the plugins specified
vim.opt.runtimepath:append(M.root(".min")) -- Ensure the runtime detects the root min dir
-- Install required plugins
if plugins ~= nil then
for plugin_name, plugin_url in pairs(plugins) do
M.load_plugin(plugin_name, plugin_url)
end
end
vim.env.XDG_CONFIG_HOME = M.root("xdg/config")
vim.env.XDG_DATA_HOME = M.root("xdg/data")
vim.env.XDG_STATE_HOME = M.root("xdg/state")
vim.env.XDG_CACHE_HOME = M.root("xdg/cache")
-- NOTE: Cleanup the xdg cache on exit so new runs of the minimal init doesn't share any previous state, e.g. shada
vim.api.nvim_create_autocmd("VimLeave", {
callback = function()
vim.fn.system({
"rm",
"-r",
"-f",
M.root("xdg")
})
end
})
end
-- NOTE: If you have additional plugins you need to install to reproduce your issue, include them in the plugins
-- table within the setup call below.
M.setup({
plenary = "https://github.com/nvim-lua/plenary.nvim.git",
telescope = "https://github.com/nvim-telescope/telescope.nvim",
diffview = "https://github.com/sindrets/diffview.nvim",
neogit = "https://github.com/NeogitOrg/neogit"
})
-- WARN: Do all plugin setup, test runs, reproductions, etc. AFTER calling setup with a list of plugins!
-- Basically, do all that stuff AFTER this line.
require("neogit").setup({}) -- For instance, setup Neogit
```
Description
I've encountered a very weird bug when trying to stage certain sections of a file via visual-lines (i.e. the
V
selection followed bys
for staging).cc #1233
Neovim version
NVIM v0.10.0 Build type: Release LuaJIT 2.1.1716656478
Operating system and version
macOS 14.5.0
Steps to reproduce
This bug is a bit hard to reproduce (for example, if I omit the editing part then the bug won't reproduce at all), but the following steps has allowed 100% reproduction on my machine with the default
minimal.nvim
, regardless of repo (tried on https://github.com/rust-lang/rustup, https://github.com/rami3l/nvim-config and https://github.com/rami3l/ting).I'm still not sure if it's a minimal reproduction though.
nvim -u minimal.lua
return
toreturn // s
), and adding a new line above it (e.g.// foo
).:Neogit
panel shows some diff like the following:S
to stage the unstaged changes, and useu
to unstage it again.// foo
line, now the diff should look like the following:V
to select the first line, and uses
to stage it.V
to select the second line, and uses
to stage it.Expected behavior
Staging completed without error.
Actual behavior
Minimal config
This is the original `minimal.lua` without any changes.
```Lua -- NOTE: See the end of this file if you are reporting an issue, etc. Ignore all the "scary" functions up top, those are -- used for setup and other operations. local M = {} local base_root_path = vim.fn.fnamemodify(debug.getinfo(1, "S").source:sub(2), ":p:h") .. "/.min" function M.root(path) return base_root_path .. "/" .. (path or "") end function M.load_plugin(plugin_name, plugin_url) local package_root = M.root("plugins/") local install_destination = package_root .. plugin_name vim.opt.runtimepath:append(install_destination) if not vim.loop.fs_stat(package_root) then vim.fn.mkdir(package_root, "p") end if not vim.loop.fs_stat(install_destination) then print(string.format("> Downloading plugin '%s' to '%s'", plugin_name, install_destination)) vim.fn.system({ "git", "clone", "--depth=1", plugin_url, install_destination, }) if vim.v.shell_error > 0 then error(string.format("> Failed to clone plugin: '%s' in '%s'!", plugin_name, install_destination), vim.log.levels.ERROR) end end end ---@alias PluginName string The plugin name, will be used as part of the git clone destination ---@alias PluginUrl string The git url at which a plugin is located, can be a path. See https://git-scm.com/book/en/v2/Git-on-the-Server-The-Protocols for details ---@alias MinPlugins table