~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

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

  • Committer: Max Bowsher
  • Date: 2010-10-31 14:31:17 UTC
  • mto: This revision was merged to the branch mainline in revision 5521.
  • Revision ID: maxb@f2s.com-20101031143117-57vrfu630yq8a3k2
Fix a slightly odd style of ConfigObj construction to match the prevailing style in bzrlib.

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