/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar

« back to all changes in this revision

Viewing changes to bzrlib/info.py

  • Committer: John Arbash Meinel
  • Date: 2007-07-11 23:45:20 UTC
  • mfrom: (2601 +trunk)
  • mto: This revision was merged to the branch mainline in revision 2643.
  • Revision ID: john@arbash-meinel.com-20070711234520-do3h7zw8skbathpz
[merge] bzr.dev 2601

Show diffs side-by-side

added added

removed removed

Lines of Context:
16
16
 
17
17
__all__ = ['show_bzrdir_info']
18
18
 
 
19
import os
19
20
import time
20
 
 
 
21
import sys
21
22
 
22
23
from bzrlib import (
 
24
    bzrdir,
23
25
    diff,
 
26
    errors,
24
27
    osutils,
25
28
    urlutils,
26
29
    )
28
31
                           NoRepositoryPresent, NotLocalUrl)
29
32
from bzrlib.missing import find_unmerged
30
33
from bzrlib.symbol_versioning import (deprecated_function,
31
 
        zero_eight)
 
34
        zero_eight, zero_eighteen)
32
35
 
33
36
 
34
37
def plural(n, base='', pl=None):
40
43
        return 's'
41
44
 
42
45
 
43
 
def _repo_rel_url(repo_url, inner_url):
44
 
    """Return path with common prefix of repository path removed.
45
 
 
46
 
    If path is not part of the repository, the original path is returned.
47
 
    If path is equal to the repository, the current directory marker '.' is
48
 
    returned.
49
 
    Otherwise, a relative path is returned, with trailing '/' stripped.
50
 
    """
51
 
    inner_url = urlutils.normalize_url(inner_url)
52
 
    repo_url = urlutils.normalize_url(repo_url)
53
 
    if inner_url == repo_url:
54
 
        return '.'
55
 
    result = urlutils.relative_url(repo_url, inner_url)
56
 
    if result != inner_url:
57
 
        result = result.rstrip('/')
58
 
    return result
59
 
 
60
 
 
61
 
def _show_location_info(repository, branch=None, working=None):
62
 
    """Show known locations for working, branch and repository."""
 
46
class LocationList(object):
 
47
 
 
48
    def __init__(self, base_path):
 
49
        self.locs = []
 
50
        self.base_path = base_path
 
51
 
 
52
    def add_url(self, label, url):
 
53
        """Add a URL to the list, converting it to a path if possible"""
 
54
        if url is None:
 
55
            return
 
56
        try:
 
57
            path = urlutils.local_path_from_url(url)
 
58
        except errors.InvalidURL:
 
59
            self.locs.append((label, url))
 
60
        else:
 
61
            self.add_path(label, path)
 
62
 
 
63
    def add_path(self, label, path):
 
64
        """Add a path, converting it to a relative path if possible"""
 
65
        try:
 
66
            path = osutils.relpath(self.base_path, path)
 
67
        except errors.PathNotChild:
 
68
            pass
 
69
        else:
 
70
            if path == '':
 
71
                path = '.'
 
72
        if path != '/':
 
73
            path = path.rstrip('/')
 
74
        self.locs.append((label, path))
 
75
 
 
76
    def get_lines(self):
 
77
        max_len = max(len(l) for l, u in self.locs)
 
78
        return ["  %*s: %s\n" % (max_len, l, u) for l, u in self.locs ]
 
79
 
 
80
 
 
81
def gather_location_info(repository, branch=None, working=None):
 
82
    locs = {}
63
83
    repository_path = repository.bzrdir.root_transport.base
64
 
    print 'Location:'
65
 
    if working and branch:
 
84
    if branch is not None:
 
85
        branch_path = branch.bzrdir.root_transport.base
 
86
        master_path = branch.get_bound_location()
 
87
        if master_path is None:
 
88
            master_path = branch_path
 
89
    else:
 
90
        branch_path = None
 
91
        master_path = None
 
92
    if working:
66
93
        working_path = working.bzrdir.root_transport.base
67
 
        branch_path = branch.bzrdir.root_transport.base
68
94
        if working_path != branch_path:
69
 
            # lightweight checkout
70
 
            print ' light checkout root: %s' % working_path
 
95
            locs['light checkout root'] = working_path
 
96
        if master_path != branch_path:
71
97
            if repository.is_shared():
72
 
                # lightweight checkout of branch in shared repository
73
 
                print '   shared repository: %s' % repository_path
74
 
                print '   repository branch: %s' % (
75
 
                    _repo_rel_url(repository_path, branch_path))
 
98
                locs['repository checkout root'] = branch_path
76
99
            else:
77
 
                # lightweight checkout of standalone branch
78
 
                print '  checkout of branch: %s' % branch_path
 
100
                locs['checkout root'] = branch_path
 
101
        if working_path != master_path:
 
102
            locs['checkout of branch'] = master_path
79
103
        elif repository.is_shared():
80
 
            # branch with tree inside shared repository
81
 
            print '    shared repository: %s' % repository_path
82
 
            print '  repository checkout: %s' % (
83
 
                _repo_rel_url(repository_path, branch_path))
84
 
        elif branch.get_bound_location():
85
 
            # normal checkout
86
 
            print '       checkout root: %s' % working_path
87
 
            print '  checkout of branch: %s' % branch.get_bound_location()
88
 
        else:
 
104
            locs['repository branch'] = branch_path
 
105
        elif branch_path is not None:
89
106
            # standalone
90
 
            print '  branch root: %s' % working_path
91
 
    elif branch:
92
 
        branch_path = branch.bzrdir.root_transport.base
 
107
            locs['branch root'] = branch_path
 
108
    else:
 
109
        working_path = None
93
110
        if repository.is_shared():
94
 
            # branch is part of shared repository
95
 
            print '  shared repository: %s' % repository_path
96
 
            print '  repository branch: %s' % (
97
 
                _repo_rel_url(repository_path, branch_path))
 
111
            # lightweight checkout of branch in shared repository
 
112
            if branch_path is not None:
 
113
                locs['repository branch'] = branch_path
 
114
        elif branch_path is not None:
 
115
            # standalone
 
116
            locs['branch root'] = branch_path
 
117
            if master_path != branch_path:
 
118
                locs['bound to branch'] = master_path
98
119
        else:
99
 
            # standalone branch
100
 
            print '  branch root: %s' % branch_path
101
 
    else:
102
 
        # shared repository
103
 
        assert repository.is_shared()
104
 
        print '  shared repository: %s' % repository_path
105
 
 
106
 
 
107
 
def _show_related_info(branch):
 
120
            locs['repository'] = repository_path
 
121
    if repository.is_shared():
 
122
        # lightweight checkout of branch in shared repository
 
123
        locs['shared repository'] = repository_path
 
124
    order = ['light checkout root', 'repository checkout root',
 
125
             'checkout root', 'checkout of branch', 'shared repository',
 
126
             'repository', 'repository branch', 'branch root',
 
127
             'bound to branch']
 
128
    return [(n, locs[n]) for n in order if n in locs]
 
129
 
 
130
 
 
131
def _show_location_info(locs):
 
132
    """Show known locations for working, branch and repository."""
 
133
    print 'Location:'
 
134
    path_list = LocationList(os.getcwd())
 
135
    for name, loc in locs:
 
136
        path_list.add_url(name, loc)
 
137
    sys.stdout.writelines(path_list.get_lines())
 
138
 
 
139
def _gather_related_branches(branch):
 
140
    locs = LocationList(os.getcwd())
 
141
    locs.add_url('public branch', branch.get_public_branch())
 
142
    locs.add_url('push branch', branch.get_push_location())
 
143
    locs.add_url('parent branch', branch.get_parent())
 
144
    locs.add_url('submit branch', branch.get_submit_branch())
 
145
    return locs
 
146
 
 
147
def _show_related_info(branch, outfile):
108
148
    """Show parent and push location of branch."""
109
 
    if branch.get_parent() or branch.get_push_location():
110
 
        print
111
 
        print 'Related branches:'
112
 
        if branch.get_parent():
113
 
            if branch.get_push_location():
114
 
                print '      parent branch: %s' % branch.get_parent()
115
 
            else:
116
 
                print '  parent branch: %s' % branch.get_parent()
117
 
        if branch.get_push_location():
118
 
            print '  publish to branch: %s' % branch.get_push_location()
 
149
    locs = _gather_related_branches(branch)
 
150
    if len(locs.locs) > 0:
 
151
        print >> outfile
 
152
        print >> outfile, 'Related branches:'
 
153
        outfile.writelines(locs.get_lines())
119
154
 
120
155
 
121
156
def _show_format_info(control=None, repository=None, branch=None, working=None):
263
298
    if 'size' in stats:
264
299
        print '  %8d KiB' % (stats['size']/1024)
265
300
 
 
301
def show_bzrdir_info(a_bzrdir, verbose=False):
 
302
    """Output to stdout the 'info' for a_bzrdir."""
 
303
    try:
 
304
        tree = a_bzrdir.open_workingtree(
 
305
            recommend_upgrade=False)
 
306
    except (NoWorkingTree, NotLocalUrl):
 
307
        tree = None
 
308
        try:
 
309
            branch = a_bzrdir.open_branch()
 
310
        except NotBranchError:
 
311
            branch = None
 
312
            try:
 
313
                repository = a_bzrdir.open_repository()
 
314
            except NoRepositoryPresent:
 
315
                # Return silently; cmd_info already returned NotBranchError
 
316
                # if no bzrdir could be opened.
 
317
                return
 
318
            else:
 
319
                lockable = repository
 
320
        else:
 
321
            repository = branch.repository
 
322
            lockable = branch
 
323
    else:
 
324
        branch = tree.branch
 
325
        repository = branch.repository
 
326
        lockable = tree
 
327
 
 
328
    lockable.lock_read()
 
329
    try:
 
330
        show_component_info(a_bzrdir, repository, branch, tree, verbose)
 
331
    finally:
 
332
        lockable.unlock()
 
333
 
 
334
 
 
335
def show_component_info(control, repository, branch=None, working=None,
 
336
    verbose=1):
 
337
    """Write info about all bzrdir components to stdout"""
 
338
    if verbose is False:
 
339
        verbose = 1
 
340
    if verbose is True:
 
341
        verbose = 2
 
342
    layout = describe_layout(repository, branch, working)
 
343
    format = describe_format(control, repository, branch, working)
 
344
    print "%s (format: %s)" % (layout, format)
 
345
    _show_location_info(gather_location_info(repository, branch, working))
 
346
    if branch is not None:
 
347
        _show_related_info(branch, sys.stdout)
 
348
    if verbose == 0:
 
349
        return
 
350
    _show_format_info(control, repository, branch, working)
 
351
    _show_locking_info(repository, branch, working)
 
352
    if branch is not None:
 
353
        _show_missing_revisions_branch(branch)
 
354
    if working is not None:
 
355
        _show_missing_revisions_working(working)
 
356
        _show_working_stats(working)
 
357
    elif branch is not None:
 
358
        _show_missing_revisions_branch(branch)
 
359
    if branch is not None:
 
360
        stats = _show_branch_stats(branch, verbose==2)
 
361
    else:
 
362
        stats = repository.gather_stats()
 
363
    if branch is None and working is None:
 
364
        _show_repository_info(repository)
 
365
    _show_repository_stats(stats)
 
366
 
 
367
 
 
368
def describe_layout(repository=None, branch=None, tree=None):
 
369
    """Convert a control directory layout into a user-understandable term
 
370
 
 
371
    Common outputs include "Standalone tree", "Repository branch" and
 
372
    "Checkout".  Uncommon outputs include "Unshared repository with trees"
 
373
    and "Empty control directory"
 
374
    """
 
375
    if repository is None:
 
376
        return 'Empty control directory'
 
377
    if branch is None and tree is None:
 
378
        if repository.is_shared():
 
379
            phrase = 'Shared repository'
 
380
        else:
 
381
            phrase = 'Unshared repository'
 
382
        if repository.make_working_trees():
 
383
            phrase += ' with trees'
 
384
        return phrase
 
385
    else:
 
386
        if repository.is_shared():
 
387
            independence = "Repository "
 
388
        else:
 
389
            independence = "Standalone "
 
390
        if tree is not None:
 
391
            phrase = "tree"
 
392
        else:
 
393
            phrase = "branch"
 
394
        if branch is None and tree is not None:
 
395
            phrase = "branchless tree"
 
396
        else:
 
397
            if (tree is not None and tree.bzrdir.root_transport.base !=
 
398
                branch.bzrdir.root_transport.base):
 
399
                independence = ''
 
400
                phrase = "Lightweight checkout"
 
401
            elif branch.get_bound_location() is not None:
 
402
                if independence == 'Standalone ':
 
403
                    independence = ''
 
404
                if tree is None:
 
405
                    phrase = "Bound branch"
 
406
                else:
 
407
                    phrase = "Checkout"
 
408
        if independence != "":
 
409
            phrase = phrase.lower()
 
410
        return "%s%s" % (independence, phrase)
 
411
 
 
412
 
 
413
def describe_format(control, repository, branch, tree):
 
414
    """Determine the format of an existing control directory
 
415
 
 
416
    Several candidates may be found.  If so, the names are returned as a
 
417
    single string, separated by ' or '.
 
418
 
 
419
    If no matching candidate is found, "unnamed" is returned.
 
420
    """
 
421
    candidates  = []
 
422
    if (branch is not None and tree is not None and
 
423
        branch.bzrdir.root_transport.base !=
 
424
        tree.bzrdir.root_transport.base):
 
425
        branch = None
 
426
        repository = None
 
427
    for key in bzrdir.format_registry.keys():
 
428
        format = bzrdir.format_registry.make_bzrdir(key)
 
429
        if isinstance(format, bzrdir.BzrDirMetaFormat1):
 
430
            if (tree and format.workingtree_format !=
 
431
                tree._format):
 
432
                continue
 
433
            if (branch and format.get_branch_format() !=
 
434
                branch._format):
 
435
                continue
 
436
            if (repository and format.repository_format !=
 
437
                repository._format):
 
438
                continue
 
439
        if format.__class__ is not control._format.__class__:
 
440
            continue
 
441
        candidates.append(key)
 
442
    if len(candidates) == 0:
 
443
        return 'unnamed'
 
444
    new_candidates = [c for c in candidates if c != 'default']
 
445
    if len(new_candidates) > 0:
 
446
        candidates = new_candidates
 
447
    new_candidates = [c for c in candidates if not
 
448
        bzrdir.format_registry.get_info(c).hidden]
 
449
    if len(new_candidates) > 0:
 
450
        candidates = new_candidates
 
451
    return ' or '.join(candidates)
266
452
 
267
453
@deprecated_function(zero_eight)
268
454
def show_info(b):
270
456
    return show_bzrdir_info(b.bzrdir)
271
457
 
272
458
 
273
 
def show_bzrdir_info(a_bzrdir, verbose=False):
274
 
    """Output to stdout the 'info' for a_bzrdir."""
275
 
    try:
276
 
        working = a_bzrdir.open_workingtree(
277
 
            recommend_upgrade=False)
278
 
        working.lock_read()
279
 
        try:
280
 
            show_tree_info(working, verbose)
281
 
        finally:
282
 
            working.unlock()
283
 
        return
284
 
    except (NoWorkingTree, NotLocalUrl):
285
 
        pass
286
 
 
287
 
    try:
288
 
        branch = a_bzrdir.open_branch()
289
 
        branch.lock_read()
290
 
        try:
291
 
            show_branch_info(branch, verbose)
292
 
        finally:
293
 
            branch.unlock()
294
 
        return
295
 
    except NotBranchError:
296
 
        pass
297
 
 
298
 
    try:
299
 
        repository = a_bzrdir.open_repository()
300
 
        repository.lock_read()
301
 
        try:
302
 
            show_repository_info(repository, verbose)
303
 
        finally:
304
 
            repository.unlock()
305
 
        return
306
 
    except NoRepositoryPresent:
307
 
        pass
308
 
 
309
 
    # Return silently, cmd_info already returned NotBranchError if no bzrdir
310
 
    # could be opened.
311
 
 
312
 
 
 
459
@deprecated_function(zero_eighteen)
313
460
def show_tree_info(working, verbose):
314
461
    """Output to stdout the 'info' for working."""
315
462
    branch = working.branch
316
463
    repository = branch.repository
317
464
    control = working.bzrdir
318
 
 
319
 
    _show_location_info(repository, branch, working)
320
 
    _show_related_info(branch)
321
 
    _show_format_info(control, repository, branch, working)
322
 
    _show_locking_info(repository, branch, working)
323
 
    _show_missing_revisions_branch(branch)
324
 
    _show_missing_revisions_working(working)
325
 
    _show_working_stats(working)
326
 
    stats = _show_branch_stats(branch, verbose)
327
 
    _show_repository_stats(stats)
328
 
 
329
 
 
 
465
    show_component_info(control, repository, branch, working, verbose)
 
466
 
 
467
 
 
468
@deprecated_function(zero_eighteen)
330
469
def show_branch_info(branch, verbose):
331
470
    """Output to stdout the 'info' for branch."""
332
471
    repository = branch.repository
333
472
    control = branch.bzrdir
334
 
 
335
 
    _show_location_info(repository, branch)
336
 
    _show_related_info(branch)
337
 
    _show_format_info(control, repository, branch)
338
 
    _show_locking_info(repository, branch)
339
 
    _show_missing_revisions_branch(branch)
340
 
    stats = _show_branch_stats(branch, verbose)
341
 
    _show_repository_stats(stats)
342
 
 
343
 
 
 
473
    show_component_info(control, repository, branch, verbose=verbose)
 
474
 
 
475
 
 
476
@deprecated_function(zero_eighteen)
344
477
def show_repository_info(repository, verbose):
345
478
    """Output to stdout the 'info' for repository."""
346
479
    control = repository.bzrdir
347
 
 
348
 
    _show_location_info(repository)
349
 
    _show_format_info(control, repository)
350
 
    _show_locking_info(repository)
351
 
    _show_repository_info(repository)
352
 
    stats = repository.gather_stats()
353
 
    _show_repository_stats(stats)
 
480
    show_component_info(control, repository, verbose=verbose)