annotate MoinMoin/logfile/__init__.py @ 3426:79dd730d6455

common.css: added yellow and orange as background color
author Reimar Bauer <rb.proj AT googlemail DOT com>
date Sat, 29 Mar 2008 13:07:53 +0100
parents a48929a5036c
children 94a6f5fbf8b7
rev   line source
0
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
1 # -*- coding: iso-8859-1 -*-
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
2 """
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
3 MoinMoin - LogFile package
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
4
1818
df984fe11783 logfile: cleanup/fix base class, fixes also EditLog.news result
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1646
diff changeset
5 This module supports buffered log reads, iterating forward and backward line-by-line, etc.
df984fe11783 logfile: cleanup/fix base class, fixes also EditLog.news result
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1646
diff changeset
6
1918
bb2e053067fb fixing copyright headers: remove umlauts (encoding troubles), make epydoc compatible, reformat
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1856
diff changeset
7 @copyright: 2005-2007 MoinMoin:ThomasWaldmann
0
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
8 @license: GNU GPL, see COPYING for details.
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
9 """
3107
c6e39279f83b refactor logging usage
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3098
diff changeset
10
3110
a48929a5036c logging: make it work correctly by doing logging configuration very early
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3107
diff changeset
11 from MoinMoin import log
a48929a5036c logging: make it work correctly by doing logging configuration very early
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 3107
diff changeset
12 logging = log.getLogger(__name__)
0
77665d8e2254 tag of nonpublic@localhost--archive/moin--enterprise--1.5--base-0
Thomas Waldmann <tw-public@gmx.de>
parents:
diff changeset
13
749
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
14 import os, codecs, errno
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
15 from MoinMoin import config, wikiutil
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
16
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
17 class LogError(Exception):
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
18 """ Base class for log errors """
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
19
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
20 class LogMissing(LogError):
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
21 """ Raised when the log is missing """
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
22
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
23
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
24 class LineBuffer:
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
25 """
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
26 Reads lines from a file
1818
df984fe11783 logfile: cleanup/fix base class, fixes also EditLog.news result
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1646
diff changeset
27 self.len number of lines in self.lines
2286
01f05e74aa9c Big PEP8 and whitespace cleanup
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 2049
diff changeset
28 self.lines list of lines (unicode)
1818
df984fe11783 logfile: cleanup/fix base class, fixes also EditLog.news result
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1646
diff changeset
29 self.offsets list of file offsets for each line. additionally the position
df984fe11783 logfile: cleanup/fix base class, fixes also EditLog.news result
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1646
diff changeset
30 after the last read line is stored into self.offsets[-1]
749
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
31 """
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
32 def __init__(self, file, offset, size, forward=True):
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
33 """
2286
01f05e74aa9c Big PEP8 and whitespace cleanup
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 2049
diff changeset
34
1986
3475126f78c6 fix some builtin names used as attribute names
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1920
diff changeset
35 TODO: when this gets refactored, don't use "file" (is a builtin)
3475126f78c6 fix some builtin names used as attribute names
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1920
diff changeset
36
749
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
37 @param file: open file object
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
38 @param offset: position in file to start from
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
39 @param size: aproximate number of bytes to read
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
40 @param forward : read from offset on or from offset-size to offset
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
41 @type forward: boolean
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
42 """
1855
472566340cd8 logfile: more flexible logging
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1838
diff changeset
43 self.loglevel = logging.NOTSET
749
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
44 if forward:
1818
df984fe11783 logfile: cleanup/fix base class, fixes also EditLog.news result
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1646
diff changeset
45 begin = offset
1855
472566340cd8 logfile: more flexible logging
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1838
diff changeset
46 logging.log(self.loglevel, "LineBuffer.init: forward seek %d read %d" % (begin, size))
1818
df984fe11783 logfile: cleanup/fix base class, fixes also EditLog.news result
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1646
diff changeset
47 file.seek(begin)
df984fe11783 logfile: cleanup/fix base class, fixes also EditLog.news result
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1646
diff changeset
48 lines = file.readlines(size)
749
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
49 else:
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
50 if offset < 2 * size:
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
51 begin = 0
1818
df984fe11783 logfile: cleanup/fix base class, fixes also EditLog.news result
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1646
diff changeset
52 size = offset
749
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
53 else:
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
54 begin = offset - size
1855
472566340cd8 logfile: more flexible logging
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1838
diff changeset
55 logging.log(self.loglevel, "LineBuffer.init: backward seek %d read %d" % (begin, size))
749
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
56 file.seek(begin)
1818
df984fe11783 logfile: cleanup/fix base class, fixes also EditLog.news result
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1646
diff changeset
57 lines = file.read(size).splitlines(True)
749
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
58 if begin != 0:
1818
df984fe11783 logfile: cleanup/fix base class, fixes also EditLog.news result
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1646
diff changeset
59 # remove potentially incomplete first line
df984fe11783 logfile: cleanup/fix base class, fixes also EditLog.news result
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1646
diff changeset
60 begin += len(lines[0])
df984fe11783 logfile: cleanup/fix base class, fixes also EditLog.news result
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1646
diff changeset
61 lines = lines[1:]
749
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
62 # XXX check for min one line read
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
63
1818
df984fe11783 logfile: cleanup/fix base class, fixes also EditLog.news result
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1646
diff changeset
64 linecount = len(lines)
df984fe11783 logfile: cleanup/fix base class, fixes also EditLog.news result
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1646
diff changeset
65
df984fe11783 logfile: cleanup/fix base class, fixes also EditLog.news result
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1646
diff changeset
66 # now calculate the file offsets of all read lines
df984fe11783 logfile: cleanup/fix base class, fixes also EditLog.news result
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1646
diff changeset
67 offsets = [len(line) for line in lines]
df984fe11783 logfile: cleanup/fix base class, fixes also EditLog.news result
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1646
diff changeset
68 offsets.append(0) # later this element will have the file offset after the last read line
df984fe11783 logfile: cleanup/fix base class, fixes also EditLog.news result
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1646
diff changeset
69
df984fe11783 logfile: cleanup/fix base class, fixes also EditLog.news result
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1646
diff changeset
70 lengthpreviousline = 0
df984fe11783 logfile: cleanup/fix base class, fixes also EditLog.news result
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1646
diff changeset
71 offset = begin
df984fe11783 logfile: cleanup/fix base class, fixes also EditLog.news result
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1646
diff changeset
72 for i in xrange(linecount+1):
df984fe11783 logfile: cleanup/fix base class, fixes also EditLog.news result
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1646
diff changeset
73 offset += lengthpreviousline
df984fe11783 logfile: cleanup/fix base class, fixes also EditLog.news result
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1646
diff changeset
74 lengthpreviousline = offsets[i]
df984fe11783 logfile: cleanup/fix base class, fixes also EditLog.news result
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1646
diff changeset
75 offsets[i] = offset
df984fe11783 logfile: cleanup/fix base class, fixes also EditLog.news result
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1646
diff changeset
76
df984fe11783 logfile: cleanup/fix base class, fixes also EditLog.news result
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1646
diff changeset
77 self.offsets = offsets
df984fe11783 logfile: cleanup/fix base class, fixes also EditLog.news result
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1646
diff changeset
78 self.len = linecount
df984fe11783 logfile: cleanup/fix base class, fixes also EditLog.news result
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1646
diff changeset
79 # Decode lines after offset in file is calculated
df984fe11783 logfile: cleanup/fix base class, fixes also EditLog.news result
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1646
diff changeset
80 self.lines = [unicode(line, config.charset) for line in lines]
749
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
81
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
82
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
83 class LogFile:
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
84 """
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
85 .filter: function that gets the values from .parser.
1818
df984fe11783 logfile: cleanup/fix base class, fixes also EditLog.news result
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1646
diff changeset
86 must return True to keep it or False to remove it
df984fe11783 logfile: cleanup/fix base class, fixes also EditLog.news result
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1646
diff changeset
87 Overwrite .parser() and .add() to customize this class to special log files
749
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
88 """
1000
6f6fcbe200b5 whitespace-only cleanup and minor style changes
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 749
diff changeset
89
1838
e1d4cc010dec Reduced log file buffer to 4 kB.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 1825
diff changeset
90 def __init__(self, filename, buffer_size=4096):
749
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
91 """
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
92 @param filename: name of the log file
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
93 @param buffer_size: approx. size of one buffer in bytes
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
94 """
1855
472566340cd8 logfile: more flexible logging
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1838
diff changeset
95 self.loglevel = logging.NOTSET
749
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
96 self.__filename = filename
1818
df984fe11783 logfile: cleanup/fix base class, fixes also EditLog.news result
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1646
diff changeset
97 self.__buffer = None # currently used buffer, points to one of the following:
749
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
98 self.__buffer1 = None
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
99 self.__buffer2 = None
1818
df984fe11783 logfile: cleanup/fix base class, fixes also EditLog.news result
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1646
diff changeset
100 self.buffer_size = buffer_size
df984fe11783 logfile: cleanup/fix base class, fixes also EditLog.news result
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1646
diff changeset
101 self.__lineno = 0
df984fe11783 logfile: cleanup/fix base class, fixes also EditLog.news result
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1646
diff changeset
102 self.filter = None
749
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
103
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
104 def __iter__(self):
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
105 return self
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
106
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
107 def reverse(self):
1818
df984fe11783 logfile: cleanup/fix base class, fixes also EditLog.news result
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1646
diff changeset
108 """ yield log entries in reverse direction starting from last one
2286
01f05e74aa9c Big PEP8 and whitespace cleanup
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 2049
diff changeset
109
1818
df984fe11783 logfile: cleanup/fix base class, fixes also EditLog.news result
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1646
diff changeset
110 @rtype: iterator
749
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
111 """
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
112 self.to_end()
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
113 while 1:
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
114 try:
1855
472566340cd8 logfile: more flexible logging
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1838
diff changeset
115 logging.log(self.loglevel, "LogFile.reverse %s" % self.__filename)
749
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
116 result = self.previous()
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
117 except StopIteration:
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
118 return
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
119 yield result
1000
6f6fcbe200b5 whitespace-only cleanup and minor style changes
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 749
diff changeset
120
749
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
121 def sanityCheck(self):
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
122 """ Check for log file write access.
2286
01f05e74aa9c Big PEP8 and whitespace cleanup
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 2049
diff changeset
123
749
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
124 @rtype: string (error message) or None
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
125 """
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
126 if not os.access(self.__filename, os.W_OK):
2286
01f05e74aa9c Big PEP8 and whitespace cleanup
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 2049
diff changeset
127 return "The log '%s' is not writable!" % (self.__filename, )
749
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
128 return None
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
129
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
130 def __getattr__(self, name):
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
131 """
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
132 generate some attributes when needed
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
133 """
1825
738bb2ec6b7f partially reverted changeset 1820, the code WAS used
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1820
diff changeset
134 if name == "_LogFile__rel_index": # Python black magic: this is the real name of the __rel_index attribute
738bb2ec6b7f partially reverted changeset 1820, the code WAS used
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1820
diff changeset
135 # starting iteration from begin
738bb2ec6b7f partially reverted changeset 1820, the code WAS used
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1820
diff changeset
136 self.__buffer1 = LineBuffer(self._input, 0, self.buffer_size)
738bb2ec6b7f partially reverted changeset 1820, the code WAS used
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1820
diff changeset
137 self.__buffer2 = LineBuffer(self._input,
738bb2ec6b7f partially reverted changeset 1820, the code WAS used
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1820
diff changeset
138 self.__buffer1.offsets[-1],
738bb2ec6b7f partially reverted changeset 1820, the code WAS used
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1820
diff changeset
139 self.buffer_size)
738bb2ec6b7f partially reverted changeset 1820, the code WAS used
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1820
diff changeset
140 self.__buffer = self.__buffer1
738bb2ec6b7f partially reverted changeset 1820, the code WAS used
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1820
diff changeset
141 self.__rel_index = 0
738bb2ec6b7f partially reverted changeset 1820, the code WAS used
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1820
diff changeset
142 return 0
738bb2ec6b7f partially reverted changeset 1820, the code WAS used
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1820
diff changeset
143 elif name == "_input":
749
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
144 try:
1818
df984fe11783 logfile: cleanup/fix base class, fixes also EditLog.news result
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1646
diff changeset
145 # Open the file (NOT using codecs.open, it breaks our offset calculation. We decode it later.).
df984fe11783 logfile: cleanup/fix base class, fixes also EditLog.news result
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1646
diff changeset
146 # Use binary mode in order to retain \r - otherwise the offset calculation would fail.
2286
01f05e74aa9c Big PEP8 and whitespace cleanup
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 2049
diff changeset
147 self._input = file(self.__filename, "rb", )
2044
967d529b31e9 workaround for initially non-existing edit-log, remove edit-log from repo
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1986
diff changeset
148 except IOError, err:
3098
a67e104828d1 fix logfile code for EACCESS errors (does not hide them, just logs and re-raises now)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 2286
diff changeset
149 if err.errno == errno.ENOENT: # "file not found"
a67e104828d1 fix logfile code for EACCESS errors (does not hide them, just logs and re-raises now)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 2286
diff changeset
150 # XXX workaround if edit-log does not exist: just create it empty
a67e104828d1 fix logfile code for EACCESS errors (does not hide them, just logs and re-raises now)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 2286
diff changeset
151 # if this workaround raises another error, we don't catch
a67e104828d1 fix logfile code for EACCESS errors (does not hide them, just logs and re-raises now)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 2286
diff changeset
152 # it, so the admin will see it.
a67e104828d1 fix logfile code for EACCESS errors (does not hide them, just logs and re-raises now)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 2286
diff changeset
153 f = file(self.__filename, "ab")
a67e104828d1 fix logfile code for EACCESS errors (does not hide them, just logs and re-raises now)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 2286
diff changeset
154 f.write('')
a67e104828d1 fix logfile code for EACCESS errors (does not hide them, just logs and re-raises now)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 2286
diff changeset
155 f.close()
a67e104828d1 fix logfile code for EACCESS errors (does not hide them, just logs and re-raises now)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 2286
diff changeset
156 self._input = file(self.__filename, "rb", )
a67e104828d1 fix logfile code for EACCESS errors (does not hide them, just logs and re-raises now)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 2286
diff changeset
157 else:
a67e104828d1 fix logfile code for EACCESS errors (does not hide them, just logs and re-raises now)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 2286
diff changeset
158 logging.error("logfile: %r IOERROR errno %d (%s)" % (self.__filename, err.errno, os.strerror(err.errno)))
a67e104828d1 fix logfile code for EACCESS errors (does not hide them, just logs and re-raises now)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 2286
diff changeset
159 raise
749
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
160 return self._input
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
161 elif name == "_output":
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
162 self._output = codecs.open(self.__filename, 'a', config.charset)
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
163 return self._output
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
164 else:
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
165 raise AttributeError(name)
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
166
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
167 def size(self):
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
168 """ Return log size in bytes
2286
01f05e74aa9c Big PEP8 and whitespace cleanup
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 2049
diff changeset
169
749
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
170 Return 0 if the file does not exists. Raises other OSError.
2286
01f05e74aa9c Big PEP8 and whitespace cleanup
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 2049
diff changeset
171
749
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
172 @return: size of log file in bytes
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
173 @rtype: Int
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
174 """
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
175 try:
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
176 return os.path.getsize(self.__filename)
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
177 except OSError, err:
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
178 if err.errno == errno.ENOENT:
1000
6f6fcbe200b5 whitespace-only cleanup and minor style changes
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 749
diff changeset
179 return 0
749
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
180 raise
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
181
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
182 def lines(self):
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
183 """ Return number of lines in the log file
2286
01f05e74aa9c Big PEP8 and whitespace cleanup
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 2049
diff changeset
184
749
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
185 Return 0 if the file does not exists. Raises other OSError.
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
186
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
187 Expensive for big log files - O(n)
2286
01f05e74aa9c Big PEP8 and whitespace cleanup
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 2049
diff changeset
188
749
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
189 @return: size of log file in lines
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
190 @rtype: Int
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
191 """
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
192 try:
1818
df984fe11783 logfile: cleanup/fix base class, fixes also EditLog.news result
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1646
diff changeset
193 f = file(self.__filename, 'r')
749
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
194 try:
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
195 count = 0
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
196 for line in f:
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
197 count += 1
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
198 return count
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
199 finally:
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
200 f.close()
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
201 except (OSError, IOError), err:
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
202 if err.errno == errno.ENOENT:
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
203 return 0
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
204 raise
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
205
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
206 def date(self):
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
207 """ Return timestamp of log file in usecs """
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
208 try:
1000
6f6fcbe200b5 whitespace-only cleanup and minor style changes
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 749
diff changeset
209 mtime = os.path.getmtime(self.__filename)
749
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
210 except OSError, err:
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
211 if err.errno == errno.ENOENT:
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
212 # This can happen on fresh wiki when building the index
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
213 # Usually the first request will create an event log
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
214 raise LogMissing(str(err))
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
215 raise
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
216 return wikiutil.timestamp2version(mtime)
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
217
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
218 def peek(self, lines):
1818
df984fe11783 logfile: cleanup/fix base class, fixes also EditLog.news result
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1646
diff changeset
219 """ Move position in file forward or backwards by "lines" count
df984fe11783 logfile: cleanup/fix base class, fixes also EditLog.news result
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1646
diff changeset
220
df984fe11783 logfile: cleanup/fix base class, fixes also EditLog.news result
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1646
diff changeset
221 It adjusts .__lineno if set.
df984fe11783 logfile: cleanup/fix base class, fixes also EditLog.news result
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1646
diff changeset
222 This function is not aware of filters!
749
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
223
2286
01f05e74aa9c Big PEP8 and whitespace cleanup
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 2049
diff changeset
224 @param lines: number of lines, may be negative to move backward
749
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
225 @rtype: boolean
1818
df984fe11783 logfile: cleanup/fix base class, fixes also EditLog.news result
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1646
diff changeset
226 @return: True if moving more than to the beginning and moving
df984fe11783 logfile: cleanup/fix base class, fixes also EditLog.news result
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1646
diff changeset
227 to the end or beyond
749
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
228 """
1855
472566340cd8 logfile: more flexible logging
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1838
diff changeset
229 logging.log(self.loglevel, "LogFile.peek %s" % self.__filename)
1818
df984fe11783 logfile: cleanup/fix base class, fixes also EditLog.news result
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1646
diff changeset
230 self.__rel_index += lines
749
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
231 while self.__rel_index < 0:
1646
2fbb179f3518 use filepos in (not mtime of) edit-log for editlog.news, fix some bugs in logfile
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1317
diff changeset
232 if self.__buffer is self.__buffer2:
1856
72ef28ba79b1 logfile: bugfixes and improved handling of some special cases
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1855
diff changeset
233 if self.__buffer.offsets[0] == 0:
72ef28ba79b1 logfile: bugfixes and improved handling of some special cases
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1855
diff changeset
234 # already at the beginning of the file
72ef28ba79b1 logfile: bugfixes and improved handling of some special cases
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1855
diff changeset
235 self.__rel_index = 0
72ef28ba79b1 logfile: bugfixes and improved handling of some special cases
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1855
diff changeset
236 self.__lineno = 0
72ef28ba79b1 logfile: bugfixes and improved handling of some special cases
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1855
diff changeset
237 return True
72ef28ba79b1 logfile: bugfixes and improved handling of some special cases
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1855
diff changeset
238 else:
72ef28ba79b1 logfile: bugfixes and improved handling of some special cases
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1855
diff changeset
239 # change to buffer 1
72ef28ba79b1 logfile: bugfixes and improved handling of some special cases
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1855
diff changeset
240 self.__buffer = self.__buffer1
72ef28ba79b1 logfile: bugfixes and improved handling of some special cases
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1855
diff changeset
241 self.__rel_index += self.__buffer.len
1818
df984fe11783 logfile: cleanup/fix base class, fixes also EditLog.news result
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1646
diff changeset
242 else: # self.__buffer is self.__buffer1
749
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
243 if self.__buffer.offsets[0] == 0:
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
244 # already at the beginning of the file
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
245 self.__rel_index = 0
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
246 self.__lineno = 0
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
247 return True
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
248 else:
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
249 # load previous lines
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
250 self.__buffer2 = self.__buffer1
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
251 self.__buffer1 = LineBuffer(self._input,
1818
df984fe11783 logfile: cleanup/fix base class, fixes also EditLog.news result
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1646
diff changeset
252 self.__buffer.offsets[0],
749
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
253 self.buffer_size,
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
254 forward=False)
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
255 self.__buffer = self.__buffer1
1818
df984fe11783 logfile: cleanup/fix base class, fixes also EditLog.news result
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1646
diff changeset
256 self.__rel_index += self.__buffer.len
1000
6f6fcbe200b5 whitespace-only cleanup and minor style changes
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 749
diff changeset
257
749
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
258 while self.__rel_index >= self.__buffer.len:
1646
2fbb179f3518 use filepos in (not mtime of) edit-log for editlog.news, fix some bugs in logfile
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1317
diff changeset
259 if self.__buffer is self.__buffer1:
749
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
260 # change to buffer 2
1818
df984fe11783 logfile: cleanup/fix base class, fixes also EditLog.news result
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1646
diff changeset
261 self.__rel_index -= self.__buffer.len
749
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
262 self.__buffer = self.__buffer2
1818
df984fe11783 logfile: cleanup/fix base class, fixes also EditLog.news result
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1646
diff changeset
263 else: # self.__buffer is self.__buffer2
749
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
264 # try to load next buffer
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
265 tmpbuff = LineBuffer(self._input,
1818
df984fe11783 logfile: cleanup/fix base class, fixes also EditLog.news result
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1646
diff changeset
266 self.__buffer.offsets[-1],
749
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
267 self.buffer_size)
1000
6f6fcbe200b5 whitespace-only cleanup and minor style changes
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 749
diff changeset
268 if tmpbuff.len == 0:
749
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
269 # end of file
1818
df984fe11783 logfile: cleanup/fix base class, fixes also EditLog.news result
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1646
diff changeset
270 if self.__lineno is not None:
df984fe11783 logfile: cleanup/fix base class, fixes also EditLog.news result
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1646
diff changeset
271 self.__lineno += (lines -
df984fe11783 logfile: cleanup/fix base class, fixes also EditLog.news result
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1646
diff changeset
272 (self.__rel_index - self.__buffer.len))
1646
2fbb179f3518 use filepos in (not mtime of) edit-log for editlog.news, fix some bugs in logfile
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1317
diff changeset
273 self.__rel_index = self.__buffer.len # point to after last read line
749
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
274 return True
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
275 # shift buffers
1818
df984fe11783 logfile: cleanup/fix base class, fixes also EditLog.news result
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1646
diff changeset
276 self.__rel_index -= self.__buffer.len
749
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
277 self.__buffer1 = self.__buffer2
1000
6f6fcbe200b5 whitespace-only cleanup and minor style changes
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 749
diff changeset
278 self.__buffer2 = tmpbuff
1818
df984fe11783 logfile: cleanup/fix base class, fixes also EditLog.news result
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1646
diff changeset
279 self.__buffer = self.__buffer2
df984fe11783 logfile: cleanup/fix base class, fixes also EditLog.news result
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1646
diff changeset
280
df984fe11783 logfile: cleanup/fix base class, fixes also EditLog.news result
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1646
diff changeset
281 if self.__lineno is not None:
1920
b06ef2a53efa 'make pylint', fixed lots of minor stuff found by pylint (and there is still lots left to do)
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1918
diff changeset
282 self.__lineno += lines
749
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
283 return False
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
284
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
285 def __next(self):
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
286 """get next line already parsed"""
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
287 if self.peek(0):
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
288 raise StopIteration
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
289 result = self.parser(self.__buffer.lines[self.__rel_index])
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
290 self.peek(1)
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
291 return result
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
292
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
293 def next(self):
1818
df984fe11783 logfile: cleanup/fix base class, fixes also EditLog.news result
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1646
diff changeset
294 """get next line that passes through the filter
749
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
295 @return: next entry
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
296 raises StopIteration at file end
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
297 """
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
298 result = None
1000
6f6fcbe200b5 whitespace-only cleanup and minor style changes
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 749
diff changeset
299 while result is None:
6f6fcbe200b5 whitespace-only cleanup and minor style changes
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 749
diff changeset
300 while result is None:
1855
472566340cd8 logfile: more flexible logging
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1838
diff changeset
301 logging.log(self.loglevel, "LogFile.next %s" % self.__filename)
749
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
302 result = self.__next()
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
303 if self.filter and not self.filter(result):
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
304 result = None
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
305 return result
1000
6f6fcbe200b5 whitespace-only cleanup and minor style changes
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 749
diff changeset
306
749
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
307 def __previous(self):
1818
df984fe11783 logfile: cleanup/fix base class, fixes also EditLog.news result
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1646
diff changeset
308 """get previous line already parsed"""
1000
6f6fcbe200b5 whitespace-only cleanup and minor style changes
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 749
diff changeset
309 if self.peek(-1):
6f6fcbe200b5 whitespace-only cleanup and minor style changes
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 749
diff changeset
310 raise StopIteration
749
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
311 return self.parser(self.__buffer.lines[self.__rel_index])
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
312
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
313 def previous(self):
1818
df984fe11783 logfile: cleanup/fix base class, fixes also EditLog.news result
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1646
diff changeset
314 """get previous line that passes through the filter
df984fe11783 logfile: cleanup/fix base class, fixes also EditLog.news result
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1646
diff changeset
315 @return: previous entry
749
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
316 raises StopIteration at file begin
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
317 """
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
318 result = None
1000
6f6fcbe200b5 whitespace-only cleanup and minor style changes
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 749
diff changeset
319 while result is None:
6f6fcbe200b5 whitespace-only cleanup and minor style changes
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 749
diff changeset
320 while result is None:
1855
472566340cd8 logfile: more flexible logging
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1838
diff changeset
321 logging.log(self.loglevel, "LogFile.previous %s" % self.__filename)
749
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
322 result = self.__previous()
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
323 if self.filter and not self.filter(result):
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
324 result = None
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
325 return result
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
326
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
327 def to_begin(self):
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
328 """moves file position to the begin"""
1855
472566340cd8 logfile: more flexible logging
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1838
diff changeset
329 logging.log(self.loglevel, "LogFile.to_begin %s" % self.__filename)
1820
9595d9d5e5ae logfile: removed some unused code, added some checks
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1818
diff changeset
330 if self.__buffer1 is None or self.__buffer1.offsets[0] != 0:
749
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
331 self.__buffer1 = LineBuffer(self._input,
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
332 0,
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
333 self.buffer_size)
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
334 self.__buffer2 = LineBuffer(self._input,
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
335 self.__buffer1.offsets[-1],
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
336 self.buffer_size)
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
337 self.__buffer = self.__buffer1
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
338 self.__rel_index = 0
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
339 self.__lineno = 0
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
340
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
341 def to_end(self):
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
342 """moves file position to the end"""
1855
472566340cd8 logfile: more flexible logging
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1838
diff changeset
343 logging.log(self.loglevel, "LogFile.to_end %s" % self.__filename)
749
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
344 self._input.seek(0, 2) # to end of file
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
345 size = self._input.tell()
1820
9595d9d5e5ae logfile: removed some unused code, added some checks
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1818
diff changeset
346 if self.__buffer2 is None or size > self.__buffer2.offsets[-1]:
749
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
347 self.__buffer2 = LineBuffer(self._input,
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
348 size,
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
349 self.buffer_size,
1000
6f6fcbe200b5 whitespace-only cleanup and minor style changes
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 749
diff changeset
350 forward=False)
6f6fcbe200b5 whitespace-only cleanup and minor style changes
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 749
diff changeset
351
749
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
352 self.__buffer1 = LineBuffer(self._input,
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
353 self.__buffer2.offsets[0],
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
354 self.buffer_size,
1000
6f6fcbe200b5 whitespace-only cleanup and minor style changes
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 749
diff changeset
355 forward=False)
749
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
356 self.__buffer = self.__buffer2
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
357 self.__rel_index = self.__buffer2.len
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
358 self.__lineno = None
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
359
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
360 def position(self):
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
361 """ Return the current file position
2286
01f05e74aa9c Big PEP8 and whitespace cleanup
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 2049
diff changeset
362
1818
df984fe11783 logfile: cleanup/fix base class, fixes also EditLog.news result
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1646
diff changeset
363 This can be converted into a String using back-ticks and then be rebuild.
749
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
364 For this plain file implementation position is an Integer.
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
365 """
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
366 return self.__buffer.offsets[self.__rel_index]
1000
6f6fcbe200b5 whitespace-only cleanup and minor style changes
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 749
diff changeset
367
749
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
368 def seek(self, position, line_no=None):
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
369 """ moves file position to an value formerly gotten from .position().
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
370 To enable line counting line_no must be provided.
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
371 .seek is much more efficient for moving long distances than .peek.
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
372 raises ValueError if position is invalid
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
373 """
1855
472566340cd8 logfile: more flexible logging
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1838
diff changeset
374 logging.log(self.loglevel, "LogFile.seek %s pos %d" % (self.__filename, position))
472566340cd8 logfile: more flexible logging
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1838
diff changeset
375 if self.__buffer1:
472566340cd8 logfile: more flexible logging
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1838
diff changeset
376 logging.log(self.loglevel, "b1 %r %r" % (self.__buffer1.offsets[0], self.__buffer1.offsets[-1]))
472566340cd8 logfile: more flexible logging
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1838
diff changeset
377 if self.__buffer2:
472566340cd8 logfile: more flexible logging
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1838
diff changeset
378 logging.log(self.loglevel, "b2 %r %r" % (self.__buffer2.offsets[0], self.__buffer2.offsets[-1]))
1646
2fbb179f3518 use filepos in (not mtime of) edit-log for editlog.news, fix some bugs in logfile
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1317
diff changeset
379 if self.__buffer1 and self.__buffer1.offsets[0] <= position < self.__buffer1.offsets[-1]:
2286
01f05e74aa9c Big PEP8 and whitespace cleanup
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 2049
diff changeset
380 # position is in .__buffer1
749
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
381 self.__rel_index = self.__buffer1.offsets.index(position)
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
382 self.__buffer = self.__buffer1
1646
2fbb179f3518 use filepos in (not mtime of) edit-log for editlog.news, fix some bugs in logfile
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1317
diff changeset
383 elif self.__buffer2 and self.__buffer2.offsets[0] <= position < self.__buffer2.offsets[-1]:
749
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
384 # position is in .__buffer2
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
385 self.__rel_index = self.__buffer2.offsets.index(position)
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
386 self.__buffer = self.__buffer2
1856
72ef28ba79b1 logfile: bugfixes and improved handling of some special cases
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1855
diff changeset
387 elif self.__buffer1 and self.__buffer1.offsets[-1] == position:
72ef28ba79b1 logfile: bugfixes and improved handling of some special cases
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1855
diff changeset
388 # we already have one buffer directly before where we want to go
72ef28ba79b1 logfile: bugfixes and improved handling of some special cases
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1855
diff changeset
389 self.__buffer2 = LineBuffer(self._input,
72ef28ba79b1 logfile: bugfixes and improved handling of some special cases
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1855
diff changeset
390 position,
2286
01f05e74aa9c Big PEP8 and whitespace cleanup
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 2049
diff changeset
391 self.buffer_size)
1856
72ef28ba79b1 logfile: bugfixes and improved handling of some special cases
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1855
diff changeset
392 self.__buffer = self.__buffer2
72ef28ba79b1 logfile: bugfixes and improved handling of some special cases
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1855
diff changeset
393 self.__rel_index = 0
72ef28ba79b1 logfile: bugfixes and improved handling of some special cases
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1855
diff changeset
394 elif self.__buffer2 and self.__buffer2.offsets[-1] == position:
72ef28ba79b1 logfile: bugfixes and improved handling of some special cases
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1855
diff changeset
395 # we already have one buffer directly before where we want to go
72ef28ba79b1 logfile: bugfixes and improved handling of some special cases
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1855
diff changeset
396 self.__buffer1 = self.__buffer2
72ef28ba79b1 logfile: bugfixes and improved handling of some special cases
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1855
diff changeset
397 self.__buffer2 = LineBuffer(self._input,
72ef28ba79b1 logfile: bugfixes and improved handling of some special cases
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1855
diff changeset
398 position,
2286
01f05e74aa9c Big PEP8 and whitespace cleanup
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 2049
diff changeset
399 self.buffer_size)
1856
72ef28ba79b1 logfile: bugfixes and improved handling of some special cases
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1855
diff changeset
400 self.__buffer = self.__buffer2
72ef28ba79b1 logfile: bugfixes and improved handling of some special cases
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 1855
diff changeset
401 self.__rel_index = 0
749
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
402 else:
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
403 # load buffers around position
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
404 self.__buffer1 = LineBuffer(self._input,
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
405 position,
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
406 self.buffer_size,
1000
6f6fcbe200b5 whitespace-only cleanup and minor style changes
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 749
diff changeset
407 forward=False)
749
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
408 self.__buffer2 = LineBuffer(self._input,
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
409 position,
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
410 self.buffer_size)
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
411 self.__buffer = self.__buffer2
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
412 self.__rel_index = 0
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
413 # XXX test for valid position
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
414 self.__lineno = line_no
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
415
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
416 def line_no(self):
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
417 """@return: the current line number or None if line number is unknown"""
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
418 return self.__lineno
1000
6f6fcbe200b5 whitespace-only cleanup and minor style changes
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 749
diff changeset
419
749
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
420 def calculate_line_no(self):
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
421 """ Calculate the current line number from buffer offsets
2286
01f05e74aa9c Big PEP8 and whitespace cleanup
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 2049
diff changeset
422
749
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
423 If line number is unknown it is calculated by parsing the whole file.
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
424 This may be expensive.
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
425 """
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
426 self._input.seek(0, 0)
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
427 lines = self._input.read(self.__buffer.offsets[self.__rel_index])
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
428 self.__lineno = len(lines.splitlines())
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
429 return self.__lineno
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
430
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
431 def parser(self, line):
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
432 """
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
433 @param line: line as read from file
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
434 @return: parsed line or None on error
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
435 Converts the line from file to program representation
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
436 This implementation uses TAB separated strings.
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
437 This method should be overwritten by the sub classes.
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
438 """
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
439 return line.split("\t")
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
440
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
441 def add(self, *data):
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
442 """
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
443 add line to log file
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
444 This implementation save the values as TAB separated strings.
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
445 This method should be overwritten by the sub classes.
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
446 """
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
447 line = "\t".join(data)
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
448 self._add(line)
1000
6f6fcbe200b5 whitespace-only cleanup and minor style changes
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 749
diff changeset
449
749
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
450 def _add(self, line):
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
451 """
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
452 @param line: flat line
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
453 @type line: String
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
454 write on entry in the log file
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
455 """
1000
6f6fcbe200b5 whitespace-only cleanup and minor style changes
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 749
diff changeset
456 if line is not None:
749
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
457 if line[-1] != '\n':
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
458 line += '\n'
3dba26fcfde0 moved logfile/logfile.py to logfile/__init__.py
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 0
diff changeset
459 self._output.write(line)
2049
94af8c2afeb0 make logfile damage happen less often
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 2044
diff changeset
460 self._output.close() # does this maybe help against the sporadic fedora wikis 160 \0 bytes in the edit-log?
94af8c2afeb0 make logfile damage happen less often
Thomas Waldmann <tw AT waldmann-edv DOT de>
parents: 2044
diff changeset
461 del self._output # re-open the output file automagically