@@ -342,8 +342,7 @@ def run_scan(self, save_merge: str | None = None) -> None:
342342 def merge_log_files (self ) -> None :
343343 worker = get_current_worker ()
344344 self ._merge_lines = []
345- merge_lines : list [tuple [float , int , LogFile ]] = self ._merge_lines
346- append_meta = merge_lines .append
345+ merge_lines = self ._merge_lines
347346
348347 for log_file in self .log_files :
349348 try :
@@ -363,13 +362,17 @@ def merge_log_files(self) -> None:
363362 for log_file in self .log_files :
364363 if not log_file .is_open :
365364 continue
366- append = self ._line_breaks [log_file ].append
365+ line_breaks = self ._line_breaks [log_file ]
366+ append = line_breaks .append
367+ meta : list [tuple [float , int , LogFile ]] = []
368+ append_meta = meta .append
367369 for timestamps in log_file .scan_timestamps ():
368370 break_position = 0
371+
369372 for line_no , break_position , timestamp in timestamps :
370- if break_position :
371- append_meta (( timestamp , line_no , log_file ) )
372- append (break_position )
373+ append_meta (( timestamp , line_no , log_file ))
374+ append ( break_position )
375+ append (log_file . size )
373376
374377 self .post_message (
375378 ScanProgress (
@@ -383,6 +386,20 @@ def merge_log_files(self) -> None:
383386 )
384387 return
385388
389+ # Header may be missing timestamp, so we will attempt to back fill timestamps
390+ seconds = 0.0
391+ for offset , (seconds , line_no , log_file ) in enumerate (meta ):
392+ if seconds :
393+ for index , (_seconds , line_no , log_file ) in zip (
394+ range (offset ), meta
395+ ):
396+ meta [index ] = (seconds , line_no , log_file )
397+ break
398+ if offset > 10 :
399+ # May be pointless to scan the entire thing
400+ break
401+ self ._merge_lines .extend (meta )
402+
386403 position += log_file .size
387404
388405 merge_lines .sort (key = itemgetter (0 , 1 ))
@@ -447,11 +464,12 @@ def get_log_file_from_index(self, index: int) -> tuple[LogFile, int]:
447464 def index_to_span (self , index : int ) -> tuple [LogFile , int , int ]:
448465 log_file , index = self .get_log_file_from_index (index )
449466 line_breaks = self ._line_breaks .setdefault (log_file , [])
467+ scan_start = 0 if self ._merge_lines else self ._scan_start
450468 if not line_breaks :
451- return (log_file , self . _scan_start , self ._scan_start )
469+ return (log_file , scan_start , self ._scan_start )
452470 index = clamp (index , 0 , len (line_breaks ))
453471 if index == 0 :
454- return (log_file , self . _scan_start , line_breaks [0 ])
472+ return (log_file , scan_start , line_breaks [0 ])
455473 start = line_breaks [index - 1 ]
456474 end = (
457475 line_breaks [index ]
0 commit comments