* refactor(#2875): multi instance renderer * refactor(#2875): multi instance renderer * refactor(#2875): multi instance renderer * refactor(#2875): multi instance renderer * node classes and constructors * node methods * refactor(#2875): multi instance renderer * node classes and constructors * explorer is a directory node * extract methods from explore_node * extract methods from explore_node * extract methods from explore_node * extract methods from lib * use .. name for root node for compatibility * use node.explorer * extract node factory, remove unused code * factories for all nodes, add RootNode * factories for all nodes, add RootNode * use factory pattern for decorators * note regression and commit * fix dir git status regression * destroy nodes, not explorer * add BaseNode:is * revert changes to create-file, handle in #2924 * extract methods from explorer * extract methods from explorer * extract methods from explorer * use Node everywhere in luadoc * extract methods from lib * extract methods from lib * lint * remove unused code * don't call methods on fake root node * get_node_at_cursor returns explorer (root) node instead of { name = '..' } * remove unused inject_node * refactor(#2875): multi instance renderer * refactor(#2875): multi instance renderer * refactor(#2875): multi instance renderer * extract methods from lib * node factory uses stat only * temporary DirectoryNode casting until method extraction into child classes * lua-language-server 3.10.5 -> 3.11.0 * explicitly call Explorer constructor * normalise explorer RootNode new call, tidy annotations
This commit is contained in:
committed by
GitHub
parent
c9104a5d07
commit
38aac09151
@@ -1,15 +1,15 @@
|
||||
local builders = require("nvim-tree.explorer.node-builders")
|
||||
local git = require("nvim-tree.git")
|
||||
local log = require("nvim-tree.log")
|
||||
local notify = require("nvim-tree.notify")
|
||||
local utils = require("nvim-tree.utils")
|
||||
local view = require("nvim-tree.view")
|
||||
local watch = require("nvim-tree.explorer.watch")
|
||||
local explorer_node = require("nvim-tree.explorer.node")
|
||||
local node_factory = require("nvim-tree.node.factory")
|
||||
|
||||
local RootNode = require("nvim-tree.node.root")
|
||||
local Watcher = require("nvim-tree.watcher")
|
||||
|
||||
local Iterator = require("nvim-tree.iterators.node-iterator")
|
||||
local NodeIterator = require("nvim-tree.iterators.node-iterator")
|
||||
local Watcher = require("nvim-tree.watcher")
|
||||
|
||||
local Filters = require("nvim-tree.explorer.filters")
|
||||
local Marks = require("nvim-tree.marks")
|
||||
@@ -22,23 +22,20 @@ local FILTER_REASON = require("nvim-tree.enum").FILTER_REASON
|
||||
|
||||
local config
|
||||
|
||||
---@class Explorer
|
||||
---@class (exact) Explorer: RootNode
|
||||
---@field opts table user options
|
||||
---@field absolute_path string
|
||||
---@field nodes Node[]
|
||||
---@field open boolean
|
||||
---@field watcher Watcher|nil
|
||||
---@field renderer Renderer
|
||||
---@field filters Filters
|
||||
---@field live_filter LiveFilter
|
||||
---@field sorters Sorter
|
||||
---@field marks Marks
|
||||
---@field clipboard Clipboard
|
||||
local Explorer = {}
|
||||
local Explorer = RootNode:new()
|
||||
|
||||
---@param path string|nil
|
||||
---@return Explorer|nil
|
||||
function Explorer:new(path)
|
||||
---Static factory method
|
||||
---@param path string?
|
||||
---@return Explorer?
|
||||
function Explorer:create(path)
|
||||
local err
|
||||
|
||||
if path then
|
||||
@@ -48,21 +45,22 @@ function Explorer:new(path)
|
||||
end
|
||||
if not path then
|
||||
notify.error(err)
|
||||
return
|
||||
return nil
|
||||
end
|
||||
|
||||
local o = {
|
||||
opts = config,
|
||||
absolute_path = path,
|
||||
nodes = {},
|
||||
open = true,
|
||||
sorters = Sorters:new(config),
|
||||
}
|
||||
---@type Explorer
|
||||
local explorer_placeholder = nil
|
||||
|
||||
setmetatable(o, self)
|
||||
self.__index = self
|
||||
local o = RootNode:create(explorer_placeholder, path, "..", nil)
|
||||
|
||||
o.watcher = watch.create_watcher(o)
|
||||
o = self:new(o) --[[@as Explorer]]
|
||||
|
||||
o.explorer = o
|
||||
|
||||
o.open = true
|
||||
o.opts = config
|
||||
|
||||
o.sorters = Sorters:new(config)
|
||||
o.renderer = Renderer:new(config, o)
|
||||
o.filters = Filters:new(config, o)
|
||||
o.live_filter = LiveFilter:new(config, o)
|
||||
@@ -79,18 +77,6 @@ function Explorer:expand(node)
|
||||
self:_load(node)
|
||||
end
|
||||
|
||||
function Explorer:destroy()
|
||||
local function iterate(node)
|
||||
explorer_node.node_destroy(node)
|
||||
if node.nodes then
|
||||
for _, child in pairs(node.nodes) do
|
||||
iterate(child)
|
||||
end
|
||||
end
|
||||
end
|
||||
iterate(self)
|
||||
end
|
||||
|
||||
---@param node Node
|
||||
---@param git_status table|nil
|
||||
function Explorer:reload(node, git_status)
|
||||
@@ -111,7 +97,7 @@ function Explorer:reload(node, git_status)
|
||||
|
||||
local remain_childs = {}
|
||||
|
||||
local node_ignored = explorer_node.is_git_ignored(node)
|
||||
local node_ignored = node:is_git_ignored()
|
||||
---@type table<string, Node>
|
||||
local nodes_by_path = utils.key_by(node.nodes, "absolute_path")
|
||||
|
||||
@@ -138,32 +124,19 @@ function Explorer:reload(node, git_status)
|
||||
if filter_reason == FILTER_REASON.none then
|
||||
remain_childs[abs] = true
|
||||
|
||||
-- Type must come from fs_stat and not fs_scandir_next to maintain sshfs compatibility
|
||||
local t = stat and stat.type or nil
|
||||
|
||||
-- Recreate node if type changes.
|
||||
if nodes_by_path[abs] then
|
||||
local n = nodes_by_path[abs]
|
||||
|
||||
if n.type ~= t then
|
||||
if not stat or n.type ~= stat.type then
|
||||
utils.array_remove(node.nodes, n)
|
||||
explorer_node.node_destroy(n)
|
||||
n:destroy()
|
||||
nodes_by_path[abs] = nil
|
||||
end
|
||||
end
|
||||
|
||||
if not nodes_by_path[abs] then
|
||||
local new_child = nil
|
||||
if t == "directory" and vim.loop.fs_access(abs, "R") and Watcher.is_fs_event_capable(abs) then
|
||||
new_child = builders.folder(node, abs, name, stat)
|
||||
elseif t == "file" then
|
||||
new_child = builders.file(node, abs, name, stat)
|
||||
elseif t == "link" then
|
||||
local link = builders.link(node, abs, name, stat)
|
||||
if link.link_to ~= nil then
|
||||
new_child = link
|
||||
end
|
||||
end
|
||||
local new_child = node_factory.create_node(self, node, abs, stat, name)
|
||||
if new_child then
|
||||
table.insert(node.nodes, new_child)
|
||||
nodes_by_path[abs] = new_child
|
||||
@@ -171,7 +144,7 @@ function Explorer:reload(node, git_status)
|
||||
else
|
||||
local n = nodes_by_path[abs]
|
||||
if n then
|
||||
n.executable = builders.is_executable(abs) or false
|
||||
n.executable = utils.is_executable(abs) or false
|
||||
n.fs_stat = stat
|
||||
end
|
||||
end
|
||||
@@ -190,14 +163,14 @@ function Explorer:reload(node, git_status)
|
||||
if remain_childs[n.absolute_path] then
|
||||
return remain_childs[n.absolute_path]
|
||||
else
|
||||
explorer_node.node_destroy(n)
|
||||
n:destroy()
|
||||
return false
|
||||
end
|
||||
end, node.nodes)
|
||||
)
|
||||
|
||||
local is_root = not node.parent
|
||||
local child_folder_only = explorer_node.has_one_child_folder(node) and node.nodes[1]
|
||||
local child_folder_only = node:has_one_child_folder() and node.nodes[1]
|
||||
if config.renderer.group_empty and not is_root and child_folder_only then
|
||||
node.group_next = child_folder_only
|
||||
local ns = self:reload(child_folder_only, git_status)
|
||||
@@ -212,26 +185,6 @@ function Explorer:reload(node, git_status)
|
||||
return node.nodes
|
||||
end
|
||||
|
||||
---TODO #2837 #2871 move this and similar to node
|
||||
---Refresh contents and git status for a single node
|
||||
---@param node Node
|
||||
---@param callback function
|
||||
function Explorer:refresh_node(node, callback)
|
||||
if type(node) ~= "table" then
|
||||
callback()
|
||||
end
|
||||
|
||||
local parent_node = utils.get_parent_of_group(node)
|
||||
|
||||
self:reload_and_get_git_project(node.absolute_path, function(toplevel, project)
|
||||
self:reload(parent_node, project)
|
||||
|
||||
self:update_parent_statuses(parent_node, project, toplevel)
|
||||
|
||||
callback()
|
||||
end)
|
||||
end
|
||||
|
||||
---Refresh contents of all nodes to a path: actual directory and links.
|
||||
---Groups will be expanded if needed.
|
||||
---@param path string absolute path
|
||||
@@ -259,7 +212,7 @@ function Explorer:refresh_parent_nodes_for_path(path)
|
||||
local project = git.get_project(toplevel) or {}
|
||||
|
||||
self:reload(node, project)
|
||||
self:update_parent_statuses(node, project, toplevel)
|
||||
node:update_parent_statuses(project, toplevel)
|
||||
end
|
||||
|
||||
log.profile_end(profile)
|
||||
@@ -274,65 +227,19 @@ function Explorer:_load(node)
|
||||
end
|
||||
|
||||
---@private
|
||||
---@param nodes_by_path table
|
||||
---@param nodes_by_path Node[]
|
||||
---@param node_ignored boolean
|
||||
---@param status table|nil
|
||||
---@return fun(node: Node): table
|
||||
function Explorer:update_status(nodes_by_path, node_ignored, status)
|
||||
return function(node)
|
||||
if nodes_by_path[node.absolute_path] then
|
||||
explorer_node.update_git_status(node, node_ignored, status)
|
||||
node:update_git_status(node_ignored, status)
|
||||
end
|
||||
return node
|
||||
end
|
||||
end
|
||||
|
||||
---TODO #2837 #2871 move this and similar to node
|
||||
---@private
|
||||
---@param path string
|
||||
---@param callback fun(toplevel: string|nil, project: table|nil)
|
||||
function Explorer:reload_and_get_git_project(path, callback)
|
||||
local toplevel = git.get_toplevel(path)
|
||||
|
||||
git.reload_project(toplevel, path, function()
|
||||
callback(toplevel, git.get_project(toplevel) or {})
|
||||
end)
|
||||
end
|
||||
|
||||
---TODO #2837 #2871 move this and similar to node
|
||||
---@private
|
||||
---@param node Node
|
||||
---@param project table|nil
|
||||
---@param root string|nil
|
||||
function Explorer:update_parent_statuses(node, project, root)
|
||||
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
|
||||
explorer_node.update_git_status(node, explorer_node.is_git_ignored(node.parent), project)
|
||||
|
||||
-- maybe parent
|
||||
node = node.parent
|
||||
end
|
||||
end
|
||||
|
||||
---@private
|
||||
---@param handle uv.uv_fs_t
|
||||
---@param cwd string
|
||||
@@ -340,7 +247,7 @@ end
|
||||
---@param git_status table
|
||||
---@param parent Explorer
|
||||
function Explorer:populate_children(handle, cwd, node, git_status, parent)
|
||||
local node_ignored = explorer_node.is_git_ignored(node)
|
||||
local node_ignored = node:is_git_ignored()
|
||||
local nodes_by_path = utils.bool_record(node.nodes, "absolute_path")
|
||||
|
||||
local filter_status = parent.filters:prepare(git_status)
|
||||
@@ -368,23 +275,11 @@ function Explorer:populate_children(handle, cwd, node, git_status, parent)
|
||||
local stat = vim.loop.fs_lstat(abs)
|
||||
local filter_reason = parent.filters:should_filter_as_reason(abs, stat, filter_status)
|
||||
if filter_reason == FILTER_REASON.none and not nodes_by_path[abs] then
|
||||
-- Type must come from fs_stat and not fs_scandir_next to maintain sshfs compatibility
|
||||
local t = stat and stat.type or nil
|
||||
local child = nil
|
||||
if t == "directory" and vim.loop.fs_access(abs, "R") then
|
||||
child = builders.folder(node, abs, name, stat)
|
||||
elseif t == "file" then
|
||||
child = builders.file(node, abs, name, stat)
|
||||
elseif t == "link" then
|
||||
local link = builders.link(node, abs, name, stat)
|
||||
if link.link_to ~= nil then
|
||||
child = link
|
||||
end
|
||||
end
|
||||
local child = node_factory.create_node(self, node, abs, stat, name)
|
||||
if child then
|
||||
table.insert(node.nodes, child)
|
||||
nodes_by_path[child.absolute_path] = true
|
||||
explorer_node.update_git_status(child, node_ignored, git_status)
|
||||
child:update_git_status(node_ignored, git_status)
|
||||
end
|
||||
else
|
||||
for reason, value in pairs(FILTER_REASON) do
|
||||
@@ -416,7 +311,7 @@ function Explorer:explore(node, status, parent)
|
||||
self:populate_children(handle, cwd, node, status, parent)
|
||||
|
||||
local is_root = not node.parent
|
||||
local child_folder_only = explorer_node.has_one_child_folder(node) and node.nodes[1]
|
||||
local child_folder_only = node:has_one_child_folder() and node.nodes[1]
|
||||
if config.renderer.group_empty and not is_root and child_folder_only then
|
||||
local child_cwd = child_folder_only.link_to or child_folder_only.absolute_path
|
||||
local child_status = git.load_project_status(child_cwd)
|
||||
@@ -473,14 +368,13 @@ function Explorer:reload_git()
|
||||
event_running = true
|
||||
|
||||
local projects = git.reload()
|
||||
explorer_node.reload_node_status(self, projects)
|
||||
self:reload_node_status(projects)
|
||||
self.renderer:draw()
|
||||
event_running = false
|
||||
end
|
||||
|
||||
function Explorer.setup(opts)
|
||||
function Explorer:setup(opts)
|
||||
config = opts
|
||||
require("nvim-tree.explorer.node").setup(opts)
|
||||
require("nvim-tree.explorer.watch").setup(opts)
|
||||
end
|
||||
|
||||
|
||||
@@ -23,7 +23,7 @@ function LiveFilter:new(opts, explorer)
|
||||
return o
|
||||
end
|
||||
|
||||
---@param node_ Node|nil
|
||||
---@param node_ Node?
|
||||
local function reset_filter(self, node_)
|
||||
node_ = node_ or self.explorer
|
||||
|
||||
@@ -85,7 +85,7 @@ local function matches(self, node)
|
||||
return vim.regex(self.filter):match_str(name) ~= nil
|
||||
end
|
||||
|
||||
---@param node_ Node|nil
|
||||
---@param node_ Node?
|
||||
function LiveFilter:apply_filter(node_)
|
||||
if not self.filter or self.filter == "" then
|
||||
reset_filter(self, node_)
|
||||
|
||||
@@ -1,107 +0,0 @@
|
||||
local utils = require("nvim-tree.utils")
|
||||
local watch = require("nvim-tree.explorer.watch")
|
||||
|
||||
local M = {}
|
||||
|
||||
---@param parent Node
|
||||
---@param absolute_path string
|
||||
---@param name string
|
||||
---@param fs_stat uv.fs_stat.result|nil
|
||||
---@return Node
|
||||
function M.folder(parent, absolute_path, name, fs_stat)
|
||||
local handle = vim.loop.fs_scandir(absolute_path)
|
||||
local has_children = handle and vim.loop.fs_scandir_next(handle) ~= nil
|
||||
|
||||
local node = {
|
||||
type = "directory",
|
||||
absolute_path = absolute_path,
|
||||
fs_stat = fs_stat,
|
||||
group_next = nil, -- If node is grouped, this points to the next child dir/link node
|
||||
has_children = has_children,
|
||||
name = name,
|
||||
nodes = {},
|
||||
open = false,
|
||||
parent = parent,
|
||||
}
|
||||
|
||||
node.watcher = watch.create_watcher(node)
|
||||
|
||||
return node
|
||||
end
|
||||
|
||||
--- path is an executable file or directory
|
||||
---@param absolute_path string
|
||||
---@return boolean|nil
|
||||
function M.is_executable(absolute_path)
|
||||
if utils.is_windows or utils.is_wsl then
|
||||
--- executable detection on windows is buggy and not performant hence it is disabled
|
||||
return false
|
||||
else
|
||||
return vim.loop.fs_access(absolute_path, "X")
|
||||
end
|
||||
end
|
||||
|
||||
---@param parent Node
|
||||
---@param absolute_path string
|
||||
---@param name string
|
||||
---@param fs_stat uv.fs_stat.result|nil
|
||||
---@return Node
|
||||
function M.file(parent, absolute_path, name, fs_stat)
|
||||
local ext = string.match(name, ".?[^.]+%.(.*)") or ""
|
||||
|
||||
return {
|
||||
type = "file",
|
||||
absolute_path = absolute_path,
|
||||
executable = M.is_executable(absolute_path),
|
||||
extension = ext,
|
||||
fs_stat = fs_stat,
|
||||
name = name,
|
||||
parent = parent,
|
||||
}
|
||||
end
|
||||
|
||||
-- TODO-INFO: sometimes fs_realpath returns nil
|
||||
-- I expect this be a bug in glibc, because it fails to retrieve the path for some
|
||||
-- links (for instance libr2.so in /usr/lib) and thus even with a C program realpath fails
|
||||
-- when it has no real reason to. Maybe there is a reason, but errno is definitely wrong.
|
||||
-- So we need to check for link_to ~= nil when adding new links to the main tree
|
||||
---@param parent Node
|
||||
---@param absolute_path string
|
||||
---@param name string
|
||||
---@param fs_stat uv.fs_stat.result|nil
|
||||
---@return Node
|
||||
function M.link(parent, absolute_path, name, fs_stat)
|
||||
--- I dont know if this is needed, because in my understanding, there isn't hard links in windows, but just to be sure i changed it.
|
||||
local link_to = vim.loop.fs_realpath(absolute_path)
|
||||
local open, nodes, has_children
|
||||
|
||||
local is_dir_link = (link_to ~= nil) and vim.loop.fs_stat(link_to).type == "directory"
|
||||
|
||||
if is_dir_link and link_to then
|
||||
local handle = vim.loop.fs_scandir(link_to)
|
||||
has_children = handle and vim.loop.fs_scandir_next(handle) ~= nil
|
||||
open = false
|
||||
nodes = {}
|
||||
end
|
||||
|
||||
local node = {
|
||||
type = "link",
|
||||
absolute_path = absolute_path,
|
||||
fs_stat = fs_stat,
|
||||
group_next = nil, -- If node is grouped, this points to the next child dir/link node
|
||||
has_children = has_children,
|
||||
link_to = link_to,
|
||||
name = name,
|
||||
nodes = nodes,
|
||||
open = open,
|
||||
parent = parent,
|
||||
}
|
||||
|
||||
if is_dir_link then
|
||||
node.watcher = watch.create_watcher(node)
|
||||
end
|
||||
|
||||
return node
|
||||
end
|
||||
|
||||
return M
|
||||
@@ -1,183 +0,0 @@
|
||||
local git = {} -- circular dependencies
|
||||
|
||||
local M = {}
|
||||
|
||||
---@class GitStatus
|
||||
---@field file string|nil
|
||||
---@field dir table|nil
|
||||
|
||||
---@param parent_ignored boolean
|
||||
---@param status table|nil
|
||||
---@param absolute_path string
|
||||
---@return GitStatus|nil
|
||||
local function get_dir_git_status(parent_ignored, status, absolute_path)
|
||||
if parent_ignored then
|
||||
return { file = "!!" }
|
||||
end
|
||||
|
||||
if status then
|
||||
return {
|
||||
file = status.files and status.files[absolute_path],
|
||||
dir = status.dirs and {
|
||||
direct = status.dirs.direct[absolute_path],
|
||||
indirect = status.dirs.indirect[absolute_path],
|
||||
},
|
||||
}
|
||||
end
|
||||
end
|
||||
|
||||
---@param parent_ignored boolean
|
||||
---@param status table
|
||||
---@param absolute_path string
|
||||
---@return GitStatus
|
||||
local function get_git_status(parent_ignored, status, absolute_path)
|
||||
local file_status = parent_ignored and "!!" or (status and status.files and status.files[absolute_path])
|
||||
return { file = file_status }
|
||||
end
|
||||
|
||||
---@param node Node
|
||||
---@return boolean
|
||||
function M.has_one_child_folder(node)
|
||||
return #node.nodes == 1 and node.nodes[1].nodes and vim.loop.fs_access(node.nodes[1].absolute_path, "R") or false
|
||||
end
|
||||
|
||||
---@param node Node
|
||||
---@param parent_ignored boolean
|
||||
---@param status table|nil
|
||||
function M.update_git_status(node, parent_ignored, status)
|
||||
local get_status
|
||||
if node.nodes then
|
||||
get_status = get_dir_git_status
|
||||
else
|
||||
get_status = get_git_status
|
||||
end
|
||||
|
||||
-- status of the node's absolute path
|
||||
node.git_status = get_status(parent_ignored, status, node.absolute_path)
|
||||
|
||||
-- status of the link target, if the link itself is not dirty
|
||||
if node.link_to and not node.git_status then
|
||||
node.git_status = get_status(parent_ignored, status, node.link_to)
|
||||
end
|
||||
end
|
||||
|
||||
---@param node Node
|
||||
---@return GitStatus|nil
|
||||
function M.get_git_status(node)
|
||||
local git_status = node and node.git_status
|
||||
if not git_status then
|
||||
-- status doesn't exist
|
||||
return nil
|
||||
end
|
||||
|
||||
if not node.nodes then
|
||||
-- file
|
||||
return git_status.file and { git_status.file }
|
||||
end
|
||||
|
||||
-- dir
|
||||
if not M.config.git.show_on_dirs then
|
||||
return nil
|
||||
end
|
||||
|
||||
local status = {}
|
||||
if not require("nvim-tree.lib").get_last_group_node(node).open or M.config.git.show_on_open_dirs then
|
||||
-- dir is closed or we should show on open_dirs
|
||||
if git_status.file ~= nil then
|
||||
table.insert(status, git_status.file)
|
||||
end
|
||||
if git_status.dir ~= nil then
|
||||
if git_status.dir.direct ~= nil then
|
||||
for _, s in pairs(node.git_status.dir.direct) do
|
||||
table.insert(status, s)
|
||||
end
|
||||
end
|
||||
if git_status.dir.indirect ~= nil then
|
||||
for _, s in pairs(node.git_status.dir.indirect) do
|
||||
table.insert(status, s)
|
||||
end
|
||||
end
|
||||
end
|
||||
else
|
||||
-- dir is open and we shouldn't show on open_dirs
|
||||
if git_status.file ~= nil then
|
||||
table.insert(status, git_status.file)
|
||||
end
|
||||
if git_status.dir ~= nil and git_status.dir.direct ~= nil then
|
||||
local deleted = {
|
||||
[" D"] = true,
|
||||
["D "] = true,
|
||||
["RD"] = true,
|
||||
["DD"] = true,
|
||||
}
|
||||
for _, s in pairs(node.git_status.dir.direct) do
|
||||
if deleted[s] then
|
||||
table.insert(status, s)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
if #status == 0 then
|
||||
return nil
|
||||
else
|
||||
return status
|
||||
end
|
||||
end
|
||||
|
||||
---@param parent_node Node|nil
|
||||
---@param projects table
|
||||
function M.reload_node_status(parent_node, projects)
|
||||
if parent_node == nil then
|
||||
return
|
||||
end
|
||||
|
||||
local toplevel = git.get_toplevel(parent_node.absolute_path)
|
||||
local status = projects[toplevel] or {}
|
||||
for _, node in ipairs(parent_node.nodes) do
|
||||
M.update_git_status(node, M.is_git_ignored(parent_node), status)
|
||||
if node.nodes and #node.nodes > 0 then
|
||||
M.reload_node_status(node, projects)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
---@param node Node
|
||||
---@return boolean
|
||||
function M.is_git_ignored(node)
|
||||
return node and node.git_status ~= nil and node.git_status.file == "!!"
|
||||
end
|
||||
|
||||
---@param node Node
|
||||
---@return boolean
|
||||
function M.is_dotfile(node)
|
||||
if node == nil then
|
||||
return false
|
||||
end
|
||||
if node.is_dot or (node.name and (node.name:sub(1, 1) == ".")) or M.is_dotfile(node.parent) then
|
||||
node.is_dot = true
|
||||
return true
|
||||
end
|
||||
return false
|
||||
end
|
||||
|
||||
---@param node Node
|
||||
function M.node_destroy(node)
|
||||
if not node then
|
||||
return
|
||||
end
|
||||
|
||||
if node.watcher then
|
||||
node.watcher:destroy()
|
||||
node.watcher = nil
|
||||
end
|
||||
end
|
||||
|
||||
function M.setup(opts)
|
||||
M.config = {
|
||||
git = opts.git,
|
||||
}
|
||||
|
||||
git = require("nvim-tree.git")
|
||||
end
|
||||
|
||||
return M
|
||||
@@ -111,7 +111,7 @@ local function split_merge(t, first, last, comparator)
|
||||
end
|
||||
|
||||
---Perform a merge sort using sorter option.
|
||||
---@param t table nodes
|
||||
---@param t Node[]
|
||||
function Sorter:sort(t)
|
||||
if self.user then
|
||||
local t_user = {}
|
||||
|
||||
@@ -76,12 +76,7 @@ function M.create_watcher(node)
|
||||
else
|
||||
log.line("watcher", "node event executing refresh '%s'", node.absolute_path)
|
||||
end
|
||||
local explorer = require("nvim-tree.core").get_explorer()
|
||||
if explorer then
|
||||
explorer:refresh_node(node, function()
|
||||
explorer.renderer:draw()
|
||||
end)
|
||||
end
|
||||
node:refresh()
|
||||
end)
|
||||
end
|
||||
|
||||
|
||||
Reference in New Issue
Block a user