~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/info.py

  • Committer: Aaron Bentley
  • Date: 2007-02-06 14:52:16 UTC
  • mfrom: (2266 +trunk)
  • mto: This revision was merged to the branch mainline in revision 2268.
  • Revision ID: abentley@panoramicfeedback.com-20070206145216-fcpi8o3ufvuzwbp9
Merge bzr.dev

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2005, 2006 by Canonical Ltd
 
1
# Copyright (C) 2005, 2006 Canonical Ltd
2
2
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.
7
 
 
7
#
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.
12
 
 
12
#
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
19
19
import time
20
20
 
21
21
 
22
 
import bzrlib.diff as diff
 
22
from bzrlib import (
 
23
    diff,
 
24
    osutils,
 
25
    urlutils,
 
26
    )
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,
28
31
        zero_eight)
29
32
 
30
33
 
37
40
        return 's'
38
41
 
39
42
 
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.
42
45
 
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
45
48
    returned.
 
49
    Otherwise, a relative path is returned, with trailing '/' stripped.
46
50
    """
47
 
    path = osutils.normalizepath(path)
48
 
    repo_path = osutils.normalizepath(repo_path)
49
 
    if path == repo_path:
 
51
    inner_url = urlutils.normalize_url(inner_url)
 
52
    repo_url = urlutils.normalize_url(repo_url)
 
53
    if inner_url == repo_url:
50
54
        return '.'
51
 
    if osutils.is_inside(repo_path, path):
52
 
        return osutils.relpath(repo_path, path)
53
 
    return path
 
55
    result = urlutils.relative_url(repo_url, inner_url)
 
56
    if result != inner_url:
 
57
        result = result.rstrip('/')
 
58
    return result
54
59
 
55
60
 
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))
71
76
            else:
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():
80
85
            # normal checkout
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))
93
98
        else:
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()
176
180
    try:
177
181
        tree_last_id = working.get_parent_ids()[0]
178
182
    except IndexError:
179
183
        tree_last_id = None
180
184
 
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
184
188
        print
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
211
215
 
212
216
    dir_cnt = 0
213
 
    entries = work_inv.iter_entries()
214
 
    entries.next()
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)):
 
220
            dir_cnt += 1
216
221
    print '  %8d versioned %s' \
217
222
          % (dir_cnt,
218
223
             plural(dir_cnt, 'subdirectory', 'subdirectories'))
220
225
 
221
226
def _show_branch_stats(branch, verbose):
222
227
    """Show statistics about a branch."""
223
 
    repository = branch.repository
224
 
    history = branch.revision_history()
225
 
 
 
228
    revno, head = branch.last_revision_info()
226
229
    print
227
230
    print 'Branch history:'
228
 
    revno = len(history)
229
231
    print '  %8d revision%s' % (revno, plural(revno))
 
232
    stats = branch.repository.gather_stats(head, committers=verbose)
230
233
    if verbose:
231
 
        committers = {}
232
 
        for rev in history:
233
 
            committers[repository.get_revision(rev).committer] = True
234
 
        print '  %8d committer%s' % (len(committers), plural(len(committers)))
235
 
    if revno > 0:
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))
 
236
    if revno:
 
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,
240
 
                                                            firstrev.timezone)
241
 
 
242
 
        lastrev = repository.get_revision(history[-1])
243
 
        print '  latest revision: %s' % osutils.format_date(lastrev.timestamp,
244
 
                                                            lastrev.timezone)
245
 
 
246
 
#     print
247
 
#     print 'Text store:'
248
 
#     c, t = branch.text_store.total_size()
249
 
#     print '  %8d file texts' % c
250
 
#     print '  %8d KiB' % (t/1024)
251
 
 
252
 
#     print
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,
 
241
            timezone)
 
242
        timestamp, timezone = stats['latestrev']
 
243
        print '  latest revision: %s' % osutils.format_date(timestamp,
 
244
            timezone)
 
245
    return stats
257
246
 
258
247
 
259
248
def _show_repository_info(repository):
263
252
        print 'Create working tree for new branches inside the repository.'
264
253
 
265
254
 
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:
269
258
        print
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))
 
263
    if 'size' in stats:
 
264
        print '  %8d KiB' % (stats['size']/1024)
274
265
 
275
266
 
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)
336
327
 
337
328
 
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)
350
341
 
351
342
 
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)