diff --git a/src/files_sub_source.cc b/src/files_sub_source.cc index c9b670eef5b..363daf94ad4 100644 --- a/src/files_sub_source.cc +++ b/src/files_sub_source.cc @@ -97,6 +97,7 @@ files_sub_source::list_input_handle_key(listview_curses& lv, int ch) auto& lss = lnav_data.ld_log_source; auto lf = *fs.sb_iter; + lf->set_indexing(true); lss.find_data(lf) | [](auto ld) { ld->set_visibility(true); lnav_data.ld_log_source.text_filters_changed(); @@ -136,6 +137,7 @@ files_sub_source::list_input_handle_key(listview_curses& lv, int ch) auto lf = *fs.sb_iter; lss.find_data(lf) | [](auto ld) { + ld->get_file_ptr()->set_indexing(!ld->ld_visible); ld->set_visibility(!ld->ld_visible); }; diff --git a/src/lnav.indexing.cc b/src/lnav.indexing.cc index 75547413054..034e1941ffe 100644 --- a/src/lnav.indexing.cc +++ b/src/lnav.indexing.cc @@ -330,11 +330,12 @@ rebuild_indexes(nonstd::optional deadline) for_each(pair.second.begin(), pair.second.end(), [&dupe_name](auto& lf) { - log_info("Hiding duplicate file: %s", - lf->get_filename().c_str()); - lf->mark_as_duplicate(dupe_name); - lnav_data.ld_log_source.find_data(lf) | - [](auto ld) { ld->set_visibility(false); }; + if (lf->mark_as_duplicate(dupe_name)) { + log_info("Hiding duplicate file: %s", + lf->get_filename().c_str()); + lnav_data.ld_log_source.find_data(lf) | + [](auto ld) { ld->set_visibility(false); }; + } }); reload = true; } @@ -373,9 +374,9 @@ rebuild_indexes(nonstd::optional deadline) } } + auto* tss = tc->get_sub_source(); + lnav_data.ld_filter_status_source.update_filtered(tss); if (retval.rir_changes > 0) { - auto* tss = tc->get_sub_source(); - lnav_data.ld_filter_status_source.update_filtered(tss); lnav_data.ld_scroll_broadcaster(tc); } }; diff --git a/src/lnav_commands.cc b/src/lnav_commands.cc index 7f14b6032af..5a9e09ef619 100644 --- a/src/lnav_commands.cc +++ b/src/lnav_commands.cc @@ -3321,8 +3321,10 @@ com_file_visibility(exec_context& ec, if (only_this_file) { for (const auto& ld : lnav_data.ld_log_source) { ld->set_visibility(false); + ld->get_file_ptr()->set_indexing(false); } } + lf->set_indexing(make_visible); lnav_data.ld_log_source.find_data(lf) | [make_visible](auto ld) { ld->set_visibility(make_visible); }; tc->get_sub_source()->text_filters_changed(); @@ -3375,6 +3377,7 @@ com_file_visibility(exec_context& ec, if (!ec.ec_dry_run) { ld_opt | [make_visible](auto ld) { + ld->get_file_ptr()->set_indexing(make_visible); ld->set_visibility(make_visible); }; } diff --git a/src/logfile.cc b/src/logfile.cc index 9423ca309ac..3d3392e8e0a 100644 --- a/src/logfile.cc +++ b/src/logfile.cc @@ -1193,14 +1193,21 @@ logfile::find_from_time(const timeval& tv) const return retval; } -void +bool logfile::mark_as_duplicate(const std::string& name) { + safe::WriteAccess notes(this->lf_notes); + + auto iter = notes->find(note_type::duplicate); + if (iter != notes->end()) { + return false; + } + this->lf_indexing = false; this->lf_options.loo_is_visible = false; - this->lf_notes.writeAccess()->emplace( - note_type::duplicate, - fmt::format(FMT_STRING("hiding duplicate of {}"), name)); + notes->emplace(note_type::duplicate, + fmt::format(FMT_STRING("hiding duplicate of {}"), name)); + return true; } void diff --git a/src/logfile.hh b/src/logfile.hh index e21cb6252a4..98a5edc59a3 100644 --- a/src/logfile.hh +++ b/src/logfile.hh @@ -195,7 +195,7 @@ public: this->adjust_content_time(-1, tv); } - void mark_as_duplicate(const std::string& name); + bool mark_as_duplicate(const std::string& name); const logfile_open_options& get_open_options() const { @@ -356,6 +356,8 @@ public: bool is_indexing() const { return this->lf_indexing; } + void set_indexing(bool val) { this->lf_indexing = val; } + /** Check the invariants for this object. */ bool invariant() { diff --git a/src/session_data.cc b/src/session_data.cc index 69fe2b32a12..27d16d576a4 100644 --- a/src/session_data.cc +++ b/src/session_data.cc @@ -926,16 +926,15 @@ load_session() log_debug("found state for file: %s %d", lf->get_content_id().c_str(), iter->second.fs_is_visible); - lnav_data.ld_log_source.find_data(lf) | [iter](auto ld) { - ld->set_visibility(iter->second.fs_is_visible); - }; - if (!iter->second.fs_is_visible) { - if (lf->get_format() != nullptr) { - log_changes = true; - } else { - text_changes = true; - } - } + lnav_data.ld_log_source.find_data(lf) | + [iter, &log_changes](auto ld) { + if (ld->ld_visible != iter->second.fs_is_visible) { + ld->get_file_ptr()->set_indexing( + iter->second.fs_is_visible); + ld->set_visibility(iter->second.fs_is_visible); + log_changes = true; + } + }; } if (log_changes) { diff --git a/src/views_vtab.cc b/src/views_vtab.cc index ba19fec3130..2522b67233a 100644 --- a/src/views_vtab.cc +++ b/src/views_vtab.cc @@ -1265,6 +1265,7 @@ CREATE TABLE lnav_view_files ( auto& ld = *iter; if (ld->ld_visible != visible) { + ld->get_file_ptr()->set_indexing(visible); ld->set_visibility(visible); lss.text_filters_changed(); }