NeogitOrg / neogit

An interactive and powerful Git interface for Neovim, inspired by Magit
MIT License
3.62k stars 218 forks source link

`attempt to compare nil with number` when staging via visual-lines selection #1383

Closed rami3l closed 1 week ago

rami3l commented 2 weeks ago

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 by s 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.

  1. nvim -u minimal.lua
  2. 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).
  3. The :Neogit panel shows some diff like the following:
    [..]
    -   return
    +       // foo
    +   return // s
    [..]
  4. Use S to stage the unstaged changes, and use u to unstage it again.
  5. Delete the // foo line, now the diff should look like the following:
    [..]
    -   return
    +   return // s
    [..]
  6. Use V to select the first line, and use s to stage it.
  7. 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 ```
rami3l commented 1 week ago

This seems to be fixed with https://github.com/NeogitOrg/neogit/pull/1386.

Thanks a lot @CKolkey! I'm closing this issue for now.