Purge history on buffer reload when NoUndo flag is on
We were preserving the history in that case, so on fifo buffers (that set the NoUndo flag until the fifo is closed), we still had the history from the "previous life" of the buffer, leading crashes when trying to apply it. Fixes #1518
This commit is contained in:
parent
45a7496f54
commit
fc64369f9d
|
@ -242,10 +242,13 @@ void Buffer::reload(StringView data, timespec fs_timestamp)
|
||||||
|
|
||||||
if (not record_undo)
|
if (not record_undo)
|
||||||
{
|
{
|
||||||
|
// Erase history about to be invalidated history
|
||||||
|
m_history_cursor = &m_history;
|
||||||
|
m_last_save_history_cursor = &m_history;
|
||||||
|
m_history = HistoryNode{m_next_history_id++, nullptr};
|
||||||
|
|
||||||
m_changes.push_back({ Change::Erase, {0,0}, line_count() });
|
m_changes.push_back({ Change::Erase, {0,0}, line_count() });
|
||||||
|
|
||||||
static_cast<BufferLines&>(m_lines) = std::move(parsed_lines.lines);
|
static_cast<BufferLines&>(m_lines) = std::move(parsed_lines.lines);
|
||||||
|
|
||||||
m_changes.push_back({ Change::Insert, {0,0}, line_count() });
|
m_changes.push_back({ Change::Insert, {0,0}, line_count() });
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -340,7 +343,7 @@ bool Buffer::redo(size_t count) noexcept
|
||||||
|
|
||||||
while (count-- != 0 and m_history_cursor->redo_child)
|
while (count-- != 0 and m_history_cursor->redo_child)
|
||||||
{
|
{
|
||||||
m_history_cursor = m_history_cursor->redo_child.get();
|
m_history_cursor = m_history_cursor->redo_child;
|
||||||
|
|
||||||
for (const Modification& modification : m_history_cursor->undo_group)
|
for (const Modification& modification : m_history_cursor->undo_group)
|
||||||
apply_modification(modification);
|
apply_modification(modification);
|
||||||
|
|
|
@ -259,7 +259,7 @@ private:
|
||||||
UndoGroup undo_group;
|
UndoGroup undo_group;
|
||||||
Vector<std::unique_ptr<HistoryNode>, MemoryDomain::BufferMeta> childs;
|
Vector<std::unique_ptr<HistoryNode>, MemoryDomain::BufferMeta> childs;
|
||||||
SafePtr<HistoryNode> parent;
|
SafePtr<HistoryNode> parent;
|
||||||
SafePtr<HistoryNode> redo_child;
|
HistoryNode* redo_child = nullptr; // not a SafePtr to avoid lifetime issues between this and childs
|
||||||
size_t id;
|
size_t id;
|
||||||
TimePoint timepoint;
|
TimePoint timepoint;
|
||||||
};
|
};
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
<a-O>ifoo<c-u><esc>:edit -fifo /dev/null <c-r>%<ret>u
|
Loading…
Reference in New Issue
Block a user