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,
26
repository as _mod_repository,
29
branch as _mod_bzrbranch,
33
class TestInfo(tests.TestCaseWithTransport):
35
def test_describe_standalone_layout(self):
36
tree = self.make_branch_and_tree('tree')
37
self.assertEqual('Empty control directory', info.describe_layout())
39
'Unshared repository with trees and colocated branches',
40
info.describe_layout(tree.branch.repository, control=tree.controldir))
41
tree.branch.repository.set_make_working_trees(False)
42
self.assertEqual('Unshared repository with colocated branches',
43
info.describe_layout(tree.branch.repository, control=tree.controldir))
44
self.assertEqual('Standalone branch',
45
info.describe_layout(tree.branch.repository, tree.branch,
46
control=tree.controldir))
47
self.assertEqual('Standalone branchless tree',
48
info.describe_layout(tree.branch.repository, None, tree,
49
control=tree.controldir))
50
self.assertEqual('Standalone tree',
51
info.describe_layout(tree.branch.repository, tree.branch, tree,
52
control=tree.controldir))
53
tree.branch.bind(tree.branch)
54
self.assertEqual('Bound branch',
55
info.describe_layout(tree.branch.repository, tree.branch,
56
control=tree.controldir))
57
self.assertEqual('Checkout',
58
info.describe_layout(tree.branch.repository, tree.branch, tree,
59
control=tree.controldir))
60
checkout = tree.branch.create_checkout('checkout', lightweight=True)
61
self.assertEqual('Lightweight checkout',
62
info.describe_layout(checkout.branch.repository, checkout.branch,
63
checkout, control=tree.controldir))
65
def test_describe_repository_layout(self):
66
repository = self.make_repository('.', shared=True)
67
tree = controldir.ControlDir.create_branch_convenience('tree',
68
force_new_tree=True).controldir.open_workingtree()
69
self.assertEqual('Shared repository with trees and colocated branches',
70
info.describe_layout(tree.branch.repository, control=tree.controldir))
71
repository.set_make_working_trees(False)
72
self.assertEqual('Shared repository with colocated branches',
73
info.describe_layout(tree.branch.repository, control=tree.controldir))
74
self.assertEqual('Repository branch',
75
info.describe_layout(tree.branch.repository, tree.branch,
76
control=tree.controldir))
77
self.assertEqual('Repository branchless tree',
78
info.describe_layout(tree.branch.repository, None, tree,
79
control=tree.controldir))
80
self.assertEqual('Repository tree',
81
info.describe_layout(tree.branch.repository, tree.branch, tree,
82
control=tree.controldir))
83
tree.branch.bind(tree.branch)
84
self.assertEqual('Repository checkout',
85
info.describe_layout(tree.branch.repository, tree.branch, tree,
86
control=tree.controldir))
87
checkout = tree.branch.create_checkout('checkout', lightweight=True)
88
self.assertEqual('Lightweight checkout',
89
info.describe_layout(checkout.branch.repository, checkout.branch,
90
checkout, control=tree.controldir))
92
def assertTreeDescription(self, format):
93
"""Assert a tree's format description matches expectations"""
94
self.make_branch_and_tree('%s_tree' % format, format=format)
95
tree = workingtree.WorkingTree.open('%s_tree' % format)
96
self.assertEqual(format, info.describe_format(tree.controldir,
97
tree.branch.repository, tree.branch, tree))
99
def assertCheckoutDescription(self, format, expected=None):
100
"""Assert a checkout's format description matches expectations"""
103
branch = self.make_branch('%s_cobranch' % format, format=format)
104
# this ought to be easier...
105
branch.create_checkout('%s_co' % format,
106
lightweight=True).controldir.destroy_workingtree()
107
control = controldir.ControlDir.open('%s_co' % format)
108
old_format = control._format.workingtree_format
110
control._format.workingtree_format = \
111
controldir.format_registry.make_controldir(format).workingtree_format
112
control.create_workingtree()
113
tree = workingtree.WorkingTree.open('%s_co' % format)
114
format_description = info.describe_format(tree.controldir,
115
tree.branch.repository, tree.branch, tree)
116
self.assertEqual(expected, format_description,
117
"checkout of format called %r was described as %r" %
118
(expected, format_description))
120
control._format.workingtree_format = old_format
122
def assertBranchDescription(self, format, expected=None):
123
"""Assert branch's format description matches expectations"""
126
self.make_branch('%s_branch' % format, format=format)
127
branch = _mod_branch.Branch.open('%s_branch' % format)
128
self.assertEqual(expected, info.describe_format(branch.controldir,
129
branch.repository, branch, None))
131
def assertRepoDescription(self, format, expected=None):
132
"""Assert repository's format description matches expectations"""
135
self.make_repository('%s_repo' % format, format=format)
136
repo = _mod_repository.Repository.open('%s_repo' % format)
137
self.assertEqual(expected, info.describe_format(repo.controldir,
140
def test_describe_tree_format(self):
141
for key, format in controldir.format_registry.iteritems():
142
if key in controldir.format_registry.aliases():
144
if not format().supports_workingtrees:
146
self.assertTreeDescription(key)
148
def test_describe_checkout_format(self):
149
for key in controldir.format_registry.keys():
150
if key in controldir.format_registry.aliases():
151
# Aliases will not describe correctly in the UI because the
152
# real format is found.
154
# legacy: weave does not support checkouts
157
# foreign: git checkouts can actually be bzr controldirs
158
if key in ('git', 'git-bare'):
160
if controldir.format_registry.get_info(key).experimental:
161
# We don't require that experimental formats support checkouts
162
# or describe correctly in the UI.
164
if controldir.format_registry.get_info(key).hidden:
167
if key in ('pack-0.92',):
168
expected = 'pack-0.92'
169
elif key in ('knit', 'metaweave'):
170
if 'metaweave' in controldir.format_registry:
171
expected = 'knit or metaweave'
174
elif key in ('1.14', '1.14-rich-root'):
175
expected = '1.14 or 1.14-rich-root'
176
self.assertCheckoutDescription(key, expected)
178
def test_describe_branch_format(self):
179
for key in controldir.format_registry.keys():
180
if key in controldir.format_registry.aliases():
182
if controldir.format_registry.get_info(key).hidden:
185
if key in ('dirstate', 'knit'):
186
expected = 'dirstate or knit'
187
elif key in ('1.14',):
189
elif key in ('1.14-rich-root',):
190
expected = '1.14-rich-root'
191
self.assertBranchDescription(key, expected)
193
def test_describe_repo_format(self):
194
for key in controldir.format_registry.keys():
195
if key in controldir.format_registry.aliases():
197
if controldir.format_registry.get_info(key).hidden:
200
if key in ('dirstate', 'knit', 'dirstate-tags'):
201
expected = 'dirstate or dirstate-tags or knit'
202
elif key in ('1.14',):
204
elif key in ('1.14-rich-root',):
205
expected = '1.14-rich-root'
206
self.assertRepoDescription(key, expected)
208
format = controldir.format_registry.make_controldir('knit')
209
format.set_branch_format(_mod_bzrbranch.BzrBranchFormat6())
210
tree = self.make_branch_and_tree('unknown', format=format)
211
self.assertEqual('unnamed', info.describe_format(tree.controldir,
212
tree.branch.repository, tree.branch, tree))
214
def test_gather_location_controldir_only(self):
215
bzrdir = self.make_controldir('.')
216
self.assertEqual([('control directory', bzrdir.user_url)],
217
info.gather_location_info(control=bzrdir))
219
def test_gather_location_standalone(self):
220
tree = self.make_branch_and_tree('tree')
221
self.assertEqual([('branch root', tree.controldir.root_transport.base)],
222
info.gather_location_info(
223
tree.branch.repository, tree.branch, tree, control=tree.controldir))
224
self.assertEqual([('branch root', tree.controldir.root_transport.base)],
225
info.gather_location_info(
226
tree.branch.repository, tree.branch, control=tree.controldir))
229
def test_gather_location_repo(self):
230
srepo = self.make_repository('shared', shared=True)
232
[('shared repository', srepo.controldir.root_transport.base)],
233
info.gather_location_info(srepo, control=srepo.controldir))
234
urepo = self.make_repository('unshared')
236
[('repository', urepo.controldir.root_transport.base)],
237
info.gather_location_info(urepo, control=urepo.controldir))
239
def test_gather_location_repo_branch(self):
240
srepo = self.make_repository('shared', shared=True)
242
[('shared repository', srepo.controldir.root_transport.base)],
243
info.gather_location_info(srepo, control=srepo.controldir))
244
tree = self.make_branch_and_tree('shared/tree')
246
[('shared repository', srepo.controldir.root_transport.base),
247
('repository branch', tree.branch.base)],
248
info.gather_location_info(srepo, tree.branch, tree, srepo.controldir))
250
def test_gather_location_light_checkout(self):
251
tree = self.make_branch_and_tree('tree')
252
lcheckout = tree.branch.create_checkout('lcheckout', lightweight=True)
254
[('light checkout root', lcheckout.controldir.root_transport.base),
255
('checkout of branch', tree.controldir.root_transport.base)],
256
self.gather_tree_location_info(lcheckout))
258
def test_gather_location_heavy_checkout(self):
259
tree = self.make_branch_and_tree('tree')
260
checkout = tree.branch.create_checkout('checkout')
262
[('checkout root', checkout.controldir.root_transport.base),
263
('checkout of branch', tree.controldir.root_transport.base)],
264
self.gather_tree_location_info(checkout))
265
light_checkout = checkout.branch.create_checkout('light_checkout',
268
[('light checkout root',
269
light_checkout.controldir.root_transport.base),
270
('checkout root', checkout.controldir.root_transport.base),
271
('checkout of branch', tree.controldir.root_transport.base)],
272
self.gather_tree_location_info(light_checkout)
275
def test_gather_location_shared_repo_checkout(self):
276
tree = self.make_branch_and_tree('tree')
277
srepo = self.make_repository('shared', shared=True)
278
shared_checkout = tree.branch.create_checkout('shared/checkout')
280
[('repository checkout root',
281
shared_checkout.controldir.root_transport.base),
282
('checkout of branch', tree.controldir.root_transport.base),
283
('shared repository', srepo.controldir.root_transport.base)],
284
self.gather_tree_location_info(shared_checkout))
286
def gather_tree_location_info(self, tree):
287
return info.gather_location_info(
288
tree.branch.repository, tree.branch, tree, tree.controldir)
290
def test_gather_location_bound(self):
291
branch = self.make_branch('branch')
292
bound_branch = self.make_branch('bound_branch')
293
bound_branch.bind(branch)
295
[('branch root', bound_branch.controldir.root_transport.base),
296
('bound to branch', branch.controldir.root_transport.base)],
297
info.gather_location_info(
298
bound_branch.repository, bound_branch, control=bound_branch.controldir)
301
def test_gather_location_bound_in_repository(self):
302
repo = self.make_repository('repo', shared=True)
303
repo.set_make_working_trees(False)
304
branch = self.make_branch('branch')
305
bound_branch = controldir.ControlDir.create_branch_convenience(
307
bound_branch.bind(branch)
309
[('shared repository', bound_branch.repository.controldir.user_url),
310
('repository branch', bound_branch.controldir.user_url),
311
('bound to branch', branch.controldir.user_url)],
312
info.gather_location_info(bound_branch.repository, bound_branch)
315
def test_location_list(self):
316
if sys.platform == 'win32':
317
raise tests.TestSkipped('Windows-unfriendly test')
318
locs = info.LocationList('/home/foo')
319
locs.add_url('a', 'file:///home/foo/')
320
locs.add_url('b', 'file:///home/foo/bar/')
321
locs.add_url('c', 'file:///home/bar/bar')
322
locs.add_url('d', 'http://example.com/example/')
323
locs.add_url('e', None)
324
self.assertEqual(locs.locs, [('a', '.'),
326
('c', '/home/bar/bar'),
327
('d', 'http://example.com/example/')])
328
self.assertEqualDiff(' a: .\n b: bar\n c: /home/bar/bar\n'
329
' d: http://example.com/example/\n',
330
''.join(locs.get_lines()))
332
def test_gather_related_braches(self):
333
branch = self.make_branch('.')
336
branch.set_public_branch('baz')
337
branch.set_push_location('bar')
338
branch.set_parent('foo')
339
branch.set_submit_branch('qux')
343
[('public branch', 'baz'), ('push branch', 'bar'),
344
('parent branch', 'foo'), ('submit branch', 'qux')],
345
info._gather_related_branches(branch).locs)