Fix fatal exception when checking if buffer needs to be reloaded

If, for example, the buffer path now is a directory, MappedFile will
throw on construction. Using a try block to explicitely allow errors
fixes the issue.
This commit is contained in:
Maxime Coste 2023-02-21 16:59:16 +11:00
parent be49f36205
commit fa060c2a17

View File

@ -367,31 +367,38 @@ void Client::check_if_buffer_needs_reloading()
if (not (buffer.flags() & Buffer::Flags::File) or reload == Autoreload::No) if (not (buffer.flags() & Buffer::Flags::File) or reload == Autoreload::No)
return; return;
const String& filename = buffer.name(); try
const timespec ts = get_fs_timestamp(filename);
const auto status = buffer.fs_status();
if (ts == InvalidTime or ts == status.timestamp)
return;
if (MappedFile fd{filename};
fd.st.st_size == status.file_size and hash_data(fd.data, fd.st.st_size) == status.hash)
return;
if (reload == Autoreload::Ask)
{ {
StringView bufname = buffer.display_name(); const String& filename = buffer.name();
info_show(format("reload '{}' ?", bufname), const timespec ts = get_fs_timestamp(filename);
format("'{}' was modified externally\n" const auto status = buffer.fs_status();
" y, <ret>: reload | n, <esc>: keep\n"
" Y: always reload | N: always keep\n",
bufname), {}, InfoStyle::Modal);
m_buffer_reload_dialog_opened = true; if (ts == InvalidTime or ts == status.timestamp)
m_input_handler.on_next_key("buffer-reload", KeymapMode::None, [this](Key key, Context&){ on_buffer_reload_key(key); }); return;
if (MappedFile fd{filename};
fd.st.st_size == status.file_size and hash_data(fd.data, fd.st.st_size) == status.hash)
return;
if (reload == Autoreload::Ask)
{
StringView bufname = buffer.display_name();
info_show(format("reload '{}' ?", bufname),
format("'{}' was modified externally\n"
" y, <ret>: reload | n, <esc>: keep\n"
" Y: always reload | N: always keep\n",
bufname), {}, InfoStyle::Modal);
m_buffer_reload_dialog_opened = true;
m_input_handler.on_next_key("buffer-reload", KeymapMode::None, [this](Key key, Context&){ on_buffer_reload_key(key); });
}
else
reload_buffer();
}
catch (Kakoune::runtime_error& error)
{
write_to_debug_buffer(format("Error while checking if buffer {} changed: {}", buffer.name(), error.what()));
} }
else
reload_buffer();
} }
StringView Client::get_env_var(StringView name) const StringView Client::get_env_var(StringView name) const