From 568d0f15aba9227005438e0586a8166d6630b59d Mon Sep 17 00:00:00 2001 From: Alexander Courtis Date: Sat, 26 Oct 2024 12:43:19 +1100 Subject: [PATCH] chore: resolve undefined-field --- lua/nvim-tree/explorer/init.lua | 2 +- lua/nvim-tree/explorer/watch.lua | 3 +- lua/nvim-tree/git/init.lua | 92 ++++++++++++++++----------- lua/nvim-tree/git/utils.lua | 42 ++++++++++++ lua/nvim-tree/node/directory-link.lua | 4 +- lua/nvim-tree/node/directory.lua | 36 +---------- lua/nvim-tree/node/file-link.lua | 4 +- lua/nvim-tree/node/file.lua | 4 +- lua/nvim-tree/node/init.lua | 34 ---------- 9 files changed, 110 insertions(+), 111 deletions(-) diff --git a/lua/nvim-tree/explorer/init.lua b/lua/nvim-tree/explorer/init.lua index ac958a44..0bad7fb1 100644 --- a/lua/nvim-tree/explorer/init.lua +++ b/lua/nvim-tree/explorer/init.lua @@ -478,7 +478,7 @@ function Explorer:reload_git() event_running = true local projects = git.reload() - self:reload_node_status(projects) + git.reload_node_status(self, projects) self.renderer:draw() event_running = false end diff --git a/lua/nvim-tree/explorer/watch.lua b/lua/nvim-tree/explorer/watch.lua index a8375813..be37bf66 100644 --- a/lua/nvim-tree/explorer/watch.lua +++ b/lua/nvim-tree/explorer/watch.lua @@ -1,4 +1,5 @@ local log = require("nvim-tree.log") +local git = require("nvim-tree.git") local utils = require("nvim-tree.utils") local Watcher = require("nvim-tree.watcher").Watcher @@ -76,7 +77,7 @@ function M.create_watcher(node) else log.line("watcher", "node event executing refresh '%s'", node.absolute_path) end - node:refresh() + git.refresh_dir(node) end) end diff --git a/lua/nvim-tree/git/init.lua b/lua/nvim-tree/git/init.lua index 38ab078a..43c9279b 100644 --- a/lua/nvim-tree/git/init.lua +++ b/lua/nvim-tree/git/init.lua @@ -5,7 +5,7 @@ local git_utils = require("nvim-tree.git.utils") local GitRunner = require("nvim-tree.git.runner") local Watcher = require("nvim-tree.watcher").Watcher local Iterator = require("nvim-tree.iterators.node-iterator") -local DirectoryNode = nil -- circular dependency +local DirectoryNode = require("nvim-tree.node.directory") ---@class GitStatus -- xy short-format statuses ---@field file string? @@ -289,46 +289,67 @@ function M.load_project_status(path) end end ----Git file and directory status for an absolute path with optional file fallback ----@param parent_ignored boolean ----@param status table|nil ----@param path string ----@param path_file string? alternative file path when no other file status ----@return GitStatus|nil -function M.git_status_dir(parent_ignored, status, path, path_file) - if parent_ignored then - return { file = "!!" } - end +---@param dir DirectoryNode +---@param project table? +---@param root string? +function M.update_parent_statuses(dir, project, root) + while project and dir do + -- step up to the containing project + if dir.absolute_path == root then + -- stop at the top of the tree + if not dir.parent then + break + end - if status then - return { - file = status.files and (status.files[path] or status.files[path_file]), - dir = status.dirs and { - direct = status.dirs.direct and status.dirs.direct[path], - indirect = status.dirs.indirect and status.dirs.indirect[path], - }, - } + root = M.get_toplevel(dir.parent.absolute_path) + + -- stop when no more projects + if not root then + break + end + + -- update the containing project + project = M.get_project(root) + M.reload_project(root, dir.absolute_path, nil) + end + + -- update status + dir:update_git_status(dir.parent and dir.parent:is_git_ignored() or false, project) + + -- maybe parent + dir = dir.parent end end ----Git file status for an absolute path with optional fallback ----@param parent_ignored boolean ----@param status table|nil ----@param path string ----@param path_fallback string? ----@return GitStatus -function M.git_status_file(parent_ignored, status, path, path_fallback) - if parent_ignored then - return { file = "!!" } - end +---Refresh contents and git status for a single directory +---@param dir DirectoryNode +function M.refresh_dir(dir) + local node = dir:get_parent_of_group() or dir + local toplevel = M.get_toplevel(dir.absolute_path) - if not status or not status.files then - return {} - end + M.reload_project(toplevel, dir.absolute_path, function() + local project = M.get_project(toplevel) or {} - return { - file = status.files[path] or status.files[path_fallback] - } + dir.explorer:reload(node, project) + + M.update_parent_statuses(dir, project, toplevel) + + dir.explorer.renderer:draw() + end) +end + +---@param n DirectoryNode +---@param projects table +function M.reload_node_status(n, projects) + local toplevel = M.get_toplevel(n.absolute_path) + local status = projects[toplevel] or {} + for _, node in ipairs(n.nodes) do + node:update_git_status(n:is_git_ignored(), status) + local dir = node:as(DirectoryNode) + if dir and #dir.nodes > 0 then + dir:reload_node_status(projects) + end + end end function M.purge_state() @@ -355,7 +376,6 @@ end function M.setup(opts) M.config.git = opts.git M.config.filesystem_watchers = opts.filesystem_watchers - DirectoryNode = require("nvim-tree.node.directory") end return M diff --git a/lua/nvim-tree/git/utils.lua b/lua/nvim-tree/git/utils.lua index 8caaf73a..75f1db5c 100644 --- a/lua/nvim-tree/git/utils.lua +++ b/lua/nvim-tree/git/utils.lua @@ -127,6 +127,48 @@ function M.file_status_to_dir_status(status, cwd) return r end +---Git file status for an absolute path with optional fallback +---@param parent_ignored boolean +---@param status table|nil +---@param path string +---@param path_fallback string? +---@return GitStatus +function M.git_status_file(parent_ignored, status, path, path_fallback) + if parent_ignored then + return { file = "!!" } + end + + if not status or not status.files then + return {} + end + + return { + file = status.files[path] or status.files[path_fallback] + } +end + +---Git file and directory status for an absolute path with optional file fallback +---@param parent_ignored boolean +---@param status table|nil +---@param path string +---@param path_file string? alternative file path when no other file status +---@return GitStatus|nil +function M.git_status_dir(parent_ignored, status, path, path_file) + if parent_ignored then + return { file = "!!" } + end + + if status then + return { + file = status.files and (status.files[path] or status.files[path_file]), + dir = status.dirs and { + direct = status.dirs.direct and status.dirs.direct[path], + indirect = status.dirs.indirect and status.dirs.indirect[path], + }, + } + end +end + function M.setup(opts) if opts.git.cygwin_support then M.use_cygpath = vim.fn.executable("cygpath") == 1 diff --git a/lua/nvim-tree/node/directory-link.lua b/lua/nvim-tree/node/directory-link.lua index 0e6fd338..210daddb 100644 --- a/lua/nvim-tree/node/directory-link.lua +++ b/lua/nvim-tree/node/directory-link.lua @@ -1,4 +1,4 @@ -local git = require("nvim-tree.git") +local git_utils = require("nvim-tree.git.utils") local DirectoryNode = require("nvim-tree.node.directory") @@ -40,7 +40,7 @@ end -----@param parent_ignored boolean -----@param status table|nil function DirectoryLinkNode:update_git_status(parent_ignored, status) - self.git_status = git.git_status_dir(parent_ignored, status, self.link_to, self.absolute_path) + self.git_status = git_utils.git_status_dir(parent_ignored, status, self.link_to, self.absolute_path) end ---Create a sanitized partial copy of a node, populating children recursively. diff --git a/lua/nvim-tree/node/directory.lua b/lua/nvim-tree/node/directory.lua index 7c3246fa..a04c017f 100644 --- a/lua/nvim-tree/node/directory.lua +++ b/lua/nvim-tree/node/directory.lua @@ -1,5 +1,4 @@ -local git = require("nvim-tree.git") -local watch = require("nvim-tree.explorer.watch") +local git_utils = require("nvim-tree.git.utils") local Node = require("nvim-tree.node") @@ -46,7 +45,7 @@ function DirectoryNode:create(explorer, parent, absolute_path, name, fs_stat) } o = self:new(o) --[[@as DirectoryNode]] - o.watcher = watch.create_watcher(o) + o.watcher = require("nvim-tree.explorer.watch").create_watcher(o) return o end @@ -70,7 +69,7 @@ end ---@param parent_ignored boolean ---@param status table|nil function DirectoryNode:update_git_status(parent_ignored, status) - self.git_status = git.git_status_dir(parent_ignored, status, self.absolute_path, nil) + self.git_status = git_utils.git_status_dir(parent_ignored, status, self.absolute_path, nil) end ---@return string[]? xy short-format statuses @@ -123,35 +122,6 @@ function DirectoryNode:get_git_status() end end ----Refresh contents and git status for a single node -function DirectoryNode:refresh() - local node = self:get_parent_of_group() or self - local toplevel = git.get_toplevel(self.absolute_path) - - git.reload_project(toplevel, self.absolute_path, function() - local project = git.get_project(toplevel) or {} - - self.explorer:reload(node, project) - - node:update_parent_statuses(project, toplevel) - - self.explorer.renderer:draw() - end) -end - ----@param projects table -function DirectoryNode:reload_node_status(projects) - local toplevel = git.get_toplevel(self.absolute_path) - local status = projects[toplevel] or {} - for _, node in ipairs(self.nodes) do - node:update_git_status(self:is_git_ignored(), status) - local dir = node:as(DirectoryNode) - if dir and #dir.nodes > 0 then - dir:reload_node_status(projects) - end - end -end - -- If node is grouped, return the last node in the group. Otherwise, return the given node. ---@return DirectoryNode function DirectoryNode:last_group_node() diff --git a/lua/nvim-tree/node/file-link.lua b/lua/nvim-tree/node/file-link.lua index 2d2571f0..ecefb771 100644 --- a/lua/nvim-tree/node/file-link.lua +++ b/lua/nvim-tree/node/file-link.lua @@ -1,4 +1,4 @@ -local git = require("nvim-tree.git") +local git_utils = require("nvim-tree.git.utils") local FileNode = require("nvim-tree.node.file") @@ -36,7 +36,7 @@ end -----@param parent_ignored boolean -----@param status table|nil function FileLinkNode:update_git_status(parent_ignored, status) - self.git_status = git.git_status_file(parent_ignored, status, self.link_to, self.absolute_path) + self.git_status = git_utils.git_status_file(parent_ignored, status, self.link_to, self.absolute_path) end ---Create a sanitized partial copy of a node diff --git a/lua/nvim-tree/node/file.lua b/lua/nvim-tree/node/file.lua index 5b9394e9..cbf83a6f 100644 --- a/lua/nvim-tree/node/file.lua +++ b/lua/nvim-tree/node/file.lua @@ -1,4 +1,4 @@ -local git = require("nvim-tree.git") +local git_utils = require("nvim-tree.git.utils") local utils = require("nvim-tree.utils") local Node = require("nvim-tree.node") @@ -44,7 +44,7 @@ end ---@param parent_ignored boolean ---@param status table|nil function FileNode:update_git_status(parent_ignored, status) - self.git_status = git.git_status_file(parent_ignored, status, self.absolute_path, nil) + self.git_status = git_utils.git_status_file(parent_ignored, status, self.absolute_path, nil) end ---@return string[]? xy short-format statuses diff --git a/lua/nvim-tree/node/init.lua b/lua/nvim-tree/node/init.lua index f084cd47..6d999b0f 100644 --- a/lua/nvim-tree/node/init.lua +++ b/lua/nvim-tree/node/init.lua @@ -1,5 +1,3 @@ -local git = require("nvim-tree.git") - local Class = require("nvim-tree.class") ---Abstract Node class. @@ -52,38 +50,6 @@ function Node:is_dotfile() return false end ----@param project table? ----@param root string? -function Node:update_parent_statuses(project, root) - local node = self - while project and node do - -- step up to the containing project - if node.absolute_path == root then - -- stop at the top of the tree - if not node.parent then - break - end - - root = git.get_toplevel(node.parent.absolute_path) - - -- stop when no more projects - if not root then - break - end - - -- update the containing project - project = git.get_project(root) - git.reload_project(root, node.absolute_path, nil) - end - - -- update status - node:update_git_status(node.parent and node.parent:is_git_ignored() or false, project) - - -- maybe parent - node = node.parent - end -end - ---Get the highest parent of grouped nodes, nil when not grouped ---@return DirectoryNode? function Node:get_parent_of_group()