diff --git a/src/ui/bigtext/logFileModel.py b/src/ui/bigtext/logFileModel.py index 7ec5676..e4ed488 100644 --- a/src/ui/bigtext/logFileModel.py +++ b/src/ui/bigtext/logFileModel.py @@ -21,7 +21,6 @@ class LogFileModel: def __init__(self, file: str, settings: Settings): self.settings = settings self._file = os.path.realpath(file) - # self._lock = threading.RLock() def highlighters(self): return Highlighting.read_config(self.settings) @@ -63,7 +62,6 @@ class LogFileModel: def write_range(self, start_byte: int, end_byte: int, file: str): # print("write range: %d - %d -> %s" % (start_byte, end_byte, file)) - # with self._lock, open(self._file, 'rb') as source, open(file, "w+b") as target: with open(self._file, 'rb') as source, open(file, "w+b") as target: offset = start_byte source.seek(offset) @@ -108,43 +106,37 @@ class LogFileModel: lines_to_find = lines + abs(scroll_lines) lines_to_return = math.ceil(lines) - # with self._lock: - if True: - # TODO handle lines longer than 4096 bytes - # TODO abort file open after a few secons: https://docs.python.org/3/library/signal.html#example - with open(self._file, 'rb') as f: - offset = min(byte_offset, self.byte_count()) - # print("offset: %s byte_count: %d" % (offset, self.byte_count())) - offset = max(0, offset - self.settings.max_line_length()) + # TODO handle lines longer than 4096 bytes + # TODO abort file open after a few secons: https://docs.python.org/3/library/signal.html#example + with open(self._file, 'rb') as f: + offset = min(byte_offset, self.byte_count()) + # print("offset: %s byte_count: %d" % (offset, self.byte_count())) + offset = max(0, offset - self.settings.max_line_length()) - eof_reached = True - f.seek(offset) - while l := f.readline(): - new_offset = f.tell() - line = Line(offset, new_offset, - l.decode("utf8", errors="ignore") # .replace("\r", "").replace("\n", "") - ) - # print("%s %s %s" %(line.byte_offset(), line.line(), line.byte_end())) - if line.byte_end() <= byte_offset: # line.byte_end() returns the end byte +1 - lines_before_offset.append(line) - else: - lines_after_offset.append(line) - offset = f.tell() - if len(lines_after_offset) >= lines_to_find: - eof_reached = False - break + f.seek(offset) + while l := f.readline(): + new_offset = f.tell() + line = Line(offset, new_offset, l.decode("utf8", errors="ignore")) - all_lines = lines_before_offset + lines_after_offset - start = max(0, len(lines_before_offset) + scroll_lines) - if start + lines_to_return - 1 < len(all_lines): - result = all_lines[start:start + lines_to_return] - else: - result = all_lines[-lines_to_return + 1:] + if line.byte_end() <= byte_offset: # line.byte_end() returns the end byte +1 + lines_before_offset.append(line) + else: + lines_after_offset.append(line) + offset = f.tell() + if len(lines_after_offset) >= lines_to_find: + break - # print("returning %s lines" % (len(result))) - # if len(result) > 0: - # print("returning %s %d -> %d" % (result[0].line(), result[0].byte_offset(), result[0].byte_end())) - return result + all_lines = lines_before_offset + lines_after_offset + start = max(0, len(lines_before_offset) + scroll_lines) + if start + lines_to_return - 1 < len(all_lines): + result = all_lines[start:start + lines_to_return] + else: + result = all_lines[-lines_to_return + 1:] + + # print("returning %s lines" % (len(result))) + # if len(result) > 0: + # print("returning %s %d -> %d" % (result[0].line(), result[0].byte_offset(), result[0].byte_end())) + return result def byte_count(self) -> int: size = os.stat(self._file).st_size