~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

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

  • Committer: Aaron Bentley
  • Date: 2007-06-11 14:59:52 UTC
  • mto: (2520.5.2 bzr.mpbundle)
  • mto: This revision was merged to the branch mainline in revision 2631.
  • Revision ID: abentley@panoramicfeedback.com-20070611145952-cwt4480gphdhen6l
Get installation started

Show diffs side-by-side

added added

removed removed

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