~bzr-pqm/bzr/bzr.dev

2395.1.1 by Martin Pool
rename 'revision store' to 'repository' in bzr info
1
# Copyright (C) 2005, 2006, 2007 Canonical Ltd
1685.1.60 by Martin Pool
[broken] NotBranchError should unescape the url if possible
2
# 
77 by mbp at sourcefrog
- split info command out into separate file
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.
2052.3.1 by John Arbash Meinel
Add tests to cleanup the copyright of all source files
7
#
77 by mbp at sourcefrog
- split info command out into separate file
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.
2052.3.1 by John Arbash Meinel
Add tests to cleanup the copyright of all source files
12
#
77 by mbp at sourcefrog
- split info command out into separate file
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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
16
1534.5.1 by Robert Collins
Give info some reasonable output and tests.
17
__all__ = ['show_bzrdir_info']
18
1551.15.41 by Aaron Bentley
Make info provide more related brances, and format all branches nicely
19
import os
77 by mbp at sourcefrog
- split info command out into separate file
20
import time
1551.15.43 by Aaron Bentley
Provide ways of getting at unicode-clean output
21
import sys
1534.5.1 by Robert Collins
Give info some reasonable output and tests.
22
1551.9.22 by Aaron Bentley
Use urlutils for info. Fixes bug #76229
23
from bzrlib import (
2363.5.5 by Aaron Bentley
add info.describe_format
24
    bzrdir,
1551.9.22 by Aaron Bentley
Use urlutils for info. Fixes bug #76229
25
    diff,
1551.15.41 by Aaron Bentley
Make info provide more related brances, and format all branches nicely
26
    errors,
1551.9.22 by Aaron Bentley
Use urlutils for info. Fixes bug #76229
27
    osutils,
28
    urlutils,
29
    )
1624.3.21 by Olaf Conradi
Make bzr info command work on both local and remote locations. Support
30
from bzrlib.errors import (NoWorkingTree, NotBranchError,
31
                           NoRepositoryPresent, NotLocalUrl)
1587.1.14 by Robert Collins
Make bound branch creation happen via 'checkout'
32
from bzrlib.missing import find_unmerged
2258.1.1 by Robert Collins
Move info branch statistics gathering into the repository to allow smart server optimisation (Robert Collins).
33
from bzrlib.symbol_versioning import (deprecated_function,
2696.1.1 by Martin Pool
Remove things deprecated in 0.11 and earlier
34
        zero_eighteen)
77 by mbp at sourcefrog
- split info command out into separate file
35
462 by Martin Pool
- New form 'file_id in tree' to check if the file is present
36
1563.2.28 by Robert Collins
Add total_size to the revision_store api.
37
def plural(n, base='', pl=None):
38
    if n == 1:
39
        return base
1963.2.6 by Robey Pointer
pychecker is on crack; go back to using 'is None'.
40
    elif pl is not None:
1563.2.28 by Robert Collins
Add total_size to the revision_store api.
41
        return pl
42
    else:
43
        return 's'
44
45
1551.15.41 by Aaron Bentley
Make info provide more related brances, and format all branches nicely
46
class LocationList(object):
47
48
    def __init__(self, base_path):
1551.15.43 by Aaron Bentley
Provide ways of getting at unicode-clean output
49
        self.locs = []
1551.15.41 by Aaron Bentley
Make info provide more related brances, and format all branches nicely
50
        self.base_path = base_path
51
52
    def add_url(self, label, url):
1551.15.43 by Aaron Bentley
Provide ways of getting at unicode-clean output
53
        """Add a URL to the list, converting it to a path if possible"""
1551.15.41 by Aaron Bentley
Make info provide more related brances, and format all branches nicely
54
        if url is None:
55
            return
1551.15.43 by Aaron Bentley
Provide ways of getting at unicode-clean output
56
        try:
57
            path = urlutils.local_path_from_url(url)
58
        except errors.InvalidURL:
59
            self.locs.append((label, url))
60
        else:
1551.15.41 by Aaron Bentley
Make info provide more related brances, and format all branches nicely
61
            self.add_path(label, path)
2363.5.18 by Aaron Bentley
Get all tests passing
62
63
    def add_path(self, label, path):
1551.15.43 by Aaron Bentley
Provide ways of getting at unicode-clean output
64
        """Add a path, converting it to a relative path if possible"""
1551.15.41 by Aaron Bentley
Make info provide more related brances, and format all branches nicely
65
        try:
66
            path = osutils.relpath(self.base_path, path)
67
        except errors.PathNotChild:
68
            pass
69
        else:
70
            if path == '':
71
                path = '.'
72
        if path != '/':
73
            path = path.rstrip('/')
1551.15.43 by Aaron Bentley
Provide ways of getting at unicode-clean output
74
        self.locs.append((label, path))
2363.5.18 by Aaron Bentley
Get all tests passing
75
1551.15.43 by Aaron Bentley
Provide ways of getting at unicode-clean output
76
    def get_lines(self):
77
        max_len = max(len(l) for l, u in self.locs)
78
        return ["  %*s: %s\n" % (max_len, l, u) for l, u in self.locs ]
2363.5.18 by Aaron Bentley
Get all tests passing
79
80
81
def gather_location_info(repository, branch=None, working=None):
82
    locs = {}
1694.2.6 by Martin Pool
[merge] bzr.dev
83
    repository_path = repository.bzrdir.root_transport.base
2363.5.18 by Aaron Bentley
Get all tests passing
84
    if branch is not None:
85
        branch_path = branch.bzrdir.root_transport.base
86
        master_path = branch.get_bound_location()
87
        if master_path is None:
88
            master_path = branch_path
89
    else:
90
        branch_path = None
91
        master_path = None
92
    if working:
1694.2.6 by Martin Pool
[merge] bzr.dev
93
        working_path = working.bzrdir.root_transport.base
94
        if working_path != branch_path:
2363.5.18 by Aaron Bentley
Get all tests passing
95
            locs['light checkout root'] = working_path
96
        if master_path != branch_path:
1694.2.6 by Martin Pool
[merge] bzr.dev
97
            if repository.is_shared():
2363.5.18 by Aaron Bentley
Get all tests passing
98
                locs['repository checkout root'] = branch_path
1694.2.6 by Martin Pool
[merge] bzr.dev
99
            else:
2363.5.18 by Aaron Bentley
Get all tests passing
100
                locs['checkout root'] = branch_path
101
        if working_path != master_path:
102
            locs['checkout of branch'] = master_path
1694.2.6 by Martin Pool
[merge] bzr.dev
103
        elif repository.is_shared():
1551.15.41 by Aaron Bentley
Make info provide more related brances, and format all branches nicely
104
            locs['repository branch'] = branch_path
2363.5.18 by Aaron Bentley
Get all tests passing
105
        elif branch_path is not None:
1694.2.6 by Martin Pool
[merge] bzr.dev
106
            # standalone
2363.5.18 by Aaron Bentley
Get all tests passing
107
            locs['branch root'] = branch_path
108
    else:
109
        working_path = None
1624.3.48 by Olaf Conradi
Add info on standalone branches without a working tree.
110
        if repository.is_shared():
2363.5.18 by Aaron Bentley
Get all tests passing
111
            # lightweight checkout of branch in shared repository
112
            if branch_path is not None:
1551.15.41 by Aaron Bentley
Make info provide more related brances, and format all branches nicely
113
                locs['repository branch'] = branch_path
2363.5.18 by Aaron Bentley
Get all tests passing
114
        elif branch_path is not None:
115
            # standalone
116
            locs['branch root'] = branch_path
2363.5.19 by Aaron Bentley
Add support for bound branches
117
            if master_path != branch_path:
118
                locs['bound to branch'] = master_path
1624.3.48 by Olaf Conradi
Add info on standalone branches without a working tree.
119
        else:
2363.5.18 by Aaron Bentley
Get all tests passing
120
            locs['repository'] = repository_path
121
    if repository.is_shared():
122
        # lightweight checkout of branch in shared repository
123
        locs['shared repository'] = repository_path
2363.5.23 by Aaron Bentley
Output 2-tuples from gather_locations
124
    order = ['light checkout root', 'repository checkout root',
125
             'checkout root', 'checkout of branch', 'shared repository',
126
             'repository', 'repository branch', 'branch root',
127
             'bound to branch']
128
    return [(n, locs[n]) for n in order if n in locs]
2363.5.18 by Aaron Bentley
Get all tests passing
129
130
131
def _show_location_info(locs):
132
    """Show known locations for working, branch and repository."""
133
    print 'Location:'
2804.4.3 by Alexander Belchenko
fix for test_info-tests: using osutils.getcwd instead of os.getcwd (sigh)
134
    path_list = LocationList(osutils.getcwd())
2363.5.23 by Aaron Bentley
Output 2-tuples from gather_locations
135
    for name, loc in locs:
136
        path_list.add_url(name, loc)
1551.15.43 by Aaron Bentley
Provide ways of getting at unicode-clean output
137
    sys.stdout.writelines(path_list.get_lines())
1694.2.6 by Martin Pool
[merge] bzr.dev
138
1551.15.41 by Aaron Bentley
Make info provide more related brances, and format all branches nicely
139
def _gather_related_branches(branch):
2804.4.3 by Alexander Belchenko
fix for test_info-tests: using osutils.getcwd instead of os.getcwd (sigh)
140
    locs = LocationList(osutils.getcwd())
1551.15.41 by Aaron Bentley
Make info provide more related brances, and format all branches nicely
141
    locs.add_url('public branch', branch.get_public_branch())
142
    locs.add_url('push branch', branch.get_push_location())
143
    locs.add_url('parent branch', branch.get_parent())
144
    locs.add_url('submit branch', branch.get_submit_branch())
145
    return locs
1694.2.6 by Martin Pool
[merge] bzr.dev
146
1551.15.43 by Aaron Bentley
Provide ways of getting at unicode-clean output
147
def _show_related_info(branch, outfile):
1694.2.6 by Martin Pool
[merge] bzr.dev
148
    """Show parent and push location of branch."""
1551.15.41 by Aaron Bentley
Make info provide more related brances, and format all branches nicely
149
    locs = _gather_related_branches(branch)
1551.15.43 by Aaron Bentley
Provide ways of getting at unicode-clean output
150
    if len(locs.locs) > 0:
2911.6.1 by Blake Winton
Change 'print >> f,'s to 'f.write('s.
151
        outfile.write('\n')
152
        outfile.write('Related branches:\n')
1551.15.43 by Aaron Bentley
Provide ways of getting at unicode-clean output
153
        outfile.writelines(locs.get_lines())
1624.3.21 by Olaf Conradi
Make bzr info command work on both local and remote locations. Support
154
155
156
def _show_format_info(control=None, repository=None, branch=None, working=None):
157
    """Show known formats for control, working, branch and repository."""
1624.3.4 by Olaf Conradi
Simplify construct detection. Make terms in user interface consistent.
158
    print
1624.3.8 by Olaf Conradi
Adjust formatting. Start sections with a capital letter.
159
    print 'Format:'
1624.3.21 by Olaf Conradi
Make bzr info command work on both local and remote locations. Support
160
    if control:
161
        print '       control: %s' % control._format.get_format_description()
162
    if working:
163
        print '  working tree: %s' % working._format.get_format_description()
164
    if branch:
165
        print '        branch: %s' % branch._format.get_format_description()
166
    if repository:
167
        print '    repository: %s' % repository._format.get_format_description()
168
169
1694.2.6 by Martin Pool
[merge] bzr.dev
170
def _show_locking_info(repository, branch=None, working=None):
171
    """Show locking status of working, branch and repository."""
172
    if (repository.get_physical_lock_status() or
173
        (branch and branch.get_physical_lock_status()) or
174
        (working and working.get_physical_lock_status())):
175
        print
176
        print 'Lock status:'
177
        if working:
178
            if working.get_physical_lock_status():
179
                status = 'locked'
180
            else:
181
                status = 'unlocked'
182
            print '  working tree: %s' % status
183
        if branch:
184
            if branch.get_physical_lock_status():
185
                status = 'locked'
186
            else:
187
                status = 'unlocked'
188
            print '        branch: %s' % status
189
        if repository:
190
            if repository.get_physical_lock_status():
191
                status = 'locked'
192
            else:
193
                status = 'unlocked'
194
            print '    repository: %s' % status
195
196
1624.3.21 by Olaf Conradi
Make bzr info command work on both local and remote locations. Support
197
def _show_missing_revisions_branch(branch):
198
    """Show missing master revisions in branch."""
1587.1.14 by Robert Collins
Make bound branch creation happen via 'checkout'
199
    # Try with inaccessible branch ?
1624.3.2 by Olaf Conradi
Implemented table of constructs from BzrInfo specification.
200
    master = branch.get_master_branch()
1587.1.14 by Robert Collins
Make bound branch creation happen via 'checkout'
201
    if master:
1624.3.2 by Olaf Conradi
Implemented table of constructs from BzrInfo specification.
202
        local_extra, remote_extra = find_unmerged(branch, master)
1587.1.14 by Robert Collins
Make bound branch creation happen via 'checkout'
203
        if remote_extra:
1624.3.21 by Olaf Conradi
Make bzr info command work on both local and remote locations. Support
204
            print
1587.1.14 by Robert Collins
Make bound branch creation happen via 'checkout'
205
            print 'Branch is out of date: missing %d revision%s.' % (
206
                len(remote_extra), plural(len(remote_extra)))
1624.3.21 by Olaf Conradi
Make bzr info command work on both local and remote locations. Support
207
208
209
def _show_missing_revisions_working(working):
210
    """Show missing revisions in working tree."""
211
    branch = working.branch
212
    basis = working.basis_tree()
213
    work_inv = working.inventory
2249.4.2 by Wouter van Heyst
Convert callers of Branch.revision_history() to Branch.last_revision_info() where sensible.
214
    branch_revno, branch_last_revision = branch.last_revision_info()
1908.7.6 by Robert Collins
Deprecate WorkingTree.last_revision.
215
    try:
216
        tree_last_id = working.get_parent_ids()[0]
217
    except IndexError:
218
        tree_last_id = None
1624.3.21 by Olaf Conradi
Make bzr info command work on both local and remote locations. Support
219
2249.4.2 by Wouter van Heyst
Convert callers of Branch.revision_history() to Branch.last_revision_info() where sensible.
220
    if branch_revno and tree_last_id != branch_last_revision:
1624.3.11 by Olaf Conradi
Test cases exposed a bug in missing revisions count of working tree. It
221
        tree_last_revno = branch.revision_id_to_revno(tree_last_id)
2249.4.2 by Wouter van Heyst
Convert callers of Branch.revision_history() to Branch.last_revision_info() where sensible.
222
        missing_count = branch_revno - tree_last_revno
1624.3.21 by Olaf Conradi
Make bzr info command work on both local and remote locations. Support
223
        print
1534.5.1 by Robert Collins
Give info some reasonable output and tests.
224
        print 'Working tree is out of date: missing %d revision%s.' % (
225
            missing_count, plural(missing_count))
1624.3.21 by Olaf Conradi
Make bzr info command work on both local and remote locations. Support
226
227
228
def _show_working_stats(working):
229
    """Show statistics about a working tree."""
230
    basis = working.basis_tree()
231
    work_inv = working.inventory
1852.10.3 by Robert Collins
Remove all uses of compare_trees and replace with Tree.changes_from throughout bzrlib.
232
    delta = working.changes_from(basis, want_unchanged=True)
1624.3.21 by Olaf Conradi
Make bzr info command work on both local and remote locations. Support
233
234
    print
1624.3.8 by Olaf Conradi
Adjust formatting. Start sections with a capital letter.
235
    print 'In the working tree:'
463 by Martin Pool
- compare_trees() also reports unchanged files
236
    print '  %8s unchanged' % len(delta.unchanged)
462 by Martin Pool
- New form 'file_id in tree' to check if the file is present
237
    print '  %8d modified' % len(delta.modified)
238
    print '  %8d added' % len(delta.added)
239
    print '  %8d removed' % len(delta.removed)
240
    print '  %8d renamed' % len(delta.renamed)
241
242
    ignore_cnt = unknown_cnt = 0
243
    for path in working.extras():
244
        if working.is_ignored(path):
245
            ignore_cnt += 1
246
        else:
247
            unknown_cnt += 1
248
    print '  %8d unknown' % unknown_cnt
249
    print '  %8d ignored' % ignore_cnt
250
251
    dir_cnt = 0
1731.1.39 by Aaron Bentley
Reject removing is_root
252
    for file_id in work_inv:
253
        if (work_inv.get_file_kind(file_id) == 'directory' and 
254
            not work_inv.is_root(file_id)):
255
            dir_cnt += 1
462 by Martin Pool
- New form 'file_id in tree' to check if the file is present
256
    print '  %8d versioned %s' \
257
          % (dir_cnt,
258
             plural(dir_cnt, 'subdirectory', 'subdirectories'))
77 by mbp at sourcefrog
- split info command out into separate file
259
1624.3.21 by Olaf Conradi
Make bzr info command work on both local and remote locations. Support
260
261
def _show_branch_stats(branch, verbose):
262
    """Show statistics about a branch."""
2258.1.1 by Robert Collins
Move info branch statistics gathering into the repository to allow smart server optimisation (Robert Collins).
263
    revno, head = branch.last_revision_info()
77 by mbp at sourcefrog
- split info command out into separate file
264
    print
1624.3.8 by Olaf Conradi
Adjust formatting. Start sections with a capital letter.
265
    print 'Branch history:'
111 by mbp at sourcefrog
Make fields wider in 'bzr info' output to accomodate big trees
266
    print '  %8d revision%s' % (revno, plural(revno))
2258.1.1 by Robert Collins
Move info branch statistics gathering into the repository to allow smart server optimisation (Robert Collins).
267
    stats = branch.repository.gather_stats(head, committers=verbose)
1624.3.21 by Olaf Conradi
Make bzr info command work on both local and remote locations. Support
268
    if verbose:
2258.1.1 by Robert Collins
Move info branch statistics gathering into the repository to allow smart server optimisation (Robert Collins).
269
        committers = stats['committers']
270
        print '  %8d committer%s' % (committers, plural(committers))
271
    if revno:
272
        timestamp, timezone = stats['firstrev']
273
        age = int((time.time() - timestamp) / 3600 / 24)
111 by mbp at sourcefrog
Make fields wider in 'bzr info' output to accomodate big trees
274
        print '  %8d day%s old' % (age, plural(age))
2258.1.1 by Robert Collins
Move info branch statistics gathering into the repository to allow smart server optimisation (Robert Collins).
275
        print '   first revision: %s' % osutils.format_date(timestamp,
276
            timezone)
277
        timestamp, timezone = stats['latestrev']
278
        print '  latest revision: %s' % osutils.format_date(timestamp,
279
            timezone)
2258.1.2 by Robert Collins
New version of gather_stats which gathers aggregate data too.
280
    return stats
1624.3.21 by Olaf Conradi
Make bzr info command work on both local and remote locations. Support
281
282
283
def _show_repository_info(repository):
284
    """Show settings of a repository."""
285
    if repository.make_working_trees():
286
        print
287
        print 'Create working tree for new branches inside the repository.'
288
289
2258.1.2 by Robert Collins
New version of gather_stats which gathers aggregate data too.
290
def _show_repository_stats(stats):
1624.3.21 by Olaf Conradi
Make bzr info command work on both local and remote locations. Support
291
    """Show statistics about a repository."""
2258.1.2 by Robert Collins
New version of gather_stats which gathers aggregate data too.
292
    if 'revisions' in stats or 'size' in stats:
1624.3.21 by Olaf Conradi
Make bzr info command work on both local and remote locations. Support
293
        print
2395.1.1 by Martin Pool
rename 'revision store' to 'repository' in bzr info
294
        print 'Repository:'
2258.1.2 by Robert Collins
New version of gather_stats which gathers aggregate data too.
295
    if 'revisions' in stats:
296
        revisions = stats['revisions']
297
        print '  %8d revision%s' % (revisions, plural(revisions))
298
    if 'size' in stats:
299
        print '  %8d KiB' % (stats['size']/1024)
1624.3.21 by Olaf Conradi
Make bzr info command work on both local and remote locations. Support
300
2363.5.1 by Aaron Bentley
Unify info display into show_component_info
301
def show_bzrdir_info(a_bzrdir, verbose=False):
302
    """Output to stdout the 'info' for a_bzrdir."""
303
    try:
2363.5.9 by Aaron Bentley
Merge from bzr.dev
304
        tree = a_bzrdir.open_workingtree(
305
            recommend_upgrade=False)
2363.5.1 by Aaron Bentley
Unify info display into show_component_info
306
    except (NoWorkingTree, NotLocalUrl):
307
        tree = None
308
        try:
309
            branch = a_bzrdir.open_branch()
310
        except NotBranchError:
311
            branch = None
312
            try:
313
                repository = a_bzrdir.open_repository()
314
            except NoRepositoryPresent:
315
                # Return silently; cmd_info already returned NotBranchError
316
                # if no bzrdir could be opened.
317
                return
318
            else:
319
                lockable = repository
320
        else:
321
            repository = branch.repository
322
            lockable = branch
323
    else:
324
        branch = tree.branch
325
        repository = branch.repository
326
        lockable = tree
327
328
    lockable.lock_read()
329
    try:
330
        show_component_info(a_bzrdir, repository, branch, tree, verbose)
331
    finally:
332
        lockable.unlock()
333
334
335
def show_component_info(control, repository, branch=None, working=None,
336
    verbose=1):
337
    """Write info about all bzrdir components to stdout"""
2363.5.7 by Aaron Bentley
Make verbose mean what I want
338
    if verbose is False:
339
        verbose = 1
340
    if verbose is True:
341
        verbose = 2
2363.5.6 by Aaron Bentley
Add short format description
342
    layout = describe_layout(repository, branch, working)
343
    format = describe_format(control, repository, branch, working)
344
    print "%s (format: %s)" % (layout, format)
2363.5.18 by Aaron Bentley
Get all tests passing
345
    _show_location_info(gather_location_info(repository, branch, working))
2584.2.1 by Adeodato Simó
Make `bzr info` show related branches in non-verbose mode.
346
    if branch is not None:
1551.15.43 by Aaron Bentley
Provide ways of getting at unicode-clean output
347
        _show_related_info(branch, sys.stdout)
2363.5.7 by Aaron Bentley
Make verbose mean what I want
348
    if verbose == 0:
349
        return
2363.5.1 by Aaron Bentley
Unify info display into show_component_info
350
    _show_format_info(control, repository, branch, working)
351
    _show_locking_info(repository, branch, working)
352
    if branch is not None:
353
        _show_missing_revisions_branch(branch)
354
    if working is not None:
355
        _show_missing_revisions_working(working)
356
        _show_working_stats(working)
357
    elif branch is not None:
358
        _show_missing_revisions_branch(branch)
359
    if branch is not None:
360
        stats = _show_branch_stats(branch, verbose==2)
361
    else:
362
        stats = repository.gather_stats()
363
    if branch is None and working is None:
364
        _show_repository_info(repository)
365
    _show_repository_stats(stats)
366
367
2363.5.2 by Aaron Bentley
Implement layout description
368
def describe_layout(repository=None, branch=None, tree=None):
369
    """Convert a control directory layout into a user-understandable term
370
371
    Common outputs include "Standalone tree", "Repository branch" and
372
    "Checkout".  Uncommon outputs include "Unshared repository with trees"
373
    and "Empty control directory"
374
    """
375
    if repository is None:
376
        return 'Empty control directory'
377
    if branch is None and tree is None:
378
        if repository.is_shared():
379
            phrase = 'Shared repository'
380
        else:
381
            phrase = 'Unshared repository'
382
        if repository.make_working_trees():
383
            phrase += ' with trees'
384
        return phrase
385
    else:
386
        if repository.is_shared():
387
            independence = "Repository "
388
        else:
389
            independence = "Standalone "
390
        if tree is not None:
391
            phrase = "tree"
392
        else:
393
            phrase = "branch"
394
        if branch is None and tree is not None:
395
            phrase = "branchless tree"
396
        else:
397
            if (tree is not None and tree.bzrdir.root_transport.base !=
398
                branch.bzrdir.root_transport.base):
2363.5.4 by Aaron Bentley
Eliminate the concept of a 'repository lightweight checkout'
399
                independence = ''
2363.5.2 by Aaron Bentley
Implement layout description
400
                phrase = "Lightweight checkout"
401
            elif branch.get_bound_location() is not None:
402
                if independence == 'Standalone ':
403
                    independence = ''
404
                if tree is None:
405
                    phrase = "Bound branch"
406
                else:
407
                    phrase = "Checkout"
408
        if independence != "":
409
            phrase = phrase.lower()
410
        return "%s%s" % (independence, phrase)
411
412
2363.5.5 by Aaron Bentley
add info.describe_format
413
def describe_format(control, repository, branch, tree):
414
    """Determine the format of an existing control directory
415
416
    Several candidates may be found.  If so, the names are returned as a
2363.5.17 by Aaron Bentley
Change separator from '/' to 'or'
417
    single string, separated by ' or '.
2363.5.5 by Aaron Bentley
add info.describe_format
418
419
    If no matching candidate is found, "unnamed" is returned.
420
    """
421
    candidates  = []
2363.5.6 by Aaron Bentley
Add short format description
422
    if (branch is not None and tree is not None and
423
        branch.bzrdir.root_transport.base !=
424
        tree.bzrdir.root_transport.base):
425
        branch = None
426
        repository = None
2363.5.5 by Aaron Bentley
add info.describe_format
427
    for key in bzrdir.format_registry.keys():
428
        format = bzrdir.format_registry.make_bzrdir(key)
429
        if isinstance(format, bzrdir.BzrDirMetaFormat1):
430
            if (tree and format.workingtree_format !=
431
                tree._format):
432
                continue
433
            if (branch and format.get_branch_format() !=
434
                branch._format):
435
                continue
436
            if (repository and format.repository_format !=
437
                repository._format):
438
                continue
439
        if format.__class__ is not control._format.__class__:
440
            continue
441
        candidates.append(key)
442
    if len(candidates) == 0:
443
        return 'unnamed'
444
    new_candidates = [c for c in candidates if c != 'default']
445
    if len(new_candidates) > 0:
446
        candidates = new_candidates
2363.5.6 by Aaron Bentley
Add short format description
447
    new_candidates = [c for c in candidates if not
448
        bzrdir.format_registry.get_info(c).hidden]
449
    if len(new_candidates) > 0:
450
        candidates = new_candidates
2363.5.17 by Aaron Bentley
Change separator from '/' to 'or'
451
    return ' or '.join(candidates)
2363.5.5 by Aaron Bentley
add info.describe_format
452
1624.3.21 by Olaf Conradi
Make bzr info command work on both local and remote locations. Support
453
2363.5.26 by Aaron Bentley
fix symbol spelling
454
@deprecated_function(zero_eighteen)
1624.3.21 by Olaf Conradi
Make bzr info command work on both local and remote locations. Support
455
def show_tree_info(working, verbose):
456
    """Output to stdout the 'info' for working."""
457
    branch = working.branch
458
    repository = branch.repository
459
    control = working.bzrdir
2363.5.1 by Aaron Bentley
Unify info display into show_component_info
460
    show_component_info(control, repository, branch, working, verbose)
461
462
2363.5.26 by Aaron Bentley
fix symbol spelling
463
@deprecated_function(zero_eighteen)
1624.3.21 by Olaf Conradi
Make bzr info command work on both local and remote locations. Support
464
def show_branch_info(branch, verbose):
465
    """Output to stdout the 'info' for branch."""
466
    repository = branch.repository
467
    control = branch.bzrdir
2363.5.1 by Aaron Bentley
Unify info display into show_component_info
468
    show_component_info(control, repository, branch, verbose=verbose)
469
470
2363.5.26 by Aaron Bentley
fix symbol spelling
471
@deprecated_function(zero_eighteen)
1624.3.21 by Olaf Conradi
Make bzr info command work on both local and remote locations. Support
472
def show_repository_info(repository, verbose):
1694.2.6 by Martin Pool
[merge] bzr.dev
473
    """Output to stdout the 'info' for repository."""
1624.3.21 by Olaf Conradi
Make bzr info command work on both local and remote locations. Support
474
    control = repository.bzrdir
2363.5.1 by Aaron Bentley
Unify info display into show_component_info
475
    show_component_info(control, repository, verbose=verbose)