feat(git): support DA state, fix(#1822): test directory capable of watching before presenting it (#1905)
* fix(#1822): test directory capable of watching before presenting it (#1901) * feat(git): support `DA` state Co-authored-by: Alexander Courtis <alex@courtis.org>
This commit is contained in:
@@ -6,6 +6,8 @@ local filters = require "nvim-tree.explorer.filters"
|
||||
local live_filter = require "nvim-tree.live-filter"
|
||||
local log = require "nvim-tree.log"
|
||||
|
||||
local Watcher = require "nvim-tree.watcher"
|
||||
|
||||
local M = {}
|
||||
|
||||
local function get_type_from(type_, cwd)
|
||||
@@ -28,7 +30,11 @@ local function populate_children(handle, cwd, node, git_status)
|
||||
local ps = log.profile_start(pn)
|
||||
|
||||
t = get_type_from(t, abs)
|
||||
if not filters.should_filter(abs, filter_status) and not nodes_by_path[abs] then
|
||||
if
|
||||
not filters.should_filter(abs, filter_status)
|
||||
and not nodes_by_path[abs]
|
||||
and Watcher.is_fs_event_capable(abs)
|
||||
then
|
||||
local child = nil
|
||||
if t == "directory" and vim.loop.fs_access(abs, "R") then
|
||||
child = builders.folder(node, abs, name)
|
||||
|
||||
@@ -8,6 +8,7 @@ local git = require "nvim-tree.git"
|
||||
local log = require "nvim-tree.log"
|
||||
|
||||
local NodeIterator = require "nvim-tree.iterators.node-iterator"
|
||||
local Watcher = require "nvim-tree.watcher"
|
||||
|
||||
local M = {}
|
||||
|
||||
@@ -86,7 +87,7 @@ function M.reload(node, git_status, unloaded_bufnr)
|
||||
end
|
||||
|
||||
if not nodes_by_path[abs] then
|
||||
if t == "directory" and vim.loop.fs_access(abs, "R") then
|
||||
if t == "directory" and vim.loop.fs_access(abs, "R") and Watcher.is_fs_event_capable(abs) then
|
||||
local folder = builders.folder(node, abs, name)
|
||||
nodes_by_path[abs] = folder
|
||||
table.insert(node.nodes, folder)
|
||||
|
||||
@@ -39,6 +39,7 @@ local function build_icons_table(i)
|
||||
["UA"] = { icons.unmerged },
|
||||
[" D"] = { icons.deleted },
|
||||
["D "] = { icons.deleted },
|
||||
["DA"] = { icons.unstaged },
|
||||
["RD"] = { icons.deleted },
|
||||
["DD"] = { icons.deleted },
|
||||
["DU"] = { icons.deleted, icons.unmerged },
|
||||
|
||||
@@ -159,4 +159,29 @@ function M.purge_watchers()
|
||||
end
|
||||
end
|
||||
|
||||
--- Windows NT will present directories that cannot be enumerated.
|
||||
--- Detect these by attempting to start an event monitor.
|
||||
--- @param path string
|
||||
--- @return boolean
|
||||
function M.is_fs_event_capable(path)
|
||||
if not utils.is_windows then
|
||||
return true
|
||||
end
|
||||
|
||||
local fs_event = vim.loop.new_fs_event()
|
||||
if not fs_event then
|
||||
return false
|
||||
end
|
||||
|
||||
if fs_event:start(path, FS_EVENT_FLAGS, function() end) ~= 0 then
|
||||
return false
|
||||
end
|
||||
|
||||
if fs_event:stop() ~= 0 then
|
||||
return false
|
||||
end
|
||||
|
||||
return true
|
||||
end
|
||||
|
||||
return M
|
||||
|
||||
Reference in New Issue
Block a user