~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

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

  • Committer: Jelmer Vernooij
  • Date: 2011-11-30 20:02:16 UTC
  • mto: This revision was merged to the branch mainline in revision 6333.
  • Revision ID: jelmer@samba.org-20111130200216-aoju21pdl20d1gkd
Consistently pass tree path when exporting.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# Copyright (C) 2006-2010 Canonical Ltd
 
2
#
 
3
# This program is free software; you can redistribute it and/or modify
 
4
# it under the terms of the GNU General Public License as published by
 
5
# the Free Software Foundation; either version 2 of the License, or
 
6
# (at your option) any later version.
 
7
#
 
8
# This program is distributed in the hope that it will be useful,
 
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
 
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
11
# GNU General Public License for more details.
 
12
#
 
13
# You should have received a copy of the GNU General Public License
 
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
 
16
 
 
17
 
 
18
"""Tests for the info command of bzr."""
 
19
 
 
20
import shutil
 
21
import sys
 
22
 
 
23
from bzrlib import (
 
24
    branch,
 
25
    bzrdir,
 
26
    controldir,
 
27
    errors,
 
28
    info,
 
29
    osutils,
 
30
    tests,
 
31
    upgrade,
 
32
    urlutils,
 
33
    )
 
34
from bzrlib.transport import memory
 
35
 
 
36
 
 
37
class TestInfo(tests.TestCaseWithTransport):
 
38
 
 
39
    def setUp(self):
 
40
        super(TestInfo, self).setUp()
 
41
        self._repo_strings = "2a"
 
42
 
 
43
    def test_info_non_existing(self):
 
44
        self.vfs_transport_factory = memory.MemoryServer
 
45
        location = self.get_url()
 
46
        out, err = self.run_bzr('info '+location, retcode=3)
 
47
        self.assertEqual(out, '')
 
48
        self.assertEqual(err, 'bzr: ERROR: Not a branch: "%s".\n' % location)
 
49
 
 
50
    def test_info_empty_controldir(self):
 
51
        self.make_bzrdir('ctrl')
 
52
        out, err = self.run_bzr('info ctrl')
 
53
        self.assertEquals(out,
 
54
            'Empty control directory (format: 2a or pack-0.92)\n'
 
55
            'Location:\n'
 
56
            '  control directory: ctrl\n')
 
57
        self.assertEquals(err, '')
 
58
 
 
59
    def test_info_dangling_branch_reference(self):
 
60
        br = self.make_branch('target')
 
61
        br.create_checkout('from', lightweight=True)
 
62
        shutil.rmtree('target')
 
63
        out, err = self.run_bzr('info from')
 
64
        self.assertEquals(out,
 
65
            'Dangling branch reference (format: 2a or pack-0.92)\n'
 
66
            'Location:\n'
 
67
            '   control directory: from\n'
 
68
            '  checkout of branch: target\n')
 
69
        self.assertEquals(err, '')
 
70
 
 
71
    def test_info_standalone(self):
 
72
        transport = self.get_transport()
 
73
 
 
74
        # Create initial standalone branch
 
75
        tree1 = self.make_branch_and_tree('standalone', 'knit')
 
76
        self.build_tree(['standalone/a'])
 
77
        tree1.add('a')
 
78
        branch1 = tree1.branch
 
79
 
 
80
        out, err = self.run_bzr('info standalone')
 
81
        self.assertEqualDiff(
 
82
"""Standalone tree (format: knit)
 
83
Location:
 
84
  branch root: standalone
 
85
""", out)
 
86
        self.assertEqual('', err)
 
87
 
 
88
        # Standalone branch - verbose mode
 
89
        out, err = self.run_bzr('info standalone -v')
 
90
        self.assertEqualDiff(
 
91
"""Standalone tree (format: knit)
 
92
Location:
 
93
  branch root: standalone
 
94
 
 
95
Format:
 
96
       control: Meta directory format 1
 
97
  working tree: Working tree format 3
 
98
        branch: Branch format 5
 
99
    repository: Knit repository format 1
 
100
 
 
101
In the working tree:
 
102
         0 unchanged
 
103
         0 modified
 
104
         1 added
 
105
         0 removed
 
106
         0 renamed
 
107
         0 unknown
 
108
         0 ignored
 
109
         0 versioned subdirectories
 
110
 
 
111
Branch history:
 
112
         0 revisions
 
113
 
 
114
Repository:
 
115
         0 revisions
 
116
""", out)
 
117
        self.assertEqual('', err)
 
118
 
 
119
        # Standalone branch - really verbose mode
 
120
        out, err = self.run_bzr('info standalone -vv')
 
121
        self.assertEqualDiff(
 
122
"""Standalone tree (format: knit)
 
123
Location:
 
124
  branch root: standalone
 
125
 
 
126
Format:
 
127
       control: Meta directory format 1
 
128
  working tree: Working tree format 3
 
129
        branch: Branch format 5
 
130
    repository: Knit repository format 1
 
131
 
 
132
In the working tree:
 
133
         0 unchanged
 
134
         0 modified
 
135
         1 added
 
136
         0 removed
 
137
         0 renamed
 
138
         0 unknown
 
139
         0 ignored
 
140
         0 versioned subdirectories
 
141
 
 
142
Branch history:
 
143
         0 revisions
 
144
         0 committers
 
145
 
 
146
Repository:
 
147
         0 revisions
 
148
""", out)
 
149
        self.assertEqual('', err)
 
150
        tree1.commit('commit one')
 
151
        rev = branch1.repository.get_revision(branch1.last_revision())
 
152
        datestring_first = osutils.format_date(rev.timestamp, rev.timezone)
 
153
 
 
154
        # Branch standalone with push location
 
155
        branch2 = branch1.bzrdir.sprout('branch').open_branch()
 
156
        branch2.set_push_location(branch1.bzrdir.root_transport.base)
 
157
 
 
158
        out, err = self.run_bzr('info branch')
 
159
        self.assertEqualDiff(
 
160
"""Standalone tree (format: knit)
 
161
Location:
 
162
  branch root: branch
 
163
 
 
164
Related branches:
 
165
    push branch: standalone
 
166
  parent branch: standalone
 
167
""", out)
 
168
        self.assertEqual('', err)
 
169
 
 
170
        out, err = self.run_bzr('info branch --verbose')
 
171
        self.assertEqualDiff(
 
172
"""Standalone tree (format: knit)
 
173
Location:
 
174
  branch root: branch
 
175
 
 
176
Related branches:
 
177
    push branch: standalone
 
178
  parent branch: standalone
 
179
 
 
180
Format:
 
181
       control: Meta directory format 1
 
182
  working tree: Working tree format 3
 
183
        branch: Branch format 5
 
184
    repository: Knit repository format 1
 
185
 
 
186
In the working tree:
 
187
         1 unchanged
 
188
         0 modified
 
189
         0 added
 
190
         0 removed
 
191
         0 renamed
 
192
         0 unknown
 
193
         0 ignored
 
194
         0 versioned subdirectories
 
195
 
 
196
Branch history:
 
197
         1 revision
 
198
         0 days old
 
199
   first revision: %s
 
200
  latest revision: %s
 
201
 
 
202
Repository:
 
203
         1 revision
 
204
""" % (datestring_first, datestring_first,
 
205
       ), out)
 
206
        self.assertEqual('', err)
 
207
 
 
208
        # Branch and bind to standalone, needs upgrade to metadir
 
209
        # (creates backup as unknown)
 
210
        branch1.bzrdir.sprout('bound')
 
211
        knit1_format = bzrdir.format_registry.make_bzrdir('knit')
 
212
        upgrade.upgrade('bound', knit1_format)
 
213
        branch3 = controldir.ControlDir.open('bound').open_branch()
 
214
        branch3.bind(branch1)
 
215
        bound_tree = branch3.bzrdir.open_workingtree()
 
216
        out, err = self.run_bzr('info -v bound')
 
217
        self.assertEqualDiff(
 
218
"""Checkout (format: knit)
 
219
Location:
 
220
       checkout root: bound
 
221
  checkout of branch: standalone
 
222
 
 
223
Related branches:
 
224
  parent branch: standalone
 
225
 
 
226
Format:
 
227
       control: Meta directory format 1
 
228
  working tree: %s
 
229
        branch: %s
 
230
    repository: %s
 
231
 
 
232
In the working tree:
 
233
         1 unchanged
 
234
         0 modified
 
235
         0 added
 
236
         0 removed
 
237
         0 renamed
 
238
         0 unknown
 
239
         0 ignored
 
240
         0 versioned subdirectories
 
241
 
 
242
Branch history:
 
243
         1 revision
 
244
         0 days old
 
245
   first revision: %s
 
246
  latest revision: %s
 
247
 
 
248
Repository:
 
249
         1 revision
 
250
""" % (bound_tree._format.get_format_description(),
 
251
       branch3._format.get_format_description(),
 
252
       branch3.repository._format.get_format_description(),
 
253
       datestring_first, datestring_first,
 
254
       ), out)
 
255
        self.assertEqual('', err)
 
256
 
 
257
        # Checkout standalone (same as above, but does not have parent set)
 
258
        branch4 = controldir.ControlDir.create_branch_convenience('checkout',
 
259
            format=knit1_format)
 
260
        branch4.bind(branch1)
 
261
        branch4.bzrdir.open_workingtree().update()
 
262
        out, err = self.run_bzr('info checkout --verbose')
 
263
        self.assertEqualDiff(
 
264
"""Checkout (format: knit)
 
265
Location:
 
266
       checkout root: checkout
 
267
  checkout of branch: standalone
 
268
 
 
269
Format:
 
270
       control: Meta directory format 1
 
271
  working tree: Working tree format 3
 
272
        branch: Branch format 5
 
273
    repository: %s
 
274
 
 
275
In the working tree:
 
276
         1 unchanged
 
277
         0 modified
 
278
         0 added
 
279
         0 removed
 
280
         0 renamed
 
281
         0 unknown
 
282
         0 ignored
 
283
         0 versioned subdirectories
 
284
 
 
285
Branch history:
 
286
         1 revision
 
287
         0 days old
 
288
   first revision: %s
 
289
  latest revision: %s
 
290
 
 
291
Repository:
 
292
         1 revision
 
293
""" % (branch4.repository._format.get_format_description(),
 
294
       datestring_first, datestring_first,
 
295
       ), out)
 
296
        self.assertEqual('', err)
 
297
 
 
298
        # Lightweight checkout (same as above, different branch and repository)
 
299
        tree5 = branch1.create_checkout('lightcheckout', lightweight=True)
 
300
        branch5 = tree5.branch
 
301
        out, err = self.run_bzr('info -v lightcheckout')
 
302
        if "metaweave" in bzrdir.format_registry:
 
303
            format_description = "knit or metaweave"
 
304
        else:
 
305
            format_description = "knit"
 
306
        self.assertEqualDiff(
 
307
"""Lightweight checkout (format: %s)
 
308
Location:
 
309
  light checkout root: lightcheckout
 
310
   checkout of branch: standalone
 
311
 
 
312
Format:
 
313
       control: Meta directory format 1
 
314
  working tree: Working tree format 3
 
315
        branch: Branch format 5
 
316
    repository: Knit repository format 1
 
317
 
 
318
In the working tree:
 
319
         1 unchanged
 
320
         0 modified
 
321
         0 added
 
322
         0 removed
 
323
         0 renamed
 
324
         0 unknown
 
325
         0 ignored
 
326
         0 versioned subdirectories
 
327
 
 
328
Branch history:
 
329
         1 revision
 
330
         0 days old
 
331
   first revision: %s
 
332
  latest revision: %s
 
333
 
 
334
Repository:
 
335
         1 revision
 
336
""" % (format_description, datestring_first, datestring_first,), out)
 
337
        self.assertEqual('', err)
 
338
 
 
339
        # Update initial standalone branch
 
340
        self.build_tree(['standalone/b'])
 
341
        tree1.add('b')
 
342
        tree1.commit('commit two')
 
343
        rev = branch1.repository.get_revision(branch1.last_revision())
 
344
        datestring_last = osutils.format_date(rev.timestamp, rev.timezone)
 
345
 
 
346
        # Out of date branched standalone branch will not be detected
 
347
        out, err = self.run_bzr('info -v branch')
 
348
        self.assertEqualDiff(
 
349
"""Standalone tree (format: knit)
 
350
Location:
 
351
  branch root: branch
 
352
 
 
353
Related branches:
 
354
    push branch: standalone
 
355
  parent branch: standalone
 
356
 
 
357
Format:
 
358
       control: Meta directory format 1
 
359
  working tree: Working tree format 3
 
360
        branch: Branch format 5
 
361
    repository: Knit repository format 1
 
362
 
 
363
In the working tree:
 
364
         1 unchanged
 
365
         0 modified
 
366
         0 added
 
367
         0 removed
 
368
         0 renamed
 
369
         0 unknown
 
370
         0 ignored
 
371
         0 versioned subdirectories
 
372
 
 
373
Branch history:
 
374
         1 revision
 
375
         0 days old
 
376
   first revision: %s
 
377
  latest revision: %s
 
378
 
 
379
Repository:
 
380
         1 revision
 
381
""" % (datestring_first, datestring_first,
 
382
       ), out)
 
383
        self.assertEqual('', err)
 
384
 
 
385
        # Out of date bound branch
 
386
        out, err = self.run_bzr('info -v bound')
 
387
        self.assertEqualDiff(
 
388
"""Checkout (format: knit)
 
389
Location:
 
390
       checkout root: bound
 
391
  checkout of branch: standalone
 
392
 
 
393
Related branches:
 
394
  parent branch: standalone
 
395
 
 
396
Format:
 
397
       control: Meta directory format 1
 
398
  working tree: Working tree format 3
 
399
        branch: Branch format 5
 
400
    repository: %s
 
401
 
 
402
Branch is out of date: missing 1 revision.
 
403
 
 
404
In the working tree:
 
405
         1 unchanged
 
406
         0 modified
 
407
         0 added
 
408
         0 removed
 
409
         0 renamed
 
410
         0 unknown
 
411
         0 ignored
 
412
         0 versioned subdirectories
 
413
 
 
414
Branch history:
 
415
         1 revision
 
416
         0 days old
 
417
   first revision: %s
 
418
  latest revision: %s
 
419
 
 
420
Repository:
 
421
         1 revision
 
422
""" % (branch3.repository._format.get_format_description(),
 
423
       datestring_first, datestring_first,
 
424
       ), out)
 
425
        self.assertEqual('', err)
 
426
 
 
427
        # Out of date checkout
 
428
        out, err = self.run_bzr('info -v checkout')
 
429
        self.assertEqualDiff(
 
430
"""Checkout (format: knit)
 
431
Location:
 
432
       checkout root: checkout
 
433
  checkout of branch: standalone
 
434
 
 
435
Format:
 
436
       control: Meta directory format 1
 
437
  working tree: Working tree format 3
 
438
        branch: Branch format 5
 
439
    repository: %s
 
440
 
 
441
Branch is out of date: missing 1 revision.
 
442
 
 
443
In the working tree:
 
444
         1 unchanged
 
445
         0 modified
 
446
         0 added
 
447
         0 removed
 
448
         0 renamed
 
449
         0 unknown
 
450
         0 ignored
 
451
         0 versioned subdirectories
 
452
 
 
453
Branch history:
 
454
         1 revision
 
455
         0 days old
 
456
   first revision: %s
 
457
  latest revision: %s
 
458
 
 
459
Repository:
 
460
         1 revision
 
461
""" % (branch4.repository._format.get_format_description(),
 
462
       datestring_first, datestring_first,
 
463
       ), out)
 
464
        self.assertEqual('', err)
 
465
 
 
466
        # Out of date lightweight checkout
 
467
        out, err = self.run_bzr('info lightcheckout --verbose')
 
468
        self.assertEqualDiff(
 
469
"""Lightweight checkout (format: %s)
 
470
Location:
 
471
  light checkout root: lightcheckout
 
472
   checkout of branch: standalone
 
473
 
 
474
Format:
 
475
       control: Meta directory format 1
 
476
  working tree: Working tree format 3
 
477
        branch: Branch format 5
 
478
    repository: Knit repository format 1
 
479
 
 
480
Working tree is out of date: missing 1 revision.
 
481
 
 
482
In the working tree:
 
483
         1 unchanged
 
484
         0 modified
 
485
         0 added
 
486
         0 removed
 
487
         0 renamed
 
488
         0 unknown
 
489
         0 ignored
 
490
         0 versioned subdirectories
 
491
 
 
492
Branch history:
 
493
         2 revisions
 
494
         0 days old
 
495
   first revision: %s
 
496
  latest revision: %s
 
497
 
 
498
Repository:
 
499
         2 revisions
 
500
""" % (format_description, datestring_first, datestring_last,), out)
 
501
        self.assertEqual('', err)
 
502
 
 
503
    def test_info_standalone_no_tree(self):
 
504
        # create standalone branch without a working tree
 
505
        format = bzrdir.format_registry.make_bzrdir('default')
 
506
        branch = self.make_branch('branch')
 
507
        repo = branch.repository
 
508
        out, err = self.run_bzr('info branch -v')
 
509
        self.assertEqualDiff(
 
510
"""Standalone branch (format: %s)
 
511
Location:
 
512
  branch root: branch
 
513
 
 
514
Format:
 
515
       control: Meta directory format 1
 
516
        branch: %s
 
517
    repository: %s
 
518
 
 
519
Branch history:
 
520
         0 revisions
 
521
 
 
522
Repository:
 
523
         0 revisions
 
524
""" % (info.describe_format(repo.bzrdir, repo, branch, None),
 
525
       format.get_branch_format().get_format_description(),
 
526
       format.repository_format.get_format_description(),
 
527
       ), out)
 
528
        self.assertEqual('', err)
 
529
 
 
530
    def test_info_shared_repository(self):
 
531
        format = bzrdir.format_registry.make_bzrdir('knit')
 
532
        transport = self.get_transport()
 
533
 
 
534
        # Create shared repository
 
535
        repo = self.make_repository('repo', shared=True, format=format)
 
536
        repo.set_make_working_trees(False)
 
537
        out, err = self.run_bzr('info -v repo')
 
538
        self.assertEqualDiff(
 
539
"""Shared repository (format: dirstate or dirstate-tags or knit)
 
540
Location:
 
541
  shared repository: %s
 
542
 
 
543
Format:
 
544
       control: Meta directory format 1
 
545
    repository: %s
 
546
 
 
547
Repository:
 
548
         0 revisions
 
549
""" % ('repo', format.repository_format.get_format_description(),
 
550
       ), out)
 
551
        self.assertEqual('', err)
 
552
 
 
553
        # Create branch inside shared repository
 
554
        repo.bzrdir.root_transport.mkdir('branch')
 
555
        branch1 = controldir.ControlDir.create_branch_convenience(
 
556
            'repo/branch', format=format)
 
557
        out, err = self.run_bzr('info -v repo/branch')
 
558
        self.assertEqualDiff(
 
559
"""Repository branch (format: dirstate or knit)
 
560
Location:
 
561
  shared repository: repo
 
562
  repository branch: repo/branch
 
563
 
 
564
Format:
 
565
       control: Meta directory format 1
 
566
        branch: %s
 
567
    repository: %s
 
568
 
 
569
Branch history:
 
570
         0 revisions
 
571
 
 
572
Repository:
 
573
         0 revisions
 
574
""" % (format.get_branch_format().get_format_description(),
 
575
       format.repository_format.get_format_description(),
 
576
       ), out)
 
577
        self.assertEqual('', err)
 
578
 
 
579
        # Create lightweight checkout
 
580
        transport.mkdir('tree')
 
581
        transport.mkdir('tree/lightcheckout')
 
582
        tree2 = branch1.create_checkout('tree/lightcheckout',
 
583
            lightweight=True)
 
584
        branch2 = tree2.branch
 
585
        self.assertCheckoutStatusOutput('-v tree/lightcheckout', tree2,
 
586
                   shared_repo=repo, repo_branch=branch1, verbose=True)
 
587
 
 
588
        # Create normal checkout
 
589
        tree3 = branch1.create_checkout('tree/checkout')
 
590
        self.assertCheckoutStatusOutput('tree/checkout --verbose', tree3,
 
591
            verbose=True,
 
592
            light_checkout=False, repo_branch=branch1)
 
593
        # Update lightweight checkout
 
594
        self.build_tree(['tree/lightcheckout/a'])
 
595
        tree2.add('a')
 
596
        tree2.commit('commit one')
 
597
        rev = repo.get_revision(branch2.last_revision())
 
598
        datestring_first = osutils.format_date(rev.timestamp, rev.timezone)
 
599
        out, err = self.run_bzr('info tree/lightcheckout --verbose')
 
600
        self.assertEqualDiff(
 
601
"""Lightweight checkout (format: %s)
 
602
Location:
 
603
  light checkout root: tree/lightcheckout
 
604
   checkout of branch: repo/branch
 
605
    shared repository: repo
 
606
 
 
607
Format:
 
608
       control: Meta directory format 1
 
609
  working tree: Working tree format 6
 
610
        branch: %s
 
611
    repository: %s
 
612
 
 
613
In the working tree:
 
614
         1 unchanged
 
615
         0 modified
 
616
         0 added
 
617
         0 removed
 
618
         0 renamed
 
619
         0 unknown
 
620
         0 ignored
 
621
         0 versioned subdirectories
 
622
 
 
623
Branch history:
 
624
         1 revision
 
625
         0 days old
 
626
   first revision: %s
 
627
  latest revision: %s
 
628
 
 
629
Repository:
 
630
         1 revision
 
631
""" % (self._repo_strings, format.get_branch_format().get_format_description(),
 
632
       format.repository_format.get_format_description(),
 
633
       datestring_first, datestring_first,
 
634
       ), out)
 
635
        self.assertEqual('', err)
 
636
 
 
637
        # Out of date checkout
 
638
        out, err = self.run_bzr('info -v tree/checkout')
 
639
        self.assertEqualDiff(
 
640
"""Checkout (format: unnamed)
 
641
Location:
 
642
       checkout root: tree/checkout
 
643
  checkout of branch: repo/branch
 
644
 
 
645
Format:
 
646
       control: Meta directory format 1
 
647
  working tree: Working tree format 6
 
648
        branch: %s
 
649
    repository: %s
 
650
 
 
651
Branch is out of date: missing 1 revision.
 
652
 
 
653
In the working tree:
 
654
         0 unchanged
 
655
         0 modified
 
656
         0 added
 
657
         0 removed
 
658
         0 renamed
 
659
         0 unknown
 
660
         0 ignored
 
661
         0 versioned subdirectories
 
662
 
 
663
Branch history:
 
664
         0 revisions
 
665
 
 
666
Repository:
 
667
         0 revisions
 
668
""" % (format.get_branch_format().get_format_description(),
 
669
       format.repository_format.get_format_description(),
 
670
       ), out)
 
671
        self.assertEqual('', err)
 
672
 
 
673
        # Update checkout
 
674
        tree3.update()
 
675
        self.build_tree(['tree/checkout/b'])
 
676
        tree3.add('b')
 
677
        out, err = self.run_bzr('info tree/checkout --verbose')
 
678
        self.assertEqualDiff(
 
679
"""Checkout (format: unnamed)
 
680
Location:
 
681
       checkout root: tree/checkout
 
682
  checkout of branch: repo/branch
 
683
 
 
684
Format:
 
685
       control: Meta directory format 1
 
686
  working tree: Working tree format 6
 
687
        branch: %s
 
688
    repository: %s
 
689
 
 
690
In the working tree:
 
691
         1 unchanged
 
692
         0 modified
 
693
         1 added
 
694
         0 removed
 
695
         0 renamed
 
696
         0 unknown
 
697
         0 ignored
 
698
         0 versioned subdirectories
 
699
 
 
700
Branch history:
 
701
         1 revision
 
702
         0 days old
 
703
   first revision: %s
 
704
  latest revision: %s
 
705
 
 
706
Repository:
 
707
         1 revision
 
708
""" % (format.get_branch_format().get_format_description(),
 
709
       format.repository_format.get_format_description(),
 
710
       datestring_first, datestring_first,
 
711
       ), out)
 
712
        self.assertEqual('', err)
 
713
        tree3.commit('commit two')
 
714
 
 
715
        # Out of date lightweight checkout
 
716
        rev = repo.get_revision(branch1.last_revision())
 
717
        datestring_last = osutils.format_date(rev.timestamp, rev.timezone)
 
718
        out, err = self.run_bzr('info tree/lightcheckout --verbose')
 
719
        self.assertEqualDiff(
 
720
"""Lightweight checkout (format: %s)
 
721
Location:
 
722
  light checkout root: tree/lightcheckout
 
723
   checkout of branch: repo/branch
 
724
    shared repository: repo
 
725
 
 
726
Format:
 
727
       control: Meta directory format 1
 
728
  working tree: Working tree format 6
 
729
        branch: %s
 
730
    repository: %s
 
731
 
 
732
Working tree is out of date: missing 1 revision.
 
733
 
 
734
In the working tree:
 
735
         1 unchanged
 
736
         0 modified
 
737
         0 added
 
738
         0 removed
 
739
         0 renamed
 
740
         0 unknown
 
741
         0 ignored
 
742
         0 versioned subdirectories
 
743
 
 
744
Branch history:
 
745
         2 revisions
 
746
         0 days old
 
747
   first revision: %s
 
748
  latest revision: %s
 
749
 
 
750
Repository:
 
751
         2 revisions
 
752
""" % (self._repo_strings, format.get_branch_format().get_format_description(),
 
753
       format.repository_format.get_format_description(),
 
754
       datestring_first, datestring_last,
 
755
       ), out)
 
756
        self.assertEqual('', err)
 
757
 
 
758
        # Show info about shared branch
 
759
        out, err = self.run_bzr('info repo/branch --verbose')
 
760
        self.assertEqualDiff(
 
761
"""Repository branch (format: dirstate or knit)
 
762
Location:
 
763
  shared repository: repo
 
764
  repository branch: repo/branch
 
765
 
 
766
Format:
 
767
       control: Meta directory format 1
 
768
        branch: %s
 
769
    repository: %s
 
770
 
 
771
Branch history:
 
772
         2 revisions
 
773
         0 days old
 
774
   first revision: %s
 
775
  latest revision: %s
 
776
 
 
777
Repository:
 
778
         2 revisions
 
779
""" % (format.get_branch_format().get_format_description(),
 
780
       format.repository_format.get_format_description(),
 
781
       datestring_first, datestring_last,
 
782
       ), out)
 
783
        self.assertEqual('', err)
 
784
 
 
785
        # Show info about repository with revisions
 
786
        out, err = self.run_bzr('info -v repo')
 
787
        self.assertEqualDiff(
 
788
"""Shared repository (format: dirstate or dirstate-tags or knit)
 
789
Location:
 
790
  shared repository: repo
 
791
 
 
792
Format:
 
793
       control: Meta directory format 1
 
794
    repository: %s
 
795
 
 
796
Repository:
 
797
         2 revisions
 
798
""" % (format.repository_format.get_format_description(),
 
799
       ), out)
 
800
        self.assertEqual('', err)
 
801
 
 
802
    def test_info_shared_repository_with_trees(self):
 
803
        format = bzrdir.format_registry.make_bzrdir('knit')
 
804
        transport = self.get_transport()
 
805
 
 
806
        # Create shared repository with working trees
 
807
        repo = self.make_repository('repo', shared=True, format=format)
 
808
        repo.set_make_working_trees(True)
 
809
        out, err = self.run_bzr('info -v repo')
 
810
        self.assertEqualDiff(
 
811
"""Shared repository with trees (format: dirstate or dirstate-tags or knit)
 
812
Location:
 
813
  shared repository: repo
 
814
 
 
815
Format:
 
816
       control: Meta directory format 1
 
817
    repository: %s
 
818
 
 
819
Create working tree for new branches inside the repository.
 
820
 
 
821
Repository:
 
822
         0 revisions
 
823
""" % (format.repository_format.get_format_description(),
 
824
       ), out)
 
825
        self.assertEqual('', err)
 
826
 
 
827
        # Create two branches
 
828
        repo.bzrdir.root_transport.mkdir('branch1')
 
829
        branch1 = controldir.ControlDir.create_branch_convenience('repo/branch1',
 
830
            format=format)
 
831
        branch2 = branch1.bzrdir.sprout('repo/branch2').open_branch()
 
832
 
 
833
        # Empty first branch
 
834
        out, err = self.run_bzr('info repo/branch1 --verbose')
 
835
        self.assertEqualDiff(
 
836
"""Repository tree (format: knit)
 
837
Location:
 
838
  shared repository: repo
 
839
  repository branch: repo/branch1
 
840
 
 
841
Format:
 
842
       control: Meta directory format 1
 
843
  working tree: Working tree format 3
 
844
        branch: %s
 
845
    repository: %s
 
846
 
 
847
In the working tree:
 
848
         0 unchanged
 
849
         0 modified
 
850
         0 added
 
851
         0 removed
 
852
         0 renamed
 
853
         0 unknown
 
854
         0 ignored
 
855
         0 versioned subdirectories
 
856
 
 
857
Branch history:
 
858
         0 revisions
 
859
 
 
860
Repository:
 
861
         0 revisions
 
862
""" % (format.get_branch_format().get_format_description(),
 
863
       format.repository_format.get_format_description(),
 
864
       ), out)
 
865
        self.assertEqual('', err)
 
866
 
 
867
        # Update first branch
 
868
        self.build_tree(['repo/branch1/a'])
 
869
        tree1 = branch1.bzrdir.open_workingtree()
 
870
        tree1.add('a')
 
871
        tree1.commit('commit one')
 
872
        rev = repo.get_revision(branch1.last_revision())
 
873
        datestring_first = osutils.format_date(rev.timestamp, rev.timezone)
 
874
        out, err = self.run_bzr('info -v repo/branch1')
 
875
        self.assertEqualDiff(
 
876
"""Repository tree (format: knit)
 
877
Location:
 
878
  shared repository: repo
 
879
  repository branch: repo/branch1
 
880
 
 
881
Format:
 
882
       control: Meta directory format 1
 
883
  working tree: Working tree format 3
 
884
        branch: %s
 
885
    repository: %s
 
886
 
 
887
In the working tree:
 
888
         1 unchanged
 
889
         0 modified
 
890
         0 added
 
891
         0 removed
 
892
         0 renamed
 
893
         0 unknown
 
894
         0 ignored
 
895
         0 versioned subdirectories
 
896
 
 
897
Branch history:
 
898
         1 revision
 
899
         0 days old
 
900
   first revision: %s
 
901
  latest revision: %s
 
902
 
 
903
Repository:
 
904
         1 revision
 
905
""" % (format.get_branch_format().get_format_description(),
 
906
       format.repository_format.get_format_description(),
 
907
       datestring_first, datestring_first,
 
908
       ), out)
 
909
        self.assertEqual('', err)
 
910
 
 
911
        # Out of date second branch
 
912
        out, err = self.run_bzr('info repo/branch2 --verbose')
 
913
        self.assertEqualDiff(
 
914
"""Repository tree (format: knit)
 
915
Location:
 
916
  shared repository: repo
 
917
  repository branch: repo/branch2
 
918
 
 
919
Related branches:
 
920
  parent branch: repo/branch1
 
921
 
 
922
Format:
 
923
       control: Meta directory format 1
 
924
  working tree: Working tree format 3
 
925
        branch: %s
 
926
    repository: %s
 
927
 
 
928
In the working tree:
 
929
         0 unchanged
 
930
         0 modified
 
931
         0 added
 
932
         0 removed
 
933
         0 renamed
 
934
         0 unknown
 
935
         0 ignored
 
936
         0 versioned subdirectories
 
937
 
 
938
Branch history:
 
939
         0 revisions
 
940
 
 
941
Repository:
 
942
         1 revision
 
943
""" % (format.get_branch_format().get_format_description(),
 
944
       format.repository_format.get_format_description(),
 
945
       ), out)
 
946
        self.assertEqual('', err)
 
947
 
 
948
        # Update second branch
 
949
        tree2 = branch2.bzrdir.open_workingtree()
 
950
        tree2.pull(branch1)
 
951
        out, err = self.run_bzr('info -v repo/branch2')
 
952
        self.assertEqualDiff(
 
953
"""Repository tree (format: knit)
 
954
Location:
 
955
  shared repository: repo
 
956
  repository branch: repo/branch2
 
957
 
 
958
Related branches:
 
959
  parent branch: repo/branch1
 
960
 
 
961
Format:
 
962
       control: Meta directory format 1
 
963
  working tree: Working tree format 3
 
964
        branch: %s
 
965
    repository: %s
 
966
 
 
967
In the working tree:
 
968
         1 unchanged
 
969
         0 modified
 
970
         0 added
 
971
         0 removed
 
972
         0 renamed
 
973
         0 unknown
 
974
         0 ignored
 
975
         0 versioned subdirectories
 
976
 
 
977
Branch history:
 
978
         1 revision
 
979
         0 days old
 
980
   first revision: %s
 
981
  latest revision: %s
 
982
 
 
983
Repository:
 
984
         1 revision
 
985
""" % (format.get_branch_format().get_format_description(),
 
986
       format.repository_format.get_format_description(),
 
987
       datestring_first, datestring_first,
 
988
       ), out)
 
989
        self.assertEqual('', err)
 
990
 
 
991
        # Show info about repository with revisions
 
992
        out, err = self.run_bzr('info -v repo')
 
993
        self.assertEqualDiff(
 
994
"""Shared repository with trees (format: dirstate or dirstate-tags or knit)
 
995
Location:
 
996
  shared repository: repo
 
997
 
 
998
Format:
 
999
       control: Meta directory format 1
 
1000
    repository: %s
 
1001
 
 
1002
Create working tree for new branches inside the repository.
 
1003
 
 
1004
Repository:
 
1005
         1 revision
 
1006
""" % (format.repository_format.get_format_description(),
 
1007
       ),
 
1008
       out)
 
1009
        self.assertEqual('', err)
 
1010
 
 
1011
    def test_info_shared_repository_with_tree_in_root(self):
 
1012
        format = bzrdir.format_registry.make_bzrdir('knit')
 
1013
        transport = self.get_transport()
 
1014
 
 
1015
        # Create shared repository with working trees
 
1016
        repo = self.make_repository('repo', shared=True, format=format)
 
1017
        repo.set_make_working_trees(True)
 
1018
        out, err = self.run_bzr('info -v repo')
 
1019
        self.assertEqualDiff(
 
1020
"""Shared repository with trees (format: dirstate or dirstate-tags or knit)
 
1021
Location:
 
1022
  shared repository: repo
 
1023
 
 
1024
Format:
 
1025
       control: Meta directory format 1
 
1026
    repository: %s
 
1027
 
 
1028
Create working tree for new branches inside the repository.
 
1029
 
 
1030
Repository:
 
1031
         0 revisions
 
1032
""" % (format.repository_format.get_format_description(),
 
1033
       ), out)
 
1034
        self.assertEqual('', err)
 
1035
 
 
1036
        # Create branch in root of repository
 
1037
        control = repo.bzrdir
 
1038
        branch = control.create_branch()
 
1039
        control.create_workingtree()
 
1040
        out, err = self.run_bzr('info -v repo')
 
1041
        self.assertEqualDiff(
 
1042
"""Repository tree (format: knit)
 
1043
Location:
 
1044
  shared repository: repo
 
1045
  repository branch: repo
 
1046
 
 
1047
Format:
 
1048
       control: Meta directory format 1
 
1049
  working tree: Working tree format 3
 
1050
        branch: %s
 
1051
    repository: %s
 
1052
 
 
1053
In the working tree:
 
1054
         0 unchanged
 
1055
         0 modified
 
1056
         0 added
 
1057
         0 removed
 
1058
         0 renamed
 
1059
         0 unknown
 
1060
         0 ignored
 
1061
         0 versioned subdirectories
 
1062
 
 
1063
Branch history:
 
1064
         0 revisions
 
1065
 
 
1066
Repository:
 
1067
         0 revisions
 
1068
""" % (format.get_branch_format().get_format_description(),
 
1069
       format.repository_format.get_format_description(),
 
1070
       ), out)
 
1071
        self.assertEqual('', err)
 
1072
 
 
1073
    def test_info_repository_hook(self):
 
1074
        format = bzrdir.format_registry.make_bzrdir('knit')
 
1075
        def repo_info(repo, stats, outf):
 
1076
            outf.write("more info\n")
 
1077
        info.hooks.install_named_hook('repository', repo_info, None)
 
1078
        # Create shared repository with working trees
 
1079
        repo = self.make_repository('repo', shared=True, format=format)
 
1080
        out, err = self.run_bzr('info -v repo')
 
1081
        self.assertEqualDiff(
 
1082
"""Shared repository with trees (format: dirstate or dirstate-tags or knit)
 
1083
Location:
 
1084
  shared repository: repo
 
1085
 
 
1086
Format:
 
1087
       control: Meta directory format 1
 
1088
    repository: %s
 
1089
 
 
1090
Create working tree for new branches inside the repository.
 
1091
 
 
1092
Repository:
 
1093
         0 revisions
 
1094
more info
 
1095
""" % (format.repository_format.get_format_description(),
 
1096
       ), out)
 
1097
        self.assertEqual('', err)
 
1098
 
 
1099
    def assertCheckoutStatusOutput(self,
 
1100
        command_string, lco_tree, shared_repo=None,
 
1101
        repo_branch=None,
 
1102
        tree_locked=False,
 
1103
        branch_locked=False, repo_locked=False,
 
1104
        verbose=False,
 
1105
        light_checkout=True,
 
1106
        checkout_root=None):
 
1107
        """Check the output of info in a checkout.
 
1108
 
 
1109
        This is not quite a mirror of the info code: rather than using the
 
1110
        tree being examined to predict output, it uses a bunch of flags which
 
1111
        allow us, the test writers, to document what *should* be present in
 
1112
        the output. Removing this separation would remove the value of the
 
1113
        tests.
 
1114
 
 
1115
        :param path: the path to the light checkout.
 
1116
        :param lco_tree: the tree object for the light checkout.
 
1117
        :param shared_repo: A shared repository is in use, expect that in
 
1118
            the output.
 
1119
        :param repo_branch: A branch in a shared repository for non light
 
1120
            checkouts.
 
1121
        :param tree_locked: If true, expect the tree to be locked.
 
1122
        :param branch_locked: If true, expect the branch to be locked.
 
1123
        :param repo_locked: If true, expect the repository to be locked.
 
1124
            Note that the lco_tree.branch.repository is inspected, and if is not
 
1125
            actually locked then this parameter is overridden. This is because
 
1126
            pack repositories do not have any public API for obtaining an
 
1127
            exclusive repository wide lock.
 
1128
        :param verbose: verbosity level: 2 or higher to show committers
 
1129
        """
 
1130
        def friendly_location(url):
 
1131
            path = urlutils.unescape_for_display(url, 'ascii')
 
1132
            try:
 
1133
                return osutils.relpath(osutils.getcwd(), path)
 
1134
            except errors.PathNotChild:
 
1135
                return path
 
1136
 
 
1137
        if tree_locked:
 
1138
            # We expect this to fail because of locking errors.
 
1139
            # (A write-locked file cannot be read-locked
 
1140
            # in the different process -- either on win32 or on linux).
 
1141
            # This should be removed when the locking errors are fixed.
 
1142
            self.expectFailure('OS locks are exclusive '
 
1143
                'for different processes (Bug #174055)',
 
1144
                self.run_bzr_subprocess,
 
1145
                'info ' + command_string)
 
1146
        out, err = self.run_bzr('info %s' % command_string)
 
1147
        description = {
 
1148
            (True, True): 'Lightweight checkout',
 
1149
            (True, False): 'Repository checkout',
 
1150
            (False, True): 'Lightweight checkout',
 
1151
            (False, False): 'Checkout',
 
1152
            }[(shared_repo is not None, light_checkout)]
 
1153
        format = {True: self._repo_strings,
 
1154
                  False: 'unnamed'}[light_checkout]
 
1155
        if repo_locked:
 
1156
            repo_locked = lco_tree.branch.repository.get_physical_lock_status()
 
1157
        if repo_locked or branch_locked or tree_locked:
 
1158
            def locked_message(a_bool):
 
1159
                if a_bool:
 
1160
                    return 'locked'
 
1161
                else:
 
1162
                    return 'unlocked'
 
1163
            expected_lock_output = (
 
1164
                "\n"
 
1165
                "Lock status:\n"
 
1166
                "  working tree: %s\n"
 
1167
                "        branch: %s\n"
 
1168
                "    repository: %s\n" % (
 
1169
                    locked_message(tree_locked),
 
1170
                    locked_message(branch_locked),
 
1171
                    locked_message(repo_locked)))
 
1172
        else:
 
1173
            expected_lock_output = ''
 
1174
        tree_data = ''
 
1175
        extra_space = ''
 
1176
        if light_checkout:
 
1177
            tree_data = ("  light checkout root: %s\n" %
 
1178
                friendly_location(lco_tree.bzrdir.root_transport.base))
 
1179
            extra_space = ' '
 
1180
        if lco_tree.branch.get_bound_location() is not None:
 
1181
            tree_data += ("%s       checkout root: %s\n" % (extra_space,
 
1182
                friendly_location(lco_tree.branch.bzrdir.root_transport.base)))
 
1183
        if shared_repo is not None:
 
1184
            branch_data = (
 
1185
                "   checkout of branch: %s\n"
 
1186
                "    shared repository: %s\n" %
 
1187
                (friendly_location(repo_branch.bzrdir.root_transport.base),
 
1188
                 friendly_location(shared_repo.bzrdir.root_transport.base)))
 
1189
        elif repo_branch is not None:
 
1190
            branch_data = (
 
1191
                "%s  checkout of branch: %s\n" %
 
1192
                (extra_space,
 
1193
                 friendly_location(repo_branch.bzrdir.root_transport.base)))
 
1194
        else:
 
1195
            branch_data = ("   checkout of branch: %s\n" %
 
1196
                lco_tree.branch.bzrdir.root_transport.base)
 
1197
 
 
1198
        if verbose >= 2:
 
1199
            verbose_info = '         0 committers\n'
 
1200
        else:
 
1201
            verbose_info = ''
 
1202
 
 
1203
        self.assertEqualDiff(
 
1204
"""%s (format: %s)
 
1205
Location:
 
1206
%s%s
 
1207
Format:
 
1208
       control: Meta directory format 1
 
1209
  working tree: %s
 
1210
        branch: %s
 
1211
    repository: %s
 
1212
%s
 
1213
In the working tree:
 
1214
         0 unchanged
 
1215
         0 modified
 
1216
         0 added
 
1217
         0 removed
 
1218
         0 renamed
 
1219
         0 unknown
 
1220
         0 ignored
 
1221
         0 versioned subdirectories
 
1222
 
 
1223
Branch history:
 
1224
         0 revisions
 
1225
%s
 
1226
Repository:
 
1227
         0 revisions
 
1228
""" %  (description,
 
1229
        format,
 
1230
        tree_data,
 
1231
        branch_data,
 
1232
        lco_tree._format.get_format_description(),
 
1233
        lco_tree.branch._format.get_format_description(),
 
1234
        lco_tree.branch.repository._format.get_format_description(),
 
1235
        expected_lock_output,
 
1236
        verbose_info,
 
1237
        ), out)
 
1238
        self.assertEqual('', err)
 
1239
 
 
1240
    def test_info_locking(self):
 
1241
        transport = self.get_transport()
 
1242
        # Create shared repository with a branch
 
1243
        repo = self.make_repository('repo', shared=True,
 
1244
                                    format=bzrdir.BzrDirMetaFormat1())
 
1245
        repo.set_make_working_trees(False)
 
1246
        repo.bzrdir.root_transport.mkdir('branch')
 
1247
        repo_branch = controldir.ControlDir.create_branch_convenience(
 
1248
            'repo/branch', format=bzrdir.BzrDirMetaFormat1())
 
1249
        # Do a heavy checkout
 
1250
        transport.mkdir('tree')
 
1251
        transport.mkdir('tree/checkout')
 
1252
        co_branch = controldir.ControlDir.create_branch_convenience(
 
1253
            'tree/checkout', format=bzrdir.BzrDirMetaFormat1())
 
1254
        co_branch.bind(repo_branch)
 
1255
        # Do a light checkout of the heavy one
 
1256
        transport.mkdir('tree/lightcheckout')
 
1257
        lco_dir = bzrdir.BzrDirMetaFormat1().initialize('tree/lightcheckout')
 
1258
        branch.BranchReferenceFormat().initialize(lco_dir,
 
1259
            target_branch=co_branch)
 
1260
        lco_dir.create_workingtree()
 
1261
        lco_tree = lco_dir.open_workingtree()
 
1262
 
 
1263
        # Test all permutations of locking the working tree, branch and repository
 
1264
        # W B R
 
1265
 
 
1266
        # U U U
 
1267
        self.assertCheckoutStatusOutput('-v tree/lightcheckout', lco_tree,
 
1268
                                        repo_branch=repo_branch,
 
1269
                                        verbose=True, light_checkout=True)
 
1270
        # U U L
 
1271
        lco_tree.branch.repository.lock_write()
 
1272
        try:
 
1273
            self.assertCheckoutStatusOutput('-v tree/lightcheckout',
 
1274
            lco_tree, repo_branch=repo_branch,
 
1275
            repo_locked=True, verbose=True, light_checkout=True)
 
1276
        finally:
 
1277
            lco_tree.branch.repository.unlock()
 
1278
        # U L L
 
1279
        lco_tree.branch.lock_write()
 
1280
        try:
 
1281
            self.assertCheckoutStatusOutput('-v tree/lightcheckout',
 
1282
            lco_tree,
 
1283
            branch_locked=True,
 
1284
            repo_locked=True,
 
1285
            repo_branch=repo_branch,
 
1286
            verbose=True)
 
1287
        finally:
 
1288
            lco_tree.branch.unlock()
 
1289
        # L L L
 
1290
        lco_tree.lock_write()
 
1291
        try:
 
1292
            self.assertCheckoutStatusOutput('-v tree/lightcheckout',
 
1293
            lco_tree, repo_branch=repo_branch,
 
1294
            tree_locked=True,
 
1295
            branch_locked=True,
 
1296
            repo_locked=True,
 
1297
            verbose=True)
 
1298
        finally:
 
1299
            lco_tree.unlock()
 
1300
        # L L U
 
1301
        lco_tree.lock_write()
 
1302
        lco_tree.branch.repository.unlock()
 
1303
        try:
 
1304
            self.assertCheckoutStatusOutput('-v tree/lightcheckout',
 
1305
            lco_tree, repo_branch=repo_branch,
 
1306
            tree_locked=True,
 
1307
            branch_locked=True,
 
1308
            verbose=True)
 
1309
        finally:
 
1310
            lco_tree.branch.repository.lock_write()
 
1311
            lco_tree.unlock()
 
1312
        # L U U
 
1313
        lco_tree.lock_write()
 
1314
        lco_tree.branch.unlock()
 
1315
        try:
 
1316
            self.assertCheckoutStatusOutput('-v tree/lightcheckout',
 
1317
            lco_tree, repo_branch=repo_branch,
 
1318
            tree_locked=True,
 
1319
            verbose=True)
 
1320
        finally:
 
1321
            lco_tree.branch.lock_write()
 
1322
            lco_tree.unlock()
 
1323
        # L U L
 
1324
        lco_tree.lock_write()
 
1325
        lco_tree.branch.unlock()
 
1326
        lco_tree.branch.repository.lock_write()
 
1327
        try:
 
1328
            self.assertCheckoutStatusOutput('-v tree/lightcheckout',
 
1329
            lco_tree, repo_branch=repo_branch,
 
1330
            tree_locked=True,
 
1331
            repo_locked=True,
 
1332
            verbose=True)
 
1333
        finally:
 
1334
            lco_tree.branch.repository.unlock()
 
1335
            lco_tree.branch.lock_write()
 
1336
            lco_tree.unlock()
 
1337
        # U L U
 
1338
        lco_tree.branch.lock_write()
 
1339
        lco_tree.branch.repository.unlock()
 
1340
        try:
 
1341
            self.assertCheckoutStatusOutput('-v tree/lightcheckout',
 
1342
            lco_tree, repo_branch=repo_branch,
 
1343
            branch_locked=True,
 
1344
            verbose=True)
 
1345
        finally:
 
1346
            lco_tree.branch.repository.lock_write()
 
1347
            lco_tree.branch.unlock()
 
1348
 
 
1349
        if sys.platform == 'win32':
 
1350
            self.knownFailure('Win32 cannot run "bzr info"'
 
1351
                              ' when the tree is locked.')
 
1352
 
 
1353
    def test_info_stacked(self):
 
1354
        # We have a mainline
 
1355
        trunk_tree = self.make_branch_and_tree('mainline',
 
1356
            format='1.6')
 
1357
        trunk_tree.commit('mainline')
 
1358
        # and a branch from it which is stacked
 
1359
        new_dir = trunk_tree.bzrdir.sprout('newbranch', stacked=True)
 
1360
        out, err = self.run_bzr('info newbranch')
 
1361
        self.assertEqual(
 
1362
"""Standalone tree (format: 1.6)
 
1363
Location:
 
1364
  branch root: newbranch
 
1365
 
 
1366
Related branches:
 
1367
  parent branch: mainline
 
1368
     stacked on: mainline
 
1369
""", out)
 
1370
        self.assertEqual("", err)
 
1371
 
 
1372
    def test_info_revinfo_optional(self):
 
1373
        tree = self.make_branch_and_tree('.')
 
1374
        def last_revision_info(self):
 
1375
            raise errors.UnsupportedOperation(last_revision_info, self)
 
1376
        self.overrideAttr(
 
1377
            branch.Branch, "last_revision_info", last_revision_info)
 
1378
        out, err = self.run_bzr('info -v .')
 
1379
        self.assertEqual(
 
1380
"""Standalone tree (format: 2a)
 
1381
Location:
 
1382
  branch root: .
 
1383
 
 
1384
Format:
 
1385
       control: Meta directory format 1
 
1386
  working tree: Working tree format 6
 
1387
        branch: Branch format 7
 
1388
    repository: Repository format 2a - rich roots, group compression and chk inventories
 
1389
 
 
1390
In the working tree:
 
1391
         0 unchanged
 
1392
         0 modified
 
1393
         0 added
 
1394
         0 removed
 
1395
         0 renamed
 
1396
         0 unknown
 
1397
         0 ignored
 
1398
         0 versioned subdirectories
 
1399
""", out)
 
1400
        self.assertEqual("", err)
 
1401
 
 
1402
    def test_info_shows_colocated_branches(self):
 
1403
        bzrdir = self.make_branch('.', format='development-colo').bzrdir
 
1404
        bzrdir.create_branch(name="colo1")
 
1405
        bzrdir.create_branch(name="colo2")
 
1406
        bzrdir.create_branch(name="colo3")
 
1407
        out, err = self.run_bzr('info -v .')
 
1408
        self.assertEqualDiff(
 
1409
"""Standalone branch (format: development-colo)
 
1410
Location:
 
1411
  branch root: .
 
1412
 
 
1413
Format:
 
1414
       control: Meta directory format 1 with support for colocated branches
 
1415
        branch: Branch format 7
 
1416
    repository: Repository format 2a - rich roots, group compression and chk inventories
 
1417
 
 
1418
Control directory:
 
1419
         4 branches
 
1420
 
 
1421
Branch history:
 
1422
         0 revisions
 
1423
 
 
1424
Repository:
 
1425
         0 revisions
 
1426
""", out)
 
1427
        self.assertEqual("", err)
 
1428
 
 
1429
 
 
1430
class TestSmartServerInfo(tests.TestCaseWithTransport):
 
1431
 
 
1432
    def test_simple_branch_info(self):
 
1433
        self.setup_smart_server_with_call_log()
 
1434
        t = self.make_branch_and_tree('branch')
 
1435
        self.build_tree_contents([('branch/foo', 'thecontents')])
 
1436
        t.add("foo")
 
1437
        t.commit("message")
 
1438
        self.reset_smart_call_log()
 
1439
        out, err = self.run_bzr(['info', self.get_url('branch')])
 
1440
        # This figure represent the amount of work to perform this use case. It
 
1441
        # is entirely ok to reduce this number if a test fails due to rpc_count
 
1442
        # being too low. If rpc_count increases, more network roundtrips have
 
1443
        # become necessary for this use case. Please do not adjust this number
 
1444
        # upwards without agreement from bzr's network support maintainers.
 
1445
        self.assertLength(12, self.hpss_calls)
 
1446
 
 
1447
    def test_verbose_branch_info(self):
 
1448
        self.setup_smart_server_with_call_log()
 
1449
        t = self.make_branch_and_tree('branch')
 
1450
        self.build_tree_contents([('branch/foo', 'thecontents')])
 
1451
        t.add("foo")
 
1452
        t.commit("message")
 
1453
        self.reset_smart_call_log()
 
1454
        out, err = self.run_bzr(['info', '-v', self.get_url('branch')])
 
1455
        # This figure represent the amount of work to perform this use case. It
 
1456
        # is entirely ok to reduce this number if a test fails due to rpc_count
 
1457
        # being too low. If rpc_count increases, more network roundtrips have
 
1458
        # become necessary for this use case. Please do not adjust this number
 
1459
        # upwards without agreement from bzr's network support maintainers.
 
1460
        self.assertLength(16, self.hpss_calls)