1
# Copyright (C) 2006-2012, 2016 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
18
"""Tests for the info command of bzr."""
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"
44
def test_info_non_existing(self):
45
self.vfs_transport_factory = memory.MemoryServer
46
location = self.get_url()
47
out, err = self.run_bzr('info '+location, retcode=3)
48
self.assertEqual(out, '')
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')
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
def test_info_standalone(self):
86
transport = self.get_transport()
88
# Create initial standalone branch
89
tree1 = self.make_branch_and_tree('standalone', 'knit')
90
self.build_tree(['standalone/a'])
92
branch1 = tree1.branch
94
out, err = self.run_bzr('info standalone')
96
"""Standalone tree (format: knit)
98
branch root: standalone
100
self.assertEqual('', err)
102
# Standalone branch - verbose mode
103
out, err = self.run_bzr('info standalone -v')
104
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
160
0 versioned subdirectories
169
self.assertEqual('', err)
170
tree1.commit('commit one')
171
rev = branch1.repository.get_revision(branch1.last_revision())
172
datestring_first = osutils.format_date(rev.timestamp, rev.timezone)
174
# Branch standalone with push location
175
branch2 = branch1.bzrdir.sprout('branch').open_branch()
176
branch2.set_push_location(branch1.bzrdir.root_transport.base)
178
out, err = self.run_bzr('info branch')
179
self.assertEqualDiff(
180
"""Standalone tree (format: knit)
185
push branch: standalone
186
parent branch: standalone
188
self.assertEqual('', err)
190
out, err = self.run_bzr('info branch --verbose')
191
self.assertEqualDiff(
192
"""Standalone tree (format: knit)
197
push branch: standalone
198
parent branch: standalone
201
control: Meta directory format 1
202
working tree: Working tree format 3
203
branch: Branch format 5
204
repository: Knit repository format 1
217
0 versioned subdirectories
227
""" % (datestring_first, datestring_first,
229
self.assertEqual('', err)
231
# Branch and bind to standalone, needs upgrade to metadir
232
# (creates backup as unknown)
233
branch1.bzrdir.sprout('bound')
234
knit1_format = controldir.format_registry.make_bzrdir('knit')
235
upgrade.upgrade('bound', knit1_format)
236
branch3 = controldir.ControlDir.open('bound').open_branch()
237
branch3.bind(branch1)
238
bound_tree = branch3.bzrdir.open_workingtree()
239
out, err = self.run_bzr('info -v bound')
240
self.assertEqualDiff(
241
"""Checkout (format: knit)
244
checkout of branch: standalone
247
parent branch: standalone
250
control: Meta directory format 1
266
0 versioned subdirectories
276
""" % (bound_tree._format.get_format_description(),
277
branch3._format.get_format_description(),
278
branch3.repository._format.get_format_description(),
279
datestring_first, datestring_first,
281
self.assertEqual('', err)
283
# Checkout standalone (same as above, but does not have parent set)
284
branch4 = controldir.ControlDir.create_branch_convenience('checkout',
286
branch4.bind(branch1)
287
branch4.bzrdir.open_workingtree().update()
288
out, err = self.run_bzr('info checkout --verbose')
289
self.assertEqualDiff(
290
"""Checkout (format: knit)
292
checkout root: checkout
293
checkout of branch: standalone
296
control: Meta directory format 1
297
working tree: Working tree format 3
298
branch: Branch format 5
312
0 versioned subdirectories
322
""" % (branch4.repository._format.get_format_description(),
323
datestring_first, datestring_first,
325
self.assertEqual('', err)
327
# Lightweight checkout (same as above, different branch and repository)
328
tree5 = branch1.create_checkout('lightcheckout', lightweight=True)
329
branch5 = tree5.branch
330
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
self.assertEqualDiff(
336
"""Lightweight checkout (format: %s)
338
light checkout root: lightcheckout
339
checkout of branch: standalone
342
control: Meta directory format 1
343
working tree: Working tree format 3
344
branch: Branch format 5
345
repository: Knit repository format 1
358
0 versioned subdirectories
368
""" % (format_description, datestring_first, datestring_first,), out)
369
self.assertEqual('', err)
371
# Update initial standalone branch
372
self.build_tree(['standalone/b'])
374
tree1.commit('commit two')
375
rev = branch1.repository.get_revision(branch1.last_revision())
376
datestring_last = osutils.format_date(rev.timestamp, rev.timezone)
378
# Out of date branched standalone branch will not be detected
379
out, err = self.run_bzr('info -v branch')
380
self.assertEqualDiff(
381
"""Standalone tree (format: knit)
386
push branch: standalone
387
parent branch: standalone
390
control: Meta directory format 1
391
working tree: Working tree format 3
392
branch: Branch format 5
393
repository: Knit repository format 1
406
0 versioned subdirectories
416
""" % (datestring_first, datestring_first,
418
self.assertEqual('', err)
420
# Out of date bound branch
421
out, err = self.run_bzr('info -v bound')
422
self.assertEqualDiff(
423
"""Checkout (format: knit)
426
checkout of branch: standalone
429
parent branch: standalone
432
control: Meta directory format 1
433
working tree: Working tree format 3
434
branch: Branch format 5
440
Branch is out of date: missing 1 revision.
450
0 versioned subdirectories
460
""" % (branch3.repository._format.get_format_description(),
461
datestring_first, datestring_first,
463
self.assertEqual('', err)
465
# Out of date checkout
466
out, err = self.run_bzr('info -v checkout')
467
self.assertEqualDiff(
468
"""Checkout (format: knit)
470
checkout root: checkout
471
checkout of branch: standalone
474
control: Meta directory format 1
475
working tree: Working tree format 3
476
branch: Branch format 5
482
Branch is out of date: missing 1 revision.
492
0 versioned subdirectories
502
""" % (branch4.repository._format.get_format_description(),
503
datestring_first, datestring_first,
505
self.assertEqual('', err)
507
# Out of date lightweight checkout
508
out, err = self.run_bzr('info lightcheckout --verbose')
509
self.assertEqualDiff(
510
"""Lightweight checkout (format: %s)
512
light checkout root: lightcheckout
513
checkout of branch: standalone
516
control: Meta directory format 1
517
working tree: Working tree format 3
518
branch: Branch format 5
519
repository: Knit repository format 1
524
Working tree is out of date: missing 1 revision.
534
0 versioned subdirectories
544
""" % (format_description, datestring_first, datestring_last,), out)
545
self.assertEqual('', err)
547
def test_info_standalone_no_tree(self):
548
# create standalone branch without a working tree
549
format = controldir.format_registry.make_bzrdir('default')
550
branch = self.make_branch('branch')
551
repo = branch.repository
552
out, err = self.run_bzr('info branch -v')
553
self.assertEqualDiff(
554
"""Standalone branch (format: %s)
559
control: Meta directory format 1
571
""" % (info.describe_format(repo.bzrdir, repo, branch, None),
572
format.get_branch_format().get_format_description(),
573
format.repository_format.get_format_description(),
575
self.assertEqual('', err)
577
def test_info_shared_repository(self):
578
format = controldir.format_registry.make_bzrdir('knit')
579
transport = self.get_transport()
581
# Create shared repository
582
repo = self.make_repository('repo', shared=True, format=format)
583
repo.set_make_working_trees(False)
584
out, err = self.run_bzr('info -v repo')
585
self.assertEqualDiff(
586
"""Shared repository (format: dirstate or dirstate-tags or knit)
588
shared repository: %s
591
control: Meta directory format 1
599
""" % ('repo', format.repository_format.get_format_description(),
601
self.assertEqual('', err)
603
# Create branch inside shared repository
604
repo.bzrdir.root_transport.mkdir('branch')
605
branch1 = controldir.ControlDir.create_branch_convenience(
606
'repo/branch', format=format)
607
out, err = self.run_bzr('info -v repo/branch')
608
self.assertEqualDiff(
609
"""Repository branch (format: dirstate or knit)
611
shared repository: repo
612
repository branch: repo/branch
615
control: Meta directory format 1
627
""" % (format.get_branch_format().get_format_description(),
628
format.repository_format.get_format_description(),
630
self.assertEqual('', err)
632
# Create lightweight checkout
633
transport.mkdir('tree')
634
transport.mkdir('tree/lightcheckout')
635
tree2 = branch1.create_checkout('tree/lightcheckout',
637
branch2 = tree2.branch
638
self.assertCheckoutStatusOutput('-v tree/lightcheckout', tree2,
639
shared_repo=repo, repo_branch=branch1, verbose=True)
641
# Create normal checkout
642
tree3 = branch1.create_checkout('tree/checkout')
643
self.assertCheckoutStatusOutput('tree/checkout --verbose', tree3,
645
light_checkout=False, repo_branch=branch1)
646
# Update lightweight checkout
647
self.build_tree(['tree/lightcheckout/a'])
649
tree2.commit('commit one')
650
rev = repo.get_revision(branch2.last_revision())
651
datestring_first = osutils.format_date(rev.timestamp, rev.timezone)
652
out, err = self.run_bzr('info tree/lightcheckout --verbose')
653
self.assertEqualDiff(
654
"""Lightweight checkout (format: %s)
656
light checkout root: tree/lightcheckout
657
checkout of branch: repo/branch
658
shared repository: repo
661
control: Meta directory format 1
662
working tree: Working tree format 6
677
0 versioned subdirectories
687
""" % (self._repo_strings, format.get_branch_format().get_format_description(),
688
format.repository_format.get_format_description(),
689
datestring_first, datestring_first,
691
self.assertEqual('', err)
693
# Out of date checkout
694
out, err = self.run_bzr('info -v tree/checkout')
695
self.assertEqualDiff(
696
"""Checkout (format: unnamed)
698
checkout root: tree/checkout
699
checkout of branch: repo/branch
702
control: Meta directory format 1
703
working tree: Working tree format 6
710
Branch is out of date: missing 1 revision.
720
0 versioned subdirectories
727
""" % (format.get_branch_format().get_format_description(),
728
format.repository_format.get_format_description(),
730
self.assertEqual('', err)
734
self.build_tree(['tree/checkout/b'])
736
out, err = self.run_bzr('info tree/checkout --verbose')
737
self.assertEqualDiff(
738
"""Checkout (format: unnamed)
740
checkout root: tree/checkout
741
checkout of branch: repo/branch
744
control: Meta directory format 1
745
working tree: Working tree format 6
760
0 versioned subdirectories
770
""" % (format.get_branch_format().get_format_description(),
771
format.repository_format.get_format_description(),
772
datestring_first, datestring_first,
774
self.assertEqual('', err)
775
tree3.commit('commit two')
777
# Out of date lightweight checkout
778
rev = repo.get_revision(branch1.last_revision())
779
datestring_last = osutils.format_date(rev.timestamp, rev.timezone)
780
out, err = self.run_bzr('info tree/lightcheckout --verbose')
781
self.assertEqualDiff(
782
"""Lightweight checkout (format: %s)
784
light checkout root: tree/lightcheckout
785
checkout of branch: repo/branch
786
shared repository: repo
789
control: Meta directory format 1
790
working tree: Working tree format 6
797
Working tree is out of date: missing 1 revision.
807
0 versioned subdirectories
817
""" % (self._repo_strings, format.get_branch_format().get_format_description(),
818
format.repository_format.get_format_description(),
819
datestring_first, datestring_last,
821
self.assertEqual('', err)
823
# Show info about shared branch
824
out, err = self.run_bzr('info repo/branch --verbose')
825
self.assertEqualDiff(
826
"""Repository branch (format: dirstate or knit)
828
shared repository: repo
829
repository branch: repo/branch
832
control: Meta directory format 1
847
""" % (format.get_branch_format().get_format_description(),
848
format.repository_format.get_format_description(),
849
datestring_first, datestring_last,
851
self.assertEqual('', err)
853
# Show info about repository with revisions
854
out, err = self.run_bzr('info -v repo')
855
self.assertEqualDiff(
856
"""Shared repository (format: dirstate or dirstate-tags or knit)
858
shared repository: repo
861
control: Meta directory format 1
869
""" % (format.repository_format.get_format_description(),
871
self.assertEqual('', err)
873
def test_info_shared_repository_with_trees(self):
874
format = controldir.format_registry.make_bzrdir('knit')
875
transport = self.get_transport()
877
# Create shared repository with working trees
878
repo = self.make_repository('repo', shared=True, format=format)
879
repo.set_make_working_trees(True)
880
out, err = self.run_bzr('info -v repo')
881
self.assertEqualDiff(
882
"""Shared repository with trees (format: dirstate or dirstate-tags or knit)
884
shared repository: repo
887
control: Meta directory format 1
893
Create working tree for new branches inside the repository.
897
""" % (format.repository_format.get_format_description(),
899
self.assertEqual('', err)
901
# Create two branches
902
repo.bzrdir.root_transport.mkdir('branch1')
903
branch1 = controldir.ControlDir.create_branch_convenience('repo/branch1',
905
branch2 = branch1.bzrdir.sprout('repo/branch2').open_branch()
908
out, err = self.run_bzr('info repo/branch1 --verbose')
909
self.assertEqualDiff(
910
"""Repository tree (format: knit)
912
shared repository: repo
913
repository branch: repo/branch1
916
control: Meta directory format 1
917
working tree: Working tree format 3
932
0 versioned subdirectories
939
""" % (format.get_branch_format().get_format_description(),
940
format.repository_format.get_format_description(),
942
self.assertEqual('', err)
944
# Update first branch
945
self.build_tree(['repo/branch1/a'])
946
tree1 = branch1.bzrdir.open_workingtree()
948
tree1.commit('commit one')
949
rev = repo.get_revision(branch1.last_revision())
950
datestring_first = osutils.format_date(rev.timestamp, rev.timezone)
951
out, err = self.run_bzr('info -v repo/branch1')
952
self.assertEqualDiff(
953
"""Repository tree (format: knit)
955
shared repository: repo
956
repository branch: repo/branch1
959
control: Meta directory format 1
960
working tree: Working tree format 3
975
0 versioned subdirectories
985
""" % (format.get_branch_format().get_format_description(),
986
format.repository_format.get_format_description(),
987
datestring_first, datestring_first,
989
self.assertEqual('', err)
991
# Out of date second branch
992
out, err = self.run_bzr('info repo/branch2 --verbose')
993
self.assertEqualDiff(
994
"""Repository tree (format: knit)
996
shared repository: repo
997
repository branch: repo/branch2
1000
parent branch: repo/branch1
1003
control: Meta directory format 1
1004
working tree: Working tree format 3
1011
In the working tree:
1019
0 versioned subdirectories
1026
""" % (format.get_branch_format().get_format_description(),
1027
format.repository_format.get_format_description(),
1029
self.assertEqual('', err)
1031
# Update second branch
1032
tree2 = branch2.bzrdir.open_workingtree()
1034
out, err = self.run_bzr('info -v repo/branch2')
1035
self.assertEqualDiff(
1036
"""Repository tree (format: knit)
1038
shared repository: repo
1039
repository branch: repo/branch2
1042
parent branch: repo/branch1
1045
control: Meta directory format 1
1046
working tree: Working tree format 3
1053
In the working tree:
1061
0 versioned subdirectories
1071
""" % (format.get_branch_format().get_format_description(),
1072
format.repository_format.get_format_description(),
1073
datestring_first, datestring_first,
1075
self.assertEqual('', err)
1077
# Show info about repository with revisions
1078
out, err = self.run_bzr('info -v repo')
1079
self.assertEqualDiff(
1080
"""Shared repository with trees (format: dirstate or dirstate-tags or knit)
1082
shared repository: repo
1085
control: Meta directory format 1
1091
Create working tree for new branches inside the repository.
1095
""" % (format.repository_format.get_format_description(),
1098
self.assertEqual('', err)
1100
def test_info_shared_repository_with_tree_in_root(self):
1101
format = controldir.format_registry.make_bzrdir('knit')
1102
transport = self.get_transport()
1104
# Create shared repository with working trees
1105
repo = self.make_repository('repo', shared=True, format=format)
1106
repo.set_make_working_trees(True)
1107
out, err = self.run_bzr('info -v repo')
1108
self.assertEqualDiff(
1109
"""Shared repository with trees (format: dirstate or dirstate-tags or knit)
1111
shared repository: repo
1114
control: Meta directory format 1
1120
Create working tree for new branches inside the repository.
1124
""" % (format.repository_format.get_format_description(),
1126
self.assertEqual('', err)
1128
# Create branch in root of repository
1129
control = repo.bzrdir
1130
branch = control.create_branch()
1131
control.create_workingtree()
1132
out, err = self.run_bzr('info -v repo')
1133
self.assertEqualDiff(
1134
"""Repository tree (format: knit)
1136
shared repository: repo
1137
repository branch: repo
1140
control: Meta directory format 1
1141
working tree: Working tree format 3
1148
In the working tree:
1156
0 versioned subdirectories
1163
""" % (format.get_branch_format().get_format_description(),
1164
format.repository_format.get_format_description(),
1166
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
def assertCheckoutStatusOutput(self,
1214
command_string, lco_tree, shared_repo=None,
1217
branch_locked=False, repo_locked=False,
1219
light_checkout=True,
1220
checkout_root=None):
1221
"""Check the output of info in a checkout.
1223
This is not quite a mirror of the info code: rather than using the
1224
tree being examined to predict output, it uses a bunch of flags which
1225
allow us, the test writers, to document what *should* be present in
1226
the output. Removing this separation would remove the value of the
1229
:param path: the path to the light checkout.
1230
:param lco_tree: the tree object for the light checkout.
1231
:param shared_repo: A shared repository is in use, expect that in
1233
:param repo_branch: A branch in a shared repository for non light
1235
:param tree_locked: If true, expect the tree to be locked.
1236
:param branch_locked: If true, expect the branch to be locked.
1237
:param repo_locked: If true, expect the repository to be locked.
1238
Note that the lco_tree.branch.repository is inspected, and if is not
1239
actually locked then this parameter is overridden. This is because
1240
pack repositories do not have any public API for obtaining an
1241
exclusive repository wide lock.
1242
:param verbose: verbosity level: 2 or higher to show committers
1244
def friendly_location(url):
1245
path = urlutils.unescape_for_display(url, 'ascii')
1247
return osutils.relpath(osutils.getcwd(), path)
1248
except errors.PathNotChild:
1252
# We expect this to fail because of locking errors.
1253
# (A write-locked file cannot be read-locked
1254
# in the different process -- either on win32 or on linux).
1255
# This should be removed when the locking errors are fixed.
1256
self.expectFailure('OS locks are exclusive '
1257
'for different processes (Bug #174055)',
1258
self.run_bzr_subprocess,
1259
'info ' + command_string)
1260
out, err = self.run_bzr('info %s' % command_string)
1262
(True, True): 'Lightweight checkout',
1263
(True, False): 'Repository checkout',
1264
(False, True): 'Lightweight checkout',
1265
(False, False): 'Checkout',
1266
}[(shared_repo is not None, light_checkout)]
1267
format = {True: self._repo_strings,
1268
False: 'unnamed'}[light_checkout]
1270
repo_locked = lco_tree.branch.repository.get_physical_lock_status()
1271
if repo_locked or branch_locked or tree_locked:
1272
def locked_message(a_bool):
1277
expected_lock_output = (
1280
" working tree: %s\n"
1282
" repository: %s\n" % (
1283
locked_message(tree_locked),
1284
locked_message(branch_locked),
1285
locked_message(repo_locked)))
1287
expected_lock_output = ''
1291
tree_data = (" light checkout root: %s\n" %
1292
friendly_location(lco_tree.bzrdir.root_transport.base))
1294
if lco_tree.branch.get_bound_location() is not None:
1295
tree_data += ("%s checkout root: %s\n" % (extra_space,
1296
friendly_location(lco_tree.branch.bzrdir.root_transport.base)))
1297
if shared_repo is not None:
1299
" checkout of branch: %s\n"
1300
" shared repository: %s\n" %
1301
(friendly_location(repo_branch.bzrdir.root_transport.base),
1302
friendly_location(shared_repo.bzrdir.root_transport.base)))
1303
elif repo_branch is not None:
1305
"%s checkout of branch: %s\n" %
1307
friendly_location(repo_branch.bzrdir.root_transport.base)))
1309
branch_data = (" checkout of branch: %s\n" %
1310
lco_tree.branch.bzrdir.root_transport.base)
1313
verbose_info = ' 0 committers\n'
1317
self.assertEqualDiff(
1322
control: Meta directory format 1
1330
In the working tree:
1338
0 versioned subdirectories
1349
lco_tree._format.get_format_description(),
1350
lco_tree.branch._format.get_format_description(),
1351
lco_tree.branch.repository._format.get_format_description(),
1352
expected_lock_output,
1355
self.assertEqual('', err)
1357
def test_info_locking(self):
1358
transport = self.get_transport()
1359
# Create shared repository with a branch
1360
repo = self.make_repository('repo', shared=True,
1361
format=bzrdir.BzrDirMetaFormat1())
1362
repo.set_make_working_trees(False)
1363
repo.bzrdir.root_transport.mkdir('branch')
1364
repo_branch = controldir.ControlDir.create_branch_convenience(
1365
'repo/branch', format=bzrdir.BzrDirMetaFormat1())
1366
# Do a heavy checkout
1367
transport.mkdir('tree')
1368
transport.mkdir('tree/checkout')
1369
co_branch = controldir.ControlDir.create_branch_convenience(
1370
'tree/checkout', format=bzrdir.BzrDirMetaFormat1())
1371
co_branch.bind(repo_branch)
1372
# Do a light checkout of the heavy one
1373
transport.mkdir('tree/lightcheckout')
1374
lco_dir = bzrdir.BzrDirMetaFormat1().initialize('tree/lightcheckout')
1375
lco_dir.set_branch_reference(co_branch)
1376
lco_dir.create_workingtree()
1377
lco_tree = lco_dir.open_workingtree()
1379
# Test all permutations of locking the working tree, branch and repository
1383
self.assertCheckoutStatusOutput('-v tree/lightcheckout', lco_tree,
1384
repo_branch=repo_branch,
1385
verbose=True, light_checkout=True)
1387
lco_tree.branch.repository.lock_write()
1389
self.assertCheckoutStatusOutput('-v tree/lightcheckout',
1390
lco_tree, repo_branch=repo_branch,
1391
repo_locked=True, verbose=True, light_checkout=True)
1393
lco_tree.branch.repository.unlock()
1395
lco_tree.branch.lock_write()
1397
self.assertCheckoutStatusOutput('-v tree/lightcheckout',
1401
repo_branch=repo_branch,
1404
lco_tree.branch.unlock()
1406
lco_tree.lock_write()
1408
self.assertCheckoutStatusOutput('-v tree/lightcheckout',
1409
lco_tree, repo_branch=repo_branch,
1417
lco_tree.lock_write()
1418
lco_tree.branch.repository.unlock()
1420
self.assertCheckoutStatusOutput('-v tree/lightcheckout',
1421
lco_tree, repo_branch=repo_branch,
1426
lco_tree.branch.repository.lock_write()
1429
lco_tree.lock_write()
1430
lco_tree.branch.unlock()
1432
self.assertCheckoutStatusOutput('-v tree/lightcheckout',
1433
lco_tree, repo_branch=repo_branch,
1437
lco_tree.branch.lock_write()
1440
lco_tree.lock_write()
1441
lco_tree.branch.unlock()
1442
lco_tree.branch.repository.lock_write()
1444
self.assertCheckoutStatusOutput('-v tree/lightcheckout',
1445
lco_tree, repo_branch=repo_branch,
1450
lco_tree.branch.repository.unlock()
1451
lco_tree.branch.lock_write()
1454
lco_tree.branch.lock_write()
1455
lco_tree.branch.repository.unlock()
1457
self.assertCheckoutStatusOutput('-v tree/lightcheckout',
1458
lco_tree, repo_branch=repo_branch,
1462
lco_tree.branch.repository.lock_write()
1463
lco_tree.branch.unlock()
1465
if sys.platform == 'win32':
1466
self.knownFailure('Win32 cannot run "bzr info"'
1467
' when the tree is locked.')
1469
def test_info_stacked(self):
1470
# We have a mainline
1471
trunk_tree = self.make_branch_and_tree('mainline',
1473
trunk_tree.commit('mainline')
1474
# and a branch from it which is stacked
1475
new_dir = trunk_tree.bzrdir.sprout('newbranch', stacked=True)
1476
out, err = self.run_bzr('info newbranch')
1478
"""Standalone tree (format: 1.6)
1480
branch root: newbranch
1483
parent branch: mainline
1484
stacked on: mainline
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)