~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/blackbox/test_info.py

Streamline _walkdirs_utf8 for utf8 file systems, reducing time to traverse a mozilla tree from 1s to .6 seconds. (Robert Collins)

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2006-2010 Canonical Ltd
 
1
# Copyright (C) 2006, 2007 Canonical Ltd
2
2
#
3
3
# This program is free software; you can redistribute it and/or modify
4
4
# it under the terms of the GNU General Public License as published by
12
12
#
13
13
# You should have received a copy of the GNU General Public License
14
14
# along with this program; if not, write to the Free Software
15
 
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
16
16
 
17
17
 
18
18
"""Tests for the info command of bzr."""
25
25
    errors,
26
26
    info,
27
27
    osutils,
28
 
    tests,
29
28
    upgrade,
30
29
    urlutils,
31
30
    )
32
 
from bzrlib.transport import memory
33
 
 
34
 
 
35
 
class TestInfo(tests.TestCaseWithTransport):
36
 
 
37
 
    def setUp(self):
38
 
        super(TestInfo, self).setUp()
39
 
        self._repo_strings = "2a"
 
31
from bzrlib.osutils import format_date
 
32
from bzrlib.tests import TestSkipped
 
33
from bzrlib.tests.blackbox import ExternalBase
 
34
 
 
35
 
 
36
class TestInfo(ExternalBase):
40
37
 
41
38
    def test_info_non_existing(self):
42
 
        self.vfs_transport_factory = memory.MemoryServer
43
 
        location = self.get_url()
 
39
        if sys.platform == "win32":
 
40
            location = "C:/i/do/not/exist/"
 
41
        else:
 
42
            location = "/i/do/not/exist/"
44
43
        out, err = self.run_bzr('info '+location, retcode=3)
45
44
        self.assertEqual(out, '')
46
45
        self.assertEqual(err, 'bzr: ERROR: Not a branch: "%s".\n' % location)
62
61
""", out)
63
62
        self.assertEqual('', err)
64
63
 
65
 
        # Standalone branch - verbose mode
66
64
        out, err = self.run_bzr('info standalone -v')
67
65
        self.assertEqualDiff(
68
66
"""Standalone tree (format: weave)
87
85
 
88
86
Branch history:
89
87
         0 revisions
90
 
 
91
 
Repository:
92
 
         0 revisions
93
 
""", out)
94
 
        self.assertEqual('', err)
95
 
 
96
 
        # Standalone branch - really verbose mode
97
 
        out, err = self.run_bzr('info standalone -vv')
98
 
        self.assertEqualDiff(
99
 
"""Standalone tree (format: weave)
100
 
Location:
101
 
  branch root: standalone
102
 
 
103
 
Format:
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
108
 
 
109
 
In the working tree:
110
 
         0 unchanged
111
 
         0 modified
112
 
         1 added
113
 
         0 removed
114
 
         0 renamed
115
 
         0 unknown
116
 
         0 ignored
117
 
         0 versioned subdirectories
118
 
 
119
 
Branch history:
120
 
         0 revisions
121
88
         0 committers
122
89
 
123
90
Repository:
126
93
        self.assertEqual('', err)
127
94
        tree1.commit('commit one')
128
95
        rev = branch1.repository.get_revision(branch1.revision_history()[0])
129
 
        datestring_first = osutils.format_date(rev.timestamp, rev.timezone)
 
96
        datestring_first = format_date(rev.timestamp, rev.timezone)
130
97
 
131
98
        # Branch standalone with push location
132
99
        branch2 = branch1.bzrdir.sprout('branch').open_branch()
172
139
 
173
140
Branch history:
174
141
         1 revision
 
142
         1 committer
175
143
         0 days old
176
144
   first revision: %s
177
145
  latest revision: %s
212
180
         0 added
213
181
         0 removed
214
182
         0 renamed
215
 
         0 unknown
216
 
         1 ignored
 
183
         1 unknown
 
184
         0 ignored
217
185
         0 versioned subdirectories
218
186
 
219
187
Branch history:
220
188
         1 revision
 
189
         1 committer
221
190
         0 days old
222
191
   first revision: %s
223
192
  latest revision: %s
261
230
 
262
231
Branch history:
263
232
         1 revision
 
233
         1 committer
264
234
         0 days old
265
235
   first revision: %s
266
236
  latest revision: %s
277
247
        branch5 = tree5.branch
278
248
        out, err = self.run_bzr('info -v lightcheckout')
279
249
        self.assertEqualDiff(
280
 
"""Lightweight checkout (format: %s)
 
250
"""Lightweight checkout (format: 1.6 or 1.6.1-rich-root \
 
251
or dirstate or dirstate-tags or \
 
252
pack-0.92 or rich-root or rich-root-pack)
281
253
Location:
282
254
  light checkout root: lightcheckout
283
255
   checkout of branch: standalone
284
256
 
285
257
Format:
286
258
       control: Meta directory format 1
287
 
  working tree: Working tree format 6
 
259
  working tree: Working tree format 4
288
260
        branch: Branch format 4
289
261
    repository: Weave repository format 6
290
262
 
300
272
 
301
273
Branch history:
302
274
         1 revision
 
275
         1 committer
303
276
         0 days old
304
277
   first revision: %s
305
278
  latest revision: %s
306
279
 
307
280
Repository:
308
281
         1 revision
309
 
""" % (self._repo_strings, datestring_first, datestring_first,), out)
 
282
""" % (datestring_first, datestring_first,), out)
310
283
        self.assertEqual('', err)
311
284
 
312
285
        # Update initial standalone branch
314
287
        tree1.add('b')
315
288
        tree1.commit('commit two')
316
289
        rev = branch1.repository.get_revision(branch1.revision_history()[-1])
317
 
        datestring_last = osutils.format_date(rev.timestamp, rev.timezone)
 
290
        datestring_last = format_date(rev.timestamp, rev.timezone)
318
291
 
319
292
        # Out of date branched standalone branch will not be detected
320
293
        out, err = self.run_bzr('info -v branch')
345
318
 
346
319
Branch history:
347
320
         1 revision
 
321
         1 committer
348
322
         0 days old
349
323
   first revision: %s
350
324
  latest revision: %s
380
354
         0 added
381
355
         0 removed
382
356
         0 renamed
383
 
         0 unknown
384
 
         1 ignored
 
357
         1 unknown
 
358
         0 ignored
385
359
         0 versioned subdirectories
386
360
 
387
361
Branch history:
388
362
         1 revision
 
363
         1 committer
389
364
         0 days old
390
365
   first revision: %s
391
366
  latest revision: %s
425
400
 
426
401
Branch history:
427
402
         1 revision
 
403
         1 committer
428
404
         0 days old
429
405
   first revision: %s
430
406
  latest revision: %s
439
415
        # Out of date lightweight checkout
440
416
        out, err = self.run_bzr('info lightcheckout --verbose')
441
417
        self.assertEqualDiff(
442
 
"""Lightweight checkout (format: %s)
 
418
"""Lightweight checkout (format: 1.6 or 1.6.1-rich-root or \
 
419
dirstate or dirstate-tags or \
 
420
pack-0.92 or rich-root or rich-root-pack)
443
421
Location:
444
422
  light checkout root: lightcheckout
445
423
   checkout of branch: standalone
446
424
 
447
425
Format:
448
426
       control: Meta directory format 1
449
 
  working tree: Working tree format 6
 
427
  working tree: Working tree format 4
450
428
        branch: Branch format 4
451
429
    repository: Weave repository format 6
452
430
 
464
442
 
465
443
Branch history:
466
444
         2 revisions
 
445
         1 committer
467
446
         0 days old
468
447
   first revision: %s
469
448
  latest revision: %s
470
449
 
471
450
Repository:
472
451
         2 revisions
473
 
""" % (self._repo_strings, datestring_first, datestring_last,), out)
 
452
""" % (datestring_first, datestring_last,), out)
474
453
        self.assertEqual('', err)
475
454
 
476
455
    def test_info_standalone_no_tree(self):
491
470
 
492
471
Branch history:
493
472
         0 revisions
 
473
         0 committers
494
474
 
495
475
Repository:
496
476
         0 revisions
541
521
 
542
522
Branch history:
543
523
         0 revisions
 
524
         0 committers
544
525
 
545
526
Repository:
546
527
         0 revisions
552
533
        # Create lightweight checkout
553
534
        transport.mkdir('tree')
554
535
        transport.mkdir('tree/lightcheckout')
555
 
        tree2 = branch1.create_checkout('tree/lightcheckout',
 
536
        tree2 = branch1.create_checkout('tree/lightcheckout', 
556
537
            lightweight=True)
557
538
        branch2 = tree2.branch
558
539
        self.assertCheckoutStatusOutput('-v tree/lightcheckout', tree2,
568
549
        tree2.add('a')
569
550
        tree2.commit('commit one')
570
551
        rev = repo.get_revision(branch2.revision_history()[0])
571
 
        datestring_first = osutils.format_date(rev.timestamp, rev.timezone)
 
552
        datestring_first = format_date(rev.timestamp, rev.timezone)
572
553
        out, err = self.run_bzr('info tree/lightcheckout --verbose')
573
554
        self.assertEqualDiff(
574
 
"""Lightweight checkout (format: %s)
 
555
"""Lightweight checkout (format: 1.6 or 1.6.1-rich-root or \
 
556
dirstate or dirstate-tags or \
 
557
pack-0.92 or rich-root or rich-root-pack)
575
558
Location:
576
559
  light checkout root: tree/lightcheckout
577
560
   checkout of branch: repo/branch
579
562
 
580
563
Format:
581
564
       control: Meta directory format 1
582
 
  working tree: Working tree format 6
 
565
  working tree: Working tree format 4
583
566
        branch: %s
584
567
    repository: %s
585
568
 
595
578
 
596
579
Branch history:
597
580
         1 revision
 
581
         1 committer
598
582
         0 days old
599
583
   first revision: %s
600
584
  latest revision: %s
601
585
 
602
586
Repository:
603
587
         1 revision
604
 
""" % (self._repo_strings, format.get_branch_format().get_format_description(),
 
588
""" % (format.get_branch_format().get_format_description(),
605
589
       format.repository_format.get_format_description(),
606
590
       datestring_first, datestring_first,
607
591
       ), out)
610
594
        # Out of date checkout
611
595
        out, err = self.run_bzr('info -v tree/checkout')
612
596
        self.assertEqualDiff(
613
 
"""Checkout (format: unnamed)
 
597
"""Checkout (format: dirstate)
614
598
Location:
615
599
       checkout root: tree/checkout
616
600
  checkout of branch: repo/branch
617
601
 
618
602
Format:
619
603
       control: Meta directory format 1
620
 
  working tree: Working tree format 6
 
604
  working tree: Working tree format 4
621
605
        branch: %s
622
606
    repository: %s
623
607
 
635
619
 
636
620
Branch history:
637
621
         0 revisions
 
622
         0 committers
638
623
 
639
624
Repository:
640
625
         0 revisions
649
634
        tree3.add('b')
650
635
        out, err = self.run_bzr('info tree/checkout --verbose')
651
636
        self.assertEqualDiff(
652
 
"""Checkout (format: unnamed)
 
637
"""Checkout (format: dirstate)
653
638
Location:
654
639
       checkout root: tree/checkout
655
640
  checkout of branch: repo/branch
656
641
 
657
642
Format:
658
643
       control: Meta directory format 1
659
 
  working tree: Working tree format 6
 
644
  working tree: Working tree format 4
660
645
        branch: %s
661
646
    repository: %s
662
647
 
672
657
 
673
658
Branch history:
674
659
         1 revision
 
660
         1 committer
675
661
         0 days old
676
662
   first revision: %s
677
663
  latest revision: %s
687
673
 
688
674
        # Out of date lightweight checkout
689
675
        rev = repo.get_revision(branch1.revision_history()[-1])
690
 
        datestring_last = osutils.format_date(rev.timestamp, rev.timezone)
 
676
        datestring_last = format_date(rev.timestamp, rev.timezone)
691
677
        out, err = self.run_bzr('info tree/lightcheckout --verbose')
692
678
        self.assertEqualDiff(
693
 
"""Lightweight checkout (format: %s)
 
679
"""Lightweight checkout (format: 1.6 or 1.6.1-rich-root or \
 
680
dirstate or dirstate-tags or \
 
681
pack-0.92 or rich-root or rich-root-pack)
694
682
Location:
695
683
  light checkout root: tree/lightcheckout
696
684
   checkout of branch: repo/branch
698
686
 
699
687
Format:
700
688
       control: Meta directory format 1
701
 
  working tree: Working tree format 6
 
689
  working tree: Working tree format 4
702
690
        branch: %s
703
691
    repository: %s
704
692
 
716
704
 
717
705
Branch history:
718
706
         2 revisions
 
707
         1 committer
719
708
         0 days old
720
709
   first revision: %s
721
710
  latest revision: %s
722
711
 
723
712
Repository:
724
713
         2 revisions
725
 
""" % (self._repo_strings, format.get_branch_format().get_format_description(),
 
714
""" % (format.get_branch_format().get_format_description(),
726
715
       format.repository_format.get_format_description(),
727
716
       datestring_first, datestring_last,
728
717
       ), out)
743
732
 
744
733
Branch history:
745
734
         2 revisions
 
735
         1 committer
746
736
         0 days old
747
737
   first revision: %s
748
738
  latest revision: %s
829
819
 
830
820
Branch history:
831
821
         0 revisions
 
822
         0 committers
832
823
 
833
824
Repository:
834
825
         0 revisions
843
834
        tree1.add('a')
844
835
        tree1.commit('commit one')
845
836
        rev = repo.get_revision(branch1.revision_history()[0])
846
 
        datestring_first = osutils.format_date(rev.timestamp, rev.timezone)
 
837
        datestring_first = format_date(rev.timestamp, rev.timezone)
847
838
        out, err = self.run_bzr('info -v repo/branch1')
848
839
        self.assertEqualDiff(
849
840
"""Repository tree (format: knit)
869
860
 
870
861
Branch history:
871
862
         1 revision
 
863
         1 committer
872
864
         0 days old
873
865
   first revision: %s
874
866
  latest revision: %s
910
902
 
911
903
Branch history:
912
904
         0 revisions
 
905
         0 committers
913
906
 
914
907
Repository:
915
908
         1 revision
949
942
 
950
943
Branch history:
951
944
         1 revision
 
945
         1 committer
952
946
         0 days old
953
947
   first revision: %s
954
948
  latest revision: %s
980
974
       ),
981
975
       out)
982
976
        self.assertEqual('', err)
983
 
 
 
977
    
984
978
    def test_info_shared_repository_with_tree_in_root(self):
985
979
        format = bzrdir.format_registry.make_bzrdir('knit')
986
980
        transport = self.get_transport()
1035
1029
 
1036
1030
Branch history:
1037
1031
         0 revisions
 
1032
         0 committers
1038
1033
 
1039
1034
Repository:
1040
1035
         0 revisions
1043
1038
       ), out)
1044
1039
        self.assertEqual('', err)
1045
1040
 
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)
1056
 
Location:
1057
 
  shared repository: repo
1058
 
 
1059
 
Format:
1060
 
       control: Meta directory format 1
1061
 
    repository: %s
1062
 
 
1063
 
Create working tree for new branches inside the repository.
1064
 
 
1065
 
Repository:
1066
 
         0 revisions
1067
 
more info
1068
 
""" % (format.repository_format.get_format_description(),
1069
 
       ), out)
1070
 
        self.assertEqual('', err)
1071
 
 
1072
1041
    def assertCheckoutStatusOutput(self,
1073
1042
        command_string, lco_tree, shared_repo=None,
1074
1043
        repo_branch=None,
1084
1053
        allow us, the test writers, to document what *should* be present in
1085
1054
        the output. Removing this separation would remove the value of the
1086
1055
        tests.
1087
 
 
 
1056
        
1088
1057
        :param path: the path to the light checkout.
1089
1058
        :param lco_tree: the tree object for the light checkout.
1090
1059
        :param shared_repo: A shared repository is in use, expect that in
1098
1067
            actually locked then this parameter is overridden. This is because
1099
1068
            pack repositories do not have any public API for obtaining an
1100
1069
            exclusive repository wide lock.
1101
 
        :param verbose: verbosity level: 2 or higher to show committers
 
1070
        :param verbose: If true, expect verbose output
1102
1071
        """
1103
1072
        def friendly_location(url):
1104
1073
            path = urlutils.unescape_for_display(url, 'ascii')
1123
1092
            (False, True): 'Lightweight checkout',
1124
1093
            (False, False): 'Checkout',
1125
1094
            }[(shared_repo is not None, light_checkout)]
1126
 
        format = {True: self._repo_strings,
1127
 
                  False: 'unnamed'}[light_checkout]
 
1095
        format = {True: '1.6 or 1.6.1-rich-root'
 
1096
                        ' or dirstate or dirstate-tags or pack-0.92'
 
1097
                        ' or rich-root or rich-root-pack',
 
1098
                  False: 'dirstate'}[light_checkout]
1128
1099
        if repo_locked:
1129
1100
            repo_locked = lco_tree.branch.repository.get_physical_lock_status()
1130
1101
        if repo_locked or branch_locked or tree_locked:
1167
1138
        else:
1168
1139
            branch_data = ("   checkout of branch: %s\n" %
1169
1140
                lco_tree.branch.bzrdir.root_transport.base)
1170
 
 
1171
 
        if verbose >= 2:
 
1141
        
 
1142
        if verbose:
1172
1143
            verbose_info = '         0 committers\n'
1173
1144
        else:
1174
1145
            verbose_info = ''
1175
 
 
 
1146
            
1176
1147
        self.assertEqualDiff(
1177
1148
"""%s (format: %s)
1178
1149
Location:
1228
1199
        # Do a light checkout of the heavy one
1229
1200
        transport.mkdir('tree/lightcheckout')
1230
1201
        lco_dir = bzrdir.BzrDirMetaFormat1().initialize('tree/lightcheckout')
1231
 
        branch.BranchReferenceFormat().initialize(lco_dir,
1232
 
            target_branch=co_branch)
 
1202
        branch.BranchReferenceFormat().initialize(lco_dir, co_branch)
1233
1203
        lco_dir.create_workingtree()
1234
1204
        lco_tree = lco_dir.open_workingtree()
1235
1205
 
1326
1296
    def test_info_locking_oslocks(self):
1327
1297
        if sys.platform == "win32":
1328
1298
            raise TestSkipped("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
1332
 
        # call here.
1333
 
        self.thisFailsStrictLockCheck()
1334
1299
 
1335
1300
        tree = self.make_branch_and_tree('branch',
1336
1301
                                         format=bzrdir.BzrDirFormat6())
1366
1331
 
1367
1332
Branch history:
1368
1333
         0 revisions
 
1334
         0 committers
1369
1335
 
1370
1336
Repository:
1371
1337
         0 revisions
1398
1364
 
1399
1365
Branch history:
1400
1366
         0 revisions
 
1367
         0 committers
1401
1368
 
1402
1369
Repository:
1403
1370
         0 revisions
1409
1376
    def test_info_stacked(self):
1410
1377
        # We have a mainline
1411
1378
        trunk_tree = self.make_branch_and_tree('mainline',
1412
 
            format='1.6')
 
1379
            format='development1')
1413
1380
        trunk_tree.commit('mainline')
1414
1381
        # and a branch from it which is stacked
1415
1382
        new_dir = trunk_tree.bzrdir.sprout('newbranch', stacked=True)
1416
1383
        out, err = self.run_bzr('info newbranch')
1417
1384
        self.assertEqual(
1418
 
"""Standalone tree (format: 1.6)
 
1385
"""Standalone tree (format: development1)
1419
1386
Location:
1420
1387
  branch root: newbranch
1421
1388