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:
gegoune
2023-01-10 03:32:53 +01:00
committed by GitHub
parent ccb6d8a518
commit 3ce0a8e770
4 changed files with 35 additions and 2 deletions

View File

@@ -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)

View File

@@ -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)

View File

@@ -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 },

View File

@@ -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