1
# Copyright (C) 2006-2010 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."""
32
from bzrlib.transport import memory
35
class TestInfo(tests.TestCaseWithTransport):
38
super(TestInfo, self).setUp()
39
self._repo_strings = "2a"
24
from bzrlib.osutils import format_date
25
from bzrlib.tests import TestSkipped
26
from bzrlib.tests.blackbox import ExternalBase
29
class TestInfo(ExternalBase):
41
31
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)
32
if sys.platform == "win32":
33
location = "C:/i/do/not/exist/"
35
location = "/i/do/not/exist/"
36
out, err = self.runbzr('info '+location, retcode=3)
45
37
self.assertEqual(out, '')
46
self.assertEqual(err, 'bzr: ERROR: Not a branch: "%s".\n' % location)
38
self.assertEqual(err, 'bzr: ERROR: Not a branch: %s\n' % location)
48
40
def test_info_standalone(self):
49
41
transport = self.get_transport()
51
43
# Create initial standalone branch
52
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)
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)
185
133
# Branch and bind to standalone, needs upgrade to metadir
186
134
# (creates backup as unknown)
187
135
branch1.bzrdir.sprout('bound')
188
knit1_format = bzrdir.format_registry.make_bzrdir('knit')
189
upgrade.upgrade('bound', knit1_format)
190
branch3 = bzrdir.BzrDir.open('bound').open_branch()
136
bzrlib.upgrade.upgrade('bound', bzrlib.bzrdir.BzrDirMetaFormat1())
137
branch3 = bzrlib.bzrdir.BzrDir.open('bound').open_branch()
191
138
branch3.bind(branch1)
192
139
bound_tree = branch3.bzrdir.open_workingtree()
193
out, err = self.run_bzr('info -v bound')
140
out, err = self.runbzr('info bound')
194
141
self.assertEqualDiff(
195
"""Checkout (format: knit)
198
checkout of branch: standalone
144
checkout of branch: %s
200
146
Related branches:
201
parent branch: standalone
204
150
control: Meta directory format 1
152
branch: Branch format 5
209
155
In the working tree:
222
168
first revision: %s
223
169
latest revision: %s
227
""" % (bound_tree._format.get_format_description(),
228
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(),
229
178
branch3.repository._format.get_format_description(),
230
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,
232
185
self.assertEqual('', err)
234
187
# Checkout standalone (same as above, but does not have parent set)
235
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)
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
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)
277
246
branch5 = tree5.branch
278
out, err = self.run_bzr('info -v lightcheckout')
247
out, err = self.runbzr('info lightcheckout')
279
248
self.assertEqualDiff(
280
"""Lightweight checkout (format: %s)
282
light checkout root: lightcheckout
283
checkout of branch: standalone
250
light checkout root: %s
251
checkout of branch: %s
286
254
control: Meta directory format 1
287
working tree: Working tree format 6
255
working tree: Working tree format 3
288
256
branch: Branch format 4
289
257
repository: Weave repository format 6
349
320
first revision: %s
350
321
latest revision: %s
354
""" % (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,
356
331
self.assertEqual('', err)
358
333
# Out of date bound branch
359
out, err = self.run_bzr('info -v bound')
334
out, err = self.runbzr('info bound')
360
335
self.assertEqualDiff(
361
"""Checkout (format: knit)
364
checkout of branch: standalone
338
checkout of branch: %s
366
340
Related branches:
367
parent branch: standalone
370
344
control: Meta directory format 1
390
364
first revision: %s
391
365
latest revision: %s
395
""" % (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(),
396
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,
398
380
self.assertEqual('', err)
400
382
# Out of date checkout
401
out, err = self.run_bzr('info -v checkout')
383
out, err = self.runbzr('info checkout')
402
384
self.assertEqualDiff(
403
"""Checkout (format: knit)
405
checkout root: checkout
406
checkout of branch: standalone
387
checkout of branch: %s
409
390
control: Meta directory format 1
429
410
first revision: %s
430
411
latest revision: %s
434
""" % (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(),
435
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,
437
425
self.assertEqual('', err)
439
427
# Out of date lightweight checkout
440
out, err = self.run_bzr('info lightcheckout --verbose')
428
out, err = self.runbzr('info lightcheckout --verbose')
441
429
self.assertEqualDiff(
442
"""Lightweight checkout (format: %s)
444
light checkout root: lightcheckout
445
checkout of branch: standalone
431
light checkout root: %s
432
checkout of branch: %s
448
435
control: Meta directory format 1
449
working tree: Working tree format 6
436
working tree: Working tree format 3
450
437
branch: Branch format 4
451
438
repository: Weave repository format 6
468
456
first revision: %s
469
457
latest revision: %s
473
""" % (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,
474
466
self.assertEqual('', err)
476
468
def test_info_standalone_no_tree(self):
477
469
# create standalone branch without a working tree
478
format = bzrdir.format_registry.make_bzrdir('default')
479
470
branch = self.make_branch('branch')
480
471
repo = branch.repository
481
out, err = self.run_bzr('info branch -v')
472
out, err = self.runbzr('info branch')
482
473
self.assertEqualDiff(
483
"""Standalone branch (format: %s)
488
478
control: Meta directory format 1
479
branch: Branch format 5
497
""" % (info.describe_format(repo.bzrdir, repo, branch, None),
498
format.get_branch_format().get_format_description(),
499
format.repository_format.get_format_description(),
488
""" % (branch.bzrdir.root_transport.base,
489
repo._format.get_format_description(),
501
491
self.assertEqual('', err)
503
493
def test_info_shared_repository(self):
504
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())
505
496
transport = self.get_transport()
507
498
# Create shared repository
508
repo = self.make_repository('repo', shared=True, format=format)
499
repo = self.make_repository('repo', shared=True)
509
500
repo.set_make_working_trees(False)
510
out, err = self.run_bzr('info -v repo')
501
out, err = self.runbzr('info repo')
511
502
self.assertEqualDiff(
512
"""Shared repository (format: dirstate or dirstate-tags or knit)
514
504
shared repository: %s
517
507
control: Meta directory format 1
522
""" % ('repo', format.repository_format.get_format_description(),
513
""" % (repo.bzrdir.root_transport.base,
514
repo._format.get_format_description(),
524
516
self.assertEqual('', err)
526
518
# Create branch inside shared repository
527
519
repo.bzrdir.root_transport.mkdir('branch')
528
branch1 = repo.bzrdir.create_branch_convenience('repo/branch',
530
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')
531
522
self.assertEqualDiff(
532
"""Repository branch (format: dirstate or knit)
534
shared repository: repo
535
repository branch: repo/branch
524
shared repository: %s
525
repository branch: branch
538
528
control: Meta directory format 1
529
branch: Branch format 5
547
""" % (format.get_branch_format().get_format_description(),
548
format.repository_format.get_format_description(),
538
""" % (repo.bzrdir.root_transport.base,
539
repo._format.get_format_description(),
550
541
self.assertEqual('', err)
552
543
# Create lightweight checkout
553
544
transport.mkdir('tree')
554
545
transport.mkdir('tree/lightcheckout')
555
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()
557
550
branch2 = tree2.branch
558
self.assertCheckoutStatusOutput('-v tree/lightcheckout', tree2,
559
shared_repo=repo, repo_branch=branch1, verbose=True)
551
self.assertCheckoutStatusOutput('tree/lightcheckout', tree2, shared_repo=repo)
561
553
# Create normal checkout
562
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()
563
558
self.assertCheckoutStatusOutput('tree/checkout --verbose', tree3,
565
560
light_checkout=False, repo_branch=branch1)
599
594
first revision: %s
600
595
latest revision: %s
604
""" % (self._repo_strings, format.get_branch_format().get_format_description(),
605
format.repository_format.get_format_description(),
600
""" % (tree2.bzrdir.root_transport.base,
601
repo.bzrdir.root_transport.base,
602
repo._format.get_format_description(),
606
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,
608
608
self.assertEqual('', err)
610
610
# Out of date checkout
611
out, err = self.run_bzr('info -v tree/checkout')
611
out, err = self.runbzr('info tree/checkout')
612
612
self.assertEqualDiff(
613
"""Checkout (format: unnamed)
615
checkout root: tree/checkout
616
checkout of branch: repo/branch
615
checkout of branch: %s
619
618
control: Meta directory format 1
620
working tree: Working tree format 6
619
working tree: Working tree format 3
620
branch: Branch format 5
624
623
Branch is out of date: missing 1 revision.
676
677
first revision: %s
677
678
latest revision: %s
681
""" % (format.get_branch_format().get_format_description(),
682
format.repository_format.get_format_description(),
683
""" % (tree3.bzrdir.root_transport.base, branch1.bzrdir.root_transport.base,
684
repo._format.get_format_description(),
683
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,
685
690
self.assertEqual('', err)
686
691
tree3.commit('commit two')
688
693
# Out of date lightweight checkout
689
694
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')
695
datestring_last = format_date(rev.timestamp, rev.timezone)
696
out, err = self.runbzr('info tree/lightcheckout --verbose')
692
697
self.assertEqualDiff(
693
"""Lightweight checkout (format: %s)
695
light checkout root: tree/lightcheckout
696
checkout of branch: repo/branch
697
shared repository: repo
699
light checkout root: %s
700
shared repository: %s
701
repository branch: branch
700
704
control: Meta directory format 1
701
working tree: Working tree format 6
705
working tree: Working tree format 3
706
branch: Branch format 5
705
709
Working tree is out of date: missing 1 revision.
720
725
first revision: %s
721
726
latest revision: %s
725
""" % (self._repo_strings, format.get_branch_format().get_format_description(),
726
format.repository_format.get_format_description(),
731
""" % (tree2.bzrdir.root_transport.base,
732
repo.bzrdir.root_transport.base,
733
repo._format.get_format_description(),
727
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,
729
739
self.assertEqual('', err)
731
741
# Show info about shared branch
732
out, err = self.run_bzr('info repo/branch --verbose')
742
out, err = self.runbzr('info repo/branch --verbose')
733
743
self.assertEqualDiff(
734
"""Repository branch (format: dirstate or knit)
736
shared repository: repo
737
repository branch: repo/branch
745
shared repository: %s
746
repository branch: branch
740
749
control: Meta directory format 1
750
branch: Branch format 5
747
757
first revision: %s
748
758
latest revision: %s
752
""" % (format.get_branch_format().get_format_description(),
753
format.repository_format.get_format_description(),
763
""" % (repo.bzrdir.root_transport.base,
764
repo._format.get_format_description(),
754
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,
756
770
self.assertEqual('', err)
758
772
# Show info about repository with revisions
759
out, err = self.run_bzr('info -v repo')
773
out, err = self.runbzr('info repo')
760
774
self.assertEqualDiff(
761
"""Shared repository (format: dirstate or dirstate-tags or knit)
763
shared repository: repo
776
shared repository: %s
766
779
control: Meta directory format 1
771
""" % (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,
773
791
self.assertEqual('', err)
793
bzrlib.bzrdir.BzrDirFormat.set_default_format(old_format)
775
795
def test_info_shared_repository_with_trees(self):
776
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())
777
798
transport = self.get_transport()
779
800
# Create shared repository with working trees
780
repo = self.make_repository('repo', shared=True, format=format)
801
repo = self.make_repository('repo', shared=True)
781
802
repo.set_make_working_trees(True)
782
out, err = self.run_bzr('info -v repo')
803
out, err = self.runbzr('info repo')
783
804
self.assertEqualDiff(
784
"""Shared repository with trees (format: dirstate or dirstate-tags or knit)
786
shared repository: repo
806
shared repository: %s
789
809
control: Meta directory format 1
792
812
Create working tree for new branches inside the repository.
796
""" % (format.repository_format.get_format_description(),
817
""" % (repo.bzrdir.root_transport.base,
818
repo._format.get_format_description(),
798
820
self.assertEqual('', err)
800
822
# Create two branches
801
823
repo.bzrdir.root_transport.mkdir('branch1')
802
branch1 = repo.bzrdir.create_branch_convenience('repo/branch1',
824
branch1 = repo.bzrdir.create_branch_convenience('repo/branch1')
804
825
branch2 = branch1.bzrdir.sprout('repo/branch2').open_branch()
806
827
# Empty first branch
807
out, err = self.run_bzr('info repo/branch1 --verbose')
828
out, err = self.runbzr('info repo/branch1 --verbose')
808
829
self.assertEqualDiff(
809
"""Repository tree (format: knit)
811
shared repository: repo
812
repository branch: repo/branch1
831
shared repository: %s
832
repository checkout: branch1
815
835
control: Meta directory format 1
816
836
working tree: Working tree format 3
837
branch: Branch format 5
820
840
In the working tree:
873
894
first revision: %s
874
895
latest revision: %s
878
""" % (format.get_branch_format().get_format_description(),
879
format.repository_format.get_format_description(),
900
""" % (repo.bzrdir.root_transport.base,
901
repo._format.get_format_description(),
880
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,
882
907
self.assertEqual('', err)
884
909
# Out of date second branch
885
out, err = self.run_bzr('info repo/branch2 --verbose')
910
out, err = self.runbzr('info repo/branch2 --verbose')
886
911
self.assertEqualDiff(
887
"""Repository tree (format: knit)
889
shared repository: repo
890
repository branch: repo/branch2
913
shared repository: %s
914
repository checkout: branch2
892
916
Related branches:
893
parent branch: repo/branch1
896
920
control: Meta directory format 1
897
921
working tree: Working tree format 3
922
branch: Branch format 5
901
925
In the working tree:
916
""" % (format.get_branch_format().get_format_description(),
917
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,
919
949
self.assertEqual('', err)
921
951
# Update second branch
922
952
tree2 = branch2.bzrdir.open_workingtree()
923
953
tree2.pull(branch1)
924
out, err = self.run_bzr('info -v repo/branch2')
954
out, err = self.runbzr('info repo/branch2')
925
955
self.assertEqualDiff(
926
"""Repository tree (format: knit)
928
shared repository: repo
929
repository branch: repo/branch2
957
shared repository: %s
958
repository checkout: branch2
931
960
Related branches:
932
parent branch: repo/branch1
935
964
control: Meta directory format 1
936
965
working tree: Working tree format 3
966
branch: Branch format 5
940
969
In the working tree:
953
982
first revision: %s
954
983
latest revision: %s
958
""" % (format.get_branch_format().get_format_description(),
959
format.repository_format.get_format_description(),
988
""" % (repo.bzrdir.root_transport.base,
989
branch1.bzrdir.root_transport.base,
990
repo._format.get_format_description(),
960
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,
962
996
self.assertEqual('', err)
964
998
# Show info about repository with revisions
965
out, err = self.run_bzr('info -v repo')
999
out, err = self.runbzr('info repo')
966
1000
self.assertEqualDiff(
967
"""Shared repository with trees (format: dirstate or dirstate-tags or knit)
969
shared repository: repo
1002
shared repository: %s
972
1005
control: Meta directory format 1
975
1008
Create working tree for new branches inside the repository.
979
""" % (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,
982
1020
self.assertEqual('', err)
1022
bzrlib.bzrdir.BzrDirFormat.set_default_format(old_format)
984
1024
def test_info_shared_repository_with_tree_in_root(self):
985
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())
986
1027
transport = self.get_transport()
988
1029
# Create shared repository with working trees
989
repo = self.make_repository('repo', shared=True, format=format)
1030
repo = self.make_repository('repo', shared=True)
990
1031
repo.set_make_working_trees(True)
991
out, err = self.run_bzr('info -v repo')
1032
out, err = self.runbzr('info repo')
992
1033
self.assertEqualDiff(
993
"""Shared repository with trees (format: dirstate or dirstate-tags or knit)
995
shared repository: repo
1035
shared repository: %s
998
1038
control: Meta directory format 1
1036
1077
Branch history:
1041
""" % (format.get_branch_format().get_format_description(),
1042
format.repository_format.get_format_description(),
1044
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,
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,
1073
1091
command_string, lco_tree, shared_repo=None,
1074
1092
repo_branch=None,
1075
1093
tree_locked=False,
1076
1094
branch_locked=False, repo_locked=False,
1078
light_checkout=True,
1079
checkout_root=None):
1080
"""Check the output of info in a checkout.
1096
light_checkout=True):
1097
"""Check the output of info in a light checkout tree.
1082
1099
This is not quite a mirror of the info code: rather than using the
1083
1100
tree being examined to predict output, it uses a bunch of flags which
1084
1101
allow us, the test writers, to document what *should* be present in
1085
1102
the output. Removing this separation would remove the value of the
1088
1105
:param path: the path to the light checkout.
1089
1106
:param lco_tree: the tree object for the light checkout.
1090
1107
:param shared_repo: A shared repository is in use, expect that in
1094
1111
:param tree_locked: If true, expect the tree to be locked.
1095
1112
:param branch_locked: If true, expect the branch to be locked.
1096
1113
: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
1114
: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()
1116
out, err = self.runbzr('info %s' % command_string)
1130
1117
if repo_locked or branch_locked or tree_locked:
1131
1118
def locked_message(a_bool):
1144
1131
locked_message(repo_locked)))
1146
1133
expected_lock_output = ''
1149
1134
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)))
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)
1156
1140
if shared_repo is not None:
1157
1141
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)))
1142
" shared repository: %s\n"
1143
" repository branch: branch\n" %
1144
shared_repo.bzrdir.root_transport.base)
1162
1145
elif repo_branch is not None:
1163
1146
branch_data = (
1164
"%s checkout of branch: %s\n" %
1166
friendly_location(repo_branch.bzrdir.root_transport.base)))
1147
" checkout of branch: %s\n" %
1148
repo_branch.bzrdir.root_transport.base)
1168
branch_data = (" checkout of branch: %s\n" %
1150
branch_data = (" checkout of branch: %s\n" %
1169
1151
lco_tree.branch.bzrdir.root_transport.base)
1172
1154
verbose_info = ' 0 committers\n'
1174
1156
verbose_info = ''
1176
1158
self.assertEqualDiff(
1181
1163
control: Meta directory format 1
1182
1164
working tree: %s
1165
branch: Branch format 5
1186
1168
In the working tree:
1214
1194
transport = self.get_transport()
1215
1195
# Create shared repository with a branch
1216
1196
repo = self.make_repository('repo', shared=True,
1217
format=bzrdir.BzrDirMetaFormat1())
1197
format=bzrlib.bzrdir.BzrDirMetaFormat1())
1218
1198
repo.set_make_working_trees(False)
1219
1199
repo.bzrdir.root_transport.mkdir('branch')
1220
1200
repo_branch = repo.bzrdir.create_branch_convenience('repo/branch',
1221
format=bzrdir.BzrDirMetaFormat1())
1201
format=bzrlib.bzrdir.BzrDirMetaFormat1())
1222
1202
# Do a heavy checkout
1223
1203
transport.mkdir('tree')
1224
1204
transport.mkdir('tree/checkout')
1225
co_branch = bzrdir.BzrDir.create_branch_convenience('tree/checkout',
1226
format=bzrdir.BzrDirMetaFormat1())
1205
co_branch = bzrlib.bzrdir.BzrDir.create_branch_convenience('tree/checkout',
1206
format=bzrlib.bzrdir.BzrDirMetaFormat1())
1227
1207
co_branch.bind(repo_branch)
1228
1208
# Do a light checkout of the heavy one
1229
1209
transport.mkdir('tree/lightcheckout')
1230
lco_dir = bzrdir.BzrDirMetaFormat1().initialize('tree/lightcheckout')
1231
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)
1232
1212
lco_dir.create_workingtree()
1233
1213
lco_tree = lco_dir.open_workingtree()
1239
self.assertCheckoutStatusOutput('-v tree/lightcheckout', lco_tree,
1240
repo_branch=repo_branch,
1241
verbose=True, light_checkout=True)
1219
self.assertCheckoutStatusOutput('tree/lightcheckout', lco_tree)
1243
1221
lco_tree.branch.repository.lock_write()
1245
self.assertCheckoutStatusOutput('-v tree/lightcheckout',
1246
lco_tree, repo_branch=repo_branch,
1247
repo_locked=True, verbose=True, light_checkout=True)
1223
self.assertCheckoutStatusOutput('tree/lightcheckout',
1249
1227
lco_tree.branch.repository.unlock()
1251
1229
lco_tree.branch.lock_write()
1253
self.assertCheckoutStatusOutput('-v tree/lightcheckout',
1231
self.assertCheckoutStatusOutput('tree/lightcheckout',
1255
1233
branch_locked=True,
1257
repo_branch=repo_branch,
1260
1236
lco_tree.branch.unlock()
1262
1238
lco_tree.lock_write()
1264
self.assertCheckoutStatusOutput('-v tree/lightcheckout',
1265
lco_tree, repo_branch=repo_branch,
1240
self.assertCheckoutStatusOutput('tree/lightcheckout',
1266
1242
tree_locked=True,
1267
1243
branch_locked=True,
1271
1246
lco_tree.unlock()
1273
1248
lco_tree.lock_write()
1274
1249
lco_tree.branch.repository.unlock()
1276
self.assertCheckoutStatusOutput('-v tree/lightcheckout',
1277
lco_tree, repo_branch=repo_branch,
1251
self.assertCheckoutStatusOutput('tree/lightcheckout',
1278
1253
tree_locked=True,
1282
1256
lco_tree.branch.repository.lock_write()
1283
1257
lco_tree.unlock()
1310
1282
lco_tree.branch.lock_write()
1311
1283
lco_tree.branch.repository.unlock()
1313
self.assertCheckoutStatusOutput('-v tree/lightcheckout',
1314
lco_tree, repo_branch=repo_branch,
1285
self.assertCheckoutStatusOutput('tree/lightcheckout',
1318
1289
lco_tree.branch.repository.lock_write()
1319
1290
lco_tree.branch.unlock()
1321
if sys.platform == 'win32':
1322
self.knownFailure('Win32 cannot run "bzr info"'
1323
' when the tree is locked.')
1325
1292
def test_info_locking_oslocks(self):
1326
1293
if sys.platform == "win32":
1327
1294
raise TestSkipped("don't use oslocks on win32 in unix manner")
1328
# This test tests old (all-in-one, OS lock using) behaviour which
1329
# simply cannot work on windows (and is indeed why we changed our
1330
# design. As such, don't try to remove the thisFailsStrictLockCheck
1332
self.thisFailsStrictLockCheck()
1334
1296
tree = self.make_branch_and_tree('branch',
1335
format=bzrdir.BzrDirFormat6())
1297
format=bzrlib.bzrdir.BzrDirFormat6())
1337
1299
# Test all permutations of locking the working tree, branch and repository
1338
1300
# XXX: Well not yet, as we can't query oslocks yet. Currently, it's