/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
1685.1.60 by Martin Pool
[broken] NotBranchError should unescape the url if possible
1
# Copyright (C) 2005, 2006 by Canonical Ltd
2
# 
77 by mbp at sourcefrog
- split info command out into separate file
3
# This program is free software; you can redistribute it and/or modify
4
# it under the terms of the GNU General Public License as published by
5
# the Free Software Foundation; either version 2 of the License, or
6
# (at your option) any later version.
1685.1.60 by Martin Pool
[broken] NotBranchError should unescape the url if possible
7
# 
77 by mbp at sourcefrog
- split info command out into separate file
8
# This program is distributed in the hope that it will be useful,
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11
# GNU General Public License for more details.
1685.1.60 by Martin Pool
[broken] NotBranchError should unescape the url if possible
12
# 
77 by mbp at sourcefrog
- split info command out into separate file
13
# You should have received a copy of the GNU General Public License
14
# along with this program; if not, write to the Free Software
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
16
1534.5.1 by Robert Collins
Give info some reasonable output and tests.
17
__all__ = ['show_bzrdir_info']
18
77 by mbp at sourcefrog
- split info command out into separate file
19
import time
20
1534.5.1 by Robert Collins
Give info some reasonable output and tests.
21
22
import bzrlib.diff as diff
1624.3.21 by Olaf Conradi
Make bzr info command work on both local and remote locations. Support
23
from bzrlib.errors import (NoWorkingTree, NotBranchError,
24
                           NoRepositoryPresent, NotLocalUrl)
1587.1.14 by Robert Collins
Make bound branch creation happen via 'checkout'
25
from bzrlib.missing import find_unmerged
1694.2.6 by Martin Pool
[merge] bzr.dev
26
import bzrlib.osutils as osutils
1534.5.1 by Robert Collins
Give info some reasonable output and tests.
27
from bzrlib.symbol_versioning import *
77 by mbp at sourcefrog
- split info command out into separate file
28
462 by Martin Pool
- New form 'file_id in tree' to check if the file is present
29
1563.2.28 by Robert Collins
Add total_size to the revision_store api.
30
def plural(n, base='', pl=None):
31
    if n == 1:
32
        return base
33
    elif pl != None:
34
        return pl
35
    else:
36
        return 's'
37
38
1694.2.6 by Martin Pool
[merge] bzr.dev
39
def _repo_relpath(repo_path, path):
40
    """Return path with common prefix of repository path removed.
41
42
    If path is not part of the repository, the original path is returned.
43
    If path is equal to the repository, the current directory marker '.' is
44
    returned.
45
    """
46
    path = osutils.normalizepath(path)
47
    repo_path = osutils.normalizepath(repo_path)
48
    if path == repo_path:
49
        return '.'
50
    if osutils.is_inside(repo_path, path):
51
        return osutils.relpath(repo_path, path)
52
    return path
53
54
55
def _show_location_info(repository, branch=None, working=None):
1624.3.21 by Olaf Conradi
Make bzr info command work on both local and remote locations. Support
56
    """Show known locations for working, branch and repository."""
1694.2.6 by Martin Pool
[merge] bzr.dev
57
    repository_path = repository.bzrdir.root_transport.base
1624.3.8 by Olaf Conradi
Adjust formatting. Start sections with a capital letter.
58
    print 'Location:'
1694.2.6 by Martin Pool
[merge] bzr.dev
59
    if working and branch:
60
        working_path = working.bzrdir.root_transport.base
61
        branch_path = branch.bzrdir.root_transport.base
62
        if working_path != branch_path:
63
            # lightweight checkout
64
            print '  light checkout root: %s' % working_path
65
            if repository.is_shared():
66
                # lightweight checkout of branch in shared repository
67
                print '    shared repository: %s' % repository_path
68
                print '    repository branch: %s' % (
69
                    _repo_relpath(repository_path, branch_path))
70
            else:
71
                # lightweight checkout of standalone branch
72
                print '   checkout of branch: %s' % branch_path
73
        elif repository.is_shared():
74
            # branch with tree inside shared repository
75
            print '    shared repository: %s' % repository_path
76
            print '  repository checkout: %s' % (
77
                _repo_relpath(repository_path, branch_path))
78
        elif branch.get_bound_location():
79
            # normal checkout
80
            print '       checkout root: %s' % working_path
81
            print '  checkout of branch: %s' % branch.get_bound_location()
82
        else:
83
            # standalone
84
            print '  branch root: %s' % working_path
1624.3.33 by Olaf Conradi
Simplified construct detection in location overview a lot.
85
    elif branch:
1694.2.6 by Martin Pool
[merge] bzr.dev
86
        # branch is part of shared repository
87
        assert repository.is_shared()
88
        branch_path = branch.bzrdir.root_transport.base
89
        print '  shared repository: %s' % repository_path
90
        print '  repository branch: %s' % (
91
            _repo_relpath(repository_path, branch_path))
92
    else:
93
        # shared repository
94
        assert repository.is_shared()
95
        print '  shared repository: %s' % repository_path
96
97
98
def _show_related_info(branch):
99
    """Show parent and push location of branch."""
100
    if branch.get_parent() or branch.get_push_location():
101
        print
102
        print 'Related branches:'
1624.3.21 by Olaf Conradi
Make bzr info command work on both local and remote locations. Support
103
        if branch.get_parent():
1694.2.6 by Martin Pool
[merge] bzr.dev
104
            if branch.get_push_location():
105
                print '      parent branch: %s' % branch.get_parent()
106
            else:
107
                print '  parent branch: %s' % branch.get_parent()
1624.3.21 by Olaf Conradi
Make bzr info command work on both local and remote locations. Support
108
        if branch.get_push_location():
1694.2.6 by Martin Pool
[merge] bzr.dev
109
            print '  publish to branch: %s' % branch.get_push_location()
1624.3.21 by Olaf Conradi
Make bzr info command work on both local and remote locations. Support
110
111
112
def _show_format_info(control=None, repository=None, branch=None, working=None):
113
    """Show known formats for control, working, branch and repository."""
1624.3.4 by Olaf Conradi
Simplify construct detection. Make terms in user interface consistent.
114
    print
1624.3.8 by Olaf Conradi
Adjust formatting. Start sections with a capital letter.
115
    print 'Format:'
1624.3.21 by Olaf Conradi
Make bzr info command work on both local and remote locations. Support
116
    if control:
117
        print '       control: %s' % control._format.get_format_description()
118
    if working:
119
        print '  working tree: %s' % working._format.get_format_description()
120
    if branch:
121
        print '        branch: %s' % branch._format.get_format_description()
122
    if repository:
123
        print '    repository: %s' % repository._format.get_format_description()
124
125
1694.2.6 by Martin Pool
[merge] bzr.dev
126
def _show_locking_info(repository, branch=None, working=None):
127
    """Show locking status of working, branch and repository."""
128
    if (repository.get_physical_lock_status() or
129
        (branch and branch.get_physical_lock_status()) or
130
        (working and working.get_physical_lock_status())):
131
        print
132
        print 'Lock status:'
133
        if working:
134
            if working.get_physical_lock_status():
135
                status = 'locked'
136
            else:
137
                status = 'unlocked'
138
            print '  working tree: %s' % status
139
        if branch:
140
            if branch.get_physical_lock_status():
141
                status = 'locked'
142
            else:
143
                status = 'unlocked'
144
            print '        branch: %s' % status
145
        if repository:
146
            if repository.get_physical_lock_status():
147
                status = 'locked'
148
            else:
149
                status = 'unlocked'
150
            print '    repository: %s' % status
151
152
1624.3.21 by Olaf Conradi
Make bzr info command work on both local and remote locations. Support
153
def _show_missing_revisions_branch(branch):
154
    """Show missing master revisions in branch."""
1587.1.14 by Robert Collins
Make bound branch creation happen via 'checkout'
155
    # Try with inaccessible branch ?
1624.3.2 by Olaf Conradi
Implemented table of constructs from BzrInfo specification.
156
    master = branch.get_master_branch()
1587.1.14 by Robert Collins
Make bound branch creation happen via 'checkout'
157
    if master:
1624.3.2 by Olaf Conradi
Implemented table of constructs from BzrInfo specification.
158
        local_extra, remote_extra = find_unmerged(branch, master)
1587.1.14 by Robert Collins
Make bound branch creation happen via 'checkout'
159
        if remote_extra:
1624.3.21 by Olaf Conradi
Make bzr info command work on both local and remote locations. Support
160
            print
1587.1.14 by Robert Collins
Make bound branch creation happen via 'checkout'
161
            print 'Branch is out of date: missing %d revision%s.' % (
162
                len(remote_extra), plural(len(remote_extra)))
1624.3.21 by Olaf Conradi
Make bzr info command work on both local and remote locations. Support
163
164
165
def _show_missing_revisions_working(working):
166
    """Show missing revisions in working tree."""
167
    branch = working.branch
168
    basis = working.basis_tree()
169
    work_inv = working.inventory
170
    delta = diff.compare_trees(basis, working, want_unchanged=True)
171
    history = branch.revision_history()
1624.3.11 by Olaf Conradi
Test cases exposed a bug in missing revisions count of working tree. It
172
    tree_last_id = working.last_revision()
1624.3.21 by Olaf Conradi
Make bzr info command work on both local and remote locations. Support
173
1624.3.11 by Olaf Conradi
Test cases exposed a bug in missing revisions count of working tree. It
174
    if len(history) and tree_last_id != history[-1]:
175
        tree_last_revno = branch.revision_id_to_revno(tree_last_id)
176
        missing_count = len(history) - tree_last_revno
1624.3.21 by Olaf Conradi
Make bzr info command work on both local and remote locations. Support
177
        print
1534.5.1 by Robert Collins
Give info some reasonable output and tests.
178
        print 'Working tree is out of date: missing %d revision%s.' % (
179
            missing_count, plural(missing_count))
1624.3.21 by Olaf Conradi
Make bzr info command work on both local and remote locations. Support
180
181
182
def _show_working_stats(working):
183
    """Show statistics about a working tree."""
184
    basis = working.basis_tree()
185
    work_inv = working.inventory
186
    delta = diff.compare_trees(basis, working, want_unchanged=True)
187
188
    print
1624.3.8 by Olaf Conradi
Adjust formatting. Start sections with a capital letter.
189
    print 'In the working tree:'
463 by Martin Pool
- compare_trees() also reports unchanged files
190
    print '  %8s unchanged' % len(delta.unchanged)
462 by Martin Pool
- New form 'file_id in tree' to check if the file is present
191
    print '  %8d modified' % len(delta.modified)
192
    print '  %8d added' % len(delta.added)
193
    print '  %8d removed' % len(delta.removed)
194
    print '  %8d renamed' % len(delta.renamed)
195
196
    ignore_cnt = unknown_cnt = 0
197
    for path in working.extras():
198
        if working.is_ignored(path):
199
            ignore_cnt += 1
200
        else:
201
            unknown_cnt += 1
202
    print '  %8d unknown' % unknown_cnt
203
    print '  %8d ignored' % ignore_cnt
204
205
    dir_cnt = 0
206
    for file_id in work_inv:
207
        if work_inv.get_file_kind(file_id) == 'directory':
208
            dir_cnt += 1
209
    print '  %8d versioned %s' \
210
          % (dir_cnt,
211
             plural(dir_cnt, 'subdirectory', 'subdirectories'))
77 by mbp at sourcefrog
- split info command out into separate file
212
1624.3.21 by Olaf Conradi
Make bzr info command work on both local and remote locations. Support
213
214
def _show_branch_stats(branch, verbose):
215
    """Show statistics about a branch."""
216
    repository = branch.repository
217
    history = branch.revision_history()
218
77 by mbp at sourcefrog
- split info command out into separate file
219
    print
1624.3.8 by Olaf Conradi
Adjust formatting. Start sections with a capital letter.
220
    print 'Branch history:'
77 by mbp at sourcefrog
- split info command out into separate file
221
    revno = len(history)
111 by mbp at sourcefrog
Make fields wider in 'bzr info' output to accomodate big trees
222
    print '  %8d revision%s' % (revno, plural(revno))
1624.3.21 by Olaf Conradi
Make bzr info command work on both local and remote locations. Support
223
    if verbose:
224
        committers = {}
225
        for rev in history:
226
            committers[repository.get_revision(rev).committer] = True
227
        print '  %8d committer%s' % (len(committers), plural(len(committers)))
77 by mbp at sourcefrog
- split info command out into separate file
228
    if revno > 0:
1624.3.17 by Olaf Conradi
Remove indirection in branch.repository as it is available as repository
229
        firstrev = repository.get_revision(history[0])
77 by mbp at sourcefrog
- split info command out into separate file
230
        age = int((time.time() - firstrev.timestamp) / 3600 / 24)
111 by mbp at sourcefrog
Make fields wider in 'bzr info' output to accomodate big trees
231
        print '  %8d day%s old' % (age, plural(age))
1694.2.6 by Martin Pool
[merge] bzr.dev
232
        print '   first revision: %s' % osutils.format_date(firstrev.timestamp,
233
                                                            firstrev.timezone)
77 by mbp at sourcefrog
- split info command out into separate file
234
1624.3.17 by Olaf Conradi
Remove indirection in branch.repository as it is available as repository
235
        lastrev = repository.get_revision(history[-1])
1694.2.6 by Martin Pool
[merge] bzr.dev
236
        print '  latest revision: %s' % osutils.format_date(lastrev.timestamp,
237
                                                            lastrev.timezone)
80 by mbp at sourcefrog
show_info: Show number of entries in the branch stores
238
1286 by Martin Pool
- stub out display of store size in info command
239
#     print
1624.3.8 by Olaf Conradi
Adjust formatting. Start sections with a capital letter.
240
#     print 'Text store:'
1624.3.2 by Olaf Conradi
Implemented table of constructs from BzrInfo specification.
241
#     c, t = branch.text_store.total_size()
1286 by Martin Pool
- stub out display of store size in info command
242
#     print '  %8d file texts' % c
1624.3.14 by Olaf Conradi
Move to using kibi for binary prefix as per standard IEEE 1541.
243
#     print '  %8d KiB' % (t/1024)
80 by mbp at sourcefrog
show_info: Show number of entries in the branch stores
244
1286 by Martin Pool
- stub out display of store size in info command
245
#     print
1624.3.8 by Olaf Conradi
Adjust formatting. Start sections with a capital letter.
246
#     print 'Inventory store:'
1624.3.2 by Olaf Conradi
Implemented table of constructs from BzrInfo specification.
247
#     c, t = branch.inventory_store.total_size()
1286 by Martin Pool
- stub out display of store size in info command
248
#     print '  %8d inventories' % c
1624.3.14 by Olaf Conradi
Move to using kibi for binary prefix as per standard IEEE 1541.
249
#     print '  %8d KiB' % (t/1024)
1624.3.21 by Olaf Conradi
Make bzr info command work on both local and remote locations. Support
250
251
252
def _show_repository_info(repository):
253
    """Show settings of a repository."""
254
    if repository.make_working_trees():
255
        print
256
        print 'Create working tree for new branches inside the repository.'
257
258
259
def _show_repository_stats(repository):
260
    """Show statistics about a repository."""
261
    if repository.bzrdir.root_transport.listable():
262
        print
263
        print 'Revision store:'
264
        c, t = repository._revision_store.total_size(repository.get_transaction())
265
        print '  %8d revision%s' % (c, plural(c))
266
        print '  %8d KiB' % (t/1024)
267
268
269
@deprecated_function(zero_eight)
270
def show_info(b):
271
    """Please see show_bzrdir_info."""
272
    return show_bzrdir_info(b.bzrdir)
273
274
275
def show_bzrdir_info(a_bzrdir, verbose=False):
276
    """Output to stdout the 'info' for a_bzrdir."""
277
    try:
278
        working = a_bzrdir.open_workingtree()
1624.3.35 by Olaf Conradi
Implemented locking status for formats using LockDir.
279
        working.lock_read()
280
        try:
281
            show_tree_info(working, verbose)
282
        finally:
283
            working.unlock()
1624.3.21 by Olaf Conradi
Make bzr info command work on both local and remote locations. Support
284
        return
285
    except (NoWorkingTree, NotLocalUrl):
286
        pass
287
288
    try:
289
        branch = a_bzrdir.open_branch()
1624.3.35 by Olaf Conradi
Implemented locking status for formats using LockDir.
290
        branch.lock_read()
291
        try:
292
            show_branch_info(branch, verbose)
293
        finally:
294
            branch.unlock()
1624.3.21 by Olaf Conradi
Make bzr info command work on both local and remote locations. Support
295
        return
296
    except NotBranchError:
297
        pass
298
299
    try:
300
        repository = a_bzrdir.open_repository()
1624.3.35 by Olaf Conradi
Implemented locking status for formats using LockDir.
301
        repository.lock_read()
302
        try:
303
            show_repository_info(repository, verbose)
304
        finally:
305
            repository.unlock()
1624.3.21 by Olaf Conradi
Make bzr info command work on both local and remote locations. Support
306
        return
307
    except NoRepositoryPresent:
308
        pass
309
1694.2.6 by Martin Pool
[merge] bzr.dev
310
    # Return silently, cmd_info already returned NotBranchError if no bzrdir
1624.3.21 by Olaf Conradi
Make bzr info command work on both local and remote locations. Support
311
    # could be opened.
312
313
314
def show_tree_info(working, verbose):
315
    """Output to stdout the 'info' for working."""
316
    branch = working.branch
317
    repository = branch.repository
318
    control = working.bzrdir
319
320
    _show_location_info(repository, branch, working)
1694.2.6 by Martin Pool
[merge] bzr.dev
321
    _show_related_info(branch)
1624.3.21 by Olaf Conradi
Make bzr info command work on both local and remote locations. Support
322
    _show_format_info(control, repository, branch, working)
1694.2.6 by Martin Pool
[merge] bzr.dev
323
    _show_locking_info(repository, branch, working)
1624.3.21 by Olaf Conradi
Make bzr info command work on both local and remote locations. Support
324
    _show_missing_revisions_branch(branch)
325
    _show_missing_revisions_working(working)
326
    _show_working_stats(working)
327
    _show_branch_stats(branch, verbose)
328
    _show_repository_stats(repository)
329
330
331
def show_branch_info(branch, verbose):
332
    """Output to stdout the 'info' for branch."""
333
    repository = branch.repository
334
    control = branch.bzrdir
335
336
    _show_location_info(repository, branch)
1694.2.6 by Martin Pool
[merge] bzr.dev
337
    _show_related_info(branch)
1624.3.21 by Olaf Conradi
Make bzr info command work on both local and remote locations. Support
338
    _show_format_info(control, repository, branch)
1694.2.6 by Martin Pool
[merge] bzr.dev
339
    _show_locking_info(repository, branch)
1624.3.21 by Olaf Conradi
Make bzr info command work on both local and remote locations. Support
340
    _show_missing_revisions_branch(branch)
341
    _show_branch_stats(branch, verbose)
342
    _show_repository_stats(repository)
343
344
345
def show_repository_info(repository, verbose):
1694.2.6 by Martin Pool
[merge] bzr.dev
346
    """Output to stdout the 'info' for repository."""
1624.3.21 by Olaf Conradi
Make bzr info command work on both local and remote locations. Support
347
    control = repository.bzrdir
348
349
    _show_location_info(repository)
350
    _show_format_info(control, repository)
1694.2.6 by Martin Pool
[merge] bzr.dev
351
    _show_locking_info(repository)
1624.3.21 by Olaf Conradi
Make bzr info command work on both local and remote locations. Support
352
    _show_repository_info(repository)
353
    _show_repository_stats(repository)