76
77
return [" %*s: %s\n" % (max_len, l, u) for l, u in self.locs ]
79
def gather_location_info(repository, branch=None, working=None):
80
def gather_location_info(repository=None, branch=None, working=None,
81
repository_path = repository.user_url
82
83
if branch is not None:
83
84
branch_path = branch.user_url
84
85
master_path = branch.get_bound_location()
105
111
locs['branch root'] = branch_path
107
113
working_path = None
108
if repository.is_shared():
114
if repository is not None and repository.is_shared():
109
115
# lightweight checkout of branch in shared repository
110
116
if branch_path is not None:
111
117
locs['repository branch'] = branch_path
112
118
elif branch_path is not None:
114
120
locs['branch root'] = branch_path
115
if master_path != branch_path:
116
locs['bound to branch'] = master_path
121
elif repository is not None:
122
locs['repository'] = repository.user_url
123
elif control is not None:
124
locs['control directory'] = control.user_url
118
locs['repository'] = repository_path
119
if repository.is_shared():
126
# Really, at least a control directory should be
127
# passed in for this method to be useful.
129
if master_path != branch_path:
130
locs['bound to branch'] = master_path
131
if repository is not None and repository.is_shared():
120
132
# lightweight checkout of branch in shared repository
121
locs['shared repository'] = repository_path
122
order = ['light checkout root', 'repository checkout root',
123
'checkout root', 'checkout of branch', 'shared repository',
133
locs['shared repository'] = repository.user_url
134
order = ['control directory', 'light checkout root',
135
'repository checkout root', 'checkout root',
136
'checkout of branch', 'shared repository',
124
137
'repository', 'repository branch', 'branch root',
125
138
'bound to branch']
126
139
return [(n, locs[n]) for n in order if n in locs]
158
171
outfile.writelines(locs.get_lines())
174
def _show_control_dir_info(control, outfile):
175
"""Show control dir information."""
176
if control._format.colocated_branches:
178
outfile.write('Control directory:\n')
179
outfile.write(' %d branches\n' % len(control.list_branches()))
161
182
def _show_format_info(control=None, repository=None, branch=None,
162
183
working=None, outfile=None):
163
184
"""Show known formats for control, working, branch and repository."""
221
242
"""Show missing revisions in working tree."""
222
243
branch = working.branch
223
244
basis = working.basis_tree()
224
branch_revno, branch_last_revision = branch.last_revision_info()
246
branch_revno, branch_last_revision = branch.last_revision_info()
247
except errors.UnsupportedOperation:
226
250
tree_last_id = working.get_parent_ids()[0]
227
251
except IndexError:
269
293
def _show_branch_stats(branch, verbose, outfile):
270
294
"""Show statistics about a branch."""
271
revno, head = branch.last_revision_info()
296
revno, head = branch.last_revision_info()
297
except errors.UnsupportedOperation:
272
299
outfile.write('\n')
273
300
outfile.write('Branch history:\n')
274
301
outfile.write(' %8d revision%s\n' % (revno, plural(revno)))
321
348
tree = a_bzrdir.open_workingtree(
322
349
recommend_upgrade=False)
323
except (NoWorkingTree, NotLocalUrl):
350
except (NoWorkingTree, NotLocalUrl, NotBranchError):
326
353
branch = a_bzrdir.open_branch()
342
368
repository = branch.repository
371
if lockable is not None:
347
374
show_component_info(a_bzrdir, repository, branch, tree, verbose,
377
if lockable is not None:
353
381
def show_component_info(control, repository, branch=None, working=None,
360
388
if verbose is True:
362
layout = describe_layout(repository, branch, working)
390
layout = describe_layout(repository, branch, working, control)
363
391
format = describe_format(control, repository, branch, working)
364
392
outfile.write("%s (format: %s)\n" % (layout, format))
365
_show_location_info(gather_location_info(repository, branch, working),
394
gather_location_info(control=control, repository=repository,
395
branch=branch, working=working),
367
397
if branch is not None:
368
398
_show_related_info(branch, outfile)
371
401
_show_format_info(control, repository, branch, working, outfile)
372
402
_show_locking_info(repository, branch, working, outfile)
403
_show_control_dir_info(control, outfile)
373
404
if branch is not None:
374
405
_show_missing_revisions_branch(branch, outfile)
375
406
if working is not None:
387
418
_show_repository_stats(repository, stats, outfile)
390
def describe_layout(repository=None, branch=None, tree=None):
421
def describe_layout(repository=None, branch=None, tree=None, control=None):
391
422
"""Convert a control directory layout into a user-understandable term
393
424
Common outputs include "Standalone tree", "Repository branch" and
394
425
"Checkout". Uncommon outputs include "Unshared repository with trees"
395
426
and "Empty control directory"
428
if branch is None and control is not None:
430
branch_reference = control.get_branch_reference()
431
except NotBranchError:
434
if branch_reference is not None:
435
return "Dangling branch reference"
397
436
if repository is None:
398
437
return 'Empty control directory'
399
438
if branch is None and tree is None:
445
484
branch.user_url != tree.user_url):
447
486
repository = None
448
non_aliases = set(bzrdir.format_registry.keys())
449
non_aliases.difference_update(bzrdir.format_registry.aliases())
487
non_aliases = set(controldir.format_registry.keys())
488
non_aliases.difference_update(controldir.format_registry.aliases())
450
489
for key in non_aliases:
451
format = bzrdir.format_registry.make_bzrdir(key)
490
format = controldir.format_registry.make_bzrdir(key)
452
491
if isinstance(format, bzrdir.BzrDirMetaFormat1):
453
492
if (tree and format.workingtree_format !=
467
506
candidates.sort()
468
507
new_candidates = [c for c in candidates if not
469
bzrdir.format_registry.get_info(c).hidden]
508
controldir.format_registry.get_info(c).hidden]
470
509
if len(new_candidates) > 0:
471
510
# If there are any non-hidden formats that match, only return those to
472
511
# avoid listing hidden formats except when only a hidden format will