18
18
"""Tests for the info command of bzr."""
22
23
from bzrlib import (
31
from bzrlib.osutils import format_date
32
from bzrlib.tests import TestSkipped
33
from bzrlib.tests.blackbox import ExternalBase
36
class TestInfo(ExternalBase):
34
from bzrlib.tests.matchers import ContainsNoVfsCalls
35
from bzrlib.transport import memory
38
class TestInfo(tests.TestCaseWithTransport):
39
ExternalBase.setUp(self)
40
self._repo_strings = "2a or development-subtree"
41
super(TestInfo, self).setUp()
42
self._repo_strings = "2a"
42
44
def test_info_non_existing(self):
43
if sys.platform == "win32":
44
location = "C:/i/do/not/exist/"
46
location = "/i/do/not/exist/"
45
self.vfs_transport_factory = memory.MemoryServer
46
location = self.get_url()
47
47
out, err = self.run_bzr('info '+location, retcode=3)
48
48
self.assertEqual(out, '')
49
49
self.assertEqual(err, 'bzr: ERROR: Not a branch: "%s".\n' % location)
51
def test_info_empty_controldir(self):
52
self.make_bzrdir('ctrl')
53
out, err = self.run_bzr('info ctrl')
54
self.assertEquals(out,
55
'Empty control directory (format: 2a or pack-0.92)\n'
57
' control directory: ctrl\n')
58
self.assertEquals(err, '')
60
def test_info_empty_controldir_verbose(self):
61
self.make_bzrdir('ctrl')
62
out, err = self.run_bzr('info -v ctrl')
63
self.assertEqualDiff(out,
64
'Empty control directory (format: 2a or pack-0.92)\n'
66
' control directory: ctrl\n\n'
68
' control: Meta directory format 1\n\n'
69
'Control directory:\n'
71
self.assertEquals(err, '')
73
def test_info_dangling_branch_reference(self):
74
br = self.make_branch('target')
75
br.create_checkout('from', lightweight=True)
76
shutil.rmtree('target')
77
out, err = self.run_bzr('info from')
78
self.assertEquals(out,
79
'Dangling branch reference (format: 2a or pack-0.92)\n'
81
' control directory: from\n'
82
' checkout of branch: target\n')
83
self.assertEquals(err, '')
51
85
def test_info_standalone(self):
52
86
transport = self.get_transport()
54
88
# Create initial standalone branch
55
tree1 = self.make_branch_and_tree('standalone', 'weave')
89
tree1 = self.make_branch_and_tree('standalone', 'knit')
56
90
self.build_tree(['standalone/a'])
58
92
branch1 = tree1.branch
60
94
out, err = self.run_bzr('info standalone')
61
95
self.assertEqualDiff(
62
"""Standalone tree (format: weave)
96
"""Standalone tree (format: knit)
64
98
branch root: standalone
68
102
# Standalone branch - verbose mode
69
103
out, err = self.run_bzr('info standalone -v')
70
104
self.assertEqualDiff(
71
"""Standalone tree (format: weave)
105
"""Standalone tree (format: knit)
73
107
branch root: standalone
76
control: All-in-one format 6
77
working tree: Working tree format 2
78
branch: Branch format 4
79
repository: Weave repository format 6
110
control: Meta directory format 1
111
working tree: Working tree format 3
112
branch: Branch format 5
113
repository: Knit repository format 1
81
118
In the working tree:
99
136
# Standalone branch - really verbose mode
100
137
out, err = self.run_bzr('info standalone -vv')
101
138
self.assertEqualDiff(
102
"""Standalone tree (format: weave)
139
"""Standalone tree (format: knit)
104
141
branch root: standalone
107
control: All-in-one format 6
108
working tree: Working tree format 2
109
branch: Branch format 4
110
repository: Weave repository format 6
144
control: Meta directory format 1
145
working tree: Working tree format 3
146
branch: Branch format 5
147
repository: Knit repository format 1
112
152
In the working tree:
188
231
# Branch and bind to standalone, needs upgrade to metadir
189
232
# (creates backup as unknown)
190
233
branch1.bzrdir.sprout('bound')
191
knit1_format = bzrdir.format_registry.make_bzrdir('knit')
234
knit1_format = controldir.format_registry.make_bzrdir('knit')
192
235
upgrade.upgrade('bound', knit1_format)
193
branch3 = bzrdir.BzrDir.open('bound').open_branch()
236
branch3 = controldir.ControlDir.open('bound').open_branch()
194
237
branch3.bind(branch1)
195
238
bound_tree = branch3.bzrdir.open_workingtree()
196
239
out, err = self.run_bzr('info -v bound')
312
""" % (self._repo_strings, datestring_first, datestring_first,), out)
368
""" % (format_description, datestring_first, datestring_first,), out)
313
369
self.assertEqual('', err)
315
371
# Update initial standalone branch
316
372
self.build_tree(['standalone/b'])
318
374
tree1.commit('commit two')
319
rev = branch1.repository.get_revision(branch1.revision_history()[-1])
320
datestring_last = format_date(rev.timestamp, rev.timezone)
375
rev = branch1.repository.get_revision(branch1.last_revision())
376
datestring_last = osutils.format_date(rev.timestamp, rev.timezone)
322
378
# Out of date branched standalone branch will not be detected
323
379
out, err = self.run_bzr('info -v branch')
324
380
self.assertEqualDiff(
325
"""Standalone tree (format: weave)
381
"""Standalone tree (format: knit)
327
383
branch root: branch
476
""" % (self._repo_strings, datestring_first, datestring_last,), out)
544
""" % (format_description, datestring_first, datestring_last,), out)
477
545
self.assertEqual('', err)
479
547
def test_info_standalone_no_tree(self):
480
548
# create standalone branch without a working tree
481
format = bzrdir.format_registry.make_bzrdir('default')
549
format = controldir.format_registry.make_bzrdir('default')
482
550
branch = self.make_branch('branch')
483
551
repo = branch.repository
484
552
out, err = self.run_bzr('info branch -v')
1073
1195
self.assertEqual('', err)
1197
def test_info_unshared_repository_with_colocated_branches(self):
1198
format = controldir.format_registry.make_bzrdir('development-colo')
1199
transport = self.get_transport()
1201
# Create unshared repository
1202
repo = self.make_repository('repo', shared=False, format=format)
1203
repo.set_make_working_trees(True)
1204
repo.bzrdir.create_branch(name='foo')
1205
out, err = self.run_bzr('info repo')
1206
self.assertEqualDiff(
1207
"""Unshared repository with trees and colocated branches (format: development-colo)
1211
self.assertEqual('', err)
1075
1213
def assertCheckoutStatusOutput(self,
1076
1214
command_string, lco_tree, shared_repo=None,
1077
1215
repo_branch=None,
1220
1361
format=bzrdir.BzrDirMetaFormat1())
1221
1362
repo.set_make_working_trees(False)
1222
1363
repo.bzrdir.root_transport.mkdir('branch')
1223
repo_branch = repo.bzrdir.create_branch_convenience('repo/branch',
1224
format=bzrdir.BzrDirMetaFormat1())
1364
repo_branch = controldir.ControlDir.create_branch_convenience(
1365
'repo/branch', format=bzrdir.BzrDirMetaFormat1())
1225
1366
# Do a heavy checkout
1226
1367
transport.mkdir('tree')
1227
1368
transport.mkdir('tree/checkout')
1228
co_branch = bzrdir.BzrDir.create_branch_convenience('tree/checkout',
1229
format=bzrdir.BzrDirMetaFormat1())
1369
co_branch = controldir.ControlDir.create_branch_convenience(
1370
'tree/checkout', format=bzrdir.BzrDirMetaFormat1())
1230
1371
co_branch.bind(repo_branch)
1231
1372
# Do a light checkout of the heavy one
1232
1373
transport.mkdir('tree/lightcheckout')
1233
1374
lco_dir = bzrdir.BzrDirMetaFormat1().initialize('tree/lightcheckout')
1234
branch.BranchReferenceFormat().initialize(lco_dir, co_branch)
1375
lco_dir.set_branch_reference(co_branch)
1235
1376
lco_dir.create_workingtree()
1236
1377
lco_tree = lco_dir.open_workingtree()
1325
1466
self.knownFailure('Win32 cannot run "bzr info"'
1326
1467
' when the tree is locked.')
1328
def test_info_locking_oslocks(self):
1329
if sys.platform == "win32":
1330
raise TestSkipped("don't use oslocks on win32 in unix manner")
1331
self.thisFailsStrictLockCheck()
1333
tree = self.make_branch_and_tree('branch',
1334
format=bzrdir.BzrDirFormat6())
1336
# Test all permutations of locking the working tree, branch and repository
1337
# XXX: Well not yet, as we can't query oslocks yet. Currently, it's
1338
# implemented by raising NotImplementedError and get_physical_lock_status()
1339
# always returns false. This makes bzr info hide the lock status. (Olaf)
1343
out, err = self.run_bzr('info -v branch')
1344
self.assertEqualDiff(
1345
"""Standalone tree (format: weave)
1350
control: All-in-one format 6
1351
working tree: Working tree format 2
1352
branch: Branch format 4
1355
In the working tree:
1363
0 versioned subdirectories
1370
""" % ('branch', tree.branch.repository._format.get_format_description(),
1372
self.assertEqual('', err)
1375
out, err = self.run_bzr('info -v branch')
1376
self.assertEqualDiff(
1377
"""Standalone tree (format: weave)
1382
control: All-in-one format 6
1383
working tree: Working tree format 2
1384
branch: Branch format 4
1387
In the working tree:
1395
0 versioned subdirectories
1402
""" % ('branch', tree.branch.repository._format.get_format_description(),
1404
self.assertEqual('', err)
1407
1469
def test_info_stacked(self):
1408
1470
# We have a mainline
1409
1471
trunk_tree = self.make_branch_and_tree('mainline',
1422
1484
stacked on: mainline
1424
1486
self.assertEqual("", err)
1488
def test_info_revinfo_optional(self):
1489
tree = self.make_branch_and_tree('.')
1490
def last_revision_info(self):
1491
raise errors.UnsupportedOperation(last_revision_info, self)
1493
branch.Branch, "last_revision_info", last_revision_info)
1494
out, err = self.run_bzr('info -v .')
1496
"""Standalone tree (format: 2a)
1501
control: Meta directory format 1
1502
working tree: Working tree format 6
1503
branch: Branch format 7
1504
repository: Repository format 2a - rich roots, group compression and chk inventories
1509
In the working tree:
1517
0 versioned subdirectories
1519
self.assertEqual("", err)
1521
def test_info_shows_colocated_branches(self):
1522
bzrdir = self.make_branch('.', format='development-colo').bzrdir
1523
bzrdir.create_branch(name="colo1")
1524
bzrdir.create_branch(name="colo2")
1525
bzrdir.create_branch(name="colo3")
1526
out, err = self.run_bzr('info -v .')
1527
self.assertEqualDiff(
1528
"""Standalone branch (format: development-colo)
1533
control: Meta directory format 1 with support for colocated branches
1534
branch: Branch format 7
1535
repository: Repository format 2a - rich roots, group compression and chk inventories
1546
self.assertEqual("", err)
1549
class TestSmartServerInfo(tests.TestCaseWithTransport):
1551
def test_simple_branch_info(self):
1552
self.setup_smart_server_with_call_log()
1553
t = self.make_branch_and_tree('branch')
1554
self.build_tree_contents([('branch/foo', 'thecontents')])
1557
self.reset_smart_call_log()
1558
out, err = self.run_bzr(['info', self.get_url('branch')])
1559
# This figure represent the amount of work to perform this use case. It
1560
# is entirely ok to reduce this number if a test fails due to rpc_count
1561
# being too low. If rpc_count increases, more network roundtrips have
1562
# become necessary for this use case. Please do not adjust this number
1563
# upwards without agreement from bzr's network support maintainers.
1564
self.assertLength(10, self.hpss_calls)
1565
self.assertLength(1, self.hpss_connections)
1566
self.assertThat(self.hpss_calls, ContainsNoVfsCalls)
1568
def test_verbose_branch_info(self):
1569
self.setup_smart_server_with_call_log()
1570
t = self.make_branch_and_tree('branch')
1571
self.build_tree_contents([('branch/foo', 'thecontents')])
1574
self.reset_smart_call_log()
1575
out, err = self.run_bzr(['info', '-v', self.get_url('branch')])
1576
# This figure represent the amount of work to perform this use case. It
1577
# is entirely ok to reduce this number if a test fails due to rpc_count
1578
# being too low. If rpc_count increases, more network roundtrips have
1579
# become necessary for this use case. Please do not adjust this number
1580
# upwards without agreement from bzr's network support maintainers.
1581
self.assertLength(14, self.hpss_calls)
1582
self.assertLength(1, self.hpss_connections)
1583
self.assertThat(self.hpss_calls, ContainsNoVfsCalls)