1
# Copyright (C) 2006, 2007, 2008 Canonical Ltd
1
# Copyright (C) 2006 by Canonical Ltd
2
# -*- coding: utf-8 -*-
3
4
# This program is free software; you can redistribute it and/or modify
4
5
# it under the terms of the GNU General Public License as published by
5
6
# the Free Software Foundation; either version 2 of the License, or
6
7
# (at your option) any later version.
8
9
# This program is distributed in the hope that it will be useful,
9
10
# but WITHOUT ANY WARRANTY; without even the implied warranty of
10
11
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11
12
# GNU General Public License for more details.
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."""
31
24
from bzrlib.osutils import format_date
32
25
from bzrlib.tests import TestSkipped
33
26
from bzrlib.tests.blackbox import ExternalBase
36
29
class TestInfo(ExternalBase):
39
ExternalBase.setUp(self)
40
self._repo_strings = "2a or development-subtree"
42
31
def test_info_non_existing(self):
43
32
if sys.platform == "win32":
44
33
location = "C:/i/do/not/exist/"
46
35
location = "/i/do/not/exist/"
47
out, err = self.run_bzr('info '+location, retcode=3)
36
out, err = self.runbzr('info '+location, retcode=3)
48
37
self.assertEqual(out, '')
49
self.assertEqual(err, 'bzr: ERROR: Not a branch: "%s".\n' % location)
38
self.assertEqual(err, 'bzr: ERROR: Not a branch: %s\n' % location)
51
40
def test_info_standalone(self):
52
41
transport = self.get_transport()
54
43
# Create initial standalone branch
55
tree1 = self.make_branch_and_tree('standalone', 'weave')
44
old_format = bzrlib.bzrdir.BzrDirFormat.get_default_format()
45
bzrlib.bzrdir.BzrDirFormat.set_default_format(bzrlib.bzrdir.BzrDirFormat6())
46
tree1 = self.make_branch_and_tree('standalone')
47
bzrlib.bzrdir.BzrDirFormat.set_default_format(old_format)
56
48
self.build_tree(['standalone/a'])
58
50
branch1 = tree1.branch
60
out, err = self.run_bzr('info standalone')
62
"""Standalone tree (format: weave)
64
branch root: standalone
66
self.assertEqual('', err)
68
# Standalone branch - verbose mode
69
out, err = self.run_bzr('info standalone -v')
71
"""Standalone tree (format: weave)
73
branch root: standalone
76
control: All-in-one format 6
77
working tree: Working tree format 2
78
branch: Branch format 4
79
repository: Weave repository format 6
89
0 versioned subdirectories
97
self.assertEqual('', err)
99
# Standalone branch - really verbose mode
100
out, err = self.run_bzr('info standalone -vv')
101
self.assertEqualDiff(
102
"""Standalone tree (format: weave)
104
branch root: standalone
107
control: All-in-one format 6
108
working tree: Working tree format 2
109
branch: Branch format 4
110
repository: Weave repository format 6
120
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)
129
79
self.assertEqual('', err)
130
80
tree1.commit('commit one')
131
81
rev = branch1.repository.get_revision(branch1.revision_history()[0])
179
116
first revision: %s
180
117
latest revision: %s
184
""" % (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,
186
131
self.assertEqual('', err)
188
133
# Branch and bind to standalone, needs upgrade to metadir
189
134
# (creates backup as unknown)
190
135
branch1.bzrdir.sprout('bound')
191
knit1_format = bzrdir.format_registry.make_bzrdir('knit')
192
upgrade.upgrade('bound', knit1_format)
193
branch3 = bzrdir.BzrDir.open('bound').open_branch()
136
bzrlib.upgrade.upgrade('bound', bzrlib.bzrdir.BzrDirMetaFormat1())
137
branch3 = bzrlib.bzrdir.BzrDir.open('bound').open_branch()
194
138
branch3.bind(branch1)
195
139
bound_tree = branch3.bzrdir.open_workingtree()
196
out, err = self.run_bzr('info -v bound')
140
out, err = self.runbzr('info bound')
197
141
self.assertEqualDiff(
198
"""Checkout (format: knit)
201
checkout of branch: standalone
144
checkout of branch: %s
203
146
Related branches:
204
parent branch: standalone
207
150
control: Meta directory format 1
152
branch: Branch format 5
212
155
In the working tree:
225
168
first revision: %s
226
169
latest revision: %s
230
""" % (bound_tree._format.get_format_description(),
231
branch3._format.get_format_description(),
174
""" % (branch3.bzrdir.root_transport.base,
175
branch1.bzrdir.root_transport.base,
176
branch1.bzrdir.root_transport.base,
177
bound_tree._format.get_format_description(),
232
178
branch3.repository._format.get_format_description(),
233
179
datestring_first, datestring_first,
180
# poking at _revision_store isn't all that clean, but neither is
181
# having the ui test dependent on the exact overhead of a given store.
182
branch3.repository._revision_store.total_size(
183
branch3.repository.get_transaction())[1] / 1024,
235
185
self.assertEqual('', err)
237
187
# Checkout standalone (same as above, but does not have parent set)
238
branch4 = bzrdir.BzrDir.create_branch_convenience('checkout',
188
old_format = bzrlib.bzrdir.BzrDirFormat.get_default_format()
189
bzrlib.bzrdir.BzrDirFormat.set_default_format(bzrlib.bzrdir.BzrDirMetaFormat1())
190
branch4 = bzrlib.bzrdir.BzrDir.create_branch_convenience('checkout')
191
bzrlib.bzrdir.BzrDirFormat.set_default_format(old_format)
240
192
branch4.bind(branch1)
241
193
branch4.bzrdir.open_workingtree().update()
242
out, err = self.run_bzr('info checkout --verbose')
194
out, err = self.runbzr('info checkout --verbose')
243
195
self.assertEqualDiff(
244
"""Checkout (format: knit)
246
checkout root: checkout
247
checkout of branch: standalone
198
checkout of branch: %s
250
201
control: Meta directory format 1
268
220
first revision: %s
269
221
latest revision: %s
273
""" % (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(),
274
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,
276
235
self.assertEqual('', err)
278
237
# Lightweight checkout (same as above, different branch and repository)
279
tree5 = branch1.create_checkout('lightcheckout', lightweight=True)
238
old_format = bzrlib.bzrdir.BzrDirFormat.get_default_format()
239
bzrlib.bzrdir.BzrDirFormat.set_default_format(bzrlib.bzrdir.BzrDirMetaFormat1())
240
transport.mkdir('lightcheckout')
241
dir5 = bzrlib.bzrdir.BzrDirMetaFormat1().initialize('lightcheckout')
242
bzrlib.branch.BranchReferenceFormat().initialize(dir5, branch1)
243
dir5.create_workingtree()
244
tree5 = dir5.open_workingtree()
245
bzrlib.bzrdir.BzrDirFormat.set_default_format(old_format)
280
246
branch5 = tree5.branch
281
out, err = self.run_bzr('info -v lightcheckout')
247
out, err = self.runbzr('info lightcheckout')
282
248
self.assertEqualDiff(
283
"""Lightweight checkout (format: %s)
285
light checkout root: lightcheckout
286
checkout of branch: standalone
250
light checkout root: %s
251
checkout of branch: %s
289
254
control: Meta directory format 1
290
working tree: Working tree format 6
255
working tree: Working tree format 3
291
256
branch: Branch format 4
292
257
repository: Weave repository format 6
352
320
first revision: %s
353
321
latest revision: %s
357
""" % (datestring_first, datestring_first,
326
""" % (branch2.bzrdir.root_transport.base,
327
branch1.bzrdir.root_transport.base,
328
branch1.bzrdir.root_transport.base,
329
datestring_first, datestring_first,
359
331
self.assertEqual('', err)
361
333
# Out of date bound branch
362
out, err = self.run_bzr('info -v bound')
334
out, err = self.runbzr('info bound')
363
335
self.assertEqualDiff(
364
"""Checkout (format: knit)
367
checkout of branch: standalone
338
checkout of branch: %s
369
340
Related branches:
370
parent branch: standalone
373
344
control: Meta directory format 1
393
364
first revision: %s
394
365
latest revision: %s
398
""" % (branch3.repository._format.get_format_description(),
370
""" % (branch3.bzrdir.root_transport.base,
371
branch1.bzrdir.root_transport.base,
372
branch1.bzrdir.root_transport.base,
373
branch3.repository._format.get_format_description(),
399
374
datestring_first, datestring_first,
375
# poking at _revision_store isn't all that clean, but neither is
376
# having the ui test dependent on the exact overhead of a given store.
377
branch3.repository._revision_store.total_size(
378
branch3.repository.get_transaction())[1] / 1024,
401
380
self.assertEqual('', err)
403
382
# Out of date checkout
404
out, err = self.run_bzr('info -v checkout')
383
out, err = self.runbzr('info checkout')
405
384
self.assertEqualDiff(
406
"""Checkout (format: knit)
408
checkout root: checkout
409
checkout of branch: standalone
387
checkout of branch: %s
412
390
control: Meta directory format 1
432
410
first revision: %s
433
411
latest revision: %s
437
""" % (branch4.repository._format.get_format_description(),
416
""" % (branch4.bzrdir.root_transport.base,
417
branch1.bzrdir.root_transport.base,
418
branch4.repository._format.get_format_description(),
438
419
datestring_first, datestring_first,
420
# poking at _revision_store isn't all that clean, but neither is
421
# having the ui test dependent on the exact overhead of a given store.
422
branch4.repository._revision_store.total_size(
423
branch4.repository.get_transaction())[1] / 1024,
440
425
self.assertEqual('', err)
442
427
# Out of date lightweight checkout
443
out, err = self.run_bzr('info lightcheckout --verbose')
428
out, err = self.runbzr('info lightcheckout --verbose')
444
429
self.assertEqualDiff(
445
"""Lightweight checkout (format: %s)
447
light checkout root: lightcheckout
448
checkout of branch: standalone
431
light checkout root: %s
432
checkout of branch: %s
451
435
control: Meta directory format 1
452
working tree: Working tree format 6
436
working tree: Working tree format 3
453
437
branch: Branch format 4
454
438
repository: Weave repository format 6
471
456
first revision: %s
472
457
latest revision: %s
476
""" % (self._repo_strings, datestring_first, datestring_last,), out)
462
""" % (tree5.bzrdir.root_transport.base,
463
branch1.bzrdir.root_transport.base,
464
datestring_first, datestring_last,
477
466
self.assertEqual('', err)
479
468
def test_info_standalone_no_tree(self):
480
469
# create standalone branch without a working tree
481
format = bzrdir.format_registry.make_bzrdir('default')
482
470
branch = self.make_branch('branch')
483
471
repo = branch.repository
484
out, err = self.run_bzr('info branch -v')
472
out, err = self.runbzr('info branch')
485
473
self.assertEqualDiff(
486
"""Standalone branch (format: %s)
491
478
control: Meta directory format 1
479
branch: Branch format 5
500
""" % (info.describe_format(repo.bzrdir, repo, branch, None),
501
format.get_branch_format().get_format_description(),
502
format.repository_format.get_format_description(),
488
""" % (branch.bzrdir.root_transport.base,
489
repo._format.get_format_description(),
504
491
self.assertEqual('', err)
506
493
def test_info_shared_repository(self):
507
format = bzrdir.format_registry.make_bzrdir('knit')
494
old_format = bzrlib.bzrdir.BzrDirFormat.get_default_format()
495
bzrlib.bzrdir.BzrDirFormat.set_default_format(bzrlib.bzrdir.BzrDirMetaFormat1())
508
496
transport = self.get_transport()
510
498
# Create shared repository
511
repo = self.make_repository('repo', shared=True, format=format)
499
repo = self.make_repository('repo', shared=True)
512
500
repo.set_make_working_trees(False)
513
out, err = self.run_bzr('info -v repo')
501
out, err = self.runbzr('info repo')
514
502
self.assertEqualDiff(
515
"""Shared repository (format: dirstate or dirstate-tags or knit)
517
504
shared repository: %s
520
507
control: Meta directory format 1
525
""" % ('repo', format.repository_format.get_format_description(),
513
""" % (repo.bzrdir.root_transport.base,
514
repo._format.get_format_description(),
527
516
self.assertEqual('', err)
529
518
# Create branch inside shared repository
530
519
repo.bzrdir.root_transport.mkdir('branch')
531
branch1 = repo.bzrdir.create_branch_convenience('repo/branch',
533
out, err = self.run_bzr('info -v repo/branch')
520
branch1 = repo.bzrdir.create_branch_convenience('repo/branch')
521
out, err = self.runbzr('info repo/branch')
534
522
self.assertEqualDiff(
535
"""Repository branch (format: dirstate or knit)
537
shared repository: repo
538
repository branch: repo/branch
524
shared repository: %s
525
repository branch: branch
541
528
control: Meta directory format 1
529
branch: Branch format 5
550
""" % (format.get_branch_format().get_format_description(),
551
format.repository_format.get_format_description(),
538
""" % (repo.bzrdir.root_transport.base,
539
repo._format.get_format_description(),
553
541
self.assertEqual('', err)
555
543
# Create lightweight checkout
556
544
transport.mkdir('tree')
557
545
transport.mkdir('tree/lightcheckout')
558
tree2 = branch1.create_checkout('tree/lightcheckout',
546
dir2 = bzrlib.bzrdir.BzrDirMetaFormat1().initialize('tree/lightcheckout')
547
bzrlib.branch.BranchReferenceFormat().initialize(dir2, branch1)
548
dir2.create_workingtree()
549
tree2 = dir2.open_workingtree()
560
550
branch2 = tree2.branch
561
self.assertCheckoutStatusOutput('-v tree/lightcheckout', tree2,
562
shared_repo=repo, repo_branch=branch1, verbose=True)
551
self.assertCheckoutStatusOutput('tree/lightcheckout', tree2, shared_repo=repo)
564
553
# Create normal checkout
565
tree3 = branch1.create_checkout('tree/checkout')
554
branch3 = bzrlib.bzrdir.BzrDir.create_branch_convenience('tree/checkout')
555
branch3.bind(branch1)
556
tree3 = branch3.bzrdir.open_workingtree()
566
558
self.assertCheckoutStatusOutput('tree/checkout --verbose', tree3,
568
560
light_checkout=False, repo_branch=branch1)
602
594
first revision: %s
603
595
latest revision: %s
607
""" % (self._repo_strings, format.get_branch_format().get_format_description(),
608
format.repository_format.get_format_description(),
600
""" % (tree2.bzrdir.root_transport.base,
601
repo.bzrdir.root_transport.base,
602
repo._format.get_format_description(),
609
603
datestring_first, datestring_first,
604
# poking at _revision_store isn't all that clean, but neither is
605
# having the ui test dependent on the exact overhead of a given store.
606
repo._revision_store.total_size(repo.get_transaction())[1] / 1024,
611
608
self.assertEqual('', err)
613
610
# Out of date checkout
614
out, err = self.run_bzr('info -v tree/checkout')
611
out, err = self.runbzr('info tree/checkout')
615
612
self.assertEqualDiff(
616
"""Checkout (format: unnamed)
618
checkout root: tree/checkout
619
checkout of branch: repo/branch
615
checkout of branch: %s
622
618
control: Meta directory format 1
623
working tree: Working tree format 6
619
working tree: Working tree format 3
620
branch: Branch format 5
627
623
Branch is out of date: missing 1 revision.
679
677
first revision: %s
680
678
latest revision: %s
684
""" % (format.get_branch_format().get_format_description(),
685
format.repository_format.get_format_description(),
683
""" % (tree3.bzrdir.root_transport.base, branch1.bzrdir.root_transport.base,
684
repo._format.get_format_description(),
686
685
datestring_first, datestring_first,
686
# poking at _revision_store isn't all that clean, but neither is
687
# having the ui test dependent on the exact overhead of a given store.
688
repo._revision_store.total_size(repo.get_transaction())[1] / 1024,
688
690
self.assertEqual('', err)
689
691
tree3.commit('commit two')
691
693
# Out of date lightweight checkout
692
694
rev = repo.get_revision(branch1.revision_history()[-1])
693
695
datestring_last = format_date(rev.timestamp, rev.timezone)
694
out, err = self.run_bzr('info tree/lightcheckout --verbose')
696
out, err = self.runbzr('info tree/lightcheckout --verbose')
695
697
self.assertEqualDiff(
696
"""Lightweight checkout (format: %s)
698
light checkout root: tree/lightcheckout
699
checkout of branch: repo/branch
700
shared repository: repo
699
light checkout root: %s
700
shared repository: %s
701
repository branch: branch
703
704
control: Meta directory format 1
704
working tree: Working tree format 6
705
working tree: Working tree format 3
706
branch: Branch format 5
708
709
Working tree is out of date: missing 1 revision.
723
725
first revision: %s
724
726
latest revision: %s
728
""" % (self._repo_strings, format.get_branch_format().get_format_description(),
729
format.repository_format.get_format_description(),
731
""" % (tree2.bzrdir.root_transport.base,
732
repo.bzrdir.root_transport.base,
733
repo._format.get_format_description(),
730
734
datestring_first, datestring_last,
735
# poking at _revision_store isn't all that clean, but neither is
736
# having the ui test dependent on the exact overhead of a given store.
737
repo._revision_store.total_size(repo.get_transaction())[1] / 1024,
732
739
self.assertEqual('', err)
734
741
# Show info about shared branch
735
out, err = self.run_bzr('info repo/branch --verbose')
742
out, err = self.runbzr('info repo/branch --verbose')
736
743
self.assertEqualDiff(
737
"""Repository branch (format: dirstate or knit)
739
shared repository: repo
740
repository branch: repo/branch
745
shared repository: %s
746
repository branch: branch
743
749
control: Meta directory format 1
750
branch: Branch format 5
750
757
first revision: %s
751
758
latest revision: %s
755
""" % (format.get_branch_format().get_format_description(),
756
format.repository_format.get_format_description(),
763
""" % (repo.bzrdir.root_transport.base,
764
repo._format.get_format_description(),
757
765
datestring_first, datestring_last,
766
# poking at _revision_store isn't all that clean, but neither is
767
# having the ui test dependent on the exact overhead of a given store.
768
repo._revision_store.total_size(repo.get_transaction())[1] / 1024,
759
770
self.assertEqual('', err)
761
772
# Show info about repository with revisions
762
out, err = self.run_bzr('info -v repo')
773
out, err = self.runbzr('info repo')
763
774
self.assertEqualDiff(
764
"""Shared repository (format: dirstate or dirstate-tags or knit)
766
shared repository: repo
776
shared repository: %s
769
779
control: Meta directory format 1
774
""" % (format.repository_format.get_format_description(),
785
""" % (repo.bzrdir.root_transport.base,
786
repo._format.get_format_description(),
787
# poking at _revision_store isn't all that clean, but neither is
788
# having the ui test dependent on the exact overhead of a given store.
789
repo._revision_store.total_size(repo.get_transaction())[1] / 1024,
776
791
self.assertEqual('', err)
793
bzrlib.bzrdir.BzrDirFormat.set_default_format(old_format)
778
795
def test_info_shared_repository_with_trees(self):
779
format = bzrdir.format_registry.make_bzrdir('knit')
796
old_format = bzrlib.bzrdir.BzrDirFormat.get_default_format()
797
bzrlib.bzrdir.BzrDirFormat.set_default_format(bzrlib.bzrdir.BzrDirMetaFormat1())
780
798
transport = self.get_transport()
782
800
# Create shared repository with working trees
783
repo = self.make_repository('repo', shared=True, format=format)
801
repo = self.make_repository('repo', shared=True)
784
802
repo.set_make_working_trees(True)
785
out, err = self.run_bzr('info -v repo')
803
out, err = self.runbzr('info repo')
786
804
self.assertEqualDiff(
787
"""Shared repository with trees (format: dirstate or dirstate-tags or knit)
789
shared repository: repo
806
shared repository: %s
792
809
control: Meta directory format 1
795
812
Create working tree for new branches inside the repository.
799
""" % (format.repository_format.get_format_description(),
817
""" % (repo.bzrdir.root_transport.base,
818
repo._format.get_format_description(),
801
820
self.assertEqual('', err)
803
822
# Create two branches
804
823
repo.bzrdir.root_transport.mkdir('branch1')
805
branch1 = repo.bzrdir.create_branch_convenience('repo/branch1',
824
branch1 = repo.bzrdir.create_branch_convenience('repo/branch1')
807
825
branch2 = branch1.bzrdir.sprout('repo/branch2').open_branch()
809
827
# Empty first branch
810
out, err = self.run_bzr('info repo/branch1 --verbose')
828
out, err = self.runbzr('info repo/branch1 --verbose')
811
829
self.assertEqualDiff(
812
"""Repository tree (format: knit)
814
shared repository: repo
815
repository branch: repo/branch1
831
shared repository: %s
832
repository checkout: branch1
818
835
control: Meta directory format 1
819
836
working tree: Working tree format 3
837
branch: Branch format 5
823
840
In the working tree:
876
894
first revision: %s
877
895
latest revision: %s
881
""" % (format.get_branch_format().get_format_description(),
882
format.repository_format.get_format_description(),
900
""" % (repo.bzrdir.root_transport.base,
901
repo._format.get_format_description(),
883
902
datestring_first, datestring_first,
903
# poking at _revision_store isn't all that clean, but neither is
904
# having the ui test dependent on the exact overhead of a given store.
905
repo._revision_store.total_size(repo.get_transaction())[1] / 1024,
885
907
self.assertEqual('', err)
887
909
# Out of date second branch
888
out, err = self.run_bzr('info repo/branch2 --verbose')
910
out, err = self.runbzr('info repo/branch2 --verbose')
889
911
self.assertEqualDiff(
890
"""Repository tree (format: knit)
892
shared repository: repo
893
repository branch: repo/branch2
913
shared repository: %s
914
repository checkout: branch2
895
916
Related branches:
896
parent branch: repo/branch1
899
920
control: Meta directory format 1
900
921
working tree: Working tree format 3
922
branch: Branch format 5
904
925
In the working tree:
919
""" % (format.get_branch_format().get_format_description(),
920
format.repository_format.get_format_description(),
942
""" % (repo.bzrdir.root_transport.base,
943
branch1.bzrdir.root_transport.base,
944
repo._format.get_format_description(),
945
# poking at _revision_store isn't all that clean, but neither is
946
# having the ui test dependent on the exact overhead of a given store.
947
repo._revision_store.total_size(repo.get_transaction())[1] / 1024,
922
949
self.assertEqual('', err)
924
951
# Update second branch
925
952
tree2 = branch2.bzrdir.open_workingtree()
926
953
tree2.pull(branch1)
927
out, err = self.run_bzr('info -v repo/branch2')
954
out, err = self.runbzr('info repo/branch2')
928
955
self.assertEqualDiff(
929
"""Repository tree (format: knit)
931
shared repository: repo
932
repository branch: repo/branch2
957
shared repository: %s
958
repository checkout: branch2
934
960
Related branches:
935
parent branch: repo/branch1
938
964
control: Meta directory format 1
939
965
working tree: Working tree format 3
966
branch: Branch format 5
943
969
In the working tree:
956
982
first revision: %s
957
983
latest revision: %s
961
""" % (format.get_branch_format().get_format_description(),
962
format.repository_format.get_format_description(),
988
""" % (repo.bzrdir.root_transport.base,
989
branch1.bzrdir.root_transport.base,
990
repo._format.get_format_description(),
963
991
datestring_first, datestring_first,
992
# poking at _revision_store isn't all that clean, but neither is
993
# having the ui test dependent on the exact overhead of a given store.
994
repo._revision_store.total_size(repo.get_transaction())[1] / 1024,
965
996
self.assertEqual('', err)
967
998
# Show info about repository with revisions
968
out, err = self.run_bzr('info -v repo')
999
out, err = self.runbzr('info repo')
969
1000
self.assertEqualDiff(
970
"""Shared repository with trees (format: dirstate or dirstate-tags or knit)
972
shared repository: repo
1002
shared repository: %s
975
1005
control: Meta directory format 1
978
1008
Create working tree for new branches inside the repository.
982
""" % (format.repository_format.get_format_description(),
1013
""" % (repo.bzrdir.root_transport.base,
1014
repo._format.get_format_description(),
1015
# poking at _revision_store isn't all that clean, but neither is
1016
# having the ui test dependent on the exact overhead of a given store.
1017
repo._revision_store.total_size(repo.get_transaction())[1] / 1024,
985
1020
self.assertEqual('', err)
1022
bzrlib.bzrdir.BzrDirFormat.set_default_format(old_format)
987
1024
def test_info_shared_repository_with_tree_in_root(self):
988
format = bzrdir.format_registry.make_bzrdir('knit')
1025
old_format = bzrlib.bzrdir.BzrDirFormat.get_default_format()
1026
bzrlib.bzrdir.BzrDirFormat.set_default_format(bzrlib.bzrdir.BzrDirMetaFormat1())
989
1027
transport = self.get_transport()
991
1029
# Create shared repository with working trees
992
repo = self.make_repository('repo', shared=True, format=format)
1030
repo = self.make_repository('repo', shared=True)
993
1031
repo.set_make_working_trees(True)
994
out, err = self.run_bzr('info -v repo')
1032
out, err = self.runbzr('info repo')
995
1033
self.assertEqualDiff(
996
"""Shared repository with trees (format: dirstate or dirstate-tags or knit)
998
shared repository: repo
1035
shared repository: %s
1001
1038
control: Meta directory format 1
1039
1077
Branch history:
1044
""" % (format.get_branch_format().get_format_description(),
1045
format.repository_format.get_format_description(),
1047
self.assertEqual('', err)
1049
def test_info_repository_hook(self):
1050
format = bzrdir.format_registry.make_bzrdir('knit')
1051
def repo_info(repo, stats, outf):
1052
outf.write("more info\n")
1053
info.hooks.install_named_hook('repository', repo_info, None)
1054
# Create shared repository with working trees
1055
repo = self.make_repository('repo', shared=True, format=format)
1056
out, err = self.run_bzr('info -v repo')
1057
self.assertEqualDiff(
1058
"""Shared repository with trees (format: dirstate or dirstate-tags or knit)
1060
shared repository: repo
1063
control: Meta directory format 1
1066
Create working tree for new branches inside the repository.
1071
""" % (format.repository_format.get_format_description(),
1073
self.assertEqual('', err)
1075
def assertCheckoutStatusOutput(self,
1083
""" % (repo.bzrdir.root_transport.base,
1084
repo._format.get_format_description(),
1086
self.assertEqual('', err)
1088
bzrlib.bzrdir.BzrDirFormat.set_default_format(old_format)
1090
def assertCheckoutStatusOutput(self,
1076
1091
command_string, lco_tree, shared_repo=None,
1077
1092
repo_branch=None,
1078
1093
tree_locked=False,
1079
1094
branch_locked=False, repo_locked=False,
1081
light_checkout=True,
1082
checkout_root=None):
1083
"""Check the output of info in a checkout.
1096
light_checkout=True):
1097
"""Check the output of info in a light checkout tree.
1085
1099
This is not quite a mirror of the info code: rather than using the
1086
1100
tree being examined to predict output, it uses a bunch of flags which
1087
1101
allow us, the test writers, to document what *should* be present in
1088
1102
the output. Removing this separation would remove the value of the
1091
1105
:param path: the path to the light checkout.
1092
1106
:param lco_tree: the tree object for the light checkout.
1093
1107
:param shared_repo: A shared repository is in use, expect that in
1097
1111
:param tree_locked: If true, expect the tree to be locked.
1098
1112
:param branch_locked: If true, expect the branch to be locked.
1099
1113
:param repo_locked: If true, expect the repository to be locked.
1100
Note that the lco_tree.branch.repository is inspected, and if is not
1101
actually locked then this parameter is overridden. This is because
1102
pack repositories do not have any public API for obtaining an
1103
exclusive repository wide lock.
1104
:param verbose: verbosity level: 2 or higher to show committers
1114
:param verbose: If true, expect verbose output
1106
def friendly_location(url):
1107
path = urlutils.unescape_for_display(url, 'ascii')
1109
return osutils.relpath(osutils.getcwd(), path)
1110
except errors.PathNotChild:
1114
# We expect this to fail because of locking errors.
1115
# (A write-locked file cannot be read-locked
1116
# in the different process -- either on win32 or on linux).
1117
# This should be removed when the locking errors are fixed.
1118
self.expectFailure('OS locks are exclusive '
1119
'for different processes (Bug #174055)',
1120
self.run_bzr_subprocess,
1121
'info ' + command_string)
1122
out, err = self.run_bzr('info %s' % command_string)
1124
(True, True): 'Lightweight checkout',
1125
(True, False): 'Repository checkout',
1126
(False, True): 'Lightweight checkout',
1127
(False, False): 'Checkout',
1128
}[(shared_repo is not None, light_checkout)]
1129
format = {True: self._repo_strings,
1130
False: 'unnamed'}[light_checkout]
1132
repo_locked = lco_tree.branch.repository.get_physical_lock_status()
1116
out, err = self.runbzr('info %s' % command_string)
1133
1117
if repo_locked or branch_locked or tree_locked:
1134
1118
def locked_message(a_bool):
1147
1131
locked_message(repo_locked)))
1149
1133
expected_lock_output = ''
1152
1134
if light_checkout:
1153
tree_data = (" light checkout root: %s\n" %
1154
friendly_location(lco_tree.bzrdir.root_transport.base))
1156
if lco_tree.branch.get_bound_location() is not None:
1157
tree_data += ("%s checkout root: %s\n" % (extra_space,
1158
friendly_location(lco_tree.branch.bzrdir.root_transport.base)))
1135
tree_data = (" light checkout root: %s" %
1136
lco_tree.bzrdir.root_transport.base)
1138
tree_data = (" checkout root: %s" %
1139
lco_tree.bzrdir.root_transport.base)
1159
1140
if shared_repo is not None:
1160
1141
branch_data = (
1161
" checkout of branch: %s\n"
1162
" shared repository: %s\n" %
1163
(friendly_location(repo_branch.bzrdir.root_transport.base),
1164
friendly_location(shared_repo.bzrdir.root_transport.base)))
1142
" shared repository: %s\n"
1143
" repository branch: branch\n" %
1144
shared_repo.bzrdir.root_transport.base)
1165
1145
elif repo_branch is not None:
1166
1146
branch_data = (
1167
"%s checkout of branch: %s\n" %
1169
friendly_location(repo_branch.bzrdir.root_transport.base)))
1147
" checkout of branch: %s\n" %
1148
repo_branch.bzrdir.root_transport.base)
1171
branch_data = (" checkout of branch: %s\n" %
1150
branch_data = (" checkout of branch: %s\n" %
1172
1151
lco_tree.branch.bzrdir.root_transport.base)
1175
1154
verbose_info = ' 0 committers\n'
1177
1156
verbose_info = ''
1179
1158
self.assertEqualDiff(
1184
1163
control: Meta directory format 1
1185
1164
working tree: %s
1165
branch: Branch format 5
1189
1168
In the working tree:
1217
1194
transport = self.get_transport()
1218
1195
# Create shared repository with a branch
1219
1196
repo = self.make_repository('repo', shared=True,
1220
format=bzrdir.BzrDirMetaFormat1())
1197
format=bzrlib.bzrdir.BzrDirMetaFormat1())
1221
1198
repo.set_make_working_trees(False)
1222
1199
repo.bzrdir.root_transport.mkdir('branch')
1223
1200
repo_branch = repo.bzrdir.create_branch_convenience('repo/branch',
1224
format=bzrdir.BzrDirMetaFormat1())
1201
format=bzrlib.bzrdir.BzrDirMetaFormat1())
1225
1202
# Do a heavy checkout
1226
1203
transport.mkdir('tree')
1227
1204
transport.mkdir('tree/checkout')
1228
co_branch = bzrdir.BzrDir.create_branch_convenience('tree/checkout',
1229
format=bzrdir.BzrDirMetaFormat1())
1205
co_branch = bzrlib.bzrdir.BzrDir.create_branch_convenience('tree/checkout',
1206
format=bzrlib.bzrdir.BzrDirMetaFormat1())
1230
1207
co_branch.bind(repo_branch)
1231
1208
# Do a light checkout of the heavy one
1232
1209
transport.mkdir('tree/lightcheckout')
1233
lco_dir = bzrdir.BzrDirMetaFormat1().initialize('tree/lightcheckout')
1234
branch.BranchReferenceFormat().initialize(lco_dir, co_branch)
1210
lco_dir = bzrlib.bzrdir.BzrDirMetaFormat1().initialize('tree/lightcheckout')
1211
bzrlib.branch.BranchReferenceFormat().initialize(lco_dir, co_branch)
1235
1212
lco_dir.create_workingtree()
1236
1213
lco_tree = lco_dir.open_workingtree()
1242
self.assertCheckoutStatusOutput('-v tree/lightcheckout', lco_tree,
1243
repo_branch=repo_branch,
1244
verbose=True, light_checkout=True)
1219
self.assertCheckoutStatusOutput('tree/lightcheckout', lco_tree)
1246
1221
lco_tree.branch.repository.lock_write()
1248
self.assertCheckoutStatusOutput('-v tree/lightcheckout',
1249
lco_tree, repo_branch=repo_branch,
1250
repo_locked=True, verbose=True, light_checkout=True)
1223
self.assertCheckoutStatusOutput('tree/lightcheckout',
1252
1227
lco_tree.branch.repository.unlock()
1254
1229
lco_tree.branch.lock_write()
1256
self.assertCheckoutStatusOutput('-v tree/lightcheckout',
1231
self.assertCheckoutStatusOutput('tree/lightcheckout',
1258
1233
branch_locked=True,
1260
repo_branch=repo_branch,
1263
1236
lco_tree.branch.unlock()
1265
1238
lco_tree.lock_write()
1267
self.assertCheckoutStatusOutput('-v tree/lightcheckout',
1268
lco_tree, repo_branch=repo_branch,
1240
self.assertCheckoutStatusOutput('tree/lightcheckout',
1269
1242
tree_locked=True,
1270
1243
branch_locked=True,
1274
1246
lco_tree.unlock()
1276
1248
lco_tree.lock_write()
1277
1249
lco_tree.branch.repository.unlock()
1279
self.assertCheckoutStatusOutput('-v tree/lightcheckout',
1280
lco_tree, repo_branch=repo_branch,
1251
self.assertCheckoutStatusOutput('tree/lightcheckout',
1281
1253
tree_locked=True,
1285
1256
lco_tree.branch.repository.lock_write()
1286
1257
lco_tree.unlock()
1313
1282
lco_tree.branch.lock_write()
1314
1283
lco_tree.branch.repository.unlock()
1316
self.assertCheckoutStatusOutput('-v tree/lightcheckout',
1317
lco_tree, repo_branch=repo_branch,
1285
self.assertCheckoutStatusOutput('tree/lightcheckout',
1321
1289
lco_tree.branch.repository.lock_write()
1322
1290
lco_tree.branch.unlock()
1324
if sys.platform == 'win32':
1325
self.knownFailure('Win32 cannot run "bzr info"'
1326
' when the tree is locked.')
1328
1292
def test_info_locking_oslocks(self):
1329
1293
if sys.platform == "win32":
1330
1294
raise TestSkipped("don't use oslocks on win32 in unix manner")
1331
# This test tests old (all-in-one, OS lock using) behaviour which
1332
# simply cannot work on windows (and is indeed why we changed our
1333
# design. As such, don't try to remove the thisFailsStrictLockCheck
1335
self.thisFailsStrictLockCheck()
1337
1296
tree = self.make_branch_and_tree('branch',
1338
format=bzrdir.BzrDirFormat6())
1297
format=bzrlib.bzrdir.BzrDirFormat6())
1340
1299
# Test all permutations of locking the working tree, branch and repository
1341
1300
# XXX: Well not yet, as we can't query oslocks yet. Currently, it's
1401
1360
Branch history:
1406
""" % ('branch', tree.branch.repository._format.get_format_description(),
1366
""" % (tree.bzrdir.root_transport.base,
1367
tree.branch.repository._format.get_format_description(),
1408
1369
self.assertEqual('', err)
1411
def test_info_stacked(self):
1412
# We have a mainline
1413
trunk_tree = self.make_branch_and_tree('mainline',
1415
trunk_tree.commit('mainline')
1416
# and a branch from it which is stacked
1417
new_dir = trunk_tree.bzrdir.sprout('newbranch', stacked=True)
1418
out, err = self.run_bzr('info newbranch')
1420
"""Standalone tree (format: 1.6)
1422
branch root: newbranch
1425
parent branch: mainline
1426
stacked on: mainline
1428
self.assertEqual("", err)