/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
1868.1.5 by Jan Balster
benchmarks for "bzr bundle --revision ..-1"
1
# Copyright (C) 2006 by Canonical Ltd
2
#
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.
6
#
7
# This program is distributed in the hope that it will be useful,
8
# but WITHOUT ANY WARRANTY; without even the implied warranty of
9
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
10
# GNU General Public License for more details.
11
#
12
# You should have received a copy of the GNU General Public License
13
# 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
16
"""Tests for bzr bundle performance."""
17
1908.8.1 by Carl Friedrich Bolz
low level bundle tests.
18
19
import os
1908.8.3 by Carl Friedrich Bolz
(cfbolz, hpk): Add caching mechanism and add benchmark for bundle-reading.
20
import shutil
1908.8.1 by Carl Friedrich Bolz
low level bundle tests.
21
from StringIO import StringIO
22
1868.1.5 by Jan Balster
benchmarks for "bzr bundle --revision ..-1"
23
from bzrlib.benchmarks import Benchmark
1908.8.1 by Carl Friedrich Bolz
low level bundle tests.
24
from bzrlib.workingtree import WorkingTree
25
from bzrlib.branch import Branch
26
from bzrlib.bundle.serializer import write_bundle
1908.8.3 by Carl Friedrich Bolz
(cfbolz, hpk): Add caching mechanism and add benchmark for bundle-reading.
27
from bzrlib.bundle import read_bundle
1908.8.1 by Carl Friedrich Bolz
low level bundle tests.
28
from bzrlib.revisionspec import RevisionSpec
1868.1.5 by Jan Balster
benchmarks for "bzr bundle --revision ..-1"
29
1908.8.5 by holger krekel
route more creation code through cached_make
30
# if set, creation of test trees will be globally cached 
31
CACHEDIR = os.path.expanduser("~/.bazaar/devtemp")
32
#CACHEDIR = None 
1908.8.3 by Carl Friedrich Bolz
(cfbolz, hpk): Add caching mechanism and add benchmark for bundle-reading.
33
1908.8.5 by holger krekel
route more creation code through cached_make
34
def cached_make(maker, *args):
35
    if CACHEDIR is None:
36
        return maker(*args)
37
    olddir = os.getcwd()
38
    try:
39
        if not os.path.exists(CACHEDIR):
40
            os.makedirs(CACHEDIR)
41
        os.chdir(CACHEDIR)
42
        cache_name = "_".join([maker.__name__] + [str(x) for x in args])
43
        if not os.path.exists(cache_name):
44
            os.mkdir(cache_name)
45
            os.chdir(cache_name)
46
            try:
47
                maker(*args)
48
            except:
49
                os.chdir(CACHEDIR)
50
                shutil.rmtree(cache_name)
51
                raise
52
            os.chdir(CACHEDIR)
53
                
54
        for subdir in os.listdir(cache_name):
55
            shutil.copytree(os.path.join(cache_name, subdir),
56
                            os.path.join(olddir, subdir))
57
    finally:
58
        os.chdir(olddir)
1868.1.5 by Jan Balster
benchmarks for "bzr bundle --revision ..-1"
59
60
class BundleBenchmark(Benchmark):
61
    """
62
    The bundle tests should (also) be done at a lower level with
63
    direct call to the bzrlib."""
1908.8.5 by holger krekel
route more creation code through cached_make
64
   
65
    def make_kernel_like_tree_committed(self): 
66
        cached_make(self.make_kernel_like_tree)
67
        self.run_bzr('add')
68
        self.run_bzr('commit', '-m', 'initial import')
1908.8.1 by Carl Friedrich Bolz
low level bundle tests.
69
1868.1.5 by Jan Balster
benchmarks for "bzr bundle --revision ..-1"
70
    def test_create_bundle_known_kernel_like_tree(self):
71
        """
72
        Create a bundle for a kernel sized tree with no ignored, unknowns,
73
        or added and one commit.""" 
1908.8.5 by holger krekel
route more creation code through cached_make
74
        cached_make(self.make_kernel_like_tree_committed)
1868.1.5 by Jan Balster
benchmarks for "bzr bundle --revision ..-1"
75
        self.time(self.run_bzr, 'bundle', '--revision', '..-1')
76
77
    def test_create_bundle_many_commit_tree (self):
78
        """
79
        Create a bundle for a tree with many commits but no changes.""" 
1908.8.5 by holger krekel
route more creation code through cached_make
80
        cached_make(self.make_many_commit_tree)
1868.1.5 by Jan Balster
benchmarks for "bzr bundle --revision ..-1"
81
        self.time(self.run_bzr, 'bundle', '--revision', '..-1')
82
83
    def test_create_bundle_heavily_merged_tree(self):
84
        """
85
        Create a bundle for a heavily merged tree.""" 
1908.8.5 by holger krekel
route more creation code through cached_make
86
        cached_make(self.make_heavily_merged_tree)
1868.1.5 by Jan Balster
benchmarks for "bzr bundle --revision ..-1"
87
        self.time(self.run_bzr, 'bundle', '--revision', '..-1')
1908.8.1 by Carl Friedrich Bolz
low level bundle tests.
88
        
1908.3.3 by Carl Friedrich Bolz
Add benchmark for applying a benchmark and fix some formatting/typos.
89
    def test_apply_bundle_known_kernel_like_tree(self):
90
        """
91
        Create a bundle for a kernel sized tree with no ignored, unknowns,
92
        or added and one commit.""" 
1908.8.5 by holger krekel
route more creation code through cached_make
93
        cached_make(self.make_kernel_like_tree_committed)
1908.3.3 by Carl Friedrich Bolz
Add benchmark for applying a benchmark and fix some formatting/typos.
94
        f = file('../bundle', 'wb')
95
        try:
96
            f.write(self.run_bzr('bundle', '--revision', '..-1')[0])
97
        finally:
98
            f.close()
1908.8.5 by holger krekel
route more creation code through cached_make
99
        self.run_bzr("init", "../branch_a")
1908.3.3 by Carl Friedrich Bolz
Add benchmark for applying a benchmark and fix some formatting/typos.
100
        os.chdir('../branch_a')
101
        self.time(self.run_bzr, 'merge', '../bundle')
1908.8.1 by Carl Friedrich Bolz
low level bundle tests.
102
1868.1.5 by Jan Balster
benchmarks for "bzr bundle --revision ..-1"
103
 
1908.8.1 by Carl Friedrich Bolz
low level bundle tests.
104
class BundleLibraryLevelBenchmark(Benchmark):
105
106
    def make_parametrized_tree(self, num_files, num_revisions,
107
                               num_files_in_bundle):
108
        """Create a tree with given parameters. Always creates 2 levels of
109
        directories with the given number of files. Then the given number of
110
        revisions are created, changing some lines in one files in each
111
        revision. Only num_files_in_bundle files are changed in these
112
        revisions.
113
114
        :param num_files: number of files in tree
115
        :param num_revisions: number of revisions
116
        :param num_files_in_bundle: number of files changed in the revisions
117
        """
118
        directories = []
119
        files = []
120
        count = 0
121
        for outer in range(num_files // 64 + 1):
122
            directories.append("%s/" % outer)
123
            for middle in range(8):
124
                prefix = "%s/%s/" % (outer, middle)
125
                directories.append(prefix)
126
                for filename in range(min(8, num_files - count)):
127
                    count += 1
128
                    files.append(prefix + str(filename))
129
        self.run_bzr('init')
130
        self.build_tree(directories + files)
131
        for d in directories:
132
            self.run_bzr('add', d)
133
        self.run_bzr('commit', '-m', 'initial repo layout')
134
        # create revisions
135
        affected_files = files[:num_files_in_bundle]
136
        count = 0
137
        for changes_file in range(num_revisions // num_files_in_bundle + 1):
138
            for f in affected_files:
139
                count += 1
140
                if count >= num_revisions:
141
                    break
142
                content = "\n".join([str(i) for i in range(changes_file)] +
143
                                    [str(changes_file)] * 5) + "\n"
144
                self.build_tree_contents([(f, content)])
145
                self.run_bzr("commit", '-m', 'some changes')
146
        assert count >= num_revisions
147
1908.8.3 by Carl Friedrich Bolz
(cfbolz, hpk): Add caching mechanism and add benchmark for bundle-reading.
148
1908.8.1 by Carl Friedrich Bolz
low level bundle tests.
149
    for treesize, treesize_h in [(5, "small"), (100, "moderate"),
150
                                 (1000, "big")]:
151
        for bundlefiles, bundlefiles_h in [(5, "few"), (100, "some"),
152
                                           (1000, "many")]:
153
            if bundlefiles > treesize:
154
                continue
155
            for num_revisions in [1, 500, 1000]:
156
                code = """
157
def test_%s_files_%s_tree_%s_revision(self):
1908.8.5 by holger krekel
route more creation code through cached_make
158
    cached_make(self.make_parametrized_tree, %s, %s, %s)
1908.8.1 by Carl Friedrich Bolz
low level bundle tests.
159
    branch, _ = Branch.open_containing(".")
160
    revision_history = branch.revision_history()
161
    bundle_text = StringIO()
162
    self.time(write_bundle, branch.repository, revision_history[-1],
1908.8.3 by Carl Friedrich Bolz
(cfbolz, hpk): Add caching mechanism and add benchmark for bundle-reading.
163
              None, bundle_text)
164
    bundle_text.seek(0)
165
    self.time(read_bundle, bundle_text)""" % (
1908.8.1 by Carl Friedrich Bolz
low level bundle tests.
166
                    bundlefiles_h, treesize_h, num_revisions,
167
                    treesize, num_revisions, bundlefiles)
1908.8.3 by Carl Friedrich Bolz
(cfbolz, hpk): Add caching mechanism and add benchmark for bundle-reading.
168
                exec code
169