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
153
branch: Branch format 5
209
156
In the working tree:
222
169
first revision: %s
223
170
latest revision: %s
227
""" % (bound_tree._format.get_format_description(),
228
branch3._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(),
229
179
branch3.repository._format.get_format_description(),
230
180
datestring_first, datestring_first,
181
# poking at _revision_store isn't all that clean, but neither is
182
# having the ui test dependent on the exact overhead of a given store.
183
branch3.repository._revision_store.total_size(
184
branch3.repository.get_transaction())[1] / 1024,
232
186
self.assertEqual('', err)
234
188
# Checkout standalone (same as above, but does not have parent set)
235
branch4 = bzrdir.BzrDir.create_branch_convenience('checkout',
189
branch4 = bzrlib.bzrdir.BzrDir.create_branch_convenience('checkout',
236
190
format=knit1_format)
237
191
branch4.bind(branch1)
238
192
branch4.bzrdir.open_workingtree().update()
239
out, err = self.run_bzr('info checkout --verbose')
193
out, err = self.runbzr('info checkout --verbose')
240
194
self.assertEqualDiff(
241
"""Checkout (format: knit)
243
checkout root: checkout
244
checkout of branch: standalone
197
checkout of branch: %s
247
200
control: Meta directory format 1
265
219
first revision: %s
266
220
latest revision: %s
270
""" % (branch4.repository._format.get_format_description(),
225
""" % (branch4.bzrdir.root_transport.base,
226
branch1.bzrdir.root_transport.base,
227
branch4.repository._format.get_format_description(),
271
228
datestring_first, datestring_first,
229
# poking at _revision_store isn't all that clean, but neither is
230
# having the ui test dependent on the exact overhead of a given store.
231
branch4.repository._revision_store.total_size(
232
branch4.repository.get_transaction())[1] / 1024,
273
234
self.assertEqual('', err)
275
236
# Lightweight checkout (same as above, different branch and repository)
276
237
tree5 = branch1.create_checkout('lightcheckout', lightweight=True)
277
238
branch5 = tree5.branch
278
out, err = self.run_bzr('info -v lightcheckout')
239
out, err = self.runbzr('info lightcheckout')
279
240
self.assertEqualDiff(
280
"""Lightweight checkout (format: %s)
282
light checkout root: lightcheckout
283
checkout of branch: standalone
242
light checkout root: %s
243
checkout of branch: %s
286
246
control: Meta directory format 1
287
working tree: Working tree format 6
247
working tree: Working tree format 3
288
248
branch: Branch format 4
289
249
repository: Weave repository format 6
304
264
first revision: %s
305
265
latest revision: %s
309
""" % (self._repo_strings, datestring_first, datestring_first,), out)
270
""" % (tree5.bzrdir.root_transport.base,
271
branch1.bzrdir.root_transport.base,
272
datestring_first, datestring_first,
310
274
self.assertEqual('', err)
312
276
# Update initial standalone branch
315
279
tree1.commit('commit two')
316
280
rev = branch1.repository.get_revision(branch1.revision_history()[-1])
317
datestring_last = osutils.format_date(rev.timestamp, rev.timezone)
281
datestring_last = format_date(rev.timestamp, rev.timezone)
319
283
# Out of date branched standalone branch will not be detected
320
out, err = self.run_bzr('info -v branch')
284
out, err = self.runbzr('info branch')
321
285
self.assertEqualDiff(
322
"""Standalone tree (format: weave)
326
289
Related branches:
327
push branch: standalone
328
parent branch: standalone
291
publish to branch: %s
331
294
control: All-in-one format 6
349
312
first revision: %s
350
313
latest revision: %s
354
""" % (datestring_first, datestring_first,
318
""" % (branch2.bzrdir.root_transport.base,
319
branch1.bzrdir.root_transport.base,
320
branch1.bzrdir.root_transport.base,
321
datestring_first, datestring_first,
356
323
self.assertEqual('', err)
358
325
# Out of date bound branch
359
out, err = self.run_bzr('info -v bound')
326
out, err = self.runbzr('info bound')
360
327
self.assertEqualDiff(
361
"""Checkout (format: knit)
364
checkout of branch: standalone
330
checkout of branch: %s
366
332
Related branches:
367
parent branch: standalone
370
336
control: Meta directory format 1
390
356
first revision: %s
391
357
latest revision: %s
395
""" % (branch3.repository._format.get_format_description(),
362
""" % (branch3.bzrdir.root_transport.base,
363
branch1.bzrdir.root_transport.base,
364
branch1.bzrdir.root_transport.base,
365
branch3.repository._format.get_format_description(),
396
366
datestring_first, datestring_first,
367
# poking at _revision_store isn't all that clean, but neither is
368
# having the ui test dependent on the exact overhead of a given store.
369
branch3.repository._revision_store.total_size(
370
branch3.repository.get_transaction())[1] / 1024,
398
372
self.assertEqual('', err)
400
374
# Out of date checkout
401
out, err = self.run_bzr('info -v checkout')
375
out, err = self.runbzr('info checkout')
402
376
self.assertEqualDiff(
403
"""Checkout (format: knit)
405
checkout root: checkout
406
checkout of branch: standalone
379
checkout of branch: %s
409
382
control: Meta directory format 1
429
402
first revision: %s
430
403
latest revision: %s
434
""" % (branch4.repository._format.get_format_description(),
408
""" % (branch4.bzrdir.root_transport.base,
409
branch1.bzrdir.root_transport.base,
410
branch4.repository._format.get_format_description(),
435
411
datestring_first, datestring_first,
412
# poking at _revision_store isn't all that clean, but neither is
413
# having the ui test dependent on the exact overhead of a given store.
414
branch4.repository._revision_store.total_size(
415
branch4.repository.get_transaction())[1] / 1024,
437
417
self.assertEqual('', err)
439
419
# Out of date lightweight checkout
440
out, err = self.run_bzr('info lightcheckout --verbose')
420
out, err = self.runbzr('info lightcheckout --verbose')
441
421
self.assertEqualDiff(
442
"""Lightweight checkout (format: %s)
444
light checkout root: lightcheckout
445
checkout of branch: standalone
423
light checkout root: %s
424
checkout of branch: %s
448
427
control: Meta directory format 1
449
working tree: Working tree format 6
428
working tree: Working tree format 3
450
429
branch: Branch format 4
451
430
repository: Weave repository format 6
468
448
first revision: %s
469
449
latest revision: %s
473
""" % (self._repo_strings, datestring_first, datestring_last,), out)
454
""" % (tree5.bzrdir.root_transport.base,
455
branch1.bzrdir.root_transport.base,
456
datestring_first, datestring_last,
474
458
self.assertEqual('', err)
476
460
def test_info_standalone_no_tree(self):
478
462
format = bzrdir.format_registry.make_bzrdir('default')
479
463
branch = self.make_branch('branch')
480
464
repo = branch.repository
481
out, err = self.run_bzr('info branch -v')
465
out, err = self.runbzr('info branch')
482
466
self.assertEqualDiff(
483
"""Standalone branch (format: %s)
488
471
control: Meta directory format 1
472
branch: Branch format 5
497
""" % (info.describe_format(repo.bzrdir, repo, branch, None),
498
format.get_branch_format().get_format_description(),
481
""" % (branch.bzrdir.root_transport.base,
499
482
format.repository_format.get_format_description(),
501
484
self.assertEqual('', err)
507
490
# Create shared repository
508
491
repo = self.make_repository('repo', shared=True, format=format)
509
492
repo.set_make_working_trees(False)
510
out, err = self.run_bzr('info -v repo')
493
out, err = self.runbzr('info repo')
511
494
self.assertEqualDiff(
512
"""Shared repository (format: dirstate or dirstate-tags or knit)
514
496
shared repository: %s
517
499
control: Meta directory format 1
522
""" % ('repo', format.repository_format.get_format_description(),
505
""" % (repo.bzrdir.root_transport.base,
506
format.repository_format.get_format_description(),
524
508
self.assertEqual('', err)
527
511
repo.bzrdir.root_transport.mkdir('branch')
528
512
branch1 = repo.bzrdir.create_branch_convenience('repo/branch',
530
out, err = self.run_bzr('info -v repo/branch')
514
out, err = self.runbzr('info repo/branch')
531
515
self.assertEqualDiff(
532
"""Repository branch (format: dirstate or knit)
534
shared repository: repo
535
repository branch: repo/branch
517
shared repository: %s
518
repository branch: branch
538
521
control: Meta directory format 1
522
branch: Branch format 5
547
""" % (format.get_branch_format().get_format_description(),
531
""" % (repo.bzrdir.root_transport.base,
548
532
format.repository_format.get_format_description(),
550
534
self.assertEqual('', err)
552
536
# Create lightweight checkout
553
537
transport.mkdir('tree')
554
538
transport.mkdir('tree/lightcheckout')
555
tree2 = branch1.create_checkout('tree/lightcheckout',
539
tree2 = branch1.create_checkout('tree/lightcheckout',
556
540
lightweight=True)
557
541
branch2 = tree2.branch
558
self.assertCheckoutStatusOutput('-v tree/lightcheckout', tree2,
559
shared_repo=repo, repo_branch=branch1, verbose=True)
542
self.assertCheckoutStatusOutput('tree/lightcheckout', tree2,
561
545
# Create normal checkout
562
546
tree3 = branch1.create_checkout('tree/checkout')
569
553
tree2.commit('commit one')
570
554
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')
555
datestring_first = format_date(rev.timestamp, rev.timezone)
556
out, err = self.runbzr('info tree/lightcheckout --verbose')
573
557
self.assertEqualDiff(
574
"""Lightweight checkout (format: %s)
576
light checkout root: tree/lightcheckout
577
checkout of branch: repo/branch
578
shared repository: repo
559
light checkout root: %s
560
shared repository: %s
561
repository branch: branch
581
564
control: Meta directory format 1
582
working tree: Working tree format 6
565
working tree: Working tree format 3
566
branch: Branch format 5
586
569
In the working tree:
599
583
first revision: %s
600
584
latest revision: %s
604
""" % (self._repo_strings, format.get_branch_format().get_format_description(),
589
""" % (tree2.bzrdir.root_transport.base,
590
repo.bzrdir.root_transport.base,
605
591
format.repository_format.get_format_description(),
606
592
datestring_first, datestring_first,
593
# poking at _revision_store isn't all that clean, but neither is
594
# having the ui test dependent on the exact overhead of a given store.
595
repo._revision_store.total_size(repo.get_transaction())[1] / 1024,
608
597
self.assertEqual('', err)
610
599
# Out of date checkout
611
out, err = self.run_bzr('info -v tree/checkout')
600
out, err = self.runbzr('info tree/checkout')
612
601
self.assertEqualDiff(
613
"""Checkout (format: unnamed)
615
checkout root: tree/checkout
616
checkout of branch: repo/branch
604
checkout of branch: %s
619
607
control: Meta directory format 1
620
working tree: Working tree format 6
608
working tree: Working tree format 3
609
branch: Branch format 5
624
612
Branch is out of date: missing 1 revision.
641
""" % (format.get_branch_format().get_format_description(),
630
""" % (tree3.bzrdir.root_transport.base,
631
branch1.bzrdir.root_transport.base,
642
632
format.repository_format.get_format_description(),
644
634
self.assertEqual('', err)
648
638
self.build_tree(['tree/checkout/b'])
650
out, err = self.run_bzr('info tree/checkout --verbose')
640
out, err = self.runbzr('info tree/checkout --verbose')
651
641
self.assertEqualDiff(
652
"""Checkout (format: unnamed)
654
checkout root: tree/checkout
655
checkout of branch: repo/branch
644
checkout of branch: %s
658
647
control: Meta directory format 1
659
working tree: Working tree format 6
648
working tree: Working tree format 3
649
branch: Branch format 5
663
652
In the working tree:
676
666
first revision: %s
677
667
latest revision: %s
681
""" % (format.get_branch_format().get_format_description(),
672
""" % (tree3.bzrdir.root_transport.base, branch1.bzrdir.root_transport.base,
682
673
format.repository_format.get_format_description(),
683
674
datestring_first, datestring_first,
675
# poking at _revision_store isn't all that clean, but neither is
676
# having the ui test dependent on the exact overhead of a given store.
677
repo._revision_store.total_size(repo.get_transaction())[1] / 1024,
685
679
self.assertEqual('', err)
686
680
tree3.commit('commit two')
688
682
# Out of date lightweight checkout
689
683
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')
684
datestring_last = format_date(rev.timestamp, rev.timezone)
685
out, err = self.runbzr('info tree/lightcheckout --verbose')
692
686
self.assertEqualDiff(
693
"""Lightweight checkout (format: %s)
695
light checkout root: tree/lightcheckout
696
checkout of branch: repo/branch
697
shared repository: repo
688
light checkout root: %s
689
shared repository: %s
690
repository branch: branch
700
693
control: Meta directory format 1
701
working tree: Working tree format 6
694
working tree: Working tree format 3
695
branch: Branch format 5
705
698
Working tree is out of date: missing 1 revision.
720
714
first revision: %s
721
715
latest revision: %s
725
""" % (self._repo_strings, format.get_branch_format().get_format_description(),
720
""" % (tree2.bzrdir.root_transport.base,
721
repo.bzrdir.root_transport.base,
726
722
format.repository_format.get_format_description(),
727
723
datestring_first, datestring_last,
724
# poking at _revision_store isn't all that clean, but neither is
725
# having the ui test dependent on the exact overhead of a given store.
726
repo._revision_store.total_size(repo.get_transaction())[1] / 1024,
729
728
self.assertEqual('', err)
731
730
# Show info about shared branch
732
out, err = self.run_bzr('info repo/branch --verbose')
731
out, err = self.runbzr('info repo/branch --verbose')
733
732
self.assertEqualDiff(
734
"""Repository branch (format: dirstate or knit)
736
shared repository: repo
737
repository branch: repo/branch
734
shared repository: %s
735
repository branch: branch
740
738
control: Meta directory format 1
739
branch: Branch format 5
747
746
first revision: %s
748
747
latest revision: %s
752
""" % (format.get_branch_format().get_format_description(),
752
""" % (repo.bzrdir.root_transport.base,
753
753
format.repository_format.get_format_description(),
754
754
datestring_first, datestring_last,
755
# poking at _revision_store isn't all that clean, but neither is
756
# having the ui test dependent on the exact overhead of a given store.
757
repo._revision_store.total_size(repo.get_transaction())[1] / 1024,
756
759
self.assertEqual('', err)
758
761
# Show info about repository with revisions
759
out, err = self.run_bzr('info -v repo')
762
out, err = self.runbzr('info repo')
760
763
self.assertEqualDiff(
761
"""Shared repository (format: dirstate or dirstate-tags or knit)
763
shared repository: repo
765
shared repository: %s
766
768
control: Meta directory format 1
771
""" % (format.repository_format.get_format_description(),
774
""" % (repo.bzrdir.root_transport.base,
775
format.repository_format.get_format_description(),
776
# poking at _revision_store isn't all that clean, but neither is
777
# having the ui test dependent on the exact overhead of a given store.
778
repo._revision_store.total_size(repo.get_transaction())[1] / 1024,
773
780
self.assertEqual('', err)
779
786
# Create shared repository with working trees
780
787
repo = self.make_repository('repo', shared=True, format=format)
781
788
repo.set_make_working_trees(True)
782
out, err = self.run_bzr('info -v repo')
789
out, err = self.runbzr('info repo')
783
790
self.assertEqualDiff(
784
"""Shared repository with trees (format: dirstate or dirstate-tags or knit)
786
shared repository: repo
792
shared repository: %s
789
795
control: Meta directory format 1
792
798
Create working tree for new branches inside the repository.
796
""" % (format.repository_format.get_format_description(),
803
""" % (repo.bzrdir.root_transport.base,
804
format.repository_format.get_format_description(),
798
806
self.assertEqual('', err)
804
812
branch2 = branch1.bzrdir.sprout('repo/branch2').open_branch()
806
814
# Empty first branch
807
out, err = self.run_bzr('info repo/branch1 --verbose')
815
out, err = self.runbzr('info repo/branch1 --verbose')
808
816
self.assertEqualDiff(
809
"""Repository tree (format: knit)
811
shared repository: repo
812
repository branch: repo/branch1
818
shared repository: %s
819
repository checkout: branch1
815
822
control: Meta directory format 1
816
823
working tree: Working tree format 3
824
branch: Branch format 5
820
827
In the working tree:
844
853
tree1.commit('commit one')
845
854
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')
855
datestring_first = format_date(rev.timestamp, rev.timezone)
856
out, err = self.runbzr('info repo/branch1')
848
857
self.assertEqualDiff(
849
"""Repository tree (format: knit)
851
shared repository: repo
852
repository branch: repo/branch1
859
shared repository: %s
860
repository checkout: branch1
855
863
control: Meta directory format 1
856
864
working tree: Working tree format 3
865
branch: Branch format 5
860
868
In the working tree:
873
881
first revision: %s
874
882
latest revision: %s
878
""" % (format.get_branch_format().get_format_description(),
887
""" % (repo.bzrdir.root_transport.base,
879
888
format.repository_format.get_format_description(),
880
889
datestring_first, datestring_first,
890
# poking at _revision_store isn't all that clean, but neither is
891
# having the ui test dependent on the exact overhead of a given store.
892
repo._revision_store.total_size(repo.get_transaction())[1] / 1024,
882
894
self.assertEqual('', err)
884
896
# Out of date second branch
885
out, err = self.run_bzr('info repo/branch2 --verbose')
897
out, err = self.runbzr('info repo/branch2 --verbose')
886
898
self.assertEqualDiff(
887
"""Repository tree (format: knit)
889
shared repository: repo
890
repository branch: repo/branch2
900
shared repository: %s
901
repository checkout: branch2
892
903
Related branches:
893
parent branch: repo/branch1
896
907
control: Meta directory format 1
897
908
working tree: Working tree format 3
909
branch: Branch format 5
901
912
In the working tree:
916
""" % (format.get_branch_format().get_format_description(),
929
""" % (repo.bzrdir.root_transport.base,
930
branch1.bzrdir.root_transport.base,
917
931
format.repository_format.get_format_description(),
932
# poking at _revision_store isn't all that clean, but neither is
933
# having the ui test dependent on the exact overhead of a given store.
934
repo._revision_store.total_size(repo.get_transaction())[1] / 1024,
919
936
self.assertEqual('', err)
921
938
# Update second branch
922
939
tree2 = branch2.bzrdir.open_workingtree()
923
940
tree2.pull(branch1)
924
out, err = self.run_bzr('info -v repo/branch2')
941
out, err = self.runbzr('info repo/branch2')
925
942
self.assertEqualDiff(
926
"""Repository tree (format: knit)
928
shared repository: repo
929
repository branch: repo/branch2
944
shared repository: %s
945
repository checkout: branch2
931
947
Related branches:
932
parent branch: repo/branch1
935
951
control: Meta directory format 1
936
952
working tree: Working tree format 3
953
branch: Branch format 5
940
956
In the working tree:
953
969
first revision: %s
954
970
latest revision: %s
958
""" % (format.get_branch_format().get_format_description(),
975
""" % (repo.bzrdir.root_transport.base,
976
branch1.bzrdir.root_transport.base,
959
977
format.repository_format.get_format_description(),
960
978
datestring_first, datestring_first,
979
# poking at _revision_store isn't all that clean, but neither is
980
# having the ui test dependent on the exact overhead of a given store.
981
repo._revision_store.total_size(repo.get_transaction())[1] / 1024,
962
983
self.assertEqual('', err)
964
985
# Show info about repository with revisions
965
out, err = self.run_bzr('info -v repo')
986
out, err = self.runbzr('info repo')
966
987
self.assertEqualDiff(
967
"""Shared repository with trees (format: dirstate or dirstate-tags or knit)
969
shared repository: repo
989
shared repository: %s
972
992
control: Meta directory format 1
975
995
Create working tree for new branches inside the repository.
979
""" % (format.repository_format.get_format_description(),
1000
""" % (repo.bzrdir.root_transport.base,
1001
format.repository_format.get_format_description(),
1002
# poking at _revision_store isn't all that clean, but neither is
1003
# having the ui test dependent on the exact overhead of a given store.
1004
repo._revision_store.total_size(repo.get_transaction())[1] / 1024,
982
1007
self.assertEqual('', err)
984
1009
def test_info_shared_repository_with_tree_in_root(self):
985
1010
format = bzrdir.format_registry.make_bzrdir('knit')
986
1011
transport = self.get_transport()
988
1013
# Create shared repository with working trees
989
1014
repo = self.make_repository('repo', shared=True, format=format)
990
1015
repo.set_make_working_trees(True)
991
out, err = self.run_bzr('info -v repo')
1016
out, err = self.runbzr('info repo')
992
1017
self.assertEqualDiff(
993
"""Shared repository with trees (format: dirstate or dirstate-tags or knit)
995
shared repository: repo
1019
shared repository: %s
998
1022
control: Meta directory format 1
1001
1025
Create working tree for new branches inside the repository.
1005
""" % (format.repository_format.get_format_description(),
1030
""" % (repo.bzrdir.root_transport.base,
1031
format.repository_format.get_format_description(),
1007
1033
self.assertEqual('', err)
1010
1036
control = repo.bzrdir
1011
1037
branch = control.create_branch()
1012
1038
control.create_workingtree()
1013
out, err = self.run_bzr('info -v repo')
1039
out, err = self.runbzr('info repo')
1014
1040
self.assertEqualDiff(
1015
"""Repository tree (format: knit)
1017
shared repository: repo
1018
repository branch: repo
1042
shared repository: %s
1043
repository checkout: .
1021
1046
control: Meta directory format 1
1022
1047
working tree: Working tree format 3
1048
branch: Branch format 5
1026
1051
In the working tree:
1036
1061
Branch history:
1041
""" % (format.get_branch_format().get_format_description(),
1067
""" % (repo.bzrdir.root_transport.base,
1042
1068
format.repository_format.get_format_description(),
1044
1070
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,
1072
def assertCheckoutStatusOutput(self,
1073
1073
command_string, lco_tree, shared_repo=None,
1074
1074
repo_branch=None,
1075
1075
tree_locked=False,
1076
1076
branch_locked=False, repo_locked=False,
1078
light_checkout=True,
1079
checkout_root=None):
1080
"""Check the output of info in a checkout.
1078
light_checkout=True):
1079
"""Check the output of info in a light checkout tree.
1082
1081
This is not quite a mirror of the info code: rather than using the
1083
1082
tree being examined to predict output, it uses a bunch of flags which
1084
1083
allow us, the test writers, to document what *should* be present in
1085
1084
the output. Removing this separation would remove the value of the
1088
1087
:param path: the path to the light checkout.
1089
1088
:param lco_tree: the tree object for the light checkout.
1090
1089
:param shared_repo: A shared repository is in use, expect that in
1094
1093
:param tree_locked: If true, expect the tree to be locked.
1095
1094
:param branch_locked: If true, expect the branch to be locked.
1096
1095
: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
1096
: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()
1098
out, err = self.runbzr('info %s' % command_string)
1130
1099
if repo_locked or branch_locked or tree_locked:
1131
1100
def locked_message(a_bool):
1144
1113
locked_message(repo_locked)))
1146
1115
expected_lock_output = ''
1149
1116
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)))
1117
tree_data = (" light checkout root: %s" %
1118
lco_tree.bzrdir.root_transport.base)
1120
tree_data = (" checkout root: %s" %
1121
lco_tree.bzrdir.root_transport.base)
1156
1122
if shared_repo is not None:
1157
1123
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)))
1124
" shared repository: %s\n"
1125
" repository branch: branch\n" %
1126
shared_repo.bzrdir.root_transport.base)
1162
1127
elif repo_branch is not None:
1163
1128
branch_data = (
1164
"%s checkout of branch: %s\n" %
1166
friendly_location(repo_branch.bzrdir.root_transport.base)))
1129
" checkout of branch: %s\n" %
1130
repo_branch.bzrdir.root_transport.base)
1168
branch_data = (" checkout of branch: %s\n" %
1132
branch_data = (" checkout of branch: %s\n" %
1169
1133
lco_tree.branch.bzrdir.root_transport.base)
1172
1136
verbose_info = ' 0 committers\n'
1174
1138
verbose_info = ''
1176
1140
self.assertEqualDiff(
1181
1145
control: Meta directory format 1
1182
1146
working tree: %s
1147
branch: Branch format 5
1186
1150
In the working tree:
1214
1176
transport = self.get_transport()
1215
1177
# Create shared repository with a branch
1216
1178
repo = self.make_repository('repo', shared=True,
1217
format=bzrdir.BzrDirMetaFormat1())
1179
format=bzrlib.bzrdir.BzrDirMetaFormat1())
1218
1180
repo.set_make_working_trees(False)
1219
1181
repo.bzrdir.root_transport.mkdir('branch')
1220
1182
repo_branch = repo.bzrdir.create_branch_convenience('repo/branch',
1221
format=bzrdir.BzrDirMetaFormat1())
1183
format=bzrlib.bzrdir.BzrDirMetaFormat1())
1222
1184
# Do a heavy checkout
1223
1185
transport.mkdir('tree')
1224
1186
transport.mkdir('tree/checkout')
1225
co_branch = bzrdir.BzrDir.create_branch_convenience('tree/checkout',
1226
format=bzrdir.BzrDirMetaFormat1())
1187
co_branch = bzrlib.bzrdir.BzrDir.create_branch_convenience('tree/checkout',
1188
format=bzrlib.bzrdir.BzrDirMetaFormat1())
1227
1189
co_branch.bind(repo_branch)
1228
1190
# Do a light checkout of the heavy one
1229
1191
transport.mkdir('tree/lightcheckout')
1230
lco_dir = bzrdir.BzrDirMetaFormat1().initialize('tree/lightcheckout')
1231
branch.BranchReferenceFormat().initialize(lco_dir,
1232
target_branch=co_branch)
1192
lco_dir = bzrlib.bzrdir.BzrDirMetaFormat1().initialize('tree/lightcheckout')
1193
bzrlib.branch.BranchReferenceFormat().initialize(lco_dir, co_branch)
1233
1194
lco_dir.create_workingtree()
1234
1195
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)
1201
self.assertCheckoutStatusOutput('tree/lightcheckout', lco_tree)
1244
1203
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)
1205
self.assertCheckoutStatusOutput('tree/lightcheckout',
1250
1209
lco_tree.branch.repository.unlock()
1252
1211
lco_tree.branch.lock_write()
1254
self.assertCheckoutStatusOutput('-v tree/lightcheckout',
1213
self.assertCheckoutStatusOutput('tree/lightcheckout',
1256
1215
branch_locked=True,
1258
repo_branch=repo_branch,
1261
1218
lco_tree.branch.unlock()
1263
1220
lco_tree.lock_write()
1265
self.assertCheckoutStatusOutput('-v tree/lightcheckout',
1266
lco_tree, repo_branch=repo_branch,
1222
self.assertCheckoutStatusOutput('tree/lightcheckout',
1267
1224
tree_locked=True,
1268
1225
branch_locked=True,
1272
1228
lco_tree.unlock()
1274
1230
lco_tree.lock_write()
1275
1231
lco_tree.branch.repository.unlock()
1277
self.assertCheckoutStatusOutput('-v tree/lightcheckout',
1278
lco_tree, repo_branch=repo_branch,
1233
self.assertCheckoutStatusOutput('tree/lightcheckout',
1279
1235
tree_locked=True,
1283
1238
lco_tree.branch.repository.lock_write()
1284
1239
lco_tree.unlock()
1298
1252
lco_tree.branch.unlock()
1299
1253
lco_tree.branch.repository.lock_write()
1301
self.assertCheckoutStatusOutput('-v tree/lightcheckout',
1302
lco_tree, repo_branch=repo_branch,
1255
self.assertCheckoutStatusOutput('tree/lightcheckout',
1303
1257
tree_locked=True,
1307
1260
lco_tree.branch.repository.unlock()
1308
1261
lco_tree.branch.lock_write()
1311
1264
lco_tree.branch.lock_write()
1312
1265
lco_tree.branch.repository.unlock()
1314
self.assertCheckoutStatusOutput('-v tree/lightcheckout',
1315
lco_tree, repo_branch=repo_branch,
1267
self.assertCheckoutStatusOutput('tree/lightcheckout',
1319
1271
lco_tree.branch.repository.lock_write()
1320
1272
lco_tree.branch.unlock()
1322
if sys.platform == 'win32':
1323
self.knownFailure('Win32 cannot run "bzr info"'
1324
' when the tree is locked.')
1326
1274
def test_info_locking_oslocks(self):
1327
1275
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()
1276
raise TestSkipped("don't use oslocks on win32 in unix manner")
1335
1278
tree = self.make_branch_and_tree('branch',
1336
format=bzrdir.BzrDirFormat6())
1279
format=bzrlib.bzrdir.BzrDirFormat6())
1338
1281
# Test all permutations of locking the working tree, branch and repository
1339
1282
# XXX: Well not yet, as we can't query oslocks yet. Currently, it's
1367
1309
Branch history:
1372
""" % ('branch', tree.branch.repository._format.get_format_description(),
1315
""" % (tree.bzrdir.root_transport.base,
1316
tree.branch.repository._format.get_format_description(),
1374
1318
self.assertEqual('', err)
1376
1320
tree.lock_write()
1377
out, err = self.run_bzr('info -v branch')
1321
out, err = self.runbzr('info branch')
1378
1322
self.assertEqualDiff(
1379
"""Standalone tree (format: weave)
1381
1324
branch root: %s
1399
1342
Branch history:
1404
""" % ('branch', tree.branch.repository._format.get_format_description(),
1348
""" % (tree.bzrdir.root_transport.base,
1349
tree.branch.repository._format.get_format_description(),
1406
1351
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)