13
13
# You should have received a copy of the GNU General Public License
14
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
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18
18
"""Tests for the info command of bzr."""
23
22
from bzrlib import (
34
from bzrlib.tests.matchers import ContainsNoVfsCalls
35
from bzrlib.transport import memory
38
class TestInfo(tests.TestCaseWithTransport):
41
super(TestInfo, self).setUp()
42
self._repo_strings = "2a"
31
from bzrlib.osutils import format_date
32
from bzrlib.tests import TestSkipped
33
from bzrlib.tests.blackbox import ExternalBase
36
class TestInfo(ExternalBase):
44
38
def test_info_non_existing(self):
45
self.vfs_transport_factory = memory.MemoryServer
46
location = self.get_url()
39
if sys.platform == "win32":
40
location = "C:/i/do/not/exist/"
42
location = "/i/do/not/exist/"
47
43
out, err = self.run_bzr('info '+location, retcode=3)
48
44
self.assertEqual(out, '')
49
45
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')
55
'Empty control directory (format: 2a or pack-0.92)\n'
57
' control directory: ctrl\n')
58
self.assertEqual(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.assertEqual(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')
79
'Dangling branch reference (format: 2a or pack-0.92)\n'
81
' control directory: from\n'
82
' checkout of branch: target\n')
83
self.assertEqual(err, '')
85
47
def test_info_standalone(self):
86
48
transport = self.get_transport()
88
50
# Create initial standalone branch
89
tree1 = self.make_branch_and_tree('standalone', 'knit')
51
tree1 = self.make_branch_and_tree('standalone', 'weave')
90
52
self.build_tree(['standalone/a'])
92
54
branch1 = tree1.branch
94
56
out, err = self.run_bzr('info standalone')
95
57
self.assertEqualDiff(
96
"""Standalone tree (format: knit)
58
"""Standalone tree (format: weave)
98
60
branch root: standalone
100
62
self.assertEqual('', err)
102
# Standalone branch - verbose mode
103
64
out, err = self.run_bzr('info standalone -v')
104
65
self.assertEqualDiff(
105
"""Standalone tree (format: knit)
107
branch root: standalone
110
control: Meta directory format 1
111
working tree: Working tree format 3
112
branch: Branch format 5
113
repository: Knit repository format 1
126
0 versioned subdirectories
134
self.assertEqual('', err)
136
# Standalone branch - really verbose mode
137
out, err = self.run_bzr('info standalone -vv')
138
self.assertEqualDiff(
139
"""Standalone tree (format: knit)
141
branch root: standalone
144
control: Meta directory format 1
145
working tree: Working tree format 3
146
branch: Branch format 5
147
repository: Knit repository format 1
66
"""Standalone tree (format: weave)
68
branch root: standalone
71
control: All-in-one format 6
72
working tree: Working tree format 2
73
branch: Branch format 4
74
repository: Weave repository format 6
152
76
In the working tree:
328
246
tree5 = branch1.create_checkout('lightcheckout', lightweight=True)
329
247
branch5 = tree5.branch
330
248
out, err = self.run_bzr('info -v lightcheckout')
331
if "metaweave" in controldir.format_registry:
332
format_description = "knit or metaweave"
334
format_description = "knit"
335
249
self.assertEqualDiff(
336
"""Lightweight checkout (format: %s)
250
"""Lightweight checkout (format: 1.6 or 1.6.1-rich-root \
251
or dirstate or dirstate-tags or \
252
pack-0.92 or rich-root or rich-root-pack)
338
254
light checkout root: lightcheckout
339
255
checkout of branch: standalone
342
258
control: Meta directory format 1
343
working tree: Working tree format 3
344
branch: Branch format 5
345
repository: Knit repository format 1
259
working tree: Working tree format 4
260
branch: Branch format 4
261
repository: Weave repository format 6
350
263
In the working tree:
363
277
first revision: %s
364
278
latest revision: %s
368
""" % (format_description, datestring_first, datestring_first,), out)
282
""" % (datestring_first, datestring_first,), out)
369
283
self.assertEqual('', err)
371
285
# Update initial standalone branch
372
286
self.build_tree(['standalone/b'])
374
288
tree1.commit('commit two')
375
rev = branch1.repository.get_revision(branch1.last_revision())
376
datestring_last = osutils.format_date(rev.timestamp, rev.timezone)
289
rev = branch1.repository.get_revision(branch1.revision_history()[-1])
290
datestring_last = format_date(rev.timestamp, rev.timezone)
378
292
# Out of date branched standalone branch will not be detected
379
293
out, err = self.run_bzr('info -v branch')
380
294
self.assertEqualDiff(
381
"""Standalone tree (format: knit)
295
"""Standalone tree (format: weave)
383
297
branch root: branch
507
415
# Out of date lightweight checkout
508
416
out, err = self.run_bzr('info lightcheckout --verbose')
509
417
self.assertEqualDiff(
510
"""Lightweight checkout (format: %s)
418
"""Lightweight checkout (format: 1.6 or 1.6.1-rich-root or \
419
dirstate or dirstate-tags or \
420
pack-0.92 or rich-root or rich-root-pack)
512
422
light checkout root: lightcheckout
513
423
checkout of branch: standalone
516
426
control: Meta directory format 1
517
working tree: Working tree format 3
518
branch: Branch format 5
519
repository: Knit repository format 1
427
working tree: Working tree format 4
428
branch: Branch format 4
429
repository: Weave repository format 6
524
431
Working tree is out of date: missing 1 revision.
647
548
self.build_tree(['tree/lightcheckout/a'])
649
550
tree2.commit('commit one')
650
rev = repo.get_revision(branch2.last_revision())
651
datestring_first = osutils.format_date(rev.timestamp, rev.timezone)
551
rev = repo.get_revision(branch2.revision_history()[0])
552
datestring_first = format_date(rev.timestamp, rev.timezone)
652
553
out, err = self.run_bzr('info tree/lightcheckout --verbose')
653
554
self.assertEqualDiff(
654
"""Lightweight checkout (format: %s)
555
"""Lightweight checkout (format: 1.6 or 1.6.1-rich-root or \
556
dirstate or dirstate-tags or \
557
pack-0.92 or rich-root or rich-root-pack)
656
559
light checkout root: tree/lightcheckout
657
560
checkout of branch: repo/branch
775
672
tree3.commit('commit two')
777
674
# Out of date lightweight checkout
778
rev = repo.get_revision(branch1.last_revision())
779
datestring_last = osutils.format_date(rev.timestamp, rev.timezone)
675
rev = repo.get_revision(branch1.revision_history()[-1])
676
datestring_last = format_date(rev.timestamp, rev.timezone)
780
677
out, err = self.run_bzr('info tree/lightcheckout --verbose')
781
678
self.assertEqualDiff(
782
"""Lightweight checkout (format: %s)
679
"""Lightweight checkout (format: 1.6 or 1.6.1-rich-root or \
680
dirstate or dirstate-tags or \
681
pack-0.92 or rich-root or rich-root-pack)
784
683
light checkout root: tree/lightcheckout
785
684
checkout of branch: repo/branch
1166
1039
self.assertEqual('', err)
1168
def test_info_repository_hook(self):
1169
format = controldir.format_registry.make_bzrdir('knit')
1170
def repo_info(repo, stats, outf):
1171
outf.write("more info\n")
1172
info.hooks.install_named_hook('repository', repo_info, None)
1173
# Create shared repository with working trees
1174
repo = self.make_repository('repo', shared=True, format=format)
1175
out, err = self.run_bzr('info -v repo')
1176
self.assertEqualDiff(
1177
"""Shared repository with trees (format: dirstate or dirstate-tags or knit)
1179
shared repository: repo
1182
control: Meta directory format 1
1188
Create working tree for new branches inside the repository.
1193
""" % (format.repository_format.get_format_description(),
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)
1213
1041
def assertCheckoutStatusOutput(self,
1214
1042
command_string, lco_tree, shared_repo=None,
1215
1043
repo_branch=None,
1264
1092
(False, True): 'Lightweight checkout',
1265
1093
(False, False): 'Checkout',
1266
1094
}[(shared_repo is not None, light_checkout)]
1267
format = {True: self._repo_strings,
1268
False: 'unnamed'}[light_checkout]
1095
format = {True: '1.6 or 1.6.1-rich-root'
1096
' or dirstate or dirstate-tags or pack-0.92'
1097
' or rich-root or rich-root-pack',
1098
False: 'dirstate'}[light_checkout]
1269
1099
if repo_locked:
1270
1100
repo_locked = lco_tree.branch.repository.get_physical_lock_status()
1271
1101
if repo_locked or branch_locked or tree_locked:
1361
1188
format=bzrdir.BzrDirMetaFormat1())
1362
1189
repo.set_make_working_trees(False)
1363
1190
repo.bzrdir.root_transport.mkdir('branch')
1364
repo_branch = controldir.ControlDir.create_branch_convenience(
1365
'repo/branch', format=bzrdir.BzrDirMetaFormat1())
1191
repo_branch = repo.bzrdir.create_branch_convenience('repo/branch',
1192
format=bzrdir.BzrDirMetaFormat1())
1366
1193
# Do a heavy checkout
1367
1194
transport.mkdir('tree')
1368
1195
transport.mkdir('tree/checkout')
1369
co_branch = controldir.ControlDir.create_branch_convenience(
1370
'tree/checkout', format=bzrdir.BzrDirMetaFormat1())
1196
co_branch = bzrdir.BzrDir.create_branch_convenience('tree/checkout',
1197
format=bzrdir.BzrDirMetaFormat1())
1371
1198
co_branch.bind(repo_branch)
1372
1199
# Do a light checkout of the heavy one
1373
1200
transport.mkdir('tree/lightcheckout')
1374
1201
lco_dir = bzrdir.BzrDirMetaFormat1().initialize('tree/lightcheckout')
1375
lco_dir.set_branch_reference(co_branch)
1202
branch.BranchReferenceFormat().initialize(lco_dir, co_branch)
1376
1203
lco_dir.create_workingtree()
1377
1204
lco_tree = lco_dir.open_workingtree()
1466
1293
self.knownFailure('Win32 cannot run "bzr info"'
1467
1294
' when the tree is locked.')
1296
def test_info_locking_oslocks(self):
1297
if sys.platform == "win32":
1298
raise TestSkipped("don't use oslocks on win32 in unix manner")
1300
tree = self.make_branch_and_tree('branch',
1301
format=bzrdir.BzrDirFormat6())
1303
# Test all permutations of locking the working tree, branch and repository
1304
# XXX: Well not yet, as we can't query oslocks yet. Currently, it's
1305
# implemented by raising NotImplementedError and get_physical_lock_status()
1306
# always returns false. This makes bzr info hide the lock status. (Olaf)
1310
out, err = self.run_bzr('info -v branch')
1311
self.assertEqualDiff(
1312
"""Standalone tree (format: weave)
1317
control: All-in-one format 6
1318
working tree: Working tree format 2
1319
branch: Branch format 4
1322
In the working tree:
1330
0 versioned subdirectories
1338
""" % ('branch', tree.branch.repository._format.get_format_description(),
1340
self.assertEqual('', err)
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
1371
""" % ('branch', tree.branch.repository._format.get_format_description(),
1373
self.assertEqual('', err)
1469
1376
def test_info_stacked(self):
1470
1377
# We have a mainline
1471
1378
trunk_tree = self.make_branch_and_tree('mainline',
1379
format='development1')
1473
1380
trunk_tree.commit('mainline')
1474
1381
# and a branch from it which is stacked
1475
1382
new_dir = trunk_tree.bzrdir.sprout('newbranch', stacked=True)
1476
1383
out, err = self.run_bzr('info newbranch')
1477
1384
self.assertEqual(
1478
"""Standalone tree (format: 1.6)
1385
"""Standalone tree (format: development1)
1480
1387
branch root: newbranch
1484
1391
stacked on: mainline
1486
1393
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)