save a little test program for comparing rcsparse vs rlog output parsing
git-svn-id: http://viewvc.tigris.org/svn/viewvc/trunk@184 8cb11bc2-c004-0410-86c3-e597b4017df7remotes/tags/V0_7
parent
799816c21f
commit
c2a29c83cd
|
@ -0,0 +1,113 @@
|
|||
|
||||
import re
|
||||
import time
|
||||
import string
|
||||
|
||||
import rcsparse
|
||||
import viewcvs
|
||||
|
||||
_re_extract_lines = re.compile('(\\d+)\\s(\\d+)\n')
|
||||
def lines_changed(delta):
|
||||
idx = 0
|
||||
added = deleted = 0
|
||||
while idx < len(delta):
|
||||
op = delta[idx]
|
||||
match = _re_extract_lines.match(delta, idx + 1)
|
||||
line = int(match.group(1))
|
||||
count = int(match.group(2))
|
||||
idx = match.end()
|
||||
if op == 'd':
|
||||
deleted = deleted + count
|
||||
else: # 'a' for adding text
|
||||
added = added + count
|
||||
# skip new text
|
||||
while count > 0:
|
||||
nl = string.find(delta, '\n', idx)
|
||||
assert nl > 0, 'missing a newline in the delta in the RCS file'
|
||||
idx = nl + 1
|
||||
count = count - 1
|
||||
return added, deleted
|
||||
|
||||
_re_trunk_rev = re.compile('^[0-9]+\\.[0-9]+$')
|
||||
class FetchSink(rcsparse.Sink):
|
||||
def __init__(self, which_rev=None):
|
||||
self.head = self.branch = ''
|
||||
self.tags = { }
|
||||
self.meta = { }
|
||||
self.revs = [ ]
|
||||
self.base = { }
|
||||
self.entries = { }
|
||||
self.which = which_rev
|
||||
|
||||
def set_head_revision(self, revision):
|
||||
self.head = revision
|
||||
|
||||
def set_principal_branch(self, branch_name):
|
||||
self.branch = branch_name
|
||||
|
||||
def define_tag(self, name, revision):
|
||||
self.tags[name] = revision
|
||||
|
||||
def define_revision(self, revision, timestamp, author, state,
|
||||
branches, next):
|
||||
self.meta[revision] = (timestamp, author, state)
|
||||
self.base[next] = revision
|
||||
for b in branches:
|
||||
self.base[b] = revision
|
||||
|
||||
def set_revision_info(self, revision, log, text):
|
||||
timestamp, author, state = self.meta[revision]
|
||||
entry = viewcvs.LogEntry(revision, int(timestamp) - time.timezone, author,
|
||||
state, None, log)
|
||||
|
||||
# .revs is "order seen" and .entries is for random access
|
||||
self.revs.append(entry)
|
||||
self.entries[revision] = entry
|
||||
|
||||
if revision != self.head:
|
||||
added, deleted = lines_changed(text)
|
||||
if _re_trunk_rev.match(revision) is None:
|
||||
# on a branch. forward delta.
|
||||
changed = '+%d -%d' % (added, deleted)
|
||||
self.entries[revision].changed = changed
|
||||
else:
|
||||
# on the trunk. reverse delta.
|
||||
changed = '+%d -%d' % (deleted, added)
|
||||
self.entries[self.base[revision]].changed = changed
|
||||
|
||||
def parse_completed(self):
|
||||
if self.which:
|
||||
self.revs = [ self.entries[self.which] ]
|
||||
|
||||
def fetch_log2(full_name, which_rev=None):
|
||||
sink = FetchSink(which_rev)
|
||||
rcsparse.Parser().parse(open(full_name), sink)
|
||||
return sink.head, sink.branch, sink.tags, sink.revs
|
||||
|
||||
def compare_fetch(full_name, which_rev=None):
|
||||
d1 = viewcvs.fetch_log(full_name, which_rev)
|
||||
d2 = fetch_log2(full_name, which_rev)
|
||||
if d1[:3] != d2[:3]:
|
||||
print 'd1:', d1[:3]
|
||||
print 'd2:', d2[:3]
|
||||
return
|
||||
if len(d1[3]) != len(d2[3]):
|
||||
print 'len(d1[3])=%d len(d2[3])=%d' % (len(d1[3]), len(d2[3]))
|
||||
return
|
||||
def sort_func(e, f):
|
||||
return cmp(e.rev, f.rev)
|
||||
d1[3].sort(sort_func)
|
||||
d2[3].sort(sort_func)
|
||||
import pprint
|
||||
for i in range(len(d1[3])):
|
||||
if vars(d1[3][i]) != vars(d2[3][i]):
|
||||
pprint.pprint((i, vars(d1[3][i]), vars(d2[3][i])))
|
||||
|
||||
def time_fetch(full_name, which_rev=None):
|
||||
t = time.time()
|
||||
viewcvs.fetch_log(full_name, which_rev)
|
||||
t1 = time.time() - t
|
||||
t = time.time()
|
||||
fetch_log2(full_name, which_rev)
|
||||
t2 = time.time() - t
|
||||
print t1, t2
|
Loading…
Reference in New Issue