1
# Copyright (C) 2005, 2006 by Canonical Ltd
1
# Copyright (C) 2005, 2006 Canonical Ltd
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
5
5
# the Free Software Foundation; either version 2 of the License, or
6
6
# (at your option) any later version.
8
8
# This program is distributed in the hope that it will be useful,
9
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
10
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11
11
# GNU General Public License for more details.
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
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
22
import bzrlib.diff as diff
23
27
from bzrlib.errors import (NoWorkingTree, NotBranchError,
24
28
NoRepositoryPresent, NotLocalUrl)
25
29
from bzrlib.missing import find_unmerged
26
import bzrlib.osutils as osutils
27
from bzrlib.symbol_versioning import (deprecated_function,
30
from bzrlib.symbol_versioning import (deprecated_function,
40
def _repo_relpath(repo_path, path):
43
def _repo_rel_url(repo_url, inner_url):
41
44
"""Return path with common prefix of repository path removed.
43
46
If path is not part of the repository, the original path is returned.
44
47
If path is equal to the repository, the current directory marker '.' is
49
Otherwise, a relative path is returned, with trailing '/' stripped.
47
path = osutils.normalizepath(path)
48
repo_path = osutils.normalizepath(repo_path)
51
inner_url = urlutils.normalize_url(inner_url)
52
repo_url = urlutils.normalize_url(repo_url)
53
if inner_url == repo_url:
51
if osutils.is_inside(repo_path, path):
52
return osutils.relpath(repo_path, path)
55
result = urlutils.relative_url(repo_url, inner_url)
56
if result != inner_url:
57
result = result.rstrip('/')
56
61
def _show_location_info(repository, branch=None, working=None):
67
72
# lightweight checkout of branch in shared repository
68
73
print ' shared repository: %s' % repository_path
69
74
print ' repository branch: %s' % (
70
_repo_relpath(repository_path, branch_path))
75
_repo_rel_url(repository_path, branch_path))
72
77
# lightweight checkout of standalone branch
73
78
print ' checkout of branch: %s' % branch_path
75
80
# branch with tree inside shared repository
76
81
print ' shared repository: %s' % repository_path
77
82
print ' repository checkout: %s' % (
78
_repo_relpath(repository_path, branch_path))
83
_repo_rel_url(repository_path, branch_path))
79
84
elif branch.get_bound_location():
81
86
print ' checkout root: %s' % working_path
89
94
# branch is part of shared repository
90
95
print ' shared repository: %s' % repository_path
91
96
print ' repository branch: %s' % (
92
_repo_relpath(repository_path, branch_path))
97
_repo_rel_url(repository_path, branch_path))
94
99
# standalone branch
95
100
print ' branch root: %s' % branch_path
171
176
branch = working.branch
172
177
basis = working.basis_tree()
173
178
work_inv = working.inventory
174
delta = working.changes_from(basis, want_unchanged=True)
175
history = branch.revision_history()
179
branch_revno, branch_last_revision = branch.last_revision_info()
177
181
tree_last_id = working.get_parent_ids()[0]
178
182
except IndexError:
179
183
tree_last_id = None
181
if len(history) and tree_last_id != history[-1]:
185
if branch_revno and tree_last_id != branch_last_revision:
182
186
tree_last_revno = branch.revision_id_to_revno(tree_last_id)
183
missing_count = len(history) - tree_last_revno
187
missing_count = branch_revno - tree_last_revno
185
189
print 'Working tree is out of date: missing %d revision%s.' % (
186
190
missing_count, plural(missing_count))
210
214
print ' %8d ignored' % ignore_cnt
213
entries = work_inv.iter_entries()
215
dir_cnt = sum(1 for path, ie in entries if ie.kind == 'directory')
217
for file_id in work_inv:
218
if (work_inv.get_file_kind(file_id) == 'directory' and
219
not work_inv.is_root(file_id)):
216
221
print ' %8d versioned %s' \
218
223
plural(dir_cnt, 'subdirectory', 'subdirectories'))
221
226
def _show_branch_stats(branch, verbose):
222
227
"""Show statistics about a branch."""
223
repository = branch.repository
224
history = branch.revision_history()
228
revno, head = branch.last_revision_info()
227
230
print 'Branch history:'
229
231
print ' %8d revision%s' % (revno, plural(revno))
232
stats = branch.repository.gather_stats(head, committers=verbose)
233
committers[repository.get_revision(rev).committer] = True
234
print ' %8d committer%s' % (len(committers), plural(len(committers)))
236
firstrev = repository.get_revision(history[0])
237
age = int((time.time() - firstrev.timestamp) / 3600 / 24)
234
committers = stats['committers']
235
print ' %8d committer%s' % (committers, plural(committers))
237
timestamp, timezone = stats['firstrev']
238
age = int((time.time() - timestamp) / 3600 / 24)
238
239
print ' %8d day%s old' % (age, plural(age))
239
print ' first revision: %s' % osutils.format_date(firstrev.timestamp,
242
lastrev = repository.get_revision(history[-1])
243
print ' latest revision: %s' % osutils.format_date(lastrev.timestamp,
247
# print 'Text store:'
248
# c, t = branch.text_store.total_size()
249
# print ' %8d file texts' % c
250
# print ' %8d KiB' % (t/1024)
253
# print 'Inventory store:'
254
# c, t = branch.inventory_store.total_size()
255
# print ' %8d inventories' % c
256
# print ' %8d KiB' % (t/1024)
240
print ' first revision: %s' % osutils.format_date(timestamp,
242
timestamp, timezone = stats['latestrev']
243
print ' latest revision: %s' % osutils.format_date(timestamp,
259
248
def _show_repository_info(repository):
263
252
print 'Create working tree for new branches inside the repository.'
266
def _show_repository_stats(repository):
255
def _show_repository_stats(stats):
267
256
"""Show statistics about a repository."""
268
if repository.bzrdir.root_transport.listable():
257
if 'revisions' in stats or 'size' in stats:
270
259
print 'Revision store:'
271
c, t = repository._revision_store.total_size(repository.get_transaction())
272
print ' %8d revision%s' % (c, plural(c))
273
print ' %8d KiB' % (t/1024)
260
if 'revisions' in stats:
261
revisions = stats['revisions']
262
print ' %8d revision%s' % (revisions, plural(revisions))
264
print ' %8d KiB' % (stats['size']/1024)
276
267
@deprecated_function(zero_eight)
331
322
_show_missing_revisions_branch(branch)
332
323
_show_missing_revisions_working(working)
333
324
_show_working_stats(working)
334
_show_branch_stats(branch, verbose)
335
_show_repository_stats(repository)
325
stats = _show_branch_stats(branch, verbose)
326
_show_repository_stats(stats)
338
329
def show_branch_info(branch, verbose):
345
336
_show_format_info(control, repository, branch)
346
337
_show_locking_info(repository, branch)
347
338
_show_missing_revisions_branch(branch)
348
_show_branch_stats(branch, verbose)
349
_show_repository_stats(repository)
339
stats = _show_branch_stats(branch, verbose)
340
_show_repository_stats(stats)
352
343
def show_repository_info(repository, verbose):
357
348
_show_format_info(control, repository)
358
349
_show_locking_info(repository)
359
350
_show_repository_info(repository)
360
_show_repository_stats(repository)
351
stats = repository.gather_stats()
352
_show_repository_stats(stats)