Skip to content

Neogit starts producing errors when calling neogit.open twice from different pwd, OR when using a zsh terminal that runs the powerlevel10k theme #1385

Open
@tvsfx

Description

@tvsfx

Description

I start getting errors in the following cases:

  • I open the Neogit status buffer when it is already open, using the neogit.open command twice, when the cwd is not inside the project that my buffer is in
  • I open the neogit status buffer for a specific project, and then open a zsh+powerleve10k terminal under a different cwd,

Neovim version

v0.10.0
(Neogit: 11dea1b )

Operating system and version

Ubuntu 20.04

Steps to reproduce

Self-variant

  1. From $HOME, run nvim -u minimal.lua
  2. Navigate to a random file, let's say random, in a random git repo without changing pwd (e.g. :e <path-to-random>)
  3. Type \gs (keybind defined below) to call Neogit status for the repo containing the current file's folder.
  4. Click back on tab that contains random
  5. Repeat step 3
  6. Error occurs

Shell variant (requires zsh/powerlevel10k)
<Repeat steps 1-4 above>
5. open a terminal under the new CWD using :edit term://%:p:h//zsh
6. Error occurs

Expected behavior

No response

Actual behavior

The error trace is as follows:

E5108: Error executing lua: ...nkering/.min/plugins/plenary/lua/plenary/async/async.lua:18: The coroutine failed with this message: ...nkering/.min/plugins/plenary/lua/plenary/async/async.lua:18: The coroutine failed with this message: ...nkering/.min/plugins/plenary/lua/plenary/async/async.lua:18: The coroutine failed with this message: ...ing/.min/plugins/neogit/lua/neogit/lib/git/sequencer.lua:50: attempt to index local 'HEAD_oid' (a nil value)
stack traceback:
	[C]: in function 'error'
	...nkering/.min/plugins/plenary/lua/plenary/async/async.lua:18: in function 'callback_or_next'
	...nkering/.min/plugins/plenary/lua/plenary/async/async.lua:45: in function 'callback'
	...ering/.min/plugins/plenary/lua/plenary/async/control.lua:101: in function 'returned_function'
	...nkering/.min/plugins/plenary/lua/plenary/async/async.lua:31: in function 'callback_or_next'
	...nkering/.min/plugins/plenary/lua/plenary/async/async.lua:45: in function 'step'
	...nkering/.min/plugins/plenary/lua/plenary/async/async.lua:48: in function 'execute'
	...nkering/.min/plugins/plenary/lua/plenary/async/async.lua:118: in function <...nkering/.min/plugins/plenary/lua/plenary/async/async.lua:117>
	...nts/General/Tinkering/.min/plugins/neogit/lua/neogit.lua:129: in function 'open_status_buffer'
	...nts/General/Tinkering/.min/plugins/neogit/lua/neogit.lua:193: in function 'open'
	.../Documents/General/Tinkering/minimal.lua:88: in function <.../Documents/General/Tinkering/minimal.lua:87>

Tested using minimal.lua, and I still get the error. For the shell variant; I do not get the error when I switch to bash or when I turn my zsh theme off. I assume this has to do with the fact that powershell10k has its own git status overview, which somehow interferes with neogit.

Minimal config

-- 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<PluginName, PluginUrl>

---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<PluginName, PluginUrl>
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.
local neogit = require("neogit")

neogit.setup({}) -- For instance, setup Neogit

vim.keymap.set("n", "<leader>gs", function()
	neogit.open({ cwd = "%:p:h", kind = "tab" })
end, { desc = "neogit-status" })

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions