13
14
# You should have received a copy of the GNU General Public License
14
15
# along with this program; if not, write to the Free Software
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
16
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18
19
"""Tests for the info command of bzr."""
22
24
from bzrlib import (
32
from bzrlib.transport import memory
35
class TestInfo(tests.TestCaseWithTransport):
38
super(TestInfo, self).setUp()
39
self._repo_strings = "2a"
28
from bzrlib.osutils import format_date
29
from bzrlib.tests import TestSkipped
30
from bzrlib.tests.blackbox import ExternalBase
33
class TestInfo(ExternalBase):
41
35
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)
36
if sys.platform == "win32":
37
location = "C:/i/do/not/exist/"
39
location = "/i/do/not/exist/"
40
out, err = self.runbzr('info '+location, retcode=3)
45
41
self.assertEqual(out, '')
46
self.assertEqual(err, 'bzr: ERROR: Not a branch: "%s".\n' % location)
42
self.assertEqual(err, 'bzr: ERROR: Not a branch: %s\n' % location)
48
44
def test_info_standalone(self):
49
45
transport = self.get_transport()
53
49
self.build_tree(['standalone/a'])
55
51
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
52
out, err = self.runbzr('info standalone')
58
control: All-in-one format 6
59
working tree: Working tree format 2
60
branch: Branch format 4
61
repository: Weave repository format 6
71
0 versioned subdirectories
79
""" % branch1.bzrdir.root_transport.base, out)
126
80
self.assertEqual('', err)
127
81
tree1.commit('commit one')
128
82
rev = branch1.repository.get_revision(branch1.revision_history()[0])
129
datestring_first = osutils.format_date(rev.timestamp, rev.timezone)
83
datestring_first = format_date(rev.timestamp, rev.timezone)
131
85
# Branch standalone with push location
132
86
branch2 = branch1.bzrdir.sprout('branch').open_branch()
133
87
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
88
out, err = self.runbzr('info branch --verbose')
158
98
control: All-in-one format 6
176
117
first revision: %s
177
118
latest revision: %s
181
""" % (datestring_first, datestring_first,
123
""" % (branch2.bzrdir.root_transport.base,
124
branch1.bzrdir.root_transport.base,
125
branch1.bzrdir.root_transport.base,
126
datestring_first, datestring_first,
127
# poking at _revision_store isn't all that clean, but neither is
128
# having the ui test dependent on the exact overhead of a given store.
129
branch2.repository._revision_store.total_size(
130
branch2.repository.get_transaction())[1] / 1024,
183
132
self.assertEqual('', err)
186
135
# (creates backup as unknown)
187
136
branch1.bzrdir.sprout('bound')
188
137
knit1_format = bzrdir.format_registry.make_bzrdir('knit')
189
upgrade.upgrade('bound', knit1_format)
190
branch3 = bzrdir.BzrDir.open('bound').open_branch()
138
bzrlib.upgrade.upgrade('bound', knit1_format)
139
branch3 = bzrlib.bzrdir.BzrDir.open('bound').open_branch()
191
140
branch3.bind(branch1)
192
141
bound_tree = branch3.bzrdir.open_workingtree()
193
out, err = self.run_bzr('info -v bound')
142
out, err = self.runbzr('info bound')
194
143
self.assertEqualDiff(
195
"""Checkout (format: knit)
198
checkout of branch: standalone
146
checkout of branch: %s
200
148
Related branches:
201
parent branch: standalone
204
152
control: Meta directory format 1
154
branch: Branch format 5
209
157
In the working tree:
222
170
first revision: %s
223
171
latest revision: %s
227
""" % (bound_tree._format.get_format_description(),
228
branch3._format.get_format_description(),
176
""" % (branch3.bzrdir.root_transport.base,
177
branch1.bzrdir.root_transport.base,
178
branch1.bzrdir.root_transport.base,
179
bound_tree._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 3
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 3
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
473
branch: Branch format 5
497
""" % (info.describe_format(repo.bzrdir, repo, branch, None),
498
format.get_branch_format().get_format_description(),
482
""" % (branch.bzrdir.root_transport.base,
499
483
format.repository_format.get_format_description(),
501
485
self.assertEqual('', err)
503
487
def test_info_shared_repository(self):
504
format = bzrdir.format_registry.make_bzrdir('knit')
488
format = bzrdir.format_registry.make_bzrdir('metaweave')
505
489
transport = self.get_transport()
507
491
# Create shared repository
508
492
repo = self.make_repository('repo', shared=True, format=format)
509
493
repo.set_make_working_trees(False)
510
out, err = self.run_bzr('info -v repo')
494
out, err = self.runbzr('info repo')
511
495
self.assertEqualDiff(
512
"""Shared repository (format: dirstate or dirstate-tags or knit)
514
497
shared repository: %s
517
500
control: Meta directory format 1
522
""" % ('repo', format.repository_format.get_format_description(),
506
""" % (repo.bzrdir.root_transport.base,
507
format.repository_format.get_format_description(),
524
509
self.assertEqual('', err)
527
512
repo.bzrdir.root_transport.mkdir('branch')
528
513
branch1 = repo.bzrdir.create_branch_convenience('repo/branch',
530
out, err = self.run_bzr('info -v repo/branch')
515
out, err = self.runbzr('info repo/branch')
531
516
self.assertEqualDiff(
532
"""Repository branch (format: dirstate or knit)
534
shared repository: repo
535
repository branch: repo/branch
518
shared repository: %s
519
repository branch: branch
538
522
control: Meta directory format 1
523
branch: Branch format 5
547
""" % (format.get_branch_format().get_format_description(),
532
""" % (repo.bzrdir.root_transport.base,
548
533
format.repository_format.get_format_description(),
550
535
self.assertEqual('', err)
552
537
# Create lightweight checkout
553
538
transport.mkdir('tree')
554
539
transport.mkdir('tree/lightcheckout')
555
tree2 = branch1.create_checkout('tree/lightcheckout',
540
tree2 = branch1.create_checkout('tree/lightcheckout',
556
541
lightweight=True)
557
542
branch2 = tree2.branch
558
self.assertCheckoutStatusOutput('-v tree/lightcheckout', tree2,
559
shared_repo=repo, repo_branch=branch1, verbose=True)
543
self.assertCheckoutStatusOutput('tree/lightcheckout', tree2,
561
546
# Create normal checkout
562
547
tree3 = branch1.create_checkout('tree/checkout')
569
554
tree2.commit('commit one')
570
555
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')
556
datestring_first = format_date(rev.timestamp, rev.timezone)
557
out, err = self.runbzr('info tree/lightcheckout --verbose')
573
558
self.assertEqualDiff(
574
"""Lightweight checkout (format: %s)
576
light checkout root: tree/lightcheckout
577
checkout of branch: repo/branch
578
shared repository: repo
560
light checkout root: %s
561
shared repository: %s
562
repository branch: branch
581
565
control: Meta directory format 1
582
working tree: Working tree format 6
566
working tree: Working tree format 3
567
branch: Branch format 5
586
570
In the working tree:
599
584
first revision: %s
600
585
latest revision: %s
604
""" % (self._repo_strings, format.get_branch_format().get_format_description(),
590
""" % (tree2.bzrdir.root_transport.base,
591
repo.bzrdir.root_transport.base,
605
592
format.repository_format.get_format_description(),
606
593
datestring_first, datestring_first,
594
# poking at _revision_store isn't all that clean, but neither is
595
# having the ui test dependent on the exact overhead of a given store.
596
repo._revision_store.total_size(repo.get_transaction())[1] / 1024,
608
598
self.assertEqual('', err)
610
600
# Out of date checkout
611
out, err = self.run_bzr('info -v tree/checkout')
601
out, err = self.runbzr('info tree/checkout')
612
602
self.assertEqualDiff(
613
"""Checkout (format: unnamed)
615
checkout root: tree/checkout
616
checkout of branch: repo/branch
605
checkout of branch: %s
619
608
control: Meta directory format 1
620
working tree: Working tree format 6
609
working tree: Working tree format 3
610
branch: Branch format 5
624
613
Branch is out of date: missing 1 revision.
648
639
self.build_tree(['tree/checkout/b'])
650
out, err = self.run_bzr('info tree/checkout --verbose')
641
out, err = self.runbzr('info tree/checkout --verbose')
651
642
self.assertEqualDiff(
652
"""Checkout (format: unnamed)
654
checkout root: tree/checkout
655
checkout of branch: repo/branch
645
checkout of branch: %s
658
648
control: Meta directory format 1
659
working tree: Working tree format 6
649
working tree: Working tree format 3
650
branch: Branch format 5
663
653
In the working tree:
676
667
first revision: %s
677
668
latest revision: %s
681
""" % (format.get_branch_format().get_format_description(),
673
""" % (tree3.bzrdir.root_transport.base, branch1.bzrdir.root_transport.base,
682
674
format.repository_format.get_format_description(),
683
675
datestring_first, datestring_first,
676
# poking at _revision_store isn't all that clean, but neither is
677
# having the ui test dependent on the exact overhead of a given store.
678
repo._revision_store.total_size(repo.get_transaction())[1] / 1024,
685
680
self.assertEqual('', err)
686
681
tree3.commit('commit two')
688
683
# Out of date lightweight checkout
689
684
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')
685
datestring_last = format_date(rev.timestamp, rev.timezone)
686
out, err = self.runbzr('info tree/lightcheckout --verbose')
692
687
self.assertEqualDiff(
693
"""Lightweight checkout (format: %s)
695
light checkout root: tree/lightcheckout
696
checkout of branch: repo/branch
697
shared repository: repo
689
light checkout root: %s
690
shared repository: %s
691
repository branch: branch
700
694
control: Meta directory format 1
701
working tree: Working tree format 6
695
working tree: Working tree format 3
696
branch: Branch format 5
705
699
Working tree is out of date: missing 1 revision.
720
715
first revision: %s
721
716
latest revision: %s
725
""" % (self._repo_strings, format.get_branch_format().get_format_description(),
721
""" % (tree2.bzrdir.root_transport.base,
722
repo.bzrdir.root_transport.base,
726
723
format.repository_format.get_format_description(),
727
724
datestring_first, datestring_last,
725
# poking at _revision_store isn't all that clean, but neither is
726
# having the ui test dependent on the exact overhead of a given store.
727
repo._revision_store.total_size(repo.get_transaction())[1] / 1024,
729
729
self.assertEqual('', err)
731
731
# Show info about shared branch
732
out, err = self.run_bzr('info repo/branch --verbose')
732
out, err = self.runbzr('info repo/branch --verbose')
733
733
self.assertEqualDiff(
734
"""Repository branch (format: dirstate or knit)
736
shared repository: repo
737
repository branch: repo/branch
735
shared repository: %s
736
repository branch: branch
740
739
control: Meta directory format 1
740
branch: Branch format 5
747
747
first revision: %s
748
748
latest revision: %s
752
""" % (format.get_branch_format().get_format_description(),
753
""" % (repo.bzrdir.root_transport.base,
753
754
format.repository_format.get_format_description(),
754
755
datestring_first, datestring_last,
756
# poking at _revision_store isn't all that clean, but neither is
757
# having the ui test dependent on the exact overhead of a given store.
758
repo._revision_store.total_size(repo.get_transaction())[1] / 1024,
756
760
self.assertEqual('', err)
758
762
# Show info about repository with revisions
759
out, err = self.run_bzr('info -v repo')
763
out, err = self.runbzr('info repo')
760
764
self.assertEqualDiff(
761
"""Shared repository (format: dirstate or dirstate-tags or knit)
763
shared repository: repo
766
shared repository: %s
766
769
control: Meta directory format 1
771
""" % (format.repository_format.get_format_description(),
775
""" % (repo.bzrdir.root_transport.base,
776
format.repository_format.get_format_description(),
777
# poking at _revision_store isn't all that clean, but neither is
778
# having the ui test dependent on the exact overhead of a given store.
779
repo._revision_store.total_size(repo.get_transaction())[1] / 1024,
773
781
self.assertEqual('', err)
775
783
def test_info_shared_repository_with_trees(self):
776
format = bzrdir.format_registry.make_bzrdir('knit')
784
format = bzrdir.format_registry.make_bzrdir('metaweave')
777
785
transport = self.get_transport()
779
787
# Create shared repository with working trees
780
788
repo = self.make_repository('repo', shared=True, format=format)
781
789
repo.set_make_working_trees(True)
782
out, err = self.run_bzr('info -v repo')
790
out, err = self.runbzr('info repo')
783
791
self.assertEqualDiff(
784
"""Shared repository with trees (format: dirstate or dirstate-tags or knit)
786
shared repository: repo
793
shared repository: %s
789
796
control: Meta directory format 1
844
854
tree1.commit('commit one')
845
855
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')
856
datestring_first = format_date(rev.timestamp, rev.timezone)
857
out, err = self.runbzr('info repo/branch1')
848
858
self.assertEqualDiff(
849
"""Repository tree (format: knit)
851
shared repository: repo
852
repository branch: repo/branch1
860
shared repository: %s
861
repository checkout: branch1
855
864
control: Meta directory format 1
856
865
working tree: Working tree format 3
866
branch: Branch format 5
860
869
In the working tree:
873
882
first revision: %s
874
883
latest revision: %s
878
""" % (format.get_branch_format().get_format_description(),
888
""" % (repo.bzrdir.root_transport.base,
879
889
format.repository_format.get_format_description(),
880
890
datestring_first, datestring_first,
891
# poking at _revision_store isn't all that clean, but neither is
892
# having the ui test dependent on the exact overhead of a given store.
893
repo._revision_store.total_size(repo.get_transaction())[1] / 1024,
882
895
self.assertEqual('', err)
884
897
# Out of date second branch
885
out, err = self.run_bzr('info repo/branch2 --verbose')
898
out, err = self.runbzr('info repo/branch2 --verbose')
886
899
self.assertEqualDiff(
887
"""Repository tree (format: knit)
889
shared repository: repo
890
repository branch: repo/branch2
901
shared repository: %s
902
repository checkout: branch2
892
904
Related branches:
893
parent branch: repo/branch1
896
908
control: Meta directory format 1
897
909
working tree: Working tree format 3
910
branch: Branch format 5
901
913
In the working tree:
916
""" % (format.get_branch_format().get_format_description(),
930
""" % (repo.bzrdir.root_transport.base,
931
branch1.bzrdir.root_transport.base,
917
932
format.repository_format.get_format_description(),
933
# poking at _revision_store isn't all that clean, but neither is
934
# having the ui test dependent on the exact overhead of a given store.
935
repo._revision_store.total_size(repo.get_transaction())[1] / 1024,
919
937
self.assertEqual('', err)
921
939
# Update second branch
922
940
tree2 = branch2.bzrdir.open_workingtree()
923
941
tree2.pull(branch1)
924
out, err = self.run_bzr('info -v repo/branch2')
942
out, err = self.runbzr('info repo/branch2')
925
943
self.assertEqualDiff(
926
"""Repository tree (format: knit)
928
shared repository: repo
929
repository branch: repo/branch2
945
shared repository: %s
946
repository checkout: branch2
931
948
Related branches:
932
parent branch: repo/branch1
935
952
control: Meta directory format 1
936
953
working tree: Working tree format 3
954
branch: Branch format 5
940
957
In the working tree:
953
970
first revision: %s
954
971
latest revision: %s
958
""" % (format.get_branch_format().get_format_description(),
976
""" % (repo.bzrdir.root_transport.base,
977
branch1.bzrdir.root_transport.base,
959
978
format.repository_format.get_format_description(),
960
979
datestring_first, datestring_first,
980
# poking at _revision_store isn't all that clean, but neither is
981
# having the ui test dependent on the exact overhead of a given store.
982
repo._revision_store.total_size(repo.get_transaction())[1] / 1024,
962
984
self.assertEqual('', err)
964
986
# Show info about repository with revisions
965
out, err = self.run_bzr('info -v repo')
987
out, err = self.runbzr('info repo')
966
988
self.assertEqualDiff(
967
"""Shared repository with trees (format: dirstate or dirstate-tags or knit)
969
shared repository: repo
990
shared repository: %s
972
993
control: Meta directory format 1
975
996
Create working tree for new branches inside the repository.
979
""" % (format.repository_format.get_format_description(),
1001
""" % (repo.bzrdir.root_transport.base,
1002
format.repository_format.get_format_description(),
1003
# poking at _revision_store isn't all that clean, but neither is
1004
# having the ui test dependent on the exact overhead of a given store.
1005
repo._revision_store.total_size(repo.get_transaction())[1] / 1024,
982
1008
self.assertEqual('', err)
984
1010
def test_info_shared_repository_with_tree_in_root(self):
985
format = bzrdir.format_registry.make_bzrdir('knit')
1011
format = bzrdir.format_registry.make_bzrdir('metaweave')
986
1012
transport = self.get_transport()
988
1014
# Create shared repository with working trees
989
1015
repo = self.make_repository('repo', shared=True, format=format)
990
1016
repo.set_make_working_trees(True)
991
out, err = self.run_bzr('info -v repo')
1017
out, err = self.runbzr('info repo')
992
1018
self.assertEqualDiff(
993
"""Shared repository with trees (format: dirstate or dirstate-tags or knit)
995
shared repository: repo
1020
shared repository: %s
998
1023
control: Meta directory format 1
1036
1062
Branch history:
1041
""" % (format.get_branch_format().get_format_description(),
1068
""" % (repo.bzrdir.root_transport.base,
1042
1069
format.repository_format.get_format_description(),
1044
1071
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,
1073
def assertCheckoutStatusOutput(self,
1073
1074
command_string, lco_tree, shared_repo=None,
1074
1075
repo_branch=None,
1075
1076
tree_locked=False,
1076
1077
branch_locked=False, repo_locked=False,
1078
light_checkout=True,
1079
checkout_root=None):
1080
"""Check the output of info in a checkout.
1079
light_checkout=True):
1080
"""Check the output of info in a light checkout tree.
1082
1082
This is not quite a mirror of the info code: rather than using the
1083
1083
tree being examined to predict output, it uses a bunch of flags which
1084
1084
allow us, the test writers, to document what *should* be present in
1085
1085
the output. Removing this separation would remove the value of the
1088
1088
:param path: the path to the light checkout.
1089
1089
:param lco_tree: the tree object for the light checkout.
1090
1090
:param shared_repo: A shared repository is in use, expect that in
1094
1094
:param tree_locked: If true, expect the tree to be locked.
1095
1095
:param branch_locked: If true, expect the branch to be locked.
1096
1096
: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
1097
: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()
1099
out, err = self.runbzr('info %s' % command_string)
1130
1100
if repo_locked or branch_locked or tree_locked:
1131
1101
def locked_message(a_bool):
1144
1114
locked_message(repo_locked)))
1146
1116
expected_lock_output = ''
1149
1117
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)))
1118
tree_data = (" light checkout root: %s" %
1119
lco_tree.bzrdir.root_transport.base)
1121
tree_data = (" checkout root: %s" %
1122
lco_tree.bzrdir.root_transport.base)
1156
1123
if shared_repo is not None:
1157
1124
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)))
1125
" shared repository: %s\n"
1126
" repository branch: branch\n" %
1127
shared_repo.bzrdir.root_transport.base)
1162
1128
elif repo_branch is not None:
1163
1129
branch_data = (
1164
"%s checkout of branch: %s\n" %
1166
friendly_location(repo_branch.bzrdir.root_transport.base)))
1130
" checkout of branch: %s\n" %
1131
repo_branch.bzrdir.root_transport.base)
1168
branch_data = (" checkout of branch: %s\n" %
1133
branch_data = (" checkout of branch: %s\n" %
1169
1134
lco_tree.branch.bzrdir.root_transport.base)
1172
1137
verbose_info = ' 0 committers\n'
1174
1139
verbose_info = ''
1176
1141
self.assertEqualDiff(
1181
1146
control: Meta directory format 1
1182
1147
working tree: %s
1148
branch: Branch format 5
1186
1151
In the working tree:
1214
1177
transport = self.get_transport()
1215
1178
# Create shared repository with a branch
1216
1179
repo = self.make_repository('repo', shared=True,
1217
format=bzrdir.BzrDirMetaFormat1())
1180
format=bzrlib.bzrdir.BzrDirMetaFormat1())
1218
1181
repo.set_make_working_trees(False)
1219
1182
repo.bzrdir.root_transport.mkdir('branch')
1220
1183
repo_branch = repo.bzrdir.create_branch_convenience('repo/branch',
1221
format=bzrdir.BzrDirMetaFormat1())
1184
format=bzrlib.bzrdir.BzrDirMetaFormat1())
1222
1185
# Do a heavy checkout
1223
1186
transport.mkdir('tree')
1224
1187
transport.mkdir('tree/checkout')
1225
co_branch = bzrdir.BzrDir.create_branch_convenience('tree/checkout',
1226
format=bzrdir.BzrDirMetaFormat1())
1188
co_branch = bzrlib.bzrdir.BzrDir.create_branch_convenience('tree/checkout',
1189
format=bzrlib.bzrdir.BzrDirMetaFormat1())
1227
1190
co_branch.bind(repo_branch)
1228
1191
# Do a light checkout of the heavy one
1229
1192
transport.mkdir('tree/lightcheckout')
1230
lco_dir = bzrdir.BzrDirMetaFormat1().initialize('tree/lightcheckout')
1231
branch.BranchReferenceFormat().initialize(lco_dir,
1232
target_branch=co_branch)
1193
lco_dir = bzrlib.bzrdir.BzrDirMetaFormat1().initialize('tree/lightcheckout')
1194
bzrlib.branch.BranchReferenceFormat().initialize(lco_dir, co_branch)
1233
1195
lco_dir.create_workingtree()
1234
1196
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)
1202
self.assertCheckoutStatusOutput('tree/lightcheckout', lco_tree)
1244
1204
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)
1206
self.assertCheckoutStatusOutput('tree/lightcheckout',
1250
1210
lco_tree.branch.repository.unlock()
1252
1212
lco_tree.branch.lock_write()
1254
self.assertCheckoutStatusOutput('-v tree/lightcheckout',
1214
self.assertCheckoutStatusOutput('tree/lightcheckout',
1256
1216
branch_locked=True,
1258
repo_branch=repo_branch,
1261
1219
lco_tree.branch.unlock()
1263
1221
lco_tree.lock_write()
1265
self.assertCheckoutStatusOutput('-v tree/lightcheckout',
1266
lco_tree, repo_branch=repo_branch,
1223
self.assertCheckoutStatusOutput('tree/lightcheckout',
1267
1225
tree_locked=True,
1268
1226
branch_locked=True,
1272
1229
lco_tree.unlock()
1274
1231
lco_tree.lock_write()
1275
1232
lco_tree.branch.repository.unlock()
1277
self.assertCheckoutStatusOutput('-v tree/lightcheckout',
1278
lco_tree, repo_branch=repo_branch,
1234
self.assertCheckoutStatusOutput('tree/lightcheckout',
1279
1236
tree_locked=True,
1283
1239
lco_tree.branch.repository.lock_write()
1284
1240
lco_tree.unlock()
1311
1265
lco_tree.branch.lock_write()
1312
1266
lco_tree.branch.repository.unlock()
1314
self.assertCheckoutStatusOutput('-v tree/lightcheckout',
1315
lco_tree, repo_branch=repo_branch,
1268
self.assertCheckoutStatusOutput('tree/lightcheckout',
1319
1272
lco_tree.branch.repository.lock_write()
1320
1273
lco_tree.branch.unlock()
1322
if sys.platform == 'win32':
1323
self.knownFailure('Win32 cannot run "bzr info"'
1324
' when the tree is locked.')
1326
1275
def test_info_locking_oslocks(self):
1327
1276
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()
1277
raise TestSkipped("don't use oslocks on win32 in unix manner")
1335
1279
tree = self.make_branch_and_tree('branch',
1336
format=bzrdir.BzrDirFormat6())
1280
format=bzrlib.bzrdir.BzrDirFormat6())
1338
1282
# Test all permutations of locking the working tree, branch and repository
1339
1283
# XXX: Well not yet, as we can't query oslocks yet. Currently, it's
1367
1310
Branch history:
1372
""" % ('branch', tree.branch.repository._format.get_format_description(),
1316
""" % (tree.bzrdir.root_transport.base,
1317
tree.branch.repository._format.get_format_description(),
1374
1319
self.assertEqual('', err)
1376
1321
tree.lock_write()
1377
out, err = self.run_bzr('info -v branch')
1322
out, err = self.runbzr('info branch')
1378
1323
self.assertEqualDiff(
1379
"""Standalone tree (format: weave)
1381
1325
branch root: %s
1399
1343
Branch history:
1404
""" % ('branch', tree.branch.repository._format.get_format_description(),
1349
""" % (tree.bzrdir.root_transport.base,
1350
tree.branch.repository._format.get_format_description(),
1406
1352
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)