mirror of
https://github.com/neovim/neovim.git
synced 2024-12-20 19:25:11 -07:00
7ca2d64e8b
Quick fix as follow up to https://github.com/neovim/neovim/pull/26108 kqueue only reports events on a watched folder itself, not for files created or deleted within. So the approach the PR took doesn't work on FreeBSD. We'll either need to bring back polling for it, combine watching with manual file tracking, or disable LSP file watching on FreeBSD
179 lines
5.1 KiB
Lua
179 lines
5.1 KiB
Lua
local helpers = require('test.functional.helpers')(after_each)
|
|
local eq = helpers.eq
|
|
local exec_lua = helpers.exec_lua
|
|
local clear = helpers.clear
|
|
local is_os = helpers.is_os
|
|
local skip = helpers.skip
|
|
|
|
describe('vim._watch', function()
|
|
before_each(function()
|
|
clear()
|
|
end)
|
|
|
|
describe('watch', function()
|
|
it('detects file changes', function()
|
|
skip(is_os('bsd'), "Stopped working on bsd after 3ca967387c49c754561c3b11a574797504d40f38")
|
|
local root_dir = vim.uv.fs_mkdtemp(vim.fs.dirname(helpers.tmpname()) .. '/nvim_XXXXXXXXXX')
|
|
|
|
local result = exec_lua(
|
|
[[
|
|
local root_dir = ...
|
|
|
|
local events = {}
|
|
|
|
local expected_events = 0
|
|
local function wait_for_events()
|
|
assert(vim.wait(100, function() return #events == expected_events end), 'Timed out waiting for expected number of events. Current events seen so far: ' .. vim.inspect(events))
|
|
end
|
|
|
|
local stop = vim._watch.watch(root_dir, {}, function(path, change_type)
|
|
table.insert(events, { path = path, change_type = change_type })
|
|
end)
|
|
|
|
-- Only BSD seems to need some extra time for the watch to be ready to respond to events
|
|
if vim.fn.has('bsd') then
|
|
vim.wait(50)
|
|
end
|
|
|
|
local watched_path = root_dir .. '/file'
|
|
local watched, err = io.open(watched_path, 'w')
|
|
assert(not err, err)
|
|
|
|
expected_events = expected_events + 1
|
|
wait_for_events()
|
|
|
|
watched:close()
|
|
os.remove(watched_path)
|
|
|
|
expected_events = expected_events + 1
|
|
wait_for_events()
|
|
|
|
stop()
|
|
-- No events should come through anymore
|
|
|
|
local watched_path = root_dir .. '/file'
|
|
local watched, err = io.open(watched_path, 'w')
|
|
assert(not err, err)
|
|
|
|
vim.wait(50)
|
|
|
|
watched:close()
|
|
os.remove(watched_path)
|
|
|
|
vim.wait(50)
|
|
|
|
return events
|
|
]],
|
|
root_dir
|
|
)
|
|
|
|
local expected = {
|
|
{
|
|
change_type = exec_lua([[return vim._watch.FileChangeType.Created]]),
|
|
path = root_dir .. '/file',
|
|
},
|
|
{
|
|
change_type = exec_lua([[return vim._watch.FileChangeType.Deleted]]),
|
|
path = root_dir .. '/file',
|
|
},
|
|
}
|
|
|
|
-- kqueue only reports events on the watched path itself, so creating a file within a
|
|
-- watched directory results in a "rename" libuv event on the directory.
|
|
if is_os('bsd') then
|
|
expected = {
|
|
{
|
|
change_type = exec_lua([[return vim._watch.FileChangeType.Created]]),
|
|
path = root_dir,
|
|
},
|
|
{
|
|
change_type = exec_lua([[return vim._watch.FileChangeType.Created]]),
|
|
path = root_dir,
|
|
},
|
|
}
|
|
end
|
|
|
|
eq(expected, result)
|
|
end)
|
|
end)
|
|
|
|
describe('poll', function()
|
|
it('detects file changes', function()
|
|
skip(is_os('bsd'), "bsd only reports rename on folders if file inside change")
|
|
local root_dir = vim.uv.fs_mkdtemp(vim.fs.dirname(helpers.tmpname()) .. '/nvim_XXXXXXXXXX')
|
|
|
|
local result = exec_lua(
|
|
[[
|
|
local root_dir = ...
|
|
local lpeg = vim.lpeg
|
|
|
|
local events = {}
|
|
|
|
local debounce = 100
|
|
local wait_ms = debounce + 200
|
|
|
|
local expected_events = 0
|
|
local function wait_for_events()
|
|
assert(vim.wait(wait_ms, function() return #events == expected_events end), 'Timed out waiting for expected number of events. Current events seen so far: ' .. vim.inspect(events))
|
|
end
|
|
|
|
local incl = lpeg.P(root_dir) * lpeg.P("/file")^-1
|
|
local excl = lpeg.P(root_dir..'/file.unwatched')
|
|
local stop = vim._watch.poll(root_dir, {
|
|
debounce = debounce,
|
|
include_pattern = incl,
|
|
exclude_pattern = excl,
|
|
}, function(path, change_type)
|
|
table.insert(events, { path = path, change_type = change_type })
|
|
end)
|
|
|
|
local watched_path = root_dir .. '/file'
|
|
local watched, err = io.open(watched_path, 'w')
|
|
assert(not err, err)
|
|
local unwatched_path = root_dir .. '/file.unwatched'
|
|
local unwatched, err = io.open(unwatched_path, 'w')
|
|
assert(not err, err)
|
|
|
|
expected_events = expected_events + 1
|
|
wait_for_events()
|
|
|
|
watched:close()
|
|
os.remove(watched_path)
|
|
unwatched:close()
|
|
os.remove(unwatched_path)
|
|
|
|
expected_events = expected_events + 1
|
|
wait_for_events()
|
|
|
|
stop()
|
|
-- No events should come through anymore
|
|
|
|
local watched_path = root_dir .. '/file'
|
|
local watched, err = io.open(watched_path, 'w')
|
|
assert(not err, err)
|
|
|
|
watched:close()
|
|
os.remove(watched_path)
|
|
|
|
return events
|
|
]],
|
|
root_dir
|
|
)
|
|
|
|
local created = exec_lua([[return vim._watch.FileChangeType.Created]])
|
|
local deleted = exec_lua([[return vim._watch.FileChangeType.Deleted]])
|
|
local expected = {
|
|
{
|
|
change_type = created,
|
|
path = root_dir .. "/file",
|
|
},
|
|
{
|
|
change_type = deleted,
|
|
path = root_dir .. "/file",
|
|
}
|
|
}
|
|
eq(expected, result)
|
|
end)
|
|
end)
|
|
end)
|