21
21
from bzrlib.benchmarks import Benchmark
22
22
from bzrlib.log import log_formatter, show_log
23
23
from bzrlib.osutils import pathjoin
24
from cStringIO import StringIO
24
from StringIO import StringIO
25
25
from bzrlib.transform import TreeTransform
26
26
from bzrlib.workingtree import WorkingTree
28
class LinesDone(Exception):
31
class LineConsumer(object):
33
def __init__(self, required_lines):
34
self.required_lines = required_lines
36
def write(self, text):
37
self.required_lines -= text.count('\n')
38
if self.required_lines < 0:
42
28
class LogBenchmark(Benchmark):
44
30
def test_log(self):
45
"""Run log in a many-commit tree."""
31
"""Canonicalizing paths should be fast."""
46
32
tree = self.make_many_commit_tree()
47
33
lf = log_formatter('long', to_file=StringIO())
48
34
self.time(show_log, tree.branch, lf, direction='reverse')
50
def test_log_screenful(self):
51
"""Simulate log --long|less"""
52
self.screenful_tester('long')
54
def test_log_screenful_line(self):
55
"""Simulate log --line|less"""
56
self.screenful_tester('line')
58
def test_log_screenful_short(self):
59
"""Simulate log --short|less"""
60
self.screenful_tester('short')
62
def screenful_tester(self, formatter):
63
"""Run show_log, but stop after 25 lines are generated"""
64
tree = self.make_many_commit_tree()
66
lf = log_formatter(formatter, to_file=LineConsumer(25))
68
show_log(tree.branch, lf, direction='reverse')
72
raise Exception, "LinesDone not raised"
73
self.time(log_screenful)
75
def test_cmd_log(self):
76
"""Test execution of the log command."""
77
tree = self.make_many_commit_tree()
78
self.time(self.run_bzr, 'log', '-r', '-4..')
80
def test_cmd_log_subprocess(self):
81
"""Text startup and execution of the log command."""
82
tree = self.make_many_commit_tree()
83
self.time(self.run_bzr_subprocess, 'log', '-r', '-4..')