/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/missing.py

  • Committer: Robert Collins
  • Date: 2005-10-16 00:22:17 UTC
  • mto: This revision was merged to the branch mainline in revision 1457.
  • Revision ID: robertc@lifelesslap.robertcollins.net-20051016002217-aa38f9c1eb13ee48
Plugins are now loaded under bzrlib.plugins, not bzrlib.plugin.

Plugins are also made available for other plugins to use by making them 
accessible via import bzrlib.plugins.NAME. You should not import other
plugins during the __init__ of your plugin though, as no ordering is
guaranteed, and the plugins directory is not on the python path.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
"""\
 
2
A plugin for displaying what revisions are in 'other' but not in local.
 
3
"""
 
4
 
 
5
def show_missing(br_local, br_remote, verbose=False, quiet=False):
 
6
    """Show the revisions which exist in br_remote, that 
 
7
    do not exist in br_local.
 
8
    """
 
9
    from bzrlib.log import show_one_log
 
10
    import sys
 
11
    local_history = br_local.revision_history()
 
12
    remote_history = br_remote.revision_history()
 
13
    if local_history == remote_history:
 
14
        if not quiet:
 
15
            print 'Trees are identical.'
 
16
        return 0
 
17
    if local_history[:len(remote_history)] == remote_history:
 
18
        # Local is not missing anything from remote, so consider it
 
19
        # up-to-date
 
20
        if not quiet:
 
21
            print 'Local tree has all of remote revisions (remote is missing local)'
 
22
        return 0
 
23
    if quiet:
 
24
        return 1
 
25
 
 
26
    # Check for divergence
 
27
    common_idx = min(len(local_history), len(remote_history)) - 1
 
28
    if common_idx >= 0 and local_history[common_idx] != remote_history[common_idx]:
 
29
        print 'Trees have diverged'
 
30
 
 
31
    local_rev_set = set(local_history)
 
32
 
 
33
    # Find the last common revision between the two trees
 
34
    revno = 0
 
35
    for revno, (local_rev, remote_rev) in enumerate(zip(local_history, remote_history)):
 
36
        if local_rev != remote_rev:
 
37
            break
 
38
 
 
39
    missing_remote = []
 
40
    for rno, rev_id in enumerate(remote_history[revno:]):
 
41
        # This assumes that you can have a revision in the
 
42
        # local history, which does not have the same ancestry
 
43
        # as the remote ancestry.
 
44
        # This may or may not be possible.
 
45
        # In the future this should also checked for merged revisions.
 
46
        if rev_id not in local_rev_set:
 
47
            missing_remote.append((rno+revno+1, rev_id))
 
48
 
 
49
    print 'Missing %d revisions' %  len(missing_remote)
 
50
    print
 
51
 
 
52
    if verbose:
 
53
        from bzrlib.diff import compare_trees
 
54
        from bzrlib.tree import EmptyTree
 
55
        show_ids = True
 
56
        last_tree = EmptyTree
 
57
        last_rev_id = None
 
58
    else:
 
59
        show_ids = False
 
60
    for revno, rev_id in missing_remote:
 
61
        rev = br_remote.get_revision(rev_id)
 
62
        if verbose:
 
63
            parent_rev_id = rev.parents[0].revision_id
 
64
            if last_rev_id == parent_rev_id:
 
65
                parent_tree = last_tree
 
66
            else:
 
67
                parent_tree = br_remote.revision_tree(parent_rev_id)
 
68
            revision_tree = br_remote.revision_tree(rev_id)
 
69
            last_rev_id = rev_id
 
70
            last_tree = revision_tree
 
71
            delta = compare_trees(revision_tree, parent_tree)
 
72
        else:
 
73
            delta = None
 
74
 
 
75
        show_one_log(revno, rev, delta, verbose, sys.stdout, 'original')
 
76
    return 1
 
77