fix(#1961): cycle detection on refresh, preventing infinite loop (#1996)

* #1961 diagnostic logging refresh_nodes_for_path

* #1961 add cycle detection to refresh_nodes_for_path

* #1961 escape special characters on when path matching during refresh

* #1961 escape special characters on when path matching during refresh
This commit is contained in:
Alexander Courtis 2023-02-14 15:08:41 +11:00 committed by GitHub
parent 8b8d457e07
commit 4222bb875d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -166,6 +166,9 @@ function M.refresh_nodes_for_path(path)
local profile = log.profile_start("refresh_nodes_for_path %s", path)
-- avoids cycles
local paths_refreshed = {}
NodeIterator.builder({ explorer })
:hidden()
:recursor(function(node)
@ -177,10 +180,13 @@ function M.refresh_nodes_for_path(path)
end
end)
:applier(function(node)
local abs_contains = node.absolute_path and path:match("^" .. node.absolute_path)
local link_contains = node.link_to and path:match("^" .. node.link_to)
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
M.refresh_node(node)
if not paths_refreshed[node.absolute_path] then
paths_refreshed[node.absolute_path] = true
M.refresh_node(node)
end
end
end)
:iterate()