128
128
return [(n, locs[n]) for n in order if n in locs]
131
def _show_location_info(locs, outfile):
131
def _show_location_info(locs):
132
132
"""Show known locations for working, branch and repository."""
133
outfile.write('Location:\n')
134
path_list = LocationList(osutils.getcwd())
134
path_list = LocationList(os.getcwd())
135
135
for name, loc in locs:
136
136
path_list.add_url(name, loc)
137
outfile.writelines(path_list.get_lines())
137
sys.stdout.writelines(path_list.get_lines())
140
139
def _gather_related_branches(branch):
141
locs = LocationList(osutils.getcwd())
140
locs = LocationList(os.getcwd())
142
141
locs.add_url('public branch', branch.get_public_branch())
143
142
locs.add_url('push branch', branch.get_push_location())
144
143
locs.add_url('parent branch', branch.get_parent())
145
144
locs.add_url('submit branch', branch.get_submit_branch())
147
locs.add_url('stacked on', branch.get_stacked_on_url())
148
except (errors.UnstackableBranchFormat, errors.UnstackableRepositoryFormat,
154
147
def _show_related_info(branch, outfile):
155
148
"""Show parent and push location of branch."""
156
149
locs = _gather_related_branches(branch)
157
150
if len(locs.locs) > 0:
159
outfile.write('Related branches:\n')
152
print >> outfile, 'Related branches:'
160
153
outfile.writelines(locs.get_lines())
163
def _show_format_info(control=None, repository=None, branch=None,
164
working=None, outfile=None):
156
def _show_format_info(control=None, repository=None, branch=None, working=None):
165
157
"""Show known formats for control, working, branch and repository."""
167
outfile.write('Format:\n')
169
outfile.write(' control: %s\n' %
170
control._format.get_format_description())
161
print ' control: %s' % control._format.get_format_description()
172
outfile.write(' working tree: %s\n' %
173
working._format.get_format_description())
163
print ' working tree: %s' % working._format.get_format_description()
175
outfile.write(' branch: %s\n' %
176
branch._format.get_format_description())
165
print ' branch: %s' % branch._format.get_format_description()
178
outfile.write(' repository: %s\n' %
179
repository._format.get_format_description())
182
def _show_locking_info(repository, branch=None, working=None, outfile=None):
167
print ' repository: %s' % repository._format.get_format_description()
170
def _show_locking_info(repository, branch=None, working=None):
183
171
"""Show locking status of working, branch and repository."""
184
172
if (repository.get_physical_lock_status() or
185
173
(branch and branch.get_physical_lock_status()) or
186
174
(working and working.get_physical_lock_status())):
188
outfile.write('Lock status:\n')
190
178
if working.get_physical_lock_status():
191
179
status = 'locked'
193
181
status = 'unlocked'
194
outfile.write(' working tree: %s\n' % status)
182
print ' working tree: %s' % status
196
184
if branch.get_physical_lock_status():
197
185
status = 'locked'
199
187
status = 'unlocked'
200
outfile.write(' branch: %s\n' % status)
188
print ' branch: %s' % status
202
190
if repository.get_physical_lock_status():
203
191
status = 'locked'
205
193
status = 'unlocked'
206
outfile.write(' repository: %s\n' % status)
209
def _show_missing_revisions_branch(branch, outfile):
194
print ' repository: %s' % status
197
def _show_missing_revisions_branch(branch):
210
198
"""Show missing master revisions in branch."""
211
199
# Try with inaccessible branch ?
212
200
master = branch.get_master_branch()
214
202
local_extra, remote_extra = find_unmerged(branch, master)
217
outfile.write(('Branch is out of date: missing %d '
218
'revision%s.\n') % (len(remote_extra),
219
plural(len(remote_extra))))
222
def _show_missing_revisions_working(working, outfile):
205
print 'Branch is out of date: missing %d revision%s.' % (
206
len(remote_extra), plural(len(remote_extra)))
209
def _show_missing_revisions_working(working):
223
210
"""Show missing revisions in working tree."""
224
211
branch = working.branch
225
212
basis = working.basis_tree()
233
220
if branch_revno and tree_last_id != branch_last_revision:
234
221
tree_last_revno = branch.revision_id_to_revno(tree_last_id)
235
222
missing_count = branch_revno - tree_last_revno
237
outfile.write(('Working tree is out of date: missing %d '
238
'revision%s.\n') % (missing_count, plural(missing_count)))
241
def _show_working_stats(working, outfile):
224
print 'Working tree is out of date: missing %d revision%s.' % (
225
missing_count, plural(missing_count))
228
def _show_working_stats(working):
242
229
"""Show statistics about a working tree."""
243
230
basis = working.basis_tree()
244
231
work_inv = working.inventory
245
232
delta = working.changes_from(basis, want_unchanged=True)
248
outfile.write('In the working tree:\n')
249
outfile.write(' %8s unchanged\n' % len(delta.unchanged))
250
outfile.write(' %8d modified\n' % len(delta.modified))
251
outfile.write(' %8d added\n' % len(delta.added))
252
outfile.write(' %8d removed\n' % len(delta.removed))
253
outfile.write(' %8d renamed\n' % len(delta.renamed))
235
print 'In the working tree:'
236
print ' %8s unchanged' % len(delta.unchanged)
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)
255
242
ignore_cnt = unknown_cnt = 0
256
243
for path in working.extras():
261
outfile.write(' %8d unknown\n' % unknown_cnt)
262
outfile.write(' %8d ignored\n' % ignore_cnt)
248
print ' %8d unknown' % unknown_cnt
249
print ' %8d ignored' % ignore_cnt
265
252
for file_id in work_inv:
266
if (work_inv.get_file_kind(file_id) == 'directory' and
253
if (work_inv.get_file_kind(file_id) == 'directory' and
267
254
not work_inv.is_root(file_id)):
269
outfile.write(' %8d versioned %s\n' % (dir_cnt,
270
plural(dir_cnt, 'subdirectory', 'subdirectories')))
273
def _show_branch_stats(branch, verbose, outfile):
256
print ' %8d versioned %s' \
258
plural(dir_cnt, 'subdirectory', 'subdirectories'))
261
def _show_branch_stats(branch, verbose):
274
262
"""Show statistics about a branch."""
275
263
revno, head = branch.last_revision_info()
277
outfile.write('Branch history:\n')
278
outfile.write(' %8d revision%s\n' % (revno, plural(revno)))
265
print 'Branch history:'
266
print ' %8d revision%s' % (revno, plural(revno))
279
267
stats = branch.repository.gather_stats(head, committers=verbose)
281
269
committers = stats['committers']
282
outfile.write(' %8d committer%s\n' % (committers,
270
print ' %8d committer%s' % (committers, plural(committers))
285
272
timestamp, timezone = stats['firstrev']
286
273
age = int((time.time() - timestamp) / 3600 / 24)
287
outfile.write(' %8d day%s old\n' % (age, plural(age)))
288
outfile.write(' first revision: %s\n' %
289
osutils.format_date(timestamp, timezone))
274
print ' %8d day%s old' % (age, plural(age))
275
print ' first revision: %s' % osutils.format_date(timestamp,
290
277
timestamp, timezone = stats['latestrev']
291
outfile.write(' latest revision: %s\n' %
292
osutils.format_date(timestamp, timezone))
278
print ' latest revision: %s' % osutils.format_date(timestamp,
296
def _show_repository_info(repository, outfile):
283
def _show_repository_info(repository):
297
284
"""Show settings of a repository."""
298
285
if repository.make_working_trees():
300
outfile.write('Create working tree for new branches inside '
304
def _show_repository_stats(repository, stats, outfile):
287
print 'Create working tree for new branches inside the repository.'
290
def _show_repository_stats(stats):
305
291
"""Show statistics about a repository."""
292
if 'revisions' in stats or 'size' in stats:
307
295
if 'revisions' in stats:
308
296
revisions = stats['revisions']
309
f.write(' %8d revision%s\n' % (revisions, plural(revisions)))
297
print ' %8d revision%s' % (revisions, plural(revisions))
310
298
if 'size' in stats:
311
f.write(' %8d KiB\n' % (stats['size']/1024))
312
for hook in hooks['repository']:
313
hook(repository, stats, f)
314
if f.getvalue() != "":
316
outfile.write('Repository:\n')
317
outfile.write(f.getvalue())
320
def show_bzrdir_info(a_bzrdir, verbose=False, outfile=None):
299
print ' %8d KiB' % (stats['size']/1024)
301
def show_bzrdir_info(a_bzrdir, verbose=False):
321
302
"""Output to stdout the 'info' for a_bzrdir."""
325
304
tree = a_bzrdir.open_workingtree(
326
305
recommend_upgrade=False)
349
328
lockable.lock_read()
351
show_component_info(a_bzrdir, repository, branch, tree, verbose,
330
show_component_info(a_bzrdir, repository, branch, tree, verbose)
354
332
lockable.unlock()
357
335
def show_component_info(control, repository, branch=None, working=None,
358
verbose=1, outfile=None):
359
337
"""Write info about all bzrdir components to stdout"""
362
338
if verbose is False:
364
340
if verbose is True:
366
342
layout = describe_layout(repository, branch, working)
367
343
format = describe_format(control, repository, branch, working)
368
outfile.write("%s (format: %s)\n" % (layout, format))
369
_show_location_info(gather_location_info(repository, branch, working),
344
print "%s (format: %s)" % (layout, format)
345
_show_location_info(gather_location_info(repository, branch, working))
371
346
if branch is not None:
372
_show_related_info(branch, outfile)
347
_show_related_info(branch, sys.stdout)
375
_show_format_info(control, repository, branch, working, outfile)
376
_show_locking_info(repository, branch, working, outfile)
350
_show_format_info(control, repository, branch, working)
351
_show_locking_info(repository, branch, working)
377
352
if branch is not None:
378
_show_missing_revisions_branch(branch, outfile)
353
_show_missing_revisions_branch(branch)
379
354
if working is not None:
380
_show_missing_revisions_working(working, outfile)
381
_show_working_stats(working, outfile)
355
_show_missing_revisions_working(working)
356
_show_working_stats(working)
382
357
elif branch is not None:
383
_show_missing_revisions_branch(branch, outfile)
358
_show_missing_revisions_branch(branch)
384
359
if branch is not None:
385
show_committers = verbose >= 2
386
stats = _show_branch_stats(branch, show_committers, outfile)
360
stats = _show_branch_stats(branch, verbose==2)
388
362
stats = repository.gather_stats()
389
363
if branch is None and working is None:
390
_show_repository_info(repository, outfile)
391
_show_repository_stats(repository, stats, outfile)
364
_show_repository_info(repository)
365
_show_repository_stats(stats)
394
368
def describe_layout(repository=None, branch=None, tree=None):
469
441
candidates.append(key)
470
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
473
447
new_candidates = [c for c in candidates if not
474
448
bzrdir.format_registry.get_info(c).hidden]
475
449
if len(new_candidates) > 0:
476
# If there are any non-hidden formats that match, only return those to
477
# avoid listing hidden formats except when only a hidden format will
479
450
candidates = new_candidates
480
451
return ' or '.join(candidates)
483
class InfoHooks(_mod_hooks.Hooks):
484
"""Hooks for the info command."""
487
self.create_hook(_mod_hooks.HookPoint('repository',
488
"Invoked when displaying the statistics for a repository. "
489
"repository is called with a statistics dictionary as returned "
490
"by the repository and a file-like object to write to.", (1, 15),
453
@deprecated_function(zero_eight)
455
"""Please see show_bzrdir_info."""
456
return show_bzrdir_info(b.bzrdir)
459
@deprecated_function(zero_eighteen)
460
def show_tree_info(working, verbose):
461
"""Output to stdout the 'info' for working."""
462
branch = working.branch
463
repository = branch.repository
464
control = working.bzrdir
465
show_component_info(control, repository, branch, working, verbose)
468
@deprecated_function(zero_eighteen)
469
def show_branch_info(branch, verbose):
470
"""Output to stdout the 'info' for branch."""
471
repository = branch.repository
472
control = branch.bzrdir
473
show_component_info(control, repository, branch, verbose=verbose)
476
@deprecated_function(zero_eighteen)
477
def show_repository_info(repository, verbose):
478
"""Output to stdout the 'info' for repository."""
479
control = repository.bzrdir
480
show_component_info(control, repository, verbose=verbose)