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:
parent
be49f36205
commit
fa060c2a17
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue
Block a user