mirror of
https://github.com/tstack/lnav.git
synced 2024-08-17 08:50:41 +03:00
[timeline] rename gantt view to timeline
This commit is contained in:
parent
5355b6854e
commit
4759a59b23
5
NEWS.md
5
NEWS.md
@ -7,7 +7,7 @@ Features:
|
|||||||
* The `log_opid` column on log vtables can now by `UPDATE`d
|
* The `log_opid` column on log vtables can now by `UPDATE`d
|
||||||
so that you can manually set an opid on log messages that
|
so that you can manually set an opid on log messages that
|
||||||
don't have one. Setting an opid allows messages to show
|
don't have one. Setting an opid allows messages to show
|
||||||
up in the Gantt chart view.
|
up in the timeline view.
|
||||||
* Add support for GitHub Markdown Alerts.
|
* Add support for GitHub Markdown Alerts.
|
||||||
* Added the `:xopen` command that will open the given paths
|
* Added the `:xopen` command that will open the given paths
|
||||||
using an external opener like `open` or `xdg-open`.
|
using an external opener like `open` or `xdg-open`.
|
||||||
@ -16,7 +16,8 @@ Features:
|
|||||||
target with `:xopen`, or copying the link to a clipboard.
|
target with `:xopen`, or copying the link to a clipboard.
|
||||||
|
|
||||||
Interface Changes:
|
Interface Changes:
|
||||||
* In the Gantt chart view, pressing `ENTER` will focus on
|
* The "Gantt Chart" view has been renamed to "timeline".
|
||||||
|
* In the timeline view, pressing `ENTER` will focus on
|
||||||
the preview pane, so you can scroll through messages
|
the preview pane, so you can scroll through messages
|
||||||
with the selected Op ID.
|
with the selected Op ID.
|
||||||
* With mouse mode enabled, `CTRL` can be used as an alternate
|
* With mouse mode enabled, `CTRL` can be used as an alternate
|
||||||
|
Before Width: | Height: | Size: 1.5 MiB After Width: | Height: | Size: 1.5 MiB |
Before Width: | Height: | Size: 1.3 MiB After Width: | Height: | Size: 1.3 MiB |
@ -305,19 +305,19 @@ can also press :kbd:`Shift` + :kbd:`i` to toggle the histogram view
|
|||||||
while synchronizing the top time. While in the histogram view,
|
while synchronizing the top time. While in the histogram view,
|
||||||
pressing :kbd:`z` / :kbd:`Shift` + :kbd:`z` will zoom in/out.
|
pressing :kbd:`z` / :kbd:`Shift` + :kbd:`z` will zoom in/out.
|
||||||
|
|
||||||
GANTT
|
TIMELINE
|
||||||
^^^^^
|
^^^^^^^^
|
||||||
|
|
||||||
.. note:: This feature is available in v0.12.0+.
|
.. note:: This feature is available in v0.12.0+.
|
||||||
|
|
||||||
.. figure:: lnav-gantt-1.png
|
.. figure:: lnav-timeline-1.png
|
||||||
:align: center
|
:align: center
|
||||||
|
|
||||||
Screenshot of the Gantt chart view when viewing logs from the
|
Screenshot of the timeline view when viewing logs from the
|
||||||
VMWare Update Manager. Most rows show API requests as they
|
VMWare Update Manager. Most rows show API requests as they
|
||||||
are received and processed.
|
are received and processed.
|
||||||
|
|
||||||
The Gantt Chart view visualizes operations over time. The operations
|
The timeline view [#]_ visualizes operations over time. The operations
|
||||||
are identified by the "opid" field defined in the log format. In the
|
are identified by the "opid" field defined in the log format. In the
|
||||||
view, there is a header that shows the overall time span, the
|
view, there is a header that shows the overall time span, the
|
||||||
narrowed time span around the focused line, and the column headers.
|
narrowed time span around the focused line, and the column headers.
|
||||||
@ -346,7 +346,7 @@ The following hotkeys can be useful in this view:
|
|||||||
:code:`opid/subid` property, this will toggle an overlay panel
|
:code:`opid/subid` property, this will toggle an overlay panel
|
||||||
that displays the sub-operation descriptions.
|
that displays the sub-operation descriptions.
|
||||||
|
|
||||||
.. figure:: lnav-gantt-2.png
|
.. figure:: lnav-timeline-2.png
|
||||||
:align: center
|
:align: center
|
||||||
|
|
||||||
Screenshot showing the same log as above after pressing
|
Screenshot showing the same log as above after pressing
|
||||||
@ -354,12 +354,14 @@ The following hotkeys can be useful in this view:
|
|||||||
sub-operations performed while processing the main operation.
|
sub-operations performed while processing the main operation.
|
||||||
|
|
||||||
* :kbd:`Shift` + :kbd:`q` -- Return to the previous view and change
|
* :kbd:`Shift` + :kbd:`q` -- Return to the previous view and change
|
||||||
its focused line to match the time that was focused in the gantt
|
its focused line to match the time that was focused in the timeline
|
||||||
view.
|
view.
|
||||||
* :kbd:`Shift` + :kbd:`a` -- After leaving the gantt view, pressing
|
* :kbd:`Shift` + :kbd:`a` -- After leaving the timeline view, pressing
|
||||||
these keys will return to the Gantt view while keeping the focused
|
these keys will return to the timeline view while keeping the focused
|
||||||
time in sync.
|
time in sync.
|
||||||
|
|
||||||
|
.. [#] Formerly called the "Gantt Chart" view.
|
||||||
|
|
||||||
PRETTY
|
PRETTY
|
||||||
^^^^^^
|
^^^^^^
|
||||||
|
|
||||||
@ -428,7 +430,7 @@ elements will respond to mouse inputs:
|
|||||||
|
|
||||||
* clicking on the main view will move the cursor to the given
|
* clicking on the main view will move the cursor to the given
|
||||||
row and dragging will scroll the view as needed;
|
row and dragging will scroll the view as needed;
|
||||||
* :bkd:`Shift` (or :kbd:`CTRL`) clicking/dragging in the main
|
* :kbd:`Shift` (or :kbd:`CTRL`) clicking/dragging in the main
|
||||||
view will highlight lines and then toggle their bookmark
|
view will highlight lines and then toggle their bookmark
|
||||||
status on release;
|
status on release;
|
||||||
* double-clicking in the main view will select the underlying
|
* double-clicking in the main view will select the underlying
|
||||||
|
@ -443,7 +443,6 @@ add_library(
|
|||||||
fs-extension-functions.cc
|
fs-extension-functions.cc
|
||||||
fstat_vtab.cc
|
fstat_vtab.cc
|
||||||
fts_fuzzy_match.cc
|
fts_fuzzy_match.cc
|
||||||
gantt_source.cc
|
|
||||||
help_text.cc
|
help_text.cc
|
||||||
help_text_formatter.cc
|
help_text_formatter.cc
|
||||||
highlighter.cc
|
highlighter.cc
|
||||||
@ -510,6 +509,7 @@ add_library(
|
|||||||
textfile_highlighters.cc
|
textfile_highlighters.cc
|
||||||
textfile_sub_source.cc
|
textfile_sub_source.cc
|
||||||
textview_curses.cc
|
textview_curses.cc
|
||||||
|
timeline_source.cc
|
||||||
top_status_source.cc
|
top_status_source.cc
|
||||||
time-extension-functions.cc
|
time-extension-functions.cc
|
||||||
timer.cc
|
timer.cc
|
||||||
@ -560,8 +560,6 @@ add_library(
|
|||||||
filter_sub_source.hh
|
filter_sub_source.hh
|
||||||
fstat_vtab.hh
|
fstat_vtab.hh
|
||||||
fts_fuzzy_match.hh
|
fts_fuzzy_match.hh
|
||||||
gantt_source.hh
|
|
||||||
gantt_status_source.hh
|
|
||||||
grep_highlighter.hh
|
grep_highlighter.hh
|
||||||
hasher.hh
|
hasher.hh
|
||||||
help_text.hh
|
help_text.hh
|
||||||
@ -641,6 +639,8 @@ add_library(
|
|||||||
textview_curses.hh
|
textview_curses.hh
|
||||||
textview_curses_fwd.hh
|
textview_curses_fwd.hh
|
||||||
time_T.hh
|
time_T.hh
|
||||||
|
timeline_source.hh
|
||||||
|
timeline_status_source.hh
|
||||||
timer.hh
|
timer.hh
|
||||||
top_status_source.hh
|
top_status_source.hh
|
||||||
url_handler.cfg.hh
|
url_handler.cfg.hh
|
||||||
|
@ -251,8 +251,6 @@ noinst_HEADERS = \
|
|||||||
filter_sub_source.hh \
|
filter_sub_source.hh \
|
||||||
fstat_vtab.hh \
|
fstat_vtab.hh \
|
||||||
fts_fuzzy_match.hh \
|
fts_fuzzy_match.hh \
|
||||||
gantt_source.hh \
|
|
||||||
gantt_status_source.hh \
|
|
||||||
grep_highlighter.hh \
|
grep_highlighter.hh \
|
||||||
grep_proc.hh \
|
grep_proc.hh \
|
||||||
hasher.hh \
|
hasher.hh \
|
||||||
@ -357,6 +355,8 @@ noinst_HEADERS = \
|
|||||||
textview_curses.hh \
|
textview_curses.hh \
|
||||||
textview_curses_fwd.hh \
|
textview_curses_fwd.hh \
|
||||||
time_T.hh \
|
time_T.hh \
|
||||||
|
timeline_source.hh \
|
||||||
|
timeline_status_source.hh \
|
||||||
timer.hh \
|
timer.hh \
|
||||||
top_status_source.hh \
|
top_status_source.hh \
|
||||||
top_status_source.cfg.hh \
|
top_status_source.cfg.hh \
|
||||||
@ -446,7 +446,6 @@ libdiag_a_SOURCES = \
|
|||||||
fstat_vtab.cc \
|
fstat_vtab.cc \
|
||||||
fs-extension-functions.cc \
|
fs-extension-functions.cc \
|
||||||
fts_fuzzy_match.cc \
|
fts_fuzzy_match.cc \
|
||||||
gantt_source.cc \
|
|
||||||
grep_proc.cc \
|
grep_proc.cc \
|
||||||
help_text.cc \
|
help_text.cc \
|
||||||
help_text_formatter.cc \
|
help_text_formatter.cc \
|
||||||
@ -515,6 +514,7 @@ libdiag_a_SOURCES = \
|
|||||||
textfile_highlighters.cc \
|
textfile_highlighters.cc \
|
||||||
textview_curses.cc \
|
textview_curses.cc \
|
||||||
time-extension-functions.cc \
|
time-extension-functions.cc \
|
||||||
|
timeline_source.cc \
|
||||||
top_status_source.cc \
|
top_status_source.cc \
|
||||||
unique_path.cc \
|
unique_path.cc \
|
||||||
view_curses.cc \
|
view_curses.cc \
|
||||||
|
66
src/lnav.cc
66
src/lnav.cc
@ -90,7 +90,6 @@
|
|||||||
#include "file_options.hh"
|
#include "file_options.hh"
|
||||||
#include "filter_sub_source.hh"
|
#include "filter_sub_source.hh"
|
||||||
#include "fstat_vtab.hh"
|
#include "fstat_vtab.hh"
|
||||||
#include "gantt_source.hh"
|
|
||||||
#include "hist_source.hh"
|
#include "hist_source.hh"
|
||||||
#include "init-sql.h"
|
#include "init-sql.h"
|
||||||
#include "listview_curses.hh"
|
#include "listview_curses.hh"
|
||||||
@ -127,6 +126,7 @@
|
|||||||
#include "termios_guard.hh"
|
#include "termios_guard.hh"
|
||||||
#include "textfile_highlighters.hh"
|
#include "textfile_highlighters.hh"
|
||||||
#include "textview_curses.hh"
|
#include "textview_curses.hh"
|
||||||
|
#include "timeline_source.hh"
|
||||||
#include "top_status_source.hh"
|
#include "top_status_source.hh"
|
||||||
#include "view_helpers.crumbs.hh"
|
#include "view_helpers.crumbs.hh"
|
||||||
#include "view_helpers.examples.hh"
|
#include "view_helpers.examples.hh"
|
||||||
@ -1370,17 +1370,17 @@ VALUES ('org.lnav.mouse-support', -1, DATETIME('now', '+1 minute'),
|
|||||||
lnav_data.ld_spectro_source->ss_exec_context
|
lnav_data.ld_spectro_source->ss_exec_context
|
||||||
= &lnav_data.ld_exec_context;
|
= &lnav_data.ld_exec_context;
|
||||||
|
|
||||||
lnav_data.ld_gantt_details_view.set_title("gantt-details");
|
lnav_data.ld_timeline_details_view.set_title("timeline-details");
|
||||||
lnav_data.ld_gantt_details_view.set_window(lnav_data.ld_window);
|
lnav_data.ld_timeline_details_view.set_window(lnav_data.ld_window);
|
||||||
lnav_data.ld_gantt_details_view.set_selectable(true);
|
lnav_data.ld_timeline_details_view.set_selectable(true);
|
||||||
lnav_data.ld_gantt_details_view.set_show_scrollbar(true);
|
lnav_data.ld_timeline_details_view.set_show_scrollbar(true);
|
||||||
lnav_data.ld_gantt_details_view.set_height(5_vl);
|
lnav_data.ld_timeline_details_view.set_height(5_vl);
|
||||||
lnav_data.ld_gantt_details_view.set_supports_marks(true);
|
lnav_data.ld_timeline_details_view.set_supports_marks(true);
|
||||||
lnav_data.ld_gantt_details_view.set_sub_source(
|
lnav_data.ld_timeline_details_view.set_sub_source(
|
||||||
&lnav_data.ld_gantt_details_source);
|
&lnav_data.ld_timeline_details_source);
|
||||||
lnav_data.ld_gantt_details_view.tc_cursor_role
|
lnav_data.ld_timeline_details_view.tc_cursor_role
|
||||||
= role_t::VCR_CURSOR_LINE;
|
= role_t::VCR_CURSOR_LINE;
|
||||||
lnav_data.ld_gantt_details_view.tc_disabled_cursor_role
|
lnav_data.ld_timeline_details_view.tc_disabled_cursor_role
|
||||||
= role_t::VCR_DISABLED_CURSOR_LINE;
|
= role_t::VCR_DISABLED_CURSOR_LINE;
|
||||||
|
|
||||||
auto top_status_lifetime
|
auto top_status_lifetime
|
||||||
@ -1438,9 +1438,9 @@ VALUES ('org.lnav.mouse-support', -1, DATETIME('now', '+1 minute'),
|
|||||||
= std::make_unique<spectro_status_source>();
|
= std::make_unique<spectro_status_source>();
|
||||||
lnav_data.ld_status[LNS_SPECTRO].set_data_source(
|
lnav_data.ld_status[LNS_SPECTRO].set_data_source(
|
||||||
lnav_data.ld_spectro_status_source.get());
|
lnav_data.ld_spectro_status_source.get());
|
||||||
lnav_data.ld_status[LNS_GANTT].set_enabled(false);
|
lnav_data.ld_status[LNS_TIMELINE].set_enabled(false);
|
||||||
lnav_data.ld_status[LNS_GANTT].set_data_source(
|
lnav_data.ld_status[LNS_TIMELINE].set_data_source(
|
||||||
&lnav_data.ld_gantt_status_source);
|
&lnav_data.ld_timeline_status_source);
|
||||||
|
|
||||||
lnav_data.ld_match_view.set_show_bottom_border(true);
|
lnav_data.ld_match_view.set_show_bottom_border(true);
|
||||||
lnav_data.ld_user_message_view.set_show_bottom_border(true);
|
lnav_data.ld_user_message_view.set_show_bottom_border(true);
|
||||||
@ -1650,7 +1650,7 @@ VALUES ('org.lnav.mouse-support', -1, DATETIME('now', '+1 minute'),
|
|||||||
lnav_data.ld_preview_view[0].do_update();
|
lnav_data.ld_preview_view[0].do_update();
|
||||||
lnav_data.ld_preview_view[1].do_update();
|
lnav_data.ld_preview_view[1].do_update();
|
||||||
lnav_data.ld_spectro_details_view.do_update();
|
lnav_data.ld_spectro_details_view.do_update();
|
||||||
lnav_data.ld_gantt_details_view.do_update();
|
lnav_data.ld_timeline_details_view.do_update();
|
||||||
lnav_data.ld_user_message_view.do_update();
|
lnav_data.ld_user_message_view.do_update();
|
||||||
if (ui_clock::now() >= next_status_update_time) {
|
if (ui_clock::now() >= next_status_update_time) {
|
||||||
echo_views_stmt.execute();
|
echo_views_stmt.execute();
|
||||||
@ -2851,26 +2851,26 @@ SELECT tbl_name FROM sqlite_master WHERE sql LIKE 'CREATE VIRTUAL TABLE%'
|
|||||||
.add_input_delegate(*lnav_data.ld_spectro_source)
|
.add_input_delegate(*lnav_data.ld_spectro_source)
|
||||||
.set_tail_space(4_vl);
|
.set_tail_space(4_vl);
|
||||||
lnav_data.ld_views[LNV_SPECTRO].set_selectable(true);
|
lnav_data.ld_views[LNV_SPECTRO].set_selectable(true);
|
||||||
auto gantt_view_source
|
auto timeline_view_source = std::make_shared<timeline_source>(
|
||||||
= std::make_shared<gantt_source>(lnav_data.ld_views[LNV_LOG],
|
lnav_data.ld_views[LNV_LOG],
|
||||||
lnav_data.ld_log_source,
|
lnav_data.ld_log_source,
|
||||||
lnav_data.ld_gantt_details_view,
|
lnav_data.ld_timeline_details_view,
|
||||||
lnav_data.ld_gantt_details_source,
|
lnav_data.ld_timeline_details_source,
|
||||||
lnav_data.ld_status[LNS_GANTT],
|
lnav_data.ld_status[LNS_TIMELINE],
|
||||||
lnav_data.ld_gantt_status_source);
|
lnav_data.ld_timeline_status_source);
|
||||||
gantt_view_source->gs_exec_context = &lnav_data.ld_exec_context;
|
timeline_view_source->gs_exec_context = &lnav_data.ld_exec_context;
|
||||||
auto gantt_header_source
|
auto timeline_header_source
|
||||||
= std::make_shared<gantt_header_overlay>(gantt_view_source);
|
= std::make_shared<timeline_header_overlay>(timeline_view_source);
|
||||||
lnav_data.ld_views[LNV_GANTT]
|
lnav_data.ld_views[LNV_TIMELINE]
|
||||||
.set_sub_source(gantt_view_source.get())
|
.set_sub_source(timeline_view_source.get())
|
||||||
.set_overlay_source(gantt_header_source.get())
|
.set_overlay_source(timeline_header_source.get())
|
||||||
.add_input_delegate(*gantt_view_source)
|
.add_input_delegate(*timeline_view_source)
|
||||||
.set_tail_space(4_vl);
|
.set_tail_space(4_vl);
|
||||||
lnav_data.ld_views[LNV_GANTT].set_selectable(true);
|
lnav_data.ld_views[LNV_TIMELINE].set_selectable(true);
|
||||||
|
|
||||||
auto _gantt_cleanup = finally([] {
|
auto _timeline_cleanup = finally([] {
|
||||||
lnav_data.ld_views[LNV_GANTT].set_sub_source(nullptr);
|
lnav_data.ld_views[LNV_TIMELINE].set_sub_source(nullptr);
|
||||||
lnav_data.ld_views[LNV_GANTT].set_overlay_source(nullptr);
|
lnav_data.ld_views[LNV_TIMELINE].set_overlay_source(nullptr);
|
||||||
});
|
});
|
||||||
|
|
||||||
lnav_data.ld_doc_view.set_sub_source(&lnav_data.ld_doc_source);
|
lnav_data.ld_doc_view.set_sub_source(&lnav_data.ld_doc_source);
|
||||||
|
10
src/lnav.hh
10
src/lnav.hh
@ -49,7 +49,6 @@
|
|||||||
#include "file_collection.hh"
|
#include "file_collection.hh"
|
||||||
#include "files_sub_source.hh"
|
#include "files_sub_source.hh"
|
||||||
#include "filter_status_source.hh"
|
#include "filter_status_source.hh"
|
||||||
#include "gantt_status_source.hh"
|
|
||||||
#include "hist_source.hh"
|
#include "hist_source.hh"
|
||||||
#include "input_dispatcher.hh"
|
#include "input_dispatcher.hh"
|
||||||
#include "log_vtab_impl.hh"
|
#include "log_vtab_impl.hh"
|
||||||
@ -59,6 +58,7 @@
|
|||||||
#include "sqlitepp.hh"
|
#include "sqlitepp.hh"
|
||||||
#include "statusview_curses.hh"
|
#include "statusview_curses.hh"
|
||||||
#include "textfile_sub_source.hh"
|
#include "textfile_sub_source.hh"
|
||||||
|
#include "timeline_status_source.hh"
|
||||||
#include "view_helpers.hh"
|
#include "view_helpers.hh"
|
||||||
|
|
||||||
class spectrogram_source;
|
class spectrogram_source;
|
||||||
@ -76,7 +76,7 @@ typedef enum {
|
|||||||
LNS_PREVIEW0,
|
LNS_PREVIEW0,
|
||||||
LNS_PREVIEW1,
|
LNS_PREVIEW1,
|
||||||
LNS_SPECTRO,
|
LNS_SPECTRO,
|
||||||
LNS_GANTT,
|
LNS_TIMELINE,
|
||||||
|
|
||||||
LNS__MAX
|
LNS__MAX
|
||||||
} lnav_status_t;
|
} lnav_status_t;
|
||||||
@ -185,7 +185,7 @@ struct lnav_data_t {
|
|||||||
doc_status_source ld_doc_status_source;
|
doc_status_source ld_doc_status_source;
|
||||||
preview_status_source ld_preview_status_source[2];
|
preview_status_source ld_preview_status_source[2];
|
||||||
std::unique_ptr<spectro_status_source> ld_spectro_status_source;
|
std::unique_ptr<spectro_status_source> ld_spectro_status_source;
|
||||||
gantt_status_source ld_gantt_status_source;
|
timeline_status_source ld_timeline_status_source;
|
||||||
bool ld_preview_hidden;
|
bool ld_preview_hidden;
|
||||||
int64_t ld_preview_generation{0};
|
int64_t ld_preview_generation{0};
|
||||||
action_broadcaster<listview_curses> ld_scroll_broadcaster;
|
action_broadcaster<listview_curses> ld_scroll_broadcaster;
|
||||||
@ -211,8 +211,8 @@ struct lnav_data_t {
|
|||||||
ld_user_message_expiration;
|
ld_user_message_expiration;
|
||||||
textview_curses ld_spectro_details_view;
|
textview_curses ld_spectro_details_view;
|
||||||
plain_text_source ld_spectro_no_details_source;
|
plain_text_source ld_spectro_no_details_source;
|
||||||
textview_curses ld_gantt_details_view;
|
textview_curses ld_timeline_details_view;
|
||||||
plain_text_source ld_gantt_details_source;
|
plain_text_source ld_timeline_details_source;
|
||||||
|
|
||||||
view_stack<textview_curses> ld_view_stack;
|
view_stack<textview_curses> ld_view_stack;
|
||||||
textview_curses* ld_last_view;
|
textview_curses* ld_last_view;
|
||||||
|
@ -373,10 +373,11 @@ rebuild_indexes(std::optional<ui_clock::time_point> deadline)
|
|||||||
}
|
}
|
||||||
|
|
||||||
lnav_data.ld_view_stack.top() | [&closed_files, &retval](auto tc) {
|
lnav_data.ld_view_stack.top() | [&closed_files, &retval](auto tc) {
|
||||||
if (!closed_files.empty() && tc == &lnav_data.ld_views[LNV_GANTT]) {
|
if (!closed_files.empty() && tc == &lnav_data.ld_views[LNV_TIMELINE]) {
|
||||||
auto* gantt_source = lnav_data.ld_views[LNV_GANTT].get_sub_source();
|
auto* timeline_source
|
||||||
if (gantt_source != nullptr) {
|
= lnav_data.ld_views[LNV_TIMELINE].get_sub_source();
|
||||||
gantt_source->text_filters_changed();
|
if (timeline_source != nullptr) {
|
||||||
|
timeline_source->text_filters_changed();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3770,8 +3770,8 @@ com_file_visibility(exec_context& ec,
|
|||||||
lnav_data.ld_views[LNV_LOG]
|
lnav_data.ld_views[LNV_LOG]
|
||||||
.get_sub_source()
|
.get_sub_source()
|
||||||
->text_filters_changed();
|
->text_filters_changed();
|
||||||
if (top_tc == &lnav_data.ld_views[LNV_GANTT]) {
|
if (top_tc == &lnav_data.ld_views[LNV_TIMELINE]) {
|
||||||
lnav_data.ld_views[LNV_GANTT]
|
lnav_data.ld_views[LNV_TIMELINE]
|
||||||
.get_sub_source()
|
.get_sub_source()
|
||||||
->text_filters_changed();
|
->text_filters_changed();
|
||||||
}
|
}
|
||||||
|
@ -1891,7 +1891,7 @@ lnav::session::restore_view_states()
|
|||||||
lnav_data.ld_view_stack.pop_back();
|
lnav_data.ld_view_stack.pop_back();
|
||||||
lnav_data.ld_view_stack.top() | [](auto* tc) {
|
lnav_data.ld_view_stack.top() | [](auto* tc) {
|
||||||
// XXX
|
// XXX
|
||||||
if (tc == &lnav_data.ld_views[LNV_GANTT]) {
|
if (tc == &lnav_data.ld_views[LNV_TIMELINE]) {
|
||||||
auto tss = tc->get_sub_source();
|
auto tss = tc->get_sub_source();
|
||||||
tss->text_filters_changed();
|
tss->text_filters_changed();
|
||||||
tc->reload_data();
|
tc->reload_data();
|
||||||
|
@ -29,7 +29,7 @@
|
|||||||
|
|
||||||
#include <chrono>
|
#include <chrono>
|
||||||
|
|
||||||
#include "gantt_source.hh"
|
#include "timeline_source.hh"
|
||||||
|
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
|
|
||||||
@ -118,8 +118,8 @@ abbrev_ftime(char* datebuf,
|
|||||||
}
|
}
|
||||||
|
|
||||||
std::vector<attr_line_t>
|
std::vector<attr_line_t>
|
||||||
gantt_preview_overlay::list_overlay_menu(const listview_curses& lv,
|
timeline_preview_overlay::list_overlay_menu(const listview_curses& lv,
|
||||||
vis_line_t line)
|
vis_line_t line)
|
||||||
{
|
{
|
||||||
static constexpr auto MENU_WIDTH = 25;
|
static constexpr auto MENU_WIDTH = 25;
|
||||||
|
|
||||||
@ -174,17 +174,17 @@ gantt_preview_overlay::list_overlay_menu(const listview_curses& lv,
|
|||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
gantt_header_overlay::
|
timeline_header_overlay::
|
||||||
gantt_header_overlay(std::shared_ptr<gantt_source> src)
|
timeline_header_overlay(std::shared_ptr<timeline_source> src)
|
||||||
: gho_src(src)
|
: gho_src(src)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
gantt_header_overlay::list_static_overlay(const listview_curses& lv,
|
timeline_header_overlay::list_static_overlay(const listview_curses& lv,
|
||||||
int y,
|
int y,
|
||||||
int bottom,
|
int bottom,
|
||||||
attr_line_t& value_out)
|
attr_line_t& value_out)
|
||||||
{
|
{
|
||||||
if (y >= 3) {
|
if (y >= 3) {
|
||||||
return false;
|
return false;
|
||||||
@ -297,7 +297,7 @@ gantt_header_overlay::list_static_overlay(const listview_curses& lv,
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
void
|
void
|
||||||
gantt_header_overlay::list_value_for_overlay(
|
timeline_header_overlay::list_value_for_overlay(
|
||||||
const listview_curses& lv,
|
const listview_curses& lv,
|
||||||
vis_line_t line,
|
vis_line_t line,
|
||||||
std::vector<attr_line_t>& value_out)
|
std::vector<attr_line_t>& value_out)
|
||||||
@ -384,8 +384,8 @@ gantt_header_overlay::list_value_for_overlay(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
std::optional<attr_line_t>
|
std::optional<attr_line_t>
|
||||||
gantt_header_overlay::list_header_for_overlay(const listview_curses& lv,
|
timeline_header_overlay::list_header_for_overlay(const listview_curses& lv,
|
||||||
vis_line_t line)
|
vis_line_t line)
|
||||||
{
|
{
|
||||||
if (lv.get_overlay_selection()) {
|
if (lv.get_overlay_selection()) {
|
||||||
return attr_line_t("\u258C Sub-operations: Press ")
|
return attr_line_t("\u258C Sub-operations: Press ")
|
||||||
@ -397,13 +397,13 @@ gantt_header_overlay::list_header_for_overlay(const listview_curses& lv,
|
|||||||
.append(" to focus on this panel");
|
.append(" to focus on this panel");
|
||||||
}
|
}
|
||||||
|
|
||||||
gantt_source::
|
timeline_source::
|
||||||
gantt_source(textview_curses& log_view,
|
timeline_source(textview_curses& log_view,
|
||||||
logfile_sub_source& lss,
|
logfile_sub_source& lss,
|
||||||
textview_curses& preview_view,
|
textview_curses& preview_view,
|
||||||
plain_text_source& preview_source,
|
plain_text_source& preview_source,
|
||||||
statusview_curses& preview_status_view,
|
statusview_curses& preview_status_view,
|
||||||
gantt_status_source& preview_status_source)
|
timeline_status_source& preview_status_source)
|
||||||
: gs_log_view(log_view), gs_lss(lss), gs_preview_view(preview_view),
|
: gs_log_view(log_view), gs_lss(lss), gs_preview_view(preview_view),
|
||||||
gs_preview_source(preview_source),
|
gs_preview_source(preview_source),
|
||||||
gs_preview_status_view(preview_status_view),
|
gs_preview_status_view(preview_status_view),
|
||||||
@ -414,7 +414,7 @@ gantt_source(textview_curses& log_view,
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
gantt_source::list_input_handle_key(listview_curses& lv, int ch)
|
timeline_source::list_input_handle_key(listview_curses& lv, int ch)
|
||||||
{
|
{
|
||||||
log_debug("list input %x", ch);
|
log_debug("list input %x", ch);
|
||||||
switch (ch) {
|
switch (ch) {
|
||||||
@ -462,9 +462,10 @@ gantt_source::list_input_handle_key(listview_curses& lv, int ch)
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
gantt_source::text_handle_mouse(textview_curses& tc,
|
timeline_source::text_handle_mouse(
|
||||||
const listview_curses::display_line_content_t&,
|
textview_curses& tc,
|
||||||
mouse_event& me)
|
const listview_curses::display_line_content_t&,
|
||||||
|
mouse_event& me)
|
||||||
{
|
{
|
||||||
if (me.is_double_click_in(mouse_button_t::BUTTON_LEFT, line_range{0, -1})) {
|
if (me.is_double_click_in(mouse_button_t::BUTTON_LEFT, line_range{0, -1})) {
|
||||||
this->list_input_handle_key(tc, '\r');
|
this->list_input_handle_key(tc, '\r');
|
||||||
@ -474,7 +475,7 @@ gantt_source::text_handle_mouse(textview_curses& tc,
|
|||||||
}
|
}
|
||||||
|
|
||||||
std::pair<timeval, timeval>
|
std::pair<timeval, timeval>
|
||||||
gantt_source::get_time_bounds_for(int line)
|
timeline_source::get_time_bounds_for(int line)
|
||||||
{
|
{
|
||||||
auto low_index = this->tss_view->get_top();
|
auto low_index = this->tss_view->get_top();
|
||||||
auto high_index
|
auto high_index
|
||||||
@ -517,16 +518,16 @@ gantt_source::get_time_bounds_for(int line)
|
|||||||
}
|
}
|
||||||
|
|
||||||
size_t
|
size_t
|
||||||
gantt_source::text_line_count()
|
timeline_source::text_line_count()
|
||||||
{
|
{
|
||||||
return this->gs_time_order.size();
|
return this->gs_time_order.size();
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
gantt_source::text_value_for_line(textview_curses& tc,
|
timeline_source::text_value_for_line(textview_curses& tc,
|
||||||
int line,
|
int line,
|
||||||
std::string& value_out,
|
std::string& value_out,
|
||||||
text_sub_source::line_flags_t flags)
|
text_sub_source::line_flags_t flags)
|
||||||
{
|
{
|
||||||
if (line < this->gs_time_order.size()) {
|
if (line < this->gs_time_order.size()) {
|
||||||
const auto& row = this->gs_time_order[line].get();
|
const auto& row = this->gs_time_order[line].get();
|
||||||
@ -563,9 +564,9 @@ gantt_source::text_value_for_line(textview_curses& tc,
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
gantt_source::text_attrs_for_line(textview_curses& tc,
|
timeline_source::text_attrs_for_line(textview_curses& tc,
|
||||||
int line,
|
int line,
|
||||||
string_attrs_t& value_out)
|
string_attrs_t& value_out)
|
||||||
{
|
{
|
||||||
if (line < this->gs_time_order.size()) {
|
if (line < this->gs_time_order.size()) {
|
||||||
const auto& row = this->gs_time_order[line].get();
|
const auto& row = this->gs_time_order[line].get();
|
||||||
@ -623,15 +624,15 @@ gantt_source::text_attrs_for_line(textview_curses& tc,
|
|||||||
}
|
}
|
||||||
|
|
||||||
size_t
|
size_t
|
||||||
gantt_source::text_size_for_line(textview_curses& tc,
|
timeline_source::text_size_for_line(textview_curses& tc,
|
||||||
int line,
|
int line,
|
||||||
text_sub_source::line_flags_t raw)
|
text_sub_source::line_flags_t raw)
|
||||||
{
|
{
|
||||||
return this->gs_total_width;
|
return this->gs_total_width;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
gantt_source::rebuild_indexes()
|
timeline_source::rebuild_indexes()
|
||||||
{
|
{
|
||||||
auto& bm = this->tss_view->get_bookmarks();
|
auto& bm = this->tss_view->get_bookmarks();
|
||||||
auto& bm_errs = bm[&logfile_sub_source::BM_ERRORS];
|
auto& bm_errs = bm[&logfile_sub_source::BM_ERRORS];
|
||||||
@ -861,7 +862,7 @@ gantt_source::rebuild_indexes()
|
|||||||
}
|
}
|
||||||
|
|
||||||
std::optional<vis_line_t>
|
std::optional<vis_line_t>
|
||||||
gantt_source::row_for_time(struct timeval time_bucket)
|
timeline_source::row_for_time(struct timeval time_bucket)
|
||||||
{
|
{
|
||||||
auto iter = this->gs_time_order.begin();
|
auto iter = this->gs_time_order.begin();
|
||||||
while (true) {
|
while (true) {
|
||||||
@ -908,7 +909,7 @@ gantt_source::row_for_time(struct timeval time_bucket)
|
|||||||
}
|
}
|
||||||
|
|
||||||
std::optional<text_time_translator::row_info>
|
std::optional<text_time_translator::row_info>
|
||||||
gantt_source::time_for_row(vis_line_t row)
|
timeline_source::time_for_row(vis_line_t row)
|
||||||
{
|
{
|
||||||
if (row >= this->gs_time_order.size()) {
|
if (row >= this->gs_time_order.size()) {
|
||||||
return std::nullopt;
|
return std::nullopt;
|
||||||
@ -939,13 +940,13 @@ gantt_source::time_for_row(vis_line_t row)
|
|||||||
}
|
}
|
||||||
|
|
||||||
size_t
|
size_t
|
||||||
gantt_source::text_line_width(textview_curses& curses)
|
timeline_source::text_line_width(textview_curses& curses)
|
||||||
{
|
{
|
||||||
return this->gs_total_width;
|
return this->gs_total_width;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
gantt_source::text_selection_changed(textview_curses& tc)
|
timeline_source::text_selection_changed(textview_curses& tc)
|
||||||
{
|
{
|
||||||
static const size_t MAX_PREVIEW_LINES = 200;
|
static const size_t MAX_PREVIEW_LINES = 200;
|
||||||
|
|
||||||
@ -1021,24 +1022,24 @@ gantt_source::text_selection_changed(textview_curses& tc)
|
|||||||
auto err_count = level_stats.lls_error_count;
|
auto err_count = level_stats.lls_error_count;
|
||||||
if (err_count == 0) {
|
if (err_count == 0) {
|
||||||
this->gs_preview_status_source
|
this->gs_preview_status_source
|
||||||
.statusview_value_for_field(gantt_status_source::TSF_ERRORS)
|
.statusview_value_for_field(timeline_status_source::TSF_ERRORS)
|
||||||
.set_value("");
|
.set_value("");
|
||||||
} else if (err_count > 1) {
|
} else if (err_count > 1) {
|
||||||
this->gs_preview_status_source
|
this->gs_preview_status_source
|
||||||
.statusview_value_for_field(gantt_status_source::TSF_ERRORS)
|
.statusview_value_for_field(timeline_status_source::TSF_ERRORS)
|
||||||
.set_value("%'d errors", err_count);
|
.set_value("%'d errors", err_count);
|
||||||
} else {
|
} else {
|
||||||
this->gs_preview_status_source
|
this->gs_preview_status_source
|
||||||
.statusview_value_for_field(gantt_status_source::TSF_ERRORS)
|
.statusview_value_for_field(timeline_status_source::TSF_ERRORS)
|
||||||
.set_value("%'d error", err_count);
|
.set_value("%'d error", err_count);
|
||||||
}
|
}
|
||||||
this->gs_preview_status_source
|
this->gs_preview_status_source
|
||||||
.statusview_value_for_field(gantt_status_source::TSF_TOTAL)
|
.statusview_value_for_field(timeline_status_source::TSF_TOTAL)
|
||||||
.set_value("%'d messages ", level_stats.lls_total_count);
|
.set_value("%'d messages ", level_stats.lls_total_count);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
gantt_source::text_filters_changed()
|
timeline_source::text_filters_changed()
|
||||||
{
|
{
|
||||||
this->rebuild_indexes();
|
this->rebuild_indexes();
|
||||||
|
|
||||||
@ -1049,13 +1050,13 @@ gantt_source::text_filters_changed()
|
|||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
gantt_source::get_filtered_count() const
|
timeline_source::get_filtered_count() const
|
||||||
{
|
{
|
||||||
return this->gs_filtered_count;
|
return this->gs_filtered_count;
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
gantt_source::get_filtered_count_for(size_t filter_index) const
|
timeline_source::get_filtered_count_for(size_t filter_index) const
|
||||||
{
|
{
|
||||||
return this->gs_filter_hits[filter_index];
|
return this->gs_filter_hits[filter_index];
|
||||||
}
|
}
|
||||||
@ -1082,8 +1083,8 @@ timestamp_poss()
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
gantt_source::text_crumbs_for_line(int line,
|
timeline_source::text_crumbs_for_line(int line,
|
||||||
std::vector<breadcrumb::crumb>& crumbs)
|
std::vector<breadcrumb::crumb>& crumbs)
|
||||||
{
|
{
|
||||||
text_sub_source::text_crumbs_for_line(line, crumbs);
|
text_sub_source::text_crumbs_for_line(line, crumbs);
|
||||||
|
|
@ -27,34 +27,34 @@
|
|||||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef lnav_gantt_source_hh
|
#ifndef lnav_timeline_source_hh
|
||||||
#define lnav_gantt_source_hh
|
#define lnav_timeline_source_hh
|
||||||
|
|
||||||
#include "base/map_util.hh"
|
#include "base/map_util.hh"
|
||||||
#include "gantt_status_source.hh"
|
|
||||||
#include "logfile_sub_source.hh"
|
#include "logfile_sub_source.hh"
|
||||||
#include "plain_text_source.hh"
|
#include "plain_text_source.hh"
|
||||||
#include "text_overlay_menu.hh"
|
#include "text_overlay_menu.hh"
|
||||||
#include "textview_curses.hh"
|
#include "textview_curses.hh"
|
||||||
|
#include "timeline_status_source.hh"
|
||||||
|
|
||||||
class gantt_preview_overlay : public list_overlay_source {
|
class timeline_preview_overlay : public list_overlay_source {
|
||||||
public:
|
public:
|
||||||
std::vector<attr_line_t> list_overlay_menu(const listview_curses& lv,
|
std::vector<attr_line_t> list_overlay_menu(const listview_curses& lv,
|
||||||
vis_line_t line) override;
|
vis_line_t line) override;
|
||||||
};
|
};
|
||||||
|
|
||||||
class gantt_source
|
class timeline_source
|
||||||
: public text_sub_source
|
: public text_sub_source
|
||||||
, public list_input_delegate
|
, public list_input_delegate
|
||||||
, public text_time_translator
|
, public text_time_translator
|
||||||
, public text_delegate {
|
, public text_delegate {
|
||||||
public:
|
public:
|
||||||
explicit gantt_source(textview_curses& log_view,
|
explicit timeline_source(textview_curses& log_view,
|
||||||
logfile_sub_source& lss,
|
logfile_sub_source& lss,
|
||||||
textview_curses& preview_view,
|
textview_curses& preview_view,
|
||||||
plain_text_source& preview_source,
|
plain_text_source& preview_source,
|
||||||
statusview_curses& preview_status_view,
|
statusview_curses& preview_status_view,
|
||||||
gantt_status_source& preview_status_source);
|
timeline_status_source& preview_status_source);
|
||||||
|
|
||||||
bool list_input_handle_key(listview_curses& lv, int ch) override;
|
bool list_input_handle_key(listview_curses& lv, int ch) override;
|
||||||
|
|
||||||
@ -100,7 +100,7 @@ public:
|
|||||||
textview_curses& gs_preview_view;
|
textview_curses& gs_preview_view;
|
||||||
plain_text_source& gs_preview_source;
|
plain_text_source& gs_preview_source;
|
||||||
statusview_curses& gs_preview_status_view;
|
statusview_curses& gs_preview_status_view;
|
||||||
gantt_status_source& gs_preview_status_source;
|
timeline_status_source& gs_preview_status_source;
|
||||||
ArenaAlloc::Alloc<char> gs_allocator{64 * 1024};
|
ArenaAlloc::Alloc<char> gs_allocator{64 * 1024};
|
||||||
|
|
||||||
struct opid_description_def_key {
|
struct opid_description_def_key {
|
||||||
@ -125,13 +125,13 @@ public:
|
|||||||
odd_defs;
|
odd_defs;
|
||||||
};
|
};
|
||||||
|
|
||||||
using gantt_subid_map
|
using timeline_subid_map
|
||||||
= robin_hood::unordered_map<string_fragment,
|
= robin_hood::unordered_map<string_fragment,
|
||||||
bool,
|
bool,
|
||||||
frag_hasher,
|
frag_hasher,
|
||||||
std::equal_to<string_fragment>>;
|
std::equal_to<string_fragment>>;
|
||||||
|
|
||||||
gantt_subid_map gs_subid_map;
|
timeline_subid_map gs_subid_map;
|
||||||
|
|
||||||
struct opid_row {
|
struct opid_row {
|
||||||
string_fragment or_name;
|
string_fragment or_name;
|
||||||
@ -159,22 +159,22 @@ public:
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
using gantt_opid_row_map
|
using timeline_opid_row_map
|
||||||
= robin_hood::unordered_map<string_fragment,
|
= robin_hood::unordered_map<string_fragment,
|
||||||
opid_row,
|
opid_row,
|
||||||
frag_hasher,
|
frag_hasher,
|
||||||
std::equal_to<string_fragment>>;
|
std::equal_to<string_fragment>>;
|
||||||
using gantt_desc_map
|
using timeline_desc_map
|
||||||
= robin_hood::unordered_set<string_fragment,
|
= robin_hood::unordered_set<string_fragment,
|
||||||
frag_hasher,
|
frag_hasher,
|
||||||
std::equal_to<string_fragment>>;
|
std::equal_to<string_fragment>>;
|
||||||
|
|
||||||
gantt_preview_overlay gs_preview_overlay;
|
timeline_preview_overlay gs_preview_overlay;
|
||||||
attr_line_t gs_rendered_line;
|
attr_line_t gs_rendered_line;
|
||||||
size_t gs_opid_width{0};
|
size_t gs_opid_width{0};
|
||||||
size_t gs_total_width{0};
|
size_t gs_total_width{0};
|
||||||
gantt_opid_row_map gs_active_opids;
|
timeline_opid_row_map gs_active_opids;
|
||||||
gantt_desc_map gs_descriptions;
|
timeline_desc_map gs_descriptions;
|
||||||
std::vector<std::reference_wrapper<opid_row>> gs_time_order;
|
std::vector<std::reference_wrapper<opid_row>> gs_time_order;
|
||||||
struct timeval gs_lower_bound {};
|
struct timeval gs_lower_bound {};
|
||||||
struct timeval gs_upper_bound {};
|
struct timeval gs_upper_bound {};
|
||||||
@ -185,9 +185,9 @@ public:
|
|||||||
std::vector<text_time_translator::row_info> gs_preview_rows;
|
std::vector<text_time_translator::row_info> gs_preview_rows;
|
||||||
};
|
};
|
||||||
|
|
||||||
class gantt_header_overlay : public text_overlay_menu {
|
class timeline_header_overlay : public text_overlay_menu {
|
||||||
public:
|
public:
|
||||||
explicit gantt_header_overlay(std::shared_ptr<gantt_source> src);
|
explicit timeline_header_overlay(std::shared_ptr<timeline_source> src);
|
||||||
|
|
||||||
bool list_static_overlay(const listview_curses& lv,
|
bool list_static_overlay(const listview_curses& lv,
|
||||||
int y,
|
int y,
|
||||||
@ -213,7 +213,7 @@ public:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
bool gho_show_details{false};
|
bool gho_show_details{false};
|
||||||
std::shared_ptr<gantt_source> gho_src;
|
std::shared_ptr<timeline_source> gho_src;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
@ -27,14 +27,14 @@
|
|||||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef lnav_gantt_status_source_hh
|
#ifndef lnav_timeline_status_source_hh
|
||||||
#define lnav_gantt_status_source_hh
|
#define lnav_timeline_status_source_hh
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
#include "statusview_curses.hh"
|
#include "statusview_curses.hh"
|
||||||
|
|
||||||
class gantt_status_source : public status_data_source {
|
class timeline_status_source : public status_data_source {
|
||||||
public:
|
public:
|
||||||
typedef enum {
|
typedef enum {
|
||||||
TSF_TITLE,
|
TSF_TITLE,
|
||||||
@ -46,7 +46,7 @@ public:
|
|||||||
TSF__MAX
|
TSF__MAX
|
||||||
} field_t;
|
} field_t;
|
||||||
|
|
||||||
gantt_status_source()
|
timeline_status_source()
|
||||||
{
|
{
|
||||||
this->tss_fields[TSF_TITLE].set_width(16);
|
this->tss_fields[TSF_TITLE].set_width(16);
|
||||||
this->tss_fields[TSF_TITLE].set_role(role_t::VCR_STATUS_TITLE);
|
this->tss_fields[TSF_TITLE].set_role(role_t::VCR_STATUS_TITLE);
|
@ -35,7 +35,6 @@
|
|||||||
#include "document.sections.hh"
|
#include "document.sections.hh"
|
||||||
#include "environ_vtab.hh"
|
#include "environ_vtab.hh"
|
||||||
#include "filter_sub_source.hh"
|
#include "filter_sub_source.hh"
|
||||||
#include "gantt_source.hh"
|
|
||||||
#include "help-md.h"
|
#include "help-md.h"
|
||||||
#include "intervaltree/IntervalTree.h"
|
#include "intervaltree/IntervalTree.h"
|
||||||
#include "lnav.hh"
|
#include "lnav.hh"
|
||||||
@ -47,6 +46,7 @@
|
|||||||
#include "sql_help.hh"
|
#include "sql_help.hh"
|
||||||
#include "sql_util.hh"
|
#include "sql_util.hh"
|
||||||
#include "static_file_vtab.hh"
|
#include "static_file_vtab.hh"
|
||||||
|
#include "timeline_source.hh"
|
||||||
#include "view_helpers.crumbs.hh"
|
#include "view_helpers.crumbs.hh"
|
||||||
#include "view_helpers.examples.hh"
|
#include "view_helpers.examples.hh"
|
||||||
#include "view_helpers.hist.hh"
|
#include "view_helpers.hist.hh"
|
||||||
@ -64,7 +64,7 @@ const char* lnav_view_strings[LNV__MAX + 1] = {
|
|||||||
"schema",
|
"schema",
|
||||||
"pretty",
|
"pretty",
|
||||||
"spectro",
|
"spectro",
|
||||||
"gantt",
|
"timeline",
|
||||||
|
|
||||||
nullptr,
|
nullptr,
|
||||||
};
|
};
|
||||||
@ -78,7 +78,7 @@ const char* lnav_view_titles[LNV__MAX] = {
|
|||||||
"SCHEMA",
|
"SCHEMA",
|
||||||
"PRETTY",
|
"PRETTY",
|
||||||
"SPECTRO",
|
"SPECTRO",
|
||||||
"GANTT",
|
"TIMELINE",
|
||||||
};
|
};
|
||||||
|
|
||||||
std::optional<lnav_view_t>
|
std::optional<lnav_view_t>
|
||||||
@ -128,14 +128,15 @@ open_schema_view()
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
open_gantt_view()
|
open_timeline_view()
|
||||||
{
|
{
|
||||||
auto* gantt_tc = &lnav_data.ld_views[LNV_GANTT];
|
auto* timeline_tc = &lnav_data.ld_views[LNV_TIMELINE];
|
||||||
auto* gantt_src = dynamic_cast<gantt_source*>(gantt_tc->get_sub_source());
|
auto* timeline_src
|
||||||
|
= dynamic_cast<timeline_source*>(timeline_tc->get_sub_source());
|
||||||
|
|
||||||
gantt_src->rebuild_indexes();
|
timeline_src->rebuild_indexes();
|
||||||
gantt_tc->reload_data();
|
timeline_tc->reload_data();
|
||||||
gantt_tc->redo_search();
|
timeline_tc->redo_search();
|
||||||
}
|
}
|
||||||
|
|
||||||
class pretty_sub_source : public plain_text_source {
|
class pretty_sub_source : public plain_text_source {
|
||||||
@ -617,7 +618,7 @@ handle_winch()
|
|||||||
lnav_data.ld_filter_view.set_needs_update();
|
lnav_data.ld_filter_view.set_needs_update();
|
||||||
lnav_data.ld_files_view.set_needs_update();
|
lnav_data.ld_files_view.set_needs_update();
|
||||||
lnav_data.ld_spectro_details_view.set_needs_update();
|
lnav_data.ld_spectro_details_view.set_needs_update();
|
||||||
lnav_data.ld_gantt_details_view.set_needs_update();
|
lnav_data.ld_timeline_details_view.set_needs_update();
|
||||||
lnav_data.ld_user_message_view.set_needs_update();
|
lnav_data.ld_user_message_view.set_needs_update();
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
@ -638,11 +639,11 @@ layout_views()
|
|||||||
= !lnav_data.ld_preview_status_source[1].get_description().empty();
|
= !lnav_data.ld_preview_status_source[1].get_description().empty();
|
||||||
bool filters_supported = false;
|
bool filters_supported = false;
|
||||||
auto is_spectro = false;
|
auto is_spectro = false;
|
||||||
auto is_gantt = false;
|
auto is_timeline = false;
|
||||||
|
|
||||||
lnav_data.ld_view_stack.top() | [&](auto tc) {
|
lnav_data.ld_view_stack.top() | [&](auto tc) {
|
||||||
is_spectro = (tc == &lnav_data.ld_views[LNV_SPECTRO]);
|
is_spectro = (tc == &lnav_data.ld_views[LNV_SPECTRO]);
|
||||||
is_gantt = (tc == &lnav_data.ld_views[LNV_GANTT]);
|
is_timeline = (tc == &lnav_data.ld_views[LNV_TIMELINE]);
|
||||||
|
|
||||||
auto* tss = tc->get_sub_source();
|
auto* tss = tc->get_sub_source();
|
||||||
|
|
||||||
@ -785,19 +786,19 @@ layout_views()
|
|||||||
lnav_data.ld_status[LNS_DOC].set_width(width);
|
lnav_data.ld_status[LNS_DOC].set_width(width);
|
||||||
lnav_data.ld_status[LNS_DOC].set_visible(has_doc && vis);
|
lnav_data.ld_status[LNS_DOC].set_visible(has_doc && vis);
|
||||||
|
|
||||||
if (is_gantt) {
|
if (is_timeline) {
|
||||||
vis = bottom.try_consume(lnav_data.ld_gantt_details_view.get_height()
|
vis = bottom.try_consume(lnav_data.ld_timeline_details_view.get_height()
|
||||||
+ 1);
|
+ 1);
|
||||||
} else {
|
} else {
|
||||||
vis = false;
|
vis = false;
|
||||||
}
|
}
|
||||||
lnav_data.ld_gantt_details_view.set_y(bottom + 1);
|
lnav_data.ld_timeline_details_view.set_y(bottom + 1);
|
||||||
lnav_data.ld_gantt_details_view.set_width(width);
|
lnav_data.ld_timeline_details_view.set_width(width);
|
||||||
lnav_data.ld_gantt_details_view.set_visible(vis);
|
lnav_data.ld_timeline_details_view.set_visible(vis);
|
||||||
|
|
||||||
lnav_data.ld_status[LNS_GANTT].set_y(bottom);
|
lnav_data.ld_status[LNS_TIMELINE].set_y(bottom);
|
||||||
lnav_data.ld_status[LNS_GANTT].set_width(width);
|
lnav_data.ld_status[LNS_TIMELINE].set_width(width);
|
||||||
lnav_data.ld_status[LNS_GANTT].set_visible(vis);
|
lnav_data.ld_status[LNS_TIMELINE].set_visible(vis);
|
||||||
|
|
||||||
vis = bottom.try_consume(filter_height + (config_panel_open ? 1 : 0)
|
vis = bottom.try_consume(filter_height + (config_panel_open ? 1 : 0)
|
||||||
+ (filters_supported ? 1 : 0));
|
+ (filters_supported ? 1 : 0));
|
||||||
@ -1091,7 +1092,7 @@ toggle_view(textview_curses* toggle_tc)
|
|||||||
lnav_data.ld_view_stack.pop_back();
|
lnav_data.ld_view_stack.pop_back();
|
||||||
lnav_data.ld_view_stack.top() | [](auto* tc) {
|
lnav_data.ld_view_stack.top() | [](auto* tc) {
|
||||||
// XXX
|
// XXX
|
||||||
if (tc == &lnav_data.ld_views[LNV_GANTT]) {
|
if (tc == &lnav_data.ld_views[LNV_TIMELINE]) {
|
||||||
auto tss = tc->get_sub_source();
|
auto tss = tc->get_sub_source();
|
||||||
tss->text_filters_changed();
|
tss->text_filters_changed();
|
||||||
tc->reload_data();
|
tc->reload_data();
|
||||||
@ -1107,8 +1108,8 @@ toggle_view(textview_curses* toggle_tc)
|
|||||||
open_schema_view();
|
open_schema_view();
|
||||||
} else if (toggle_tc == &lnav_data.ld_views[LNV_PRETTY]) {
|
} else if (toggle_tc == &lnav_data.ld_views[LNV_PRETTY]) {
|
||||||
open_pretty_view();
|
open_pretty_view();
|
||||||
} else if (toggle_tc == &lnav_data.ld_views[LNV_GANTT]) {
|
} else if (toggle_tc == &lnav_data.ld_views[LNV_TIMELINE]) {
|
||||||
open_gantt_view();
|
open_timeline_view();
|
||||||
} else if (toggle_tc == &lnav_data.ld_views[LNV_HISTOGRAM]) {
|
} else if (toggle_tc == &lnav_data.ld_views[LNV_HISTOGRAM]) {
|
||||||
// Rebuild to reflect changes in marks.
|
// Rebuild to reflect changes in marks.
|
||||||
rebuild_hist();
|
rebuild_hist();
|
||||||
@ -1272,7 +1273,8 @@ get_textview_for_mode(ln_mode_t mode)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
hist_index_delegate::hist_index_delegate(hist_source2& hs, textview_curses& tc)
|
hist_index_delegate::
|
||||||
|
hist_index_delegate(hist_source2& hs, textview_curses& tc)
|
||||||
: hid_source(hs), hid_view(tc)
|
: hid_source(hs), hid_view(tc)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
@ -1466,7 +1468,7 @@ all_views()
|
|||||||
retval.push_back(&lnav_data.ld_filter_view);
|
retval.push_back(&lnav_data.ld_filter_view);
|
||||||
retval.push_back(&lnav_data.ld_user_message_view);
|
retval.push_back(&lnav_data.ld_user_message_view);
|
||||||
retval.push_back(&lnav_data.ld_spectro_details_view);
|
retval.push_back(&lnav_data.ld_spectro_details_view);
|
||||||
retval.push_back(&lnav_data.ld_gantt_details_view);
|
retval.push_back(&lnav_data.ld_timeline_details_view);
|
||||||
retval.push_back(lnav_data.ld_rl_view);
|
retval.push_back(lnav_data.ld_rl_view);
|
||||||
|
|
||||||
return retval;
|
return retval;
|
||||||
|
@ -53,7 +53,7 @@ typedef enum {
|
|||||||
LNV_SCHEMA,
|
LNV_SCHEMA,
|
||||||
LNV_PRETTY,
|
LNV_PRETTY,
|
||||||
LNV_SPECTRO,
|
LNV_SPECTRO,
|
||||||
LNV_GANTT,
|
LNV_TIMELINE,
|
||||||
|
|
||||||
LNV__MAX
|
LNV__MAX
|
||||||
} lnav_view_t;
|
} lnav_view_t;
|
||||||
|
@ -207,7 +207,7 @@ dist_noinst_SCRIPTS = \
|
|||||||
test_events.sh \
|
test_events.sh \
|
||||||
test_format_installer.sh \
|
test_format_installer.sh \
|
||||||
test_format_loader.sh \
|
test_format_loader.sh \
|
||||||
test_gantt.sh \
|
test_timeline.sh \
|
||||||
test_grep_proc.sh \
|
test_grep_proc.sh \
|
||||||
test_json_format.sh \
|
test_json_format.sh \
|
||||||
test_line_buffer.sh \
|
test_line_buffer.sh \
|
||||||
@ -490,7 +490,7 @@ TESTS = \
|
|||||||
test_listview.sh \
|
test_listview.sh \
|
||||||
test_meta.sh \
|
test_meta.sh \
|
||||||
test_mvwattrline.sh \
|
test_mvwattrline.sh \
|
||||||
test_gantt.sh \
|
test_timeline.sh \
|
||||||
test_grep_proc.sh \
|
test_grep_proc.sh \
|
||||||
test_grep_proc2 \
|
test_grep_proc2 \
|
||||||
test_json_format.sh \
|
test_json_format.sh \
|
||||||
|
@ -306,26 +306,6 @@ EXPECTED_FILES = \
|
|||||||
$(srcdir)/%reldir%/test_format_loader.sh_5992e2695b7e6cf1f3520dbb87af8fc2b8f27088.out \
|
$(srcdir)/%reldir%/test_format_loader.sh_5992e2695b7e6cf1f3520dbb87af8fc2b8f27088.out \
|
||||||
$(srcdir)/%reldir%/test_format_loader.sh_fca6c1fb9f3aaa69b3ffb2d1a8a86434b2f4a247.err \
|
$(srcdir)/%reldir%/test_format_loader.sh_fca6c1fb9f3aaa69b3ffb2d1a8a86434b2f4a247.err \
|
||||||
$(srcdir)/%reldir%/test_format_loader.sh_fca6c1fb9f3aaa69b3ffb2d1a8a86434b2f4a247.out \
|
$(srcdir)/%reldir%/test_format_loader.sh_fca6c1fb9f3aaa69b3ffb2d1a8a86434b2f4a247.out \
|
||||||
$(srcdir)/%reldir%/test_gantt.sh_3af11588ee36bab7e2caea0f7a24d3c9cafd2310.err \
|
|
||||||
$(srcdir)/%reldir%/test_gantt.sh_3af11588ee36bab7e2caea0f7a24d3c9cafd2310.out \
|
|
||||||
$(srcdir)/%reldir%/test_gantt.sh_3c2669075d0636fab98e2a67a72613420f22c322.err \
|
|
||||||
$(srcdir)/%reldir%/test_gantt.sh_3c2669075d0636fab98e2a67a72613420f22c322.out \
|
|
||||||
$(srcdir)/%reldir%/test_gantt.sh_63500be50fc6743d8312133e2030cbbc39ca15ff.err \
|
|
||||||
$(srcdir)/%reldir%/test_gantt.sh_63500be50fc6743d8312133e2030cbbc39ca15ff.out \
|
|
||||||
$(srcdir)/%reldir%/test_gantt.sh_740f22814c5d856234c2450168dae22989c85d1e.err \
|
|
||||||
$(srcdir)/%reldir%/test_gantt.sh_740f22814c5d856234c2450168dae22989c85d1e.out \
|
|
||||||
$(srcdir)/%reldir%/test_gantt.sh_74a94ee9103eac5e8e78ca57bccf49efa3827a9d.err \
|
|
||||||
$(srcdir)/%reldir%/test_gantt.sh_74a94ee9103eac5e8e78ca57bccf49efa3827a9d.out \
|
|
||||||
$(srcdir)/%reldir%/test_gantt.sh_83db753dd2669f801810f311e2d7d74397e10f26.err \
|
|
||||||
$(srcdir)/%reldir%/test_gantt.sh_83db753dd2669f801810f311e2d7d74397e10f26.out \
|
|
||||||
$(srcdir)/%reldir%/test_gantt.sh_8fed8a7400042814ba13e50be5e3bd1741d82119.err \
|
|
||||||
$(srcdir)/%reldir%/test_gantt.sh_8fed8a7400042814ba13e50be5e3bd1741d82119.out \
|
|
||||||
$(srcdir)/%reldir%/test_gantt.sh_b013ab41c3cca76cf05a01ca1ba65888be247ada.err \
|
|
||||||
$(srcdir)/%reldir%/test_gantt.sh_b013ab41c3cca76cf05a01ca1ba65888be247ada.out \
|
|
||||||
$(srcdir)/%reldir%/test_gantt.sh_cde7947f361e5f3d4cd1bbc3f7458f426b6a8eb4.err \
|
|
||||||
$(srcdir)/%reldir%/test_gantt.sh_cde7947f361e5f3d4cd1bbc3f7458f426b6a8eb4.out \
|
|
||||||
$(srcdir)/%reldir%/test_gantt.sh_e6a4681a5a671c84c020dc91d7ce03c9d17fde07.err \
|
|
||||||
$(srcdir)/%reldir%/test_gantt.sh_e6a4681a5a671c84c020dc91d7ce03c9d17fde07.out \
|
|
||||||
$(srcdir)/%reldir%/test_json_format.sh_168cac40c27f547044c89d39eb0ff2ef81da4b21.err \
|
$(srcdir)/%reldir%/test_json_format.sh_168cac40c27f547044c89d39eb0ff2ef81da4b21.err \
|
||||||
$(srcdir)/%reldir%/test_json_format.sh_168cac40c27f547044c89d39eb0ff2ef81da4b21.out \
|
$(srcdir)/%reldir%/test_json_format.sh_168cac40c27f547044c89d39eb0ff2ef81da4b21.out \
|
||||||
$(srcdir)/%reldir%/test_json_format.sh_1bb0fd243e916546aea22029245ac590dae17a86.err \
|
$(srcdir)/%reldir%/test_json_format.sh_1bb0fd243e916546aea22029245ac590dae17a86.err \
|
||||||
@ -1330,4 +1310,24 @@ EXPECTED_FILES = \
|
|||||||
$(srcdir)/%reldir%/test_text_file.sh_f586ef080a86dfe1f981b345bcf8d7a279b2b247.out \
|
$(srcdir)/%reldir%/test_text_file.sh_f586ef080a86dfe1f981b345bcf8d7a279b2b247.out \
|
||||||
$(srcdir)/%reldir%/test_text_file.sh_f7522b0a99550a3ff91aae6582eb861547c535e1.err \
|
$(srcdir)/%reldir%/test_text_file.sh_f7522b0a99550a3ff91aae6582eb861547c535e1.err \
|
||||||
$(srcdir)/%reldir%/test_text_file.sh_f7522b0a99550a3ff91aae6582eb861547c535e1.out \
|
$(srcdir)/%reldir%/test_text_file.sh_f7522b0a99550a3ff91aae6582eb861547c535e1.out \
|
||||||
|
$(srcdir)/%reldir%/test_timeline.sh_1a611c8752ca85361f436768a9982051530a5d2a.err \
|
||||||
|
$(srcdir)/%reldir%/test_timeline.sh_1a611c8752ca85361f436768a9982051530a5d2a.out \
|
||||||
|
$(srcdir)/%reldir%/test_timeline.sh_3c2669075d0636fab98e2a67a72613420f22c322.err \
|
||||||
|
$(srcdir)/%reldir%/test_timeline.sh_3c2669075d0636fab98e2a67a72613420f22c322.out \
|
||||||
|
$(srcdir)/%reldir%/test_timeline.sh_3fb943420cd43a6540bcac4702e257dcbbf00cc6.err \
|
||||||
|
$(srcdir)/%reldir%/test_timeline.sh_3fb943420cd43a6540bcac4702e257dcbbf00cc6.out \
|
||||||
|
$(srcdir)/%reldir%/test_timeline.sh_403bc375071bc26f955b317d751a7d65fb433bc7.err \
|
||||||
|
$(srcdir)/%reldir%/test_timeline.sh_403bc375071bc26f955b317d751a7d65fb433bc7.out \
|
||||||
|
$(srcdir)/%reldir%/test_timeline.sh_7f300bf5f67f7ac2b0929990ed2670eea74062d1.err \
|
||||||
|
$(srcdir)/%reldir%/test_timeline.sh_7f300bf5f67f7ac2b0929990ed2670eea74062d1.out \
|
||||||
|
$(srcdir)/%reldir%/test_timeline.sh_92bccfbb9fb45d7ab03934d662cc99ce50c77d8b.err \
|
||||||
|
$(srcdir)/%reldir%/test_timeline.sh_92bccfbb9fb45d7ab03934d662cc99ce50c77d8b.out \
|
||||||
|
$(srcdir)/%reldir%/test_timeline.sh_a3af66b778018a11f912ce81bf8b4437b0ffddd0.err \
|
||||||
|
$(srcdir)/%reldir%/test_timeline.sh_a3af66b778018a11f912ce81bf8b4437b0ffddd0.out \
|
||||||
|
$(srcdir)/%reldir%/test_timeline.sh_c54de09ae2633ee461ff92fdede81e2b36623c27.err \
|
||||||
|
$(srcdir)/%reldir%/test_timeline.sh_c54de09ae2633ee461ff92fdede81e2b36623c27.out \
|
||||||
|
$(srcdir)/%reldir%/test_timeline.sh_c59a35537a919d78245edf21b83f9c0f3e0693dc.err \
|
||||||
|
$(srcdir)/%reldir%/test_timeline.sh_c59a35537a919d78245edf21b83f9c0f3e0693dc.out \
|
||||||
|
$(srcdir)/%reldir%/test_timeline.sh_ced7291b2185772065e32d1add9ce5d4894482a0.err \
|
||||||
|
$(srcdir)/%reldir%/test_timeline.sh_ced7291b2185772065e32d1add9ce5d4894482a0.out \
|
||||||
$()
|
$()
|
||||||
|
@ -9,4 +9,4 @@ db
|
|||||||
schema
|
schema
|
||||||
pretty
|
pretty
|
||||||
spectro
|
spectro
|
||||||
gantt
|
timeline
|
||||||
|
@ -11,43 +11,43 @@ run_cap_test ${lnav_test} -n \
|
|||||||
|
|
||||||
run_cap_test ${lnav_test} -n \
|
run_cap_test ${lnav_test} -n \
|
||||||
-c ";UPDATE all_logs set log_opid = 'test1' where log_line in (1, 3, 6)" \
|
-c ";UPDATE all_logs set log_opid = 'test1' where log_line in (1, 3, 6)" \
|
||||||
-c ':switch-to-view gantt' \
|
-c ':switch-to-view timeline' \
|
||||||
${test_dir}/logfile_glog.0
|
${test_dir}/logfile_glog.0
|
||||||
|
|
||||||
run_cap_test ${lnav_test} -n \
|
run_cap_test ${lnav_test} -n \
|
||||||
-c ':switch-to-view gantt' \
|
-c ':switch-to-view timeline' \
|
||||||
${test_dir}/logfile_generic.0
|
${test_dir}/logfile_generic.0
|
||||||
|
|
||||||
run_cap_test ${lnav_test} -n \
|
run_cap_test ${lnav_test} -n \
|
||||||
-c ':switch-to-view gantt' \
|
-c ':switch-to-view timeline' \
|
||||||
${test_dir}/logfile_bro_http.log.0
|
${test_dir}/logfile_bro_http.log.0
|
||||||
|
|
||||||
run_cap_test ${lnav_test} -n \
|
run_cap_test ${lnav_test} -n \
|
||||||
-c ':switch-to-view gantt' \
|
-c ':switch-to-view timeline' \
|
||||||
-c ':filter-in CdysLK1XpcrXOpVDuh' \
|
-c ':filter-in CdysLK1XpcrXOpVDuh' \
|
||||||
${test_dir}/logfile_bro_http.log.0
|
${test_dir}/logfile_bro_http.log.0
|
||||||
|
|
||||||
run_cap_test ${lnav_test} -n \
|
run_cap_test ${lnav_test} -n \
|
||||||
-c ':switch-to-view gantt' \
|
-c ':switch-to-view timeline' \
|
||||||
-c ':filter-out CdysLK1XpcrXOpVDuh' \
|
-c ':filter-out CdysLK1XpcrXOpVDuh' \
|
||||||
${test_dir}/logfile_bro_http.log.0
|
${test_dir}/logfile_bro_http.log.0
|
||||||
|
|
||||||
run_cap_test ${lnav_test} -n \
|
run_cap_test ${lnav_test} -n \
|
||||||
-c ':switch-to-view gantt' \
|
-c ':switch-to-view timeline' \
|
||||||
-c ':hide-file *' \
|
-c ':hide-file *' \
|
||||||
${test_dir}/logfile_bro_http.log.0
|
${test_dir}/logfile_bro_http.log.0
|
||||||
|
|
||||||
run_cap_test ${lnav_test} -n \
|
run_cap_test ${lnav_test} -n \
|
||||||
-c ':switch-to-view gantt' \
|
-c ':switch-to-view timeline' \
|
||||||
-c ':close *' \
|
-c ':close *' \
|
||||||
${test_dir}/logfile_bro_http.log.0
|
${test_dir}/logfile_bro_http.log.0
|
||||||
|
|
||||||
run_cap_test ${lnav_test} -n \
|
run_cap_test ${lnav_test} -n \
|
||||||
-c ':switch-to-view gantt' \
|
-c ':switch-to-view timeline' \
|
||||||
-c ':hide-lines-before 2011-11-03 00:19:37' \
|
-c ':hide-lines-before 2011-11-03 00:19:37' \
|
||||||
${test_dir}/logfile_bro_http.log.0
|
${test_dir}/logfile_bro_http.log.0
|
||||||
|
|
||||||
run_cap_test ${lnav_test} -n \
|
run_cap_test ${lnav_test} -n \
|
||||||
-c ':switch-to-view gantt' \
|
-c ':switch-to-view timeline' \
|
||||||
-c ':hide-lines-after 2011-11-03 00:20:30' \
|
-c ':hide-lines-after 2011-11-03 00:20:30' \
|
||||||
${test_dir}/logfile_bro_http.log.0
|
${test_dir}/logfile_bro_http.log.0
|
Loading…
Reference in New Issue
Block a user