1
# Copyright (C) 2007-2012 Canonical Ltd
3
# This program is free software; you can redistribute it and/or modify
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.
8
# This program is distributed in the hope that it will be useful,
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11
# GNU General Public License for more details.
13
# You should have received a copy of the GNU General Public License
14
# along with this program; if not, write to the Free Software
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20
branch as _mod_branch,
25
repository as _mod_repository,
29
class TestInfo(tests.TestCaseWithTransport):
31
def test_describe_standalone_layout(self):
32
tree = self.make_branch_and_tree('tree')
33
self.assertEqual('Empty control directory', info.describe_layout())
35
'Unshared repository with trees and colocated branches',
36
info.describe_layout(tree.branch.repository, control=tree.bzrdir))
37
tree.branch.repository.set_make_working_trees(False)
38
self.assertEqual('Unshared repository with colocated branches',
39
info.describe_layout(tree.branch.repository, control=tree.bzrdir))
40
self.assertEqual('Standalone branch',
41
info.describe_layout(tree.branch.repository, tree.branch,
43
self.assertEqual('Standalone branchless tree',
44
info.describe_layout(tree.branch.repository, None, tree,
46
self.assertEqual('Standalone tree',
47
info.describe_layout(tree.branch.repository, tree.branch, tree,
49
tree.branch.bind(tree.branch)
50
self.assertEqual('Bound branch',
51
info.describe_layout(tree.branch.repository, tree.branch,
53
self.assertEqual('Checkout',
54
info.describe_layout(tree.branch.repository, tree.branch, tree,
56
checkout = tree.branch.create_checkout('checkout', lightweight=True)
57
self.assertEqual('Lightweight checkout',
58
info.describe_layout(checkout.branch.repository, checkout.branch,
59
checkout, control=tree.bzrdir))
61
def test_describe_repository_layout(self):
62
repository = self.make_repository('.', shared=True)
63
tree = controldir.ControlDir.create_branch_convenience('tree',
64
force_new_tree=True).bzrdir.open_workingtree()
65
self.assertEqual('Shared repository with trees and colocated branches',
66
info.describe_layout(tree.branch.repository, control=tree.bzrdir))
67
repository.set_make_working_trees(False)
68
self.assertEqual('Shared repository with colocated branches',
69
info.describe_layout(tree.branch.repository, control=tree.bzrdir))
70
self.assertEqual('Repository branch',
71
info.describe_layout(tree.branch.repository, tree.branch,
73
self.assertEqual('Repository branchless tree',
74
info.describe_layout(tree.branch.repository, None, tree,
76
self.assertEqual('Repository tree',
77
info.describe_layout(tree.branch.repository, tree.branch, tree,
79
tree.branch.bind(tree.branch)
80
self.assertEqual('Repository checkout',
81
info.describe_layout(tree.branch.repository, tree.branch, tree,
83
checkout = tree.branch.create_checkout('checkout', lightweight=True)
84
self.assertEqual('Lightweight checkout',
85
info.describe_layout(checkout.branch.repository, checkout.branch,
86
checkout, control=tree.bzrdir))
88
def assertTreeDescription(self, format):
89
"""Assert a tree's format description matches expectations"""
90
self.make_branch_and_tree('%s_tree' % format, format=format)
91
tree = workingtree.WorkingTree.open('%s_tree' % format)
92
self.assertEqual(format, info.describe_format(tree.bzrdir,
93
tree.branch.repository, tree.branch, tree))
95
def assertCheckoutDescription(self, format, expected=None):
96
"""Assert a checkout's format description matches expectations"""
99
branch = self.make_branch('%s_cobranch' % format, format=format)
100
# this ought to be easier...
101
branch.create_checkout('%s_co' % format,
102
lightweight=True).bzrdir.destroy_workingtree()
103
control = controldir.ControlDir.open('%s_co' % format)
104
old_format = control._format.workingtree_format
106
control._format.workingtree_format = \
107
controldir.format_registry.make_bzrdir(format).workingtree_format
108
control.create_workingtree()
109
tree = workingtree.WorkingTree.open('%s_co' % format)
110
format_description = info.describe_format(tree.bzrdir,
111
tree.branch.repository, tree.branch, tree)
112
self.assertEqual(expected, format_description,
113
"checkout of format called %r was described as %r" %
114
(expected, format_description))
116
control._format.workingtree_format = old_format
118
def assertBranchDescription(self, format, expected=None):
119
"""Assert branch's format description matches expectations"""
122
self.make_branch('%s_branch' % format, format=format)
123
branch = _mod_branch.Branch.open('%s_branch' % format)
124
self.assertEqual(expected, info.describe_format(branch.bzrdir,
125
branch.repository, branch, None))
127
def assertRepoDescription(self, format, expected=None):
128
"""Assert repository's format description matches expectations"""
131
self.make_repository('%s_repo' % format, format=format)
132
repo = _mod_repository.Repository.open('%s_repo' % format)
133
self.assertEqual(expected, info.describe_format(repo.bzrdir,
136
def test_describe_tree_format(self):
137
for key in controldir.format_registry.keys():
138
if key in controldir.format_registry.aliases():
140
self.assertTreeDescription(key)
142
def test_describe_checkout_format(self):
143
for key in controldir.format_registry.keys():
144
if key in controldir.format_registry.aliases():
145
# Aliases will not describe correctly in the UI because the
146
# real format is found.
148
# legacy: weave does not support checkouts
151
if controldir.format_registry.get_info(key).experimental:
152
# We don't require that experimental formats support checkouts
153
# or describe correctly in the UI.
155
if controldir.format_registry.get_info(key).hidden:
158
if key in ('pack-0.92',):
159
expected = 'pack-0.92'
160
elif key in ('knit', 'metaweave'):
161
if 'metaweave' in controldir.format_registry:
162
expected = 'knit or metaweave'
165
elif key in ('1.14', '1.14-rich-root'):
166
expected = '1.14 or 1.14-rich-root'
167
self.assertCheckoutDescription(key, expected)
169
def test_describe_branch_format(self):
170
for key in controldir.format_registry.keys():
171
if key in controldir.format_registry.aliases():
173
if controldir.format_registry.get_info(key).hidden:
176
if key in ('dirstate', 'knit'):
177
expected = 'dirstate or knit'
178
elif key in ('1.14',):
180
elif key in ('1.14-rich-root',):
181
expected = '1.14-rich-root'
182
self.assertBranchDescription(key, expected)
184
def test_describe_repo_format(self):
185
for key in controldir.format_registry.keys():
186
if key in controldir.format_registry.aliases():
188
if controldir.format_registry.get_info(key).hidden:
191
if key in ('dirstate', 'knit', 'dirstate-tags'):
192
expected = 'dirstate or dirstate-tags or knit'
193
elif key in ('1.14',):
195
elif key in ('1.14-rich-root',):
196
expected = '1.14-rich-root'
197
self.assertRepoDescription(key, expected)
199
format = controldir.format_registry.make_bzrdir('knit')
200
format.set_branch_format(_mod_branch.BzrBranchFormat6())
201
tree = self.make_branch_and_tree('unknown', format=format)
202
self.assertEqual('unnamed', info.describe_format(tree.bzrdir,
203
tree.branch.repository, tree.branch, tree))
205
def test_gather_location_controldir_only(self):
206
bzrdir = self.make_bzrdir('.')
207
self.assertEqual([('control directory', bzrdir.user_url)],
208
info.gather_location_info(control=bzrdir))
210
def test_gather_location_standalone(self):
211
tree = self.make_branch_and_tree('tree')
212
self.assertEqual([('branch root', tree.bzrdir.root_transport.base)],
213
info.gather_location_info(
214
tree.branch.repository, tree.branch, tree, control=tree.bzrdir))
215
self.assertEqual([('branch root', tree.bzrdir.root_transport.base)],
216
info.gather_location_info(
217
tree.branch.repository, tree.branch, control=tree.bzrdir))
220
def test_gather_location_repo(self):
221
srepo = self.make_repository('shared', shared=True)
223
[('shared repository', srepo.bzrdir.root_transport.base)],
224
info.gather_location_info(srepo, control=srepo.bzrdir))
225
urepo = self.make_repository('unshared')
227
[('repository', urepo.bzrdir.root_transport.base)],
228
info.gather_location_info(urepo, control=urepo.bzrdir))
230
def test_gather_location_repo_branch(self):
231
srepo = self.make_repository('shared', shared=True)
233
[('shared repository', srepo.bzrdir.root_transport.base)],
234
info.gather_location_info(srepo, control=srepo.bzrdir))
235
tree = self.make_branch_and_tree('shared/tree')
237
[('shared repository', srepo.bzrdir.root_transport.base),
238
('repository branch', tree.branch.base)],
239
info.gather_location_info(srepo, tree.branch, tree, srepo.bzrdir))
241
def test_gather_location_light_checkout(self):
242
tree = self.make_branch_and_tree('tree')
243
lcheckout = tree.branch.create_checkout('lcheckout', lightweight=True)
245
[('light checkout root', lcheckout.bzrdir.root_transport.base),
246
('checkout of branch', tree.bzrdir.root_transport.base)],
247
self.gather_tree_location_info(lcheckout))
249
def test_gather_location_heavy_checkout(self):
250
tree = self.make_branch_and_tree('tree')
251
checkout = tree.branch.create_checkout('checkout')
253
[('checkout root', checkout.bzrdir.root_transport.base),
254
('checkout of branch', tree.bzrdir.root_transport.base)],
255
self.gather_tree_location_info(checkout))
256
light_checkout = checkout.branch.create_checkout('light_checkout',
259
[('light checkout root',
260
light_checkout.bzrdir.root_transport.base),
261
('checkout root', checkout.bzrdir.root_transport.base),
262
('checkout of branch', tree.bzrdir.root_transport.base)],
263
self.gather_tree_location_info(light_checkout)
266
def test_gather_location_shared_repo_checkout(self):
267
tree = self.make_branch_and_tree('tree')
268
srepo = self.make_repository('shared', shared=True)
269
shared_checkout = tree.branch.create_checkout('shared/checkout')
271
[('repository checkout root',
272
shared_checkout.bzrdir.root_transport.base),
273
('checkout of branch', tree.bzrdir.root_transport.base),
274
('shared repository', srepo.bzrdir.root_transport.base)],
275
self.gather_tree_location_info(shared_checkout))
277
def gather_tree_location_info(self, tree):
278
return info.gather_location_info(
279
tree.branch.repository, tree.branch, tree, tree.bzrdir)
281
def test_gather_location_bound(self):
282
branch = self.make_branch('branch')
283
bound_branch = self.make_branch('bound_branch')
284
bound_branch.bind(branch)
286
[('branch root', bound_branch.bzrdir.root_transport.base),
287
('bound to branch', branch.bzrdir.root_transport.base)],
288
info.gather_location_info(
289
bound_branch.repository, bound_branch, control=bound_branch.bzrdir)
292
def test_gather_location_bound_in_repository(self):
293
repo = self.make_repository('repo', shared=True)
294
repo.set_make_working_trees(False)
295
branch = self.make_branch('branch')
296
bound_branch = controldir.ControlDir.create_branch_convenience(
298
bound_branch.bind(branch)
300
[('shared repository', bound_branch.repository.bzrdir.user_url),
301
('repository branch', bound_branch.bzrdir.user_url),
302
('bound to branch', branch.bzrdir.user_url)],
303
info.gather_location_info(bound_branch.repository, bound_branch)
306
def test_location_list(self):
307
if sys.platform == 'win32':
308
raise tests.TestSkipped('Windows-unfriendly test')
309
locs = info.LocationList('/home/foo')
310
locs.add_url('a', 'file:///home/foo/')
311
locs.add_url('b', 'file:///home/foo/bar/')
312
locs.add_url('c', 'file:///home/bar/bar')
313
locs.add_url('d', 'http://example.com/example/')
314
locs.add_url('e', None)
315
self.assertEqual(locs.locs, [('a', '.'),
317
('c', '/home/bar/bar'),
318
('d', 'http://example.com/example/')])
319
self.assertEqualDiff(' a: .\n b: bar\n c: /home/bar/bar\n'
320
' d: http://example.com/example/\n',
321
''.join(locs.get_lines()))
323
def test_gather_related_braches(self):
324
branch = self.make_branch('.')
327
branch.set_public_branch('baz')
328
branch.set_push_location('bar')
329
branch.set_parent('foo')
330
branch.set_submit_branch('qux')
334
[('public branch', 'baz'), ('push branch', 'bar'),
335
('parent branch', 'foo'), ('submit branch', 'qux')],
336
info._gather_related_branches(branch).locs)