From be0e5b6319a35aa858a795b093895f424bf77dac Mon Sep 17 00:00:00 2001 From: Deshdeepak Date: Sat, 10 Dec 2022 09:03:37 +0530 Subject: [PATCH] fix(git): git watcher showing error for bare repositories use absolutegitdir for watcher instead of toplevel --- lua/nvim-tree/git/init.lua | 9 ++++++--- lua/nvim-tree/git/utils.lua | 31 +++++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+), 3 deletions(-) diff --git a/lua/nvim-tree/git/init.lua b/lua/nvim-tree/git/init.lua index e16169503fb..1d86cd89bad 100644 --- a/lua/nvim-tree/git/init.lua +++ b/lua/nvim-tree/git/init.lua @@ -136,6 +136,8 @@ function M.load_project_status(cwd) return {} end + local absolutegitdir = git_utils.get_absolutegitdir(cwd) + local status = M.projects[project_root] if status then return status @@ -153,14 +155,15 @@ function M.load_project_status(cwd) log.line("watcher", "git start") local callback = function(w) - log.line("watcher", "git event scheduled '%s'", w.project_root) - utils.debounce("git:watcher:" .. w.project_root, M.config.filesystem_watchers.debounce_delay, function() + log.line("watcher", "git event scheduled '%s'", w.absolutegitdir) + utils.debounce("git:watcher:" .. w.absolutegitdir, M.config.filesystem_watchers.debounce_delay, function() reload_tree_at(w.project_root) end) end - watcher = Watcher:new(utils.path_join { project_root, ".git" }, WATCHED_FILES, callback, { + watcher = Watcher:new(absolutegitdir, WATCHED_FILES, callback, { project_root = project_root, + absolutegitdir = absolutegitdir, }) end diff --git a/lua/nvim-tree/git/utils.lua b/lua/nvim-tree/git/utils.lua index 48074c08f6e..d24de48e77c 100644 --- a/lua/nvim-tree/git/utils.lua +++ b/lua/nvim-tree/git/utils.lua @@ -3,6 +3,37 @@ local log = require "nvim-tree.log" local has_cygpath = vim.fn.executable "cygpath" == 1 +function M.get_absolutegitdir(cwd) + local ps = log.profile_start("git absolutegitdir %s", cwd) + + local cmd = { "git", "-C", cwd, "rev-parse", "--absolute-git-dir" } + log.line("git", "%s", vim.inspect(cmd)) + + local absolutegitdir = vim.fn.system(cmd) + + log.raw("git", absolutegitdir) + log.profile_end(ps, "git absolutegitdir %s", cwd) + + if vim.v.shell_error ~= 0 or not absolutegitdir or #absolutegitdir == 0 or absolutegitdir:match "fatal" then + return nil + end + + -- git always returns path with forward slashes + if vim.fn.has "win32" == 1 then + -- msys2 git support + if has_cygpath then + absolutegitdir = vim.fn.system("cygpath -w " .. vim.fn.shellescape(absolutegitdir)) + if vim.v.shell_error ~= 0 then + return nil + end + end + absolutegitdir = absolutegitdir:gsub("/", "\\") + end + + -- remove newline + return absolutegitdir:sub(0, -2) +end + function M.get_toplevel(cwd) local ps = log.profile_start("git toplevel %s", cwd)