~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/benchmarks/bench_log.py

  • Committer: Martin Pool
  • Date: 2009-09-14 01:19:11 UTC
  • mto: This revision was merged to the branch mainline in revision 4688.
  • Revision ID: mbp@sourcefrog.net-20090914011911-llu9ujul97k8f8s7
News for fix of 406113

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2006 by Canonical Ltd
 
1
# Copyright (C) 2006 Canonical Ltd
2
2
#
3
3
# This program is free software; you can redistribute it and/or modify
4
 
# it under the terms of the GNU General Public License version 2 as published by
5
 
# the Free Software Foundation.
 
4
# it under the terms of the GNU General Public License as published by
 
5
# the Free Software Foundation; either version 2 of the License, or
 
6
# (at your option) any later version.
6
7
#
7
8
# This program is distributed in the hope that it will be useful,
8
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
11
12
#
12
13
# You should have received a copy of the GNU General Public License
13
14
# along with this program; if not, write to the Free Software
14
 
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
15
16
 
16
17
"""Tests for tree transform performance"""
17
18
 
25
26
from bzrlib.transform import TreeTransform
26
27
from bzrlib.workingtree import WorkingTree
27
28
 
 
29
 
28
30
class LinesDone(Exception):
 
31
    """Raised when `LineConsumer` reaches the required number of lines."""
29
32
    pass
30
33
 
 
34
 
31
35
class LineConsumer(object):
 
36
    """Count lines that are produced.
 
37
 
 
38
    When the required number of lines have been reached, raise `LinesDone`.
 
39
    """
32
40
 
33
41
    def __init__(self, required_lines):
 
42
        """Create a new consumer.
 
43
 
 
44
        :param required_lines: How many lines must be produced.
 
45
        :type required_lines: integer
 
46
        """
34
47
        self.required_lines = required_lines
35
48
 
36
49
    def write(self, text):
 
50
        """Write some text to the black hole.
 
51
 
 
52
        But count how many lines have been written.
 
53
 
 
54
        :param text: A string that would be written.
 
55
        :raise LinesDone: when the required number of lines has been reached.
 
56
        :return: None
 
57
        """
37
58
        self.required_lines -= text.count('\n')
38
59
        if self.required_lines < 0:
39
60
            raise LinesDone()
40
 
        
 
61
 
41
62
 
42
63
class LogBenchmark(Benchmark):
 
64
    """Benchmarks for ``'bzr log'`` performance."""
43
65
 
44
66
    def test_log(self):
45
 
        """Run log in a many-commit tree.""" 
46
 
        tree = self.make_many_commit_tree()
 
67
        """Run log in a many-commit tree."""
 
68
        tree = self.make_many_commit_tree(hardlink=True)
47
69
        lf = log_formatter('long', to_file=StringIO())
48
70
        self.time(show_log, tree.branch, lf, direction='reverse')
49
71
 
50
72
    def test_merge_log(self):
51
73
        """Run log in a tree with many merges"""
52
 
        tree = self.make_heavily_merged_tree()
 
74
        tree = self.make_heavily_merged_tree(hardlink=True)
53
75
        lf = log_formatter('short', to_file=StringIO())
54
76
        self.time(show_log, tree.branch, lf, direction='reverse')
55
77
 
67
89
 
68
90
    def screenful_tester(self, formatter):
69
91
        """Run show_log, but stop after 25 lines are generated"""
70
 
        tree = self.make_many_commit_tree()
 
92
        tree = self.make_many_commit_tree(hardlink=True)
71
93
        def log_screenful():
72
94
            lf = log_formatter(formatter, to_file=LineConsumer(25))
73
95
            try:
79
101
        self.time(log_screenful)
80
102
 
81
103
    def test_cmd_log(self):
82
 
        """Test execution of the log command.""" 
83
 
        tree = self.make_many_commit_tree()
84
 
        self.time(self.run_bzr, 'log', '-r', '-4..')
 
104
        """Test execution of the log command."""
 
105
        tree = self.make_many_commit_tree(hardlink=True)
 
106
        self.time(self.run_bzr, ['log', '-r', '-4..'])
85
107
 
86
108
    def test_cmd_log_subprocess(self):
87
 
        """Text startup and execution of the log command.""" 
88
 
        tree = self.make_many_commit_tree()
 
109
        """Text startup and execution of the log command."""
 
110
        tree = self.make_many_commit_tree(hardlink=True)
89
111
        self.time(self.run_bzr_subprocess, 'log', '-r', '-4..')
90
112
 
91
113
    def test_log_verbose(self):
92
114
        """'verbose' log -- shows file changes"""
93
 
        tree = self.make_many_commit_tree()
 
115
        tree = self.make_many_commit_tree(hardlink=True)
94
116
        lf = log_formatter('long', to_file=StringIO())
95
117
        self.time(show_log, tree.branch, lf, direction='reverse', verbose=True)