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."""
22
23
from bzrlib import (
32
from bzrlib.transport import memory
35
class TestInfo(tests.TestCaseWithTransport):
38
super(TestInfo, self).setUp()
39
self._repo_strings = "2a"
27
from bzrlib.osutils import format_date
28
from bzrlib.tests import TestSkipped
29
from bzrlib.tests.blackbox import ExternalBase
32
class TestInfo(ExternalBase):
41
34
def test_info_non_existing(self):
42
self.vfs_transport_factory = memory.MemoryServer
43
location = self.get_url()
44
out, err = self.run_bzr('info '+location, retcode=3)
35
if sys.platform == "win32":
36
location = "C:/i/do/not/exist/"
38
location = "/i/do/not/exist/"
39
out, err = self.runbzr('info '+location, retcode=3)
45
40
self.assertEqual(out, '')
46
self.assertEqual(err, 'bzr: ERROR: Not a branch: "%s".\n' % location)
41
self.assertEqual(err, 'bzr: ERROR: Not a branch: %s\n' % location)
48
43
def test_info_standalone(self):
49
44
transport = self.get_transport()
53
48
self.build_tree(['standalone/a'])
55
50
branch1 = tree1.branch
57
out, err = self.run_bzr('info standalone')
59
"""Standalone tree (format: weave)
61
branch root: standalone
63
self.assertEqual('', err)
65
# Standalone branch - verbose mode
66
out, err = self.run_bzr('info standalone -v')
68
"""Standalone tree (format: weave)
70
branch root: standalone
73
control: All-in-one format 6
74
working tree: Working tree format 2
75
branch: Branch format 4
76
repository: Weave repository format 6
86
0 versioned subdirectories
94
self.assertEqual('', err)
96
# Standalone branch - really verbose mode
97
out, err = self.run_bzr('info standalone -vv')
99
"""Standalone tree (format: weave)
101
branch root: standalone
104
control: All-in-one format 6
105
working tree: Working tree format 2
106
branch: Branch format 4
107
repository: Weave repository format 6
117
0 versioned subdirectories
51
out, err = self.runbzr('info standalone')
57
control: All-in-one format 6
58
working tree: Working tree format 2
59
branch: Branch format 4
60
repository: Weave repository format 6
70
0 versioned subdirectories
78
""" % branch1.bzrdir.root_transport.base, out)
126
79
self.assertEqual('', err)
127
80
tree1.commit('commit one')
128
81
rev = branch1.repository.get_revision(branch1.revision_history()[0])
129
datestring_first = osutils.format_date(rev.timestamp, rev.timezone)
82
datestring_first = format_date(rev.timestamp, rev.timezone)
131
84
# Branch standalone with push location
132
85
branch2 = branch1.bzrdir.sprout('branch').open_branch()
133
86
branch2.set_push_location(branch1.bzrdir.root_transport.base)
135
out, err = self.run_bzr('info branch')
136
self.assertEqualDiff(
137
"""Standalone tree (format: weave)
142
push branch: standalone
143
parent branch: standalone
145
self.assertEqual('', err)
147
out, err = self.run_bzr('info branch --verbose')
148
self.assertEqualDiff(
149
"""Standalone tree (format: weave)
154
push branch: standalone
155
parent branch: standalone
87
out, err = self.runbzr('info branch --verbose')
158
97
control: All-in-one format 6
176
116
first revision: %s
177
117
latest revision: %s
181
""" % (datestring_first, datestring_first,
122
""" % (branch2.bzrdir.root_transport.base,
123
branch1.bzrdir.root_transport.base,
124
branch1.bzrdir.root_transport.base,
125
datestring_first, datestring_first,
126
# poking at _revision_store isn't all that clean, but neither is
127
# having the ui test dependent on the exact overhead of a given store.
128
branch2.repository._revision_store.total_size(
129
branch2.repository.get_transaction())[1] / 1024,
183
131
self.assertEqual('', err)
186
134
# (creates backup as unknown)
187
135
branch1.bzrdir.sprout('bound')
188
136
knit1_format = bzrdir.format_registry.make_bzrdir('knit')
189
upgrade.upgrade('bound', knit1_format)
190
branch3 = bzrdir.BzrDir.open('bound').open_branch()
137
bzrlib.upgrade.upgrade('bound', knit1_format)
138
branch3 = bzrlib.bzrdir.BzrDir.open('bound').open_branch()
191
139
branch3.bind(branch1)
192
140
bound_tree = branch3.bzrdir.open_workingtree()
193
out, err = self.run_bzr('info -v bound')
141
out, err = self.runbzr('info bound')
194
142
self.assertEqualDiff(
195
"""Checkout (format: knit)
198
checkout of branch: standalone
145
checkout of branch: %s
200
147
Related branches:
201
parent branch: standalone
204
151
control: Meta directory format 1
222
169
first revision: %s
223
170
latest revision: %s
227
""" % (bound_tree._format.get_format_description(),
175
""" % (branch3.bzrdir.root_transport.base,
176
branch1.bzrdir.root_transport.base,
177
branch1.bzrdir.root_transport.base,
178
bound_tree._format.get_format_description(),
228
179
branch3._format.get_format_description(),
229
180
branch3.repository._format.get_format_description(),
230
181
datestring_first, datestring_first,
182
# poking at _revision_store isn't all that clean, but neither is
183
# having the ui test dependent on the exact overhead of a given store.
184
branch3.repository._revision_store.total_size(
185
branch3.repository.get_transaction())[1] / 1024,
232
187
self.assertEqual('', err)
234
189
# Checkout standalone (same as above, but does not have parent set)
235
branch4 = bzrdir.BzrDir.create_branch_convenience('checkout',
190
branch4 = bzrlib.bzrdir.BzrDir.create_branch_convenience('checkout',
236
191
format=knit1_format)
237
192
branch4.bind(branch1)
238
193
branch4.bzrdir.open_workingtree().update()
239
out, err = self.run_bzr('info checkout --verbose')
194
out, err = self.runbzr('info checkout --verbose')
240
195
self.assertEqualDiff(
241
"""Checkout (format: knit)
243
checkout root: checkout
244
checkout of branch: standalone
198
checkout of branch: %s
247
201
control: Meta directory format 1
265
220
first revision: %s
266
221
latest revision: %s
270
""" % (branch4.repository._format.get_format_description(),
226
""" % (branch4.bzrdir.root_transport.base,
227
branch1.bzrdir.root_transport.base,
228
branch4.repository._format.get_format_description(),
271
229
datestring_first, datestring_first,
230
# poking at _revision_store isn't all that clean, but neither is
231
# having the ui test dependent on the exact overhead of a given store.
232
branch4.repository._revision_store.total_size(
233
branch4.repository.get_transaction())[1] / 1024,
273
235
self.assertEqual('', err)
275
237
# Lightweight checkout (same as above, different branch and repository)
276
238
tree5 = branch1.create_checkout('lightcheckout', lightweight=True)
277
239
branch5 = tree5.branch
278
out, err = self.run_bzr('info -v lightcheckout')
240
out, err = self.runbzr('info lightcheckout')
279
241
self.assertEqualDiff(
280
"""Lightweight checkout (format: %s)
282
light checkout root: lightcheckout
283
checkout of branch: standalone
243
light checkout root: %s
244
checkout of branch: %s
286
247
control: Meta directory format 1
287
working tree: Working tree format 6
248
working tree: Working tree format 4
288
249
branch: Branch format 4
289
250
repository: Weave repository format 6
304
265
first revision: %s
305
266
latest revision: %s
309
""" % (self._repo_strings, datestring_first, datestring_first,), out)
271
""" % (tree5.bzrdir.root_transport.base,
272
branch1.bzrdir.root_transport.base,
273
datestring_first, datestring_first,
310
275
self.assertEqual('', err)
312
277
# Update initial standalone branch
315
280
tree1.commit('commit two')
316
281
rev = branch1.repository.get_revision(branch1.revision_history()[-1])
317
datestring_last = osutils.format_date(rev.timestamp, rev.timezone)
282
datestring_last = format_date(rev.timestamp, rev.timezone)
319
284
# Out of date branched standalone branch will not be detected
320
out, err = self.run_bzr('info -v branch')
285
out, err = self.runbzr('info branch')
321
286
self.assertEqualDiff(
322
"""Standalone tree (format: weave)
326
290
Related branches:
327
push branch: standalone
328
parent branch: standalone
292
publish to branch: %s
331
295
control: All-in-one format 6
349
313
first revision: %s
350
314
latest revision: %s
354
""" % (datestring_first, datestring_first,
319
""" % (branch2.bzrdir.root_transport.base,
320
branch1.bzrdir.root_transport.base,
321
branch1.bzrdir.root_transport.base,
322
datestring_first, datestring_first,
356
324
self.assertEqual('', err)
358
326
# Out of date bound branch
359
out, err = self.run_bzr('info -v bound')
327
out, err = self.runbzr('info bound')
360
328
self.assertEqualDiff(
361
"""Checkout (format: knit)
364
checkout of branch: standalone
331
checkout of branch: %s
366
333
Related branches:
367
parent branch: standalone
370
337
control: Meta directory format 1
390
357
first revision: %s
391
358
latest revision: %s
395
""" % (branch3.repository._format.get_format_description(),
363
""" % (branch3.bzrdir.root_transport.base,
364
branch1.bzrdir.root_transport.base,
365
branch1.bzrdir.root_transport.base,
366
branch3.repository._format.get_format_description(),
396
367
datestring_first, datestring_first,
368
# poking at _revision_store isn't all that clean, but neither is
369
# having the ui test dependent on the exact overhead of a given store.
370
branch3.repository._revision_store.total_size(
371
branch3.repository.get_transaction())[1] / 1024,
398
373
self.assertEqual('', err)
400
375
# Out of date checkout
401
out, err = self.run_bzr('info -v checkout')
376
out, err = self.runbzr('info checkout')
402
377
self.assertEqualDiff(
403
"""Checkout (format: knit)
405
checkout root: checkout
406
checkout of branch: standalone
380
checkout of branch: %s
409
383
control: Meta directory format 1
429
403
first revision: %s
430
404
latest revision: %s
434
""" % (branch4.repository._format.get_format_description(),
409
""" % (branch4.bzrdir.root_transport.base,
410
branch1.bzrdir.root_transport.base,
411
branch4.repository._format.get_format_description(),
435
412
datestring_first, datestring_first,
413
# poking at _revision_store isn't all that clean, but neither is
414
# having the ui test dependent on the exact overhead of a given store.
415
branch4.repository._revision_store.total_size(
416
branch4.repository.get_transaction())[1] / 1024,
437
418
self.assertEqual('', err)
439
420
# Out of date lightweight checkout
440
out, err = self.run_bzr('info lightcheckout --verbose')
421
out, err = self.runbzr('info lightcheckout --verbose')
441
422
self.assertEqualDiff(
442
"""Lightweight checkout (format: %s)
444
light checkout root: lightcheckout
445
checkout of branch: standalone
424
light checkout root: %s
425
checkout of branch: %s
448
428
control: Meta directory format 1
449
working tree: Working tree format 6
429
working tree: Working tree format 4
450
430
branch: Branch format 4
451
431
repository: Weave repository format 6
468
449
first revision: %s
469
450
latest revision: %s
473
""" % (self._repo_strings, datestring_first, datestring_last,), out)
455
""" % (tree5.bzrdir.root_transport.base,
456
branch1.bzrdir.root_transport.base,
457
datestring_first, datestring_last,
474
459
self.assertEqual('', err)
476
461
def test_info_standalone_no_tree(self):
478
463
format = bzrdir.format_registry.make_bzrdir('default')
479
464
branch = self.make_branch('branch')
480
465
repo = branch.repository
481
out, err = self.run_bzr('info branch -v')
466
out, err = self.runbzr('info branch')
482
467
self.assertEqualDiff(
483
"""Standalone branch (format: %s)
488
472
control: Meta directory format 1
497
""" % (info.describe_format(repo.bzrdir, repo, branch, None),
482
""" % (branch.bzrdir.root_transport.base,
498
483
format.get_branch_format().get_format_description(),
499
484
format.repository_format.get_format_description(),
507
492
# Create shared repository
508
493
repo = self.make_repository('repo', shared=True, format=format)
509
494
repo.set_make_working_trees(False)
510
out, err = self.run_bzr('info -v repo')
495
out, err = self.runbzr('info repo')
511
496
self.assertEqualDiff(
512
"""Shared repository (format: dirstate or dirstate-tags or knit)
514
498
shared repository: %s
517
501
control: Meta directory format 1
522
""" % ('repo', format.repository_format.get_format_description(),
507
""" % (repo.bzrdir.root_transport.base,
508
format.repository_format.get_format_description(),
524
510
self.assertEqual('', err)
527
513
repo.bzrdir.root_transport.mkdir('branch')
528
514
branch1 = repo.bzrdir.create_branch_convenience('repo/branch',
530
out, err = self.run_bzr('info -v repo/branch')
516
out, err = self.runbzr('info repo/branch')
531
517
self.assertEqualDiff(
532
"""Repository branch (format: dirstate or knit)
534
shared repository: repo
535
repository branch: repo/branch
519
shared repository: %s
520
repository branch: branch
538
523
control: Meta directory format 1
547
""" % (format.get_branch_format().get_format_description(),
533
""" % (repo.bzrdir.root_transport.base,
534
format.get_branch_format().get_format_description(),
548
535
format.repository_format.get_format_description(),
550
537
self.assertEqual('', err)
552
539
# Create lightweight checkout
553
540
transport.mkdir('tree')
554
541
transport.mkdir('tree/lightcheckout')
555
tree2 = branch1.create_checkout('tree/lightcheckout',
542
tree2 = branch1.create_checkout('tree/lightcheckout',
556
543
lightweight=True)
557
544
branch2 = tree2.branch
558
self.assertCheckoutStatusOutput('-v tree/lightcheckout', tree2,
559
shared_repo=repo, repo_branch=branch1, verbose=True)
545
self.assertCheckoutStatusOutput('tree/lightcheckout', tree2,
561
548
# Create normal checkout
562
549
tree3 = branch1.create_checkout('tree/checkout')
569
556
tree2.commit('commit one')
570
557
rev = repo.get_revision(branch2.revision_history()[0])
571
datestring_first = osutils.format_date(rev.timestamp, rev.timezone)
572
out, err = self.run_bzr('info tree/lightcheckout --verbose')
558
datestring_first = format_date(rev.timestamp, rev.timezone)
559
out, err = self.runbzr('info tree/lightcheckout --verbose')
573
560
self.assertEqualDiff(
574
"""Lightweight checkout (format: %s)
576
light checkout root: tree/lightcheckout
577
checkout of branch: repo/branch
578
shared repository: repo
562
light checkout root: %s
563
shared repository: %s
564
repository branch: branch
581
567
control: Meta directory format 1
582
working tree: Working tree format 6
568
working tree: Working tree format 4
599
586
first revision: %s
600
587
latest revision: %s
604
""" % (self._repo_strings, format.get_branch_format().get_format_description(),
592
""" % (tree2.bzrdir.root_transport.base,
593
repo.bzrdir.root_transport.base,
594
format.get_branch_format().get_format_description(),
605
595
format.repository_format.get_format_description(),
606
596
datestring_first, datestring_first,
597
# poking at _revision_store isn't all that clean, but neither is
598
# having the ui test dependent on the exact overhead of a given store.
599
repo._revision_store.total_size(repo.get_transaction())[1] / 1024,
608
601
self.assertEqual('', err)
610
603
# Out of date checkout
611
out, err = self.run_bzr('info -v tree/checkout')
604
out, err = self.runbzr('info tree/checkout')
612
605
self.assertEqualDiff(
613
"""Checkout (format: unnamed)
615
checkout root: tree/checkout
616
checkout of branch: repo/branch
608
checkout of branch: %s
619
611
control: Meta directory format 1
620
working tree: Working tree format 6
612
working tree: Working tree format 4
641
""" % (format.get_branch_format().get_format_description(),
634
""" % (tree3.bzrdir.root_transport.base,
635
branch1.bzrdir.root_transport.base,
636
format.get_branch_format().get_format_description(),
642
637
format.repository_format.get_format_description(),
644
639
self.assertEqual('', err)
648
643
self.build_tree(['tree/checkout/b'])
650
out, err = self.run_bzr('info tree/checkout --verbose')
645
out, err = self.runbzr('info tree/checkout --verbose')
651
646
self.assertEqualDiff(
652
"""Checkout (format: unnamed)
654
checkout root: tree/checkout
655
checkout of branch: repo/branch
649
checkout of branch: %s
658
652
control: Meta directory format 1
659
working tree: Working tree format 6
653
working tree: Working tree format 4
676
671
first revision: %s
677
672
latest revision: %s
681
""" % (format.get_branch_format().get_format_description(),
677
""" % (tree3.bzrdir.root_transport.base, branch1.bzrdir.root_transport.base,
678
format.get_branch_format().get_format_description(),
682
679
format.repository_format.get_format_description(),
683
680
datestring_first, datestring_first,
681
# poking at _revision_store isn't all that clean, but neither is
682
# having the ui test dependent on the exact overhead of a given store.
683
repo._revision_store.total_size(repo.get_transaction())[1] / 1024,
685
685
self.assertEqual('', err)
686
686
tree3.commit('commit two')
688
688
# Out of date lightweight checkout
689
689
rev = repo.get_revision(branch1.revision_history()[-1])
690
datestring_last = osutils.format_date(rev.timestamp, rev.timezone)
691
out, err = self.run_bzr('info tree/lightcheckout --verbose')
690
datestring_last = format_date(rev.timestamp, rev.timezone)
691
out, err = self.runbzr('info tree/lightcheckout --verbose')
692
692
self.assertEqualDiff(
693
"""Lightweight checkout (format: %s)
695
light checkout root: tree/lightcheckout
696
checkout of branch: repo/branch
697
shared repository: repo
694
light checkout root: %s
695
shared repository: %s
696
repository branch: branch
700
699
control: Meta directory format 1
701
working tree: Working tree format 6
700
working tree: Working tree format 4
720
720
first revision: %s
721
721
latest revision: %s
725
""" % (self._repo_strings, format.get_branch_format().get_format_description(),
726
""" % (tree2.bzrdir.root_transport.base,
727
repo.bzrdir.root_transport.base,
728
format.get_branch_format().get_format_description(),
726
729
format.repository_format.get_format_description(),
727
730
datestring_first, datestring_last,
731
# poking at _revision_store isn't all that clean, but neither is
732
# having the ui test dependent on the exact overhead of a given store.
733
repo._revision_store.total_size(repo.get_transaction())[1] / 1024,
729
735
self.assertEqual('', err)
731
737
# Show info about shared branch
732
out, err = self.run_bzr('info repo/branch --verbose')
738
out, err = self.runbzr('info repo/branch --verbose')
733
739
self.assertEqualDiff(
734
"""Repository branch (format: dirstate or knit)
736
shared repository: repo
737
repository branch: repo/branch
741
shared repository: %s
742
repository branch: branch
740
745
control: Meta directory format 1
747
753
first revision: %s
748
754
latest revision: %s
752
""" % (format.get_branch_format().get_format_description(),
759
""" % (repo.bzrdir.root_transport.base,
760
format.get_branch_format().get_format_description(),
753
761
format.repository_format.get_format_description(),
754
762
datestring_first, datestring_last,
763
# poking at _revision_store isn't all that clean, but neither is
764
# having the ui test dependent on the exact overhead of a given store.
765
repo._revision_store.total_size(repo.get_transaction())[1] / 1024,
756
767
self.assertEqual('', err)
758
769
# Show info about repository with revisions
759
out, err = self.run_bzr('info -v repo')
770
out, err = self.runbzr('info repo')
760
771
self.assertEqualDiff(
761
"""Shared repository (format: dirstate or dirstate-tags or knit)
763
shared repository: repo
773
shared repository: %s
766
776
control: Meta directory format 1
771
""" % (format.repository_format.get_format_description(),
782
""" % (repo.bzrdir.root_transport.base,
783
format.repository_format.get_format_description(),
784
# poking at _revision_store isn't all that clean, but neither is
785
# having the ui test dependent on the exact overhead of a given store.
786
repo._revision_store.total_size(repo.get_transaction())[1] / 1024,
773
788
self.assertEqual('', err)
779
794
# Create shared repository with working trees
780
795
repo = self.make_repository('repo', shared=True, format=format)
781
796
repo.set_make_working_trees(True)
782
out, err = self.run_bzr('info -v repo')
797
out, err = self.runbzr('info repo')
783
798
self.assertEqualDiff(
784
"""Shared repository with trees (format: dirstate or dirstate-tags or knit)
786
shared repository: repo
800
shared repository: %s
789
803
control: Meta directory format 1
792
806
Create working tree for new branches inside the repository.
796
""" % (format.repository_format.get_format_description(),
811
""" % (repo.bzrdir.root_transport.base,
812
format.repository_format.get_format_description(),
798
814
self.assertEqual('', err)
804
820
branch2 = branch1.bzrdir.sprout('repo/branch2').open_branch()
806
822
# Empty first branch
807
out, err = self.run_bzr('info repo/branch1 --verbose')
823
out, err = self.runbzr('info repo/branch1 --verbose')
808
824
self.assertEqualDiff(
809
"""Repository tree (format: knit)
811
shared repository: repo
812
repository branch: repo/branch1
826
shared repository: %s
827
repository checkout: branch1
815
830
control: Meta directory format 1
835
""" % (format.get_branch_format().get_format_description(),
852
""" % (repo.bzrdir.root_transport.base,
853
format.get_branch_format().get_format_description(),
836
854
format.repository_format.get_format_description(),
838
856
self.assertEqual('', err)
844
862
tree1.commit('commit one')
845
863
rev = repo.get_revision(branch1.revision_history()[0])
846
datestring_first = osutils.format_date(rev.timestamp, rev.timezone)
847
out, err = self.run_bzr('info -v repo/branch1')
864
datestring_first = format_date(rev.timestamp, rev.timezone)
865
out, err = self.runbzr('info repo/branch1')
848
866
self.assertEqualDiff(
849
"""Repository tree (format: knit)
851
shared repository: repo
852
repository branch: repo/branch1
868
shared repository: %s
869
repository checkout: branch1
855
872
control: Meta directory format 1
873
890
first revision: %s
874
891
latest revision: %s
878
""" % (format.get_branch_format().get_format_description(),
896
""" % (repo.bzrdir.root_transport.base,
897
format.get_branch_format().get_format_description(),
879
898
format.repository_format.get_format_description(),
880
899
datestring_first, datestring_first,
900
# poking at _revision_store isn't all that clean, but neither is
901
# having the ui test dependent on the exact overhead of a given store.
902
repo._revision_store.total_size(repo.get_transaction())[1] / 1024,
882
904
self.assertEqual('', err)
884
906
# Out of date second branch
885
out, err = self.run_bzr('info repo/branch2 --verbose')
907
out, err = self.runbzr('info repo/branch2 --verbose')
886
908
self.assertEqualDiff(
887
"""Repository tree (format: knit)
889
shared repository: repo
890
repository branch: repo/branch2
910
shared repository: %s
911
repository checkout: branch2
892
913
Related branches:
893
parent branch: repo/branch1
896
917
control: Meta directory format 1
916
""" % (format.get_branch_format().get_format_description(),
939
""" % (repo.bzrdir.root_transport.base,
940
branch1.bzrdir.root_transport.base,
941
format.get_branch_format().get_format_description(),
917
942
format.repository_format.get_format_description(),
943
# poking at _revision_store isn't all that clean, but neither is
944
# having the ui test dependent on the exact overhead of a given store.
945
repo._revision_store.total_size(repo.get_transaction())[1] / 1024,
919
947
self.assertEqual('', err)
921
949
# Update second branch
922
950
tree2 = branch2.bzrdir.open_workingtree()
923
951
tree2.pull(branch1)
924
out, err = self.run_bzr('info -v repo/branch2')
952
out, err = self.runbzr('info repo/branch2')
925
953
self.assertEqualDiff(
926
"""Repository tree (format: knit)
928
shared repository: repo
929
repository branch: repo/branch2
955
shared repository: %s
956
repository checkout: branch2
931
958
Related branches:
932
parent branch: repo/branch1
935
962
control: Meta directory format 1
953
980
first revision: %s
954
981
latest revision: %s
958
""" % (format.get_branch_format().get_format_description(),
986
""" % (repo.bzrdir.root_transport.base,
987
branch1.bzrdir.root_transport.base,
988
format.get_branch_format().get_format_description(),
959
989
format.repository_format.get_format_description(),
960
990
datestring_first, datestring_first,
991
# poking at _revision_store isn't all that clean, but neither is
992
# having the ui test dependent on the exact overhead of a given store.
993
repo._revision_store.total_size(repo.get_transaction())[1] / 1024,
962
995
self.assertEqual('', err)
964
997
# Show info about repository with revisions
965
out, err = self.run_bzr('info -v repo')
998
out, err = self.runbzr('info repo')
966
999
self.assertEqualDiff(
967
"""Shared repository with trees (format: dirstate or dirstate-tags or knit)
969
shared repository: repo
1001
shared repository: %s
972
1004
control: Meta directory format 1
975
1007
Create working tree for new branches inside the repository.
979
""" % (format.repository_format.get_format_description(),
1012
""" % (repo.bzrdir.root_transport.base,
1013
format.repository_format.get_format_description(),
1014
# poking at _revision_store isn't all that clean, but neither is
1015
# having the ui test dependent on the exact overhead of a given store.
1016
repo._revision_store.total_size(repo.get_transaction())[1] / 1024,
982
1019
self.assertEqual('', err)
984
1021
def test_info_shared_repository_with_tree_in_root(self):
985
1022
format = bzrdir.format_registry.make_bzrdir('knit')
986
1023
transport = self.get_transport()
988
1025
# Create shared repository with working trees
989
1026
repo = self.make_repository('repo', shared=True, format=format)
990
1027
repo.set_make_working_trees(True)
991
out, err = self.run_bzr('info -v repo')
1028
out, err = self.runbzr('info repo')
992
1029
self.assertEqualDiff(
993
"""Shared repository with trees (format: dirstate or dirstate-tags or knit)
995
shared repository: repo
1031
shared repository: %s
998
1034
control: Meta directory format 1
1001
1037
Create working tree for new branches inside the repository.
1005
""" % (format.repository_format.get_format_description(),
1042
""" % (repo.bzrdir.root_transport.base,
1043
format.repository_format.get_format_description(),
1007
1045
self.assertEqual('', err)
1010
1048
control = repo.bzrdir
1011
1049
branch = control.create_branch()
1012
1050
control.create_workingtree()
1013
out, err = self.run_bzr('info -v repo')
1051
out, err = self.runbzr('info repo')
1014
1052
self.assertEqualDiff(
1015
"""Repository tree (format: knit)
1017
shared repository: repo
1018
repository branch: repo
1054
shared repository: %s
1055
repository checkout: .
1021
1058
control: Meta directory format 1
1036
1073
Branch history:
1041
""" % (format.get_branch_format().get_format_description(),
1079
""" % (repo.bzrdir.root_transport.base,
1080
format.get_branch_format().get_format_description(),
1042
1081
format.repository_format.get_format_description(),
1044
1083
self.assertEqual('', err)
1046
def test_info_repository_hook(self):
1047
format = bzrdir.format_registry.make_bzrdir('knit')
1048
def repo_info(repo, stats, outf):
1049
outf.write("more info\n")
1050
info.hooks.install_named_hook('repository', repo_info, None)
1051
# Create shared repository with working trees
1052
repo = self.make_repository('repo', shared=True, format=format)
1053
out, err = self.run_bzr('info -v repo')
1054
self.assertEqualDiff(
1055
"""Shared repository with trees (format: dirstate or dirstate-tags or knit)
1057
shared repository: repo
1060
control: Meta directory format 1
1063
Create working tree for new branches inside the repository.
1068
""" % (format.repository_format.get_format_description(),
1070
self.assertEqual('', err)
1072
def assertCheckoutStatusOutput(self,
1085
def assertCheckoutStatusOutput(self,
1073
1086
command_string, lco_tree, shared_repo=None,
1074
1087
repo_branch=None,
1075
1088
tree_locked=False,
1076
1089
branch_locked=False, repo_locked=False,
1078
light_checkout=True,
1079
checkout_root=None):
1080
"""Check the output of info in a checkout.
1091
light_checkout=True):
1092
"""Check the output of info in a light checkout tree.
1082
1094
This is not quite a mirror of the info code: rather than using the
1083
1095
tree being examined to predict output, it uses a bunch of flags which
1084
1096
allow us, the test writers, to document what *should* be present in
1085
1097
the output. Removing this separation would remove the value of the
1088
1100
:param path: the path to the light checkout.
1089
1101
:param lco_tree: the tree object for the light checkout.
1090
1102
:param shared_repo: A shared repository is in use, expect that in
1094
1106
:param tree_locked: If true, expect the tree to be locked.
1095
1107
:param branch_locked: If true, expect the branch to be locked.
1096
1108
:param repo_locked: If true, expect the repository to be locked.
1097
Note that the lco_tree.branch.repository is inspected, and if is not
1098
actually locked then this parameter is overridden. This is because
1099
pack repositories do not have any public API for obtaining an
1100
exclusive repository wide lock.
1101
:param verbose: verbosity level: 2 or higher to show committers
1109
:param verbose: If true, expect verbose output
1103
def friendly_location(url):
1104
path = urlutils.unescape_for_display(url, 'ascii')
1106
return osutils.relpath(osutils.getcwd(), path)
1107
except errors.PathNotChild:
1111
# We expect this to fail because of locking errors.
1112
# (A write-locked file cannot be read-locked
1113
# in the different process -- either on win32 or on linux).
1114
# This should be removed when the locking errors are fixed.
1115
self.expectFailure('OS locks are exclusive '
1116
'for different processes (Bug #174055)',
1117
self.run_bzr_subprocess,
1118
'info ' + command_string)
1119
out, err = self.run_bzr('info %s' % command_string)
1121
(True, True): 'Lightweight checkout',
1122
(True, False): 'Repository checkout',
1123
(False, True): 'Lightweight checkout',
1124
(False, False): 'Checkout',
1125
}[(shared_repo is not None, light_checkout)]
1126
format = {True: self._repo_strings,
1127
False: 'unnamed'}[light_checkout]
1129
repo_locked = lco_tree.branch.repository.get_physical_lock_status()
1111
out, err = self.runbzr('info %s' % command_string)
1130
1112
if repo_locked or branch_locked or tree_locked:
1131
1113
def locked_message(a_bool):
1144
1126
locked_message(repo_locked)))
1146
1128
expected_lock_output = ''
1149
1129
if light_checkout:
1150
tree_data = (" light checkout root: %s\n" %
1151
friendly_location(lco_tree.bzrdir.root_transport.base))
1153
if lco_tree.branch.get_bound_location() is not None:
1154
tree_data += ("%s checkout root: %s\n" % (extra_space,
1155
friendly_location(lco_tree.branch.bzrdir.root_transport.base)))
1130
tree_data = (" light checkout root: %s" %
1131
lco_tree.bzrdir.root_transport.base)
1133
tree_data = (" checkout root: %s" %
1134
lco_tree.bzrdir.root_transport.base)
1156
1135
if shared_repo is not None:
1157
1136
branch_data = (
1158
" checkout of branch: %s\n"
1159
" shared repository: %s\n" %
1160
(friendly_location(repo_branch.bzrdir.root_transport.base),
1161
friendly_location(shared_repo.bzrdir.root_transport.base)))
1137
" shared repository: %s\n"
1138
" repository branch: branch\n" %
1139
shared_repo.bzrdir.root_transport.base)
1162
1140
elif repo_branch is not None:
1163
1141
branch_data = (
1164
"%s checkout of branch: %s\n" %
1166
friendly_location(repo_branch.bzrdir.root_transport.base)))
1142
" checkout of branch: %s\n" %
1143
repo_branch.bzrdir.root_transport.base)
1168
branch_data = (" checkout of branch: %s\n" %
1145
branch_data = (" checkout of branch: %s\n" %
1169
1146
lco_tree.branch.bzrdir.root_transport.base)
1172
1149
verbose_info = ' 0 committers\n'
1174
1151
verbose_info = ''
1176
1153
self.assertEqualDiff(
1181
1158
control: Meta directory format 1
1182
1159
working tree: %s
1214
1190
transport = self.get_transport()
1215
1191
# Create shared repository with a branch
1216
1192
repo = self.make_repository('repo', shared=True,
1217
format=bzrdir.BzrDirMetaFormat1())
1193
format=bzrlib.bzrdir.BzrDirMetaFormat1())
1218
1194
repo.set_make_working_trees(False)
1219
1195
repo.bzrdir.root_transport.mkdir('branch')
1220
1196
repo_branch = repo.bzrdir.create_branch_convenience('repo/branch',
1221
format=bzrdir.BzrDirMetaFormat1())
1197
format=bzrlib.bzrdir.BzrDirMetaFormat1())
1222
1198
# Do a heavy checkout
1223
1199
transport.mkdir('tree')
1224
1200
transport.mkdir('tree/checkout')
1225
co_branch = bzrdir.BzrDir.create_branch_convenience('tree/checkout',
1226
format=bzrdir.BzrDirMetaFormat1())
1201
co_branch = bzrlib.bzrdir.BzrDir.create_branch_convenience('tree/checkout',
1202
format=bzrlib.bzrdir.BzrDirMetaFormat1())
1227
1203
co_branch.bind(repo_branch)
1228
1204
# Do a light checkout of the heavy one
1229
1205
transport.mkdir('tree/lightcheckout')
1230
lco_dir = bzrdir.BzrDirMetaFormat1().initialize('tree/lightcheckout')
1231
branch.BranchReferenceFormat().initialize(lco_dir,
1232
target_branch=co_branch)
1206
lco_dir = bzrlib.bzrdir.BzrDirMetaFormat1().initialize('tree/lightcheckout')
1207
bzrlib.branch.BranchReferenceFormat().initialize(lco_dir, co_branch)
1233
1208
lco_dir.create_workingtree()
1234
1209
lco_tree = lco_dir.open_workingtree()
1240
self.assertCheckoutStatusOutput('-v tree/lightcheckout', lco_tree,
1241
repo_branch=repo_branch,
1242
verbose=True, light_checkout=True)
1215
self.assertCheckoutStatusOutput('tree/lightcheckout', lco_tree)
1244
1217
lco_tree.branch.repository.lock_write()
1246
self.assertCheckoutStatusOutput('-v tree/lightcheckout',
1247
lco_tree, repo_branch=repo_branch,
1248
repo_locked=True, verbose=True, light_checkout=True)
1219
self.assertCheckoutStatusOutput('tree/lightcheckout',
1250
1223
lco_tree.branch.repository.unlock()
1252
1225
lco_tree.branch.lock_write()
1254
self.assertCheckoutStatusOutput('-v tree/lightcheckout',
1227
self.assertCheckoutStatusOutput('tree/lightcheckout',
1256
1229
branch_locked=True,
1258
repo_branch=repo_branch,
1261
1232
lco_tree.branch.unlock()
1263
1234
lco_tree.lock_write()
1265
self.assertCheckoutStatusOutput('-v tree/lightcheckout',
1266
lco_tree, repo_branch=repo_branch,
1236
self.assertCheckoutStatusOutput('tree/lightcheckout',
1267
1238
tree_locked=True,
1268
1239
branch_locked=True,
1272
1242
lco_tree.unlock()
1274
1244
lco_tree.lock_write()
1275
1245
lco_tree.branch.repository.unlock()
1277
self.assertCheckoutStatusOutput('-v tree/lightcheckout',
1278
lco_tree, repo_branch=repo_branch,
1247
self.assertCheckoutStatusOutput('tree/lightcheckout',
1279
1249
tree_locked=True,
1283
1252
lco_tree.branch.repository.lock_write()
1284
1253
lco_tree.unlock()
1298
1266
lco_tree.branch.unlock()
1299
1267
lco_tree.branch.repository.lock_write()
1301
self.assertCheckoutStatusOutput('-v tree/lightcheckout',
1302
lco_tree, repo_branch=repo_branch,
1269
self.assertCheckoutStatusOutput('tree/lightcheckout',
1303
1271
tree_locked=True,
1307
1274
lco_tree.branch.repository.unlock()
1308
1275
lco_tree.branch.lock_write()
1311
1278
lco_tree.branch.lock_write()
1312
1279
lco_tree.branch.repository.unlock()
1314
self.assertCheckoutStatusOutput('-v tree/lightcheckout',
1315
lco_tree, repo_branch=repo_branch,
1281
self.assertCheckoutStatusOutput('tree/lightcheckout',
1319
1285
lco_tree.branch.repository.lock_write()
1320
1286
lco_tree.branch.unlock()
1322
if sys.platform == 'win32':
1323
self.knownFailure('Win32 cannot run "bzr info"'
1324
' when the tree is locked.')
1326
1288
def test_info_locking_oslocks(self):
1327
1289
if sys.platform == "win32":
1328
self.skip("don't use oslocks on win32 in unix manner")
1329
# This test tests old (all-in-one, OS lock using) behaviour which
1330
# simply cannot work on windows (and is indeed why we changed our
1331
# design. As such, don't try to remove the thisFailsStrictLockCheck
1333
self.thisFailsStrictLockCheck()
1290
raise TestSkipped("don't use oslocks on win32 in unix manner")
1335
1292
tree = self.make_branch_and_tree('branch',
1336
format=bzrdir.BzrDirFormat6())
1293
format=bzrlib.bzrdir.BzrDirFormat6())
1338
1295
# Test all permutations of locking the working tree, branch and repository
1339
1296
# XXX: Well not yet, as we can't query oslocks yet. Currently, it's
1367
1323
Branch history:
1372
""" % ('branch', tree.branch.repository._format.get_format_description(),
1329
""" % (tree.bzrdir.root_transport.base,
1330
tree.branch.repository._format.get_format_description(),
1374
1332
self.assertEqual('', err)
1376
1334
tree.lock_write()
1377
out, err = self.run_bzr('info -v branch')
1335
out, err = self.runbzr('info branch')
1378
1336
self.assertEqualDiff(
1379
"""Standalone tree (format: weave)
1381
1338
branch root: %s
1399
1356
Branch history:
1404
""" % ('branch', tree.branch.repository._format.get_format_description(),
1362
""" % (tree.bzrdir.root_transport.base,
1363
tree.branch.repository._format.get_format_description(),
1406
1365
self.assertEqual('', err)
1409
def test_info_stacked(self):
1410
# We have a mainline
1411
trunk_tree = self.make_branch_and_tree('mainline',
1413
trunk_tree.commit('mainline')
1414
# and a branch from it which is stacked
1415
new_dir = trunk_tree.bzrdir.sprout('newbranch', stacked=True)
1416
out, err = self.run_bzr('info newbranch')
1418
"""Standalone tree (format: 1.6)
1420
branch root: newbranch
1423
parent branch: mainline
1424
stacked on: mainline
1426
self.assertEqual("", err)