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 live_filter = require "nvim-tree.live-filter"
|
||||||
local log = require "nvim-tree.log"
|
local log = require "nvim-tree.log"
|
||||||
|
|
||||||
|
local Watcher = require "nvim-tree.watcher"
|
||||||
|
|
||||||
local M = {}
|
local M = {}
|
||||||
|
|
||||||
local function get_type_from(type_, cwd)
|
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)
|
local ps = log.profile_start(pn)
|
||||||
|
|
||||||
t = get_type_from(t, abs)
|
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
|
local child = nil
|
||||||
if t == "directory" and vim.loop.fs_access(abs, "R") then
|
if t == "directory" and vim.loop.fs_access(abs, "R") then
|
||||||
child = builders.folder(node, abs, name)
|
child = builders.folder(node, abs, name)
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ local git = require "nvim-tree.git"
|
|||||||
local log = require "nvim-tree.log"
|
local log = require "nvim-tree.log"
|
||||||
|
|
||||||
local NodeIterator = require "nvim-tree.iterators.node-iterator"
|
local NodeIterator = require "nvim-tree.iterators.node-iterator"
|
||||||
|
local Watcher = require "nvim-tree.watcher"
|
||||||
|
|
||||||
local M = {}
|
local M = {}
|
||||||
|
|
||||||
@@ -86,7 +87,7 @@ function M.reload(node, git_status, unloaded_bufnr)
|
|||||||
end
|
end
|
||||||
|
|
||||||
if not nodes_by_path[abs] then
|
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)
|
local folder = builders.folder(node, abs, name)
|
||||||
nodes_by_path[abs] = folder
|
nodes_by_path[abs] = folder
|
||||||
table.insert(node.nodes, folder)
|
table.insert(node.nodes, folder)
|
||||||
|
|||||||
@@ -39,6 +39,7 @@ local function build_icons_table(i)
|
|||||||
["UA"] = { icons.unmerged },
|
["UA"] = { icons.unmerged },
|
||||||
[" D"] = { icons.deleted },
|
[" D"] = { icons.deleted },
|
||||||
["D "] = { icons.deleted },
|
["D "] = { icons.deleted },
|
||||||
|
["DA"] = { icons.unstaged },
|
||||||
["RD"] = { icons.deleted },
|
["RD"] = { icons.deleted },
|
||||||
["DD"] = { icons.deleted },
|
["DD"] = { icons.deleted },
|
||||||
["DU"] = { icons.deleted, icons.unmerged },
|
["DU"] = { icons.deleted, icons.unmerged },
|
||||||
|
|||||||
@@ -159,4 +159,29 @@ function M.purge_watchers()
|
|||||||
end
|
end
|
||||||
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
|
return M
|
||||||
|
|||||||
Reference in New Issue
Block a user