57
58
result = result.rstrip('/')
61
def _show_location_info(repository, branch=None, working=None):
62
"""Show known locations for working, branch and repository."""
61
class _UrlList(object):
66
def add_url(self, label, url):
67
self.add_path(label, urlutils.unescape_for_display(url, 'ascii'))
69
def add_url(self, label, url):
70
self.add_path(label, url)
72
def add_path(self, label, path):
73
self.urls.append((label, path))
75
def print_lines(self):
76
max_len = max(len(l) for l, u in self.urls)
77
for label, url in self.urls:
78
print " %*s: %s" % (max_len, label, url)
81
def gather_location_info(repository, branch=None, working=None):
63
83
repository_path = repository.bzrdir.root_transport.base
65
if working and branch:
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
66
93
working_path = working.bzrdir.root_transport.base
67
branch_path = branch.bzrdir.root_transport.base
68
94
if working_path != branch_path:
69
# lightweight checkout
70
print ' light checkout root: %s' % working_path
95
locs['light checkout root'] = working_path
96
if master_path != branch_path:
71
97
if repository.is_shared():
72
# lightweight checkout of branch in shared repository
73
print ' shared repository: %s' % repository_path
74
print ' repository branch: %s' % (
75
_repo_rel_url(repository_path, branch_path))
98
locs['repository checkout root'] = branch_path
77
# lightweight checkout of standalone branch
78
print ' checkout of branch: %s' % branch_path
100
locs['checkout root'] = branch_path
101
if working_path != master_path:
102
locs['checkout of branch'] = master_path
79
103
elif repository.is_shared():
80
# branch with tree inside shared repository
81
print ' shared repository: %s' % repository_path
82
print ' repository checkout: %s' % (
83
_repo_rel_url(repository_path, branch_path))
84
elif branch.get_bound_location():
86
print ' checkout root: %s' % working_path
87
print ' checkout of branch: %s' % branch.get_bound_location()
104
locs['repository branch'] = _repo_rel_url(repository_path,
106
elif branch_path is not None:
90
print ' branch root: %s' % working_path
92
branch_path = branch.bzrdir.root_transport.base
108
locs['branch root'] = branch_path
93
111
if repository.is_shared():
94
# branch is part of shared repository
95
print ' shared repository: %s' % repository_path
96
print ' repository branch: %s' % (
97
_repo_rel_url(repository_path, branch_path))
112
# lightweight checkout of branch in shared repository
113
if branch_path is not None:
114
locs['repository branch'] = _repo_rel_url(repository_path,
116
elif branch_path is not None:
118
locs['branch root'] = branch_path
119
if master_path != branch_path:
120
locs['bound to branch'] = master_path
100
print ' branch root: %s' % branch_path
103
assert repository.is_shared()
104
print ' shared repository: %s' % repository_path
122
locs['repository'] = repository_path
123
if repository.is_shared():
124
# lightweight checkout of branch in shared repository
125
locs['shared repository'] = repository_path
126
order = ['light checkout root', 'repository checkout root',
127
'checkout root', 'checkout of branch', 'shared repository',
128
'repository', 'repository branch', 'branch root',
130
return [(n, locs[n]) for n in order if n in locs]
133
def _show_location_info(locs):
134
"""Show known locations for working, branch and repository."""
136
path_list = _UrlList()
137
for name, loc in locs:
138
path_list.add_url(name, loc)
139
path_list.print_lines()
107
142
def _show_related_info(branch):
263
298
if 'size' in stats:
264
299
print ' %8d KiB' % (stats['size']/1024)
301
def show_bzrdir_info(a_bzrdir, verbose=False):
302
"""Output to stdout the 'info' for a_bzrdir."""
304
tree = a_bzrdir.open_workingtree(
305
recommend_upgrade=False)
306
except (NoWorkingTree, NotLocalUrl):
309
branch = a_bzrdir.open_branch()
310
except NotBranchError:
313
repository = a_bzrdir.open_repository()
314
except NoRepositoryPresent:
315
# Return silently; cmd_info already returned NotBranchError
316
# if no bzrdir could be opened.
319
lockable = repository
321
repository = branch.repository
325
repository = branch.repository
330
show_component_info(a_bzrdir, repository, branch, tree, verbose)
335
def show_component_info(control, repository, branch=None, working=None,
337
"""Write info about all bzrdir components to stdout"""
342
layout = describe_layout(repository, branch, working)
343
format = describe_format(control, repository, branch, working)
344
print "%s (format: %s)" % (layout, format)
345
_show_location_info(gather_location_info(repository, branch, working))
348
if branch is not None:
349
_show_related_info(branch)
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)
362
stats = repository.gather_stats()
363
if branch is None and working is None:
364
_show_repository_info(repository)
365
_show_repository_stats(stats)
368
def describe_layout(repository=None, branch=None, tree=None):
369
"""Convert a control directory layout into a user-understandable term
371
Common outputs include "Standalone tree", "Repository branch" and
372
"Checkout". Uncommon outputs include "Unshared repository with trees"
373
and "Empty control directory"
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'
381
phrase = 'Unshared repository'
382
if repository.make_working_trees():
383
phrase += ' with trees'
386
if repository.is_shared():
387
independence = "Repository "
389
independence = "Standalone "
394
if branch is None and tree is not None:
395
phrase = "branchless tree"
397
if (tree is not None and tree.bzrdir.root_transport.base !=
398
branch.bzrdir.root_transport.base):
400
phrase = "Lightweight checkout"
401
elif branch.get_bound_location() is not None:
402
if independence == 'Standalone ':
405
phrase = "Bound branch"
408
if independence != "":
409
phrase = phrase.lower()
410
return "%s%s" % (independence, phrase)
413
def describe_format(control, repository, branch, tree):
414
"""Determine the format of an existing control directory
416
Several candidates may be found. If so, the names are returned as a
417
single string, separated by ' or '.
419
If no matching candidate is found, "unnamed" is returned.
422
if (branch is not None and tree is not None and
423
branch.bzrdir.root_transport.base !=
424
tree.bzrdir.root_transport.base):
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 !=
433
if (branch and format.get_branch_format() !=
436
if (repository and format.repository_format !=
439
if format.__class__ is not control._format.__class__:
441
candidates.append(key)
442
if len(candidates) == 0:
444
new_candidates = [c for c in candidates if c != 'default']
445
if len(new_candidates) > 0:
446
candidates = new_candidates
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
451
return ' or '.join(candidates)
267
453
@deprecated_function(zero_eight)
268
454
def show_info(b):
270
456
return show_bzrdir_info(b.bzrdir)
273
def show_bzrdir_info(a_bzrdir, verbose=False):
274
"""Output to stdout the 'info' for a_bzrdir."""
276
working = a_bzrdir.open_workingtree(
277
recommend_upgrade=False)
280
show_tree_info(working, verbose)
284
except (NoWorkingTree, NotLocalUrl):
288
branch = a_bzrdir.open_branch()
291
show_branch_info(branch, verbose)
295
except NotBranchError:
299
repository = a_bzrdir.open_repository()
300
repository.lock_read()
302
show_repository_info(repository, verbose)
306
except NoRepositoryPresent:
309
# Return silently, cmd_info already returned NotBranchError if no bzrdir
459
@deprecated_function(zero_eighteen)
313
460
def show_tree_info(working, verbose):
314
461
"""Output to stdout the 'info' for working."""
315
462
branch = working.branch
316
463
repository = branch.repository
317
464
control = working.bzrdir
319
_show_location_info(repository, branch, working)
320
_show_related_info(branch)
321
_show_format_info(control, repository, branch, working)
322
_show_locking_info(repository, branch, working)
323
_show_missing_revisions_branch(branch)
324
_show_missing_revisions_working(working)
325
_show_working_stats(working)
326
stats = _show_branch_stats(branch, verbose)
327
_show_repository_stats(stats)
465
show_component_info(control, repository, branch, working, verbose)
468
@deprecated_function(zero_eighteen)
330
469
def show_branch_info(branch, verbose):
331
470
"""Output to stdout the 'info' for branch."""
332
471
repository = branch.repository
333
472
control = branch.bzrdir
335
_show_location_info(repository, branch)
336
_show_related_info(branch)
337
_show_format_info(control, repository, branch)
338
_show_locking_info(repository, branch)
339
_show_missing_revisions_branch(branch)
340
stats = _show_branch_stats(branch, verbose)
341
_show_repository_stats(stats)
473
show_component_info(control, repository, branch, verbose=verbose)
476
@deprecated_function(zero_eighteen)
344
477
def show_repository_info(repository, verbose):
345
478
"""Output to stdout the 'info' for repository."""
346
479
control = repository.bzrdir
348
_show_location_info(repository)
349
_show_format_info(control, repository)
350
_show_locking_info(repository)
351
_show_repository_info(repository)
352
stats = repository.gather_stats()
353
_show_repository_stats(stats)
480
show_component_info(control, repository, verbose=verbose)