Skip to content

Commit

Permalink
fix sshfs compatibility with symlinks
Browse files Browse the repository at this point in the history
  • Loading branch information
mxple committed Sep 22, 2024
1 parent fe2d3ad commit ff1296b
Showing 1 changed file with 29 additions and 27 deletions.
56 changes: 29 additions & 27 deletions lua/nvim-tree/explorer/init.lua
Original file line number Diff line number Diff line change
Expand Up @@ -132,7 +132,7 @@ function Explorer:reload(node, git_status)

local abs = utils.path_join { cwd, name }
---@type uv.fs_stat.result|nil
local stat = vim.loop.fs_stat(abs)
local stat = vim.loop.fs_lstat(abs)

local filter_reason = self.filters:should_filter_as_reason(abs, stat, filter_status)
if filter_reason == FILTER_REASON.none then
Expand Down Expand Up @@ -241,17 +241,17 @@ function Explorer:refresh_parent_nodes_for_path(path)
-- collect parent nodes from the top down
local parent_nodes = {}
NodeIterator.builder({ self })
:recursor(function(node)
return node.nodes
end)
:applier(function(node)
local abs_contains = node.absolute_path and path:find(node.absolute_path, 1, true) == 1
local link_contains = node.link_to and path:find(node.link_to, 1, true) == 1
if abs_contains or link_contains then
table.insert(parent_nodes, node)
end
end)
:iterate()
:recursor(function(node)
return node.nodes
end)
:applier(function(node)
local abs_contains = node.absolute_path and path:find(node.absolute_path, 1, true) == 1
local link_contains = node.link_to and path:find(node.link_to, 1, true) == 1
if abs_contains or link_contains then
table.insert(parent_nodes, node)
end
end)
:iterate()

-- refresh in order; this will expand groups as needed
for _, node in ipairs(parent_nodes) do
Expand Down Expand Up @@ -354,7 +354,7 @@ function Explorer:populate_children(handle, cwd, node, git_status, parent)
})

while true do
local name, t = vim.loop.fs_scandir_next(handle)
local name, _ = vim.loop.fs_scandir_next(handle)
if not name then
break
end
Expand All @@ -365,15 +365,17 @@ function Explorer:populate_children(handle, cwd, node, git_status, parent)
local profile = log.profile_start("populate_children %s", abs)

---@type uv.fs_stat.result|nil
local stat = vim.loop.fs_stat(abs)
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 type = stat and stat.type or nil
local child = nil
if t == "directory" and vim.loop.fs_access(abs, "R") then
if type == "directory" and vim.loop.fs_access(abs, "R") then
child = builders.folder(node, abs, name, stat)
elseif t == "file" then
elseif type == "file" then
child = builders.file(node, abs, name, stat)
elseif t == "link" then
elseif type == "link" then
local link = builders.link(node, abs, name, stat)
if link.link_to ~= nil then
child = link
Expand Down Expand Up @@ -437,16 +439,16 @@ end
---@param projects table
function Explorer:refresh_nodes(projects)
Iterator.builder({ self })
:applier(function(n)
if n.nodes then
local toplevel = git.get_toplevel(n.cwd or n.link_to or n.absolute_path)
self:reload(n, projects[toplevel] or {})
end
end)
:recursor(function(n)
return n.group_next and { n.group_next } or (n.open and n.nodes)
end)
:iterate()
:applier(function(n)
if n.nodes then
local toplevel = git.get_toplevel(n.cwd or n.link_to or n.absolute_path)
self:reload(n, projects[toplevel] or {})
end
end)
:recursor(function(n)
return n.group_next and { n.group_next } or (n.open and n.nodes)
end)
:iterate()
end

local event_running = false
Expand Down

0 comments on commit ff1296b

Please sign in to comment.