16
16
"""Tests for bzr bundle performance."""
20
from StringIO import StringIO
18
22
from bzrlib.benchmarks import Benchmark
23
from bzrlib.workingtree import WorkingTree
24
from bzrlib.branch import Branch
25
from bzrlib.bundle.serializer import write_bundle
26
from bzrlib.revisionspec import RevisionSpec
21
29
class BundleBenchmark(Benchmark):
61
70
os.chdir('../branch_a')
62
71
self.time(self.run_bzr, 'merge', '../bundle')
74
class BundleLibraryLevelBenchmark(Benchmark):
76
def make_parametrized_tree(self, num_files, num_revisions,
78
"""Create a tree with given parameters. Always creates 2 levels of
79
directories with the given number of files. Then the given number of
80
revisions are created, changing some lines in one files in each
81
revision. Only num_files_in_bundle files are changed in these
84
:param num_files: number of files in tree
85
:param num_revisions: number of revisions
86
:param num_files_in_bundle: number of files changed in the revisions
92
for outer in range(num_files // 64 + 1):
93
directories.append("%s/" % outer)
94
for middle in range(8):
95
prefix = "%s/%s/" % (outer, middle)
96
directories.append(prefix)
97
for filename in range(min(8, num_files - count)):
99
files.append(prefix + str(filename))
101
self.build_tree(directories + files)
102
for d in directories:
103
self.run_bzr('add', d)
104
self.run_bzr('commit', '-m', 'initial repo layout')
106
affected_files = files[:num_files_in_bundle]
108
for changes_file in range(num_revisions // num_files_in_bundle + 1):
109
for f in affected_files:
111
if count >= num_revisions:
113
content = "\n".join([str(i) for i in range(changes_file)] +
114
[str(changes_file)] * 5) + "\n"
115
self.build_tree_contents([(f, content)])
116
self.run_bzr("commit", '-m', 'some changes')
117
assert count >= num_revisions
119
for treesize, treesize_h in [(5, "small"), (100, "moderate"),
121
for bundlefiles, bundlefiles_h in [(5, "few"), (100, "some"),
123
if bundlefiles > treesize:
125
for num_revisions in [1, 500, 1000]:
127
def test_%s_files_%s_tree_%s_revision(self):
128
self.make_parametrized_tree(%s, %s, %s)
129
branch, _ = Branch.open_containing(".")
130
revision_history = branch.revision_history()
131
bundle_text = StringIO()
132
self.time(write_bundle, branch.repository, revision_history[-1],
133
None, bundle_text)""" % (
134
bundlefiles_h, treesize_h, num_revisions,
135
treesize, num_revisions, bundlefiles)